git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH v2 09/11] refs/reftable: allow disabling writing the object index
  @ 2024-05-10 10:30  3%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-05-10 10:30 UTC (permalink / raw)
  To: git; +Cc: Karthik Nayak, Justin Tobler

[-- Attachment #1: Type: text/plain, Size: 4199 bytes --]

Besides the expected "ref" and "log" records, the reftable library also
writes "obj" records. These are basically a reverse mapping of object
IDs to their respective ref records so that it becomes efficient to
figure out which references point to a specific object. The motivation
for this data structure is the "uploadpack.allowTipSHA1InWant" config,
which allows a client to fetch any object by its hash that has a ref
pointing to it.

This reverse index is not used by Git at all though, and the expectation
is that most hosters nowadays use "uploadpack.allowAnySHA1InWant". It
may thus be preferable for many users to disable writing these optional
object indices altogether to safe some precious disk space.

Add a new config "reftable.indexObjects" that allows the user to disable
the object index altogether.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/config/reftable.txt |  6 +++
 refs/reftable-backend.c           |  2 +
 t/t0613-reftable-write-options.sh | 69 +++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/Documentation/config/reftable.txt b/Documentation/config/reftable.txt
index 16b915c75e..6e4466f3c5 100644
--- a/Documentation/config/reftable.txt
+++ b/Documentation/config/reftable.txt
@@ -31,3 +31,9 @@ A maximum of `65535` restart points per block is supported.
 +
 The default value is to create restart points every 16 records. A value of `0`
 will use the default value.
+
+reftable.indexObjects::
+	Whether the reftable backend shall write object blocks. Object blocks
+	are a reverse mapping of object ID to the references pointing to them.
++
+The default value is `true`.
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index 9972dfc1a3..63b75f770d 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -247,6 +247,8 @@ static int reftable_be_config(const char *var, const char *value,
 		if (restart_interval > UINT16_MAX)
 			die("reftable block size cannot exceed %u", (unsigned)UINT16_MAX);
 		opts->restart_interval = restart_interval;
+	} else if (!strcmp(var, "reftable.indexobjects")) {
+		opts->skip_index_objects = !git_config_bool(var, value);
 	}
 
 	return 0;
diff --git a/t/t0613-reftable-write-options.sh b/t/t0613-reftable-write-options.sh
index e0a5b26f58..e2708e11d5 100755
--- a/t/t0613-reftable-write-options.sh
+++ b/t/t0613-reftable-write-options.sh
@@ -214,4 +214,73 @@ test_expect_success 'restart interval exceeding maximum supported interval' '
 	)
 '
 
+test_expect_success 'object index gets written by default with ref index' '
+	test_config_global core.logAllRefUpdates false &&
+	test_when_finished "rm -rf repo" &&
+	git init repo &&
+	(
+		cd repo &&
+		test_commit initial &&
+		for i in $(test_seq 5)
+		do
+			printf "update refs/heads/branch-%d HEAD\n" "$i" ||
+			return 1
+		done >input &&
+		git update-ref --stdin <input &&
+		git -c reftable.blockSize=100 pack-refs &&
+
+		cat >expect <<-EOF &&
+		header:
+		  block_size: 100
+		ref:
+		  - length: 53
+		    restarts: 1
+		  - length: 95
+		    restarts: 1
+		  - length: 71
+		    restarts: 1
+		  - length: 80
+		    restarts: 1
+		obj:
+		  - length: 11
+		    restarts: 1
+		EOF
+		test-tool dump-reftable -b .git/reftable/*.ref >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'object index can be disabled' '
+	test_config_global core.logAllRefUpdates false &&
+	test_when_finished "rm -rf repo" &&
+	git init repo &&
+	(
+		cd repo &&
+		test_commit initial &&
+		for i in $(test_seq 5)
+		do
+			printf "update refs/heads/branch-%d HEAD\n" "$i" ||
+			return 1
+		done >input &&
+		git update-ref --stdin <input &&
+		git -c reftable.blockSize=100 -c reftable.indexObjects=false pack-refs &&
+
+		cat >expect <<-EOF &&
+		header:
+		  block_size: 100
+		ref:
+		  - length: 53
+		    restarts: 1
+		  - length: 95
+		    restarts: 1
+		  - length: 71
+		    restarts: 1
+		  - length: 80
+		    restarts: 1
+		EOF
+		test-tool dump-reftable -b .git/reftable/*.ref >actual &&
+		test_cmp expect actual
+	)
+'
+
 test_done
-- 
2.45.0


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[relevance 3%]

* [PATCH v6 1/7] t0080: turn t-basic unit test into a helper
  @ 2024-05-06 19:57  3%   ` Josh Steadmon
  0 siblings, 0 replies; 200+ results
From: Josh Steadmon @ 2024-05-06 19:57 UTC (permalink / raw)
  To: git; +Cc: gitster, peff

While t/unit-tests/t-basic.c uses the unit-test framework added in
e137fe3b29 (unit tests: add TAP unit test framework, 2023-11-09), it is
not a true unit test in that it intentionally fails in order to exercise
various codepaths in the unit-test framework. Thus, we intentionally
exclude it when running unit tests through the various t/Makefile
targets. Instead, it is executed by t0080-unit-test-output.sh, which
verifies its output follows the TAP format expected for the various
pass, skip, or fail cases.

As such, it makes more sense for t-basic to be a helper item for
t0080-unit-test-output.sh, so let's move it to
t/helper/test-example-tap.c and adjust Makefiles as necessary.

Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Makefile                                      |  4 ++--
 t/Makefile                                    |  2 +-
 .../t-basic.c => helper/test-example-tap.c}   |  5 ++--
 t/helper/test-tool.c                          |  1 +
 t/helper/test-tool.h                          |  1 +
 t/t0080-unit-test-output.sh                   | 24 +++++++++----------
 6 files changed, 20 insertions(+), 17 deletions(-)
 rename t/{unit-tests/t-basic.c => helper/test-example-tap.c} (95%)

diff --git a/Makefile b/Makefile
index 23723367b8..ba55d817ee 100644
--- a/Makefile
+++ b/Makefile
@@ -802,6 +802,7 @@ TEST_BUILTINS_OBJS += test-dump-split-index.o
 TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
 TEST_BUILTINS_OBJS += test-env-helper.o
 TEST_BUILTINS_OBJS += test-example-decorate.o
+TEST_BUILTINS_OBJS += test-example-tap.o
 TEST_BUILTINS_OBJS += test-find-pack.o
 TEST_BUILTINS_OBJS += test-fsmonitor-client.o
 TEST_BUILTINS_OBJS += test-genrandom.o
@@ -1338,7 +1339,6 @@ THIRD_PARTY_SOURCES += compat/regex/%
 THIRD_PARTY_SOURCES += sha1collisiondetection/%
 THIRD_PARTY_SOURCES += sha1dc/%
 
-UNIT_TEST_PROGRAMS += t-basic
 UNIT_TEST_PROGRAMS += t-mem-pool
 UNIT_TEST_PROGRAMS += t-strbuf
 UNIT_TEST_PROGRAMS += t-ctype
@@ -3218,7 +3218,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
diff --git a/t/Makefile b/t/Makefile
index 2d95046f26..4861edafe6 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -48,7 +48,7 @@ CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.tes
 CHAINLINT = '$(PERL_PATH_SQ)' chainlint.pl
 UNIT_TEST_SOURCES = $(wildcard unit-tests/t-*.c)
 UNIT_TEST_PROGRAMS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES))
-UNIT_TESTS = $(sort $(filter-out unit-tests/bin/t-basic%,$(UNIT_TEST_PROGRAMS)))
+UNIT_TESTS = $(sort $(UNIT_TEST_PROGRAMS))
 
 # `test-chainlint` (which is a dependency of `test-lint`, `test` and `prove`)
 # checks all tests in all scripts via a single invocation, so tell individual
diff --git a/t/unit-tests/t-basic.c b/t/helper/test-example-tap.c
similarity index 95%
rename from t/unit-tests/t-basic.c
rename to t/helper/test-example-tap.c
index fda1ae59a6..d072ad559f 100644
--- a/t/unit-tests/t-basic.c
+++ b/t/helper/test-example-tap.c
@@ -1,4 +1,5 @@
-#include "test-lib.h"
+#include "test-tool.h"
+#include "t/unit-tests/test-lib.h"
 
 /*
  * The purpose of this "unit test" is to verify a few invariants of the unit
@@ -69,7 +70,7 @@ static void t_empty(void)
 	; /* empty */
 }
 
-int cmd_main(int argc, const char **argv)
+int cmd__example_tap(int argc, const char **argv)
 {
 	test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
 	TEST(t_res(1), "passing test and assertion return 1");
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 33b9501c21..bb5c04c9c0 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -29,6 +29,7 @@ static struct test_cmd cmds[] = {
 	{ "dump-untracked-cache", cmd__dump_untracked_cache },
 	{ "env-helper", cmd__env_helper },
 	{ "example-decorate", cmd__example_decorate },
+	{ "example-tap", cmd__example_tap },
 	{ "find-pack", cmd__find_pack },
 	{ "fsmonitor-client", cmd__fsmonitor_client },
 	{ "genrandom", cmd__genrandom },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index b72f07ded9..38001bd1c6 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -23,6 +23,7 @@ int cmd__dump_untracked_cache(int argc, const char **argv);
 int cmd__dump_reftable(int argc, const char **argv);
 int cmd__env_helper(int argc, const char **argv);
 int cmd__example_decorate(int argc, const char **argv);
+int cmd__example_tap(int argc, const char **argv);
 int cmd__find_pack(int argc, const char **argv);
 int cmd__fsmonitor_client(int argc, const char **argv);
 int cmd__genrandom(int argc, const char **argv);
diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh
index 961b54b06c..83b1e3b7f5 100755
--- a/t/t0080-unit-test-output.sh
+++ b/t/t0080-unit-test-output.sh
@@ -8,50 +8,50 @@ test_expect_success 'TAP output from unit tests' '
 	cat >expect <<-EOF &&
 	ok 1 - passing test
 	ok 2 - passing test and assertion return 1
-	# check "1 == 2" failed at t/unit-tests/t-basic.c:76
+	# check "1 == 2" failed at t/helper/test-example-tap.c:77
 	#    left: 1
 	#   right: 2
 	not ok 3 - failing test
 	ok 4 - failing test and assertion return 0
 	not ok 5 - passing TEST_TODO() # TODO
 	ok 6 - passing TEST_TODO() returns 1
-	# todo check ${SQ}check(x)${SQ} succeeded at t/unit-tests/t-basic.c:25
+	# todo check ${SQ}check(x)${SQ} succeeded at t/helper/test-example-tap.c:26
 	not ok 7 - failing TEST_TODO()
 	ok 8 - failing TEST_TODO() returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:30
+	# check "0" failed at t/helper/test-example-tap.c:31
 	# skipping test - missing prerequisite
-	# skipping check ${SQ}1${SQ} at t/unit-tests/t-basic.c:32
+	# skipping check ${SQ}1${SQ} at t/helper/test-example-tap.c:33
 	ok 9 - test_skip() # SKIP
 	ok 10 - skipped test returns 1
 	# skipping test - missing prerequisite
 	ok 11 - test_skip() inside TEST_TODO() # SKIP
 	ok 12 - test_skip() inside TEST_TODO() returns 1
-	# check "0" failed at t/unit-tests/t-basic.c:48
+	# check "0" failed at t/helper/test-example-tap.c:49
 	not ok 13 - TEST_TODO() after failing check
 	ok 14 - TEST_TODO() after failing check returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:56
+	# check "0" failed at t/helper/test-example-tap.c:57
 	not ok 15 - failing check after TEST_TODO()
 	ok 16 - failing check after TEST_TODO() returns 0
-	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/unit-tests/t-basic.c:61
+	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:62
 	#    left: "\011hello\\\\"
 	#   right: "there\"\012"
-	# check "!strcmp("NULL", NULL)" failed at t/unit-tests/t-basic.c:62
+	# check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:63
 	#    left: "NULL"
 	#   right: NULL
-	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/unit-tests/t-basic.c:63
+	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/helper/test-example-tap.c:64
 	#    left: ${SQ}a${SQ}
 	#   right: ${SQ}\012${SQ}
-	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/unit-tests/t-basic.c:64
+	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/helper/test-example-tap.c:65
 	#    left: ${SQ}\\\\${SQ}
 	#   right: ${SQ}\\${SQ}${SQ}
 	not ok 17 - messages from failing string and char comparison
-	# BUG: test has no checks at t/unit-tests/t-basic.c:91
+	# BUG: test has no checks at t/helper/test-example-tap.c:92
 	not ok 18 - test with no checks
 	ok 19 - test with no checks returns 0
 	1..19
 	EOF
 
-	! "$GIT_BUILD_DIR"/t/unit-tests/bin/t-basic >actual &&
+	! test-tool example-tap >actual &&
 	test_cmp expect actual
 '
 
-- 
2.45.0.rc1.225.g2a3ae87e7f-goog



^ permalink raw reply related	[relevance 3%]

* [PATCH 09/11] refs/reftable: allow disabling writing the object index
  @ 2024-05-02  6:52  3% ` Patrick Steinhardt
    1 sibling, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-05-02  6:52 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 4189 bytes --]

Besides the expected "ref" and "log" records, the reftable library also
writes "obj" records. These are basically a reverse mapping of object
IDs to their respective ref records so that it becomes efficient to
figure out which references point to a specific object. The motivation
for this data structure is the "uploadpack.allowTipSHA1InWant" config,
which allows a client to fetch any object by its hash that has a ref
pointing to it.

This reverse index is not used by Git at all though, and the expectation
is that most hosters nowadays use "uploadpack.allowAnySHA1InWant". It
may thus be preferable for many users to disable writing these optional
object indices altogether to safe some precious disk space.

Add a new config "reftable.indexObjects" that allows the user to disable
the object index altogether.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/config/reftable.txt |  6 +++
 refs/reftable-backend.c           |  3 ++
 t/t0613-reftable-write-options.sh | 69 +++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+)

diff --git a/Documentation/config/reftable.txt b/Documentation/config/reftable.txt
index 16b915c75e..6e4466f3c5 100644
--- a/Documentation/config/reftable.txt
+++ b/Documentation/config/reftable.txt
@@ -31,3 +31,9 @@ A maximum of `65535` restart points per block is supported.
 +
 The default value is to create restart points every 16 records. A value of `0`
 will use the default value.
+
+reftable.indexObjects::
+	Whether the reftable backend shall write object blocks. Object blocks
+	are a reverse mapping of object ID to the references pointing to them.
++
+The default value is `true`.
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index a786143de2..5298fcef6e 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -249,6 +249,9 @@ static int reftable_be_config(const char *var, const char *value,
 			die("reftable block size cannot exceed %u", (unsigned)UINT16_MAX);
 		opts->restart_interval = restart_interval;
 		return 0;
+	} else if (!strcmp(var, "reftable.indexobjects")) {
+		opts->skip_index_objects = !git_config_bool(var, value);
+		return 0;
 	}
 
 	return 0;
diff --git a/t/t0613-reftable-write-options.sh b/t/t0613-reftable-write-options.sh
index e0a5b26f58..e2708e11d5 100755
--- a/t/t0613-reftable-write-options.sh
+++ b/t/t0613-reftable-write-options.sh
@@ -214,4 +214,73 @@ test_expect_success 'restart interval exceeding maximum supported interval' '
 	)
 '
 
+test_expect_success 'object index gets written by default with ref index' '
+	test_config_global core.logAllRefUpdates false &&
+	test_when_finished "rm -rf repo" &&
+	git init repo &&
+	(
+		cd repo &&
+		test_commit initial &&
+		for i in $(test_seq 5)
+		do
+			printf "update refs/heads/branch-%d HEAD\n" "$i" ||
+			return 1
+		done >input &&
+		git update-ref --stdin <input &&
+		git -c reftable.blockSize=100 pack-refs &&
+
+		cat >expect <<-EOF &&
+		header:
+		  block_size: 100
+		ref:
+		  - length: 53
+		    restarts: 1
+		  - length: 95
+		    restarts: 1
+		  - length: 71
+		    restarts: 1
+		  - length: 80
+		    restarts: 1
+		obj:
+		  - length: 11
+		    restarts: 1
+		EOF
+		test-tool dump-reftable -b .git/reftable/*.ref >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'object index can be disabled' '
+	test_config_global core.logAllRefUpdates false &&
+	test_when_finished "rm -rf repo" &&
+	git init repo &&
+	(
+		cd repo &&
+		test_commit initial &&
+		for i in $(test_seq 5)
+		do
+			printf "update refs/heads/branch-%d HEAD\n" "$i" ||
+			return 1
+		done >input &&
+		git update-ref --stdin <input &&
+		git -c reftable.blockSize=100 -c reftable.indexObjects=false pack-refs &&
+
+		cat >expect <<-EOF &&
+		header:
+		  block_size: 100
+		ref:
+		  - length: 53
+		    restarts: 1
+		  - length: 95
+		    restarts: 1
+		  - length: 71
+		    restarts: 1
+		  - length: 80
+		    restarts: 1
+		EOF
+		test-tool dump-reftable -b .git/reftable/*.ref >actual &&
+		test_cmp expect actual
+	)
+'
+
 test_done
-- 
2.45.0


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[relevance 3%]

* [PATCH v5 1/7] t0080: turn t-basic unit test into a helper
  @ 2024-04-30 19:55  3%   ` Josh Steadmon
  0 siblings, 0 replies; 200+ results
From: Josh Steadmon @ 2024-04-30 19:55 UTC (permalink / raw)
  To: git; +Cc: gitster, peff

While t/unit-tests/t-basic.c uses the unit-test framework added in
e137fe3b29 (unit tests: add TAP unit test framework, 2023-11-09), it is
not a true unit test in that it intentionally fails in order to exercise
various codepaths in the unit-test framework. Thus, we intentionally
exclude it when running unit tests through the various t/Makefile
targets. Instead, it is executed by t0080-unit-test-output.sh, which
verifies its output follows the TAP format expected for the various
pass, skip, or fail cases.

As such, it makes more sense for t-basic to be a helper item for
t0080-unit-test-output.sh, so let's move it to
t/helper/test-example-tap.c and adjust Makefiles as necessary.

Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Makefile                                      |  4 ++--
 t/Makefile                                    |  2 +-
 .../t-basic.c => helper/test-example-tap.c}   |  5 ++--
 t/helper/test-tool.c                          |  1 +
 t/helper/test-tool.h                          |  1 +
 t/t0080-unit-test-output.sh                   | 24 +++++++++----------
 6 files changed, 20 insertions(+), 17 deletions(-)
 rename t/{unit-tests/t-basic.c => helper/test-example-tap.c} (95%)

diff --git a/Makefile b/Makefile
index 23723367b8..ba55d817ee 100644
--- a/Makefile
+++ b/Makefile
@@ -802,6 +802,7 @@ TEST_BUILTINS_OBJS += test-dump-split-index.o
 TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
 TEST_BUILTINS_OBJS += test-env-helper.o
 TEST_BUILTINS_OBJS += test-example-decorate.o
+TEST_BUILTINS_OBJS += test-example-tap.o
 TEST_BUILTINS_OBJS += test-find-pack.o
 TEST_BUILTINS_OBJS += test-fsmonitor-client.o
 TEST_BUILTINS_OBJS += test-genrandom.o
@@ -1338,7 +1339,6 @@ THIRD_PARTY_SOURCES += compat/regex/%
 THIRD_PARTY_SOURCES += sha1collisiondetection/%
 THIRD_PARTY_SOURCES += sha1dc/%
 
-UNIT_TEST_PROGRAMS += t-basic
 UNIT_TEST_PROGRAMS += t-mem-pool
 UNIT_TEST_PROGRAMS += t-strbuf
 UNIT_TEST_PROGRAMS += t-ctype
@@ -3218,7 +3218,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
diff --git a/t/Makefile b/t/Makefile
index 2d95046f26..4861edafe6 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -48,7 +48,7 @@ CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.tes
 CHAINLINT = '$(PERL_PATH_SQ)' chainlint.pl
 UNIT_TEST_SOURCES = $(wildcard unit-tests/t-*.c)
 UNIT_TEST_PROGRAMS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES))
-UNIT_TESTS = $(sort $(filter-out unit-tests/bin/t-basic%,$(UNIT_TEST_PROGRAMS)))
+UNIT_TESTS = $(sort $(UNIT_TEST_PROGRAMS))
 
 # `test-chainlint` (which is a dependency of `test-lint`, `test` and `prove`)
 # checks all tests in all scripts via a single invocation, so tell individual
diff --git a/t/unit-tests/t-basic.c b/t/helper/test-example-tap.c
similarity index 95%
rename from t/unit-tests/t-basic.c
rename to t/helper/test-example-tap.c
index fda1ae59a6..d072ad559f 100644
--- a/t/unit-tests/t-basic.c
+++ b/t/helper/test-example-tap.c
@@ -1,4 +1,5 @@
-#include "test-lib.h"
+#include "test-tool.h"
+#include "t/unit-tests/test-lib.h"
 
 /*
  * The purpose of this "unit test" is to verify a few invariants of the unit
@@ -69,7 +70,7 @@ static void t_empty(void)
 	; /* empty */
 }
 
-int cmd_main(int argc, const char **argv)
+int cmd__example_tap(int argc, const char **argv)
 {
 	test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
 	TEST(t_res(1), "passing test and assertion return 1");
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 33b9501c21..bb5c04c9c0 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -29,6 +29,7 @@ static struct test_cmd cmds[] = {
 	{ "dump-untracked-cache", cmd__dump_untracked_cache },
 	{ "env-helper", cmd__env_helper },
 	{ "example-decorate", cmd__example_decorate },
+	{ "example-tap", cmd__example_tap },
 	{ "find-pack", cmd__find_pack },
 	{ "fsmonitor-client", cmd__fsmonitor_client },
 	{ "genrandom", cmd__genrandom },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index b72f07ded9..38001bd1c6 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -23,6 +23,7 @@ int cmd__dump_untracked_cache(int argc, const char **argv);
 int cmd__dump_reftable(int argc, const char **argv);
 int cmd__env_helper(int argc, const char **argv);
 int cmd__example_decorate(int argc, const char **argv);
+int cmd__example_tap(int argc, const char **argv);
 int cmd__find_pack(int argc, const char **argv);
 int cmd__fsmonitor_client(int argc, const char **argv);
 int cmd__genrandom(int argc, const char **argv);
diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh
index 961b54b06c..83b1e3b7f5 100755
--- a/t/t0080-unit-test-output.sh
+++ b/t/t0080-unit-test-output.sh
@@ -8,50 +8,50 @@ test_expect_success 'TAP output from unit tests' '
 	cat >expect <<-EOF &&
 	ok 1 - passing test
 	ok 2 - passing test and assertion return 1
-	# check "1 == 2" failed at t/unit-tests/t-basic.c:76
+	# check "1 == 2" failed at t/helper/test-example-tap.c:77
 	#    left: 1
 	#   right: 2
 	not ok 3 - failing test
 	ok 4 - failing test and assertion return 0
 	not ok 5 - passing TEST_TODO() # TODO
 	ok 6 - passing TEST_TODO() returns 1
-	# todo check ${SQ}check(x)${SQ} succeeded at t/unit-tests/t-basic.c:25
+	# todo check ${SQ}check(x)${SQ} succeeded at t/helper/test-example-tap.c:26
 	not ok 7 - failing TEST_TODO()
 	ok 8 - failing TEST_TODO() returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:30
+	# check "0" failed at t/helper/test-example-tap.c:31
 	# skipping test - missing prerequisite
-	# skipping check ${SQ}1${SQ} at t/unit-tests/t-basic.c:32
+	# skipping check ${SQ}1${SQ} at t/helper/test-example-tap.c:33
 	ok 9 - test_skip() # SKIP
 	ok 10 - skipped test returns 1
 	# skipping test - missing prerequisite
 	ok 11 - test_skip() inside TEST_TODO() # SKIP
 	ok 12 - test_skip() inside TEST_TODO() returns 1
-	# check "0" failed at t/unit-tests/t-basic.c:48
+	# check "0" failed at t/helper/test-example-tap.c:49
 	not ok 13 - TEST_TODO() after failing check
 	ok 14 - TEST_TODO() after failing check returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:56
+	# check "0" failed at t/helper/test-example-tap.c:57
 	not ok 15 - failing check after TEST_TODO()
 	ok 16 - failing check after TEST_TODO() returns 0
-	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/unit-tests/t-basic.c:61
+	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:62
 	#    left: "\011hello\\\\"
 	#   right: "there\"\012"
-	# check "!strcmp("NULL", NULL)" failed at t/unit-tests/t-basic.c:62
+	# check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:63
 	#    left: "NULL"
 	#   right: NULL
-	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/unit-tests/t-basic.c:63
+	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/helper/test-example-tap.c:64
 	#    left: ${SQ}a${SQ}
 	#   right: ${SQ}\012${SQ}
-	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/unit-tests/t-basic.c:64
+	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/helper/test-example-tap.c:65
 	#    left: ${SQ}\\\\${SQ}
 	#   right: ${SQ}\\${SQ}${SQ}
 	not ok 17 - messages from failing string and char comparison
-	# BUG: test has no checks at t/unit-tests/t-basic.c:91
+	# BUG: test has no checks at t/helper/test-example-tap.c:92
 	not ok 18 - test with no checks
 	ok 19 - test with no checks returns 0
 	1..19
 	EOF
 
-	! "$GIT_BUILD_DIR"/t/unit-tests/bin/t-basic >actual &&
+	! test-tool example-tap >actual &&
 	test_cmp expect actual
 '
 
-- 
2.45.0.rc0.197.gbae5840b3b-goog



^ permalink raw reply related	[relevance 3%]

* [PATCH v4 1/7] t0080: turn t-basic unit test into a helper
  @ 2024-04-24 19:14  3%   ` Josh Steadmon
  0 siblings, 0 replies; 200+ results
From: Josh Steadmon @ 2024-04-24 19:14 UTC (permalink / raw)
  To: git; +Cc: gitster, peff

While t/unit-tests/t-basic.c uses the unit-test framework added in
e137fe3b29 (unit tests: add TAP unit test framework, 2023-11-09), it is
not a true unit test in that it intentionally fails in order to exercise
various codepaths in the unit-test framework. Thus, we intentionally
exclude it when running unit tests through the various t/Makefile
targets. Instead, it is executed by t0080-unit-test-output.sh, which
verifies its output follows the TAP format expected for the various
pass, skip, or fail cases.

As such, it makes more sense for t-basic to be a helper item for
t0080-unit-test-output.sh, so let's move it to
t/helper/test-example-tap.c and adjust Makefiles as necessary.

Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Makefile                                      |  4 ++--
 t/Makefile                                    |  2 +-
 .../t-basic.c => helper/test-example-tap.c}   |  5 ++--
 t/helper/test-tool.c                          |  1 +
 t/helper/test-tool.h                          |  1 +
 t/t0080-unit-test-output.sh                   | 24 +++++++++----------
 6 files changed, 20 insertions(+), 17 deletions(-)
 rename t/{unit-tests/t-basic.c => helper/test-example-tap.c} (95%)

diff --git a/Makefile b/Makefile
index 23723367b8..ba55d817ee 100644
--- a/Makefile
+++ b/Makefile
@@ -802,6 +802,7 @@ TEST_BUILTINS_OBJS += test-dump-split-index.o
 TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
 TEST_BUILTINS_OBJS += test-env-helper.o
 TEST_BUILTINS_OBJS += test-example-decorate.o
+TEST_BUILTINS_OBJS += test-example-tap.o
 TEST_BUILTINS_OBJS += test-find-pack.o
 TEST_BUILTINS_OBJS += test-fsmonitor-client.o
 TEST_BUILTINS_OBJS += test-genrandom.o
@@ -1338,7 +1339,6 @@ THIRD_PARTY_SOURCES += compat/regex/%
 THIRD_PARTY_SOURCES += sha1collisiondetection/%
 THIRD_PARTY_SOURCES += sha1dc/%
 
-UNIT_TEST_PROGRAMS += t-basic
 UNIT_TEST_PROGRAMS += t-mem-pool
 UNIT_TEST_PROGRAMS += t-strbuf
 UNIT_TEST_PROGRAMS += t-ctype
@@ -3218,7 +3218,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
diff --git a/t/Makefile b/t/Makefile
index 2d95046f26..4861edafe6 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -48,7 +48,7 @@ CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.tes
 CHAINLINT = '$(PERL_PATH_SQ)' chainlint.pl
 UNIT_TEST_SOURCES = $(wildcard unit-tests/t-*.c)
 UNIT_TEST_PROGRAMS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES))
-UNIT_TESTS = $(sort $(filter-out unit-tests/bin/t-basic%,$(UNIT_TEST_PROGRAMS)))
+UNIT_TESTS = $(sort $(UNIT_TEST_PROGRAMS))
 
 # `test-chainlint` (which is a dependency of `test-lint`, `test` and `prove`)
 # checks all tests in all scripts via a single invocation, so tell individual
diff --git a/t/unit-tests/t-basic.c b/t/helper/test-example-tap.c
similarity index 95%
rename from t/unit-tests/t-basic.c
rename to t/helper/test-example-tap.c
index fda1ae59a6..d072ad559f 100644
--- a/t/unit-tests/t-basic.c
+++ b/t/helper/test-example-tap.c
@@ -1,4 +1,5 @@
-#include "test-lib.h"
+#include "test-tool.h"
+#include "t/unit-tests/test-lib.h"
 
 /*
  * The purpose of this "unit test" is to verify a few invariants of the unit
@@ -69,7 +70,7 @@ static void t_empty(void)
 	; /* empty */
 }
 
-int cmd_main(int argc, const char **argv)
+int cmd__example_tap(int argc, const char **argv)
 {
 	test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
 	TEST(t_res(1), "passing test and assertion return 1");
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 33b9501c21..bb5c04c9c0 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -29,6 +29,7 @@ static struct test_cmd cmds[] = {
 	{ "dump-untracked-cache", cmd__dump_untracked_cache },
 	{ "env-helper", cmd__env_helper },
 	{ "example-decorate", cmd__example_decorate },
+	{ "example-tap", cmd__example_tap },
 	{ "find-pack", cmd__find_pack },
 	{ "fsmonitor-client", cmd__fsmonitor_client },
 	{ "genrandom", cmd__genrandom },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index b72f07ded9..38001bd1c6 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -23,6 +23,7 @@ int cmd__dump_untracked_cache(int argc, const char **argv);
 int cmd__dump_reftable(int argc, const char **argv);
 int cmd__env_helper(int argc, const char **argv);
 int cmd__example_decorate(int argc, const char **argv);
+int cmd__example_tap(int argc, const char **argv);
 int cmd__find_pack(int argc, const char **argv);
 int cmd__fsmonitor_client(int argc, const char **argv);
 int cmd__genrandom(int argc, const char **argv);
diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh
index 961b54b06c..83b1e3b7f5 100755
--- a/t/t0080-unit-test-output.sh
+++ b/t/t0080-unit-test-output.sh
@@ -8,50 +8,50 @@ test_expect_success 'TAP output from unit tests' '
 	cat >expect <<-EOF &&
 	ok 1 - passing test
 	ok 2 - passing test and assertion return 1
-	# check "1 == 2" failed at t/unit-tests/t-basic.c:76
+	# check "1 == 2" failed at t/helper/test-example-tap.c:77
 	#    left: 1
 	#   right: 2
 	not ok 3 - failing test
 	ok 4 - failing test and assertion return 0
 	not ok 5 - passing TEST_TODO() # TODO
 	ok 6 - passing TEST_TODO() returns 1
-	# todo check ${SQ}check(x)${SQ} succeeded at t/unit-tests/t-basic.c:25
+	# todo check ${SQ}check(x)${SQ} succeeded at t/helper/test-example-tap.c:26
 	not ok 7 - failing TEST_TODO()
 	ok 8 - failing TEST_TODO() returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:30
+	# check "0" failed at t/helper/test-example-tap.c:31
 	# skipping test - missing prerequisite
-	# skipping check ${SQ}1${SQ} at t/unit-tests/t-basic.c:32
+	# skipping check ${SQ}1${SQ} at t/helper/test-example-tap.c:33
 	ok 9 - test_skip() # SKIP
 	ok 10 - skipped test returns 1
 	# skipping test - missing prerequisite
 	ok 11 - test_skip() inside TEST_TODO() # SKIP
 	ok 12 - test_skip() inside TEST_TODO() returns 1
-	# check "0" failed at t/unit-tests/t-basic.c:48
+	# check "0" failed at t/helper/test-example-tap.c:49
 	not ok 13 - TEST_TODO() after failing check
 	ok 14 - TEST_TODO() after failing check returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:56
+	# check "0" failed at t/helper/test-example-tap.c:57
 	not ok 15 - failing check after TEST_TODO()
 	ok 16 - failing check after TEST_TODO() returns 0
-	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/unit-tests/t-basic.c:61
+	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:62
 	#    left: "\011hello\\\\"
 	#   right: "there\"\012"
-	# check "!strcmp("NULL", NULL)" failed at t/unit-tests/t-basic.c:62
+	# check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:63
 	#    left: "NULL"
 	#   right: NULL
-	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/unit-tests/t-basic.c:63
+	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/helper/test-example-tap.c:64
 	#    left: ${SQ}a${SQ}
 	#   right: ${SQ}\012${SQ}
-	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/unit-tests/t-basic.c:64
+	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/helper/test-example-tap.c:65
 	#    left: ${SQ}\\\\${SQ}
 	#   right: ${SQ}\\${SQ}${SQ}
 	not ok 17 - messages from failing string and char comparison
-	# BUG: test has no checks at t/unit-tests/t-basic.c:91
+	# BUG: test has no checks at t/helper/test-example-tap.c:92
 	not ok 18 - test with no checks
 	ok 19 - test with no checks returns 0
 	1..19
 	EOF
 
-	! "$GIT_BUILD_DIR"/t/unit-tests/bin/t-basic >actual &&
+	! test-tool example-tap >actual &&
 	test_cmp expect actual
 '
 
-- 
2.44.0.769.g3c40516874-goog



^ permalink raw reply related	[relevance 3%]

* Re: [RFC PATCH 0/1] Add lines to `git log --graph` to separate connected regions
  2024-04-07  5:37  4%   ` Junio C Hamano
  2024-04-07  6:40  4%     ` Quang Lê Duy
@ 2024-04-08 15:49  0%     ` Junio C Hamano
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2024-04-08 15:49 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: Lê Duy Quang, git

Junio C Hamano <gitster@pobox.com> writes:

> True.  But because we are doing graph, shouldn't we be able to do
> better?  For example, you can draw the two lineage of histories
> on different columns and ...
>
>        * a2
>        * a1
>      * b2
>      * b1
>
> ... that way, you do not need to lose one line of precious vertical
> screen real estate.

Just to save others time to go spelunking in the list archive,
"solutions" attempted and did not work in the past include

 (1) wasting a line to insert a "gap" in the output.
 (2) using marker different from '*' to mark each commit.

If taking the latter approach, it needs to designed to work well
with "boundary" and "left-right" options (the design to shift column
would not have to worry about these, which is another plus).

Thanks.


^ permalink raw reply	[relevance 0%]

* Re: [RFC PATCH 0/1] Add lines to `git log --graph` to separate connected regions
  2024-04-07  6:40  4%     ` Quang Lê Duy
@ 2024-04-07  8:34  0%       ` Dragan Simic
  0 siblings, 0 replies; 200+ results
From: Dragan Simic @ 2024-04-07  8:34 UTC (permalink / raw)
  To: Quang Lê Duy; +Cc: Junio C Hamano, git

Hello Quang,

On 2024-04-07 08:40, Quang Lê Duy wrote:
> On Sun, Apr 7, 2024 at 12:37 PM Junio C Hamano <gitster@pobox.com> 
> wrote:
>> True.  But because we are doing graph, shouldn't we be able to do
>> better?  For example, you can draw the two lineage of histories
>> on different columns and ...
>> 
>>        * a2
>>        * a1
>>      * b2
>>      * b1
>> 
>> ... that way, you do not need to lose one line of precious vertical
>> screen real estate.
> 
> I think horizontal screen real estate is even more precious than the 
> vertical
> one, since one usually doesn't scroll their terminal horizontally. And 
> then it
> would probably be a way more complicated implementation.

These days, very few computer screens aren't in widescreen format,
so there's inevitably less vertical screen space available than the
horizontal space.


^ permalink raw reply	[relevance 0%]

* Re: [RFC PATCH 0/1] Add lines to `git log --graph` to separate connected regions
  2024-04-07  5:37  4%   ` Junio C Hamano
@ 2024-04-07  6:40  4%     ` Quang Lê Duy
  2024-04-07  8:34  0%       ` Dragan Simic
  2024-04-08 15:49  0%     ` Junio C Hamano
  1 sibling, 1 reply; 200+ results
From: Quang Lê Duy @ 2024-04-07  6:40 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On Sun, Apr 7, 2024 at 12:37 PM Junio C Hamano <gitster@pobox.com> wrote:
> True.  But because we are doing graph, shouldn't we be able to do
> better?  For example, you can draw the two lineage of histories
> on different columns and ...
>
>        * a2
>        * a1
>      * b2
>      * b1
>
> ... that way, you do not need to lose one line of precious vertical
> screen real estate.

I think horizontal screen real estate is even more precious than the vertical
one, since one usually doesn't scroll their terminal horizontally. And then it
would probably be a way more complicated implementation.


^ permalink raw reply	[relevance 4%]

* Re: [RFC PATCH 0/1] Add lines to `git log --graph` to separate connected regions
  @ 2024-04-07  5:37  4%   ` Junio C Hamano
  2024-04-07  6:40  4%     ` Quang Lê Duy
  2024-04-08 15:49  0%     ` Junio C Hamano
  0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2024-04-07  5:37 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: Lê Duy Quang, git

Eric Sunshine <sunshine@sunshineco.com> writes:

>> This leads to a problem. Say there are two connected regions, each having two
>> commits, the graph would look like this:
>>
>> * a2
>> * a1
>> * b2
>> * b1
>>
>> which may lead to a misunderstanding that these four commits belong to the same
>> timeline, i.e. b2 is a parent of a1.
>>
>> This patchset adds a separator line between each pair of connected regions to
>> clarify that they are not actually connected:
>>
>> * a2
>> * a1
>> ---
>> * b2
>> * b1
>
> This sort of information which explains why the patch may be desirable
> is not only helpful to reviewers of the submission, but will be
> helpful to future readers of the patch once it becomes part of the
> project's permanent history (assuming it is accepted). However, the
> cover letter does not become part of the project's history (it exists
> only in the mailing list). As such, please move this discussion into
> the commit message of the patch itself.

True.  But because we are doing graph, shouldn't we be able to do
better?  For example, you can draw the two lineage of histories
on different columns and ...

       * a2
       * a1
     * b2
     * b1

... that way, you do not need to lose one line of precious vertical
screen real estate.


^ permalink raw reply	[relevance 4%]

* Re: Ignore specific changes but not the entire file
  @ 2024-03-28 22:20  4% ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2024-03-28 22:20 UTC (permalink / raw)
  To: Mohammad Al Zouabi; +Cc: git

[-- Attachment #1: Type: text/plain, Size: 2303 bytes --]

On 2024-03-28 at 07:46:08, Mohammad Al Zouabi wrote:
> The problem with:
> 
> ```sh
> git update-index [--skip-worktree|--assume-unchanged]
> ```
> 
> Is that it ignores the entire file.
> 
> Is there a plan to support something that remembers what was exactly
> ignored, and if there are changes to it, either un-ignore the file, or
> display the hunks that were changed?

No, because the Git FAQ is clear that Git doesn't support ignoring
tracked files at all[0]:

    Git doesn’t provide a way to do this. The reason is that if Git
    needs to overwrite this file, such as during a checkout, it doesn’t
    know whether the changes to the file are precious and should be
    kept, or whether they are irrelevant and can safely be destroyed.
    Therefore, it has to take the safe route and always preserve them.

    It’s tempting to try to use certain features of git update-index,
    namely the assume-unchanged and skip-worktree bits, but these don’t
    work properly for this purpose and shouldn’t be used this way.

    If your goal is to modify a configuration file, it can often be
    helpful to have a file checked into the repository which is a
    template or set of defaults which can then be copied alongside and
    modified as appropriate. This second, modified file is usually
    ignored to prevent accidentally committing it.

So the functionality that you're using is not intended to be used that
way and in fact is broken for that purpose in a variety of subtle ways
that you'll notice if you keep using it.

If you need to generate files from a variety of sources, some of which
should be tracked and some which should not, you can do something like
create a directory foo.cfg.d, and use a script to include files from
that directory to generate your config (which would be in an ignored
file).  You can have some of those files be tracked (and hence
diffable), and others be ignored, and then the script can generate the
proper data.  This same approach is used on Unix systems for generating
configuration files and is well known, so it shouldn't be too difficult
to configure in most cases.

[0] https://git-scm.com/docs/gitfaq#ignore-tracked-files
-- 
brian m. carlson (they/them or he/him)
Toronto, Ontario, CA

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 262 bytes --]

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 1/1] Documentation/user-manual.txt: example for generating object hashes
  2024-02-29 21:37  3%   ` Junio C Hamano
@ 2024-02-29 22:35  0%     ` Dirk Gouders
  0 siblings, 0 replies; 200+ results
From: Dirk Gouders @ 2024-02-29 22:35 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git list

Junio C Hamano <gitster@pobox.com> writes:

> Dirk Gouders <dirk@gouders.net> writes:
>
>> If someone spends the time to work through the documentation, the
>> subject "hashes" can lead to contradictions:
>>
>> The README of the initial commit states hashes are generated from
>> compressed data (which changed very soon), whereas
>> Documentation/user-manual.txt says they are generated from original
>> data.
>>
>> Don't give doubts a chance: clarify this and present a simple example
>> on how object hashes can be generated manually.
>
> I'd rather not to waste readers' attention to historical wart.

Yes, but -- I should have mentioned it -- the document itself suggests
to read the initial commit.

But I don't mean to argue about that, perhaps I digged to deep into
details.

>> @@ -4095,6 +4095,39 @@ that is used to name the object is the hash of the original data
>>  plus this header, so `sha1sum` 'file' does not match the object name
>>  for 'file'.
>
> The paragraph above (part of it is hidden before the hunk) clearly
> states what the naming rules are.  We hash the original and then
> compress.  If I use an implementation of Git that drives the zlib at
> compression level 1, and if you clone from my repository with
> another implementation of Git whose zlib is driven at compression
> level 9, our .git/objects/01/2345...90 files may not be identical,
> but when uncompressed they should store the same contents, so "hash
> then compress" is the only sensible choice that is not affected by
> the compression to give stable names to objects.

Thank your for that detail.

>> +Starting with the initial commit, hashing was done on the compressed
>> +data and the file README of that commit explicitely states this:
>> +
>> +"The SHA1 hash is always the hash of the _compressed_ object, not the
>> +original one."
>> +
>> +This changed soon after that with commit
>> +d98b46f8d9a3 (Do SHA1 hash _before_ compression.).  Unfortunately, the
>> +commit message doesn't provide the detailed reasoning.
>
> These three are about Git development history, which by itself may
> be of interest for some people, but the main target audience of the
> user-manual is probably different from them.  They may be interested
> to learn how Git works, but it is only to feel that they understand
> how the "magic" things Git does, like "a cryptographic hash of
> contents is enough to uniquely identify the contents being tracked",
> works well to trust their precious contents [*].
>
>     Side note: 
>     https://lore.kernel.org/git/Pine.LNX.4.58.0504200144260.6467@ppc970.osdl.org/
>     explains the reason behind the change to those who did not find
>     it obvious.
>
> FYI, another "breaking" change we did earlier in the history of the
> project was to update the sort order of paths in tree objects.  We
> do not need to confuse readers by talking about the original and
> updated sort order.  The only thing they need, when they want to get
> the feeling that they understand how things work, is the description
> of how things work in the version of Git they have ready access to.
> Historical mistakes we made, corrections we made and why, are
> certainly of interest but not for the target audience of this
> document.

Again thank you, very interesting reading.

> On the other hand, ...
>
>> +The following is a short example that demonstrates how hashes can be
>> +generated manually:
>> +
>> +Let's asume a small text file with the content "Hello git.\n"
>> +-------------------------------------------------
>> +$ cat > hello.txt <<EOF
>> +Hello git.
>> +EOF
>> +-------------------------------------------------
>> +
>> +We can now manually generate the hash `git` would use for this file:
>> +
>> +- The object we want the hash for is of type "blob" and its size is
>> +  11 bytes.
>> +
>> +- Prepend the object header to the file content and feed this to
>> +  sha1sum(1):
>> +
>> +-------------------------------------------------
>> +$ printf "blob 11\0" | cat - hello.txt | sha1sum
>> +7217614ba6e5f4e7db2edaa2cdf5fb5ee4358b57 .
>> +-------------------------------------------------
>> +
>
> ... something like the above (modulo coding style) would be a useful
> addition to help those who want to convince themselves they
> understand how (some parts of) Git works under the hood, and I think
> it would be a welcome addition to some subset of such readers (the
> rest of the world may feel it is way too much detail, though).
>
> I would draw the line between this one and a similar description and
> demonstration of historical mistakes, which is not as relevant as
> how things work in the current system.  In other words, to me, it is
> OK to dig a bit deep to show how the current scheme works but it is
> way too much to do the same for versions of the system that do not
> exist anymore.
>
> But others may draw the line differently and consider even the above
> a bit too much detail, which is a position I would also accept.
>
> Thanks.


^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/1] Documentation/user-manual.txt: example for generating object hashes
  @ 2024-02-29 21:37  3%   ` Junio C Hamano
  2024-02-29 22:35  0%     ` Dirk Gouders
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2024-02-29 21:37 UTC (permalink / raw)
  To: Dirk Gouders; +Cc: git list

Dirk Gouders <dirk@gouders.net> writes:

> If someone spends the time to work through the documentation, the
> subject "hashes" can lead to contradictions:
>
> The README of the initial commit states hashes are generated from
> compressed data (which changed very soon), whereas
> Documentation/user-manual.txt says they are generated from original
> data.
>
> Don't give doubts a chance: clarify this and present a simple example
> on how object hashes can be generated manually.

I'd rather not to waste readers' attention to historical wart.

> @@ -4095,6 +4095,39 @@ that is used to name the object is the hash of the original data
>  plus this header, so `sha1sum` 'file' does not match the object name
>  for 'file'.

The paragraph above (part of it is hidden before the hunk) clearly
states what the naming rules are.  We hash the original and then
compress.  If I use an implementation of Git that drives the zlib at
compression level 1, and if you clone from my repository with
another implementation of Git whose zlib is driven at compression
level 9, our .git/objects/01/2345...90 files may not be identical,
but when uncompressed they should store the same contents, so "hash
then compress" is the only sensible choice that is not affected by
the compression to give stable names to objects.

> +Starting with the initial commit, hashing was done on the compressed
> +data and the file README of that commit explicitely states this:
> +
> +"The SHA1 hash is always the hash of the _compressed_ object, not the
> +original one."
> +
> +This changed soon after that with commit
> +d98b46f8d9a3 (Do SHA1 hash _before_ compression.).  Unfortunately, the
> +commit message doesn't provide the detailed reasoning.

These three are about Git development history, which by itself may
be of interest for some people, but the main target audience of the
user-manual is probably different from them.  They may be interested
to learn how Git works, but it is only to feel that they understand
how the "magic" things Git does, like "a cryptographic hash of
contents is enough to uniquely identify the contents being tracked",
works well to trust their precious contents [*].

    Side note: 
    https://lore.kernel.org/git/Pine.LNX.4.58.0504200144260.6467@ppc970.osdl.org/
    explains the reason behind the change to those who did not find
    it obvious.

FYI, another "breaking" change we did earlier in the history of the
project was to update the sort order of paths in tree objects.  We
do not need to confuse readers by talking about the original and
updated sort order.  The only thing they need, when they want to get
the feeling that they understand how things work, is the description
of how things work in the version of Git they have ready access to.
Historical mistakes we made, corrections we made and why, are
certainly of interest but not for the target audience of this
document.

On the other hand, ...

> +The following is a short example that demonstrates how hashes can be
> +generated manually:
> +
> +Let's asume a small text file with the content "Hello git.\n"
> +-------------------------------------------------
> +$ cat > hello.txt <<EOF
> +Hello git.
> +EOF
> +-------------------------------------------------
> +
> +We can now manually generate the hash `git` would use for this file:
> +
> +- The object we want the hash for is of type "blob" and its size is
> +  11 bytes.
> +
> +- Prepend the object header to the file content and feed this to
> +  sha1sum(1):
> +
> +-------------------------------------------------
> +$ printf "blob 11\0" | cat - hello.txt | sha1sum
> +7217614ba6e5f4e7db2edaa2cdf5fb5ee4358b57 .
> +-------------------------------------------------
> +

... something like the above (modulo coding style) would be a useful
addition to help those who want to convince themselves they
understand how (some parts of) Git works under the hood, and I think
it would be a welcome addition to some subset of such readers (the
rest of the world may feel it is way too much detail, though).

I would draw the line between this one and a similar description and
demonstration of historical mistakes, which is not as relevant as
how things work in the current system.  In other words, to me, it is
OK to dig a bit deep to show how the current scheme works but it is
way too much to do the same for versions of the system that do not
exist anymore.

But others may draw the line differently and consider even the above
a bit too much detail, which is a position I would also accept.

Thanks.


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 8/8] cherry-pick: add `--empty` for more robust redundant commit handling
  2024-02-27 10:39  0%   ` phillip.wood123
@ 2024-02-27 17:33  0%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2024-02-27 17:33 UTC (permalink / raw)
  To: phillip.wood123; +Cc: Brian Lyles, phillip.wood, git, newren, me

phillip.wood123@gmail.com writes:

>>>> I do not quite see a good reason to do the opposite, dropping
>>>> commits that started out as empty but keeping the ones that have
>>>> become empty.  Such a behaviour has additional downside that after
>>>> such a cherry-pick, when you cherry-pick the resulting history onto
>>>> yet another base, your precious "were not empty but have become so
>>>> during the initial cherry-pick" commits will appear as commits that
>>>> were empty from the start.  So I do not see much reason to allow the
>>>> decoupling, even with the new "empty=keep" thing that does not imply
>>>> "allow-empty".
>>>
>>> Junio -- can you clarify this part?
>>>
>>>> So I do not see much reason to allow the decoupling, even with the new
>>>> "empty=keep" thing that does not imply "allow-empty"
>>>
>>> I'm not 100% sure if you are saying that you want `--empty=keep` to
>>> *also* imply `--allow-empty`, or that you simply want
>>> `--keep-redundant-commits` to continue implying `--allow-empty`
>>> *despite* the new `--empty=keep` no implying the same.
>
> FWIW I read it as the latter, but I can't claim to know what was in
> Junio's mind when he wrote it.

Given that "drop what was empty originally while keeping what became
empty" would "lose" what it wanted to keep (i.e. the one that has
become empty") when used to cherry-pick the result of doing such a
cherry-pick, I do not think allowing such combination makes as much
sense as the opposite "keep what was empty originally while dropping
what became empty", which does not have such a property.

And it does not matter if that is expressed via the combination of
existing --allow-empty and --keep-redundant-commits options, or the
newly proposed --empty=keep option.  If we start allowing the "drop
what was originally empty and keep what has become empty"
combination if we make empty=keep not to imply --allow-empty, I do
not think it is a good idea.

That was what was on my mind when I wrote it.  It may be that I was
not following the discussion correctly, and making "empty=keep" not
to imply "allow-empty" does *not* allow a request to "drop what was
originally empty, keep what has become empty".  If that is the case,
then I have no objection to making "empty=keep" not to imply
"allow-empty".

Thanks.


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 8/8] cherry-pick: add `--empty` for more robust redundant commit handling
  2024-02-26  3:32  0% ` Brian Lyles
@ 2024-02-27 10:39  0%   ` phillip.wood123
  2024-02-27 17:33  0%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: phillip.wood123 @ 2024-02-27 10:39 UTC (permalink / raw)
  To: Brian Lyles, phillip.wood, gitster; +Cc: git, newren, me

Hi Brian

On 26/02/2024 03:32, Brian Lyles wrote:
> Hi Phillip and Junio
> On Fri, Feb 23, 2024 at 12:08 AM Brian Lyles <brianmlyles@gmail.com> wrote:
>>
>> On Thu, Feb 22, 2024 at 10:35 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
>>
>>> I agree that if we were starting from scratch there would be no reason
>>> to tie --apply-empty and --keep-redundant-commits together but I'm not
>>> sure it is worth the disruption of changing it now. We're about to add
>>> empty=keep which won't imply --allow-empty for anyone who wants that
>>> behavior and I still tend to think the practical effect of implying
>>> --allow-empty with --keep-redundant-commits is largely beneficial as I'm
>>> skeptical that users want to keep commits that become empty but not the
>>> ones that started empty.
>>
>> I think that's fair. I am okay dropping this potentially disruptive
>> change.
>>
>> It sounds like you are on board with `--empty=keep` not having the same
>> implication?

Yes indeed

>> That said...
>>
>> On Thu, Feb 22, 2024 at 12:41 PM Junio C Hamano <gitster@pobox.com> wrote:
>>
>>> I do not quite see a good reason to do the opposite, dropping
>>> commits that started out as empty but keeping the ones that have
>>> become empty.  Such a behaviour has additional downside that after
>>> such a cherry-pick, when you cherry-pick the resulting history onto
>>> yet another base, your precious "were not empty but have become so
>>> during the initial cherry-pick" commits will appear as commits that
>>> were empty from the start.  So I do not see much reason to allow the
>>> decoupling, even with the new "empty=keep" thing that does not imply
>>> "allow-empty".
>>
>> Junio -- can you clarify this part?
>>
>>> So I do not see much reason to allow the decoupling, even with the new
>>> "empty=keep" thing that does not imply "allow-empty"
>>
>> I'm not 100% sure if you are saying that you want `--empty=keep` to
>> *also* imply `--allow-empty`, or that you simply want
>> `--keep-redundant-commits` to continue implying `--allow-empty`
>> *despite* the new `--empty=keep` no implying the same.

FWIW I read it as the latter, but I can't claim to know what was in 
Junio's mind when he wrote it.

>> On the one hand, I agree with Phillip's sentiment of "if we were
>> starting from scratch there would be no reason to tie --apply-empty and
>> --keep-redundant-commits together" (though your points perhaps provide
>> such a reason). On the other, if both `--keep-redundant-commits` and
>> `--empty=keep` behave the same way, it makes sense to soft-deprecate
>> `--keep-redundant-commits` as I have currently done later in this
>> series. If they do not behave the same way, that deprecation makes less
>> sense and we have two very similar (but not quite identical) options.
>>
>> Just to make sure we're on the same page, the options I see are:
>>
>> - (A): Neither `--keep-redundant-commits` nor `--empty=keep` imply
>>    `--allow-empty`, `--keep-redundant-commits` is soft-deprecated
>> - (B): Both `--keep-redundant-commits` and `--empty=keep` imply
>>    `--allow-empty`, `--keep-redundant-commits` is soft-deprecated
>> - (C): Both `--keep-redundant-commits` and `--empty=keep` imply
>>    `--allow-empty`, `--keep-redundant-commits` is *not* soft-deprecated
>>    as it is more descriptive as noted by Junio here[1]
>> - (D): `--keep-redundant-commits` continues to imply `--allow-empty` but
>>    `--empty=keep` does not. `--keep-redundant-commits` is *not*
>>    soft-deprecated as it behaves differently.
>>
>> (A) represents this v2 of the patch.
>>
>> I'm coming around to (B) based on Junio's workflow concerns, but to be
>> honest I am fine with any of these options. Junio, I *think* you're
>> saying you'd prefer (B) or (C)? Phillip, it sounds like you are okay
>> with (D) based on your response -- how do you feel about (B)?

Yes, I'd prefer (D) as I think it gets confusing if some values of 
--empty imply --allow-empty and others don't. I could live with (B) though.

Best Wishes

Phillip


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 8/8] cherry-pick: add `--empty` for more robust redundant commit handling
  @ 2024-02-26  3:32  0% ` Brian Lyles
  2024-02-27 10:39  0%   ` phillip.wood123
  0 siblings, 1 reply; 200+ results
From: Brian Lyles @ 2024-02-26  3:32 UTC (permalink / raw)
  To: phillip.wood, gitster; +Cc: git, newren, me

Hi Phillip and Junio

On Sun, Feb 25, 2024 at 10:57 AM <phillip.wood123@gmail.com> wrote:

> On 23/02/2024 06:58, Brian Lyles wrote:

>> I think I'm on board with leaving `--keep-redundant-commits` alone. I'm
>> on the fence about having `--empty=keep` imply `--allow-empty` after
>> seeing Junio's concerns. I laid out the options that I see in a reply to
>> patch 6/8[1] and would appreciate input there. I'll adjust the details
>> of this commit in v3 based on what we decide there.
> 
> I'll take a look at that in the next couple of days
>
>> [1]: https://lore.kernel.org/git/17b666ca6c4b7561.70b1dd9aae081c6e.203dcd72f6563036@zivdesk/

I'm not quite sure what happened here, but it seems that:

- The above link is to the wrong email, and
- The email I meant to link to isn't showing up in the archive for some
  reason, despite clearly showing as sent in my mailbox

Apologies for the confusion -- I'm not sure what happened.

In an attempt to keep this conversation on track, I've copied my
original attempted reply to Phillip's[2] and Junio's[3] replies below.

[2]: https://lore.kernel.org/git/3f276e10-7b03-4480-a157-47a7648e7f19@gmail.com/
[3]: https://lore.kernel.org/git/xmqqwmqwcpf7.fsf@gitster.g/

On Fri, Feb 23, 2024 at 12:08 AM Brian Lyles <brianmlyles@gmail.com> wrote:
>
> On Thu, Feb 22, 2024 at 10:35 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
>
> > I agree that if we were starting from scratch there would be no reason
> > to tie --apply-empty and --keep-redundant-commits together but I'm not
> > sure it is worth the disruption of changing it now. We're about to add
> > empty=keep which won't imply --allow-empty for anyone who wants that
> > behavior and I still tend to think the practical effect of implying
> > --allow-empty with --keep-redundant-commits is largely beneficial as I'm
> > skeptical that users want to keep commits that become empty but not the
> > ones that started empty.
>
> I think that's fair. I am okay dropping this potentially disruptive
> change.
>
> It sounds like you are on board with `--empty=keep` not having the same
> implication?
>
> That said...
>
> On Thu, Feb 22, 2024 at 12:41 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> > I do not quite see a good reason to do the opposite, dropping
> > commits that started out as empty but keeping the ones that have
> > become empty.  Such a behaviour has additional downside that after
> > such a cherry-pick, when you cherry-pick the resulting history onto
> > yet another base, your precious "were not empty but have become so
> > during the initial cherry-pick" commits will appear as commits that
> > were empty from the start.  So I do not see much reason to allow the
> > decoupling, even with the new "empty=keep" thing that does not imply
> > "allow-empty".
>
> Junio -- can you clarify this part?
>
> > So I do not see much reason to allow the decoupling, even with the new
> > "empty=keep" thing that does not imply "allow-empty"
>
> I'm not 100% sure if you are saying that you want `--empty=keep` to
> *also* imply `--allow-empty`, or that you simply want
> `--keep-redundant-commits` to continue implying `--allow-empty`
> *despite* the new `--empty=keep` no implying the same.
>
> On the one hand, I agree with Phillip's sentiment of "if we were
> starting from scratch there would be no reason to tie --apply-empty and
> --keep-redundant-commits together" (though your points perhaps provide
> such a reason). On the other, if both `--keep-redundant-commits` and
> `--empty=keep` behave the same way, it makes sense to soft-deprecate
> `--keep-redundant-commits` as I have currently done later in this
> series. If they do not behave the same way, that deprecation makes less
> sense and we have two very similar (but not quite identical) options.
>
> Just to make sure we're on the same page, the options I see are:
>
> - (A): Neither `--keep-redundant-commits` nor `--empty=keep` imply
>   `--allow-empty`, `--keep-redundant-commits` is soft-deprecated
> - (B): Both `--keep-redundant-commits` and `--empty=keep` imply
>   `--allow-empty`, `--keep-redundant-commits` is soft-deprecated
> - (C): Both `--keep-redundant-commits` and `--empty=keep` imply
>   `--allow-empty`, `--keep-redundant-commits` is *not* soft-deprecated
>   as it is more descriptive as noted by Junio here[1]
> - (D): `--keep-redundant-commits` continues to imply `--allow-empty` but
>   `--empty=keep` does not. `--keep-redundant-commits` is *not*
>   soft-deprecated as it behaves differently.
>
> (A) represents this v2 of the patch.
>
> I'm coming around to (B) based on Junio's workflow concerns, but to be
> honest I am fine with any of these options. Junio, I *think* you're
> saying you'd prefer (B) or (C)? Phillip, it sounds like you are okay
> with (D) based on your response -- how do you feel about (B)?
>
> [1]: https://lore.kernel.org/git/xmqq8r4gnd3c.fsf@gitster.g/

Thank you both for your review and insight!

-- 
Thank you,
Brian Lyles


^ permalink raw reply	[relevance 0%]

* [PATCH v3 1/7] t0080: turn t-basic unit test into a helper
  @ 2024-02-23 23:33  3%   ` Josh Steadmon
  0 siblings, 0 replies; 200+ results
From: Josh Steadmon @ 2024-02-23 23:33 UTC (permalink / raw)
  To: git; +Cc: johannes.schindelin, peff, phillip.wood, gitster

While t/unit-tests/t-basic.c uses the unit-test framework added in
e137fe3b29 (unit tests: add TAP unit test framework, 2023-11-09), it is
not a true unit test in that it intentionally fails in order to exercise
various codepaths in the unit-test framework. Thus, we intentionally
exclude it when running unit tests through the various t/Makefile
targets. Instead, it is executed by t0080-unit-test-output.sh, which
verifies its output follows the TAP format expected for the various
pass, skip, or fail cases.

As such, it makes more sense for t-basic to be a helper item for
t0080-unit-test-output.sh, so let's move it to
t/helper/test-example-tap.c and adjust Makefiles as necessary.

Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Makefile                                      |  4 ++--
 t/Makefile                                    |  2 +-
 .../t-basic.c => helper/test-example-tap.c}   |  5 ++--
 t/helper/test-tool.c                          |  1 +
 t/helper/test-tool.h                          |  1 +
 t/t0080-unit-test-output.sh                   | 24 +++++++++----------
 6 files changed, 20 insertions(+), 17 deletions(-)
 rename t/{unit-tests/t-basic.c => helper/test-example-tap.c} (95%)

diff --git a/Makefile b/Makefile
index 23723367b8..ba55d817ee 100644
--- a/Makefile
+++ b/Makefile
@@ -802,6 +802,7 @@ TEST_BUILTINS_OBJS += test-dump-split-index.o
 TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
 TEST_BUILTINS_OBJS += test-env-helper.o
 TEST_BUILTINS_OBJS += test-example-decorate.o
+TEST_BUILTINS_OBJS += test-example-tap.o
 TEST_BUILTINS_OBJS += test-find-pack.o
 TEST_BUILTINS_OBJS += test-fsmonitor-client.o
 TEST_BUILTINS_OBJS += test-genrandom.o
@@ -1338,7 +1339,6 @@ THIRD_PARTY_SOURCES += compat/regex/%
 THIRD_PARTY_SOURCES += sha1collisiondetection/%
 THIRD_PARTY_SOURCES += sha1dc/%
 
-UNIT_TEST_PROGRAMS += t-basic
 UNIT_TEST_PROGRAMS += t-mem-pool
 UNIT_TEST_PROGRAMS += t-strbuf
 UNIT_TEST_PROGRAMS += t-ctype
@@ -3218,7 +3218,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
diff --git a/t/Makefile b/t/Makefile
index 2d95046f26..4861edafe6 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -48,7 +48,7 @@ CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.tes
 CHAINLINT = '$(PERL_PATH_SQ)' chainlint.pl
 UNIT_TEST_SOURCES = $(wildcard unit-tests/t-*.c)
 UNIT_TEST_PROGRAMS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES))
-UNIT_TESTS = $(sort $(filter-out unit-tests/bin/t-basic%,$(UNIT_TEST_PROGRAMS)))
+UNIT_TESTS = $(sort $(UNIT_TEST_PROGRAMS))
 
 # `test-chainlint` (which is a dependency of `test-lint`, `test` and `prove`)
 # checks all tests in all scripts via a single invocation, so tell individual
diff --git a/t/unit-tests/t-basic.c b/t/helper/test-example-tap.c
similarity index 95%
rename from t/unit-tests/t-basic.c
rename to t/helper/test-example-tap.c
index fda1ae59a6..d072ad559f 100644
--- a/t/unit-tests/t-basic.c
+++ b/t/helper/test-example-tap.c
@@ -1,4 +1,5 @@
-#include "test-lib.h"
+#include "test-tool.h"
+#include "t/unit-tests/test-lib.h"
 
 /*
  * The purpose of this "unit test" is to verify a few invariants of the unit
@@ -69,7 +70,7 @@ static void t_empty(void)
 	; /* empty */
 }
 
-int cmd_main(int argc, const char **argv)
+int cmd__example_tap(int argc, const char **argv)
 {
 	test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
 	TEST(t_res(1), "passing test and assertion return 1");
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 33b9501c21..bb5c04c9c0 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -29,6 +29,7 @@ static struct test_cmd cmds[] = {
 	{ "dump-untracked-cache", cmd__dump_untracked_cache },
 	{ "env-helper", cmd__env_helper },
 	{ "example-decorate", cmd__example_decorate },
+	{ "example-tap", cmd__example_tap },
 	{ "find-pack", cmd__find_pack },
 	{ "fsmonitor-client", cmd__fsmonitor_client },
 	{ "genrandom", cmd__genrandom },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index b72f07ded9..38001bd1c6 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -23,6 +23,7 @@ int cmd__dump_untracked_cache(int argc, const char **argv);
 int cmd__dump_reftable(int argc, const char **argv);
 int cmd__env_helper(int argc, const char **argv);
 int cmd__example_decorate(int argc, const char **argv);
+int cmd__example_tap(int argc, const char **argv);
 int cmd__find_pack(int argc, const char **argv);
 int cmd__fsmonitor_client(int argc, const char **argv);
 int cmd__genrandom(int argc, const char **argv);
diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh
index 961b54b06c..83b1e3b7f5 100755
--- a/t/t0080-unit-test-output.sh
+++ b/t/t0080-unit-test-output.sh
@@ -8,50 +8,50 @@ test_expect_success 'TAP output from unit tests' '
 	cat >expect <<-EOF &&
 	ok 1 - passing test
 	ok 2 - passing test and assertion return 1
-	# check "1 == 2" failed at t/unit-tests/t-basic.c:76
+	# check "1 == 2" failed at t/helper/test-example-tap.c:77
 	#    left: 1
 	#   right: 2
 	not ok 3 - failing test
 	ok 4 - failing test and assertion return 0
 	not ok 5 - passing TEST_TODO() # TODO
 	ok 6 - passing TEST_TODO() returns 1
-	# todo check ${SQ}check(x)${SQ} succeeded at t/unit-tests/t-basic.c:25
+	# todo check ${SQ}check(x)${SQ} succeeded at t/helper/test-example-tap.c:26
 	not ok 7 - failing TEST_TODO()
 	ok 8 - failing TEST_TODO() returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:30
+	# check "0" failed at t/helper/test-example-tap.c:31
 	# skipping test - missing prerequisite
-	# skipping check ${SQ}1${SQ} at t/unit-tests/t-basic.c:32
+	# skipping check ${SQ}1${SQ} at t/helper/test-example-tap.c:33
 	ok 9 - test_skip() # SKIP
 	ok 10 - skipped test returns 1
 	# skipping test - missing prerequisite
 	ok 11 - test_skip() inside TEST_TODO() # SKIP
 	ok 12 - test_skip() inside TEST_TODO() returns 1
-	# check "0" failed at t/unit-tests/t-basic.c:48
+	# check "0" failed at t/helper/test-example-tap.c:49
 	not ok 13 - TEST_TODO() after failing check
 	ok 14 - TEST_TODO() after failing check returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:56
+	# check "0" failed at t/helper/test-example-tap.c:57
 	not ok 15 - failing check after TEST_TODO()
 	ok 16 - failing check after TEST_TODO() returns 0
-	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/unit-tests/t-basic.c:61
+	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:62
 	#    left: "\011hello\\\\"
 	#   right: "there\"\012"
-	# check "!strcmp("NULL", NULL)" failed at t/unit-tests/t-basic.c:62
+	# check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:63
 	#    left: "NULL"
 	#   right: NULL
-	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/unit-tests/t-basic.c:63
+	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/helper/test-example-tap.c:64
 	#    left: ${SQ}a${SQ}
 	#   right: ${SQ}\012${SQ}
-	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/unit-tests/t-basic.c:64
+	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/helper/test-example-tap.c:65
 	#    left: ${SQ}\\\\${SQ}
 	#   right: ${SQ}\\${SQ}${SQ}
 	not ok 17 - messages from failing string and char comparison
-	# BUG: test has no checks at t/unit-tests/t-basic.c:91
+	# BUG: test has no checks at t/helper/test-example-tap.c:92
 	not ok 18 - test with no checks
 	ok 19 - test with no checks returns 0
 	1..19
 	EOF
 
-	! "$GIT_BUILD_DIR"/t/unit-tests/bin/t-basic >actual &&
+	! test-tool example-tap >actual &&
 	test_cmp expect actual
 '
 
-- 
2.44.0.rc0.258.g7320e95886-goog



^ permalink raw reply related	[relevance 3%]

* Re: [PATCH v2 6/8] cherry-pick: decouple `--allow-empty` and `--keep-redundant-commits`
  @ 2024-02-22 18:41  4%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2024-02-22 18:41 UTC (permalink / raw)
  To: Phillip Wood; +Cc: Brian Lyles, git, newren, me

Phillip Wood <phillip.wood123@gmail.com> writes:

> ... I still tend to think the practical effect of implying
> --allow-empty with --keep-redundant-commits is largely beneficial as
> I'm skeptical that users want to keep commits that become empty but
> not the ones that started empty.

I share that feeling exactly.

There are good reasons to keep a commit that starts as empty (as
much as creating an empty commit in the first place), so if
anything, a more common workflow element would be to drop the ones
that have become unnecessary (e.g. because the upstream already
added a change that is equivalent to what is being picked) while
keeping the ones that are empty from the start (e.g. in some
workflows an empty commit can be used as a container of
metainfo---you can imagine that in an N-commit chain leading to the
tip of a topic branch forked from the master branch, the topmost
commit is an empty one with the cover letter being prepared, so that
the resulting topic branch can be either (1) made into a patch
series with an advanced version of "git format-patch" that knows how
to use such an empty top commit in the cover letter message, or (2)
merged to the mainline via a pull request, with an advanced version
of "git merge" that notices the empty commit at the tip, and makes a
merge with the commit topic~1 while using the empty top commit to
write the message for the merge commit.

I do not quite see a good reason to do the opposite, dropping
commits that started out as empty but keeping the ones that have
become empty.  Such a behaviour has additional downside that after
such a cherry-pick, when you cherry-pick the resulting history onto
yet another base, your precious "were not empty but have become so
during the initial cherry-pick" commits will appear as commits that
were empty from the start.  So I do not see much reason to allow the
decoupling, even with the new "empty=keep" thing that does not imply
"allow-empty".

Thanks.



^ permalink raw reply	[relevance 4%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2023-12-27  5:28 12% ` Junio C Hamano
  2023-12-27  6:54 14%   ` Elijah Newren
@ 2024-02-11 22:08 12%   ` Sebastian Thiel
  1 sibling, 0 replies; 200+ results
From: Sebastian Thiel @ 2024-02-11 22:08 UTC (permalink / raw)
  To: Junio C Hamano, Elijah Newren via GitGitGadget, git,
	Josh Triplett, Elijah Newren, Phillip Wood

I didn't know where I would best reply to give an update on my work
on precious file support, but here I go.

On my journey to daring implementing precious files in Git, I decided
to implement it in Gitoxide first to ease myself into it.

After what felt like months of work on the Gitoxide-equivalent of
dir.c, it just took 2 days to cobble together a 'gix clean' with
precious files support.

You might say that something as destructive as a 'clean' subcommand
would better not be rushed, but it was surprisingly straightforward
to implement. It was so inviting even that I could spend the second
day, today, entirely on polishing, yielding a 'gix clean' which is
fun to use, with some extras I never knew I wanted until I had full
control over it and could play around easily.

What I found myself do immediately by the way is adjust `.gitignore`
files of the project to have precious declarations right after
their non-precious counterparts for backwards compatibility.

It works perfectly, from what I can tell, and it is truly wonderful
to be able to wipe a repo clean without fear of destroying anything
valuable. And I am aware that we all know that, but wanted to write
it to underline how psychologically valuable this feature is.

Without further ado, I invite you all to give it a go yourself
for first experiences with precious files maybe.

    git clone https://github.com/Byron/gitoxide
    cd gitoxide
    cargo build --release --bin gix --no-default-features --features max-pure
	target/release/gix clean

This should do the trick - from there the program should guide the
user.

If you want to see some more interesting features besides precious
files, you can run 'cargo test -p gix' and follow the 'gix clean -xd'
instructions along with the `--debug` flag.

A word about performance: It is slower.
It started out to be only about 1% slower even on the biggest repositories
and under optimal conditions (i.e. precomposeUnicode and ignoreCase off
and skipHash true). But as I improved correctness and added features,
that was lost and it's now about 15% slower on bigger repositories.

I appended a benchmark run on the Linux kernel at the end, and it shows
that Gitoxide definitely spends more time in userland. I can only
assume that some performance was lost when I started to deviate from
the 'only do the work you need' recipe that I learned from Git to
'always provide a consistent set of information about directory entries'.

On top of that, there is multiple major shortcomings in this realm:

- Gitoxide doesn't actually get faster when reading indices with multiple
  threads for some reason.
- the icase-hashtable is created only with a single thread.
- the precompose-unicode conversion is very slow and easily costs 25%
  performance.

But that's details, some of which you can see yourself when running
'gix --trace -v clean'.

Now I hope you will have fun trying 'gix clean' with precious files in your
repositories. Also, I am particularly interested in learning how it fares
in situations where you know 'git clean' might have difficulties.
I tried very hard to achieve correctness, and any problem you find
will be fixed ASAP.

With this experience, I think I am in a good position to get precious
files support for 'git clean' implemented, once I get to make the start.

Cheers,
Sebastian

----

Here is the benchmark result (and before I forget, Gitoxide also uses about 25% more memory
for some reason, so really has some catchup to do, eventually)

linux (ffc2532) +369 -819 [!] took 2s
❯ hyperfine -N -w1 -r4  'gix clean -xd --skip-hidden-repositories=non-bare' 'gix -c index.skipHash=1 -c core.ignoreCase=0 -c core.precomposeUnicode=0 clean -xd --skip-hidden-repositories=non-bare' 'git clean -nxd'
Benchmark 1: gix clean -xd --skip-hidden-repositories=non-bare
  Time (mean ± σ):     171.7 ms ±   3.0 ms    [User: 70.4 ms, System: 101.4 ms]
  Range (min … max):   167.4 ms … 174.2 ms    4 runs

Benchmark 2: gix -c index.skipHash=1 -c core.ignoreCase=0 -c core.precomposeUnicode=0 clean -xd --skip-hidden-repositories=non-bare
  Time (mean ± σ):     156.3 ms ±   3.1 ms    [User: 56.9 ms, System: 99.3 ms]
  Range (min … max):   154.1 ms … 160.8 ms    4 runs

Benchmark 3: git clean -nxd
  Time (mean ± σ):     138.4 ms ±   2.7 ms    [User: 40.5 ms, System: 103.7 ms]
  Range (min … max):   136.1 ms … 142.0 ms    4 runs

Summary
  git clean -nxd ran
    1.13 ± 0.03 times faster than gix -c index.skipHash=1 -c core.ignoreCase=0 -c core.precomposeUnicode=0 clean -xd --skip-hidden-repositories=non-bare
    1.24 ± 0.03 times faster than gix clean -xd --skip-hidden-repositories=non-bare


On 27 Dec 2023, at 6:28, Junio C Hamano wrote:

> "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
>> From: Elijah Newren <newren@gmail.com>
>>
>> We have traditionally considered all ignored files to be expendable, but
>> users occasionally want ignored files that are not considered
>> expendable.  Add a design document covering how to split ignored files
>> into two types: 'trashable' (what all ignored files are currently
>> considered) and 'precious' (the new type of ignored file).
>
> The proposed syntax is a bit different from what I personally prefer
> (which is Phillip's [P14] or something like it), but I consider that
> the more valuable parts of this document is about how various
> commands ought to interact with precious paths, which shouldn't
> change regardless of the syntax.
>
> Thanks for putting this together.


^ permalink raw reply	[relevance 12%]

* [RFC PATCH v2 1/6] t0080: turn t-basic unit test into a helper
  @ 2024-02-03  0:50  3%   ` Josh Steadmon
  0 siblings, 0 replies; 200+ results
From: Josh Steadmon @ 2024-02-03  0:50 UTC (permalink / raw)
  To: git; +Cc: johannes.schindelin, peff, phillip.wood, gitster

While t/unit-tests/t-basic.c uses the unit-test framework added in
e137fe3b29 (unit tests: add TAP unit test framework, 2023-11-09), it is
not a true unit test in that it intentionally fails in order to exercise
various codepaths in the unit-test framework. Thus, we intentionally
exclude it when running unit tests through the various t/Makefile
targets. Instead, it is executed by t0080-unit-test-output.sh, which
verifies its output follows the TAP format expected for the various
pass, skip, or fail cases.

As such, it makes more sense for t-basic to be a helper item for
t0080-unit-test-output.sh, so let's move it to
t/helper/test-example-tap.c and adjust Makefiles as necessary.

This has the additional benefit that test harnesses seeking to run all
unit tests can find them with a simple glob of "t/unit-tests/bin/t-*",
with no exceptions needed. This will be important in a later patch where
we add support for running the unit tests via a test-tool subcommand.

Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Makefile                                      |  4 ++--
 t/Makefile                                    |  3 +--
 .../t-basic.c => helper/test-example-tap.c}   |  5 ++--
 t/helper/test-tool.c                          |  1 +
 t/helper/test-tool.h                          |  1 +
 t/t0080-unit-test-output.sh                   | 24 +++++++++----------
 6 files changed, 20 insertions(+), 18 deletions(-)
 rename t/{unit-tests/t-basic.c => helper/test-example-tap.c} (95%)

diff --git a/Makefile b/Makefile
index 23723367b8..ba55d817ee 100644
--- a/Makefile
+++ b/Makefile
@@ -802,6 +802,7 @@ TEST_BUILTINS_OBJS += test-dump-split-index.o
 TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
 TEST_BUILTINS_OBJS += test-env-helper.o
 TEST_BUILTINS_OBJS += test-example-decorate.o
+TEST_BUILTINS_OBJS += test-example-tap.o
 TEST_BUILTINS_OBJS += test-find-pack.o
 TEST_BUILTINS_OBJS += test-fsmonitor-client.o
 TEST_BUILTINS_OBJS += test-genrandom.o
@@ -1338,7 +1339,6 @@ THIRD_PARTY_SOURCES += compat/regex/%
 THIRD_PARTY_SOURCES += sha1collisiondetection/%
 THIRD_PARTY_SOURCES += sha1dc/%
 
-UNIT_TEST_PROGRAMS += t-basic
 UNIT_TEST_PROGRAMS += t-mem-pool
 UNIT_TEST_PROGRAMS += t-strbuf
 UNIT_TEST_PROGRAMS += t-ctype
@@ -3218,7 +3218,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
diff --git a/t/Makefile b/t/Makefile
index 281f4c3534..1283c90c10 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -44,8 +44,7 @@ TINTEROP = $(sort $(wildcard interop/i[0-9][0-9][0-9][0-9]-*.sh))
 CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.test)))
 CHAINLINT = '$(PERL_PATH_SQ)' chainlint.pl
 UNIT_TEST_SOURCES = $(wildcard unit-tests/t-*.c)
-UNIT_TEST_PROGRAMS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES))
-UNIT_TESTS = $(sort $(filter-out unit-tests/bin/t-basic%,$(UNIT_TEST_PROGRAMS)))
+UNIT_TESTS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES))
 
 # `test-chainlint` (which is a dependency of `test-lint`, `test` and `prove`)
 # checks all tests in all scripts via a single invocation, so tell individual
diff --git a/t/unit-tests/t-basic.c b/t/helper/test-example-tap.c
similarity index 95%
rename from t/unit-tests/t-basic.c
rename to t/helper/test-example-tap.c
index fda1ae59a6..21e4848e78 100644
--- a/t/unit-tests/t-basic.c
+++ b/t/helper/test-example-tap.c
@@ -1,4 +1,5 @@
-#include "test-lib.h"
+#include "t/unit-tests/test-lib.h"
+#include "test-tool.h"
 
 /*
  * The purpose of this "unit test" is to verify a few invariants of the unit
@@ -69,7 +70,7 @@ static void t_empty(void)
 	; /* empty */
 }
 
-int cmd_main(int argc, const char **argv)
+int cmd__example_tap(int argc, const char **argv)
 {
 	test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
 	TEST(t_res(1), "passing test and assertion return 1");
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 33b9501c21..bb5c04c9c0 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -29,6 +29,7 @@ static struct test_cmd cmds[] = {
 	{ "dump-untracked-cache", cmd__dump_untracked_cache },
 	{ "env-helper", cmd__env_helper },
 	{ "example-decorate", cmd__example_decorate },
+	{ "example-tap", cmd__example_tap },
 	{ "find-pack", cmd__find_pack },
 	{ "fsmonitor-client", cmd__fsmonitor_client },
 	{ "genrandom", cmd__genrandom },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index b72f07ded9..38001bd1c6 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -23,6 +23,7 @@ int cmd__dump_untracked_cache(int argc, const char **argv);
 int cmd__dump_reftable(int argc, const char **argv);
 int cmd__env_helper(int argc, const char **argv);
 int cmd__example_decorate(int argc, const char **argv);
+int cmd__example_tap(int argc, const char **argv);
 int cmd__find_pack(int argc, const char **argv);
 int cmd__fsmonitor_client(int argc, const char **argv);
 int cmd__genrandom(int argc, const char **argv);
diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh
index 961b54b06c..83b1e3b7f5 100755
--- a/t/t0080-unit-test-output.sh
+++ b/t/t0080-unit-test-output.sh
@@ -8,50 +8,50 @@ test_expect_success 'TAP output from unit tests' '
 	cat >expect <<-EOF &&
 	ok 1 - passing test
 	ok 2 - passing test and assertion return 1
-	# check "1 == 2" failed at t/unit-tests/t-basic.c:76
+	# check "1 == 2" failed at t/helper/test-example-tap.c:77
 	#    left: 1
 	#   right: 2
 	not ok 3 - failing test
 	ok 4 - failing test and assertion return 0
 	not ok 5 - passing TEST_TODO() # TODO
 	ok 6 - passing TEST_TODO() returns 1
-	# todo check ${SQ}check(x)${SQ} succeeded at t/unit-tests/t-basic.c:25
+	# todo check ${SQ}check(x)${SQ} succeeded at t/helper/test-example-tap.c:26
 	not ok 7 - failing TEST_TODO()
 	ok 8 - failing TEST_TODO() returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:30
+	# check "0" failed at t/helper/test-example-tap.c:31
 	# skipping test - missing prerequisite
-	# skipping check ${SQ}1${SQ} at t/unit-tests/t-basic.c:32
+	# skipping check ${SQ}1${SQ} at t/helper/test-example-tap.c:33
 	ok 9 - test_skip() # SKIP
 	ok 10 - skipped test returns 1
 	# skipping test - missing prerequisite
 	ok 11 - test_skip() inside TEST_TODO() # SKIP
 	ok 12 - test_skip() inside TEST_TODO() returns 1
-	# check "0" failed at t/unit-tests/t-basic.c:48
+	# check "0" failed at t/helper/test-example-tap.c:49
 	not ok 13 - TEST_TODO() after failing check
 	ok 14 - TEST_TODO() after failing check returns 0
-	# check "0" failed at t/unit-tests/t-basic.c:56
+	# check "0" failed at t/helper/test-example-tap.c:57
 	not ok 15 - failing check after TEST_TODO()
 	ok 16 - failing check after TEST_TODO() returns 0
-	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/unit-tests/t-basic.c:61
+	# check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:62
 	#    left: "\011hello\\\\"
 	#   right: "there\"\012"
-	# check "!strcmp("NULL", NULL)" failed at t/unit-tests/t-basic.c:62
+	# check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:63
 	#    left: "NULL"
 	#   right: NULL
-	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/unit-tests/t-basic.c:63
+	# check "${SQ}a${SQ} == ${SQ}\n${SQ}" failed at t/helper/test-example-tap.c:64
 	#    left: ${SQ}a${SQ}
 	#   right: ${SQ}\012${SQ}
-	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/unit-tests/t-basic.c:64
+	# check "${SQ}\\\\${SQ} == ${SQ}\\${SQ}${SQ}" failed at t/helper/test-example-tap.c:65
 	#    left: ${SQ}\\\\${SQ}
 	#   right: ${SQ}\\${SQ}${SQ}
 	not ok 17 - messages from failing string and char comparison
-	# BUG: test has no checks at t/unit-tests/t-basic.c:91
+	# BUG: test has no checks at t/helper/test-example-tap.c:92
 	not ok 18 - test with no checks
 	ok 19 - test with no checks returns 0
 	1..19
 	EOF
 
-	! "$GIT_BUILD_DIR"/t/unit-tests/bin/t-basic >actual &&
+	! test-tool example-tap >actual &&
 	test_cmp expect actual
 '
 
-- 
2.43.0.594.gd9cf4e227d-goog



^ permalink raw reply related	[relevance 3%]

* [PATCH v4 3/6] t1302: make tests more robust with new extensions
  @ 2024-01-29 11:07  4%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-01-29 11:07 UTC (permalink / raw)
  To: git; +Cc: Taylor Blau, Eric Sunshine, Toon Claes, Christian Couder,
	Justin Tobler

[-- Attachment #1: Type: text/plain, Size: 2977 bytes --]

In t1302 we exercise logic around "core.repositoryFormatVersion" and
extensions. These tests are not particularly robust against extensions
like the newly introduced "refStorage" extension as we tend to clobber
the repository's config file. We thus overwrite any extensions that were
set, which may render the repository inaccessible in case it has to be
accessed with a non-default ref storage.

Refactor the tests to be more robust:

  - Check the DEFAULT_REPO_FORMAT prereq to determine the expected
    repository format version. This helps to ensure that we only need to
    update the prereq in a central place when new extensions are added.
    Furthermore, this allows us to stop seeding the now-unneeded object
    ID cache that was only used to figure out the repository version.

  - Use a separate repository to rewrite ".git/config" to test
    combinations of the repository format version and extensions. This
    ensures that we don't break the main test repository. While we could
    rewrite these tests to not overwrite preexisting extensions, it
    feels cleaner like this so that we can test extensions standalone
    without interference from the environment.

  - Do not rewrite ".git/config" when exercising the "preciousObjects"
    extension.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t1302-repo-version.sh | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
index 179474fa65..42caa0d297 100755
--- a/t/t1302-repo-version.sh
+++ b/t/t1302-repo-version.sh
@@ -9,10 +9,6 @@ TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
-	test_oid_cache <<-\EOF &&
-	version sha1:0
-	version sha256:1
-	EOF
 	cat >test.patch <<-\EOF &&
 	diff --git a/test.txt b/test.txt
 	new file mode 100644
@@ -28,7 +24,12 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'gitdir selection on normal repos' '
-	test_oid version >expect &&
+	if test_have_prereq DEFAULT_REPO_FORMAT
+	then
+		echo 0
+	else
+		echo 1
+	fi >expect &&
 	git config core.repositoryformatversion >actual &&
 	git -C test config core.repositoryformatversion >actual2 &&
 	test_cmp expect actual &&
@@ -79,8 +80,13 @@ mkconfig () {
 
 while read outcome version extensions; do
 	test_expect_success "$outcome version=$version $extensions" "
-		mkconfig $version $extensions >.git/config &&
-		check_${outcome}
+		test_when_finished 'rm -rf extensions' &&
+		git init extensions &&
+		(
+			cd extensions &&
+			mkconfig $version $extensions >.git/config &&
+			check_${outcome}
+		)
 	"
 done <<\EOF
 allow 0
@@ -94,7 +100,8 @@ allow 1 noop-v1
 EOF
 
 test_expect_success 'precious-objects allowed' '
-	mkconfig 1 preciousObjects >.git/config &&
+	git config core.repositoryFormatVersion 1 &&
+	git config extensions.preciousObjects 1 &&
 	check_allow
 '
 
-- 
2.43.GIT


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[relevance 4%]

* Re: what should "git clean -n -f [-d] [-x] <pattern>" do?
  @ 2024-01-27 10:00  5%                       ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2024-01-27 10:00 UTC (permalink / raw)
  To: Sergey Organov; +Cc: Elijah Newren, git

Sergey Organov <sorganov@gmail.com> writes:

> I'm still arguing in favor of fixing "-n", and I believe a fix is needed
> independently from decision about "-f -f".

Even though I do not personally like it, I do not think "which
between do-it (f) and do-not-do-it (n) do you want to use?" is
broken.  It sometimes irritates me to find "git clean" (without "-f"
or "-n", and with clean.requireForce not disabled) complain, and I
personally think "git clean" when clean.requireForce is in effect
and no "-n" or "-f" were given should pretend as if "-n" were given.
I wish if it were "without -n or -f, we pretend as if -n were given,
possibly with a warning that says 'you need -f if you actually want
to carry out these operations'".

But that is a separate usability issue.

What I find broken is that giving one 'f' and one 'n' in different
order, i.e. "-f -n" and "-n -f", does not do what I expect.  If you
are choosing between do-it (f) and do-not-do-it (n), you ought to be
able to rely on the usual last-one-wins rule.  That I find broken.

The mistake[*] of "-f -f" is rather obvious, given that the other
"normal" ways to tweak what is affected by the command are done as
"what else do we clean? directories (d)? ignored (x)?..." options.
When we add the upcoming "precious" bit support, we should make sure
that the way to trigger "oh, by the way, please clobber those paths
that are marked precious, too" is not by giving three '-f'.  It
would make it impossible to ask for that without also removing
nested repositories, which takes two '-f'.


[Footnote]

 * To a lessor extent, the -v (verbose) option shares the same
   problem as "-f -f" here, in that its worldview is to assume that
   a single "verbosity level" is sufficient.  Unlike the severity
   level thing, however, the user who wanted to see only messages
   about X but have to also see messages about Y and Z that are at
   the same or lessor verbosity level as X can filter out unwanted
   messages without causing a real harm.


^ permalink raw reply	[relevance 5%]

* Re: what should "git clean -n -f [-d] [-x] <pattern>" do?
  2024-01-24 17:21  4%         ` Junio C Hamano
@ 2024-01-25 17:11  0%           ` Sergey Organov
    0 siblings, 1 reply; 200+ results
From: Sergey Organov @ 2024-01-25 17:11 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Elijah Newren, git

Junio C Hamano <gitster@pobox.com> writes:

> Sergey Organov <sorganov@gmail.com> writes:
>
>> Whereas obsoleting second -f in favor of new --nested-repo might be a
>> good idea indeed, I believe it's still a mistake for "dry run" to
>> somehow interfere with -f, sorry.
>
> No need to be sorry ;-)
>
> I actually think the true culprit of making this an odd-man-out is
> that the use of "-f" in "git clean", especially with its use of the
> configuration variable clean.requireForce that defaults to true, is
> utterly non-standard.
>
> The usual pattern of defining what "-f" does is that the "git foo"
> command without any options does its common thing but refuses to
> perform undesirable operations (e.g. "git add ."  adds everything
> but refrains from adding ignored paths). And "git foo -f" is a way
> to also perform what it commonly skips.
>
> In contrast, with clean.requireForce that defaults to true, "git
> clean" does not do anything useful by default.  Without such a
> safety, "git clean" would be a way to clean expendable paths, and
> "git clean -f" might be to also clean precious paths.  But it does
> not work that way.  It always requires "-f" to do anything.  Worse
> yet, it is not even "by default it acts as if -n is given and -f is
> a way to countermand that implicit -n".  It is "you must give me
> either -f (i.e. please do work) or -n (i.e. please show what you
> would do) before I do anything".
>
>   $ git clean
>   fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
>
> Given that, it is hard to argue that it would be a natural end-user
> expectation that the command does something useful (i.e. show what
> would be done) when it is given "-f" and "-n" at the same time.
> What makes this a rather nonsense UI is the fact that "-f" does not
> work the way we would expect for this command.

I think we all agree that current UI is a kind of nonsense, but have
different views of the optimal target interface. My points are as
following:

1. The fact that bare "git clean" only produces error by default is
probably a good thing, as removal of untracked files is unrecoverable
operation in Git domain, so requiring -f by default is probably a good
thing as well, provided the *only* operation that "git clean" performs
is dangerous enough.

2. The "-n" behavior is pure nonsense.

So, how do we fix (2)? Let's try mental experiment. Suppose there is no
"-n" option for "git clean" and we are going to implement it. We start
from:

  $ git clean
  fatal: clean.requireForce defaults to true and neither -i nor -f given; refusing to clean
  $ git clean -f
  removing "a"
  removing "b"
  $

Please notice that there is no "-n" in the error message as there is no
such option yet in our experiment.

Now we are going to introduce "dry run" option "-n". Most simple and
obvious way to do it is to set internal flag "dry_run" and then at every
invocation of "remove(file_name)" put an if(dry_run) that will just
print(file_name) instead or removing it. Let's suppose we did just that.
We get this behavior:

  $ git clean -n
  fatal: clean.requireForce defaults to true and neither -i nor -f given; refusing to clean
  $ git clean -f -n
  would remove "a"
  would remove "b"
  $ git clean -f -f -n
  would remove "a"
  would remove "b"
  would remove "sub/a"
  $

I see this as logical, clean, and straightforward behavior, meeting user
expectations for "dry run" option, so I suggest to do just that.

Thanks,
-- Sergey Organov.


^ permalink raw reply	[relevance 0%]

* Re: what should "git clean -n -f [-d] [-x] <pattern>" do?
  @ 2024-01-24 17:21  4%         ` Junio C Hamano
  2024-01-25 17:11  0%           ` Sergey Organov
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2024-01-24 17:21 UTC (permalink / raw)
  To: Sergey Organov; +Cc: Elijah Newren, git

Sergey Organov <sorganov@gmail.com> writes:

> Whereas obsoleting second -f in favor of new --nested-repo might be a
> good idea indeed, I believe it's still a mistake for "dry run" to
> somehow interfere with -f, sorry.

No need to be sorry ;-)

I actually think the true culprit of making this an odd-man-out is
that the use of "-f" in "git clean", especially with its use of the
configuration variable clean.requireForce that defaults to true, is
utterly non-standard.

The usual pattern of defining what "-f" does is that the "git foo"
command without any options does its common thing but refuses to
perform undesirable operations (e.g. "git add ."  adds everything
but refrains from adding ignored paths). And "git foo -f" is a way
to also perform what it commonly skips.

In contrast, with clean.requireForce that defaults to true, "git
clean" does not do anything useful by default.  Without such a
safety, "git clean" would be a way to clean expendable paths, and
"git clean -f" might be to also clean precious paths.  But it does
not work that way.  It always requires "-f" to do anything.  Worse
yet, it is not even "by default it acts as if -n is given and -f is
a way to countermand that implicit -n".  It is "you must give me
either -f (i.e. please do work) or -n (i.e. please show what you
would do) before I do anything".

  $ git clean
  fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean

Given that, it is hard to argue that it would be a natural end-user
expectation that the command does something useful (i.e. show what
would be done) when it is given "-f" and "-n" at the same time.
What makes this a rather nonsense UI is the fact that "-f" does not
work the way we would expect for this command.









^ permalink raw reply	[relevance 4%]

* Re: Fwd: Unexpected behavior of ls-files command when using --others --exclude-from, and a .gitignore file which resides in a subdirectory
  @ 2024-01-24 14:22  4%         ` Raúl Núñez de Arenas Coronado
  0 siblings, 0 replies; 200+ results
From: Raúl Núñez de Arenas Coronado @ 2024-01-24 14:22 UTC (permalink / raw)
  To: Jeff King; +Cc: git

Hi Jeff!

El mié, 24 ene 2024 a las 2:09, Jeff King (<peff@peff.net>) escribió:
> (I think this also gives an interesting use case arguing for continuing
> to support those more-specific exclusion options for ls-files).
>
> If you are mostly just using core.excludesFile (and not
> .git/info/exclude), then I suspect:
>
>   git -c core.excludesFile /dev/null ls-files -o --exclude-standard
>
> would work for you, too (but it sounds like you might also be using
> .git/info/exclude).

In my case, since I'm also using .git/info/exclude in some repos, this
won't work as-is, but you gave me an idea, and I think I can get what
I need until the "precious" mechanism is implemented. It requires a
bit of hacking in the backup script but is not a big deal and it will
work for all my current repos.

Thanks for the help!

-- 
Raúl Núñez de Arenas Coronado
.


^ permalink raw reply	[relevance 4%]

* [PATCH v3 3/6] t1302: make tests more robust with new extensions
  @ 2024-01-24  8:45  4%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-01-24  8:45 UTC (permalink / raw)
  To: git; +Cc: Taylor Blau, Eric Sunshine, Toon Claes, Christian Couder,
	Justin Tobler

[-- Attachment #1: Type: text/plain, Size: 2977 bytes --]

In t1302 we exercise logic around "core.repositoryFormatVersion" and
extensions. These tests are not particularly robust against extensions
like the newly introduced "refStorage" extension as we tend to clobber
the repository's config file. We thus overwrite any extensions that were
set, which may render the repository inaccessible in case it has to be
accessed with a non-default ref storage.

Refactor the tests to be more robust:

  - Check the DEFAULT_REPO_FORMAT prereq to determine the expected
    repository format version. This helps to ensure that we only need to
    update the prereq in a central place when new extensions are added.
    Furthermore, this allows us to stop seeding the now-unneeded object
    ID cache that was only used to figure out the repository version.

  - Use a separate repository to rewrite ".git/config" to test
    combinations of the repository format version and extensions. This
    ensures that we don't break the main test repository. While we could
    rewrite these tests to not overwrite preexisting extensions, it
    feels cleaner like this so that we can test extensions standalone
    without interference from the environment.

  - Do not rewrite ".git/config" when exercising the "preciousObjects"
    extension.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t1302-repo-version.sh | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
index 179474fa65..42caa0d297 100755
--- a/t/t1302-repo-version.sh
+++ b/t/t1302-repo-version.sh
@@ -9,10 +9,6 @@ TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
-	test_oid_cache <<-\EOF &&
-	version sha1:0
-	version sha256:1
-	EOF
 	cat >test.patch <<-\EOF &&
 	diff --git a/test.txt b/test.txt
 	new file mode 100644
@@ -28,7 +24,12 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'gitdir selection on normal repos' '
-	test_oid version >expect &&
+	if test_have_prereq DEFAULT_REPO_FORMAT
+	then
+		echo 0
+	else
+		echo 1
+	fi >expect &&
 	git config core.repositoryformatversion >actual &&
 	git -C test config core.repositoryformatversion >actual2 &&
 	test_cmp expect actual &&
@@ -79,8 +80,13 @@ mkconfig () {
 
 while read outcome version extensions; do
 	test_expect_success "$outcome version=$version $extensions" "
-		mkconfig $version $extensions >.git/config &&
-		check_${outcome}
+		test_when_finished 'rm -rf extensions' &&
+		git init extensions &&
+		(
+			cd extensions &&
+			mkconfig $version $extensions >.git/config &&
+			check_${outcome}
+		)
 	"
 done <<\EOF
 allow 0
@@ -94,7 +100,8 @@ allow 1 noop-v1
 EOF
 
 test_expect_success 'precious-objects allowed' '
-	mkconfig 1 preciousObjects >.git/config &&
+	git config core.repositoryFormatVersion 1 &&
+	git config extensions.preciousObjects 1 &&
 	check_allow
 '
 
-- 
2.43.GIT


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[relevance 4%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-19 16:53 12%             ` Phillip Wood
  2024-01-19 17:17 12%               ` Junio C Hamano
@ 2024-01-24  6:50  7%               ` Elijah Newren
  1 sibling, 0 replies; 200+ results
From: Elijah Newren @ 2024-01-24  6:50 UTC (permalink / raw)
  To: phillip.wood
  Cc: Junio C Hamano, Sebastian Thiel, Elijah Newren via GitGitGadget,
	git, Josh Triplett

Hi Phillip,

On Fri, Jan 19, 2024 at 8:53 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
[...]
> >>   * Which one between "'git add .' adds '.config' that users did not
> >>     want to add" and "'git clean -f' removes '.config' together with
> >>     other files" a larger problem to the users, who participate in a
> >>     project that already decided to use the new .gitignore feature to
> >>     mark ".config" as "precious", of older versions of Git that
> >>     predate "precious"?
> >
> > Accidental "git add ." comes with 3 opportunities to correct the
> > problem before it becomes permanent: before commiting, after
> > committing but before pushing, and after publishing for patch review
> > (where it can even be caught by third parties) but before the
> > patch/PR/MR is accepted and included.  At each stage there's a chance
> > to go back and correct the problem.
>
> If you've added a secret then catching it after you've published the
> patch for review is likely to be too late. I agree there are a couple of
> chances to catch it before that though.

Ah, good point.

> > Accidental nuking of a file (via either git clean or git checkout or
> > git merge or whatever), cannot be reviewed or corrected; it's
> > immediately too late.
>
> Indeed, though "git clean" requires the user to pass a flag before it
> will delete anything does have a dry-run mode to check what's going to
> happen so there is an opportunity for users to avoid accidental deletions.

Yes, good point again for "git clean"; it does have one level of check
before the operation users can take advantage of.  The same cannot be
said for the files nuked by checkout/merge/rebase/cherry-pick, though.

> > [...]
> > However, on a closely related note, in my response to Sebastian I
> > point out that the '$' syntax permits individual teams to prioritize
> > avoiding either accidental deletions or accidental adds on a filename
> > or glob granularity, so if folks are concerned with handling by older
> > Git versions or are just extra concerned with certain files, they can
> > optimize accordingly.
>
> That is an advantage. I do worry that the '$' syntax is unintuitive and
> will further add to the impression that git is hard to use. I think the
> choice comes down how much we are worried about the way older versions
> of git treat ".gitignore" files with the new syntax.

Interesting, I thought the mixture of '!' as a prefix and '#(keep)' as
a previous-line directive would be somewhat inconsistent and add
further to the impression that git is hard to use, though I can also
see your point that '$' as a prefix can as well.

> While I can see it would be helpful to settle the syntax question I
> think parsing the new syntax is a relatively small part of the work that
> needs to be done to implement precious files.

Oh, I agree it's a small part of the work, but as stated previously,
I'm not doing that work (Sebastian is).  I'm just trying to help avoid
getting unintended consequences in the design, and to me this is an
important edge case to consider, get an agreement on, and document in
some fashion.

Anyway, Junio seems to have weighed in with a tentative path forward,
and everyone has been very good about bringing up additional
considerations around this issue that are worth documenting in the
design document, so I'll try to put together an update soon-ish.


^ permalink raw reply	[relevance 7%]

* Re: Fwd: Unexpected behavior of ls-files command when using --others --exclude-from, and a .gitignore file which resides in a subdirectory
  2024-01-22 21:42  6%       ` Junio C Hamano
@ 2024-01-23  6:08  0%         ` Raúl Núñez de Arenas Coronado
  0 siblings, 0 replies; 200+ results
From: Raúl Núñez de Arenas Coronado @ 2024-01-23  6:08 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Elijah Newren, Phillip Wood, Sebastian Thiel

Hi Junio!

El lun, 22 ene 2024 a las 22:42, Junio C Hamano (<gitster@pobox.com>) escribió:
> We have been discussing to extend the mechanism so that we can have
> "precious" files, which also will be left out of the project (e.g.,
> "git add ." will not add to the index, just like an ignored file)
> but are not considered "expendable".  If file F is "precious":
>
>  - "git add ." will not add F to the index
>
>  - "git status" will not say F is left untracked and can be added
>
>  - "git clean -f" will not remove it.
>
>  - checking out a branch with a tracked file F/G will *fail*, to
>    prevent the loss of file.

And that is exactly the concept I'm handling here: files that should
not be tracked BUT that are not expendable. You explained it concisely
and perfectly :)))

I'll wait until that is implemented, and in the meantime I have a
couple solutions I want to try, like using .gitprecious files and 'git
ls-files --other --ignored --exclude-from=.gitprecious'. I have more
ideas.

Thanks a lot for the help and the explanation!

-- 
Raúl Núñez de Arenas Coronado
.


^ permalink raw reply	[relevance 0%]

* Re: Fwd: Unexpected behavior of ls-files command when using --others --exclude-from, and a .gitignore file which resides in a subdirectory
  @ 2024-01-23  5:40  5%     ` Raúl Núñez de Arenas Coronado
    0 siblings, 1 reply; 200+ results
From: Raúl Núñez de Arenas Coronado @ 2024-01-23  5:40 UTC (permalink / raw)
  To: Jeff King; +Cc: git

Hi Jeff, and thanks for your reply :)

El lun, 22 ene 2024 a las 22:34, Jeff King (<peff@peff.net>) escribió:
> For example, I get:
>
>   [setup]
>   $ git init
>   $ mkdir subdir
>   $ echo '*' >subdir/.gitignore
>   $ git add -f subdir/.gitignore && git commit -m "add gitignore"
>   $ touch subdir/file file
>
>   [no exclusions]
>   $ git ls-files -o
>   file
>   subdir/file
>
>   [use .gitignore]
>   $ git ls-files --exclude-per-directory=.gitignore -o
>   file
>
>   [using standard excludes]
>   $ git ls-files --exclude-standard -o
>   file
>
> Do you get different results from that toy repo? If not, then what is
> different about your main repo? Do you perhaps have a stray "*" match
> somewhere in .git/info/exclude, etc? Or are you still providing
> --exclude-from in addition to --exclude-standard?

The difference lies in how I deal in my computer with ignored files. I
have some files in all my repos which have to be ignored always, so I
have that pattern in my core.excludes file. BUT those files have to be
backed up on my system, just in case my local copy of the repo is lost
for some reason, as they are files I need for development in my
personal machine.

If I use --exclude-standard, no matter if those files are being
ignored by core.excludes OR .git/info/exclude, they won't appear in
that 'list other files' command output.

So, my previous idea was ignore ONLY those files ignored by the
repository .gitignore file. That way, the other files that go in my
core.excludes or .git/info/exclude will be listed and backed up. The
problem here is that some of the repository gitignored files (files
related to building, testing, etc.) have their own .gitignore file
containing '*", but they are NOT present in the repo .gitignore. This
is a common practice for Python virtual environments, for example.

Summing up: or I end up backing up those directories that have their
own .gitignore file (not the end of the world) or I use a different
solution to decide which files are ignored but "precious" (I love that
concept, see Junio C Hamano message for that) OR I add those
directories to the .gitignore present in the repo. This last idea I
don't like very much, as they are particular to my system, not the
repo, for example, *I* may decide to use ESLint and node_modules for
some particular web page I'm writing, but the related configuration
should not go into the repository and should not be ignored in
.gitignore, but in .git/info/exclude. I won't backup node_modules, of
course, it is going to be recreated, but I may want to back up
packages.json and .eslintrc. And both of those files will go into
.git/info/exclude, so if I use --exclude-standard, they won't be
backed up.

Since as both Junio and you correctly pointed, this is in fact the
expected, I'll try to find a different solution while the "precious"
concept is finally implemented. I have a couple of ideas, like using a
.giprecious file which my backup script can process easily, containing
the untracked files to back-up.

Thanks for the toy repo, helped me test the differences with my setup!

-- 
Raúl Núñez de Arenas Coronado
.


^ permalink raw reply	[relevance 5%]

* Re: Fwd: Unexpected behavior of ls-files command when using --others --exclude-from, and a .gitignore file which resides in a subdirectory
  @ 2024-01-22 21:42  6%       ` Junio C Hamano
  2024-01-23  6:08  0%         ` Raúl Núñez de Arenas Coronado
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2024-01-22 21:42 UTC (permalink / raw)
  To: Raúl Núñez de Arenas Coronado
  Cc: git, Elijah Newren, Phillip Wood, Sebastian Thiel

Raúl Núñez de Arenas Coronado <raulnac@gmail.com> writes:

> ... I was thinking about what git itself
> does when ignoring files, especially when dealing with .gitgnore files
> in subdirectories, but clearly this needs a different policy, yes.

What "git" internally does is the equivalent of using the
"--exclude-per-directory" option to honor ".gitignore" in the
subdirectories, and in addition use ".git/info/exclude" as another
source, pretty much the same way as "--exclude-from" reads it.

> What I needed from this command is a way of backing up some ignored
> files. These files should not go into the repository, but I'm using
> them temporarily for development so it is a good idea to back them up.
> I'll just backup the entire repository instead, is not a big deal :))

The current mechanism can be used to list "ignored" files that must
be left out of the project (e.g. the most obvious one being object
files "*.o") but these "ignored" files are considered "expendable"
(i.e. Git is allowed to remove it as needed, e.g., when switching
branches and need to make room---if you have an untracked file F
that is ignored, checking out a branch that has a file F/G requires
the file F to disappear so that a directory can be created there).

We have been discussing to extend the mechanism so that we can have
"precious" files, which also will be left out of the project (e.g.,
"git add ." will not add to the index, just like an ignored file)
but are not considered "expendable".  If file F is "precious":

 - "git add ." will not add F to the index

 - "git status" will not say F is left untracked and can be added

 - "git clean -f" will not remove it.

 - checking out a branch with a tracked file F/G will *fail*, to
   prevent the loss of file.

No code yet, but the design consensus is almost there.  Once it
appears, you should be able to say "give me the list of tracked and
precious paths---I do not care about ignored ones that are expendable,
because they can be recreated mechanically and that is why they are
marked ignored", and from such a list of files, you should be able
to drive your back-up solution.

[jc: cc'ed those who are involved in the "precious" discussion].




^ permalink raw reply	[relevance 6%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-19  7:51 13%               ` Sebastian Thiel
@ 2024-01-19 18:45  7%                 ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2024-01-19 18:45 UTC (permalink / raw)
  To: Sebastian Thiel
  Cc: Elijah Newren, Elijah Newren via GitGitGadget, git, Josh Triplett,
	Phillip Wood

Sebastian Thiel <sebastian.thiel@icloud.com> writes:

> I am glad I can pull my initial proposition of 'having both syntaxes' off
> the table to side with this version - it's gorgeous.
>
> It's easy to forget that the search-order when matching ignore patterns
> is back to front, which makes this 'trick' work.

The true gem is not the search-order, though.  It is the "last one
wins" rule.  Back to front search is merely an implementation detail
to optimize the search so that we can stop at the first hit ;-)

> If the insights gained with the last couple of emails would see their digest
> in the user-facing documentation, I think precious files wouldn't only become
> usable but would also allow projects to make the their choice during
> the transition period during which some users will inevitably access the repository
> with a Git that doesn't know about precious files yet.

OK.


^ permalink raw reply	[relevance 7%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-19 16:53 12%             ` Phillip Wood
@ 2024-01-19 17:17 12%               ` Junio C Hamano
  2024-01-24  6:50  7%               ` Elijah Newren
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2024-01-19 17:17 UTC (permalink / raw)
  To: Phillip Wood
  Cc: Elijah Newren, Sebastian Thiel, Elijah Newren via GitGitGadget,
	git, Josh Triplett

Phillip Wood <phillip.wood123@gmail.com> writes:

> If you've added a secret then catching it after you've published the
> patch for review is likely to be too late. I agree there are a couple
> of chances to catch it before that though.

Yes, this is one of the two remaining things that still make me a
bit worried about the "$.config" syntax.

> Indeed, though "git clean" requires the user to pass a flag before it
> will delete anything does have a dry-run mode to check what's going to
> happen so there is an opportunity for users to avoid accidental
> deletions.

True, too.

The other one that still make me a bit worried about the "$.config"
syntax is what I called "the devil you already know" that is
applicable only for participants of a project that currently mark
precious files as ignored, to avoid the accidental "git add ." of
secrets.

I think we already are in agreement that all other points (aside
from possible ergonomics preferences and future extensibility, both
feel a lot minor) raised during this discussion are in favor of the
"$.config" syntax.

> While I can see it would be helpful to settle the syntax question I
> think parsing the new syntax is a relatively small part of the work
> that needs to be done to implement precious files.

True.  The parser can be isolated and it should be relatively easy
to revamp.  My current preference is to (at least) tentatively agree
on using the "$.config" syntax, which would allow us to update
dir.c:parse_path_pattern(), and that would make it possible for us
to start adjusting dir.c:is_excluded(), adding is_precious() next to
it, and adjusting all current callers of the former.

Thanks.


^ permalink raw reply	[relevance 12%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-19  2:58 11%           ` Elijah Newren
@ 2024-01-19 16:53 12%             ` Phillip Wood
  2024-01-19 17:17 12%               ` Junio C Hamano
  2024-01-24  6:50  7%               ` Elijah Newren
  0 siblings, 2 replies; 200+ results
From: Phillip Wood @ 2024-01-19 16:53 UTC (permalink / raw)
  To: Elijah Newren, Junio C Hamano
  Cc: Sebastian Thiel, Elijah Newren via GitGitGadget, git,
	Josh Triplett

Hi Elijah

On 19/01/2024 02:58, Elijah Newren wrote:
> On Thu, Jan 18, 2024 at 11:14 AM Junio C Hamano <gitster@pobox.com> wrote:
>>
> [...]
>> So, all it boils down to is these two questions.
> 
> Thanks for summarizing this.

Yes, thank you Junio - I found it very helpful as well

>>   * Which one between "'git add .' adds '.config' that users did not
>>     want to add" and "'git clean -f' removes '.config' together with
>>     other files" a larger problem to the users, who participate in a
>>     project that already decided to use the new .gitignore feature to
>>     mark ".config" as "precious", of older versions of Git that
>>     predate "precious"?
> 
> Accidental "git add ." comes with 3 opportunities to correct the
> problem before it becomes permanent: before commiting, after
> committing but before pushing, and after publishing for patch review
> (where it can even be caught by third parties) but before the
> patch/PR/MR is accepted and included.  At each stage there's a chance
> to go back and correct the problem.

If you've added a secret then catching it after you've published the 
patch for review is likely to be too late. I agree there are a couple of 
chances to catch it before that though.

> Accidental nuking of a file (via either git clean or git checkout or
> git merge or whatever), cannot be reviewed or corrected; it's
> immediately too late.

Indeed, though "git clean" requires the user to pass a flag before it 
will delete anything does have a dry-run mode to check what's going to 
happen so there is an opportunity for users to avoid accidental deletions.

> [...] 
> However, on a closely related note, in my response to Sebastian I
> point out that the '$' syntax permits individual teams to prioritize
> avoiding either accidental deletions or accidental adds on a filename
> or glob granularity, so if folks are concerned with handling by older
> Git versions or are just extra concerned with certain files, they can
> optimize accordingly.

That is an advantage. I do worry that the '$' syntax is unintuitive and 
will further add to the impression that git is hard to use. I think the 
choice comes down how much we are worried about the way older versions 
of git treat ".gitignore" files with the new syntax.

While I can see it would be helpful to settle the syntax question I 
think parsing the new syntax is a relatively small part of the work that 
needs to be done to implement precious files.

Best Wishes

Phillip



^ permalink raw reply	[relevance 12%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-19  2:37 10%             ` Elijah Newren
@ 2024-01-19  7:51 13%               ` Sebastian Thiel
  2024-01-19 18:45  7%                 ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Sebastian Thiel @ 2024-01-19  7:51 UTC (permalink / raw)
  To: Elijah Newren
  Cc: Junio C Hamano, Elijah Newren via GitGitGadget, git,
	Josh Triplett, Phillip Wood

Yes, indeed I was a little confused when making the "git commit..." based examples,
thanks for correcting them.

>
> Reminds me of https://www.emacswiki.org/pics/static/TabsSpacesBoth.png
>
> ;-)
>

😅

> Besides, if for a specific file or filetype, accidental additions are
> more important to protect against than accidental nuking, then can't
> folks achieve that by simply using
>
>     # Don't let older git versions add the file
>     .env.secret
>
>     # For newer git versions, override the above; treat it as precious
> (i.e. don't add AND don't accidentally nuke)
>     $.env.secret
>
> In contrast, if protection against accidental nuking is more important
> for certain files, one can use just the second line without the first.
>

I am glad I can pull my initial proposition of 'having both syntaxes' off
the table to side with this version - it's gorgeous.

It's easy to forget that the search-order when matching ignore patterns
is back to front, which makes this 'trick' work.

If the insights gained with the last couple of emails would see their digest
in the user-facing documentation, I think precious files wouldn't only become
usable but would also allow projects to make the their choice during
the transition period during which some users will inevitably access the repository
with a Git that doesn't know about precious files yet.


^ permalink raw reply	[relevance 13%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-18 19:14 13%         ` Junio C Hamano
  2024-01-18 21:33 12%           ` Sebastian Thiel
@ 2024-01-19  2:58 11%           ` Elijah Newren
  2024-01-19 16:53 12%             ` Phillip Wood
  1 sibling, 1 reply; 200+ results
From: Elijah Newren @ 2024-01-19  2:58 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Sebastian Thiel, Elijah Newren via GitGitGadget, git,
	Josh Triplett, Phillip Wood

Hi,

On Thu, Jan 18, 2024 at 11:14 AM Junio C Hamano <gitster@pobox.com> wrote:
>
[...]
> So, all it boils down to is these two questions.

Thanks for summarizing this.

>  * Which one between "'git add .' adds '.config' that users did not
>    want to add" and "'git clean -f' removes '.config' together with
>    other files" a larger problem to the users, who participate in a
>    project that already decided to use the new .gitignore feature to
>    mark ".config" as "precious", of older versions of Git that
>    predate "precious"?

Accidental "git add ." comes with 3 opportunities to correct the
problem before it becomes permanent: before commiting, after
committing but before pushing, and after publishing for patch review
(where it can even be caught by third parties) but before the
patch/PR/MR is accepted and included.  At each stage there's a chance
to go back and correct the problem.

Accidental nuking of a file (via either git clean or git checkout or
git merge or whatever), cannot be reviewed or corrected; it's
immediately too late.  And given that we're calling this feature
"precious", that seems a little extra unfortunate.

>  * What are projects doing to paths that they want to make
>    "precious" with the current system?  Do they leave them out of
>    ".gitignore" and have them subject to accidental "git add ." to
>    protect them from "git clean -f"?  Or do they list them in
>    ".gitignore" to prevent "git add ." from touching, but leave them
>    susceptible to accidental removal by "git clean -f"?

Good questions; I have no answers to these.

However, on a closely related note, in my response to Sebastian I
point out that the '$' syntax permits individual teams to prioritize
avoiding either accidental deletions or accidental adds on a filename
or glob granularity, so if folks are concerned with handling by older
Git versions or are just extra concerned with certain files, they can
optimize accordingly.  Sadly, the '#(keep)' syntax does not permit
such prioritization and always treats avoiding accidental adds as the
priority (which, in my opinion, is the less important one to generally
prioritze).


^ permalink raw reply	[relevance 11%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-18 21:33 12%           ` Sebastian Thiel
@ 2024-01-19  2:37 10%             ` Elijah Newren
  2024-01-19  7:51 13%               ` Sebastian Thiel
  0 siblings, 1 reply; 200+ results
From: Elijah Newren @ 2024-01-19  2:37 UTC (permalink / raw)
  To: Sebastian Thiel
  Cc: Junio C Hamano, Elijah Newren via GitGitGadget, git,
	Josh Triplett, Phillip Wood

On Thu, Jan 18, 2024 at 1:33 PM Sebastian Thiel
<sebastian.thiel@icloud.com> wrote:
>
> Thanks so much for the analysis, as seeing the problem of choosing
> a syntax from the perspective of its effects when using common commands
> like "git add" and "git clean -f" seems very promising!
>
> When thinking about "git add ." vs "git clean -f" one difference comes to
> mind: "git clean -f" is much less desirable it's fatal. "git add ." on the
> other hand leaves room for correction, even when used with `git commit -a"
> (and with the exception of "git commit -am 'too late'").

"git commit -a" and "git commit -am 'too late'", by themselves, will
only commit changes to already-tracked files.  So they wouldn't be
problematic alone.

But perhaps the -a was distracting and you were thinking of "git add .
&& git commit -m whatever".  That does remove the chance to correct
before creating a commit, but I don't think it's too bad either.  Even
though it skips the chance to catch the problem pre-commit, there's
still time to review & correct before publishing for patch review (or
PR review or MR review or whatever you want to call it).  And, even if
published for patch review, it can still be caught & corrected by
those doing patch review as well.

So, I just don't see the "accidental add" problem as being very
severe; there are so many chances to catch and correct it.

> To my mind, in order to support projects with both ".config" and
> ".env.secret" they would have to be given a choice of which syntax
> to use, e.g.
>
>     # This file shouldn't accidentally be deleted by `git clean`
>     $.config
>
>     # These files should never be accidentally tracked
>     #(keep)
>     .env*

Reminds me of https://www.emacswiki.org/pics/static/TabsSpacesBoth.png

;-)

Besides, if for a specific file or filetype, accidental additions are
more important to protect against than accidental nuking, then can't
folks achieve that by simply using

    # Don't let older git versions add the file
    .env.secret

    # For newer git versions, override the above; treat it as precious
(i.e. don't add AND don't accidentally nuke)
    $.env.secret

In contrast, if protection against accidental nuking is more important
for certain files, one can use just the second line without the first.

And, whether you have a file with both lines or just the second line,
newer git versions will protect against both accidental nuking and
accidental adding.

In contrast...

Phillip's syntax provides no way to achieve treating accidental nuking
as more important than accidental adding; it can only handle
protection against accidental adding in older Git versions.  And, as I
discussed above, the accidental add problem seems much less severe and
is thus the less important problem to protect against.


^ permalink raw reply	[relevance 10%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-18 19:14 13%         ` Junio C Hamano
@ 2024-01-18 21:33 12%           ` Sebastian Thiel
  2024-01-19  2:37 10%             ` Elijah Newren
  2024-01-19  2:58 11%           ` Elijah Newren
  1 sibling, 1 reply; 200+ results
From: Sebastian Thiel @ 2024-01-18 21:33 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Elijah Newren, Elijah Newren via GitGitGadget, git, Josh Triplett,
	Phillip Wood

Thanks so much for the analysis, as seeing the problem of choosing
a syntax from the perspective of its effects when using common commands
like "git add" and "git clean -f" seems very promising!

When thinking about "git add ." vs "git clean -f" one difference comes to
mind: "git clean -f" is much less desirable it's fatal. "git add ." on the
other hand leaves room for correction, even when used with `git commit -a"
(and with the exception of "git commit -am 'too late'").

From that point of view I'd naturally prefer the "$.config" syntax as it
will turn precious files into untracked ones for current Git.

>  * Which one between "'git add .' adds '.config' that users did not
>    want to add" and "'git clean -f' removes '.config' together with
>    other files" a larger problem to the users, who participate in a
>    project that already decided to use the new .gitignore feature to
>    mark ".config" as "precious", of older versions of Git that
>    predate "precious"?
>

If the user should have a choice, than both syntaxes could also be allowed
to let them choose what to optimise for.

Doing so might be less relevant in the `.config` case, but most relevant
for ignored files like ".env" or ".env.secret" which under no circumstances
must be tracked.

>  * What are projects doing to paths that they want to make
>    "precious" with the current system?  Do they leave them out of
>    ".gitignore" and have them subject to accidental "git add ." to
>    protect them from "git clean -f"?  Or do they list them in
>    ".gitignore" to prevent "git add ." from touching, but leave them
>    susceptible to accidental removal by "git clean -f"?

I did hear that some projects use make files with specifically configured
"git clean" invocations to specifically "--exclude" precious files.
Thus far I didn't encounter one that use such a technique to prevent
"git add" from tracking too much though.

To my mind, in order to support projects with both ".config" and
".env.secret" they would have to be given a choice of which syntax
to use, e.g.

    # This file shouldn't accidentally be deleted by `git clean`
    $.config

    # These files should never be accidentally tracked
    #(keep)
    .env*


On 18 Jan 2024, at 20:14, Junio C Hamano wrote:

> Sebastian Thiel <sebastian.thiel@icloud.com> writes:
>
>> #(keep)
>> .config
>>
>> As a side-effect of the syntax, it's obvious this is an 'upgrade', with
>> perfect backwards compatibility as old git does the same as always.
>
> Yes but ...
>
> The point Elijah makes is worth considering.  To existing versions
> of git, having this entry for ".config" means that it is ignored
> (i.e. "git add ." will not include it), but expendable (i.e. "git
> clean" considers ".config" as a candidate for removal; "git checkout
> other", if the "other" branch has it as a tracked path, will clobber
> it).  Compared to the case where ".config" is not mentioned in
> ".gitignore", where it may be added by use of "git add .", it won't
> be clobbered by "git clean".
>
> So this syntax having "perfect backward compatibility" is not quite
> true.  It does have downsides when used by existing versions of Git.
>
> If we use Elijah's syntax to say
>
>     $.config
>
> then the entry to existing versions of git is a no-op wrt a file
> named ".config".  It simply does not match the pattern, so an
> accidental "git add ." *will* add ".config" to the index, while "git
> clean" may not touch it, simply because it is treated as "untracked
> and precious".  In other words, its downside is the same as not
> marking the path ".config" in any way in ".gitignore", as far as
> existing versions of Git are concerned.
>
> We of course discount the possibility that people keep a file whose
> name literally is dollar-dot followed by "config" and older versions
> of Git would start treating them as ignored-and-expendable.  While
> it *is* an additional downside compared to Phillip's "#(keep)"
> approach, I do not think that particular downside is worth worrying
> about.  Yet another downside compared to Phillip's is that it is
> less extensible.  Over the years, however, the ignored-but-precious
> is the only one we heard from users that lack of which is hurting
> them, so lack of extensibility may not be too huge a deal.
>
> For projects that are currently listing these files in ".gitignore"
> as "ignored-and-expendable" already and want to categorize them as
> "ignored-and-precious" by changing ".config" to "$.config" (or
> adding "#(keep)" comment before the existing entry), the
> pros-and-cons equation may differ.  Their current participants are
> protected from accidentally adding them with "git add ." but risking
> to lose them with "git clean -f".  They may even be trained to be
> careful to see "git clean -n" output before actually running the
> command with "-f".  Now, if their project ships a new version of
> ".gitignore" that marks these paths as "ignored-and-precious", both
> approaches will have intended effect to participants who upgraded to
> the version of Git.
>
> To participants using the current version of Git:
>
>  * Phillip's approach to add "#(keep)" will not change anything.
>    They will be protected from accidental "git add ." as before, and
>    they will still have to be careful about "git clean -f".
>
>  * Elijah's approach to rewrite existing'.config' to '$.config',
>    however, will stop protecting them from "git add .", even though
>    it will start protecting them from "git clean -f".
>
> The devil you already know may be the lessor of two evils in such a
> situation.
>
> So, all it boils down to is these two questions.
>
>  * Which one between "'git add .' adds '.config' that users did not
>    want to add" and "'git clean -f' removes '.config' together with
>    other files" a larger problem to the users, who participate in a
>    project that already decided to use the new .gitignore feature to
>    mark ".config" as "precious", of older versions of Git that
>    predate "precious"?
>
>  * What are projects doing to paths that they want to make
>    "precious" with the current system?  Do they leave them out of
>    ".gitignore" and have them subject to accidental "git add ." to
>    protect them from "git clean -f"?  Or do they list them in
>    ".gitignore" to prevent "git add ." from touching, but leave them
>    susceptible to accidental removal by "git clean -f"?
>
> Thanks.


^ permalink raw reply	[relevance 12%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2024-01-18  7:51 14%       ` Sebastian Thiel
@ 2024-01-18 19:14 13%         ` Junio C Hamano
  2024-01-18 21:33 12%           ` Sebastian Thiel
  2024-01-19  2:58 11%           ` Elijah Newren
  0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2024-01-18 19:14 UTC (permalink / raw)
  To: Sebastian Thiel
  Cc: Elijah Newren, Elijah Newren via GitGitGadget, git, Josh Triplett,
	Phillip Wood

Sebastian Thiel <sebastian.thiel@icloud.com> writes:

> #(keep)
> .config
>
> As a side-effect of the syntax, it's obvious this is an 'upgrade', with
> perfect backwards compatibility as old git does the same as always.

Yes but ...

The point Elijah makes is worth considering.  To existing versions
of git, having this entry for ".config" means that it is ignored
(i.e. "git add ." will not include it), but expendable (i.e. "git
clean" considers ".config" as a candidate for removal; "git checkout
other", if the "other" branch has it as a tracked path, will clobber
it).  Compared to the case where ".config" is not mentioned in
".gitignore", where it may be added by use of "git add .", it won't
be clobbered by "git clean".

So this syntax having "perfect backward compatibility" is not quite
true.  It does have downsides when used by existing versions of Git.

If we use Elijah's syntax to say

	$.config

then the entry to existing versions of git is a no-op wrt a file
named ".config".  It simply does not match the pattern, so an
accidental "git add ." *will* add ".config" to the index, while "git
clean" may not touch it, simply because it is treated as "untracked
and precious".  In other words, its downside is the same as not
marking the path ".config" in any way in ".gitignore", as far as
existing versions of Git are concerned.

We of course discount the possibility that people keep a file whose
name literally is dollar-dot followed by "config" and older versions
of Git would start treating them as ignored-and-expendable.  While
it *is* an additional downside compared to Phillip's "#(keep)"
approach, I do not think that particular downside is worth worrying
about.  Yet another downside compared to Phillip's is that it is
less extensible.  Over the years, however, the ignored-but-precious
is the only one we heard from users that lack of which is hurting
them, so lack of extensibility may not be too huge a deal.

For projects that are currently listing these files in ".gitignore"
as "ignored-and-expendable" already and want to categorize them as
"ignored-and-precious" by changing ".config" to "$.config" (or
adding "#(keep)" comment before the existing entry), the
pros-and-cons equation may differ.  Their current participants are
protected from accidentally adding them with "git add ." but risking
to lose them with "git clean -f".  They may even be trained to be
careful to see "git clean -n" output before actually running the
command with "-f".  Now, if their project ships a new version of
".gitignore" that marks these paths as "ignored-and-precious", both
approaches will have intended effect to participants who upgraded to
the version of Git.

To participants using the current version of Git:

 * Phillip's approach to add "#(keep)" will not change anything.
   They will be protected from accidental "git add ." as before, and
   they will still have to be careful about "git clean -f".

 * Elijah's approach to rewrite existing'.config' to '$.config',
   however, will stop protecting them from "git add .", even though
   it will start protecting them from "git clean -f".

The devil you already know may be the lessor of two evils in such a
situation.

So, all it boils down to is these two questions.

 * Which one between "'git add .' adds '.config' that users did not
   want to add" and "'git clean -f' removes '.config' together with
   other files" a larger problem to the users, who participate in a
   project that already decided to use the new .gitignore feature to
   mark ".config" as "precious", of older versions of Git that
   predate "precious"?

 * What are projects doing to paths that they want to make
   "precious" with the current system?  Do they leave them out of
   ".gitignore" and have them subject to accidental "git add ." to
   protect them from "git clean -f"?  Or do they list them in
   ".gitignore" to prevent "git add ." from touching, but leave them
   susceptible to accidental removal by "git clean -f"?

Thanks.


^ permalink raw reply	[relevance 13%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2023-12-27 22:15 15%     ` Junio C Hamano
@ 2024-01-18  7:51 14%       ` Sebastian Thiel
  2024-01-18 19:14 13%         ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Sebastian Thiel @ 2024-01-18  7:51 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Elijah Newren, Elijah Newren via GitGitGadget, git, Josh Triplett,
	Phillip Wood

I thought it would be helpful to see the syntax being referred to here,
as first brought up by Phillip Wood:

#(keep)
/my-precious-file

The main benefit I see for it is that it's extensible, despite having
trouble imagining what such extension would be 10 years from now.
On the flip side, since it's already using a comment, people will
be even more inclined to document the reason for the preciousness
of the file.

# The kernel configuration, typically created by running a TUI program
#(keep)
.config

As a side-effect of the syntax, it's obvious this is an 'upgrade', with
perfect backwards compatibility as old git does the same as always.

I'd love to take first steps into the implementation, and if the above
should be the syntax to use, I'd be happy to submit a patch for parsing
it, along with initial support for precious files in `git clean` and
`git status`.

Does that sound like a reasonable next step?


On 27 Dec 2023, at 23:15, Junio C Hamano wrote:

> Elijah Newren <newren@gmail.com> writes:
>
>> There are
>> precisely two choices in our design for how older Git versions can
>> treat precious files:
>>   * ignored-and-expendable
>>   * untracked-and-precious
>> If we pick syntax that causes older Git versions to treat precious
>> files as ignored-and-expendable, we risk deleting important files.
>
> Yes but not really.  I'd expect the adoption of precious feature and
> the adoption of versions of Git that supports that feature will go
> more or less hand in hand.  Projects that, for any reason, need to
> keep their participants at pre-precious versions of Git would
> naturally refrain from marking the "precious" paths in their "ignore"
> mechanism before their participants are ready, so even if we chose
> syntax that will make the precious ones mistaken as merely ignored,
> the damage would be fairly small.


^ permalink raw reply	[relevance 14%]

* [PATCH v2 3/6] t1302: make tests more robust with new extensions
  2024-01-10  9:01  3% ` [PATCH v2 0/6] t: mark "files"-backend specific tests Patrick Steinhardt
@ 2024-01-10  9:01  5%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-01-10  9:01 UTC (permalink / raw)
  To: git; +Cc: Taylor Blau, Eric Sunshine

[-- Attachment #1: Type: text/plain, Size: 2151 bytes --]

In t1302 we exercise logic around "core.repositoryFormatVersion" and
extensions. These tests are not particularly robust against extensions
like the newly introduced "refStorage" extension.

Refactor the tests to be more robust:

  - Check the DEFAULT_REPO_FORMAT prereq to determine the expected
    repository format version. This helps to ensure that we only need to
    update the prereq in a central place when new extensions are added.

  - Use a separate repository to rewrite ".git/config" to test
    combinations of the repository format version and extensions. This
    ensures that we don't break the main test repository.

  - Do not rewrite ".git/config" when exercising the "preciousObjects"
    extension.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t1302-repo-version.sh | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
index 179474fa65..7c680c91c4 100755
--- a/t/t1302-repo-version.sh
+++ b/t/t1302-repo-version.sh
@@ -28,7 +28,12 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'gitdir selection on normal repos' '
-	test_oid version >expect &&
+	if test_have_prereq DEFAULT_REPO_FORMAT
+	then
+		echo 0
+	else
+		echo 1
+	fi >expect &&
 	git config core.repositoryformatversion >actual &&
 	git -C test config core.repositoryformatversion >actual2 &&
 	test_cmp expect actual &&
@@ -79,8 +84,13 @@ mkconfig () {
 
 while read outcome version extensions; do
 	test_expect_success "$outcome version=$version $extensions" "
-		mkconfig $version $extensions >.git/config &&
-		check_${outcome}
+		test_when_finished 'rm -rf extensions' &&
+		git init extensions &&
+		(
+			cd extensions &&
+			mkconfig $version $extensions >.git/config &&
+			check_${outcome}
+		)
 	"
 done <<\EOF
 allow 0
@@ -94,7 +104,8 @@ allow 1 noop-v1
 EOF
 
 test_expect_success 'precious-objects allowed' '
-	mkconfig 1 preciousObjects >.git/config &&
+	git config core.repositoryFormatVersion 1 &&
+	git config extensions.preciousObjects 1 &&
 	check_allow
 '
 
-- 
2.43.GIT


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[relevance 5%]

* [PATCH v2 0/6] t: mark "files"-backend specific tests
    2024-01-09 12:17  5% ` [PATCH 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
@ 2024-01-10  9:01  3% ` Patrick Steinhardt
  2024-01-10  9:01  5%   ` [PATCH v2 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
      3 siblings, 1 reply; 200+ results
From: Patrick Steinhardt @ 2024-01-10  9:01 UTC (permalink / raw)
  To: git; +Cc: Taylor Blau, Eric Sunshine

[-- Attachment #1: Type: text/plain, Size: 5069 bytes --]

Hi,

this is the second version of my patch series that addresses tests which
are specific to the "files" backend. Changes compared to v1:

  - I've rewritten the patch addressing t1300 to not mark tests as
    repository format specific anymoreg. Instead, we now create separate
    repos for relevant tests where we are more careful to not discard
    extensions.

  - I've made the casing of config options more consistent.

  - I've extended some commit messages to hopefully explain better why
    I'm doing things the way I do them and fixed some typos.

Thanks for your feedback!

Patrick

Patrick Steinhardt (6):
  t1300: make tests more robust with non-default ref backends
  t1301: mark test for `core.sharedRepository` as reffiles specific
  t1302: make tests more robust with new extensions
  t1419: mark test suite as files-backend specific
  t5526: break test submodule differently
  t: mark tests regarding git-pack-refs(1) to be backend specific

 t/t1300-config.sh             | 74 +++++++++++++++++++++++------------
 t/t1301-shared-repo.sh        |  2 +-
 t/t1302-repo-version.sh       | 19 +++++++--
 t/t1409-avoid-packing-refs.sh |  6 +++
 t/t1419-exclude-refs.sh       |  6 +++
 t/t3210-pack-refs.sh          |  6 +++
 t/t5526-fetch-submodules.sh   |  2 +-
 7 files changed, 83 insertions(+), 32 deletions(-)

Range-diff against v1:
1:  ec1b5bdd17 < -:  ---------- t1300: mark tests to require default repo format
-:  ---------- > 1:  0552123fa3 t1300: make tests more robust with non-default ref backends
2:  68e308c200 = 2:  384250fec2 t1301: mark test for `core.sharedRepository` as reffiles specific
3:  9af1e418d4 ! 3:  1284b70fab t1302: make tests more robust with new extensions
    @@ t/t1302-repo-version.sh: allow 1 noop-v1
      
      test_expect_success 'precious-objects allowed' '
     -	mkconfig 1 preciousObjects >.git/config &&
    -+	git config core.repositoryformatversion 1 &&
    ++	git config core.repositoryFormatVersion 1 &&
     +	git config extensions.preciousObjects 1 &&
      	check_allow
      '
4:  d7c6b8b2a7 ! 4:  c6062b612c t1419: mark test suite as files-backend specific
    @@ Commit message
         excluded pattern(s), 2023-07-10) we have implemented logic to handle
         excluded refs more efficiently in the "packed" ref backend. This logic
         allows us to skip emitting refs completely which we know to not be of
    -    any interest to the caller, which can avoid quite some allocaitons and
    +    any interest to the caller, which can avoid quite some allocations and
         object lookups.
     
         This was wired up via a new `exclude_patterns` parameter passed to the
         backend's ref iterator. The backend only needs to handle them on a best
         effort basis though, and in fact we only handle it for the "packed-refs"
    -    file, but not for loose references. Consequentially, all callers must
    -    still filter emitted refs with those exclude patterns.
    +    file, but not for loose references. Consequently, all callers must still
    +    filter emitted refs with those exclude patterns.
     
         The result is that handling exclude patterns is completely optional in
         the ref backend, and any future backends may or may not implement it.
         Let's thus mark the test for t1419 to depend on the REFFILES prereq.
     
    +    An alternative would be to introduce a new prereq that tells us whether
    +    the backend under test supports exclude patterns or not. But this does
    +    feel a bit overblown:
    +
    +      - It would either map to the REFFILES prereq, in which case it feels
    +        overengineered because the prereq is only ever relevant to t1419.
    +
    +      - Otherwise, it could auto-detect whether the backend supports exclude
    +        patterns. But this could lead to silent failures in case the support
    +        for this feature breaks at any point in time.
    +
    +    It should thus be good enough to just use the REFFILES prereq for now.
    +    If future backends ever grow support for exclude patterns we can easily
    +    add their respective prereq as another condition for this test suite to
    +    execute.
    +
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
     
      ## t/t1419-exclude-refs.sh ##
5:  51e494a50e ! 5:  ae08afc459 t5526: break test submodule differently
    @@ Commit message
         delete the `HEAD` reference will stop working.
     
         Adapt the code to instead delete the objects database. Going back with
    -    this new way to cuase breakage confirms that it triggers the infinite
    +    this new way to cause breakage confirms that it triggers the infinite
         recursion just the same, and there are no equivalent ongoing efforts to
         replace the object database with an alternate backend.
     
6:  a9620f329d = 6:  df648be535 t: mark tests regarding git-pack-refs(1) to be backend specific
-- 
2.43.GIT


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[relevance 3%]

* Re: [PATCH 3/6] t1302: make tests more robust with new extensions
  2024-01-09 12:17  5% ` [PATCH 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
@ 2024-01-09 18:43  0%   ` Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2024-01-09 18:43 UTC (permalink / raw)
  To: Patrick Steinhardt; +Cc: git

On Tue, Jan 09, 2024 at 01:17:12PM +0100, Patrick Steinhardt wrote:
> In t1302 we exercise logic around "core.repositoryFormatVersion" and
> extensions. These tests are not particularly robust against extensions
> like the newly introduced "refStorage" extension.
>
> Refactor the tests to be more robust:
>
>   - Check the DEFAULT_REPO_FORMAT prereq to determine the expected
>     repository format version. This helps to ensure that we only need to
>     update the prereq in a central place when new extensions are added.
>
>   - Use a separate repository to rewrite ".git/config" to test
>     combinations of the repository format version and extensions. This
>     ensures that we don't break the main test repository.
>
>   - Do not rewrite ".git/config" when exercising the "preciousObjects"
>     extension.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  t/t1302-repo-version.sh | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
> index 179474fa65..fb30c87e1b 100755
> --- a/t/t1302-repo-version.sh
> +++ b/t/t1302-repo-version.sh
> @@ -28,7 +28,12 @@ test_expect_success 'setup' '
>  '
>
>  test_expect_success 'gitdir selection on normal repos' '
> -	test_oid version >expect &&
> +	if test_have_prereq DEFAULT_REPO_FORMAT
> +	then
> +		echo 0
> +	else
> +		echo 1
> +	fi >expect &&
>  	git config core.repositoryformatversion >actual &&
>  	git -C test config core.repositoryformatversion >actual2 &&
>  	test_cmp expect actual &&
> @@ -79,8 +84,13 @@ mkconfig () {
>
>  while read outcome version extensions; do
>  	test_expect_success "$outcome version=$version $extensions" "
> -		mkconfig $version $extensions >.git/config &&
> -		check_${outcome}
> +		test_when_finished 'rm -rf extensions' &&
> +		git init extensions &&
> +		(
> +			cd extensions &&
> +			mkconfig $version $extensions >.git/config &&
> +			check_${outcome}
> +		)
>  	"
>  done <<\EOF
>  allow 0
> @@ -94,7 +104,8 @@ allow 1 noop-v1
>  EOF
>
>  test_expect_success 'precious-objects allowed' '
> -	mkconfig 1 preciousObjects >.git/config &&
> +	git config core.repositoryformatversion 1 &&

I'm nit-picking, but it looks like core.repositoryformatversion is all
lower-case, whereas extensions.preciousObjects is camel-case. I don't
think it's a big deal either way, but I couldn't *not* mention it while
reading ;-)

> +	git config extensions.preciousObjects 1 &&
>  	check_allow
>  '
>
> --
> 2.43.GIT

Thanks,
Taylor


^ permalink raw reply	[relevance 0%]

* [PATCH 3/6] t1302: make tests more robust with new extensions
  @ 2024-01-09 12:17  5% ` Patrick Steinhardt
  2024-01-09 18:43  0%   ` Taylor Blau
  2024-01-10  9:01  3% ` [PATCH v2 0/6] t: mark "files"-backend specific tests Patrick Steinhardt
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 200+ results
From: Patrick Steinhardt @ 2024-01-09 12:17 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 2151 bytes --]

In t1302 we exercise logic around "core.repositoryFormatVersion" and
extensions. These tests are not particularly robust against extensions
like the newly introduced "refStorage" extension.

Refactor the tests to be more robust:

  - Check the DEFAULT_REPO_FORMAT prereq to determine the expected
    repository format version. This helps to ensure that we only need to
    update the prereq in a central place when new extensions are added.

  - Use a separate repository to rewrite ".git/config" to test
    combinations of the repository format version and extensions. This
    ensures that we don't break the main test repository.

  - Do not rewrite ".git/config" when exercising the "preciousObjects"
    extension.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t1302-repo-version.sh | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
index 179474fa65..fb30c87e1b 100755
--- a/t/t1302-repo-version.sh
+++ b/t/t1302-repo-version.sh
@@ -28,7 +28,12 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'gitdir selection on normal repos' '
-	test_oid version >expect &&
+	if test_have_prereq DEFAULT_REPO_FORMAT
+	then
+		echo 0
+	else
+		echo 1
+	fi >expect &&
 	git config core.repositoryformatversion >actual &&
 	git -C test config core.repositoryformatversion >actual2 &&
 	test_cmp expect actual &&
@@ -79,8 +84,13 @@ mkconfig () {
 
 while read outcome version extensions; do
 	test_expect_success "$outcome version=$version $extensions" "
-		mkconfig $version $extensions >.git/config &&
-		check_${outcome}
+		test_when_finished 'rm -rf extensions' &&
+		git init extensions &&
+		(
+			cd extensions &&
+			mkconfig $version $extensions >.git/config &&
+			check_${outcome}
+		)
 	"
 done <<\EOF
 allow 0
@@ -94,7 +104,8 @@ allow 1 noop-v1
 EOF
 
 test_expect_success 'precious-objects allowed' '
-	mkconfig 1 preciousObjects >.git/config &&
+	git config core.repositoryformatversion 1 &&
+	git config extensions.preciousObjects 1 &&
 	check_allow
 '
 
-- 
2.43.GIT


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[relevance 5%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2023-12-27  6:54 14%   ` Elijah Newren
@ 2023-12-27 22:15 15%     ` Junio C Hamano
  2024-01-18  7:51 14%       ` Sebastian Thiel
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-12-27 22:15 UTC (permalink / raw)
  To: Elijah Newren
  Cc: Elijah Newren via GitGitGadget, git, Sebastian Thiel,
	Josh Triplett

Elijah Newren <newren@gmail.com> writes:

> There are
> precisely two choices in our design for how older Git versions can
> treat precious files:
>   * ignored-and-expendable
>   * untracked-and-precious
> If we pick syntax that causes older Git versions to treat precious
> files as ignored-and-expendable, we risk deleting important files.

Yes but not really.  I'd expect the adoption of precious feature and
the adoption of versions of Git that supports that feature will go
more or less hand in hand.  Projects that, for any reason, need to
keep their participants at pre-precious versions of Git would
naturally refrain from marking the "precious" paths in their "ignore"
mechanism before their participants are ready, so even if we chose
syntax that will make the precious ones mistaken as merely ignored,
the damage would be fairly small.


^ permalink raw reply	[relevance 15%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2023-12-27  5:28 12% ` Junio C Hamano
@ 2023-12-27  6:54 14%   ` Elijah Newren
  2023-12-27 22:15 15%     ` Junio C Hamano
  2024-02-11 22:08 12%   ` Sebastian Thiel
  1 sibling, 1 reply; 200+ results
From: Elijah Newren @ 2023-12-27  6:54 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Elijah Newren via GitGitGadget, git, Sebastian Thiel,
	Josh Triplett

On Tue, Dec 26, 2023 at 9:28 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > From: Elijah Newren <newren@gmail.com>
> >
> > We have traditionally considered all ignored files to be expendable, but
> > users occasionally want ignored files that are not considered
> > expendable.  Add a design document covering how to split ignored files
> > into two types: 'trashable' (what all ignored files are currently
> > considered) and 'precious' (the new type of ignored file).
>
> The proposed syntax is a bit different from what I personally prefer
> (which is Phillip's [P14] or something like it), but I consider that
> the more valuable parts of this document is about how various
> commands ought to interact with precious paths, which shouldn't
> change regardless of the syntax.

I agree that syntax and command behavior are mostly separate issues,
but unfortunately they are not orthogonal.  In particular, syntax of
precious file specification is directly tied to fallback behavior for
older Git clients, and it might potentially affect backward
compatibility of non-cone-mode sparse-checkout syntax as well.

I think fallback behavior is of particular importance.  There are
precisely two choices in our design for how older Git versions can
treat precious files:
  * ignored-and-expendable
  * untracked-and-precious
If we pick syntax that causes older Git versions to treat precious
files as ignored-and-expendable, we risk deleting important files.
Alternatively, if we pick syntax that causes older Git versions to
treat precious files as untracked-and-precious, they won't be ignored
by e.g. git-status, and are easier to accidentally add with git-add.

I felt the "precious" bit was much more important than the "ignored"
bit of "precious" files, so I thought untracked-and-precious was a
better fallback.  However, to get that, we have to rule out lots of
the syntax proposals, such as Phillip's [P14].

Anyway, I'm open to alternative syntax, but we need to measure it
against the relevant criteria, which I believe are:
  (A) ease for users to understand, remember, and use
  (B) size of backward compatibility break with .gitignore syntax
  (C) appropriateness of implied fallback behavior for older Git
clients with precious files
  (D) room for additional extension in .gitignore files
  (E) potential affects on backward compatibility of non-cone
sparse-checkout syntax
We probably also need to agree on the relative importance of these
criteria; personally, I would probably order them from most important
to least as C, B, E, A, D.

Phillip's P14 is better for D, and perhaps a little better for B, but
I thought slightly worse for A, and much worse for C.  (I think
there's no significant relative difference for E between his proposed
syntax and mine.)

> Thanks for putting this together.


^ permalink raw reply	[relevance 14%]

* Re: [PATCH] precious-files.txt: new document proposing new precious file type
  2023-12-27  2:25 19% [PATCH] precious-files.txt: new document proposing new precious file type Elijah Newren via GitGitGadget
@ 2023-12-27  5:28 12% ` Junio C Hamano
  2023-12-27  6:54 14%   ` Elijah Newren
  2024-02-11 22:08 12%   ` Sebastian Thiel
  0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2023-12-27  5:28 UTC (permalink / raw)
  To: Elijah Newren via GitGitGadget
  Cc: git, Sebastian Thiel, Josh Triplett, Elijah Newren

"Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: Elijah Newren <newren@gmail.com>
>
> We have traditionally considered all ignored files to be expendable, but
> users occasionally want ignored files that are not considered
> expendable.  Add a design document covering how to split ignored files
> into two types: 'trashable' (what all ignored files are currently
> considered) and 'precious' (the new type of ignored file).

The proposed syntax is a bit different from what I personally prefer
(which is Phillip's [P14] or something like it), but I consider that
the more valuable parts of this document is about how various
commands ought to interact with precious paths, which shouldn't
change regardless of the syntax.

Thanks for putting this together.


^ permalink raw reply	[relevance 12%]

* [PATCH] precious-files.txt: new document proposing new precious file type
@ 2023-12-27  2:25 19% Elijah Newren via GitGitGadget
  2023-12-27  5:28 12% ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Elijah Newren via GitGitGadget @ 2023-12-27  2:25 UTC (permalink / raw)
  To: git; +Cc: Sebastian Thiel, Josh Triplett, Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

We have traditionally considered all ignored files to be expendable, but
users occasionally want ignored files that are not considered
expendable.  Add a design document covering how to split ignored files
into two types: 'trashable' (what all ignored files are currently
considered) and 'precious' (the new type of ignored file).

Helped-by: Sebastian Thiel <sebastian.thiel@icloud.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
    precious-files.txt: new document proposing new precious file type
    
    A couple months ago, we had another in-depth discussion of precious
    files[1]. As with previous times, multiple strategies were discussed
    (including multiple new ones), meaning we keep making the possible
    solution space wider and never nail down an agreed path. I also got the
    feeling we were potentially pigeonholing on a subset of the problem
    space, and I thought it'd be good to better enumerate what areas of Git
    are affected.
    
    So, I went through the exercise of creating a design document to: (1)
    provide a specific design proposal and explore it, (2) cover at a high
    level the breadth of issues that an implementor needs to at least think
    about and which reviewers should be aware of in terms of readiness of a
    potential implementation, and (3) provide links to other discussions and
    alternative proposals for completeness.
    
    I had some off-list discussions with Sebastian about this proposal, and
    he provided some helpful feedback. The idea at this point is that if
    folks agree with the general direction, that he is going to be
    implementing at least the first cut basic capability. I'll help review
    changes, but I'm mostly interested in avoiding unfortunate surprises.
    
    So...does the proposed direction seem reasonable to folks?
    
    [1]
    https://lore.kernel.org/git/79901E6C-9839-4AB2-9360-9EBCA1AAE549@icloud.com/

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1627%2Fnewren%2Fprecious-files-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1627/newren/precious-files-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1627

 Documentation/technical/precious-files.txt | 540 +++++++++++++++++++++
 1 file changed, 540 insertions(+)
 create mode 100644 Documentation/technical/precious-files.txt

diff --git a/Documentation/technical/precious-files.txt b/Documentation/technical/precious-files.txt
new file mode 100644
index 00000000000..05c205b57bb
--- /dev/null
+++ b/Documentation/technical/precious-files.txt
@@ -0,0 +1,540 @@
+Precious Files Design Document
+==============================
+
+Table of Contents
+  * Objective
+  * Background
+    * File categorization exceptions
+  * Proposal
+    * Precious file specification
+    * Breakdown of suggested behaviors by command
+  * Backward compatibility notes
+    * Slightly incompatible syntax
+    * Interaction with sparse-checkout parsing
+    * Behavior of traditional flags
+    * Interaction with older Git clients
+    * Commands with modified meaning
+  * Implementation hints
+    * Data structures
+    * Code areas
+    * Minimum
+  * Out of scope
+  * Previous discussions
+  * Alternatives considered
+
+Objective
+---------
+Support "Precious" Files in git, a set of files which are considered
+ignored (e.g. do not show up in "git status" output) but are not expendable
+(thus won't be removed to make room for a file when switching or merging
+branches).
+
+Background
+----------
+In git we have different types of files, with various subdivisions:
+  * tracked
+    * present (i.e. part of sparse checkout)
+    * not present (i.e. not part of sparse checkout)
+  * not tracked
+    * ignored (also treated as expendable)
+    * untracked (more precisely, not-tracked-and-not-ignored, but often
+      referred to as simply "untracked" despite the fact that such a term
+      is easily mistaken as a synonym to "not tracked".  However, we haven't
+      been fully consistent, and some places like `git ls-files --others`
+      may use "untracked" to refer to the larger not-tracked category).
+      Not considered expendable.
+
+Over the years, the fact that ignored files are unconditionally treated as
+expendable (so that other operations like git checkout might wipe them out
+to make room for files on the other branch) has occasionally caused
+problems.  Many have expressed a desire for subdividing the ignored class,
+so that we have both ignored-and-expendable (possibly referred to as
+"trashable", covering the only type of ignored file we have today) and
+introducing ignored-and-not-expendable (often referred to as "precious").
+
+File categorization exceptions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Our division above into nice categories is actually a bit of a lie.
+
+Once upon a time untracked files were considered expendable[1].  Even after
+that changed, we still had lots of edge cases where untracked files were
+deleted when they shouldn't be, and ignored files weren't deleted when they
+should be[2].  While that has been (mostly) fixed, despite the general
+intent to preserve untracked files, we have special cases that are
+documented as not preserving them[4,5].  There are also a few codepaths
+that have comments about locations that might (or definitely do)
+erroneously delete untracked paths[6].  And at least one code path that is
+known to erroneously delete untracked paths which has not been commented:
+`git checkout <tree> <pathspec>`.  And there may be more.
+
+[1] https://lore.kernel.org/git/CABPp-BFyR19ch71W10oJDFuRX1OHzQ3si971pMn6dPtHKxJDXQ@mail.gmail.com/
+[2] https://lore.kernel.org/git/pull.1036.v3.git.1632760428.gitgitgadget@gmail.com/
+[3] https://lore.kernel.org/git/de416f887d7ce24f20ad3ad4cc838394d6523635.1632760428.git.gitgitgadget@gmail.com/
+[4] https://lore.kernel.org/git/xmqqr1e2ejs9.fsf@gitster.g/
+[5] https://lore.kernel.org/git/de416f887d7ce24f20ad3ad4cc838394d6523635.1632760428.git.gitgitgadget@gmail.com/
+[6] https://lore.kernel.org/git/6b42a80bf3d46e16980d0724e8b07101225239d0.1632760428.git.gitgitgadget@gmail.com/
+
+This history and these exceptions matter to this proposal because:
+  * it highlights how much work can be involved in trying to treat a class
+    of files as not expendable
+  * the existing corner cases where untracked files are erroneously
+    treated as expendable will probably also double as corner cases where
+    precious files are treated as expendable
+  * the past fixes for treating untracked files as precious will likely
+    highlight the needed types of code changes to treat ignored files as
+    precious
+
+Proposal
+--------
+We propose adding another class of files: ignored-but-not-expendable,
+referred to by the shorthand of "precious".  The proposal is simple at a
+high level, but there are many details to consider:
+  * How to specify precious files (extended .gitignore syntax?  attributes?)
+  * Which commands should be modified, and how?
+  * How to handle flags that are essentially a partial implementation of
+    a precious capability (e.g. [--[no-]overwrite-ignore])?
+  * How will older Git clients behave on a repo with precious files?
+The subsequent sections will try to address these questions in more detail.
+
+One thing to highlight here is that the class formerly called
+`ignored` now has two subtypes: (1) the type we already have,
+ignored-and-expendable (sometimes referred to below as "trashable")
+and (2) the new type, ignored-and-not-expendable (referred to as
+"precious").
+
+Precious file specification
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+As per [P2]:
+
+    """
+    Even though I referred to the precious _attribute_ in some of these
+    discussions, between the attribute mechanism and the ignore
+    mechanism, I am actually leaning toward suggesting to extend the
+    exclude/ignore mechanism to introduce the "precious" class.  That
+    way, we can avoid possible snafu arising from marking a path in
+    .gitignore as ignored, and in .gitattrbutes as precious, and have to
+    figure out how these two settings are to work together.
+    """
+
+we specify precious files via an extension to .gitignore.  In particular,
+lines starting with a '$' character specify that the file is precious.
+For example:
+  $.config
+would say the file `.config` is precious.
+
+Now that there are three types of files specified by .gitignore files --
+untracked, trashable (ignored-and-expendable), and precious
+(ignored-and-not-expendable), the meaning of `!` at the begining of a line
+needs careful clarification.  It could be seen as "not ignored" or as "not
+trashable", given the subdivision of ignored files that has occurred.  We
+specifically take it to mean "not ignored", i.e. "untracked".
+
+This leaves us with a simple set of rules to provide to users about lines
+in their '.gitignore' file:
+  * No special prefix character => ignored-and-expendable ("trashable")
+  * A '$' prefix character      => ignored-and-not-expendable ("precious")
+  * A '!' prefix character      => not ignored, i.e. untracked
+
+It's worth noting that the traditional use of '!' as a negation
+character needs updating, given the introduction of a ternary state
+("not trashable" could mean either untracked or precious, which is
+ambiguous).  Refrain from referring to '!' as a negation character to
+avoid confusion.  To assist users in making this mindset shift, flag
+any line beginning with '!$' as an error. As always,
+backslash-escaping remains an option, allowing users to specify
+entries like '!\$foo' to mark a file named '$foo' as untracked.
+
+Breakdown of suggested behaviors by command
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+See also "Out of Scope" section below, particularly for:
+  * apply, am [without -3]
+  * checkout/restore
+  * checkout-index
+  * additional information on merge backends
+
+Documentation:
+  * audit for references to "ignore" and "ignored", to see which ones need
+    to now replace those with either "ignored-and-expendable" (or
+    "trashable"), and which can remain "ignored".
+  * audit for "exclude" and "excluded" (the older terminology for ignored
+    files) and update them as well.
+  * add references to "precious" (and perhaps "trashable) as needed (don't
+    forget the glossary)
+  * rm: update the documentation:
+      "Ignored files are deemed expendable and won't stop" ->
+      "Ignored files, unless specifically marked precious, are by default
+       deemed expendable and won't stop"
+  * ensure all codepaths touched by 0e29222e0c2 ("Documentation: call out
+    commands that nuke untracked files/directories", 2021-09-27) also call
+    out that they'll nuke precious files in addition to untracked ones.
+  * change the documentation for '!' in gitignore to stop using the term
+    'negates'; it's potentially misleading now (negating a ternary value
+    yields an ambiguous value).  Instead, the prefix is used to mark
+    untracked (or "not ignored") files.
+  * note that the --[no-]overwrite-ignore option is deprecated, and, since
+    it predated the introduction of precious files is also a misnomer.  The
+    correct name of the option would actually be --[no-]overwrite-trashable
+    but it is too late to rename.
+  * consider documenting that merge's --no-overwrite-ignore option is
+    virtually worthless (only works with the fast-forwarding backend).
+  * consider auditing the code for 'untracked' and fixing those to be
+    'not tracked' in cases where both 'untracked' and 'ignored' files
+    are meant
+
+checkout/switch:
+  * will need to not overwrite precious files when they are in the way of
+    switching branches, unless --force/-f is specified.
+
+checkout/restore:
+  * when passed a <tree> as a source, do not overwrite precious files
+    (NOR untracked files!), unless --force/-f is specified.  [Could be
+    considered a stretch goal...]
+
+merge:
+  * do not overwrite precious files when they are in the way of merging
+    branches.  (Must be handled in each and every merge strategy;
+    user-defined merge strategies may get this wrong.)
+
+read-tree:
+  * -u: do not overwrite precious files when they are in the way, unless...
+  * --reset and -u: overwrite precious files as well as untracked files.
+    Add to the warning under --reset about overwritten untracked files to
+    note that precious files are also overwritten.
+
+am -3, cherry-pick, rebase, revert, : same as above for checkout/switch and
+  merge.
+
+add:
+  * same as today, just make sure when we split the ignored array (ignored &
+    ignored_nr) into multiple categories that it continues working
+
+rm:
+  * make sure submodules are not removed if precious files are present.
+    Currently, rm will remove submodules if only ignored files are present.
+
+check-ignore:
+  * since this command exists for debugging gitignore rules, there needs to
+    be some kind of mechanism for differentiating between trashable and
+    precious files.  It is okay if this comes with a new command-line flag,
+    but there should be some tests showing how it behaves both with and
+    without that flag when precious files are present
+
+clean:
+  * clarify the meaning of -x and -X options: -X now means only remove
+    trashable files.  -x means remove both untracked and trashable files.
+    (See also [P17])
+  * add a --all option for removing all not-tracked files: untracked,
+    trashable, and precious.
+  * Other than --all, it is not worth adding flags for cleaning subsets of
+    not-tracked files that include precious files (thus, no flag for just
+    precious, or trashable and precious, or untracked and precious)
+  * Patterns with a leading '$' can be passed to --exclude, if wanted.
+
+ls-files:
+  * --ignored/-i: shows every kind of ignored file (thus behaving the same
+    as today, since there is no way to distinguish between the types of
+    ignored in the output)
+  * add new `--ignored=precious` and `--ignored=trashable` flags for
+    differentiating.  A plain `--ignored` is like having both
+    `--ignored=precious` and `--ignored=trashable` specified.
+  * --exclude,--exclude-from can now take patterns with a leading '$' and
+    the file will be considered precious rather than trashable.
+
+status:
+  * --ignored (without additional parameters) continues behaving as-is: it
+    prints both trashable and precious files in its "Ignored" category with
+    no distinguishing.
+  * --ignored --short will continue showing trashable files with '!!', but
+    will now show precious files using '$$'.
+  * --ignored --porcelain={v1,v2} will continue showing precious files
+    with the '!' character, since scripts may not be prepared to parse a
+    leading '$'.  We can't break those scripts, even if it'd avoid the
+    off chance that those scripts act on the information about "ignored"
+    files and end up nuking precious files.
+  * --ignored --porcelain=v3 will need to be introduced to show precious
+    files with a leading '$'.
+
+sparse-checkout:
+  * the --rules-file option should be tested with a pattern with a leading
+    '$' to make sure it prints an expected error.
+  * it might be worth noting somewhere that sparse-checkout treats
+    ignored files as precious; when sparsifying, it attempts to remove
+    directories that do not match the sparse specification, but will
+    leave them present if any of the tracked files are modified, or if
+    there are any not-tracked files present.  That includes ignored
+    files.  That means no additional work is needed for precious
+    support; I just mention it for completeness.
+
+Backward compatibility notes
+----------------------------
+There are multiple issues that impinge on backward compatibility (either in
+terms of special care we need to take, or in terms of messaging we may need
+to send out about changes):
+  * Slightly incompatible syntax
+  * Interaction with sparse-checkout parsing
+  * Behavior of traditional flags
+  * Interaction with older Git clients
+  * Commands with modified meaning
+We'll discuss each in its own subsection below.
+
+Slightly incompatible syntax
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+This new syntax obviously breaks backward compatibility in that an ignored
+path named `$.config` would now have to be specified as `\$.config`.  This
+is similar to how introducing `!` as a prefix in .gitignore files was a
+backward compatibility break.  We expect and hope that the fallout will be
+minor.  See also [P10].
+
+Interaction with sparse-checkout parsing
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The $GIT_DIR/info/sparse-checkout file also makes use of gitignore syntax
+and the gitignore parsing to read the file.  It differs in that the files
+specified are considered the files to be included (i.e. present in the
+working copy) rather than which files should be excluded, but otherwise
+has until now used identical syntax and parsing.
+
+However, for sparse-checkout there is no third type of file, so the '$'
+prefix makes no sense for it.  As such, it should be an error for any
+lines to begin with '$' in a sparse-checkout file.
+
+(This also means that if anyone really did have a path beginning with '$'
+in sparse-checkout files previously, then they now need to backslash escape
+them, the same as with .gitignore files.)
+
+While we could theoretically avoid this small backward compatibility break
+for sparse-checkout parsing by just treating a leading '$' the way it
+traditionally has been done, I am worried about practically maintaining that
+solution:
+  * the gitignore parsing is peppered with references like 'exclude' that
+    are specific to the gitignore case
+  * because of the above, it is _heavily_ confusing to attempt to read and
+    understand the gitignore handling while considering the sparse-checkout
+    case.  I've been tripped up by it *many* times.
+  * I think trying to reuse the existing parsing engine and have it handling
+    both old and new syntax is a recipe for failure.  It'd be much cleaner
+    to have errors thrown if the processing turns up any "precious" files,
+    or perhaps if any line starts with '$'.
+  * I think making a copy of the existing parsing, and then letting them
+    diverge, means the two will eventually diverge even further, and we
+    would need to make a copy of all the documentation about gitignore rules
+    for sparse-checkout, all for the non-default non-cone case we are
+    already recommending users away from.
+
+Behavior of traditional flags
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+There are two flags to consider here: the --porcelain flag to git-status,
+and the --no-overwrite-ignore command to checkout & merge commands.  For
+the --porcelain flag to git-status, see the "Breakdown of suggested
+behaviors by command" and look for git-status there.  The rest of this
+section will focus on --[no-]overwrite-ignore.
+
+People have wanted precious files long enough, that they implemented an
+interim kludge of sorts -- a command line option that can be passed to
+various subcommands that treats all ignored files as precious:
+--no-overwrite-ignore.
+
+In particular, this flag can be passed to both git-checkout, and git-merge.
+However, in merge's case, the support depended the flag being passed to the
+backend and the backend supporting it.  The builtin/merge.c code only ever
+bothered to pass this flag down to the fast-forwarding merge handling code,
+so it never worked with any backends that actually create a merge commit.
+
+We do need to keep these flags working, at least as much as they did
+previously.  However, we don't want to consider them desired features,
+which would lead us to making related equivalents for precious files like
+--overwrite-precious.  Instead we will:
+  * Keep --[no-]overwrite-ignore working, as much as it already was.
+  * Recommend users mark precious files in their gitignore files instead of
+    using these flags
+
+Interaction with older Git clients
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Older Git clients will not understand precious files.  This means that:
+  * precious files will be considered untracked and not ignored.
+  * most comands will preserve these files, since untracked-and-not-ignored
+    are not considered expendable.
+  * git status will continue listing these files
+  * git add will add these files without requiring -f.
+
+This seems like a reasonable tradeoff that only has minor annoyances.  The
+alternative of having the precious files treated as ignored has the very
+risky trade-off of deleting files which the users marked as important for
+us to keep.
+
+Commands with modified meaning
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In clean, we adjust the meaning of both -x and -X:
+  -X: remove only trashable files
+  -x: remove untracked and trashable files (but preserve precious ones)
+
+Implementation hints
+--------------------
+
+Data structures
+~~~~~~~~~~~~~~~
+  * We will want to add a `precious` and `precious_nr` in dir_struct,
+    similar to the current entries/nr or ignored/ignored_nr.
+  * We may want to rename `ignored` and `ignored_nr` in dir_struct to
+    `trashable` and `trashable_nr`.
+
+Code areas
+~~~~~~~~~~
+  * "preserve_ignored", a flag in the code for handling the
+    --[no-]overwrite-ignore flag, is a very helpful marker about what needs
+    to be tweaked and how to tweak it to preserve more files.  In particular,
+    note that --no-overwrite-ignore works by telling the machinery in dir.c
+    to not do the setup_standard_excludes() stuff, so that all ignored files
+    just look like untracked files.  We'll need something slightly smarter,
+    which makes precious files look like untracked while trashable files
+    still appear in ignored.  Shouldn't be too bad.
+  * we might need to add another entry to the unpack_trees_reset_type
+    enum.  Or perhaps we still keep both UNPACK_RESET_PROTECT_UNTRACKED
+    and UNPACK_RESET_OVERWRITE_UNTRACKED but rename them with
+    s/UNTRACKED/NOT_EXPENDABLE/ so it is clear they handle both untracked and
+    precious files.  Not sure which is needed yet.
+  * dir_struct->flags _might_ need new entries.
+  * ensure all relevant codepaths touched by 94b7f1563ac ("Comment important
+    codepaths regarding nuking untracked files/dirs", 2021-09-27) are either
+    fixed or also mention precious files
+  * am/rebase/checkout[without -f]: see 480d3d6bf90 ("Change unpack_trees'
+    'reset' flag into an enum", 2021-09-27)
+  * Merge backends:
+    * (see also "Out of scope" section)
+    * merge-ort can be fixed by fixing the checkout code.
+    * merge-resolve and merge-octopus can probably be fixed by fixing
+      git-reset.
+  * stash:
+    * there is an existing --include-untracked option.  There was no reason
+      to add a --include-ignored, because ignored files were trashable.  Do
+      we need to add a --include-precious, though?
+    * this is a sad pile of shell-reimplemented-in-C.  It's just awful.
+      See b34ab4a43ba ("stash: remove unnecessary process forking",
+      2020-12-01) and ba359fd5070 ("stash: fix stash application in
+      sparse-checkouts", 2020-12-01) and 94b7f1563ac ("Comment important
+      codepaths regarding nuking untracked files/dirs", 2021-09-27).
+      Fixing stash to not nuke precious files (and to not nuke untracked
+      files either) might mean expunging the stupid
+      shell-reimplemented-in-C design, or at least moving things more in
+      that direction.
+  * rebase (merge backend), revert, cherry-pick, am -3: should automatically
+    be handled by getting merge-ort to work, which should work by making
+    checkout/switch work.
+  * bisect: should work by making checkout work
+
+Minimum
+~~~~~~~
+
+I think for a minimum implementation, we need to ensure that the following
+are handled:
+  * parsing:
+    * parsing of lines starting with '$' in .gitignore
+    * erroring on lines starting with '!$' in .gitignore
+    * erroring on lines starting with '$' in $GIT_DIR/info/sparse-checkout
+  * commands with support:
+    * switch/checkout
+    * merge when using the ort backend
+    * read-tree -u [without --reset] (due to internal use)
+    * ls-files
+
+Out of scope
+------------
+The following tasks are currently out of scope for this proposal:
+
+apply, am [without -3]: apply won't overwrite any file in the working
+  directory even when a new file is in the patch.  It should overwrite
+  trashable files.  We could log that bug via testcase, but make sure
+  there's a companion testcase that ensures overwriting untracked or
+  precious files continues to make apply throw an error.  However, since
+  apply/am don't misbehave for precious files, we can defer this to later.
+
+checkout-index: similar to apply; won't overwrite any existing files, but
+  trashable files should be overwritten
+
+reset --hard:
+  * `git reset --hard` is a little funny and we have thought about changing
+    it[4].  However, that can be left for later and will not be tackled as
+    part of the work of introducing "precious" files as a concept.
+
+merge backends:
+  * it may make sense to try to make --no-overwrite-ignore work with more
+    merge backends, both because it's technically documented behavior, and
+    because doing so may be a step towards getting precious files supported
+  * when multiple merge strategies are specified, builtin/merge.c will
+    stash and restore state between the attempt of different strategies.
+    Since the reset_hard() function invokes `read-tree --reset -u`, there
+    might be a way to cause it to trash untracked files or to trash
+    precious files, depending on what the merge strategies did.  It seems
+    unlikely (maybe the strategy handles D/F conflicts or rename
+    conflicts by renaming files in the way, and happens to rename a
+    precious file to a path that is considered either untracked or
+    precious -- merge-recursive certainly did this something like this
+    once upon a time and still might); we can probably ignore it for now.
+  * merge-recursive is a lost cause; it'd be a _huge_ amount of effort to
+    fix, but we intend to deprecate and delete it soon anyway (making all
+    requests for recursive just trigger ort instead).
+  * user-defined merge strategies are up to their authors to get right.
+    Odds are they won't, but odds are they already incorrectly nuke
+    untracked files too because who'd pay attention to a special case
+    like files being in the way of a merge?  Anyway, "not our problem".  :-)
+
+Previous discussions
+--------------------
+
+A far from exhaustive sampling of various past conversations on the topic:
+
+[P1] https://lore.kernel.org/git/7vipsnar23.fsf@alter.siamese.dyndns.org/
+[P2] https://lore.kernel.org/git/xmqqttqytnqb.fsf@gitster.g/
+[P3] https://lore.kernel.org/git/79901E6C-9839-4AB2-9360-9EBCA1AAE549@icloud.com/
+[P4] https://lore.kernel.org/git/87a6q9kacx.fsf@evledraar.gmail.com/
+[P5] https://lore.kernel.org/git/20190216114938.18843-1-pclouds@gmail.com/
+[P6] https://lore.kernel.org/git/87ftsi68ke.fsf@evledraar.gmail.com/
+[P7] https://lore.kernel.org/git/xmqqo7ub4sfh.fsf@gitster.g/
+[P8] https://lore.kernel.org/git/7v4oepaup7.fsf@alter.siamese.dyndns.org/
+[P9] https://lore.kernel.org/git/20181112232209.GK890086@genre.crustytoothpaste.net/
+[P10] https://lore.kernel.org/git/xmqqttqvg4lw.fsf@gitster.g/
+[P11] https://lore.kernel.org/git/xmqqk1hrr91s.fsf@gitster-ct.c.googlers.com/
+[P12] https://lore.kernel.org/git/9C4A2AFD-AAA2-4ABA-8A8B-2133FD870366@icloud.com/
+[P13] https://lore.kernel.org/git/xmqqfs2e3292.fsf@gitster.g/
+[P14] https://lore.kernel.org/git/0deee2bc-1775-4459-906d-1d44b3103499@gmail.com/
+[P15] https://lore.kernel.org/git/ZSkpOc%2FdcGcrFQNU@ugly/
+[P16] https://lore.kernel.org/git/xmqqil79t82q.fsf@gitster.g/
+[P17] https://lore.kernel.org/git/xmqqo7h6tnib.fsf@gitster.g/
+
+Alternatives considered
+-----------------------
+There have been multiple alternatives considered, along a few different
+axes:
+  * .gitattributes instead of .gitignore
+  * leaving sparse-checkout alone
+  * Trashable [P9,P11]
+  * Alternative gitignore syntax
+
+The choice of .gitattributes vs .gitignore was already addressed in the
+"Precious file specification" section.
+
+The choice to modify or leave alone the parsing of
+$GIT_DIR/info/sparse-checkout was already addressed in the "Interaction
+with sparse-checkout parsing" section.
+
+One alternative raised in the past was treating ignored files as not
+expendable by default, and then introducing a new category of
+ignored-but-expendable.  This new category has been dubbed "trashable" in
+the past.  That may have been a reasonable solution if Git did not have a
+large userbase already, but moving in this direction would cause severe
+problems for existing builds everywhere[P9] and would require users to
+doubly configure most files (since it is expected that
+ignored-but-expendable is a much larger class of files than
+ignored-but-precious).  See also [P11].
+
+There have been multiple alternative suggestions for extending gitignore
+syntax to handle precious files and optionally future extensions as well.
+For example: [P10, P12, P13, P14, P15, P16]  However:
+  * There have been on and off requests for precious files for about 14
+    years
+  * We are not aware of other types of extensions needed; there might
+    not be any
+  * The alternatives all seem much more complex to explain to users than
+    the simple proposal here.
+In particular, we like the simplicity of the providing the simple mapping
+to users from the penultimate paragraph of the "Precious file
+specification" section (the one regarding no-prefix vs. '!' vs '$').

base-commit: 564d0252ca632e0264ed670534a51d18a689ef5d
-- 
gitgitgadget


^ permalink raw reply related	[relevance 19%]

* Re: [PATCH 2/2] pretty: add '%aA' to show domain-part of email addresses
  2023-11-20 20:21  4%         ` Junio C Hamano
@ 2023-12-10 21:07  0%           ` Liam Beguin
  0 siblings, 0 replies; 200+ results
From: Liam Beguin @ 2023-12-10 21:07 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jeff King, Kousik Sanagavarapu, git

Hi Junio,

Apologies for the late reply.

On Tue, Nov 21, 2023 at 05:21:43AM +0900, Junio C Hamano wrote:
> Junio C Hamano <gitster@pobox.com> writes:
> 
> > Another line of thought is perhaps it is potentially useful to teach
> > the --format= machinery to be a bit more programmable, e.g. allowing
> > to compute a substring of an existing field %{%aE#*@} without having
> > to waste a letter each for the local part and domain part.  But as I
> > already said, we are now talking about "postprocessing", and adding
> > complexity to our codebase only to have incomplete flexibility may
> > not be worth it.  A more specific %(authoremail:localpart) and its
> > domain counterpart may be easier to explain and understand.
> >
> > In any case, it is a bit too late to say "let's not waste the
> > precious single letter namespace to add useless features", as we
> > have come way too far, so I do not mind too much using a currently
> > unused letter $X for yet another author and committer trait.
> 
> When I wrote the above, I somehow forgot the existing work in the
> ref-filter (aka "for-each-ref") placeholders, where we have support
> to a lot more flexible way to customize these things.

I looked into this a little, after your first email. I'll try to make
time to have another look.

> For example, "%(authoremail:mailmap,localpart)" can be used to say,
> instead of wasting two letters 'l' and 'L' out of precious 52, that
> we want e-mail address honoring the mailmap, and take only the local
> part.  And the support for the host part of the address that this
> topic discussed should be implementable fairly easily (just adding
> EO_HOSTPART bit to the email_option structure would be sufficient)
> on the ref-filter side.
> 
> We saw efforts from time to time to give "log --pretty=format:" more
> of the good things from the "for-each-ref --format=" placeholders
> (and vice versa), and it may give us a good way forward.

This definitely sounds like a better approach than wasting two more
letters.

Liam


^ permalink raw reply	[relevance 0%]

* Re: [PATCH 2/7] repack: use die_for_incompatible_opt3() for -A/-k/--cruft
  2023-12-06 11:51  5% ` [PATCH 2/7] repack: use die_for_incompatible_opt3() for -A/-k/--cruft René Scharfe
@ 2023-12-06 19:18  0%   ` Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-12-06 19:18 UTC (permalink / raw)
  To: René Scharfe; +Cc: git

On Wed, Dec 06, 2023 at 12:51:56PM +0100, René Scharfe wrote:
> diff --git a/builtin/repack.c b/builtin/repack.c
> index edaee4dbec..c54777bbe5 100644
> --- a/builtin/repack.c
> +++ b/builtin/repack.c
> @@ -1203,19 +1203,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
>  	if (delete_redundant && repository_format_precious_objects)
>  		die(_("cannot delete packs in a precious-objects repo"));
>
> -	if (keep_unreachable &&
> -	    (unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE)))
> -		die(_("options '%s' and '%s' cannot be used together"), "--keep-unreachable", "-A");
> +	die_for_incompatible_opt3(unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE), "-A",
> +				  keep_unreachable, "-k/--keep-unreachable",
> +				  pack_everything & PACK_CRUFT, "--cruft");

Oof, thanks for cleaning this one up.

I had to read this hunk a couple of times to convince myself that it was
doing the right thing, but I believe it is.

> -	if (pack_everything & PACK_CRUFT) {
> +	if (pack_everything & PACK_CRUFT)
>  		pack_everything |= ALL_INTO_ONE;

And adding the ALL_INTO_ONE bit here does not effect either of the below
two checks, so moving them up is fine, too.

> -		if (unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE))
> -			die(_("options '%s' and '%s' cannot be used together"), "--cruft", "-A");
> -		if (keep_unreachable)
> -			die(_("options '%s' and '%s' cannot be used together"), "--cruft", "-k");
> -	}

Thanks,
Taylor


^ permalink raw reply	[relevance 0%]

* [PATCH 2/7] repack: use die_for_incompatible_opt3() for -A/-k/--cruft
  @ 2023-12-06 11:51  5% ` René Scharfe
  2023-12-06 19:18  0%   ` Taylor Blau
  0 siblings, 1 reply; 200+ results
From: René Scharfe @ 2023-12-06 11:51 UTC (permalink / raw)
  To: git

The repack option --keep-unreachable is incompatible with -A, --cruft is
incompatible with -A and -k, and -k is short for --keep-unreachable.  So
they are all incompatible with each other.

Use the function for checking three mutually incompatible options,
die_for_incompatible_opt3(), to perform this check in one place and
without repetition.  This is shorter and clearer.

Signed-off-by: René Scharfe <l.s.r@web.de>
---
 builtin/repack.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/builtin/repack.c b/builtin/repack.c
index edaee4dbec..c54777bbe5 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -1203,19 +1203,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	if (delete_redundant && repository_format_precious_objects)
 		die(_("cannot delete packs in a precious-objects repo"));

-	if (keep_unreachable &&
-	    (unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE)))
-		die(_("options '%s' and '%s' cannot be used together"), "--keep-unreachable", "-A");
+	die_for_incompatible_opt3(unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE), "-A",
+				  keep_unreachable, "-k/--keep-unreachable",
+				  pack_everything & PACK_CRUFT, "--cruft");

-	if (pack_everything & PACK_CRUFT) {
+	if (pack_everything & PACK_CRUFT)
 		pack_everything |= ALL_INTO_ONE;

-		if (unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE))
-			die(_("options '%s' and '%s' cannot be used together"), "--cruft", "-A");
-		if (keep_unreachable)
-			die(_("options '%s' and '%s' cannot be used together"), "--cruft", "-k");
-	}
-
 	if (write_bitmaps < 0) {
 		if (!write_midx &&
 		    (!(pack_everything & ALL_INTO_ONE) || !is_bare_repository()))
--
2.43.0



^ permalink raw reply related	[relevance 5%]

* Re: [PATCH 2/2] pretty: add '%aA' to show domain-part of email addresses
  2023-10-29 23:53  4%       ` Junio C Hamano
@ 2023-11-20 20:21  4%         ` Junio C Hamano
  2023-12-10 21:07  0%           ` Liam Beguin
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-11-20 20:21 UTC (permalink / raw)
  To: Jeff King; +Cc: Kousik Sanagavarapu, Liam Beguin, git

Junio C Hamano <gitster@pobox.com> writes:

> Another line of thought is perhaps it is potentially useful to teach
> the --format= machinery to be a bit more programmable, e.g. allowing
> to compute a substring of an existing field %{%aE#*@} without having
> to waste a letter each for the local part and domain part.  But as I
> already said, we are now talking about "postprocessing", and adding
> complexity to our codebase only to have incomplete flexibility may
> not be worth it.  A more specific %(authoremail:localpart) and its
> domain counterpart may be easier to explain and understand.
>
> In any case, it is a bit too late to say "let's not waste the
> precious single letter namespace to add useless features", as we
> have come way too far, so I do not mind too much using a currently
> unused letter $X for yet another author and committer trait.

When I wrote the above, I somehow forgot the existing work in the
ref-filter (aka "for-each-ref") placeholders, where we have support
to a lot more flexible way to customize these things.

For example, "%(authoremail:mailmap,localpart)" can be used to say,
instead of wasting two letters 'l' and 'L' out of precious 52, that
we want e-mail address honoring the mailmap, and take only the local
part.  And the support for the host part of the address that this
topic discussed should be implementable fairly easily (just adding
EO_HOSTPART bit to the email_option structure would be sufficient)
on the ref-filter side.

We saw efforts from time to time to give "log --pretty=format:" more
of the good things from the "for-each-ref --format=" placeholders
(and vice versa), and it may give us a good way forward.



^ permalink raw reply	[relevance 4%]

* [PATCH 2/2] tests: teach callers of test_i18ngrep to use test_grep
  @ 2023-10-31  5:23  1%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-10-31  5:23 UTC (permalink / raw)
  To: git

They are equivalents and the former still exists, so as long as the
only change this commit makes are to rewrite test_i18ngrep to
test_grep, there won't be any new bug, even if there still are
callers of test_i18ngrep remaining in the tree, or when merged to
other topics that add new uses of test_i18ngrep.

This patch was produced more or less with

    git grep -l -e 'test_i18ngrep ' 't/t[0-9][0-9][0-9][0-9]-*.sh' |
    xargs perl -p -i -e 's/test_i18ngrep /test_grep /'

and a good way to sanity check the result yourself is to run the
above in a checkout of c4603c1c (test framework: further deprecate
test_i18ngrep, 2023-10-31) and compare the resulting working tree
contents with the result of applying this patch to the same commit.
You'll see that test_i18ngrep in a few t/lib-*.sh files corrected,
in addition to the manual reproduction.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/lib-httpd.sh                               |   2 +-
 t/lib-submodule-update.sh                    |   2 +-
 t/t0001-init.sh                              |  16 +--
 t/t0002-gitfile.sh                           |   4 +-
 t/t0003-attributes.sh                        |   4 +-
 t/t0008-ignores.sh                           |   4 +-
 t/t0012-help.sh                              |  16 +--
 t/t0013-sha1dc.sh                            |   2 +-
 t/t0014-alias.sh                             |   8 +-
 t/t0021-conversion.sh                        |   6 +-
 t/t0028-working-tree-encoding.sh             |  32 ++---
 t/t0040-parse-options.sh                     |   4 +-
 t/t0041-usage.sh                             |  32 ++---
 t/t0061-run-command.sh                       |   6 +-
 t/t0070-fundamental.sh                       |   4 +-
 t/t0091-bugreport.sh                         |   2 +-
 t/t0300-credentials.sh                       |   2 +-
 t/t1060-object-corruption.sh                 |   2 +-
 t/t1091-sparse-checkout-builtin.sh           |  68 ++++-----
 t/t1092-sparse-checkout-compatibility.sh     |   6 +-
 t/t1300-config.sh                            |  44 +++---
 t/t1307-config-blob.sh                       |   2 +-
 t/t1308-config-set.sh                        |  10 +-
 t/t1309-early-config.sh                      |   2 +-
 t/t1310-config-default.sh                    |   4 +-
 t/t1400-update-ref.sh                        |  22 +--
 t/t1404-update-ref-errors.sh                 |   4 +-
 t/t1410-reflog.sh                            |   6 +-
 t/t1416-ref-transaction-hooks.sh             |   2 +-
 t/t1430-bad-ref-name.sh                      |  22 +--
 t/t1450-fsck.sh                              |  80 +++++------
 t/t1506-rev-parse-diagnosis.sh               |  34 ++---
 t/t1512-rev-parse-disambiguation.sh          |   6 +-
 t/t2004-checkout-cache-temp.sh               |   2 +-
 t/t2006-checkout-index-basic.sh              |  14 +-
 t/t2010-checkout-ambiguous.sh                |   4 +-
 t/t2018-checkout-branch.sh                   |   4 +-
 t/t2019-checkout-ambiguous-ref.sh            |   8 +-
 t/t2020-checkout-detach.sh                   |   8 +-
 t/t2024-checkout-dwim.sh                     |   8 +-
 t/t2025-checkout-no-overlay.sh               |   2 +-
 t/t2026-checkout-pathspec-file.sh            |   8 +-
 t/t2027-checkout-track.sh                    |   2 +-
 t/t2030-unresolve-info.sh                    |   2 +-
 t/t2072-restore-pathspec-file.sh             |   8 +-
 t/t2106-update-index-assume-unchanged.sh     |   2 +-
 t/t2107-update-index-basic.sh                |   4 +-
 t/t2203-add-intent.sh                        |   6 +-
 t/t2204-add-ignored.sh                       |   8 +-
 t/t2401-worktree-prune.sh                    |  10 +-
 t/t2402-worktree-list.sh                     |   6 +-
 t/t2403-worktree-move.sh                     |   2 +-
 t/t2406-worktree-repair.sh                   |  24 ++--
 t/t3004-ls-files-basic.sh                    |   4 +-
 t/t3007-ls-files-recurse-submodules.sh       |   4 +-
 t/t3200-branch.sh                            |  18 +--
 t/t3202-show-branch.sh                       |   2 +-
 t/t3206-range-diff.sh                        |  22 +--
 t/t3210-pack-refs.sh                         |   2 +-
 t/t3301-notes.sh                             |   4 +-
 t/t3310-notes-merge-manual-resolve.sh        |  16 +--
 t/t3320-notes-merge-worktrees.sh             |   4 +-
 t/t3321-notes-stripspace.sh                  |   2 +-
 t/t3400-rebase.sh                            |   6 +-
 t/t3402-rebase-merge.sh                      |   2 +-
 t/t3403-rebase-skip.sh                       |  30 ++--
 t/t3404-rebase-interactive.sh                |  38 ++---
 t/t3406-rebase-message.sh                    |  18 +--
 t/t3418-rebase-continue.sh                   |   6 +-
 t/t3431-rebase-fork-point.sh                 |   2 +-
 t/t3501-revert-cherry-pick.sh                |   6 +-
 t/t3507-cherry-pick-conflict.sh              |   8 +-
 t/t3510-cherry-pick-sequence.sh              |   6 +-
 t/t3600-rm.sh                                |   8 +-
 t/t3601-rm-pathspec-file.sh                  |   6 +-
 t/t3700-add.sh                               |   6 +-
 t/t3701-add-interactive.sh                   |   8 +-
 t/t3704-add-pathspec-file.sh                 |  12 +-
 t/t3900-i18n-commit.sh                       |   8 +-
 t/t3901-i18n-patch.sh                        |   2 +-
 t/t3903-stash.sh                             |  10 +-
 t/t3905-stash-include-untracked.sh           |   2 +-
 t/t3909-stash-pathspec-file.sh               |   6 +-
 t/t4001-diff-rename.sh                       |  34 ++---
 t/t4013-diff-various.sh                      |   2 +-
 t/t4014-format-patch.sh                      |  12 +-
 t/t4015-diff-whitespace.sh                   |  20 +--
 t/t4018-diff-funcname.sh                     |  14 +-
 t/t4031-diff-rewrite-binary.sh               |   2 +-
 t/t4047-diff-dirstat.sh                      |  22 +--
 t/t4053-diff-no-index.sh                     |   2 +-
 t/t4055-diff-context.sh                      |   4 +-
 t/t4068-diff-symmetric-merge-base.sh         |  28 ++--
 t/t4115-apply-symlink.sh                     |   2 +-
 t/t4120-apply-popt.sh                        |   4 +-
 t/t4122-apply-symlink-inside.sh              |  14 +-
 t/t4129-apply-samemode.sh                    |   4 +-
 t/t4133-apply-filenames.sh                   |   8 +-
 t/t4150-am.sh                                |   4 +-
 t/t4151-am-abort.sh                          |   2 +-
 t/t4153-am-resume-override-opts.sh           |   2 +-
 t/t4200-rerere.sh                            |   4 +-
 t/t4201-shortlog.sh                          |   2 +-
 t/t4202-log.sh                               |  18 +--
 t/t4203-mailmap.sh                           |   2 +-
 t/t4208-log-magic-pathspec.sh                |   6 +-
 t/t4209-log-pickaxe.sh                       |   4 +-
 t/t4211-line-log.sh                          |   4 +-
 t/t4212-log-corrupt.sh                       |   2 +-
 t/t4256-am-format-flowed.sh                  |   2 +-
 t/t5300-pack-object.sh                       |   4 +-
 t/t5302-pack-index.sh                        |   4 +-
 t/t5304-prune.sh                             |   4 +-
 t/t5310-pack-bitmaps.sh                      |   8 +-
 t/t5318-commit-graph.sh                      |  18 +--
 t/t5319-multi-pack-index.sh                  |  10 +-
 t/t5324-split-commit-graph.sh                |  16 +--
 t/t5331-pack-objects-stdin.sh                |   4 +-
 t/t5411/test-0026-push-options.sh            |   2 +-
 t/t5411/test-0027-push-options--porcelain.sh |   2 +-
 t/t5500-fetch-pack.sh                        |  10 +-
 t/t5504-fetch-receive-strict.sh              |  26 ++--
 t/t5505-remote.sh                            |  22 +--
 t/t5510-fetch.sh                             |   8 +-
 t/t5512-ls-remote.sh                         |   2 +-
 t/t5514-fetch-multiple.sh                    |   4 +-
 t/t5516-fetch-push.sh                        |   8 +-
 t/t5520-pull.sh                              |  34 ++---
 t/t5521-pull-options.sh                      |   2 +-
 t/t5523-push-upstream.sh                     |  12 +-
 t/t5528-push-default.sh                      |   2 +-
 t/t5530-upload-pack-error.sh                 |   4 +-
 t/t5531-deep-submodule-push.sh               |   2 +-
 t/t5534-push-signed.sh                       |   6 +-
 t/t5536-fetch-conflicts.sh                   |   8 +-
 t/t5541-http-push-smart.sh                   |  20 +--
 t/t5545-push-options.sh                      |   2 +-
 t/t5550-http-fetch-dumb.sh                   |   8 +-
 t/t5551-http-fetch-smart.sh                  |   4 +-
 t/t5570-git-daemon.sh                        |  10 +-
 t/t5572-pull-submodule.sh                    |   2 +-
 t/t5573-pull-verify-signatures.sh            |  26 ++--
 t/t5574-fetch-output.sh                      |   4 +-
 t/t5580-unc-paths.sh                         |   2 +-
 t/t5601-clone.sh                             |   6 +-
 t/t5604-clone-reference.sh                   |   2 +-
 t/t5606-clone-options.sh                     |  10 +-
 t/t5607-clone-bundle.sh                      |   4 +-
 t/t5611-clone-config.sh                      |   4 +-
 t/t5616-partial-clone.sh                     |  22 +--
 t/t5701-git-serve.sh                         |   8 +-
 t/t5702-protocol-v2.sh                       |  34 ++---
 t/t5703-upload-pack-ref-in-want.sh           |   4 +-
 t/t5704-protocol-violations.sh               |   4 +-
 t/t5801-remote-helpers.sh                    |   8 +-
 t/t5812-proto-disable-http.sh                |   2 +-
 t/t6001-rev-list-graft.sh                    |   4 +-
 t/t6021-rev-list-exclude-hidden.sh           |   4 +-
 t/t6030-bisect-porcelain.sh                  |  24 ++--
 t/t6040-tracking-info.sh                     |  18 +--
 t/t6050-replace.sh                           |  14 +-
 t/t6102-rev-list-unexpected-objects.sh       |  16 +--
 t/t6112-rev-list-filters-objects.sh          |   2 +-
 t/t6120-describe.sh                          |   2 +-
 t/t6134-pathspec-in-submodule.sh             |   2 +-
 t/t6135-pathspec-with-attrs.sh               |   8 +-
 t/t6136-pathspec-in-bare.sh                  |   8 +-
 t/t6402-merge-rename.sh                      |  16 +--
 t/t6422-merge-rename-corner-cases.sh         |  16 +--
 t/t6423-merge-rename-directories.sh          | 140 +++++++++----------
 t/t6424-merge-unrelated-index-changes.sh     |   6 +-
 t/t6425-merge-rename-delete.sh               |   4 +-
 t/t6426-merge-skip-unneeded-updates.sh       |   2 +-
 t/t6430-merge-recursive.sh                   |   8 +-
 t/t6433-merge-toplevel.sh                    |   4 +-
 t/t6436-merge-overwrite.sh                   |   4 +-
 t/t6437-submodule-merge.sh                   |   2 +-
 t/t6500-gc.sh                                |  14 +-
 t/t7001-mv.sh                                |   4 +-
 t/t7105-reset-patch.sh                       |   6 +-
 t/t7106-reset-unborn-branch.sh               |   2 +-
 t/t7107-reset-pathspec-file.sh               |  10 +-
 t/t7110-reset-merge.sh                       |   6 +-
 t/t7201-co.sh                                |   4 +-
 t/t7300-clean.sh                             |   2 +-
 t/t7400-submodule-basic.sh                   |  64 ++++-----
 t/t7403-submodule-sync.sh                    |   4 +-
 t/t7406-submodule-update.sh                  |   6 +-
 t/t7411-submodule-config.sh                  |   4 +-
 t/t7414-submodule-mistakes.sh                |   8 +-
 t/t7416-submodule-dash-url.sh                |   4 +-
 t/t7417-submodule-path-url.sh                |   4 +-
 t/t7450-bad-git-dotfiles.sh                  |  12 +-
 t/t7500-commit-template-squash-signoff.sh    |   2 +-
 t/t7501-commit-basic-functionality.sh        |   6 +-
 t/t7502-commit-porcelain.sh                  |  32 ++---
 t/t7506-status-submodule.sh                  |  28 ++--
 t/t7507-commit-verbose.sh                    |   4 +-
 t/t7508-status.sh                            |  24 ++--
 t/t7509-commit-authorship.sh                 |   4 +-
 t/t7518-ident-corner-cases.sh                |  10 +-
 t/t7519-status-fsmonitor.sh                  |   6 +-
 t/t7520-ignored-hook-warning.sh              |   8 +-
 t/t7525-status-rename.sh                     |  54 +++----
 t/t7526-commit-pathspec-file.sh              |  14 +-
 t/t7600-merge.sh                             |  30 ++--
 t/t7601-merge-pull-config.sh                 |  50 +++----
 t/t7611-merge-abort.sh                       |   4 +-
 t/t7612-merge-verify-signatures.sh           |  24 ++--
 t/t7703-repack-geometric.sh                  |   4 +-
 t/t7800-difftool.sh                          |   4 +-
 t/t7810-grep.sh                              |   4 +-
 t/t7811-grep-open.sh                         |   2 +-
 t/t7814-grep-recurse-submodules.sh           |   2 +-
 t/t7816-grep-binary-pattern.sh               |   4 +-
 t/t7900-maintenance.sh                       |  24 ++--
 t/t8003-blame-corner-cases.sh                |   2 +-
 t/t8013-blame-ignore-revs.sh                 |   6 +-
 t/t9001-send-email.sh                        |   8 +-
 t/t9300-fast-import.sh                       |  26 ++--
 t/t9800-git-p4-basic.sh                      |  18 +--
 t/t9801-git-p4-branch.sh                     |   2 +-
 t/t9807-git-p4-submit.sh                     |  12 +-
 t/t9815-git-p4-submit-fail.sh                |  12 +-
 224 files changed, 1190 insertions(+), 1190 deletions(-)

diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh
index 2fb1b2ae56..5fe3c8ab69 100644
--- a/t/lib-httpd.sh
+++ b/t/lib-httpd.sh
@@ -255,7 +255,7 @@ test_http_push_nonff () {
 	'
 
 	test_expect_success 'non-fast-forward push shows help message' '
-		test_i18ngrep "Updates were rejected because" output
+		test_grep "Updates were rejected because" output
 	'
 
 	test_expect_${EXPECT_CAS_RESULT} 'force with lease aka cas' '
diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh
index 9acb0d5d19..36f767cb74 100644
--- a/t/lib-submodule-update.sh
+++ b/t/lib-submodule-update.sh
@@ -830,7 +830,7 @@ test_submodule_recursing_with_args_common () {
 			cd submodule_update &&
 			git branch -t invalid_sub1 origin/invalid_sub1 &&
 			test_must_fail $command invalid_sub1 2>err &&
-			test_i18ngrep sub1 err &&
+			test_grep sub1 err &&
 			test_superproject_content origin/add_sub1 &&
 			test_submodule_content sub1 origin/add_sub1
 		)
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 30a6edca1d..2b78e3be47 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -168,8 +168,8 @@ test_expect_success 'reinit' '
 		git -c init.defaultBranch=initial init >out1 2>err1 &&
 		git init >out2 2>err2
 	) &&
-	test_i18ngrep "Initialized empty" again/out1 &&
-	test_i18ngrep "Reinitialized existing" again/out2 &&
+	test_grep "Initialized empty" again/out1 &&
+	test_grep "Reinitialized existing" again/out2 &&
 	test_must_be_empty again/err1 &&
 	test_must_be_empty again/err2
 '
@@ -332,7 +332,7 @@ test_expect_success 'init with separate gitdir' '
 
 test_expect_success 'explicit bare & --separate-git-dir incompatible' '
 	test_must_fail git init --bare --separate-git-dir goop.git bare.git 2>err &&
-	test_i18ngrep "cannot be used together" err
+	test_grep "cannot be used together" err
 '
 
 test_expect_success 'implicit bare & --separate-git-dir incompatible' '
@@ -340,7 +340,7 @@ test_expect_success 'implicit bare & --separate-git-dir incompatible' '
 	mkdir -p bare.git &&
 	test_must_fail env GIT_DIR=. \
 		git -C bare.git init --separate-git-dir goop.git 2>err &&
-	test_i18ngrep "incompatible" err
+	test_grep "incompatible" err
 '
 
 test_expect_success 'bare & --separate-git-dir incompatible within worktree' '
@@ -349,7 +349,7 @@ test_expect_success 'bare & --separate-git-dir incompatible within worktree' '
 	git clone --bare . bare.git &&
 	git -C bare.git worktree add --detach ../linkwt &&
 	test_must_fail git -C linkwt init --separate-git-dir seprepo 2>err &&
-	test_i18ngrep "incompatible" err
+	test_grep "incompatible" err
 '
 
 test_lazy_prereq GETCWD_IGNORES_PERMS '
@@ -563,7 +563,7 @@ test_expect_success '--initial-branch' '
 
 	: re-initializing should not change the branch name &&
 	git init --initial-branch=ignore initial-branch-option 2>err &&
-	test_i18ngrep "ignored --initial-branch" err &&
+	test_grep "ignored --initial-branch" err &&
 	git -C initial-branch-option symbolic-ref HEAD >actual &&
 	grep hello actual
 '
@@ -579,7 +579,7 @@ test_expect_success 'advice on unconfigured init.defaultBranch' '
 	GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= git -c color.advice=always \
 		init unconfigured-default-branch-name 2>err &&
 	test_decode_color <err >decoded &&
-	test_i18ngrep "<YELLOW>hint: " decoded
+	test_grep "<YELLOW>hint: " decoded
 '
 
 test_expect_success 'overridden default main branch name (env)' '
@@ -592,7 +592,7 @@ test_expect_success 'overridden default main branch name (env)' '
 test_expect_success 'invalid default branch name' '
 	test_must_fail env GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME="with space" \
 		git init initial-branch-invalid 2>err &&
-	test_i18ngrep "invalid branch name" err
+	test_grep "invalid branch name" err
 '
 
 test_expect_success 'branch -m with the initial branch' '
diff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh
index e013d38f48..736516cc6a 100755
--- a/t/t0002-gitfile.sh
+++ b/t/t0002-gitfile.sh
@@ -22,13 +22,13 @@ test_expect_success 'initial setup' '
 test_expect_success 'bad setup: invalid .git file format' '
 	echo "gitdir $REAL" >.git &&
 	test_must_fail git rev-parse 2>.err &&
-	test_i18ngrep "invalid gitfile format" .err
+	test_grep "invalid gitfile format" .err
 '
 
 test_expect_success 'bad setup: invalid .git file path' '
 	echo "gitdir: $REAL.not" >.git &&
 	test_must_fail git rev-parse 2>.err &&
-	test_i18ngrep "not a git repository" .err
+	test_grep "not a git repository" .err
 '
 
 test_expect_success 'final setup + check rev-parse --git-dir' '
diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index 26e082f05b..42695e143d 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -259,7 +259,7 @@ test_expect_success 'root subdir attribute test' '
 test_expect_success 'negative patterns' '
 	echo "!f test=bar" >.gitattributes &&
 	git check-attr test -- '"'"'!f'"'"' 2>errors &&
-	test_i18ngrep "Negative patterns are ignored" errors
+	test_grep "Negative patterns are ignored" errors
 '
 
 test_expect_success 'patterns starting with exclamation' '
@@ -424,7 +424,7 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' '
 	mkdir subdir &&
 	ln -s ../attr subdir/.gitattributes &&
 	attr_check_basic subdir/file unspecified &&
-	test_i18ngrep "unable to access.*gitattributes" err
+	test_grep "unable to access.*gitattributes" err
 '
 
 test_expect_success 'large attributes line ignored in tree' '
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index c70d11bc91..361446b2f4 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -49,7 +49,7 @@ broken_c_unquote_verbose () {
 
 stderr_contains () {
 	regexp="$1"
-	if test_i18ngrep "$regexp" "$HOME/stderr"
+	if test_grep "$regexp" "$HOME/stderr"
 	then
 		return 0
 	else
@@ -942,7 +942,7 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' '
 	ln -s ignore subdir/.gitignore &&
 	test_must_fail git check-ignore subdir/file >actual 2>err &&
 	test_must_be_empty actual &&
-	test_i18ngrep "unable to access.*gitignore" err
+	test_grep "unable to access.*gitignore" err
 '
 
 test_done
diff --git a/t/t0012-help.sh b/t/t0012-help.sh
index dbfc5c8267..1d273d91c2 100755
--- a/t/t0012-help.sh
+++ b/t/t0012-help.sh
@@ -100,17 +100,17 @@ test_expect_success "--help does not work for guides" "
 
 test_expect_success 'git help' '
 	git help >help.output &&
-	test_i18ngrep "^   clone  " help.output &&
-	test_i18ngrep "^   add    " help.output &&
-	test_i18ngrep "^   log    " help.output &&
-	test_i18ngrep "^   commit " help.output &&
-	test_i18ngrep "^   fetch  " help.output
+	test_grep "^   clone  " help.output &&
+	test_grep "^   add    " help.output &&
+	test_grep "^   log    " help.output &&
+	test_grep "^   commit " help.output &&
+	test_grep "^   fetch  " help.output
 '
 
 test_expect_success 'git help -g' '
 	git help -g >help.output &&
-	test_i18ngrep "^   everyday   " help.output &&
-	test_i18ngrep "^   tutorial   " help.output
+	test_grep "^   everyday   " help.output &&
+	test_grep "^   tutorial   " help.output
 '
 
 test_expect_success 'git help fails for non-existing html pages' '
@@ -257,7 +257,7 @@ do
 			export GIT_CEILING_DIRECTORIES &&
 			test_expect_code 129 git -C sub $builtin -h >output 2>&1
 		) &&
-		test_i18ngrep usage output
+		test_grep usage output
 	'
 done <builtins
 
diff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh
index 5324047689..08814173cb 100755
--- a/t/t0013-sha1dc.sh
+++ b/t/t0013-sha1dc.sh
@@ -16,7 +16,7 @@ fi
 
 test_expect_success 'test-sha1 detects shattered pdf' '
 	test_must_fail test-tool sha1 <"$TEST_DATA/shattered-1.pdf" 2>err &&
-	test_i18ngrep collision err &&
+	test_grep collision err &&
 	grep 38762cf7f55934b34d179ae6a4c80cadccbb7f0a err
 '
 
diff --git a/t/t0014-alias.sh b/t/t0014-alias.sh
index 8d3d9144c0..95568342be 100755
--- a/t/t0014-alias.sh
+++ b/t/t0014-alias.sh
@@ -8,7 +8,7 @@ test_expect_success 'nested aliases - internal execution' '
 	git config alias.nested-internal-1 nested-internal-2 &&
 	git config alias.nested-internal-2 status &&
 	git nested-internal-1 >output &&
-	test_i18ngrep "^On branch " output
+	test_grep "^On branch " output
 '
 
 test_expect_success 'nested aliases - mixed execution' '
@@ -16,7 +16,7 @@ test_expect_success 'nested aliases - mixed execution' '
 	git config alias.nested-external-2 "!git nested-external-3" &&
 	git config alias.nested-external-3 status &&
 	git nested-external-1 >output &&
-	test_i18ngrep "^On branch " output
+	test_grep "^On branch " output
 '
 
 test_expect_success 'looping aliases - internal execution' '
@@ -24,7 +24,7 @@ test_expect_success 'looping aliases - internal execution' '
 	git config alias.loop-internal-2 loop-internal-3 &&
 	git config alias.loop-internal-3 loop-internal-2 &&
 	test_must_fail git loop-internal-1 2>output &&
-	test_i18ngrep "^fatal: alias loop detected: expansion of" output
+	test_grep "^fatal: alias loop detected: expansion of" output
 '
 
 # This test is disabled until external loops are fixed, because would block
@@ -34,7 +34,7 @@ test_expect_success 'looping aliases - internal execution' '
 #	git config alias.loop-mixed-1 loop-mixed-2 &&
 #	git config alias.loop-mixed-2 "!git loop-mixed-1" &&
 #	test_must_fail git loop-mixed-1 2>output &&
-#	test_i18ngrep "^fatal: alias loop detected: expansion of" output
+#	test_grep "^fatal: alias loop detected: expansion of" output
 #'
 
 test_expect_success 'run-command formats empty args properly' '
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index 46abbeed68..0b4997022b 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -263,7 +263,7 @@ test_expect_success 'required filter with absent clean field' '
 
 	echo test >test.ac &&
 	test_must_fail git add test.ac 2>stderr &&
-	test_i18ngrep "fatal: test.ac: clean filter .absentclean. failed" stderr
+	test_grep "fatal: test.ac: clean filter .absentclean. failed" stderr
 '
 
 test_expect_success 'required filter with absent smudge field' '
@@ -276,7 +276,7 @@ test_expect_success 'required filter with absent smudge field' '
 	git add test.as &&
 	rm -f test.as &&
 	test_must_fail git checkout -- test.as 2>stderr &&
-	test_i18ngrep "fatal: test.as: smudge filter absentsmudge failed" stderr
+	test_grep "fatal: test.as: smudge filter absentsmudge failed" stderr
 '
 
 test_expect_success 'filtering large input to small output should use little memory' '
@@ -733,7 +733,7 @@ test_expect_success 'process filter should restart after unexpected write failur
 		git checkout --quiet --no-progress . 2>git-stderr.log &&
 
 		grep "smudge write error" git-stderr.log &&
-		test_i18ngrep "error: external filter" git-stderr.log &&
+		test_grep "error: external filter" git-stderr.log &&
 
 		cat >expected.log <<-EOF &&
 			START
diff --git a/t/t0028-working-tree-encoding.sh b/t/t0028-working-tree-encoding.sh
index c196fdb0ee..1b55f59c23 100755
--- a/t/t0028-working-tree-encoding.sh
+++ b/t/t0028-working-tree-encoding.sh
@@ -92,23 +92,23 @@ do
 		# In these cases the BOM is prohibited.
 		cp bebom.utf${i}be.raw bebom.utf${i}be &&
 		test_must_fail git add bebom.utf${i}be 2>err.out &&
-		test_i18ngrep "fatal: BOM is prohibited .* utf-${i}be" err.out &&
-		test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out &&
+		test_grep "fatal: BOM is prohibited .* utf-${i}be" err.out &&
+		test_grep "use UTF-${i} as working-tree-encoding" err.out &&
 
 		cp lebom.utf${i}le.raw lebom.utf${i}be &&
 		test_must_fail git add lebom.utf${i}be 2>err.out &&
-		test_i18ngrep "fatal: BOM is prohibited .* utf-${i}be" err.out &&
-		test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out &&
+		test_grep "fatal: BOM is prohibited .* utf-${i}be" err.out &&
+		test_grep "use UTF-${i} as working-tree-encoding" err.out &&
 
 		cp bebom.utf${i}be.raw bebom.utf${i}le &&
 		test_must_fail git add bebom.utf${i}le 2>err.out &&
-		test_i18ngrep "fatal: BOM is prohibited .* utf-${i}LE" err.out &&
-		test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out &&
+		test_grep "fatal: BOM is prohibited .* utf-${i}LE" err.out &&
+		test_grep "use UTF-${i} as working-tree-encoding" err.out &&
 
 		cp lebom.utf${i}le.raw lebom.utf${i}le &&
 		test_must_fail git add lebom.utf${i}le 2>err.out &&
-		test_i18ngrep "fatal: BOM is prohibited .* utf-${i}LE" err.out &&
-		test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out
+		test_grep "fatal: BOM is prohibited .* utf-${i}LE" err.out &&
+		test_grep "use UTF-${i} as working-tree-encoding" err.out
 	'
 
 	test_expect_success "check required UTF-${i} BOM" '
@@ -118,13 +118,13 @@ do
 
 		cp nobom.utf${i}be.raw nobom.utf${i} &&
 		test_must_fail git add nobom.utf${i} 2>err.out &&
-		test_i18ngrep "fatal: BOM is required .* utf-${i}" err.out &&
-		test_i18ngrep "use UTF-${i}BE or UTF-${i}LE" err.out &&
+		test_grep "fatal: BOM is required .* utf-${i}" err.out &&
+		test_grep "use UTF-${i}BE or UTF-${i}LE" err.out &&
 
 		cp nobom.utf${i}le.raw nobom.utf${i} &&
 		test_must_fail git add nobom.utf${i} 2>err.out &&
-		test_i18ngrep "fatal: BOM is required .* utf-${i}" err.out &&
-		test_i18ngrep "use UTF-${i}BE or UTF-${i}LE" err.out
+		test_grep "fatal: BOM is required .* utf-${i}" err.out &&
+		test_grep "use UTF-${i}BE or UTF-${i}LE" err.out
 	'
 
 	test_expect_success "eol conversion for UTF-${i} encoded files on checkout" '
@@ -169,7 +169,7 @@ test_expect_success 'check unsupported encodings' '
 	echo "*.set text working-tree-encoding" >.gitattributes &&
 	printf "set" >t.set &&
 	test_must_fail git add t.set 2>err.out &&
-	test_i18ngrep "true/false are no valid working-tree-encodings" err.out &&
+	test_grep "true/false are no valid working-tree-encodings" err.out &&
 
 	echo "*.unset text -working-tree-encoding" >.gitattributes &&
 	printf "unset" >t.unset &&
@@ -182,7 +182,7 @@ test_expect_success 'check unsupported encodings' '
 	echo "*.garbage text working-tree-encoding=garbage" >.gitattributes &&
 	printf "garbage" >t.garbage &&
 	test_must_fail git add t.garbage 2>err.out &&
-	test_i18ngrep "failed to encode" err.out
+	test_grep "failed to encode" err.out
 '
 
 test_expect_success 'error if encoding round trip is not the same during refresh' '
@@ -201,7 +201,7 @@ test_expect_success 'error if encoding round trip is not the same during refresh
 	git update-ref refs/heads/main $COMMIT &&
 
 	test_must_fail git checkout HEAD^ 2>err.out &&
-	test_i18ngrep "error: .* overwritten by checkout:" err.out
+	test_grep "error: .* overwritten by checkout:" err.out
 '
 
 test_expect_success 'error if encoding garbage is already in Git' '
@@ -217,7 +217,7 @@ test_expect_success 'error if encoding garbage is already in Git' '
 	git update-ref refs/heads/main $COMMIT &&
 
 	git diff 2>err.out &&
-	test_i18ngrep "error: BOM is required" err.out
+	test_grep "error: BOM is required" err.out
 '
 
 test_lazy_prereq ICONV_SHIFT_JIS '
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index e19a199636..c8cc0fd8d0 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -366,13 +366,13 @@ test_expect_success 'OPT_CMDMODE() works' '
 test_expect_success 'OPT_CMDMODE() detects incompatibility' '
 	test_must_fail test-tool parse-options --mode1 --mode2 >output 2>output.err &&
 	test_must_be_empty output &&
-	test_i18ngrep "incompatible with --mode" output.err
+	test_grep "incompatible with --mode" output.err
 '
 
 test_expect_success 'OPT_CMDMODE() detects incompatibility with something else' '
 	test_must_fail test-tool parse-options --set23 --mode2 >output 2>output.err &&
 	test_must_be_empty output &&
-	test_i18ngrep "incompatible with something else" output.err
+	test_grep "incompatible with something else" output.err
 '
 
 test_expect_success 'OPT_COUNTUP() with PARSE_OPT_NODASH works' '
diff --git a/t/t0041-usage.sh b/t/t0041-usage.sh
index 9ea974b0c6..1464294bd1 100755
--- a/t/t0041-usage.sh
+++ b/t/t0041-usage.sh
@@ -21,8 +21,8 @@ test_expect_success 'tag --contains <existent_tag>' '
 test_expect_success 'tag --contains <inexistent_tag>' '
 	test_must_fail git tag --contains "notag" >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "error" actual.err &&
-	test_i18ngrep ! "usage" actual.err
+	test_grep "error" actual.err &&
+	test_grep ! "usage" actual.err
 '
 
 test_expect_success 'tag --no-contains <existent_tag>' '
@@ -34,27 +34,27 @@ test_expect_success 'tag --no-contains <existent_tag>' '
 test_expect_success 'tag --no-contains <inexistent_tag>' '
 	test_must_fail git tag --no-contains "notag" >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "error" actual.err &&
-	test_i18ngrep ! "usage" actual.err
+	test_grep "error" actual.err &&
+	test_grep ! "usage" actual.err
 '
 
 test_expect_success 'tag usage error' '
 	test_must_fail git tag --noopt >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "usage" actual.err
+	test_grep "usage" actual.err
 '
 
 test_expect_success 'branch --contains <existent_commit>' '
 	git branch --contains "main" >actual 2>actual.err &&
-	test_i18ngrep "main" actual &&
+	test_grep "main" actual &&
 	test_line_count = 0 actual.err
 '
 
 test_expect_success 'branch --contains <inexistent_commit>' '
 	test_must_fail git branch --no-contains "nocommit" >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "error" actual.err &&
-	test_i18ngrep ! "usage" actual.err
+	test_grep "error" actual.err &&
+	test_grep ! "usage" actual.err
 '
 
 test_expect_success 'branch --no-contains <existent_commit>' '
@@ -66,14 +66,14 @@ test_expect_success 'branch --no-contains <existent_commit>' '
 test_expect_success 'branch --no-contains <inexistent_commit>' '
 	test_must_fail git branch --no-contains "nocommit" >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "error" actual.err &&
-	test_i18ngrep ! "usage" actual.err
+	test_grep "error" actual.err &&
+	test_grep ! "usage" actual.err
 '
 
 test_expect_success 'branch usage error' '
 	test_must_fail git branch --noopt >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "usage" actual.err
+	test_grep "usage" actual.err
 '
 
 test_expect_success 'for-each-ref --contains <existent_object>' '
@@ -85,8 +85,8 @@ test_expect_success 'for-each-ref --contains <existent_object>' '
 test_expect_success 'for-each-ref --contains <inexistent_object>' '
 	test_must_fail git for-each-ref --no-contains "noobject" >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "error" actual.err &&
-	test_i18ngrep ! "usage" actual.err
+	test_grep "error" actual.err &&
+	test_grep ! "usage" actual.err
 '
 
 test_expect_success 'for-each-ref --no-contains <existent_object>' '
@@ -98,14 +98,14 @@ test_expect_success 'for-each-ref --no-contains <existent_object>' '
 test_expect_success 'for-each-ref --no-contains <inexistent_object>' '
 	test_must_fail git for-each-ref --no-contains "noobject" >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "error" actual.err &&
-	test_i18ngrep ! "usage" actual.err
+	test_grep "error" actual.err &&
+	test_grep ! "usage" actual.err
 '
 
 test_expect_success 'for-each-ref usage error' '
 	test_must_fail git for-each-ref --noopt >actual 2>actual.err &&
 	test_line_count = 0 actual &&
-	test_i18ngrep "usage" actual.err
+	test_grep "usage" actual.err
 '
 
 test_done
diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh
index e2411f6a9b..20986b693c 100755
--- a/t/t0061-run-command.sh
+++ b/t/t0061-run-command.sh
@@ -19,12 +19,12 @@ test_expect_success MINGW 'subprocess inherits only std handles' '
 
 test_expect_success 'start_command reports ENOENT (slash)' '
 	test-tool run-command start-command-ENOENT ./does-not-exist 2>err &&
-	test_i18ngrep "\./does-not-exist" err
+	test_grep "\./does-not-exist" err
 '
 
 test_expect_success 'start_command reports ENOENT (no slash)' '
 	test-tool run-command start-command-ENOENT does-not-exist 2>err &&
-	test_i18ngrep "does-not-exist" err
+	test_grep "does-not-exist" err
 '
 
 test_expect_success 'run_command can run a command' '
@@ -49,7 +49,7 @@ test_expect_success !RUNS_COMMANDS_FROM_PWD 'run_command is restricted to PATH'
 	echo yikes
 	EOF
 	test_must_fail test-tool run-command run-command should-not-run 2>err &&
-	test_i18ngrep "should-not-run" err
+	test_grep "should-not-run" err
 '
 
 test_expect_success !MINGW 'run_command can run a script without a #! line' '
diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh
index 574de34198..487bc8d905 100755
--- a/t/t0070-fundamental.sh
+++ b/t/t0070-fundamental.sh
@@ -44,13 +44,13 @@ test_expect_success 'incomplete sideband messages are reassembled' '
 test_expect_success 'eof on sideband message is reported' '
 	printf 1234 >input &&
 	test-tool pkt-line receive-sideband <input 2>err &&
-	test_i18ngrep "unexpected disconnect" err
+	test_grep "unexpected disconnect" err
 '
 
 test_expect_success 'missing sideband designator is reported' '
 	printf 0004 >input &&
 	test-tool pkt-line receive-sideband <input 2>err &&
-	test_i18ngrep "missing sideband" err
+	test_grep "missing sideband" err
 '
 
 test_done
diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh
index f6998269be..150cc1dea2 100755
--- a/t/t0091-bugreport.sh
+++ b/t/t0091-bugreport.sh
@@ -65,7 +65,7 @@ test_expect_success '--output-directory puts the report in the provided dir' '
 
 test_expect_success 'incorrect arguments abort with usage' '
 	test_must_fail git bugreport --false 2>output &&
-	test_i18ngrep usage output &&
+	test_grep usage output &&
 	test_path_is_missing git-bugreport-*
 '
 
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index a4f5bba507..400f6bdbca 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -827,7 +827,7 @@ test_expect_success 'credential config with partial URLs' '
 	git -c credential.$partial.helper=yep \
 		-c credential.with%0anewline.username=uh-oh \
 		credential fill <stdin 2>stderr &&
-	test_i18ngrep "skipping credential lookup for key" stderr
+	test_grep "skipping credential lookup for key" stderr
 '
 
 test_done
diff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh
index 35261afc9d..5e0f0a334f 100755
--- a/t/t1060-object-corruption.sh
+++ b/t/t1060-object-corruption.sh
@@ -125,7 +125,7 @@ test_expect_success 'fetch into corrupted repo with index-pack' '
 		cd bit-error-cp &&
 		test_must_fail git -c transfer.unpackLimit=1 \
 			fetch ../no-bit-error 2>stderr &&
-		test_i18ngrep ! -i collision stderr
+		test_grep ! -i collision stderr
 	)
 '
 
diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
index 9ceb17f911..f67611da28 100755
--- a/t/t1091-sparse-checkout-builtin.sh
+++ b/t/t1091-sparse-checkout-builtin.sh
@@ -47,7 +47,7 @@ test_expect_success 'setup' '
 test_expect_success 'git sparse-checkout list (not sparse)' '
 	test_must_fail git -C repo sparse-checkout list >list 2>err &&
 	test_must_be_empty list &&
-	test_i18ngrep "this worktree is not sparse" err
+	test_grep "this worktree is not sparse" err
 '
 
 test_expect_success 'git sparse-checkout list (not sparse)' '
@@ -55,7 +55,7 @@ test_expect_success 'git sparse-checkout list (not sparse)' '
 	rm repo/.git/info/sparse-checkout &&
 	git -C repo sparse-checkout list >list 2>err &&
 	test_must_be_empty list &&
-	test_i18ngrep "this worktree is not sparse (sparse-checkout file may not exist)" err
+	test_grep "this worktree is not sparse (sparse-checkout file may not exist)" err
 '
 
 test_expect_success 'git sparse-checkout list (populated)' '
@@ -230,7 +230,7 @@ test_expect_success 'cone mode: match patterns' '
 	git -C repo config --worktree core.sparseCheckoutCone true &&
 	rm -rf repo/a repo/folder1 repo/folder2 &&
 	git -C repo read-tree -mu HEAD 2>err &&
-	test_i18ngrep ! "disabling cone patterns" err &&
+	test_grep ! "disabling cone patterns" err &&
 	git -C repo reset --hard &&
 	check_files repo a folder1 folder2
 '
@@ -240,7 +240,7 @@ test_expect_success 'cone mode: warn on bad pattern' '
 	cp repo/.git/info/sparse-checkout . &&
 	echo "!/deep/deeper/*/" >>repo/.git/info/sparse-checkout &&
 	git -C repo read-tree -mu HEAD 2>err &&
-	test_i18ngrep "unrecognized negative pattern" err
+	test_grep "unrecognized negative pattern" err
 '
 
 test_expect_success 'sparse-checkout disable' '
@@ -283,7 +283,7 @@ test_expect_success 'sparse-index enabled and disabled' '
 test_expect_success 'cone mode: init and set' '
 	git -C repo sparse-checkout init --cone &&
 	git -C repo config --list >config &&
-	test_i18ngrep "core.sparsecheckoutcone=true" config &&
+	test_grep "core.sparsecheckoutcone=true" config &&
 	list_files repo >dir  &&
 	echo a >expect &&
 	test_cmp expect dir &&
@@ -386,7 +386,7 @@ test_expect_success 'not-up-to-date does not block rest of sparsification' '
 
 	git -C repo sparse-checkout set deep/deeper1 2>err &&
 
-	test_i18ngrep "The following paths are not up to date" err &&
+	test_grep "The following paths are not up to date" err &&
 	test_cmp expect repo/.git/info/sparse-checkout &&
 	check_files repo/deep a deeper1 deeper2 &&
 	check_files repo/deep/deeper1 a deepest &&
@@ -401,8 +401,8 @@ test_expect_success 'revert to old sparse-checkout on empty update' '
 		git add file &&
 		git commit -m "test" &&
 		git sparse-checkout set nothing 2>err &&
-		test_i18ngrep ! "Sparse checkout leaves no entry on working directory" err &&
-		test_i18ngrep ! ".git/index.lock" err &&
+		test_grep ! "Sparse checkout leaves no entry on working directory" err &&
+		test_grep ! ".git/index.lock" err &&
 		git sparse-checkout set --no-cone file
 	)
 '
@@ -411,14 +411,14 @@ test_expect_success 'fail when lock is taken' '
 	test_when_finished rm -rf repo/.git/info/sparse-checkout.lock &&
 	touch repo/.git/info/sparse-checkout.lock &&
 	test_must_fail git -C repo sparse-checkout set deep 2>err &&
-	test_i18ngrep "Unable to create .*\.lock" err
+	test_grep "Unable to create .*\.lock" err
 '
 
 test_expect_success '.gitignore should not warn about cone mode' '
 	git -C repo config --worktree core.sparseCheckoutCone true &&
 	echo "**/bin/*" >repo/.gitignore &&
 	git -C repo reset --hard 2>err &&
-	test_i18ngrep ! "disabling cone patterns" err
+	test_grep ! "disabling cone patterns" err
 '
 
 test_expect_success 'sparse-checkout (init|set|disable) warns with dirty status' '
@@ -426,10 +426,10 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with dirty status'
 	echo dirty >dirty/folder1/a &&
 
 	git -C dirty sparse-checkout init --no-cone 2>err &&
-	test_i18ngrep "warning.*The following paths are not up to date" err &&
+	test_grep "warning.*The following paths are not up to date" err &&
 
 	git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* 2>err &&
-	test_i18ngrep "warning.*The following paths are not up to date" err &&
+	test_grep "warning.*The following paths are not up to date" err &&
 	test_path_is_file dirty/folder1/a &&
 
 	git -C dirty sparse-checkout disable 2>err &&
@@ -453,14 +453,14 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with unmerged stat
 	git -C unmerged update-index --index-info <input &&
 
 	git -C unmerged sparse-checkout init --no-cone 2>err &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 
 	git -C unmerged sparse-checkout set /folder2/* /deep/deeper1/* 2>err &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 	test_path_is_file dirty/folder1/a &&
 
 	git -C unmerged sparse-checkout disable 2>err &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 
 	git -C unmerged reset --hard &&
 	git -C unmerged sparse-checkout init --no-cone &&
@@ -480,24 +480,24 @@ test_expect_failure 'sparse-checkout reapply' '
 	git -C tweak update-index --index-info <input &&
 
 	git -C tweak sparse-checkout init --cone 2>err &&
-	test_i18ngrep "warning.*The following paths are not up to date" err &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are not up to date" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 
 	git -C tweak sparse-checkout set folder2 deep/deeper1 2>err &&
-	test_i18ngrep "warning.*The following paths are not up to date" err &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are not up to date" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 
 	git -C tweak sparse-checkout reapply 2>err &&
-	test_i18ngrep "warning.*The following paths are not up to date" err &&
+	test_grep "warning.*The following paths are not up to date" err &&
 	test_path_is_file tweak/deep/deeper2/a &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 	test_path_is_file tweak/folder1/a &&
 
 	git -C tweak checkout HEAD deep/deeper2/a &&
 	git -C tweak sparse-checkout reapply 2>err &&
-	test_i18ngrep ! "warning.*The following paths are not up to date" err &&
+	test_grep ! "warning.*The following paths are not up to date" err &&
 	test_path_is_missing tweak/deep/deeper2/a &&
-	test_i18ngrep "warning.*The following paths are unmerged" err &&
+	test_grep "warning.*The following paths are unmerged" err &&
 	test_path_is_file tweak/folder1/a &&
 
 	# NEEDSWORK: We are asking to update a file outside of the
@@ -578,8 +578,8 @@ test_expect_success 'check-rules interaction with submodules' '
 	git -C super ls-tree --name-only -r HEAD >all-files &&
 	git -C super sparse-checkout check-rules >check-rules-matches <all-files &&
 
-	test_i18ngrep ! "modules/" check-rules-matches &&
-	test_i18ngrep "folder1/" check-rules-matches
+	test_grep ! "modules/" check-rules-matches &&
+	test_grep "folder1/" check-rules-matches
 '
 
 test_expect_success 'different sparse-checkouts with worktrees' '
@@ -616,7 +616,7 @@ check_read_tree_errors () {
 	then
 		test_must_be_empty err
 	else
-		test_i18ngrep "$ERRORS" err
+		test_grep "$ERRORS" err
 	fi &&
 	check_files $REPO $FILES
 }
@@ -898,32 +898,32 @@ test_expect_success 'setup bare repo' '
 '
 test_expect_success 'list fails outside work tree' '
 	test_must_fail git -C bare sparse-checkout list 2>err &&
-	test_i18ngrep "this operation must be run in a work tree" err
+	test_grep "this operation must be run in a work tree" err
 '
 
 test_expect_success 'add fails outside work tree' '
 	test_must_fail git -C bare sparse-checkout add deeper 2>err &&
-	test_i18ngrep "this operation must be run in a work tree" err
+	test_grep "this operation must be run in a work tree" err
 '
 
 test_expect_success 'set fails outside work tree' '
 	test_must_fail git -C bare sparse-checkout set deeper 2>err &&
-	test_i18ngrep "this operation must be run in a work tree" err
+	test_grep "this operation must be run in a work tree" err
 '
 
 test_expect_success 'init fails outside work tree' '
 	test_must_fail git -C bare sparse-checkout init 2>err &&
-	test_i18ngrep "this operation must be run in a work tree" err
+	test_grep "this operation must be run in a work tree" err
 '
 
 test_expect_success 'reapply fails outside work tree' '
 	test_must_fail git -C bare sparse-checkout reapply 2>err &&
-	test_i18ngrep "this operation must be run in a work tree" err
+	test_grep "this operation must be run in a work tree" err
 '
 
 test_expect_success 'disable fails outside work tree' '
 	test_must_fail git -C bare sparse-checkout disable 2>err &&
-	test_i18ngrep "this operation must be run in a work tree" err
+	test_grep "this operation must be run in a work tree" err
 '
 
 test_expect_success 'setup clean' '
@@ -946,8 +946,8 @@ test_expect_success 'check-rules cone mode' '
 
 	git -C repo sparse-checkout check-rules >check-rules-default <all-files &&
 
-	test_i18ngrep "deep/deeper1/deepest/a" check-rules-file &&
-	test_i18ngrep ! "deep/deeper2" check-rules-file &&
+	test_grep "deep/deeper1/deepest/a" check-rules-file &&
+	test_grep ! "deep/deeper2" check-rules-file &&
 
 	test_cmp check-rules-file ls-files &&
 	test_cmp check-rules-file check-rules-default
diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index 8a95adf4b5..12e971b1d1 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh
@@ -337,8 +337,8 @@ test_expect_success 'status reports sparse-checkout' '
 	init_repos &&
 	git -C sparse-checkout status >full &&
 	git -C sparse-index status >sparse &&
-	test_i18ngrep "You are in a sparse checkout with " full &&
-	test_i18ngrep "You are in a sparse checkout." sparse
+	test_grep "You are in a sparse checkout with " full &&
+	test_grep "You are in a sparse checkout." sparse
 '
 
 test_expect_success 'add, commit, checkout' '
@@ -1182,7 +1182,7 @@ test_expect_success 'checkout-index outside sparse definition' '
 	# Without --ignore-skip-worktree-bits, outside-of-cone files will trigger
 	# an error
 	test_sparse_match test_must_fail git checkout-index -- folder1/a &&
-	test_i18ngrep "folder1/a has skip-worktree enabled" sparse-checkout-err &&
+	test_grep "folder1/a has skip-worktree enabled" sparse-checkout-err &&
 	test_path_is_missing folder1/a &&
 
 	# With --ignore-skip-worktree-bits, outside-of-cone files are checked out
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index 387d336c91..f4e2752134 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -453,7 +453,7 @@ test_expect_success 'get bool variable with empty value' '
 
 test_expect_success 'no arguments, but no crash' '
 	test_must_fail git config >output 2>&1 &&
-	test_i18ngrep usage output
+	test_grep usage output
 '
 
 cat > .git/config << EOF
@@ -720,25 +720,25 @@ test_expect_success 'invalid unit' '
 	git config aninvalid.unit "1auto" &&
 	test_cmp_config 1auto aninvalid.unit &&
 	test_must_fail git config --int --get aninvalid.unit 2>actual &&
-	test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
+	test_grep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
 '
 
 test_expect_success 'invalid unit boolean' '
 	git config commit.gpgsign "1true" &&
 	test_cmp_config 1true commit.gpgsign &&
 	test_must_fail git config --bool --get commit.gpgsign 2>actual &&
-	test_i18ngrep "bad boolean config value .1true. for .commit.gpgsign." actual
+	test_grep "bad boolean config value .1true. for .commit.gpgsign." actual
 '
 
 test_expect_success 'line number is reported correctly' '
 	printf "[bool]\n\tvar\n" >invalid &&
 	test_must_fail git config -f invalid --path bool.var 2>actual &&
-	test_i18ngrep "line 2" actual
+	test_grep "line 2" actual
 '
 
 test_expect_success 'invalid stdin config' '
 	echo "[broken" | test_must_fail git config --list --file - >output 2>&1 &&
-	test_i18ngrep "bad config line 1 in standard input" output
+	test_grep "bad config line 1 in standard input" output
 '
 
 cat > expect << EOF
@@ -919,7 +919,7 @@ test_expect_success !MINGW 'get --path copes with unset $HOME' '
 		git config --get --path path.normal >>result &&
 		git config --get --path path.trailingtilde >>result
 	) &&
-	test_i18ngrep "[Ff]ailed to expand.*~/" msg &&
+	test_grep "[Ff]ailed to expand.*~/" msg &&
 	test_cmp expect result
 '
 
@@ -986,7 +986,7 @@ test_expect_success 'get --type=color barfs on non-color' '
 
 test_expect_success 'set --type=color barfs on non-color' '
 	test_must_fail git config --type=color foo.color "not-a-color" 2>error &&
-	test_i18ngrep "cannot parse color" error
+	test_grep "cannot parse color" error
 '
 
 cat > expect << EOF
@@ -1447,12 +1447,12 @@ test_expect_success 'git --config-env with missing value' '
 
 test_expect_success 'git --config-env fails with invalid parameters' '
 	test_must_fail git --config-env=foo.flag config --bool foo.flag 2>error &&
-	test_i18ngrep "invalid config format: foo.flag" error &&
+	test_grep "invalid config format: foo.flag" error &&
 	test_must_fail git --config-env=foo.flag= config --bool foo.flag 2>error &&
-	test_i18ngrep "missing environment variable name for configuration ${SQ}foo.flag${SQ}" error &&
+	test_grep "missing environment variable name for configuration ${SQ}foo.flag${SQ}" error &&
 	sane_unset NONEXISTENT &&
 	test_must_fail git --config-env=foo.flag=NONEXISTENT config --bool foo.flag 2>error &&
-	test_i18ngrep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error
+	test_grep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error
 '
 
 test_expect_success 'git -c and --config-env work together' '
@@ -1533,21 +1533,21 @@ test_expect_success 'git config ignores pairs with empty count' '
 
 test_expect_success 'git config fails with invalid count' '
 	test_must_fail env GIT_CONFIG_COUNT=10a git config --list 2>error &&
-	test_i18ngrep "bogus count" error &&
+	test_grep "bogus count" error &&
 	test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config --list 2>error &&
-	test_i18ngrep "too many entries" error
+	test_grep "too many entries" error
 '
 
 test_expect_success 'git config fails with missing config key' '
 	test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_VALUE_0="value" \
 		git config --list 2>error &&
-	test_i18ngrep "missing config key" error
+	test_grep "missing config key" error
 '
 
 test_expect_success 'git config fails with missing config value' '
 	test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0="pair.one" \
 		git config --list 2>error &&
-	test_i18ngrep "missing config value" error
+	test_grep "missing config value" error
 '
 
 test_expect_success 'git config fails with invalid config pair key' '
@@ -1617,7 +1617,7 @@ test_expect_success 'barf on syntax error' '
 	key garbage
 	EOF
 	test_must_fail git config --get section.key 2>error &&
-	test_i18ngrep " line 3 " error
+	test_grep " line 3 " error
 '
 
 test_expect_success 'barf on incomplete section header' '
@@ -1627,7 +1627,7 @@ test_expect_success 'barf on incomplete section header' '
 	key = value
 	EOF
 	test_must_fail git config --get section.key 2>error &&
-	test_i18ngrep " line 2 " error
+	test_grep " line 2 " error
 '
 
 test_expect_success 'barf on incomplete string' '
@@ -1637,7 +1637,7 @@ test_expect_success 'barf on incomplete string' '
 	key = "value string
 	EOF
 	test_must_fail git config --get section.key 2>error &&
-	test_i18ngrep " line 3 " error
+	test_grep " line 3 " error
 '
 
 test_expect_success 'urlmatch' '
@@ -2266,17 +2266,17 @@ test_expect_success 'identical mixed --type specifiers are allowed' '
 
 test_expect_success 'non-identical modern --type specifiers are not allowed' '
 	test_must_fail git config --type=int --type=bool section.big 2>error &&
-	test_i18ngrep "only one type at a time" error
+	test_grep "only one type at a time" error
 '
 
 test_expect_success 'non-identical legacy --type specifiers are not allowed' '
 	test_must_fail git config --int --bool section.big 2>error &&
-	test_i18ngrep "only one type at a time" error
+	test_grep "only one type at a time" error
 '
 
 test_expect_success 'non-identical mixed --type specifiers are not allowed' '
 	test_must_fail git config --type=int --bool section.big 2>error &&
-	test_i18ngrep "only one type at a time" error
+	test_grep "only one type at a time" error
 '
 
 test_expect_success '--type allows valid type specifiers' '
@@ -2293,7 +2293,7 @@ test_expect_success 'unset type specifiers may be reset to conflicting ones' '
 
 test_expect_success '--type rejects unknown specifiers' '
 	test_must_fail git config --type=nonsense section.foo 2>error &&
-	test_i18ngrep "unrecognized --type argument" error
+	test_grep "unrecognized --type argument" error
 '
 
 test_expect_success '--type=int requires at least one digit' '
@@ -2339,7 +2339,7 @@ test_expect_success 'set all config with value-pattern' '
 
 	# multiple matches => failure
 	test_must_fail git config --file=config abc.key three o+ 2>err &&
-	test_i18ngrep "has multiple values" err &&
+	test_grep "has multiple values" err &&
 
 	# multiple values, no match => add
 	git config --file=config abc.key three a+ &&
diff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh
index 0a7099d6f5..b9852fe40e 100755
--- a/t/t1307-config-blob.sh
+++ b/t/t1307-config-blob.sh
@@ -63,7 +63,7 @@ test_expect_success 'parse errors in blobs are properly attributed' '
 	git commit -m broken &&
 
 	test_must_fail git config --blob=HEAD:config some.value 2>err &&
-	test_i18ngrep "HEAD:config" err
+	test_grep "HEAD:config" err
 '
 
 test_expect_success 'can parse blob ending with CR' '
diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
index 777648722c..3bfec07f1a 100755
--- a/t/t1308-config-set.sh
+++ b/t/t1308-config-set.sh
@@ -172,7 +172,7 @@ test_expect_success 'find string value for a key' '
 
 test_expect_success 'check line error when NULL string is queried' '
 	test_expect_code 128 test-tool config get_string case.foo 2>result &&
-	test_i18ngrep "fatal: .*case\.foo.*\.git/config.*line 7" result
+	test_grep "fatal: .*case\.foo.*\.git/config.*line 7" result
 '
 
 test_expect_success 'find integer if value is non parse-able' '
@@ -342,14 +342,14 @@ test_expect_success 'check line errors for malformed values' '
 		br
 	EOF
 	test_expect_code 128 git br 2>result &&
-	test_i18ngrep "missing value for .alias\.br" result &&
-	test_i18ngrep "fatal: .*\.git/config" result &&
-	test_i18ngrep "fatal: .*line 2" result
+	test_grep "missing value for .alias\.br" result &&
+	test_grep "fatal: .*\.git/config" result &&
+	test_grep "fatal: .*line 2" result
 '
 
 test_expect_success 'error on modifying repo config without repo' '
 	nongit test_must_fail git config a.b c 2>err &&
-	test_i18ngrep "not in a git directory" err
+	test_grep "not in a git directory" err
 '
 
 cmdline_config="'foo.bar=from-cmdline'"
diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh
index 537435b90a..523aa99a1e 100755
--- a/t/t1309-early-config.sh
+++ b/t/t1309-early-config.sh
@@ -78,7 +78,7 @@ test_with_config () {
 
 test_expect_success 'ignore .git/ with incompatible repository version' '
 	test_with_config "[core]repositoryformatversion = 999999" 2>err &&
-	test_i18ngrep "warning:.* Expected git repo version <= [1-9]" err
+	test_grep "warning:.* Expected git repo version <= [1-9]" err
 '
 
 test_expect_failure 'ignore .git/ with invalid repository version' '
diff --git a/t/t1310-config-default.sh b/t/t1310-config-default.sh
index 09b10c144b..1a90d31201 100755
--- a/t/t1310-config-default.sh
+++ b/t/t1310-config-default.sh
@@ -26,12 +26,12 @@ test_expect_success 'canonicalizes --default with appropriate type' '
 test_expect_success 'dies when --default cannot be parsed' '
 	test_must_fail git config -f config --type=expiry-date --default=x --get \
 		not.a.section 2>error &&
-	test_i18ngrep "failed to format default config value" error
+	test_grep "failed to format default config value" error
 '
 
 test_expect_success 'does not allow --default without --get' '
 	test_must_fail git config --default=quux --unset a.section >output 2>&1 &&
-	test_i18ngrep "\-\-default is only applicable to" output
+	test_grep "\-\-default is only applicable to" output
 '
 
 test_done
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index 4d66cd7f4a..9ac4b7036b 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -410,7 +410,7 @@ test_expect_success 'Query "main@{2005-05-26 23:33:01}" (middle of history with
 	git rev-parse --verify "main@{2005-05-26 23:33:01}" >o 2>e &&
 	echo "$B" >expect &&
 	test_cmp expect o &&
-	test_i18ngrep -F "warning: log for ref $m has gap after $gd" e
+	test_grep -F "warning: log for ref $m has gap after $gd" e
 '
 test_expect_success 'Query "main@{2005-05-26 23:38:00}" (middle of history)' '
 	test_when_finished "rm -f o e" &&
@@ -431,7 +431,7 @@ test_expect_success 'Query "main@{2005-05-28}" (past end of history)' '
 	git rev-parse --verify "main@{2005-05-28}" >o 2>e &&
 	echo "$D" >expect &&
 	test_cmp expect o &&
-	test_i18ngrep -F "warning: log for ref $m unexpectedly ended on $ld" e
+	test_grep -F "warning: log for ref $m unexpectedly ended on $ld" e
 '
 
 rm -f .git/$m .git/logs/$m expect
@@ -486,7 +486,7 @@ test_expect_success 'git cat-file blob main@{2005-05-26 23:42}:F (expect OTHER)'
 test_expect_success 'given old value for missing pseudoref, do not create' '
 	test_must_fail git update-ref PSEUDOREF $A $B 2>err &&
 	test_must_fail git rev-parse PSEUDOREF &&
-	test_i18ngrep "unable to resolve reference" err
+	test_grep "unable to resolve reference" err
 '
 
 test_expect_success 'create pseudoref' '
@@ -507,7 +507,7 @@ test_expect_success 'overwrite pseudoref with correct old value' '
 test_expect_success 'do not overwrite pseudoref with wrong old value' '
 	test_must_fail git update-ref PSEUDOREF $D $E 2>err &&
 	test $C = $(git rev-parse PSEUDOREF) &&
-	test_i18ngrep "cannot lock ref.*expected" err
+	test_grep "cannot lock ref.*expected" err
 '
 
 test_expect_success 'delete pseudoref' '
@@ -519,7 +519,7 @@ test_expect_success 'do not delete pseudoref with wrong old value' '
 	git update-ref PSEUDOREF $A &&
 	test_must_fail git update-ref -d PSEUDOREF $B 2>err &&
 	test $A = $(git rev-parse PSEUDOREF) &&
-	test_i18ngrep "cannot lock ref.*expected" err
+	test_grep "cannot lock ref.*expected" err
 '
 
 test_expect_success 'delete pseudoref with correct old value' '
@@ -536,7 +536,7 @@ test_expect_success 'do not overwrite pseudoref with old OID zero' '
 	test_when_finished git update-ref -d PSEUDOREF &&
 	test_must_fail git update-ref PSEUDOREF $B $Z 2>err &&
 	test $A = $(git rev-parse PSEUDOREF) &&
-	test_i18ngrep "already exists" err
+	test_grep "already exists" err
 '
 
 # Test --stdin
@@ -556,7 +556,7 @@ test_expect_success 'stdin test setup' '
 
 test_expect_success '-z fails without --stdin' '
 	test_must_fail git update-ref -z $m $m $m 2>err &&
-	test_i18ngrep "usage: git update-ref" err
+	test_grep "usage: git update-ref" err
 '
 
 test_expect_success 'stdin works with no input' '
@@ -674,7 +674,7 @@ test_expect_success 'stdin fails with duplicate refs' '
 	create $a $m
 	EOF
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	test_i18ngrep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err
+	test_grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err
 '
 
 test_expect_success 'stdin create ref works' '
@@ -1107,7 +1107,7 @@ test_expect_success 'stdin -z fails option with unknown name' '
 test_expect_success 'stdin -z fails with duplicate refs' '
 	printf $F "create $a" "$m" "create $b" "$m" "create $a" "$m" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	test_i18ngrep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err
+	test_grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err
 '
 
 test_expect_success 'stdin -z create ref works' '
@@ -1338,7 +1338,7 @@ test_expect_success 'fails with duplicate HEAD update' '
 	update HEAD $B
 	EOF
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	test_i18ngrep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err &&
+	test_grep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err &&
 	echo "refs/heads/target1" >expect &&
 	git symbolic-ref HEAD >actual &&
 	test_cmp expect actual &&
@@ -1355,7 +1355,7 @@ test_expect_success 'fails with duplicate ref update via symref' '
 	update refs/heads/symref2 $B
 	EOF
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	test_i18ngrep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err &&
+	test_grep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err &&
 	echo "refs/heads/target2" >expect &&
 	git symbolic-ref refs/heads/symref2 >actual &&
 	test_cmp expect actual &&
diff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh
index 937ae0d733..0369beea33 100755
--- a/t/t1404-update-ref-errors.sh
+++ b/t/t1404-update-ref-errors.sh
@@ -29,7 +29,7 @@ test_update_rejected () {
 	fi &&
 	printf "create $prefix/%s $C\n" $create >input &&
 	test_must_fail git update-ref --stdin <input 2>output.err &&
-	test_i18ngrep -F "$error" output.err &&
+	test_grep -F "$error" output.err &&
 	git for-each-ref $prefix >actual &&
 	test_cmp unchanged actual
 }
@@ -613,7 +613,7 @@ test_expect_success REFFILES 'delete fails cleanly if packed-refs file is locked
 	test_when_finished "rm -f .git/packed-refs.lock" &&
 	test_must_fail git update-ref -d $prefix/foo >out 2>err &&
 	git for-each-ref $prefix >actual &&
-	test_i18ngrep "Unable to create $SQ.*packed-refs.lock$SQ: " err &&
+	test_grep "Unable to create $SQ.*packed-refs.lock$SQ: " err &&
 	test_cmp unchanged actual
 '
 
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index 6c45965b1e..e1fc949f9a 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -29,7 +29,7 @@ check_fsck () {
 	'')
 		test_must_be_empty fsck.output ;;
 	*)
-		test_i18ngrep "$1" fsck.output ;;
+		test_grep "$1" fsck.output ;;
 	esac
 }
 
@@ -308,9 +308,9 @@ test_expect_success 'git reflog expire unknown reference' '
 	test_config gc.reflogexpireunreachable never &&
 
 	test_must_fail git reflog expire main@{123} 2>stderr &&
-	test_i18ngrep "points nowhere" stderr &&
+	test_grep "points nowhere" stderr &&
 	test_must_fail git reflog expire does-not-exist 2>stderr &&
-	test_i18ngrep "points nowhere" stderr
+	test_grep "points nowhere" stderr
 '
 
 test_expect_success 'checkout should not delete log for packed ref' '
diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh
index b32ca798f9..2092488090 100755
--- a/t/t1416-ref-transaction-hooks.sh
+++ b/t/t1416-ref-transaction-hooks.sh
@@ -37,7 +37,7 @@ test_expect_success 'hook aborts updating ref in prepared state' '
 		fi
 	EOF
 	test_must_fail git update-ref HEAD POST 2>err &&
-	test_i18ngrep "ref updates aborted by hook" err
+	test_grep "ref updates aborted by hook" err
 '
 
 test_expect_success 'hook gets all queued updates in prepared state' '
diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh
index ff1c967d55..4da539cf50 100755
--- a/t/t1430-bad-ref-name.sh
+++ b/t/t1430-bad-ref-name.sh
@@ -47,7 +47,7 @@ test_expect_success 'git branch shows badly named ref as warning' '
 	test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION &&
 	test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" &&
 	git branch >output 2>error &&
-	test_i18ngrep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error &&
+	test_grep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -158,7 +158,7 @@ test_expect_success 'rev-parse skips symref pointing to broken name' '
 	git rev-parse --verify one >expect &&
 	git rev-parse --verify shadow >actual 2>err &&
 	test_cmp expect actual &&
-	test_i18ngrep "ignoring dangling symref refs/tags/shadow" err
+	test_grep "ignoring dangling symref refs/tags/shadow" err
 '
 
 test_expect_success 'for-each-ref emits warnings for broken names' '
@@ -172,9 +172,9 @@ test_expect_success 'for-each-ref emits warnings for broken names' '
 	! grep -e "broken\.\.\.ref" output &&
 	! grep -e "badname" output &&
 	! grep -e "broken\.\.\.symref" output &&
-	test_i18ngrep "ignoring ref with broken name refs/heads/broken\.\.\.ref" error &&
-	test_i18ngrep ! "ignoring broken ref refs/heads/badname" error &&
-	test_i18ngrep "ignoring ref with broken name refs/heads/broken\.\.\.symref" error
+	test_grep "ignoring ref with broken name refs/heads/broken\.\.\.ref" error &&
+	test_grep ! "ignoring broken ref refs/heads/badname" error &&
+	test_grep "ignoring ref with broken name refs/heads/broken\.\.\.symref" error
 '
 
 test_expect_success 'update-ref -d can delete broken name' '
@@ -192,7 +192,7 @@ test_expect_success 'branch -d can delete broken name' '
 	test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION &&
 	test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" &&
 	git branch -d broken...ref >output 2>error &&
-	test_i18ngrep "Deleted branch broken...ref (was broken)" output &&
+	test_grep "Deleted branch broken...ref (was broken)" output &&
 	test_must_be_empty error &&
 	git branch >output 2>error &&
 	! grep -e "broken\.\.\.ref" error &&
@@ -218,7 +218,7 @@ test_expect_success 'branch -d can delete symref to broken name' '
 	test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" &&
 	git branch -d badname >output 2>error &&
 	test_path_is_missing .git/refs/heads/badname &&
-	test_i18ngrep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output &&
+	test_grep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output &&
 	test_must_be_empty error
 '
 
@@ -236,7 +236,7 @@ test_expect_success 'branch -d can delete dangling symref to broken name' '
 	test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" &&
 	git branch -d badname >output 2>error &&
 	test_path_is_missing .git/refs/heads/badname &&
-	test_i18ngrep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output &&
+	test_grep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output &&
 	test_must_be_empty error
 '
 
@@ -265,7 +265,7 @@ test_expect_success 'branch -d can delete symref with broken name' '
 	test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" &&
 	git branch -d broken...symref >output 2>error &&
 	test_path_is_missing .git/refs/heads/broken...symref &&
-	test_i18ngrep "Deleted branch broken...symref (was refs/heads/main)" output &&
+	test_grep "Deleted branch broken...symref (was refs/heads/main)" output &&
 	test_must_be_empty error
 '
 
@@ -283,7 +283,7 @@ test_expect_success 'branch -d can delete dangling symref with broken name' '
 	test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" &&
 	git branch -d broken...symref >output 2>error &&
 	test_path_is_missing .git/refs/heads/broken...symref &&
-	test_i18ngrep "Deleted branch broken...symref (was refs/heads/idonotexist)" output &&
+	test_grep "Deleted branch broken...symref (was refs/heads/idonotexist)" output &&
 	test_must_be_empty error
 '
 
@@ -292,7 +292,7 @@ test_expect_success 'update-ref -d cannot delete non-ref in .git dir' '
 	echo precious >expect &&
 	test_must_fail git update-ref -d my-private-file >output 2>error &&
 	test_must_be_empty output &&
-	test_i18ngrep -e "refusing to update ref with bad name" error &&
+	test_grep -e "refusing to update ref with bad name" error &&
 	test_cmp expect .git/my-private-file
 '
 
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
index 5805d47eb9..e2b30fb75e 100755
--- a/t/t1450-fsck.sh
+++ b/t/t1450-fsck.sh
@@ -118,7 +118,7 @@ test_expect_success 'branch pointing to non-commit' '
 	git rev-parse HEAD^{tree} >.git/refs/heads/invalid &&
 	test_when_finished "git update-ref -d refs/heads/invalid" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "not a commit" out
+	test_grep "not a commit" out
 '
 
 test_expect_success 'HEAD link pointing at a funny object' '
@@ -127,7 +127,7 @@ test_expect_success 'HEAD link pointing at a funny object' '
 	echo $ZERO_OID >.git/HEAD &&
 	# avoid corrupt/broken HEAD from interfering with repo discovery
 	test_must_fail env GIT_DIR=.git git fsck 2>out &&
-	test_i18ngrep "detached HEAD points" out
+	test_grep "detached HEAD points" out
 '
 
 test_expect_success 'HEAD link pointing at a funny place' '
@@ -136,7 +136,7 @@ test_expect_success 'HEAD link pointing at a funny place' '
 	echo "ref: refs/funny/place" >.git/HEAD &&
 	# avoid corrupt/broken HEAD from interfering with repo discovery
 	test_must_fail env GIT_DIR=.git git fsck 2>out &&
-	test_i18ngrep "HEAD points to something strange" out
+	test_grep "HEAD points to something strange" out
 '
 
 test_expect_success 'HEAD link pointing at a funny object (from different wt)' '
@@ -147,7 +147,7 @@ test_expect_success 'HEAD link pointing at a funny object (from different wt)' '
 	echo $ZERO_OID >.git/HEAD &&
 	# avoid corrupt/broken HEAD from interfering with repo discovery
 	test_must_fail git -C wt fsck 2>out &&
-	test_i18ngrep "main-worktree/HEAD: detached HEAD points" out
+	test_grep "main-worktree/HEAD: detached HEAD points" out
 '
 
 test_expect_success 'other worktree HEAD link pointing at a funny object' '
@@ -155,7 +155,7 @@ test_expect_success 'other worktree HEAD link pointing at a funny object' '
 	git worktree add other &&
 	echo $ZERO_OID >.git/worktrees/other/HEAD &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "worktrees/other/HEAD: detached HEAD points" out
+	test_grep "worktrees/other/HEAD: detached HEAD points" out
 '
 
 test_expect_success 'other worktree HEAD link pointing at missing object' '
@@ -163,7 +163,7 @@ test_expect_success 'other worktree HEAD link pointing at missing object' '
 	git worktree add other &&
 	echo "Contents missing from repo" | git hash-object --stdin >.git/worktrees/other/HEAD &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "worktrees/other/HEAD: invalid sha1 pointer" out
+	test_grep "worktrees/other/HEAD: invalid sha1 pointer" out
 '
 
 test_expect_success 'other worktree HEAD link pointing at a funny place' '
@@ -171,7 +171,7 @@ test_expect_success 'other worktree HEAD link pointing at a funny place' '
 	git worktree add other &&
 	echo "ref: refs/funny/place" >.git/worktrees/other/HEAD &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "worktrees/other/HEAD points to something strange" out
+	test_grep "worktrees/other/HEAD points to something strange" out
 '
 
 test_expect_success 'commit with multiple signatures is okay' '
@@ -217,7 +217,7 @@ test_expect_success 'email with embedded > is not okay' '
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $new" out
+	test_grep "error in commit $new" out
 '
 
 test_expect_success 'missing < email delimiter is reported nicely' '
@@ -228,7 +228,7 @@ test_expect_success 'missing < email delimiter is reported nicely' '
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $new.* - bad name" out
+	test_grep "error in commit $new.* - bad name" out
 '
 
 test_expect_success 'missing email is reported nicely' '
@@ -239,7 +239,7 @@ test_expect_success 'missing email is reported nicely' '
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $new.* - missing email" out
+	test_grep "error in commit $new.* - missing email" out
 '
 
 test_expect_success '> in name is reported' '
@@ -250,7 +250,7 @@ test_expect_success '> in name is reported' '
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $new" out
+	test_grep "error in commit $new" out
 '
 
 # date is 2^64 + 1
@@ -263,7 +263,7 @@ test_expect_success 'integer overflow in timestamps is reported' '
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $new.*integer overflow" out
+	test_grep "error in commit $new.*integer overflow" out
 '
 
 test_expect_success 'commit with NUL in header' '
@@ -274,7 +274,7 @@ test_expect_success 'commit with NUL in header' '
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $new.*unterminated header: NUL at offset" out
+	test_grep "error in commit $new.*unterminated header: NUL at offset" out
 '
 
 test_expect_success 'tree object with duplicate entries' '
@@ -295,7 +295,7 @@ test_expect_success 'tree object with duplicate entries' '
 		git hash-object --literally -w -t tree --stdin
 	) &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in tree .*contains duplicate file entries" out
+	test_grep "error in tree .*contains duplicate file entries" out
 '
 
 check_duplicate_names () {
@@ -318,8 +318,8 @@ check_duplicate_names () {
 		done >badtree &&
 		badtree=$(git mktree <badtree) &&
 		test_must_fail git fsck 2>out &&
-		test_i18ngrep "$badtree" out &&
-		test_i18ngrep "error in tree .*contains duplicate file entries" out
+		test_grep "$badtree" out &&
+		test_grep "error in tree .*contains duplicate file entries" out
 	'
 }
 
@@ -341,9 +341,9 @@ test_expect_success 'unparseable tree object' '
 	commit_sha1=$(git commit-tree $tree_sha1) &&
 	git update-ref refs/heads/wrong $commit_sha1 &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error: empty filename in tree entry" out &&
-	test_i18ngrep "$tree_sha1" out &&
-	test_i18ngrep ! "fatal: empty filename in tree entry" out
+	test_grep "error: empty filename in tree entry" out &&
+	test_grep "$tree_sha1" out &&
+	test_grep ! "fatal: empty filename in tree entry" out
 '
 
 test_expect_success 'tree entry with type mismatch' '
@@ -360,8 +360,8 @@ test_expect_success 'tree entry with type mismatch' '
 	commit=$(git commit-tree $tree) &&
 	git update-ref refs/heads/type_mismatch $commit &&
 	test_must_fail git fsck >out 2>&1 &&
-	test_i18ngrep "is a blob, not a tree" out &&
-	test_i18ngrep ! "dangling blob" out
+	test_grep "is a blob, not a tree" out &&
+	test_grep ! "dangling blob" out
 '
 
 test_expect_success 'tree entry with bogus mode' '
@@ -394,7 +394,7 @@ test_expect_success 'tag pointing to nonexistent' '
 	echo $tag >.git/refs/tags/invalid &&
 	test_when_finished "git update-ref -d refs/tags/invalid" &&
 	test_must_fail git fsck --tags >out &&
-	test_i18ngrep "broken link" out
+	test_grep "broken link" out
 '
 
 test_expect_success 'tag pointing to something else than its type' '
@@ -455,7 +455,7 @@ test_expect_success 'tag with bad tagger' '
 	echo $tag >.git/refs/tags/wrong &&
 	test_when_finished "git update-ref -d refs/tags/wrong" &&
 	test_must_fail git fsck --tags 2>out &&
-	test_i18ngrep "error in tag .*: invalid author/committer" out
+	test_grep "error in tag .*: invalid author/committer" out
 '
 
 test_expect_success 'tag with NUL in header' '
@@ -474,7 +474,7 @@ test_expect_success 'tag with NUL in header' '
 	echo $tag >.git/refs/tags/wrong &&
 	test_when_finished "git update-ref -d refs/tags/wrong" &&
 	test_must_fail git fsck --tags 2>out &&
-	test_i18ngrep "error in tag $tag.*unterminated header: NUL at offset" out
+	test_grep "error in tag $tag.*unterminated header: NUL at offset" out
 '
 
 test_expect_success 'cleaned up' '
@@ -504,7 +504,7 @@ test_expect_success 'rev-list --verify-objects with bad sha1' '
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 
 	test_might_fail git rev-list --verify-objects refs/heads/bogus >/dev/null 2>out &&
-	test_i18ngrep -q "error: hash mismatch $(dirname $new)$(test_oid ff_2)" out
+	test_grep -q "error: hash mismatch $(dirname $new)$(test_oid ff_2)" out
 '
 
 # An actual bit corruption is more likely than swapped commits, but
@@ -575,7 +575,7 @@ test_expect_success 'fsck notices blob entry pointing to null sha1' '
 	 sha=$(printf "100644 file$_bz$_bzoid" |
 	       git hash-object --literally -w --stdin -t tree) &&
 	  git fsck 2>out &&
-	  test_i18ngrep "warning.*null sha1" out
+	  test_grep "warning.*null sha1" out
 	)
 '
 
@@ -585,7 +585,7 @@ test_expect_success 'fsck notices submodule entry pointing to null sha1' '
 	 sha=$(printf "160000 submodule$_bz$_bzoid" |
 	       git hash-object --literally -w --stdin -t tree) &&
 	  git fsck 2>out &&
-	  test_i18ngrep "warning.*null sha1" out
+	  test_grep "warning.*null sha1" out
 	)
 '
 
@@ -606,7 +606,7 @@ while read name path pretty; do
 			printf "$mode $type %s\t%s" "$value" "$path" >bad &&
 			bad_tree=$(git mktree <bad) &&
 			git fsck 2>out &&
-			test_i18ngrep "warning.*tree $bad_tree" out
+			test_grep "warning.*tree $bad_tree" out
 		)'
 	done <<-\EOF
 	100644 blob
@@ -652,9 +652,9 @@ test_expect_success 'NUL in commit' '
 		git branch bad $(cat name) &&
 
 		test_must_fail git -c fsck.nulInCommit=error fsck 2>warn.1 &&
-		test_i18ngrep nulInCommit warn.1 &&
+		test_grep nulInCommit warn.1 &&
 		git fsck 2>warn.2 &&
-		test_i18ngrep nulInCommit warn.2
+		test_grep nulInCommit warn.2
 	)
 '
 
@@ -774,7 +774,7 @@ test_expect_success 'fsck --name-objects' '
 		tree=$(git rev-parse --verify julius:) &&
 		git tag -d julius &&
 		test_must_fail git fsck --name-objects >out &&
-		test_i18ngrep "$tree (refs/tags/augustus44\\^:" out
+		test_grep "$tree (refs/tags/augustus44\\^:" out
 	)
 '
 
@@ -787,7 +787,7 @@ test_expect_success 'alternate objects are correctly blamed' '
 	mkdir alt.git/objects/$(dirname $path) &&
 	>alt.git/objects/$(dirname $path)/$(basename $path) &&
 	test_must_fail git fsck >out 2>&1 &&
-	test_i18ngrep alt.git out
+	test_grep alt.git out
 '
 
 test_expect_success 'fsck errors in packed objects' '
@@ -806,8 +806,8 @@ test_expect_success 'fsck errors in packed objects' '
 	remove_object $one &&
 	remove_object $two &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "error in commit $one.* - bad name" out &&
-	test_i18ngrep "error in commit $two.* - bad name" out &&
+	test_grep "error in commit $one.* - bad name" out &&
+	test_grep "error in commit $two.* - bad name" out &&
 	! grep corrupt out
 '
 
@@ -824,7 +824,7 @@ test_expect_success 'fsck fails on corrupt packfile' '
 	test_when_finished "rm -f .git/objects/pack/pack-$pack.*" &&
 	remove_object $hsh &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "checksum mismatch" out
+	test_grep "checksum mismatch" out
 '
 
 test_expect_success 'fsck finds problems in duplicate loose objects' '
@@ -861,7 +861,7 @@ test_expect_success 'fsck detects trailing loose garbage (commit)' '
 	chmod +w "$file" &&
 	echo garbage >>"$file" &&
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep "garbage.*$commit" out
+	test_grep "garbage.*$commit" out
 '
 
 test_expect_success 'fsck detects trailing loose garbage (large blob)' '
@@ -871,7 +871,7 @@ test_expect_success 'fsck detects trailing loose garbage (large blob)' '
 	chmod +w "$file" &&
 	echo garbage >>"$file" &&
 	test_must_fail git -c core.bigfilethreshold=5 fsck 2>out &&
-	test_i18ngrep "garbage.*$blob" out
+	test_grep "garbage.*$blob" out
 '
 
 test_expect_success 'fsck detects truncated loose object' '
@@ -887,10 +887,10 @@ test_expect_success 'fsck detects truncated loose object' '
 
 	# check both regular and streaming code paths
 	test_must_fail git fsck 2>out &&
-	test_i18ngrep corrupt.*$blob out &&
+	test_grep corrupt.*$blob out &&
 
 	test_must_fail git -c core.bigfilethreshold=128 fsck 2>out &&
-	test_i18ngrep corrupt.*$blob out
+	test_grep corrupt.*$blob out
 '
 
 # for each of type, we have one version which is referenced by another object
@@ -979,7 +979,7 @@ test_expect_success 'detect corrupt index file in fsck' '
 	test_when_finished "mv .git/index.backup .git/index" &&
 	corrupt_index_checksum &&
 	test_must_fail git fsck --cache 2>errors &&
-	test_i18ngrep "bad index file" errors
+	test_grep "bad index file" errors
 '
 
 test_expect_success 'fsck error and recovery on invalid object type' '
diff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh
index 18688cae17..ef40511d89 100755
--- a/t/t1506-rev-parse-diagnosis.sh
+++ b/t/t1506-rev-parse-diagnosis.sh
@@ -107,16 +107,16 @@ test_expect_success 'correct relative file objects (6)' '
 
 test_expect_success 'incorrect revision id' '
 	test_must_fail git rev-parse foobar:file.txt 2>error &&
-	test_i18ngrep "invalid object name .foobar." error &&
+	test_grep "invalid object name .foobar." error &&
 	test_must_fail git rev-parse foobar 2>error &&
-	test_i18ngrep "unknown revision or path not in the working tree." error
+	test_grep "unknown revision or path not in the working tree." error
 '
 
 test_expect_success 'incorrect file in sha1:path' '
 	test_must_fail git rev-parse HEAD:nothing.txt 2>error &&
-	test_i18ngrep "path .nothing.txt. does not exist in .HEAD." error &&
+	test_grep "path .nothing.txt. does not exist in .HEAD." error &&
 	test_must_fail git rev-parse HEAD:index-only.txt 2>error &&
-	test_i18ngrep "path .index-only.txt. exists on disk, but not in .HEAD." error &&
+	test_grep "path .index-only.txt. exists on disk, but not in .HEAD." error &&
 	(cd subdir &&
 	 test_must_fail git rev-parse HEAD:file2.txt 2>error &&
 	 test_did_you_mean HEAD subdir/ file2.txt exists )
@@ -124,9 +124,9 @@ test_expect_success 'incorrect file in sha1:path' '
 
 test_expect_success 'incorrect file in :path and :N:path' '
 	test_must_fail git rev-parse :nothing.txt 2>error &&
-	test_i18ngrep "path .nothing.txt. does not exist (neither on disk nor in the index)" error &&
+	test_grep "path .nothing.txt. does not exist (neither on disk nor in the index)" error &&
 	test_must_fail git rev-parse :1:nothing.txt 2>error &&
-	test_i18ngrep "path .nothing.txt. does not exist (neither on disk nor in the index)" error &&
+	test_grep "path .nothing.txt. does not exist (neither on disk nor in the index)" error &&
 	test_must_fail git rev-parse :1:file.txt 2>error &&
 	test_did_you_mean ":0" "" file.txt "is in the index" "at stage 1" &&
 	(cd subdir &&
@@ -137,42 +137,42 @@ test_expect_success 'incorrect file in :path and :N:path' '
 	 test_must_fail git rev-parse :2:file2.txt 2>error &&
 	 test_did_you_mean :0 subdir/ file2.txt "is in the index") &&
 	test_must_fail git rev-parse :disk-only.txt 2>error &&
-	test_i18ngrep "path .disk-only.txt. exists on disk, but not in the index" error
+	test_grep "path .disk-only.txt. exists on disk, but not in the index" error
 '
 
 test_expect_success 'invalid @{n} reference' '
 	test_must_fail git rev-parse main@{99999} >output 2>error &&
 	test_must_be_empty output &&
-	test_i18ngrep "log for [^ ]* only has [0-9][0-9]* entries" error  &&
+	test_grep "log for [^ ]* only has [0-9][0-9]* entries" error  &&
 	test_must_fail git rev-parse --verify main@{99999} >output 2>error &&
 	test_must_be_empty output &&
-	test_i18ngrep "log for [^ ]* only has [0-9][0-9]* entries" error
+	test_grep "log for [^ ]* only has [0-9][0-9]* entries" error
 '
 
 test_expect_success 'relative path not found' '
 	(
 		cd subdir &&
 		test_must_fail git rev-parse HEAD:./nonexistent.txt 2>error &&
-		test_i18ngrep subdir/nonexistent.txt error
+		test_grep subdir/nonexistent.txt error
 	)
 '
 
 test_expect_success 'relative path outside worktree' '
 	test_must_fail git rev-parse HEAD:../file.txt >output 2>error &&
 	test_must_be_empty output &&
-	test_i18ngrep "outside repository" error
+	test_grep "outside repository" error
 '
 
 test_expect_success 'relative path when cwd is outside worktree' '
 	test_must_fail git --git-dir=.git --work-tree=subdir rev-parse HEAD:./file.txt >output 2>error &&
 	test_must_be_empty output &&
-	test_i18ngrep "relative path syntax can.t be used outside working tree" error
+	test_grep "relative path syntax can.t be used outside working tree" error
 '
 
 test_expect_success '<commit>:file correctly diagnosed after a pathname' '
 	test_must_fail git rev-parse file.txt HEAD:file.txt 1>actual 2>error &&
-	test_i18ngrep ! "exists on disk" error &&
-	test_i18ngrep "no such path in the working tree" error &&
+	test_grep ! "exists on disk" error &&
+	test_grep "no such path in the working tree" error &&
 	cat >expect <<-\EOF &&
 	file.txt
 	HEAD:file.txt
@@ -214,13 +214,13 @@ test_expect_success 'dotdot does not peel endpoints' '
 
 test_expect_success 'arg before dashdash must be a revision (missing)' '
 	test_must_fail git rev-parse foobar -- 2>stderr &&
-	test_i18ngrep "bad revision" stderr
+	test_grep "bad revision" stderr
 '
 
 test_expect_success 'arg before dashdash must be a revision (file)' '
 	>foobar &&
 	test_must_fail git rev-parse foobar -- 2>stderr &&
-	test_i18ngrep "bad revision" stderr
+	test_grep "bad revision" stderr
 '
 
 test_expect_success 'arg before dashdash must be a revision (ambiguous)' '
@@ -269,7 +269,7 @@ test_expect_success 'arg after dashdash not interpreted as option' '
 
 test_expect_success 'arg after end-of-options not interpreted as option' '
 	test_must_fail git rev-parse --end-of-options --not-real -- 2>err &&
-	test_i18ngrep bad.revision.*--not-real err
+	test_grep bad.revision.*--not-real err
 '
 
 test_expect_success 'end-of-options still allows --' '
diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh
index 98cefe3b70..70f1e0a998 100755
--- a/t/t1512-rev-parse-disambiguation.sh
+++ b/t/t1512-rev-parse-disambiguation.sh
@@ -129,7 +129,7 @@ test_expect_success 'blob and tree' '
 
 test_expect_success 'warn ambiguity when no candidate matches type hint' '
 	test_must_fail git rev-parse --verify 000000000^{commit} 2>actual &&
-	test_i18ngrep "short object ID 000000000 is ambiguous" actual
+	test_grep "short object ID 000000000 is ambiguous" actual
 '
 
 test_expect_success 'disambiguate tree-ish' '
@@ -470,10 +470,10 @@ test_expect_success 'cat-file --batch and --batch-check show ambiguous' '
 	echo "0000 ambiguous" >expect &&
 	echo 0000 | git cat-file --batch-check >actual 2>err &&
 	test_cmp expect actual &&
-	test_i18ngrep hint: err &&
+	test_grep hint: err &&
 	echo 0000 | git cat-file --batch >actual 2>err &&
 	test_cmp expect actual &&
-	test_i18ngrep hint: err
+	test_grep hint: err
 '
 
 test_done
diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh
index b16d69ca4a..4c0fd856b3 100755
--- a/t/t2004-checkout-cache-temp.sh
+++ b/t/t2004-checkout-cache-temp.sh
@@ -93,7 +93,7 @@ test_expect_success 'checkout all stages of unknown path' '
 	rm -f path* .merge_* actual &&
 	test_must_fail git checkout-index --stage=all --temp \
 		-- does-not-exist 2>stderr &&
-	test_i18ngrep not.in.the.cache stderr
+	test_grep not.in.the.cache stderr
 '
 
 test_expect_success 'checkout all stages/one file to nothing' '
diff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh
index 5d119871d4..570ba38580 100755
--- a/t/t2006-checkout-index-basic.sh
+++ b/t/t2006-checkout-index-basic.sh
@@ -8,7 +8,7 @@ TEST_PASSES_SANITIZE_LEAK=true
 
 test_expect_success 'checkout-index --gobbledegook' '
 	test_expect_code 129 git checkout-index --gobbledegook 2>err &&
-	test_i18ngrep "[Uu]sage" err
+	test_grep "[Uu]sage" err
 '
 
 test_expect_success 'checkout-index -h in broken repository' '
@@ -19,18 +19,18 @@ test_expect_success 'checkout-index -h in broken repository' '
 		>.git/index &&
 		test_expect_code 129 git checkout-index -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage" broken/usage
+	test_grep "[Uu]sage" broken/usage
 '
 
 test_expect_success 'checkout-index reports errors (cmdline)' '
 	test_must_fail git checkout-index -- does-not-exist 2>stderr &&
-	test_i18ngrep not.in.the.cache stderr
+	test_grep not.in.the.cache stderr
 '
 
 test_expect_success 'checkout-index reports errors (stdin)' '
 	echo does-not-exist |
 	test_must_fail git checkout-index --stdin 2>stderr &&
-	test_i18ngrep not.in.the.cache stderr
+	test_grep not.in.the.cache stderr
 '
 for mode in 'case' 'utf-8'
 do
@@ -88,8 +88,8 @@ test_expect_success 'checkout-index --temp correctly reports error on missing bl
 	git update-index --index-info <objs &&
 
 	test_must_fail git checkout-index --temp symlink file 2>stderr &&
-	test_i18ngrep "unable to read sha1 file of file ($missing_blob)" stderr &&
-	test_i18ngrep "unable to read sha1 file of symlink ($missing_blob)" stderr
+	test_grep "unable to read sha1 file of file ($missing_blob)" stderr &&
+	test_grep "unable to read sha1 file of symlink ($missing_blob)" stderr
 '
 
 test_expect_success 'checkout-index --temp correctly reports error for submodules' '
@@ -98,7 +98,7 @@ test_expect_success 'checkout-index --temp correctly reports error for submodule
 	git submodule add ./sub &&
 	git commit -m sub &&
 	test_must_fail git checkout-index --temp sub 2>stderr &&
-	test_i18ngrep "cannot create temporary submodule sub" stderr
+	test_grep "cannot create temporary submodule sub" stderr
 '
 
 test_done
diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh
index 9d4b37526a..82c3bfeac1 100755
--- a/t/t2010-checkout-ambiguous.sh
+++ b/t/t2010-checkout-ambiguous.sh
@@ -62,8 +62,8 @@ test_expect_success 'disambiguate checking out from a tree-ish' '
 
 test_expect_success 'accurate error message with more than one ref' '
 	test_must_fail git checkout HEAD main -- 2>actual &&
-	test_i18ngrep 2 actual &&
-	test_i18ngrep "one reference expected, 2 given" actual
+	test_grep 2 actual &&
+	test_grep "one reference expected, 2 given" actual
 '
 
 test_done
diff --git a/t/t2018-checkout-branch.sh b/t/t2018-checkout-branch.sh
index 8581ad3437..43551cc148 100755
--- a/t/t2018-checkout-branch.sh
+++ b/t/t2018-checkout-branch.sh
@@ -278,12 +278,12 @@ test_expect_success 'checkout -b to a new branch preserves mergeable changes des
 
 test_expect_success 'checkout -b rejects an invalid start point' '
 	test_must_fail git checkout -b branch4 file1 2>err &&
-	test_i18ngrep "is not a commit" err
+	test_grep "is not a commit" err
 '
 
 test_expect_success 'checkout -b rejects an extra path argument' '
 	test_must_fail git checkout -b branch5 branch1 file1 2>err &&
-	test_i18ngrep "Cannot update paths and switch to branch" err
+	test_grep "Cannot update paths and switch to branch" err
 '
 
 test_done
diff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh
index 9540588664..c67261e2b6 100755
--- a/t/t2019-checkout-ambiguous-ref.sh
+++ b/t/t2019-checkout-ambiguous-ref.sh
@@ -32,8 +32,8 @@ test_expect_success 'checkout chooses branch over tag' '
 '
 
 test_expect_success 'checkout reports switch to branch' '
-	test_i18ngrep "Switched to branch" stderr &&
-	test_i18ngrep ! "^HEAD is now at" stderr
+	test_grep "Switched to branch" stderr &&
+	test_grep ! "^HEAD is now at" stderr
 '
 
 test_expect_success 'checkout vague ref succeeds' '
@@ -54,8 +54,8 @@ test_expect_success VAGUENESS_SUCCESS 'checkout chooses branch over tag' '
 '
 
 test_expect_success VAGUENESS_SUCCESS 'checkout reports switch to branch' '
-	test_i18ngrep "Switched to branch" stderr &&
-	test_i18ngrep ! "^HEAD is now at" stderr
+	test_grep "Switched to branch" stderr &&
+	test_grep ! "^HEAD is now at" stderr
 '
 
 test_done
diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh
index 2eab6474f8..8202ef8c74 100755
--- a/t/t2020-checkout-detach.sh
+++ b/t/t2020-checkout-detach.sh
@@ -17,12 +17,12 @@ check_not_detached () {
 
 PREV_HEAD_DESC='Previous HEAD position was'
 check_orphan_warning() {
-	test_i18ngrep "you are leaving $2 behind" "$1" &&
-	test_i18ngrep ! "$PREV_HEAD_DESC" "$1"
+	test_grep "you are leaving $2 behind" "$1" &&
+	test_grep ! "$PREV_HEAD_DESC" "$1"
 }
 check_no_orphan_warning() {
-	test_i18ngrep ! "you are leaving .* commit.*behind" "$1" &&
-	test_i18ngrep "$PREV_HEAD_DESC" "$1"
+	test_grep ! "you are leaving .* commit.*behind" "$1" &&
+	test_grep "$PREV_HEAD_DESC" "$1"
 }
 
 reset () {
diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh
index 74049a9812..a97416ce65 100755
--- a/t/t2024-checkout-dwim.sh
+++ b/t/t2024-checkout-dwim.sh
@@ -93,7 +93,7 @@ test_expect_success 'when arg matches multiple remotes, do not fallback to inter
 
 	test_must_fail git checkout ambiguous_branch_and_file 2>err &&
 
-	test_i18ngrep "matched multiple (2) remote tracking branches" err &&
+	test_grep "matched multiple (2) remote tracking branches" err &&
 
 	# file must not be altered
 	test_cmp expect ambiguous_branch_and_file
@@ -105,12 +105,12 @@ test_expect_success 'checkout of branch from multiple remotes fails with advice'
 	test_must_fail git checkout foo 2>stderr &&
 	test_branch main &&
 	status_uno_is_clean &&
-	test_i18ngrep "^hint: " stderr &&
+	test_grep "^hint: " stderr &&
 	test_must_fail git -c advice.checkoutAmbiguousRemoteBranchName=false \
 		checkout foo 2>stderr &&
 	test_branch main &&
 	status_uno_is_clean &&
-	test_i18ngrep ! "^hint: " stderr
+	test_grep ! "^hint: " stderr
 '
 
 test_expect_success PERL 'checkout -p with multiple remotes does not print advice' '
@@ -118,7 +118,7 @@ test_expect_success PERL 'checkout -p with multiple remotes does not print advic
 	test_might_fail git branch -D foo &&
 
 	git checkout -p foo 2>stderr &&
-	test_i18ngrep ! "^hint: " stderr &&
+	test_grep ! "^hint: " stderr &&
 	status_uno_is_clean
 '
 
diff --git a/t/t2025-checkout-no-overlay.sh b/t/t2025-checkout-no-overlay.sh
index 3832c3de81..246609d54d 100755
--- a/t/t2025-checkout-no-overlay.sh
+++ b/t/t2025-checkout-no-overlay.sh
@@ -26,7 +26,7 @@ test_expect_success 'checkout --no-overlay removing last file from directory' '
 
 test_expect_success 'checkout -p --overlay is disallowed' '
 	test_must_fail git checkout -p --overlay HEAD 2>actual &&
-	test_i18ngrep "fatal: options .-p. and .--overlay. cannot be used together" actual
+	test_grep "fatal: options .-p. and .--overlay. cannot be used together" actual
 '
 
 test_expect_success '--no-overlay --theirs with D/F conflict deletes file' '
diff --git a/t/t2026-checkout-pathspec-file.sh b/t/t2026-checkout-pathspec-file.sh
index 9c651aefbc..acd55217a6 100755
--- a/t/t2026-checkout-pathspec-file.sh
+++ b/t/t2026-checkout-pathspec-file.sh
@@ -149,16 +149,16 @@ test_expect_success 'error conditions' '
 	echo fileA.t >list &&
 
 	test_must_fail git checkout --pathspec-from-file=list --detach 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--detach. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--detach. cannot be used together" err &&
 
 	test_must_fail git checkout --pathspec-from-file=list --patch 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
 
 	test_must_fail git checkout --pathspec-from-file=list -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git checkout --pathspec-file-nul 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err
 '
 
 test_done
diff --git a/t/t2027-checkout-track.sh b/t/t2027-checkout-track.sh
index a8bbc60954..98f16c7239 100755
--- a/t/t2027-checkout-track.sh
+++ b/t/t2027-checkout-track.sh
@@ -22,7 +22,7 @@ test_expect_success 'checkout --track -b creates a new tracking branch' '
 
 test_expect_success 'checkout --track -b rejects an extra path argument' '
 	test_must_fail git checkout --track -b branch2 main one.t 2>err &&
-	test_i18ngrep "cannot be used with updating paths" err
+	test_grep "cannot be used with updating paths" err
 '
 
 test_expect_success 'checkout --track -b overrides autoSetupMerge=inherit' '
diff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh
index 2d8c70b03a..102023ed57 100755
--- a/t/t2030-unresolve-info.sh
+++ b/t/t2030-unresolve-info.sh
@@ -191,7 +191,7 @@ test_expect_success 'rerere forget (add-add conflict)' '
 	git commit -m "add differently" &&
 	test_must_fail git merge fifth &&
 	git rerere forget add-differently 2>actual &&
-	test_i18ngrep "no remembered" actual
+	test_grep "no remembered" actual
 '
 
 test_expect_success 'resolve-undo keeps blobs from gc' '
diff --git a/t/t2072-restore-pathspec-file.sh b/t/t2072-restore-pathspec-file.sh
index c22669b39f..8198a1e578 100755
--- a/t/t2072-restore-pathspec-file.sh
+++ b/t/t2072-restore-pathspec-file.sh
@@ -152,16 +152,16 @@ test_expect_success 'error conditions' '
 	>empty_list &&
 
 	test_must_fail git restore --pathspec-from-file=list --patch --source=HEAD^1 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
 
 	test_must_fail git restore --pathspec-from-file=list --source=HEAD^1 -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git restore --pathspec-file-nul --source=HEAD^1 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
 
 	test_must_fail git restore --pathspec-from-file=empty_list --source=HEAD^1 2>err &&
-	test_i18ngrep -e "you must specify path(s) to restore" err
+	test_grep -e "you must specify path(s) to restore" err
 '
 
 test_expect_success 'wildcard pathspec matches file in subdirectory' '
diff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh
index d943ddf47e..95c004dc5c 100755
--- a/t/t2106-update-index-assume-unchanged.sh
+++ b/t/t2106-update-index-assume-unchanged.sh
@@ -22,7 +22,7 @@ test_expect_success 'do not switch branches with dirty file' '
 	echo dirt >file &&
 	git update-index --assume-unchanged file &&
 	test_must_fail git checkout - 2>err &&
-	test_i18ngrep overwritten err
+	test_grep overwritten err
 '
 
 test_done
diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh
index 89b285fa3a..3d7ca5792e 100755
--- a/t/t2107-update-index-basic.sh
+++ b/t/t2107-update-index-basic.sh
@@ -14,7 +14,7 @@ test_expect_success 'update-index --nonsense fails' '
 
 test_expect_success 'update-index --nonsense dumps usage' '
 	test_expect_code 129 git update-index --nonsense 2>err &&
-	test_i18ngrep "[Uu]sage: git update-index" err
+	test_grep "[Uu]sage: git update-index" err
 '
 
 test_expect_success 'update-index -h with corrupt index' '
@@ -25,7 +25,7 @@ test_expect_success 'update-index -h with corrupt index' '
 		>.git/index &&
 		test_expect_code 129 git update-index -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage: git update-index" broken/usage
+	test_grep "[Uu]sage: git update-index" broken/usage
 '
 
 test_expect_success '--cacheinfo complains of missing arguments' '
diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh
index ebf58db2d1..8fa44a92a2 100755
--- a/t/t2203-add-intent.sh
+++ b/t/t2203-add-intent.sh
@@ -173,7 +173,7 @@ test_expect_success 'rename detection finds the right names' '
 		git add -N third &&
 
 		git status | grep -v "^?" >actual.1 &&
-		test_i18ngrep "renamed: *first -> third" actual.1 &&
+		test_grep "renamed: *first -> third" actual.1 &&
 
 		git status --porcelain | grep -v "^?" >actual.2 &&
 		cat >expected.2 <<-\EOF &&
@@ -213,8 +213,8 @@ test_expect_success 'double rename detection in status' '
 		git add -N third &&
 
 		git status | grep -v "^?" >actual.1 &&
-		test_i18ngrep "renamed: *first -> second" actual.1 &&
-		test_i18ngrep "renamed: *second -> third" actual.1 &&
+		test_grep "renamed: *first -> second" actual.1 &&
+		test_grep "renamed: *second -> third" actual.1 &&
 
 		git status --porcelain | grep -v "^?" >actual.2 &&
 		cat >expected.2 <<-\EOF &&
diff --git a/t/t2204-add-ignored.sh b/t/t2204-add-ignored.sh
index 89424abccd..b7cf1e492c 100755
--- a/t/t2204-add-ignored.sh
+++ b/t/t2204-add-ignored.sh
@@ -36,7 +36,7 @@ do
 	'
 
 	test_expect_success "complaints for ignored $i output" '
-		test_i18ngrep -e "Use -f if" err
+		test_grep -e "Use -f if" err
 	'
 
 	test_expect_success "complaints for ignored $i with unignored file" '
@@ -46,7 +46,7 @@ do
 		test_must_be_empty out
 	'
 	test_expect_success "complaints for ignored $i with unignored file output" '
-		test_i18ngrep -e "Use -f if" err
+		test_grep -e "Use -f if" err
 	'
 done
 
@@ -65,7 +65,7 @@ do
 	test_expect_success "complaints for ignored $i in dir output" '
 		(
 			cd dir &&
-			test_i18ngrep -e "Use -f if" err
+			test_grep -e "Use -f if" err
 		)
 	'
 done
@@ -85,7 +85,7 @@ do
 	test_expect_success "complaints for ignored $i in sub output" '
 		(
 			cd sub &&
-			test_i18ngrep -e "Use -f if" err
+			test_grep -e "Use -f if" err
 		)
 	'
 done
diff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh
index 568a47ec42..71aa9bcd62 100755
--- a/t/t2401-worktree-prune.sh
+++ b/t/t2401-worktree-prune.sh
@@ -47,7 +47,7 @@ test_expect_success SANITY 'prune directories with unreadable gitdir' '
 	: >.git/worktrees/def/gitdir &&
 	chmod u-r .git/worktrees/def/gitdir &&
 	git worktree prune --verbose 2>actual &&
-	test_i18ngrep "Removing worktrees/def: unable to read gitdir file" actual &&
+	test_grep "Removing worktrees/def: unable to read gitdir file" actual &&
 	! test -d .git/worktrees/def &&
 	! test -d .git/worktrees
 '
@@ -57,7 +57,7 @@ test_expect_success 'prune directories with invalid gitdir' '
 	: >.git/worktrees/def/def &&
 	: >.git/worktrees/def/gitdir &&
 	git worktree prune --verbose 2>actual &&
-	test_i18ngrep "Removing worktrees/def: invalid gitdir file" actual &&
+	test_grep "Removing worktrees/def: invalid gitdir file" actual &&
 	! test -d .git/worktrees/def &&
 	! test -d .git/worktrees
 '
@@ -67,7 +67,7 @@ test_expect_success 'prune directories with gitdir pointing to nowhere' '
 	: >.git/worktrees/def/def &&
 	echo "$(pwd)"/nowhere >.git/worktrees/def/gitdir &&
 	git worktree prune --verbose 2>actual &&
-	test_i18ngrep "Removing worktrees/def: gitdir file points to non-existent location" actual &&
+	test_grep "Removing worktrees/def: gitdir file points to non-existent location" actual &&
 	! test -d .git/worktrees/def &&
 	! test -d .git/worktrees
 '
@@ -103,7 +103,7 @@ test_expect_success 'prune duplicate (linked/linked)' '
 	sed "s/w2/w1/" .git/worktrees/w2/gitdir >.git/worktrees/w2/gitdir.new &&
 	mv .git/worktrees/w2/gitdir.new .git/worktrees/w2/gitdir &&
 	git worktree prune --verbose 2>actual &&
-	test_i18ngrep "duplicate entry" actual &&
+	test_grep "duplicate entry" actual &&
 	test -d .git/worktrees/w1 &&
 	! test -d .git/worktrees/w2
 '
@@ -116,7 +116,7 @@ test_expect_success 'prune duplicate (main/linked)' '
 	rm -fr wt &&
 	mv repo wt &&
 	git -C wt worktree prune --verbose 2>actual &&
-	test_i18ngrep "duplicate entry" actual &&
+	test_grep "duplicate entry" actual &&
 	! test -d .git/worktrees/wt
 '
 
diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
index 9ad9be0c20..33ea9cb21b 100755
--- a/t/t2402-worktree-list.sh
+++ b/t/t2402-worktree-list.sh
@@ -143,7 +143,7 @@ test_expect_success '"list" all worktrees --porcelain with prunable' '
 	rm -rf prunable &&
 	git worktree list --porcelain >out &&
 	sed -n "/^worktree .*\/prunable$/,/^$/p" <out >only_prunable &&
-	test_i18ngrep "^prunable gitdir file points to non-existent location$" only_prunable
+	test_grep "^prunable gitdir file points to non-existent location$" only_prunable
 '
 
 test_expect_success '"list" all worktrees with prunable consistent with "prune"' '
@@ -155,8 +155,8 @@ test_expect_success '"list" all worktrees with prunable consistent with "prune"'
 	grep "/prunable  *[0-9a-f].* prunable$" out &&
 	! grep "/unprunable  *[0-9a-f].* unprunable$" out &&
 	git worktree prune --verbose 2>out &&
-	test_i18ngrep "^Removing worktrees/prunable" out &&
-	test_i18ngrep ! "^Removing worktrees/unprunable" out
+	test_grep "^Removing worktrees/prunable" out &&
+	test_grep ! "^Removing worktrees/unprunable" out
 '
 
 test_expect_success '"list" --verbose and --porcelain mutually exclusive' '
diff --git a/t/t2403-worktree-move.sh b/t/t2403-worktree-move.sh
index 230a55e99a..901342ea09 100755
--- a/t/t2403-worktree-move.sh
+++ b/t/t2403-worktree-move.sh
@@ -202,7 +202,7 @@ test_expect_success 'proper error when worktree not found' '
 	for i in noodle noodle/bork
 	do
 		test_must_fail git worktree lock $i 2>err &&
-		test_i18ngrep "not a working tree" err || return 1
+		test_grep "not a working tree" err || return 1
 	done
 '
 
diff --git a/t/t2406-worktree-repair.sh b/t/t2406-worktree-repair.sh
index 8970780efc..edbf502ec5 100755
--- a/t/t2406-worktree-repair.sh
+++ b/t/t2406-worktree-repair.sh
@@ -25,7 +25,7 @@ test_expect_success 'worktree path not directory' '
 	>notdir &&
 	test_must_fail git worktree repair >out 2>err &&
 	test_must_be_empty out &&
-	test_i18ngrep "not a directory" err
+	test_grep "not a directory" err
 '
 
 test_expect_success "don't clobber .git repo" '
@@ -35,7 +35,7 @@ test_expect_success "don't clobber .git repo" '
 	test_create_repo repo &&
 	test_must_fail git worktree repair >out 2>err &&
 	test_must_be_empty out &&
-	test_i18ngrep ".git is not a file" err
+	test_grep ".git is not a file" err
 '
 
 test_corrupt_gitfile () {
@@ -47,7 +47,7 @@ test_corrupt_gitfile () {
 	git -C corrupt rev-parse --absolute-git-dir >expect &&
 	eval "$butcher" &&
 	git -C "$repairdir" worktree repair 2>err &&
-	test_i18ngrep "$problem" err &&
+	test_grep "$problem" err &&
 	git -C corrupt rev-parse --absolute-git-dir >actual &&
 	test_cmp expect actual
 }
@@ -93,7 +93,7 @@ test_expect_success 'repair .git file from bare.git' '
 test_expect_success 'invalid worktree path' '
 	test_must_fail git worktree repair /notvalid >out 2>err &&
 	test_must_be_empty out &&
-	test_i18ngrep "not a valid path" err
+	test_grep "not a valid path" err
 '
 
 test_expect_success 'repo not found; .git not file' '
@@ -101,7 +101,7 @@ test_expect_success 'repo not found; .git not file' '
 	test_create_repo not-a-worktree &&
 	test_must_fail git worktree repair not-a-worktree >out 2>err &&
 	test_must_be_empty out &&
-	test_i18ngrep ".git is not a file" err
+	test_grep ".git is not a file" err
 '
 
 test_expect_success 'repo not found; .git not referencing repo' '
@@ -111,7 +111,7 @@ test_expect_success 'repo not found; .git not referencing repo' '
 	mv side/.newgit side/.git &&
 	mkdir not-a-repo &&
 	test_must_fail git worktree repair side 2>err &&
-	test_i18ngrep ".git file does not reference a repository" err
+	test_grep ".git file does not reference a repository" err
 '
 
 test_expect_success 'repo not found; .git file broken' '
@@ -121,7 +121,7 @@ test_expect_success 'repo not found; .git file broken' '
 	mv orig moved &&
 	test_must_fail git worktree repair moved >out 2>err &&
 	test_must_be_empty out &&
-	test_i18ngrep ".git file broken" err
+	test_grep ".git file broken" err
 '
 
 test_expect_success 'repair broken gitdir' '
@@ -132,7 +132,7 @@ test_expect_success 'repair broken gitdir' '
 	mv orig moved &&
 	git worktree repair moved 2>err &&
 	test_cmp expect .git/worktrees/orig/gitdir &&
-	test_i18ngrep "gitdir unreadable" err
+	test_grep "gitdir unreadable" err
 '
 
 test_expect_success 'repair incorrect gitdir' '
@@ -142,7 +142,7 @@ test_expect_success 'repair incorrect gitdir' '
 	mv orig moved &&
 	git worktree repair moved 2>err &&
 	test_cmp expect .git/worktrees/orig/gitdir &&
-	test_i18ngrep "gitdir incorrect" err
+	test_grep "gitdir incorrect" err
 '
 
 test_expect_success 'repair gitdir (implicit) from linked worktree' '
@@ -152,7 +152,7 @@ test_expect_success 'repair gitdir (implicit) from linked worktree' '
 	mv orig moved &&
 	git -C moved worktree repair 2>err &&
 	test_cmp expect .git/worktrees/orig/gitdir &&
-	test_i18ngrep "gitdir incorrect" err
+	test_grep "gitdir incorrect" err
 '
 
 test_expect_success 'unable to repair gitdir (implicit) from main worktree' '
@@ -177,8 +177,8 @@ test_expect_success 'repair multiple gitdir files' '
 	git worktree repair moved1 moved2 2>err &&
 	test_cmp expect1 .git/worktrees/orig1/gitdir &&
 	test_cmp expect2 .git/worktrees/orig2/gitdir &&
-	test_i18ngrep "gitdir incorrect:.*orig1/gitdir$" err &&
-	test_i18ngrep "gitdir incorrect:.*orig2/gitdir$" err
+	test_grep "gitdir incorrect:.*orig1/gitdir$" err &&
+	test_grep "gitdir incorrect:.*orig2/gitdir$" err
 '
 
 test_expect_success 'repair moved main and linked worktrees' '
diff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh
index a16e25c79b..12e41a7b40 100755
--- a/t/t3004-ls-files-basic.sh
+++ b/t/t3004-ls-files-basic.sh
@@ -21,7 +21,7 @@ test_expect_success 'ls-files with nonexistent path' '
 
 test_expect_success 'ls-files with nonsense option' '
 	test_expect_code 129 git ls-files --nonsense 2>actual &&
-	test_i18ngrep "[Uu]sage: git ls-files" actual
+	test_grep "[Uu]sage: git ls-files" actual
 '
 
 test_expect_success 'ls-files -h in corrupt repository' '
@@ -32,7 +32,7 @@ test_expect_success 'ls-files -h in corrupt repository' '
 		>.git/index &&
 		test_expect_code 129 git ls-files -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage: git ls-files " broken/usage
+	test_grep "[Uu]sage: git ls-files " broken/usage
 '
 
 test_expect_success SYMLINKS 'ls-files with absolute paths to symlinks' '
diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh
index 7308a3d4e2..61771eec83 100755
--- a/t/t3007-ls-files-recurse-submodules.sh
+++ b/t/t3007-ls-files-recurse-submodules.sh
@@ -296,7 +296,7 @@ test_expect_success '--recurse-submodules and relative paths' '
 
 test_expect_success '--recurse-submodules does not support --error-unmatch' '
 	test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual &&
-	test_i18ngrep "does not support --error-unmatch" actual
+	test_grep "does not support --error-unmatch" actual
 '
 
 test_expect_success '--recurse-submodules parses submodule repo config' '
@@ -335,7 +335,7 @@ test_expect_success '--recurse-submodules submodules ignore super project worktr
 test_incompatible_with_recurse_submodules () {
 	test_expect_success "--recurse-submodules and $1 are incompatible" "
 		test_must_fail git ls-files --recurse-submodules $1 2>actual &&
-		test_i18ngrep 'unsupported mode' actual
+		test_grep 'unsupported mode' actual
 	"
 }
 
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index daf1666df7..649d9dcba5 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -36,7 +36,7 @@ test_expect_success 'branch -h in broken repository' '
 		>.git/refs/heads/main &&
 		test_expect_code 129 git branch -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage" broken/usage
+	test_grep "[Uu]sage" broken/usage
 '
 
 test_expect_success 'git branch abc should create a branch' '
@@ -103,7 +103,7 @@ test_expect_success 'git branch l should work after branch l/m has been deleted'
 
 test_expect_success 'git branch -m dumps usage' '
 	test_expect_code 128 git branch -m 2>err &&
-	test_i18ngrep "branch name required" err
+	test_grep "branch name required" err
 '
 
 test_expect_success 'git branch -m m broken_symref should work' '
@@ -581,12 +581,12 @@ EOF
 
 test_expect_success 'git branch -c dumps usage' '
 	test_expect_code 128 git branch -c 2>err &&
-	test_i18ngrep "branch name required" err
+	test_grep "branch name required" err
 '
 
 test_expect_success 'git branch --copy dumps usage' '
 	test_expect_code 128 git branch --copy 2>err &&
-	test_i18ngrep "branch name required" err
+	test_grep "branch name required" err
 '
 
 test_expect_success 'git branch -c d e should work' '
@@ -1025,7 +1025,7 @@ test_expect_success '--set-upstream-to fails on a missing dst branch' '
 
 test_expect_success '--set-upstream-to fails on a missing src branch' '
 	test_must_fail git branch --set-upstream-to does-not-exist main 2>err &&
-	test_i18ngrep "the requested upstream branch '"'"'does-not-exist'"'"' does not exist" err
+	test_grep "the requested upstream branch '"'"'does-not-exist'"'"' does not exist" err
 '
 
 test_expect_success '--set-upstream-to fails on a non-ref' '
@@ -1039,7 +1039,7 @@ test_expect_success '--set-upstream-to fails on locked config' '
 	>.git/config.lock &&
 	git branch locked &&
 	test_must_fail git branch --set-upstream-to locked 2>err &&
-	test_i18ngrep "could not lock config file .git/config" err
+	test_grep "could not lock config file .git/config" err
 '
 
 test_expect_success 'use --set-upstream-to modify HEAD' '
@@ -1070,7 +1070,7 @@ test_expect_success '--unset-upstream should fail if config is locked' '
 	git branch --set-upstream-to locked &&
 	>.git/config.lock &&
 	test_must_fail git branch --unset-upstream 2>err &&
-	test_i18ngrep "could not lock config file .git/config" err
+	test_grep "could not lock config file .git/config" err
 '
 
 test_expect_success 'test --unset-upstream on HEAD' '
@@ -1506,7 +1506,7 @@ test_expect_success '--list during rebase' '
 	set_fake_editor &&
 	git rebase -i HEAD~2 &&
 	git branch --list >actual &&
-	test_i18ngrep "rebasing main" actual
+	test_grep "rebasing main" actual
 '
 
 test_expect_success '--list during rebase from detached HEAD' '
@@ -1518,7 +1518,7 @@ test_expect_success '--list during rebase from detached HEAD' '
 	set_fake_editor &&
 	git rebase -i HEAD~2 &&
 	git branch --list >actual &&
-	test_i18ngrep "rebasing detached HEAD $oid" actual
+	test_grep "rebasing detached HEAD $oid" actual
 '
 
 test_expect_success 'tracking with unexpected .fetch refspec' '
diff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh
index b17f388f56..235c68fb02 100755
--- a/t/t3202-show-branch.sh
+++ b/t/t3202-show-branch.sh
@@ -253,7 +253,7 @@ test_expect_success 'error descriptions on orphan branch' '
 	test_branch_op_in_wt() {
 		test_orphan_error() {
 			test_must_fail git $* 2>actual &&
-			test_i18ngrep "No commit on branch .orphan-branch. yet.$" actual
+			test_grep "No commit on branch .orphan-branch. yet.$" actual
 		} &&
 		test_orphan_error -C wt branch $1 $2 &&                # implicit branch
 		test_orphan_error -C wt branch $1 orphan-branch $2 &&  # explicit branch
diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh
index b5f4d6a653..cfeb8c84b0 100755
--- a/t/t3206-range-diff.sh
+++ b/t/t3206-range-diff.sh
@@ -195,7 +195,7 @@ test_expect_success 'A^! and A^-<n> (unmodified)' '
 
 test_expect_success 'A^{/..} is not mistaken for a range' '
 	test_must_fail git range-diff topic^.. topic^{/..} -- 2>error &&
-	test_i18ngrep "not a commit range" error
+	test_grep "not a commit range" error
 '
 
 test_expect_success 'trivial reordering' '
@@ -537,7 +537,7 @@ do
 			main..unmodified >actual &&
 		test_when_finished "rm 000?-*" &&
 		test_line_count = 5 actual &&
-		test_i18ngrep "^Range-diff:$" 0000-* &&
+		test_grep "^Range-diff:$" 0000-* &&
 		grep "= 1: .* s/5/A" 0000-* &&
 		grep "= 2: .* s/4/A" 0000-* &&
 		grep "= 3: .* s/11/B" 0000-* &&
@@ -549,7 +549,7 @@ test_expect_success 'format-patch --range-diff as commentary' '
 	git format-patch --range-diff=HEAD~1 HEAD~1 >actual &&
 	test_when_finished "rm 0001-*" &&
 	test_line_count = 1 actual &&
-	test_i18ngrep "^Range-diff:$" 0001-* &&
+	test_grep "^Range-diff:$" 0001-* &&
 	grep "> 1: .* new message" 0001-*
 '
 
@@ -557,7 +557,7 @@ test_expect_success 'format-patch --range-diff reroll-count with a non-integer'
 	git format-patch --range-diff=HEAD~1 -v2.9 HEAD~1 >actual &&
 	test_when_finished "rm v2.9-0001-*" &&
 	test_line_count = 1 actual &&
-	test_i18ngrep "^Range-diff:$" v2.9-0001-* &&
+	test_grep "^Range-diff:$" v2.9-0001-* &&
 	grep "> 1: .* new message" v2.9-0001-*
 '
 
@@ -565,7 +565,7 @@ test_expect_success 'format-patch --range-diff reroll-count with a integer' '
 	git format-patch --range-diff=HEAD~1 -v2 HEAD~1 >actual &&
 	test_when_finished "rm v2-0001-*" &&
 	test_line_count = 1 actual &&
-	test_i18ngrep "^Range-diff ..* v1:$" v2-0001-* &&
+	test_grep "^Range-diff ..* v1:$" v2-0001-* &&
 	grep "> 1: .* new message" v2-0001-*
 '
 
@@ -573,7 +573,7 @@ test_expect_success 'format-patch --range-diff with v0' '
 	git format-patch --range-diff=HEAD~1 -v0 HEAD~1 >actual &&
 	test_when_finished "rm v0-0001-*" &&
 	test_line_count = 1 actual &&
-	test_i18ngrep "^Range-diff:$" v0-0001-* &&
+	test_grep "^Range-diff:$" v0-0001-* &&
 	grep "> 1: .* new message" v0-0001-*
 '
 
@@ -670,7 +670,7 @@ test_expect_success 'format-patch --range-diff does not compare notes by default
 		main..unmodified >actual &&
 	test_when_finished "rm 000?-*" &&
 	test_line_count = 5 actual &&
-	test_i18ngrep "^Range-diff:$" 0000-* &&
+	test_grep "^Range-diff:$" 0000-* &&
 	grep "= 1: .* s/5/A" 0000-* &&
 	grep "= 2: .* s/4/A" 0000-* &&
 	grep "= 3: .* s/11/B" 0000-* &&
@@ -687,7 +687,7 @@ test_expect_success 'format-patch --range-diff with --no-notes' '
 		main..unmodified >actual &&
 	test_when_finished "rm 000?-*" &&
 	test_line_count = 5 actual &&
-	test_i18ngrep "^Range-diff:$" 0000-* &&
+	test_grep "^Range-diff:$" 0000-* &&
 	grep "= 1: .* s/5/A" 0000-* &&
 	grep "= 2: .* s/4/A" 0000-* &&
 	grep "= 3: .* s/11/B" 0000-* &&
@@ -704,7 +704,7 @@ test_expect_success 'format-patch --range-diff with --notes' '
 		main..unmodified >actual &&
 	test_when_finished "rm 000?-*" &&
 	test_line_count = 5 actual &&
-	test_i18ngrep "^Range-diff:$" 0000-* &&
+	test_grep "^Range-diff:$" 0000-* &&
 	grep "= 1: .* s/5/A" 0000-* &&
 	grep "= 2: .* s/4/A" 0000-* &&
 	grep "= 3: .* s/11/B" 0000-* &&
@@ -733,7 +733,7 @@ test_expect_success 'format-patch --range-diff with format.notes config' '
 		main..unmodified >actual &&
 	test_when_finished "rm 000?-*" &&
 	test_line_count = 5 actual &&
-	test_i18ngrep "^Range-diff:$" 0000-* &&
+	test_grep "^Range-diff:$" 0000-* &&
 	grep "= 1: .* s/5/A" 0000-* &&
 	grep "= 2: .* s/4/A" 0000-* &&
 	grep "= 3: .* s/11/B" 0000-* &&
@@ -764,7 +764,7 @@ test_expect_success 'format-patch --range-diff with multiple notes' '
 		main..unmodified >actual &&
 	test_when_finished "rm 000?-*" &&
 	test_line_count = 5 actual &&
-	test_i18ngrep "^Range-diff:$" 0000-* &&
+	test_grep "^Range-diff:$" 0000-* &&
 	grep "= 1: .* s/5/A" 0000-* &&
 	grep "= 2: .* s/4/A" 0000-* &&
 	grep "= 3: .* s/11/B" 0000-* &&
diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh
index 7326adb70f..7f4e98db7d 100755
--- a/t/t3210-pack-refs.sh
+++ b/t/t3210-pack-refs.sh
@@ -227,7 +227,7 @@ test_expect_success 'notice d/f conflict with existing directory' '
 
 test_expect_success 'existing directory reports concrete ref' '
 	test_must_fail git branch foo 2>stderr &&
-	test_i18ngrep refs/heads/foo/bar/baz stderr
+	test_grep refs/heads/foo/bar/baz stderr
 '
 
 test_expect_success 'notice d/f conflict with existing ref' '
diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh
index d734000d2f..cf23c06c09 100755
--- a/t/t3301-notes.sh
+++ b/t/t3301-notes.sh
@@ -1469,9 +1469,9 @@ test_expect_success 'GIT_NOTES_REWRITE_REF overrides config' '
 
 test_expect_success 'git notes copy diagnoses too many or too few arguments' '
 	test_must_fail git notes copy 2>error &&
-	test_i18ngrep "too few arguments" error &&
+	test_grep "too few arguments" error &&
 	test_must_fail git notes copy one two three 2>error &&
-	test_i18ngrep "too many arguments" error
+	test_grep "too many arguments" error
 '
 
 test_expect_success 'git notes get-ref expands refs/heads/main to refs/notes/refs/heads/main' '
diff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh
index d3d72e25fe..60d6ed2dc8 100755
--- a/t/t3310-notes-merge-manual-resolve.sh
+++ b/t/t3310-notes-merge-manual-resolve.sh
@@ -216,7 +216,7 @@ test_expect_success 'merge z into m (== y) with default ("manual") resolver => C
 	git config core.notesRef refs/notes/m &&
 	test_must_fail git notes merge z >output 2>&1 &&
 	# Output should point to where to resolve conflicts
-	test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
+	test_grep "\\.git/NOTES_MERGE_WORKTREE" output &&
 	# Inspect merge conflicts
 	ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
 	test_cmp expect_conflicts output_conflicts &&
@@ -263,7 +263,7 @@ test_expect_success 'cannot do merge w/conflicts when previous merge is unfinish
 	test -d .git/NOTES_MERGE_WORKTREE &&
 	test_must_fail git notes merge z >output 2>&1 &&
 	# Output should indicate what is wrong
-	test_i18ngrep -q "\\.git/NOTES_MERGE_\\* exists" output
+	test_grep -q "\\.git/NOTES_MERGE_\\* exists" output
 '
 
 # Setup non-conflicting merge between x and new notes ref w
@@ -417,7 +417,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol
 	git config core.notesRef refs/notes/m &&
 	test_must_fail git notes merge z >output 2>&1 &&
 	# Output should point to where to resolve conflicts
-	test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
+	test_grep "\\.git/NOTES_MERGE_WORKTREE" output &&
 	# Inspect merge conflicts
 	ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
 	test_cmp expect_conflicts output_conflicts &&
@@ -449,7 +449,7 @@ git rev-parse refs/notes/z > pre_merge_z
 test_expect_success 'redo merge of z into m (== y) with default ("manual") resolver => Conflicting 3-way merge' '
 	test_must_fail git notes merge z >output 2>&1 &&
 	# Output should point to where to resolve conflicts
-	test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
+	test_grep "\\.git/NOTES_MERGE_WORKTREE" output &&
 	# Inspect merge conflicts
 	ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
 	test_cmp expect_conflicts output_conflicts &&
@@ -528,7 +528,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol
 	git update-ref refs/notes/m refs/notes/y &&
 	test_must_fail git notes merge z >output 2>&1 &&
 	# Output should point to where to resolve conflicts
-	test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
+	test_grep "\\.git/NOTES_MERGE_WORKTREE" output &&
 	# Inspect merge conflicts
 	ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
 	test_cmp expect_conflicts output_conflicts &&
@@ -573,9 +573,9 @@ EOF
 	test "$(git rev-parse refs/notes/y)" = "$(git rev-parse NOTES_MERGE_PARTIAL^1)" &&
 	test "$(git rev-parse refs/notes/m)" != "$(git rev-parse NOTES_MERGE_PARTIAL^1)" &&
 	# Mention refs/notes/m, and its current and expected value in output
-	test_i18ngrep -q "refs/notes/m" output &&
-	test_i18ngrep -q "$(git rev-parse refs/notes/m)" output &&
-	test_i18ngrep -q "$(git rev-parse NOTES_MERGE_PARTIAL^1)" output &&
+	test_grep -q "refs/notes/m" output &&
+	test_grep -q "$(git rev-parse refs/notes/m)" output &&
+	test_grep -q "$(git rev-parse NOTES_MERGE_PARTIAL^1)" output &&
 	# Verify that other notes refs has not changed (w, x, y and z)
 	verify_notes w &&
 	verify_notes x &&
diff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh
index bff0aea550..0fd33280cf 100755
--- a/t/t3320-notes-merge-worktrees.sh
+++ b/t/t3320-notes-merge-worktrees.sh
@@ -57,7 +57,7 @@ test_expect_success 'merge z into y while mid-merge in another workdir fails' '
 		cd worktree &&
 		git config core.notesRef refs/notes/y &&
 		test_must_fail git notes merge z 2>err &&
-		test_i18ngrep "a notes merge into refs/notes/y is already in-progress at" err
+		test_grep "a notes merge into refs/notes/y is already in-progress at" err
 	) &&
 	test_must_fail git -C worktree symbolic-ref NOTES_MERGE_REF
 '
@@ -67,7 +67,7 @@ test_expect_success 'merge z into x while mid-merge on y succeeds' '
 		cd worktree2 &&
 		git config core.notesRef refs/notes/x &&
 		test_must_fail git notes merge z >out 2>&1 &&
-		test_i18ngrep "Automatic notes merge failed" out &&
+		test_grep "Automatic notes merge failed" out &&
 		grep -v "A notes merge into refs/notes/x is already in-progress in" out
 	) &&
 	echo "refs/notes/x" >expect &&
diff --git a/t/t3321-notes-stripspace.sh b/t/t3321-notes-stripspace.sh
index 028d825e8f..33c1322989 100755
--- a/t/t3321-notes-stripspace.sh
+++ b/t/t3321-notes-stripspace.sh
@@ -428,7 +428,7 @@ test_expect_success 'add notes with empty messages' '
 	git notes add -m "${LF}" \
 		      -m "${MULTI_LF}" \
 		      -m "${LF}" >actual 2>&1 &&
-	test_i18ngrep "Removing note for object" actual
+	test_grep "Removing note for object" actual
 '
 
 test_expect_success 'add note by specifying "-C", "--no-stripspace" is the default behavior' '
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index 3ce918fdb8..621c8ef84c 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -143,8 +143,8 @@ test_expect_success 'Show verbose error when HEAD could not be detached' '
 	>B &&
 	test_when_finished "rm -f B" &&
 	test_must_fail git rebase topic 2>output.err >output.out &&
-	test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" output.err &&
-	test_i18ngrep B output.err
+	test_grep "The following untracked working tree files would be overwritten by checkout:" output.err &&
+	test_grep B output.err
 '
 
 test_expect_success 'fail when upstream arg is missing and not on branch' '
@@ -421,7 +421,7 @@ test_expect_success 'refuse to switch to branch checked out elsewhere' '
 	git checkout main &&
 	git worktree add wt &&
 	test_must_fail git -C wt rebase main main 2>err &&
-	test_i18ngrep "already checked out" err
+	test_grep "already checked out" err
 '
 
 test_expect_success MINGW,SYMLINKS_WINDOWS 'rebase when .git/logs is a symlink' '
diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh
index e9e03ca4b5..5c67d07ba3 100755
--- a/t/t3402-rebase-merge.sh
+++ b/t/t3402-rebase-merge.sh
@@ -171,7 +171,7 @@ test_expect_success '--reapply-cherry-picks' '
 
 	# Regular rebase fails, because the 1-11 commit is deduplicated
 	test_must_fail git -C repo rebase --merge main 2> err &&
-	test_i18ngrep "error: could not apply.*add 12 in another branch" err &&
+	test_grep "error: could not apply.*add 12 in another branch" err &&
 	git -C repo rebase --abort &&
 
 	# With --reapply-cherry-picks, it works
diff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh
index f6e4864497..a1911c4a9d 100755
--- a/t/t3403-rebase-skip.sh
+++ b/t/t3403-rebase-skip.sh
@@ -108,10 +108,10 @@ test_expect_success 'correct advice upon picking empty commit' '
 	test_when_finished "git rebase --abort" &&
 	test_must_fail git rebase -i --onto goodbye \
 		amended-goodbye^ amended-goodbye 2>err &&
-	test_i18ngrep "previous cherry-pick is now empty" err &&
-	test_i18ngrep "git rebase --skip" err &&
+	test_grep "previous cherry-pick is now empty" err &&
+	test_grep "git rebase --skip" err &&
 	test_must_fail git commit &&
-	test_i18ngrep "git rebase --skip" err
+	test_grep "git rebase --skip" err
 '
 
 test_expect_success 'correct authorship when committing empty pick' '
@@ -131,10 +131,10 @@ test_expect_success 'correct advice upon rewording empty commit' '
 		test_must_fail env FAKE_LINES="reword 1" git rebase -i \
 			--onto goodbye amended-goodbye^ amended-goodbye 2>err
 	) &&
-	test_i18ngrep "previous cherry-pick is now empty" err &&
-	test_i18ngrep "git rebase --skip" err &&
+	test_grep "previous cherry-pick is now empty" err &&
+	test_grep "git rebase --skip" err &&
 	test_must_fail git commit &&
-	test_i18ngrep "git rebase --skip" err
+	test_grep "git rebase --skip" err
 '
 
 test_expect_success 'correct advice upon editing empty commit' '
@@ -144,10 +144,10 @@ test_expect_success 'correct advice upon editing empty commit' '
 		test_must_fail env FAKE_LINES="edit 1" git rebase -i \
 			--onto goodbye amended-goodbye^ amended-goodbye 2>err
 	) &&
-	test_i18ngrep "previous cherry-pick is now empty" err &&
-	test_i18ngrep "git rebase --skip" err &&
+	test_grep "previous cherry-pick is now empty" err &&
+	test_grep "git rebase --skip" err &&
 	test_must_fail git commit &&
-	test_i18ngrep "git rebase --skip" err
+	test_grep "git rebase --skip" err
 '
 
 test_expect_success 'correct advice upon cherry-picking an empty commit during a rebase' '
@@ -157,10 +157,10 @@ test_expect_success 'correct advice upon cherry-picking an empty commit during a
 		test_must_fail env FAKE_LINES="1 exec_git_cherry-pick_amended-goodbye" \
 			git rebase -i goodbye^ goodbye 2>err
 	) &&
-	test_i18ngrep "previous cherry-pick is now empty" err &&
-	test_i18ngrep "git cherry-pick --skip" err &&
+	test_grep "previous cherry-pick is now empty" err &&
+	test_grep "git cherry-pick --skip" err &&
 	test_must_fail git commit 2>err &&
-	test_i18ngrep "git cherry-pick --skip" err
+	test_grep "git cherry-pick --skip" err
 '
 
 test_expect_success 'correct advice upon multi cherry-pick picking an empty commit during a rebase' '
@@ -170,10 +170,10 @@ test_expect_success 'correct advice upon multi cherry-pick picking an empty comm
 		test_must_fail env FAKE_LINES="1 exec_git_cherry-pick_goodbye_amended-goodbye" \
 			git rebase -i goodbye^^ goodbye 2>err
 	) &&
-	test_i18ngrep "previous cherry-pick is now empty" err &&
-	test_i18ngrep "git cherry-pick --skip" err &&
+	test_grep "previous cherry-pick is now empty" err &&
+	test_grep "git cherry-pick --skip" err &&
 	test_must_fail git commit 2>err &&
-	test_i18ngrep "git cherry-pick --skip" err
+	test_grep "git cherry-pick --skip" err
 '
 
 test_expect_success 'fixup that empties commit fails' '
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 96a56aafbe..dbd5df5aa4 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -291,9 +291,9 @@ test_expect_success 'abort with error when new base cannot be checked out' '
 	git rm --cached file1 &&
 	git commit -m "remove file in base" &&
 	test_must_fail git rebase -i primary > output 2>&1 &&
-	test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" \
+	test_grep "The following untracked working tree files would be overwritten by checkout:" \
 		output &&
-	test_i18ngrep "file1" output &&
+	test_grep "file1" output &&
 	test_path_is_missing .git/rebase-merge &&
 	rm file1 &&
 	git reset --hard HEAD^
@@ -604,7 +604,7 @@ test_expect_success 'clean error after failed "exec"' '
 	echo "edited again" > file7 &&
 	git add file7 &&
 	test_must_fail git rebase --continue 2>error &&
-	test_i18ngrep "you have staged changes in your working tree" error
+	test_grep "you have staged changes in your working tree" error
 '
 
 test_expect_success 'rebase a detached HEAD' '
@@ -955,7 +955,7 @@ test_expect_success 'rebase --exec works without -i ' '
 	git reset --hard execute &&
 	rm -rf exec_output &&
 	EDITOR="echo >invoked_editor" git rebase --exec "echo a line >>exec_output"  HEAD~2 2>actual &&
-	test_i18ngrep  "Successfully rebased and updated" actual &&
+	test_grep  "Successfully rebased and updated" actual &&
 	test_line_count = 2 exec_output &&
 	test_path_is_missing invoked_editor
 '
@@ -963,7 +963,7 @@ test_expect_success 'rebase --exec works without -i ' '
 test_expect_success 'rebase -i --exec without <CMD>' '
 	git reset --hard execute &&
 	test_must_fail git rebase -i --exec 2>actual &&
-	test_i18ngrep "requires a value" actual &&
+	test_grep "requires a value" actual &&
 	git checkout primary
 '
 
@@ -1272,7 +1272,7 @@ test_expect_success 'todo count' '
 		test_set_editor "$(pwd)/dump-raw.sh" &&
 		git rebase -i HEAD~4 >actual
 	) &&
-	test_i18ngrep "^# Rebase ..* onto ..* ([0-9]" actual
+	test_grep "^# Rebase ..* onto ..* ([0-9]" actual
 '
 
 test_expect_success 'rebase -i commits that overwrite untracked files (pick)' '
@@ -1379,7 +1379,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = ignore' '
 		FAKE_LINES="1 2 3 4" git rebase -i --root 2>actual
 	) &&
 	test D = $(git cat-file commit HEAD | sed -ne \$p) &&
-	test_i18ngrep \
+	test_grep \
 		"Successfully rebased and updated refs/heads/missing-commit" \
 		actual
 '
@@ -1442,7 +1442,7 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = ig
 		git rebase --continue 2>actual
 	) &&
 	test D = $(git cat-file commit HEAD | sed -ne \$p) &&
-	test_i18ngrep \
+	test_grep \
 		"Successfully rebased and updated refs/heads/missing-commit" \
 		actual
 '
@@ -1477,7 +1477,7 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = wa
 		git rebase --continue 2>actual
 	) &&
 	test D = $(git cat-file commit HEAD | sed -ne \$p) &&
-	test_i18ngrep \
+	test_grep \
 		"Successfully rebased and updated refs/heads/missing-commit" \
 		actual
 '
@@ -1525,7 +1525,7 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = er
 		git rebase --continue 2>actual
 	) &&
 	test D = $(git cat-file commit HEAD | sed -ne \$p) &&
-	test_i18ngrep \
+	test_grep \
 		"Successfully rebased and updated refs/heads/missing-commit" \
 		actual
 '
@@ -1585,9 +1585,9 @@ test_expect_success 'static check of bad command' '
 		set_fake_editor &&
 		test_must_fail env FAKE_LINES="1 2 3 bad 4 5" \
 		git rebase -i --root 2>actual &&
-		test_i18ngrep "pickled $(git rev-list --oneline -1 primary~1)" \
+		test_grep "pickled $(git rev-list --oneline -1 primary~1)" \
 				actual &&
-		test_i18ngrep "You can fix this with .git rebase --edit-todo.." \
+		test_grep "You can fix this with .git rebase --edit-todo.." \
 				actual &&
 		FAKE_LINES="1 2 3 drop 4 5" git rebase --edit-todo
 	) &&
@@ -1645,8 +1645,8 @@ test_expect_success 'static check of bad SHA-1' '
 		set_fake_editor &&
 		test_must_fail env FAKE_LINES="1 2 edit fakesha 3 4 5 #" \
 			git rebase -i --root 2>actual &&
-			test_i18ngrep "edit XXXXXXX False commit" actual &&
-			test_i18ngrep "You can fix this with .git rebase --edit-todo.." \
+			test_grep "edit XXXXXXX False commit" actual &&
+			test_grep "You can fix this with .git rebase --edit-todo.." \
 					actual &&
 		FAKE_LINES="1 2 4 5 6" git rebase --edit-todo
 	) &&
@@ -1673,7 +1673,7 @@ test_expect_success 'rebase -i --gpg-sign=<key-id>' '
 		FAKE_LINES="edit 1" git rebase -i --gpg-sign="\"S I Gner\"" \
 			HEAD^ >out 2>err
 	) &&
-	test_i18ngrep "$SQ-S\"S I Gner\"$SQ" err
+	test_grep "$SQ-S\"S I Gner\"$SQ" err
 '
 
 test_expect_success 'rebase -i --gpg-sign=<key-id> overrides commit.gpgSign' '
@@ -1684,7 +1684,7 @@ test_expect_success 'rebase -i --gpg-sign=<key-id> overrides commit.gpgSign' '
 		FAKE_LINES="edit 1" git rebase -i --gpg-sign="\"S I Gner\"" \
 			HEAD^ >out 2>err
 	) &&
-	test_i18ngrep "$SQ-S\"S I Gner\"$SQ" err
+	test_grep "$SQ-S\"S I Gner\"$SQ" err
 '
 
 test_expect_success 'valid author header after --root swap' '
@@ -1738,7 +1738,7 @@ test_expect_success 'correct error message for partial commit after empty pick'
 	) &&
 	echo x >file1 &&
 	test_must_fail git commit file1 2>err &&
-	test_i18ngrep "cannot do a partial commit during a rebase." err
+	test_grep "cannot do a partial commit during a rebase." err
 '
 
 test_expect_success 'correct error message for commit --amend after empty pick' '
@@ -1751,13 +1751,13 @@ test_expect_success 'correct error message for commit --amend after empty pick'
 	) &&
 	echo x>file1 &&
 	test_must_fail git commit -a --amend 2>err &&
-	test_i18ngrep "middle of a rebase -- cannot amend." err
+	test_grep "middle of a rebase -- cannot amend." err
 '
 
 test_expect_success 'todo has correct onto hash' '
 	GIT_SEQUENCE_EDITOR=cat git rebase -i no-conflict-branch~4 no-conflict-branch >actual &&
 	onto=$(git rev-parse --short HEAD~4) &&
-	test_i18ngrep "^# Rebase ..* onto $onto" actual
+	test_grep "^# Rebase ..* onto $onto" actual
 '
 
 test_expect_success 'ORIG_HEAD is updated correctly' '
diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh
index ceca160005..a1d7fa7f7c 100755
--- a/t/t3406-rebase-message.sh
+++ b/t/t3406-rebase-message.sh
@@ -33,24 +33,24 @@ test_expect_success 'rebase -m' '
 
 test_expect_success 'rebase against main twice' '
 	git rebase --apply main >out &&
-	test_i18ngrep "Current branch topic is up to date" out
+	test_grep "Current branch topic is up to date" out
 '
 
 test_expect_success 'rebase against main twice with --force' '
 	git rebase --force-rebase --apply main >out &&
-	test_i18ngrep "Current branch topic is up to date, rebase forced" out
+	test_grep "Current branch topic is up to date, rebase forced" out
 '
 
 test_expect_success 'rebase against main twice from another branch' '
 	git checkout topic^ &&
 	git rebase --apply main topic >out &&
-	test_i18ngrep "Current branch topic is up to date" out
+	test_grep "Current branch topic is up to date" out
 '
 
 test_expect_success 'rebase fast-forward to main' '
 	git checkout topic^ &&
 	git rebase --apply topic >out &&
-	test_i18ngrep "Fast-forwarded HEAD to topic" out
+	test_grep "Fast-forwarded HEAD to topic" out
 '
 
 test_expect_success 'rebase --stat' '
@@ -75,14 +75,14 @@ test_expect_success 'rebase -n overrides config rebase.stat config' '
 
 test_expect_success 'rebase --onto outputs the invalid ref' '
 	test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err &&
-	test_i18ngrep "invalid-ref" err
+	test_grep "invalid-ref" err
 '
 
 test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' '
 	test_must_fail git rebase -Cnot-a-number HEAD 2>err &&
-	test_i18ngrep "numerical value" err &&
+	test_grep "numerical value" err &&
 	test_must_fail git rebase --whitespace=bad HEAD 2>err &&
-	test_i18ngrep "Invalid whitespace option" err
+	test_grep "Invalid whitespace option" err
 '
 
 write_reflog_expect () {
@@ -251,8 +251,8 @@ test_expect_success 'rebase -i onto unrelated history' '
 	git -C unrelated remote add -f origin "$PWD" &&
 	git -C unrelated branch --set-upstream-to=origin/main &&
 	git -C unrelated -c core.editor=true rebase -i -v --stat >actual &&
-	test_i18ngrep "Changes to " actual &&
-	test_i18ngrep "5 files changed" actual
+	test_grep "Changes to " actual &&
+	test_grep "5 files changed" actual
 '
 
 test_done
diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh
index fb7b68990c..108d5c28fa 100755
--- a/t/t3418-rebase-continue.sh
+++ b/t/t3418-rebase-continue.sh
@@ -182,8 +182,8 @@ test_expect_success '--skip after failed fixup cleans commit message' '
 
 	: Final squash failed, but there was still a squash &&
 	head -n1 .git/copy.txt >first-line &&
-	test_i18ngrep "# This is a combination of 3 commits" first-line &&
-	test_i18ngrep "# This is the commit message #3:" .git/copy.txt
+	test_grep "# This is a combination of 3 commits" first-line &&
+	test_grep "# This is the commit message #3:" .git/copy.txt
 '
 
 test_expect_success 'setup rerere database' '
@@ -276,7 +276,7 @@ test_expect_success '--reschedule-failed-exec' '
 	test_must_fail git -c rebase.rescheduleFailedExec=true \
 		rebase -x false HEAD^ 2>err &&
 	grep "^exec false" .git/rebase-merge/git-rebase-todo &&
-	test_i18ngrep "has been rescheduled" err
+	test_grep "has been rescheduled" err
 '
 
 test_expect_success 'rebase.rescheduleFailedExec only affects `rebase -i`' '
diff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh
index 4bfc779bb8..0bb284d61d 100755
--- a/t/t3431-rebase-fork-point.sh
+++ b/t/t3431-rebase-fork-point.sh
@@ -84,7 +84,7 @@ test_expect_success 'git rebase --fork-point with ambigous refname' '
 
 test_expect_success '--fork-point and --root both given' '
 	test_must_fail git rebase --fork-point --root 2>err &&
-	test_i18ngrep "cannot be used together" err
+	test_grep "cannot be used together" err
 '
 
 test_expect_success 'rebase.forkPoint set to false' '
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index e2ef619323..3eac20c098 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh
@@ -43,7 +43,7 @@ test_expect_success 'cherry-pick --nonsense' '
 	git diff --exit-code HEAD &&
 	test_must_fail git cherry-pick --nonsense 2>msg &&
 	git diff --exit-code HEAD "$pos" &&
-	test_i18ngrep "[Uu]sage:" msg
+	test_grep "[Uu]sage:" msg
 '
 
 test_expect_success 'revert --nonsense' '
@@ -52,7 +52,7 @@ test_expect_success 'revert --nonsense' '
 	git diff --exit-code HEAD &&
 	test_must_fail git revert --nonsense 2>msg &&
 	git diff --exit-code HEAD "$pos" &&
-	test_i18ngrep "[Uu]sage:" msg
+	test_grep "[Uu]sage:" msg
 '
 
 # the following two test cherry-pick and revert with renames
@@ -99,7 +99,7 @@ test_expect_success 'revert forbidden on dirty working tree' '
 	echo content >extra_file &&
 	git add extra_file &&
 	test_must_fail git revert HEAD 2>errors &&
-	test_i18ngrep "your local changes would be overwritten by " errors
+	test_grep "your local changes would be overwritten by " errors
 
 '
 
diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh
index f32799e046..c88d597b12 100755
--- a/t/t3507-cherry-pick-conflict.sh
+++ b/t/t3507-cherry-pick-conflict.sh
@@ -177,7 +177,7 @@ test_expect_success 'partial commit of cherry-pick fails' '
 	git add foo &&
 	test_must_fail git commit foo 2>err &&
 
-	test_i18ngrep "cannot do a partial commit during a cherry-pick." err
+	test_grep "cannot do a partial commit during a cherry-pick." err
 '
 
 test_expect_success 'commit --amend of cherry-pick fails' '
@@ -188,7 +188,7 @@ test_expect_success 'commit --amend of cherry-pick fails' '
 	git add foo &&
 	test_must_fail git commit --amend 2>err &&
 
-	test_i18ngrep "in the middle of a cherry-pick -- cannot amend." err
+	test_grep "in the middle of a cherry-pick -- cannot amend." err
 '
 
 test_expect_success 'successful final commit clears cherry-pick state' '
@@ -498,7 +498,7 @@ test_expect_success \
 test_expect_success 'failed cherry-pick does not forget -s' '
 	pristine_detach initial &&
 	test_must_fail git cherry-pick -s picked &&
-	test_i18ngrep -e "Signed-off-by" .git/MERGE_MSG
+	test_grep -e "Signed-off-by" .git/MERGE_MSG
 '
 
 test_expect_success 'commit after failed cherry-pick does not add duplicated -s' '
@@ -563,7 +563,7 @@ test_expect_success 'cherry-pick preserves sparse-checkout' '
 	echo /unrelated >.git/info/sparse-checkout &&
 	git read-tree --reset -u HEAD &&
 	test_must_fail git cherry-pick -Xours picked>actual &&
-	test_i18ngrep ! "Changes not staged for commit:" actual
+	test_grep ! "Changes not staged for commit:" actual
 '
 
 test_expect_success 'cherry-pick --continue remembers --keep-redundant-commits' '
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index 3b0fa66c33..72020a51c4 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh
@@ -154,7 +154,7 @@ test_expect_success 'skip "empty" commit' '
 	pristine_detach picked &&
 	test_commit dummy foo d &&
 	test_must_fail git cherry-pick anotherpick 2>err &&
-	test_i18ngrep "git cherry-pick --skip" err &&
+	test_grep "git cherry-pick --skip" err &&
 	git cherry-pick --skip &&
 	test_cmp_rev dummy HEAD
 '
@@ -314,7 +314,7 @@ test_expect_success '--abort does not unsafely change HEAD' '
 	git reset --hard base &&
 	test_must_fail git cherry-pick picked anotherpick &&
 	git cherry-pick --abort 2>actual &&
-	test_i18ngrep "You seem to have moved HEAD" actual &&
+	test_grep "You seem to have moved HEAD" actual &&
 	test_cmp_rev base HEAD
 '
 
@@ -520,7 +520,7 @@ test_expect_success '--continue asks for help after resolving patch to nil' '
 	test_cmp_rev unrelatedpick CHERRY_PICK_HEAD &&
 	git checkout HEAD -- unrelated &&
 	test_must_fail git cherry-pick --continue 2>msg &&
-	test_i18ngrep "The previous cherry-pick is now empty" msg
+	test_grep "The previous cherry-pick is now empty" msg
 '
 
 test_expect_success 'follow advice and skip nil patch' '
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 0e8afe49ed..98259e2ada 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -276,7 +276,7 @@ test_expect_success 'Resolving by removal is not a warning-worthy event' '
 	blob=$(echo blob | git hash-object -w --stdin) &&
 	printf "100644 $blob %d\tblob\n" 1 2 3 | git update-index --index-info &&
 	git rm blob >msg 2>&1 &&
-	test_i18ngrep ! "needs merge" msg &&
+	test_grep ! "needs merge" msg &&
 	test_must_fail git ls-files -s --error-unmatch blob
 '
 
@@ -631,7 +631,7 @@ test_expect_success 'rm of a populated submodule with a .git directory migrates
 	test_path_is_missing submod/.git &&
 	git status -s -uno --ignore-submodules=none >actual &&
 	test_file_not_empty actual &&
-	test_i18ngrep Migrating output.err
+	test_grep Migrating output.err
 '
 
 cat >expect.deepmodified <<EOF
@@ -722,7 +722,7 @@ test_expect_success "rm absorbs submodule's nested .git directory" '
 	test_path_is_missing submod/subsubmod/.git &&
 	git status -s -uno --ignore-submodules=none >actual &&
 	test_file_not_empty actual &&
-	test_i18ngrep Migrating output.err
+	test_grep Migrating output.err
 '
 
 test_expect_success 'checking out a commit after submodule removal needs manual updates' '
@@ -731,7 +731,7 @@ test_expect_success 'checking out a commit after submodule removal needs manual
 	git submodule update &&
 	git checkout -q HEAD^ &&
 	git checkout -q main 2>actual &&
-	test_i18ngrep "^warning: unable to rmdir '\''submod'\'':" actual &&
+	test_grep "^warning: unable to rmdir '\''submod'\'':" actual &&
 	git status -s submod >actual &&
 	echo "?? submod/" >expected &&
 	test_cmp expected actual &&
diff --git a/t/t3601-rm-pathspec-file.sh b/t/t3601-rm-pathspec-file.sh
index a2a0c820fe..7cef12981c 100755
--- a/t/t3601-rm-pathspec-file.sh
+++ b/t/t3601-rm-pathspec-file.sh
@@ -67,14 +67,14 @@ test_expect_success 'error conditions' '
 	echo fileA.t >list &&
 
 	test_must_fail git rm --pathspec-from-file=list -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git rm --pathspec-file-nul 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
 
 	>empty_list &&
 	test_must_fail git rm --pathspec-from-file=empty_list 2>err &&
-	test_i18ngrep -e "No pathspec was given. Which files should I remove?" err
+	test_grep -e "No pathspec was given. Which files should I remove?" err
 '
 
 test_done
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 7623689da2..f23d39f0d5 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -438,7 +438,7 @@ test_expect_success 'git add --chmod fails with non regular files (but updates t
 	test_ln_s_add foo foo3 &&
 	touch foo4 &&
 	test_must_fail git add --chmod=+x foo3 foo4 2>stderr &&
-	test_i18ngrep "cannot chmod +x .foo3." stderr &&
+	test_grep "cannot chmod +x .foo3." stderr &&
 	test_mode_in_index 120000 foo3 &&
 	test_mode_in_index 100755 foo4
 '
@@ -455,12 +455,12 @@ test_expect_success 'git add --chmod --dry-run reports error for non regular fil
 	git reset --hard &&
 	test_ln_s_add foo foo4 &&
 	test_must_fail git add --chmod=+x --dry-run foo4 2>stderr &&
-	test_i18ngrep "cannot chmod +x .foo4." stderr
+	test_grep "cannot chmod +x .foo4." stderr
 '
 
 test_expect_success 'git add --chmod --dry-run reports error for unmatched pathspec' '
 	test_must_fail git add --chmod=+x --dry-run nonexistent 2>stderr &&
-	test_i18ngrep "pathspec .nonexistent. did not match any files" stderr
+	test_grep "pathspec .nonexistent. did not match any files" stderr
 '
 
 test_expect_success 'no file status change if no pathspec is given' '
diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
index 34aabb7f5f..0b5339ac6c 100755
--- a/t/t3701-add-interactive.sh
+++ b/t/t3701-add-interactive.sh
@@ -335,12 +335,12 @@ test_expect_success 'different prompts for mode change/deleted' '
 test_expect_success 'correct message when there is nothing to do' '
 	git reset --hard &&
 	git add -p 2>err &&
-	test_i18ngrep "No changes" err &&
+	test_grep "No changes" err &&
 	printf "\\0123" >binary &&
 	git add binary &&
 	printf "\\0abc" >binary &&
 	git add -p 2>err &&
-	test_i18ngrep "Only binary files changed" err
+	test_grep "Only binary files changed" err
 '
 
 test_expect_success 'setup again' '
@@ -497,7 +497,7 @@ test_expect_success 'adding an empty file' '
 
 		echo y | git checkout -p added-file -- >actual &&
 		test_path_is_file empty &&
-		test_i18ngrep "Apply addition to index and worktree" actual
+		test_grep "Apply addition to index and worktree" actual
 	)
 '
 
@@ -838,7 +838,7 @@ test_expect_success 'diff.algorithm is passed to `git diff-files`' '
 	git add file &&
 	echo changed >file &&
 	test_must_fail git -c diff.algorithm=bogus add -p 2>err &&
-	test_i18ngrep "error: option diff-algorithm accepts " err
+	test_grep "error: option diff-algorithm accepts " err
 '
 
 test_expect_success 'patch-mode via -i prompts for files' '
diff --git a/t/t3704-add-pathspec-file.sh b/t/t3704-add-pathspec-file.sh
index 4e6b5177c9..3aa59f6f63 100755
--- a/t/t3704-add-pathspec-file.sh
+++ b/t/t3704-add-pathspec-file.sh
@@ -138,23 +138,23 @@ test_expect_success 'error conditions' '
 	>empty_list &&
 
 	test_must_fail git add --pathspec-from-file=list --interactive 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
 
 	test_must_fail git add --pathspec-from-file=list --patch 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
 
 	test_must_fail git add --pathspec-from-file=list --edit 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--edit. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--edit. cannot be used together" err &&
 
 	test_must_fail git add --pathspec-from-file=list -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git add --pathspec-file-nul 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
 
 	# This case succeeds, but still prints to stderr
 	git add --pathspec-from-file=empty_list 2>err &&
-	test_i18ngrep -e "Nothing specified, nothing added." err
+	test_grep -e "Nothing specified, nothing added." err
 '
 
 test_done
diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
index bfab245eb3..f27d09cfd9 100755
--- a/t/t3900-i18n-commit.sh
+++ b/t/t3900-i18n-commit.sh
@@ -45,7 +45,7 @@ test_expect_success 'UTF-8 invalid characters refused' '
 	printf "Commit message\n\nInvalid surrogate:\355\240\200\n" \
 		>"$HOME/invalid" &&
 	git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-	test_i18ngrep "did not conform" "$HOME"/stderr
+	test_grep "did not conform" "$HOME"/stderr
 '
 
 test_expect_success 'UTF-8 overlong sequences rejected' '
@@ -55,7 +55,7 @@ test_expect_success 'UTF-8 overlong sequences rejected' '
 	printf "\340\202\251ommit message\n\nThis is not a space:\300\240\n" \
 		>"$HOME/invalid" &&
 	git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-	test_i18ngrep "did not conform" "$HOME"/stderr
+	test_grep "did not conform" "$HOME"/stderr
 '
 
 test_expect_success 'UTF-8 non-characters refused' '
@@ -64,7 +64,7 @@ test_expect_success 'UTF-8 non-characters refused' '
 	printf "Commit message\n\nNon-character:\364\217\277\276\n" \
 		>"$HOME/invalid" &&
 	git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-	test_i18ngrep "did not conform" "$HOME"/stderr
+	test_grep "did not conform" "$HOME"/stderr
 '
 
 test_expect_success 'UTF-8 non-characters refused' '
@@ -73,7 +73,7 @@ test_expect_success 'UTF-8 non-characters refused' '
 	printf "Commit message\n\nNon-character:\357\267\220\n" \
 		>"$HOME/invalid" &&
 	git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-	test_i18ngrep "did not conform" "$HOME"/stderr
+	test_grep "did not conform" "$HOME"/stderr
 '
 
 for H in ISO8859-1 eucJP ISO-2022-JP
diff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh
index 4f16a735d9..4b37f78829 100755
--- a/t/t3901-i18n-patch.sh
+++ b/t/t3901-i18n-patch.sh
@@ -298,7 +298,7 @@ test_expect_success 'am --no-utf8 (U/L)' '
 
 	# commit-tree will warn that the commit message does not contain valid UTF-8
 	# as mailinfo did not convert it
-	test_i18ngrep "did not conform" err &&
+	test_grep "did not conform" err &&
 
 	check_encoding 2
 '
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 0b3dfeaea2..3bec71f056 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -395,7 +395,7 @@ test_expect_success 'stash --staged' '
 
 test_expect_success 'dont assume push with non-option args' '
 	test_must_fail git stash -q drop 2>err &&
-	test_i18ngrep -e "subcommand wasn'\''t specified; '\''push'\'' can'\''t be assumed due to unexpected token '\''drop'\''" err
+	test_grep -e "subcommand wasn'\''t specified; '\''push'\'' can'\''t be assumed due to unexpected token '\''drop'\''" err
 '
 
 test_expect_success 'stash --invalid-option' '
@@ -596,7 +596,7 @@ test_expect_success 'giving too many ref arguments does not modify files' '
 	for type in apply pop "branch stash-branch"
 	do
 		test_must_fail git stash $type stash@{0} stash@{1} 2>err &&
-		test_i18ngrep "Too many revisions" err &&
+		test_grep "Too many revisions" err &&
 		test 123456789 = $(test-tool chmtime -g file2) || return 1
 	done
 '
@@ -604,14 +604,14 @@ test_expect_success 'giving too many ref arguments does not modify files' '
 test_expect_success 'drop: too many arguments errors out (does nothing)' '
 	git stash list >expect &&
 	test_must_fail git stash drop stash@{0} stash@{1} 2>err &&
-	test_i18ngrep "Too many revisions" err &&
+	test_grep "Too many revisions" err &&
 	git stash list >actual &&
 	test_cmp expect actual
 '
 
 test_expect_success 'show: too many arguments errors out (does nothing)' '
 	test_must_fail git stash show stash@{0} stash@{1} 2>err 1>out &&
-	test_i18ngrep "Too many revisions" err &&
+	test_grep "Too many revisions" err &&
 	test_must_be_empty out
 '
 
@@ -654,7 +654,7 @@ test_expect_success 'stash branch - stashes on stack, stash-like argument' '
 
 test_expect_success 'stash branch complains with no arguments' '
 	test_must_fail git stash branch 2>err &&
-	test_i18ngrep "No branch name specified" err
+	test_grep "No branch name specified" err
 '
 
 test_expect_success 'stash show format defaults to --stat' '
diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh
index 5390eec4e3..1289ae3e07 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/t/t3905-stash-include-untracked.sh
@@ -404,7 +404,7 @@ test_expect_success 'stash show --include-untracked errors on duplicate files' '
 	) &&
 	w_commit=$(git commit-tree -p HEAD -p "$i_commit" -p "$u_commit" -m "WIP on any-branch" "$tree") &&
 	test_must_fail git stash show --include-untracked "$w_commit" 2>err &&
-	test_i18ngrep "worktree and untracked commit have duplicate entries: tracked" err
+	test_grep "worktree and untracked commit have duplicate entries: tracked" err
 '
 
 test_expect_success 'stash show --{include,only}-untracked on stashes without untracked entries' '
diff --git a/t/t3909-stash-pathspec-file.sh b/t/t3909-stash-pathspec-file.sh
index dead9f18d9..73f2dbdeb0 100755
--- a/t/t3909-stash-pathspec-file.sh
+++ b/t/t3909-stash-pathspec-file.sh
@@ -88,13 +88,13 @@ test_expect_success 'error conditions' '
 	echo fileA.t >list &&
 
 	test_must_fail git stash push --pathspec-from-file=list --patch 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
 
 	test_must_fail git stash push --pathspec-from-file=list -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git stash push --pathspec-file-nul 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err
 '
 
 test_done
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index 3dc9047044..85be1367de 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -135,25 +135,25 @@ test_expect_success 'favour same basenames over different ones' '
 	mkdir subdir &&
 	git mv another-path subdir/path1 &&
 	git status >out &&
-	test_i18ngrep "renamed: .*path1 -> subdir/path1" out
+	test_grep "renamed: .*path1 -> subdir/path1" out
 '
 
 test_expect_success 'test diff.renames=true for git status' '
 	git -c diff.renames=true status >out &&
-	test_i18ngrep "renamed: .*path1 -> subdir/path1" out
+	test_grep "renamed: .*path1 -> subdir/path1" out
 '
 
 test_expect_success 'test diff.renames=false for git status' '
 	git -c diff.renames=false status >out &&
-	test_i18ngrep ! "renamed: .*path1 -> subdir/path1" out &&
-	test_i18ngrep "new file: .*subdir/path1" out &&
-	test_i18ngrep "deleted: .*[^/]path1" out
+	test_grep ! "renamed: .*path1 -> subdir/path1" out &&
+	test_grep "new file: .*subdir/path1" out &&
+	test_grep "deleted: .*[^/]path1" out
 '
 
 test_expect_success 'favour same basenames even with minor differences' '
 	git show HEAD:path1 | sed "s/15/16/" > subdir/path1 &&
 	git status >out &&
-	test_i18ngrep "renamed: .*path1 -> subdir/path1" out
+	test_grep "renamed: .*path1 -> subdir/path1" out
 '
 
 test_expect_success 'two files with same basename and same content' '
@@ -165,7 +165,7 @@ test_expect_success 'two files with same basename and same content' '
 	git commit -m 2 &&
 	git mv dir other-dir &&
 	git status >out &&
-	test_i18ngrep "renamed: .*dir/A/file -> other-dir/A/file" out
+	test_grep "renamed: .*dir/A/file -> other-dir/A/file" out
 '
 
 test_expect_success 'setup for many rename source candidates' '
@@ -202,9 +202,9 @@ test_expect_success 'rename pretty print with nothing in common' '
 	git mv a/b/c c/b/a &&
 	git commit -m "a/b/c -> c/b/a" &&
 	git diff -M --summary HEAD^ HEAD >output &&
-	test_i18ngrep " a/b/c => c/b/a " output &&
+	test_grep " a/b/c => c/b/a " output &&
 	git diff -M --stat HEAD^ HEAD >output &&
-	test_i18ngrep " a/b/c => c/b/a " output
+	test_grep " a/b/c => c/b/a " output
 '
 
 test_expect_success 'rename pretty print with common prefix' '
@@ -212,9 +212,9 @@ test_expect_success 'rename pretty print with common prefix' '
 	git mv c/b/a c/d/e &&
 	git commit -m "c/b/a -> c/d/e" &&
 	git diff -M --summary HEAD^ HEAD >output &&
-	test_i18ngrep " c/{b/a => d/e} " output &&
+	test_grep " c/{b/a => d/e} " output &&
 	git diff -M --stat HEAD^ HEAD >output &&
-	test_i18ngrep " c/{b/a => d/e} " output
+	test_grep " c/{b/a => d/e} " output
 '
 
 test_expect_success 'rename pretty print with common suffix' '
@@ -222,9 +222,9 @@ test_expect_success 'rename pretty print with common suffix' '
 	git mv c/d/e d/e &&
 	git commit -m "c/d/e -> d/e" &&
 	git diff -M --summary HEAD^ HEAD >output &&
-	test_i18ngrep " {c/d => d}/e " output &&
+	test_grep " {c/d => d}/e " output &&
 	git diff -M --stat HEAD^ HEAD >output &&
-	test_i18ngrep " {c/d => d}/e " output
+	test_grep " {c/d => d}/e " output
 '
 
 test_expect_success 'rename pretty print with common prefix and suffix' '
@@ -232,9 +232,9 @@ test_expect_success 'rename pretty print with common prefix and suffix' '
 	git mv d/e d/f/e &&
 	git commit -m "d/e -> d/f/e" &&
 	git diff -M --summary HEAD^ HEAD >output &&
-	test_i18ngrep " d/{ => f}/e " output &&
+	test_grep " d/{ => f}/e " output &&
 	git diff -M --stat HEAD^ HEAD >output &&
-	test_i18ngrep " d/{ => f}/e " output
+	test_grep " d/{ => f}/e " output
 '
 
 test_expect_success 'rename pretty print common prefix and suffix overlap' '
@@ -242,9 +242,9 @@ test_expect_success 'rename pretty print common prefix and suffix overlap' '
 	git mv d/f/e d/f/f/e &&
 	git commit -m "d/f/e d/f/f/e" &&
 	git diff -M --summary HEAD^ HEAD >output &&
-	test_i18ngrep " d/f/{ => f}/e " output &&
+	test_grep " d/f/{ => f}/e " output &&
 	git diff -M --stat HEAD^ HEAD >output &&
-	test_i18ngrep " d/f/{ => f}/e " output
+	test_grep " d/f/{ => f}/e " output
 '
 
 test_expect_success 'diff-tree -l0 defaults to a big rename limit, not zero' '
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index 5de1d19075..86f3693bc0 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -613,7 +613,7 @@ test_expect_success 'diff -I<regex> --stat' '
 
 test_expect_success 'diff -I<regex>: detect malformed regex' '
 	test_expect_code 129 git diff --ignore-matching-lines="^[124-9" 2>error &&
-	test_i18ngrep "invalid regex given to -I: " error
+	test_grep "invalid regex given to -I: " error
 '
 
 # check_prefix <patch> <src> <dst>
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 3cf2b7a7fb..7abd307c5c 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -2369,25 +2369,25 @@ test_expect_success 'interdiff: cover-letter' '
 	--q
 	EOF
 	git format-patch --cover-letter --interdiff=boop~2 -1 boop &&
-	test_i18ngrep "^Interdiff:$" 0000-cover-letter.patch &&
-	test_i18ngrep ! "^Interdiff:$" 0001-fleep.patch &&
+	test_grep "^Interdiff:$" 0000-cover-letter.patch &&
+	test_grep ! "^Interdiff:$" 0001-fleep.patch &&
 	sed "1,/^@@ /d; /^-- $/q" 0000-cover-letter.patch >actual &&
 	test_cmp expect actual
 '
 
 test_expect_success 'interdiff: reroll-count' '
 	git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop &&
-	test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
+	test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
 '
 
 test_expect_success 'interdiff: reroll-count with a non-integer' '
 	git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop &&
-	test_i18ngrep "^Interdiff:$" v2.2-0000-cover-letter.patch
+	test_grep "^Interdiff:$" v2.2-0000-cover-letter.patch
 '
 
 test_expect_success 'interdiff: reroll-count with a integer' '
 	git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop &&
-	test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
+	test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
 '
 
 test_expect_success 'interdiff: solo-patch' '
@@ -2396,7 +2396,7 @@ test_expect_success 'interdiff: solo-patch' '
 
 	EOF
 	git format-patch --interdiff=boop~2 -1 boop &&
-	test_i18ngrep "^Interdiff:$" 0001-fleep.patch &&
+	test_grep "^Interdiff:$" 0001-fleep.patch &&
 	sed "1,/^  @@ /d; /^$/q" 0001-fleep.patch >actual &&
 	test_cmp expect actual
 '
diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
index b298f220e0..730f025360 100755
--- a/t/t4015-diff-whitespace.sh
+++ b/t/t4015-diff-whitespace.sh
@@ -909,7 +909,7 @@ test_expect_success 'combined diff with autocrlf conversion' '
 	git commit -m "the other side" x &&
 	git config core.autocrlf true &&
 	test_must_fail git merge one-side >actual &&
-	test_i18ngrep "Automatic merge failed" actual &&
+	test_grep "Automatic merge failed" actual &&
 
 	git diff >actual.raw &&
 	sed -e "1,/^@@@/d" actual.raw >actual &&
@@ -2187,27 +2187,27 @@ test_expect_success 'compare whitespace delta across moved blocks' '
 
 test_expect_success 'bogus settings in move detection erroring out' '
 	test_must_fail git diff --color-moved=bogus 2>err &&
-	test_i18ngrep "must be one of" err &&
-	test_i18ngrep bogus err &&
+	test_grep "must be one of" err &&
+	test_grep bogus err &&
 
 	test_must_fail git -c diff.colormoved=bogus diff 2>err &&
-	test_i18ngrep "must be one of" err &&
-	test_i18ngrep "from command-line config" err &&
+	test_grep "must be one of" err &&
+	test_grep "from command-line config" err &&
 
 	test_must_fail git diff --color-moved-ws=bogus 2>err &&
-	test_i18ngrep "possible values" err &&
-	test_i18ngrep bogus err &&
+	test_grep "possible values" err &&
+	test_grep bogus err &&
 
 	test_must_fail git -c diff.colormovedws=bogus diff 2>err &&
-	test_i18ngrep "possible values" err &&
-	test_i18ngrep "from command-line config" err
+	test_grep "possible values" err &&
+	test_grep "from command-line config" err
 '
 
 test_expect_success 'compare whitespace delta incompatible with other space options' '
 	test_must_fail git diff \
 		--color-moved-ws=allow-indentation-change,ignore-all-space \
 		2>err &&
-	test_i18ngrep allow-indentation-change err
+	test_grep allow-indentation-change err
 '
 
 EMPTY=''
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index c8d555771d..e026fac1f4 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -53,15 +53,15 @@ do
 		echo "*.java diff=$p" >.gitattributes &&
 		test_expect_code 1 git diff --no-index \
 			A.java B.java 2>msg &&
-		test_i18ngrep ! fatal msg &&
-		test_i18ngrep ! error msg
+		test_grep ! fatal msg &&
+		test_grep ! error msg
 	'
 	test_expect_success "builtin $p wordRegex pattern compiles" '
 		echo "*.java diff=$p" >.gitattributes &&
 		test_expect_code 1 git diff --no-index --word-diff \
 			A.java B.java 2>msg &&
-		test_i18ngrep ! fatal msg &&
-		test_i18ngrep ! error msg
+		test_grep ! fatal msg &&
+		test_grep ! error msg
 	'
 
 	test_expect_success "builtin $p pattern compiles on bare repo with --attr-source" '
@@ -79,8 +79,8 @@ do
 		git -C bare.git symbolic-ref HEAD refs/heads/master &&
 		test_expect_code 1 git -C bare.git --attr-source=branchA \
 			diff --exit-code HEAD:A.java HEAD:B.java 2>msg &&
-		test_i18ngrep ! fatal msg &&
-		test_i18ngrep ! error msg
+		test_grep ! fatal msg &&
+		test_grep ! error msg
 	'
 done
 
@@ -88,7 +88,7 @@ test_expect_success 'last regexp must not be negated' '
 	echo "*.java diff=java" >.gitattributes &&
 	test_config diff.java.funcname "!static" &&
 	test_expect_code 128 git diff --no-index A.java B.java 2>msg &&
-	test_i18ngrep ": Last expression must not be negated:" msg
+	test_grep ": Last expression must not be negated:" msg
 '
 
 test_expect_success 'setup hunk header tests' '
diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh
index eacc6694f7..c4394a27b5 100755
--- a/t/t4031-diff-rewrite-binary.sh
+++ b/t/t4031-diff-rewrite-binary.sh
@@ -53,7 +53,7 @@ test_expect_success 'rewrite diff --numstat shows binary changes' '
 test_expect_success 'diff --stat counts binary rewrite as 0 lines' '
 	git diff -B --stat --summary >diff &&
 	grep "Bin" diff &&
-	test_i18ngrep "0 insertions.*0 deletions" diff &&
+	test_grep "0 insertions.*0 deletions" diff &&
 	grep " rewrite file" diff
 '
 
diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh
index 70224c3da1..7b73462d53 100755
--- a/t/t4047-diff-dirstat.sh
+++ b/t/t4047-diff-dirstat.sh
@@ -943,37 +943,37 @@ test_expect_success '--dirstat=future_param,lines,0 should fail loudly' '
 	test_must_fail git diff --dirstat=future_param,lines,0 HEAD^..HEAD >actual_diff_dirstat 2>actual_error &&
 	test_debug "cat actual_error" &&
 	test_must_be_empty actual_diff_dirstat &&
-	test_i18ngrep -q "future_param" actual_error &&
-	test_i18ngrep -q "\--dirstat" actual_error
+	test_grep -q "future_param" actual_error &&
+	test_grep -q "\--dirstat" actual_error
 '
 
 test_expect_success '--dirstat=dummy1,cumulative,2dummy should report both unrecognized parameters' '
 	test_must_fail git diff --dirstat=dummy1,cumulative,2dummy HEAD^..HEAD >actual_diff_dirstat 2>actual_error &&
 	test_debug "cat actual_error" &&
 	test_must_be_empty actual_diff_dirstat &&
-	test_i18ngrep -q "dummy1" actual_error &&
-	test_i18ngrep -q "2dummy" actual_error &&
-	test_i18ngrep -q "\--dirstat" actual_error
+	test_grep -q "dummy1" actual_error &&
+	test_grep -q "2dummy" actual_error &&
+	test_grep -q "\--dirstat" actual_error
 '
 
 test_expect_success 'diff.dirstat=future_param,0,lines should warn, but still work' '
 	git -c diff.dirstat=future_param,0,lines diff --dirstat HEAD^..HEAD >actual_diff_dirstat 2>actual_error &&
 	test_debug "cat actual_error" &&
 	test_cmp expect_diff_dirstat actual_diff_dirstat &&
-	test_i18ngrep -q "future_param" actual_error &&
-	test_i18ngrep -q "diff\\.dirstat" actual_error &&
+	test_grep -q "future_param" actual_error &&
+	test_grep -q "diff\\.dirstat" actual_error &&
 
 	git -c diff.dirstat=future_param,0,lines diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M 2>actual_error &&
 	test_debug "cat actual_error" &&
 	test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
-	test_i18ngrep -q "future_param" actual_error &&
-	test_i18ngrep -q "diff\\.dirstat" actual_error &&
+	test_grep -q "future_param" actual_error &&
+	test_grep -q "diff\\.dirstat" actual_error &&
 
 	git -c diff.dirstat=future_param,0,lines diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC 2>actual_error &&
 	test_debug "cat actual_error" &&
 	test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC &&
-	test_i18ngrep -q "future_param" actual_error &&
-	test_i18ngrep -q "diff\\.dirstat" actual_error
+	test_grep -q "future_param" actual_error &&
+	test_grep -q "diff\\.dirstat" actual_error
 '
 
 test_expect_success '--shortstat --dirstat should output only one dirstat' '
diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
index 6781cc9078..5a5d958b96 100755
--- a/t/t4053-diff-no-index.sh
+++ b/t/t4053-diff-no-index.sh
@@ -56,7 +56,7 @@ test_expect_success 'git diff --no-index executed outside repo gives correct err
 		export GIT_CEILING_DIRECTORIES &&
 		cd non/git &&
 		test_must_fail git diff --no-index a 2>actual.err &&
-		test_i18ngrep "usage: git diff --no-index" actual.err
+		test_grep "usage: git diff --no-index" actual.err
 	)
 '
 
diff --git a/t/t4055-diff-context.sh b/t/t4055-diff-context.sh
index 73048d0a52..3ea9ae99e0 100755
--- a/t/t4055-diff-context.sh
+++ b/t/t4055-diff-context.sh
@@ -74,13 +74,13 @@ test_expect_success 'plumbing not affected' '
 test_expect_success 'non-integer config parsing' '
 	git config diff.context no &&
 	test_must_fail git diff 2>output &&
-	test_i18ngrep "bad numeric config value" output
+	test_grep "bad numeric config value" output
 '
 
 test_expect_success 'negative integer config parsing' '
 	git config diff.context -1 &&
 	test_must_fail git diff 2>output &&
-	test_i18ngrep "bad config variable" output
+	test_grep "bad config variable" output
 '
 
 test_expect_success '-U0 is valid, so is diff.context=0' '
diff --git a/t/t4068-diff-symmetric-merge-base.sh b/t/t4068-diff-symmetric-merge-base.sh
index 2d650d8f10..3356d91cd4 100755
--- a/t/t4068-diff-symmetric-merge-base.sh
+++ b/t/t4068-diff-symmetric-merge-base.sh
@@ -68,27 +68,27 @@ test_expect_success 'diff with two merge bases' '
 
 test_expect_success 'diff with no merge bases' '
 	test_must_fail git diff br2...br3 2>err &&
-	test_i18ngrep "fatal: br2...br3: no merge base" err
+	test_grep "fatal: br2...br3: no merge base" err
 '
 
 test_expect_success 'diff with too many symmetric differences' '
 	test_must_fail git diff br1...main br2...br3 2>err &&
-	test_i18ngrep "usage" err
+	test_grep "usage" err
 '
 
 test_expect_success 'diff with symmetric difference and extraneous arg' '
 	test_must_fail git diff main br1...main 2>err &&
-	test_i18ngrep "usage" err
+	test_grep "usage" err
 '
 
 test_expect_success 'diff with two ranges' '
 	test_must_fail git diff main br1..main br2..br3 2>err &&
-	test_i18ngrep "usage" err
+	test_grep "usage" err
 '
 
 test_expect_success 'diff with ranges and extra arg' '
 	test_must_fail git diff main br1..main commit-D 2>err &&
-	test_i18ngrep "usage" err
+	test_grep "usage" err
 '
 
 test_expect_success 'diff --merge-base with no commits' '
@@ -97,7 +97,7 @@ test_expect_success 'diff --merge-base with no commits' '
 
 test_expect_success 'diff --merge-base with three commits' '
 	test_must_fail git diff --merge-base br1 br2 main 2>err &&
-	test_i18ngrep "usage" err
+	test_grep "usage" err
 '
 
 for cmd in diff-index diff
@@ -143,19 +143,19 @@ do
 	test_expect_success "$cmd --merge-base with non-commit" '
 		git checkout main &&
 		test_must_fail git $cmd --merge-base main^{tree} 2>err &&
-		test_i18ngrep "fatal: --merge-base only works with commits" err
+		test_grep "fatal: --merge-base only works with commits" err
 	'
 
 	test_expect_success "$cmd --merge-base with no merge bases and one commit" '
 		git checkout main &&
 		test_must_fail git $cmd --merge-base br3 2>err &&
-		test_i18ngrep "fatal: no merge base found" err
+		test_grep "fatal: no merge base found" err
 	'
 
 	test_expect_success "$cmd --merge-base with multiple merge bases and one commit" '
 		git checkout main &&
 		test_must_fail git $cmd --merge-base br1 2>err &&
-		test_i18ngrep "fatal: multiple merge bases found" err
+		test_grep "fatal: multiple merge bases found" err
 	'
 done
 
@@ -169,28 +169,28 @@ do
 
 	test_expect_success "$cmd --merge-base commit and non-commit" '
 		test_must_fail git $cmd --merge-base br2 main^{tree} 2>err &&
-		test_i18ngrep "fatal: --merge-base only works with commits" err
+		test_grep "fatal: --merge-base only works with commits" err
 	'
 
 	test_expect_success "$cmd --merge-base with no merge bases and two commits" '
 		test_must_fail git $cmd --merge-base br2 br3 2>err &&
-		test_i18ngrep "fatal: no merge base found" err
+		test_grep "fatal: no merge base found" err
 	'
 
 	test_expect_success "$cmd --merge-base with multiple merge bases and two commits" '
 		test_must_fail git $cmd --merge-base main br1 2>err &&
-		test_i18ngrep "fatal: multiple merge bases found" err
+		test_grep "fatal: multiple merge bases found" err
 	'
 done
 
 test_expect_success 'diff-tree --merge-base with one commit' '
 	test_must_fail git diff-tree --merge-base main 2>err &&
-	test_i18ngrep "fatal: --merge-base only works with two commits" err
+	test_grep "fatal: --merge-base only works with two commits" err
 '
 
 test_expect_success 'diff --merge-base with range' '
 	test_must_fail git diff --merge-base br2..br3 2>err &&
-	test_i18ngrep "fatal: --merge-base does not work with ranges" err
+	test_grep "fatal: --merge-base does not work with ranges" err
 '
 
 test_done
diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh
index a22a90d552..cbef0a593f 100755
--- a/t/t4115-apply-symlink.sh
+++ b/t/t4115-apply-symlink.sh
@@ -136,7 +136,7 @@ test_expect_success SYMLINKS '--reject removes .rej symlink if it exists' '
 
 	ln -s foo file.t.rej &&
 	test_must_fail git apply patch --reject 2>err &&
-	test_i18ngrep "Rejected hunk" err &&
+	test_grep "Rejected hunk" err &&
 	test_path_is_missing foo &&
 	test_path_is_file file.t.rej
 '
diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh
index 497b62868d..697e86c0ff 100755
--- a/t/t4120-apply-popt.sh
+++ b/t/t4120-apply-popt.sh
@@ -31,7 +31,7 @@ test_expect_success 'apply git diff with -p2' '
 test_expect_success 'apply with too large -p' '
 	cp file1.saved file1 &&
 	test_must_fail git apply --stat -p3 patch.file 2>err &&
-	test_i18ngrep "removing 3 leading" err
+	test_grep "removing 3 leading" err
 '
 
 test_expect_success 'apply (-p2) traditional diff with funny filenames' '
@@ -53,7 +53,7 @@ test_expect_success 'apply (-p2) traditional diff with funny filenames' '
 test_expect_success 'apply with too large -p and fancy filename' '
 	cp file1.saved file1 &&
 	test_must_fail git apply --stat -p3 patch.escaped 2>err &&
-	test_i18ngrep "removing 3 leading" err
+	test_grep "removing 3 leading" err
 '
 
 test_expect_success 'apply (-p2) diff, mode change only' '
diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh
index 9696537303..2089d84f64 100755
--- a/t/t4122-apply-symlink-inside.sh
+++ b/t/t4122-apply-symlink-inside.sh
@@ -95,19 +95,19 @@ test_expect_success SYMLINKS 'do not follow symbolic link (same input)' '
 
 	# same input creates a confusing symbolic link
 	test_must_fail git apply patch 2>error-wt &&
-	test_i18ngrep "beyond a symbolic link" error-wt &&
+	test_grep "beyond a symbolic link" error-wt &&
 	test_path_is_missing arch/x86_64/dir &&
 	test_path_is_missing arch/i386/dir/file &&
 
 	test_must_fail git apply --index patch 2>error-ix &&
-	test_i18ngrep "beyond a symbolic link" error-ix &&
+	test_grep "beyond a symbolic link" error-ix &&
 	test_path_is_missing arch/x86_64/dir &&
 	test_path_is_missing arch/i386/dir/file &&
 	test_must_fail git ls-files --error-unmatch arch/x86_64/dir &&
 	test_must_fail git ls-files --error-unmatch arch/i386/dir &&
 
 	test_must_fail git apply --cached patch 2>error-ct &&
-	test_i18ngrep "beyond a symbolic link" error-ct &&
+	test_grep "beyond a symbolic link" error-ct &&
 	test_must_fail git ls-files --error-unmatch arch/x86_64/dir &&
 	test_must_fail git ls-files --error-unmatch arch/i386/dir &&
 
@@ -135,23 +135,23 @@ test_expect_success SYMLINKS 'do not follow symbolic link (existing)' '
 	git add arch/x86_64/dir &&
 
 	test_must_fail git apply add_file.patch 2>error-wt-add &&
-	test_i18ngrep "beyond a symbolic link" error-wt-add &&
+	test_grep "beyond a symbolic link" error-wt-add &&
 	test_path_is_missing arch/i386/dir/file &&
 
 	mkdir arch/i386/dir &&
 	>arch/i386/dir/file &&
 	test_must_fail git apply del_file.patch 2>error-wt-del &&
-	test_i18ngrep "beyond a symbolic link" error-wt-del &&
+	test_grep "beyond a symbolic link" error-wt-del &&
 	test_path_is_file arch/i386/dir/file &&
 	rm arch/i386/dir/file &&
 
 	test_must_fail git apply --index add_file.patch 2>error-ix-add &&
-	test_i18ngrep "beyond a symbolic link" error-ix-add &&
+	test_grep "beyond a symbolic link" error-ix-add &&
 	test_path_is_missing arch/i386/dir/file &&
 	test_must_fail git ls-files --error-unmatch arch/i386/dir &&
 
 	test_must_fail git apply --cached add_file.patch 2>error-ct-file &&
-	test_i18ngrep "beyond a symbolic link" error-ct-file &&
+	test_grep "beyond a symbolic link" error-ct-file &&
 	test_must_fail git ls-files --error-unmatch arch/i386/dir
 '
 
diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh
index a1c7686519..e7a7295f1b 100755
--- a/t/t4129-apply-samemode.sh
+++ b/t/t4129-apply-samemode.sh
@@ -66,13 +66,13 @@ test_expect_success FILEMODE 'mode update (index only)' '
 test_expect_success FILEMODE 'empty mode is rejected' '
 	git reset --hard &&
 	test_must_fail git apply patch-empty-mode.txt 2>err &&
-	test_i18ngrep "invalid mode" err
+	test_grep "invalid mode" err
 '
 
 test_expect_success FILEMODE 'bogus mode is rejected' '
 	git reset --hard &&
 	test_must_fail git apply patch-bogus-mode.txt 2>err &&
-	test_i18ngrep "invalid mode" err
+	test_grep "invalid mode" err
 '
 
 test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree files' '
diff --git a/t/t4133-apply-filenames.sh b/t/t4133-apply-filenames.sh
index 35f1060bc8..c21ddb2946 100755
--- a/t/t4133-apply-filenames.sh
+++ b/t/t4133-apply-filenames.sh
@@ -32,9 +32,9 @@ EOF
 
 test_expect_success 'apply diff with inconsistent filenames in headers' '
 	test_must_fail git apply bad1.patch 2>err &&
-	test_i18ngrep "inconsistent new filename" err &&
+	test_grep "inconsistent new filename" err &&
 	test_must_fail git apply bad2.patch 2>err &&
-	test_i18ngrep "inconsistent old filename" err
+	test_grep "inconsistent old filename" err
 '
 
 test_expect_success 'apply diff with new filename missing from headers' '
@@ -46,7 +46,7 @@ test_expect_success 'apply diff with new filename missing from headers' '
 	+1
 	EOF
 	test_must_fail git apply missing_new_filename.diff 2>err &&
-	test_i18ngrep "lacks filename information" err
+	test_grep "lacks filename information" err
 '
 
 test_expect_success 'apply diff with old filename missing from headers' '
@@ -58,7 +58,7 @@ test_expect_success 'apply diff with old filename missing from headers' '
 	-1
 	EOF
 	test_must_fail git apply missing_old_filename.diff 2>err &&
-	test_i18ngrep "lacks filename information" err
+	test_grep "lacks filename information" err
 '
 
 test_done
diff --git a/t/t4150-am.sh b/t/t4150-am.sh
index 2935fe1b2d..3b12576269 100755
--- a/t/t4150-am.sh
+++ b/t/t4150-am.sh
@@ -779,7 +779,7 @@ test_expect_success 'am --resolved fails if index has unmerged entries' '
 	test_must_fail git am --resolved >err &&
 	test_path_is_dir .git/rebase-apply &&
 	test_cmp_rev second HEAD &&
-	test_i18ngrep "still have unmerged paths" err
+	test_grep "still have unmerged paths" err
 '
 
 test_expect_success 'am takes patches from a Pine mailbox' '
@@ -913,7 +913,7 @@ test_expect_success 'am newline in subject' '
 	test_tick &&
 	sed -e "s/second/second \\\n foo/" patch1 >patchnl &&
 	git am <patchnl >output.out 2>&1 &&
-	test_i18ngrep "^Applying: second \\\n foo$" output.out
+	test_grep "^Applying: second \\\n foo$" output.out
 '
 
 test_expect_success 'am -q is quiet' '
diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh
index 5ed7e22827..edb38da701 100755
--- a/t/t4151-am-abort.sh
+++ b/t/t4151-am-abort.sh
@@ -46,7 +46,7 @@ do
 
 	test_expect_success "am$with3 --skip continue after failed am$with3" '
 		test_must_fail git am$with3 --skip >output &&
-		test_i18ngrep "^Applying: 6$" output &&
+		test_grep "^Applying: 6$" output &&
 		test_cmp file-2-expect file-2 &&
 		test ! -f .git/MERGE_RR
 	'
diff --git a/t/t4153-am-resume-override-opts.sh b/t/t4153-am-resume-override-opts.sh
index b7c3861407..4add7c7757 100755
--- a/t/t4153-am-resume-override-opts.sh
+++ b/t/t4153-am-resume-override-opts.sh
@@ -53,7 +53,7 @@ test_expect_success '--no-quiet overrides --quiet' '
 	# Applying side1 will be quiet.
 	test_must_fail git am --quiet side[123].eml >out &&
 	test_path_is_dir .git/rebase-apply &&
-	test_i18ngrep ! "^Applying: " out &&
+	test_grep ! "^Applying: " out &&
 	echo side1 >file &&
 	git add file &&
 
diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh
index 7025cfdae5..fb53dddf79 100755
--- a/t/t4200-rerere.sh
+++ b/t/t4200-rerere.sh
@@ -433,13 +433,13 @@ test_expect_success 'rerere --no-no-rerere-autoupdate' '
 	git update-index --index-info <failedmerge &&
 	cp file3.conflict file3 &&
 	test_must_fail git rerere --no-no-rerere-autoupdate 2>err &&
-	test_i18ngrep [Uu]sage err &&
+	test_grep [Uu]sage err &&
 	test_must_fail git update-index --refresh
 '
 
 test_expect_success 'rerere -h' '
 	test_must_fail git rerere -h >help &&
-	test_i18ngrep [Uu]sage help
+	test_grep [Uu]sage help
 '
 
 concat_insert () {
diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh
index 8e4effebdb..d7382709fc 100755
--- a/t/t4201-shortlog.sh
+++ b/t/t4201-shortlog.sh
@@ -139,7 +139,7 @@ test_expect_success !MINGW 'shortlog can read --format=raw output' '
 
 test_expect_success 'shortlog from non-git directory refuses extra arguments' '
 	test_must_fail env GIT_DIR=non-existing git shortlog foo 2>out &&
-	test_i18ngrep "too many arguments" out
+	test_grep "too many arguments" out
 '
 
 test_expect_success 'shortlog should add newline when input line matches wraplen' '
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index af4a123cd2..708636671a 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -1884,7 +1884,7 @@ test_expect_success '--no-graph does not unset --parents' '
 
 test_expect_success '--reverse and --graph conflict' '
 	test_must_fail git log --reverse --graph 2>stderr &&
-	test_i18ngrep "cannot be used together" stderr
+	test_grep "cannot be used together" stderr
 '
 
 test_expect_success '--reverse --graph --no-graph works' '
@@ -1895,7 +1895,7 @@ test_expect_success '--reverse --graph --no-graph works' '
 
 test_expect_success '--show-linear-break and --graph conflict' '
 	test_must_fail git log --show-linear-break --graph 2>stderr &&
-	test_i18ngrep "cannot be used together" stderr
+	test_grep "cannot be used together" stderr
 '
 
 test_expect_success '--show-linear-break --graph --no-graph works' '
@@ -1906,7 +1906,7 @@ test_expect_success '--show-linear-break --graph --no-graph works' '
 
 test_expect_success '--no-walk and --graph conflict' '
 	test_must_fail git log --no-walk --graph 2>stderr &&
-	test_i18ngrep "cannot be used together" stderr
+	test_grep "cannot be used together" stderr
 '
 
 test_expect_success '--no-walk --graph --no-graph works' '
@@ -1917,8 +1917,8 @@ test_expect_success '--no-walk --graph --no-graph works' '
 
 test_expect_success '--walk-reflogs and --graph conflict' '
 	test_must_fail git log --walk-reflogs --graph 2>stderr &&
-	(test_i18ngrep "cannot combine" stderr ||
-		test_i18ngrep "cannot be used together" stderr)
+	(test_grep "cannot combine" stderr ||
+		test_grep "cannot be used together" stderr)
 '
 
 test_expect_success '--walk-reflogs --graph --no-graph works' '
@@ -2252,7 +2252,7 @@ test_expect_success 'log on empty repo fails' '
 	git init empty &&
 	test_when_finished "rm -rf empty" &&
 	test_must_fail git -C empty log 2>stderr &&
-	test_i18ngrep does.not.have.any.commits stderr
+	test_grep does.not.have.any.commits stderr
 '
 
 test_expect_success REFFILES 'log diagnoses bogus HEAD hash' '
@@ -2260,16 +2260,16 @@ test_expect_success REFFILES 'log diagnoses bogus HEAD hash' '
 	test_when_finished "rm -rf empty" &&
 	echo 1234abcd >empty/.git/refs/heads/main &&
 	test_must_fail git -C empty log 2>stderr &&
-	test_i18ngrep broken stderr
+	test_grep broken stderr
 '
 
 test_expect_success REFFILES 'log diagnoses bogus HEAD symref' '
 	git init empty &&
 	echo "ref: refs/heads/invalid.lock" > empty/.git/HEAD &&
 	test_must_fail git -C empty log 2>stderr &&
-	test_i18ngrep broken stderr &&
+	test_grep broken stderr &&
 	test_must_fail git -C empty log --default totally-bogus 2>stderr &&
-	test_i18ngrep broken stderr
+	test_grep broken stderr
 '
 
 test_expect_success 'log does not default to HEAD when rev input is given' '
diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
index 2016132f51..8a88dd7900 100755
--- a/t/t4203-mailmap.sh
+++ b/t/t4203-mailmap.sh
@@ -360,7 +360,7 @@ test_expect_success 'mailmap.blob might be the wrong type' '
 	cp default.map .mailmap &&
 
 	git -c mailmap.blob=HEAD: shortlog HEAD >actual 2>err &&
-	test_i18ngrep "mailmap is not a blob" err &&
+	test_grep "mailmap is not a blob" err &&
 	test_cmp expect actual
 '
 
diff --git a/t/t4208-log-magic-pathspec.sh b/t/t4208-log-magic-pathspec.sh
index 2e8f5ad7b8..806b2809d4 100755
--- a/t/t4208-log-magic-pathspec.sh
+++ b/t/t4208-log-magic-pathspec.sh
@@ -21,7 +21,7 @@ test_expect_success '"git log :/" should not be ambiguous' '
 test_expect_success '"git log :/a" should be ambiguous (applied both rev and worktree)' '
 	: >a &&
 	test_must_fail git log :/a 2>error &&
-	test_i18ngrep ambiguous error
+	test_grep ambiguous error
 '
 
 test_expect_success '"git log :/a -- " should not be ambiguous' '
@@ -65,7 +65,7 @@ test_expect_success '"git log :/in" should not be ambiguous' '
 
 test_expect_success '"git log :" should be ambiguous' '
 	test_must_fail git log : 2>error &&
-	test_i18ngrep ambiguous error
+	test_grep ambiguous error
 '
 
 test_expect_success 'git log -- :' '
@@ -104,7 +104,7 @@ test_expect_success '"git log :(exclude)sub --" must resolve as an object' '
 
 test_expect_success '"git log :(unknown-magic) complains of bogus magic' '
 	test_must_fail git log ":(unknown-magic)" 2>error &&
-	test_i18ngrep pathspec.magic error
+	test_grep pathspec.magic error
 '
 
 test_expect_success 'command line pathspec parsing for "git log"' '
diff --git a/t/t4209-log-pickaxe.sh b/t/t4209-log-pickaxe.sh
index 7f6bb27f14..64e1623733 100755
--- a/t/t4209-log-pickaxe.sh
+++ b/t/t4209-log-pickaxe.sh
@@ -57,10 +57,10 @@ test_expect_success setup '
 
 test_expect_success 'usage' '
 	test_expect_code 129 git log -S 2>err &&
-	test_i18ngrep "switch.*requires a value" err &&
+	test_grep "switch.*requires a value" err &&
 
 	test_expect_code 129 git log -G 2>err &&
-	test_i18ngrep "switch.*requires a value" err &&
+	test_grep "switch.*requires a value" err &&
 
 	test_expect_code 128 git log -Gregex -Sstring 2>err &&
 	grep "cannot be used together" err &&
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh
index c6540e822f..02d76dca28 100755
--- a/t/t4211-line-log.sh
+++ b/t/t4211-line-log.sh
@@ -19,7 +19,7 @@ test_expect_success 'basic command line parsing' '
 
 	# -L requires there is no pathspec
 	test_must_fail git log -L1,1:b.c -- b.c 2>error &&
-	test_i18ngrep "cannot be used with pathspec" error &&
+	test_grep "cannot be used with pathspec" error &&
 
 	# This would fail because --follow wants a single path, but
 	# we may fail due to incompatibility between -L/--follow in
@@ -50,7 +50,7 @@ canned_test_failure () {
 test_bad_opts () {
 	test_expect_success "invalid args: $1" "
 		test_must_fail git log $1 2>errors &&
-		test_i18ngrep '$2' errors
+		test_grep '$2' errors
 	"
 }
 
diff --git a/t/t4212-log-corrupt.sh b/t/t4212-log-corrupt.sh
index 85e90acb09..e6b59123a3 100755
--- a/t/t4212-log-corrupt.sh
+++ b/t/t4212-log-corrupt.sh
@@ -17,7 +17,7 @@ test_expect_success 'setup' '
 
 test_expect_success 'fsck notices broken commit' '
 	test_must_fail git fsck 2>actual &&
-	test_i18ngrep invalid.author actual
+	test_grep invalid.author actual
 '
 
 test_expect_success 'git log with broken author email' '
diff --git a/t/t4256-am-format-flowed.sh b/t/t4256-am-format-flowed.sh
index 1015273bc8..92d8c8b651 100755
--- a/t/t4256-am-format-flowed.sh
+++ b/t/t4256-am-format-flowed.sh
@@ -13,7 +13,7 @@ test_expect_success 'setup' '
 
 test_expect_success 'am with format=flowed' '
 	git am <"$TEST_DIRECTORY/t4256/1/patch" 2>stderr &&
-	test_i18ngrep "warning: Patch sent with format=flowed" stderr &&
+	test_grep "warning: Patch sent with format=flowed" stderr &&
 	test_cmp "$TEST_DIRECTORY/t4256/1/mailinfo.c" mailinfo.c
 '
 
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 745089479c..d402ec18b7 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -541,7 +541,7 @@ test_expect_success 'make sure index-pack detects the SHA1 collision' '
 	(
 		cd corrupt &&
 		test_must_fail git index-pack -o ../bad.idx ../test-3.pack 2>msg &&
-		test_i18ngrep "SHA1 COLLISION FOUND" msg
+		test_grep "SHA1 COLLISION FOUND" msg
 	)
 '
 
@@ -549,7 +549,7 @@ test_expect_success 'make sure index-pack detects the SHA1 collision (large blob
 	(
 		cd corrupt &&
 		test_must_fail git -c core.bigfilethreshold=1 index-pack -o ../bad.idx ../test-3.pack 2>msg &&
-		test_i18ngrep "SHA1 COLLISION FOUND" msg
+		test_grep "SHA1 COLLISION FOUND" msg
 	)
 '
 
diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh
index f89809be53..d88e6f1691 100755
--- a/t/t5302-pack-index.sh
+++ b/t/t5302-pack-index.sh
@@ -282,8 +282,8 @@ test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in
 test_expect_success 'index-pack -v --stdin produces progress for both phases' '
 	pack=$(git pack-objects --all pack </dev/null) &&
 	GIT_PROGRESS_DELAY=0 git index-pack -v --stdin <pack-$pack.pack 2>err &&
-	test_i18ngrep "Receiving objects" err &&
-	test_i18ngrep "Resolving deltas" err
+	test_grep "Receiving objects" err &&
+	test_grep "Resolving deltas" err
 '
 
 test_expect_success 'too-large packs report the breach' '
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index b4df545e5a..1f1f664871 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -318,10 +318,10 @@ test_expect_success 'prune: handle HEAD reflog in multiple worktrees' '
 
 test_expect_success 'prune: handle expire option correctly' '
 	test_must_fail git prune --expire 2>error &&
-	test_i18ngrep "requires a value" error &&
+	test_grep "requires a value" error &&
 
 	test_must_fail git prune --expire=nyah 2>error &&
-	test_i18ngrep "malformed expiration" error &&
+	test_grep "malformed expiration" error &&
 
 	git prune --no-expire
 '
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index 78c1c6c923..d7fd71360e 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -271,7 +271,7 @@ test_bitmap_cases () {
 		mv -f $bitmap.tmp $bitmap &&
 		git rev-list --use-bitmap-index --count --all >actual 2>stderr &&
 		test_cmp expect actual &&
-		test_i18ngrep corrupt.ewah.bitmap stderr
+		test_grep corrupt.ewah.bitmap stderr
 	'
 
 	test_expect_success 'truncated bitmap fails gracefully (cache)' '
@@ -284,7 +284,7 @@ test_bitmap_cases () {
 		mv -f $bitmap.tmp $bitmap &&
 		git rev-list --use-bitmap-index --count --all >actual 2>stderr &&
 		test_cmp expect actual &&
-		test_i18ngrep corrupted.bitmap.index stderr
+		test_grep corrupted.bitmap.index stderr
 	'
 
 	# Create a state of history with these properties:
@@ -471,7 +471,7 @@ sane_unset GIT_TEST_PACK_USE_BITMAP_BOUNDARY_TRAVERSAL
 test_expect_success 'incremental repack fails when bitmaps are requested' '
 	test_commit more-1 &&
 	test_must_fail git repack -d 2>err &&
-	test_i18ngrep "Incremental repacks are incompatible with bitmap" err
+	test_grep "Incremental repacks are incompatible with bitmap" err
 '
 
 test_expect_success 'incremental repack can disable bitmaps' '
@@ -524,7 +524,7 @@ test_expect_success 'truncated bitmap fails gracefully (lookup table)' '
 	mv -f $bitmap.tmp $bitmap &&
 	git rev-list --use-bitmap-index --count --all >actual 2>stderr &&
 	test_cmp expect actual &&
-	test_i18ngrep corrupted.bitmap.index stderr
+	test_grep corrupted.bitmap.index stderr
 '
 
 test_done
diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh
index 4df76173a8..10718142b0 100755
--- a/t/t5318-commit-graph.sh
+++ b/t/t5318-commit-graph.sh
@@ -47,7 +47,7 @@ test_expect_success 'exit with correct error on bad input to --stdin-packs' '
 	echo doesnotexist >in &&
 	test_expect_code 1 git -C full commit-graph write --stdin-packs \
 		<in 2>stderr &&
-	test_i18ngrep "error adding pack" stderr
+	test_grep "error adding pack" stderr
 '
 
 test_expect_success 'create commits and repack' '
@@ -67,11 +67,11 @@ test_expect_success 'exit with correct error on bad input to --stdin-commits' '
 	# invalid, non-hex OID
 	echo HEAD | test_expect_code 1 git -C full commit-graph write \
 		--stdin-commits 2>stderr &&
-	test_i18ngrep "unexpected non-hex object ID: HEAD" stderr &&
+	test_grep "unexpected non-hex object ID: HEAD" stderr &&
 	# non-existent OID
 	echo $ZERO_OID | test_expect_code 1 git -C full commit-graph write \
 		--stdin-commits 2>stderr &&
-	test_i18ngrep "invalid object" stderr &&
+	test_grep "invalid object" stderr &&
 	# valid commit and tree OID
 	git -C full rev-parse HEAD HEAD^{tree} >in &&
 	git -C full commit-graph write --stdin-commits <in &&
@@ -143,7 +143,7 @@ test_expect_success 'commit-graph write --stdin-commits force progress on for st
 	git -C full rev-parse commits/5 >in &&
 	GIT_PROGRESS_DELAY=0 git -C full commit-graph write --stdin-commits \
 		--progress <in 2>err &&
-	test_i18ngrep "Collecting commits from input" err
+	test_grep "Collecting commits from input" err
 '
 
 test_expect_success 'commit-graph write --stdin-commits with the --no-progress option' '
@@ -383,13 +383,13 @@ test_expect_success 'warn on improper hash version' '
 		cd sha1 &&
 		mv ../cg-sha256 .git/objects/info/commit-graph &&
 		git log -1 2>err &&
-		test_i18ngrep "commit-graph hash version 2 does not match version 1" err
+		test_grep "commit-graph hash version 2 does not match version 1" err
 	) &&
 	(
 		cd sha256 &&
 		mv ../cg-sha1 .git/objects/info/commit-graph &&
 		git log -1 2>err &&
-		test_i18ngrep "commit-graph hash version 1 does not match version 2" err
+		test_grep "commit-graph hash version 1 does not match version 2" err
 	)
 '
 
@@ -473,7 +473,7 @@ corrupt_graph_verify() {
 	grepstr=$1
 	test_must_fail git -C full commit-graph verify 2>test_err &&
 	grep -v "^+" test_err >err &&
-	test_i18ngrep "$grepstr" err &&
+	test_grep "$grepstr" err &&
 	if test "$2" != "no-copy"
 	then
 		cp full/$objdir/info/commit-graph commit-graph-pre-write-test
@@ -714,7 +714,7 @@ test_expect_success 'corrupt commit-graph write (broken parent)' '
 		git commit-tree -p "$broken" -m "good commit" "$empty" >good &&
 		test_must_fail git commit-graph write --stdin-commits \
 			<good 2>test_err &&
-		test_i18ngrep "unable to parse commit" test_err
+		test_grep "unable to parse commit" test_err
 	)
 '
 
@@ -735,7 +735,7 @@ test_expect_success 'corrupt commit-graph write (missing tree)' '
 		git commit-tree -p "$broken" -m "good" "$tree" >good &&
 		test_must_fail git commit-graph write --stdin-commits \
 			<good 2>test_err &&
-		test_i18ngrep "unable to parse commit" test_err
+		test_grep "unable to parse commit" test_err
 	)
 '
 
diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh
index 1bcc02004d..4b01d78ccb 100755
--- a/t/t5319-multi-pack-index.sh
+++ b/t/t5319-multi-pack-index.sh
@@ -279,13 +279,13 @@ test_expect_success 'warn on improper hash version' '
 		cd sha1 &&
 		mv ../mpi-sha256 .git/objects/pack/multi-pack-index &&
 		git log -1 2>err &&
-		test_i18ngrep "multi-pack-index hash version 2 does not match version 1" err
+		test_grep "multi-pack-index hash version 2 does not match version 1" err
 	) &&
 	(
 		cd sha256 &&
 		mv ../mpi-sha1 .git/objects/pack/multi-pack-index &&
 		git log -1 2>err &&
-		test_i18ngrep "multi-pack-index hash version 1 does not match version 2" err
+		test_grep "multi-pack-index hash version 1 does not match version 2" err
 	)
 '
 
@@ -386,7 +386,7 @@ corrupt_midx_and_verify() {
 	printf "$DATA" | dd of="$FILE" bs=1 seek="$POS" conv=notrunc &&
 	test_must_fail $COMMAND 2>test_err &&
 	grep -v "^+" test_err >err &&
-	test_i18ngrep "$GREPSTR" err
+	test_grep "$GREPSTR" err
 }
 
 test_expect_success 'verify bad signature' '
@@ -501,7 +501,7 @@ test_expect_success 'corrupt MIDX is not reused' '
 	corrupt_midx_and_verify $MIDX_BYTE_OFFSET "\377" $objdir \
 		"incorrect object offset" &&
 	git multi-pack-index write 2>err &&
-	test_i18ngrep checksum.mismatch err &&
+	test_grep checksum.mismatch err &&
 	git multi-pack-index verify
 '
 
@@ -1031,7 +1031,7 @@ test_expect_success 'load reverse index when missing .idx, .pack' '
 
 test_expect_success 'usage shown without sub-command' '
 	test_expect_code 129 git multi-pack-index 2>err &&
-	! test_i18ngrep "unrecognized subcommand" err
+	! test_grep "unrecognized subcommand" err
 '
 
 test_expect_success 'complains when run outside of a repository' '
diff --git a/t/t5324-split-commit-graph.sh b/t/t5324-split-commit-graph.sh
index 36c4141e67..a48c00ef50 100755
--- a/t/t5324-split-commit-graph.sh
+++ b/t/t5324-split-commit-graph.sh
@@ -281,7 +281,7 @@ test_expect_success 'verify hashes along chain, even in shallow' '
 		corrupt_file "$base_file" $(test_oid shallow) "\01" &&
 		test_must_fail git commit-graph verify --shallow 2>test_err &&
 		grep -v "^+" test_err >err &&
-		test_i18ngrep "incorrect checksum" err
+		test_grep "incorrect checksum" err
 	)
 '
 
@@ -295,7 +295,7 @@ test_expect_success 'verify --shallow does not check base contents' '
 		git commit-graph verify --shallow &&
 		test_must_fail git commit-graph verify 2>test_err &&
 		grep -v "^+" test_err >err &&
-		test_i18ngrep "incorrect checksum" err
+		test_grep "incorrect checksum" err
 	)
 '
 
@@ -308,7 +308,7 @@ test_expect_success 'warn on base graph chunk incorrect' '
 		corrupt_file "$base_file" $(test_oid base) "\01" &&
 		git commit-graph verify --shallow 2>test_err &&
 		grep -v "^+" test_err >err &&
-		test_i18ngrep "commit-graph chain does not match" err
+		test_grep "commit-graph chain does not match" err
 	)
 '
 
@@ -319,11 +319,11 @@ test_expect_success 'verify after commit-graph-chain corruption' '
 		corrupt_file "$graphdir/commit-graph-chain" 60 "G" &&
 		git commit-graph verify 2>test_err &&
 		grep -v "^+" test_err >err &&
-		test_i18ngrep "invalid commit-graph chain" err &&
+		test_grep "invalid commit-graph chain" err &&
 		corrupt_file "$graphdir/commit-graph-chain" 60 "A" &&
 		git commit-graph verify 2>test_err &&
 		grep -v "^+" test_err >err &&
-		test_i18ngrep "unable to find all commit-graph files" err
+		test_grep "unable to find all commit-graph files" err
 	)
 '
 
@@ -341,7 +341,7 @@ test_expect_success 'verify across alternates' '
 		corrupt_file "$tip_file" 100 "\01" &&
 		test_must_fail git commit-graph verify --shallow 2>test_err &&
 		grep -v "^+" test_err >err &&
-		test_i18ngrep "commit-graph has incorrect fanout value" err
+		test_grep "commit-graph has incorrect fanout value" err
 	)
 '
 
@@ -353,7 +353,7 @@ test_expect_success 'add octopus merge' '
 	git commit-graph verify --progress 2>err &&
 	test_line_count = 1 err &&
 	grep "Verifying commits in commit graph: 100% (18/18)" err &&
-	test_i18ngrep ! warning err &&
+	test_grep ! warning err &&
 	test_line_count = 3 $graphdir/commit-graph-chain
 '
 
@@ -455,7 +455,7 @@ test_expect_success 'prevent regression for duplicate commits across layers' '
 	git init dup &&
 	git -C dup commit --allow-empty -m one &&
 	git -C dup -c core.commitGraph=false commit-graph write --split=no-merge --reachable 2>err &&
-	test_i18ngrep "attempting to write a commit-graph" err &&
+	test_grep "attempting to write a commit-graph" err &&
 	git -C dup commit-graph write --split=no-merge --reachable &&
 	git -C dup commit --allow-empty -m two &&
 	git -C dup commit-graph write --split=no-merge --reachable &&
diff --git a/t/t5331-pack-objects-stdin.sh b/t/t5331-pack-objects-stdin.sh
index acab31667a..2dcf1eecee 100755
--- a/t/t5331-pack-objects-stdin.sh
+++ b/t/t5331-pack-objects-stdin.sh
@@ -65,7 +65,7 @@ test_expect_success '--stdin-packs is incompatible with --filter' '
 		cd stdin-packs &&
 		test_must_fail git pack-objects --stdin-packs --stdout \
 			--filter=blob:none </dev/null 2>err &&
-		test_i18ngrep "cannot use --filter with --stdin-packs" err
+		test_grep "cannot use --filter with --stdin-packs" err
 	)
 '
 
@@ -74,7 +74,7 @@ test_expect_success '--stdin-packs is incompatible with --revs' '
 		cd stdin-packs &&
 		test_must_fail git pack-objects --stdin-packs --revs out \
 			</dev/null 2>err &&
-		test_i18ngrep "cannot use internal rev list with --stdin-packs" err
+		test_grep "cannot use internal rev list with --stdin-packs" err
 	)
 '
 
diff --git a/t/t5411/test-0026-push-options.sh b/t/t5411/test-0026-push-options.sh
index 6dfc7b1c0d..510fff38da 100644
--- a/t/t5411/test-0026-push-options.sh
+++ b/t/t5411/test-0026-push-options.sh
@@ -18,7 +18,7 @@ test_expect_success "proc-receive: not support push options ($PROTOCOL)" '
 		HEAD:refs/for/main/topic \
 		>out-$test_count 2>&1 &&
 	make_user_friendly_and_stable_output <out-$test_count >actual &&
-	test_i18ngrep "fatal: the receiving end does not support push options" \
+	test_grep "fatal: the receiving end does not support push options" \
 		actual &&
 
 	test_cmp_refs -C "$upstream" <<-EOF
diff --git a/t/t5411/test-0027-push-options--porcelain.sh b/t/t5411/test-0027-push-options--porcelain.sh
index 768880b40f..9435457de0 100644
--- a/t/t5411/test-0027-push-options--porcelain.sh
+++ b/t/t5411/test-0027-push-options--porcelain.sh
@@ -19,7 +19,7 @@ test_expect_success "proc-receive: not support push options ($PROTOCOL/porcelain
 		HEAD:refs/for/main/topic \
 		>out-$test_count 2>&1 &&
 	make_user_friendly_and_stable_output <out-$test_count >actual &&
-	test_i18ngrep "fatal: the receiving end does not support push options" \
+	test_grep "fatal: the receiving end does not support push options" \
 		actual &&
 
 	test_cmp_refs -C "$upstream" <<-EOF
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index d18f2823d8..573e62341f 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -403,7 +403,7 @@ test_expect_success 'in_vain not triggered before first ACK' '
 	test_commit -C myserver bar &&
 
 	git -C myclient fetch --progress origin 2>log &&
-	test_i18ngrep "remote: Total 3 " log
+	test_grep "remote: Total 3 " log
 '
 
 test_expect_success 'in_vain resetted upon ACK' '
@@ -435,7 +435,7 @@ test_expect_success 'in_vain resetted upon ACK' '
 	# the client reports that first_anotherbranch_commit is common.
 	GIT_TRACE2_EVENT="$(pwd)/trace2" git -C myclient fetch --progress origin main 2>log &&
 	grep \"key\":\"total_rounds\",\"value\":\"6\" trace2 &&
-	test_i18ngrep "Total 3 " log
+	test_grep "Total 3 " log
 '
 
 test_expect_success 'fetch in shallow repo unreachable shallow objects' '
@@ -459,7 +459,7 @@ test_expect_success 'fetch creating new shallow root' '
 		git fetch --depth=1 --progress 2>actual &&
 		# This should fetch only the empty commit, no tree or
 		# blob objects
-		test_i18ngrep "remote: Total 1" actual
+		test_grep "remote: Total 1" actual
 	)
 '
 
@@ -694,7 +694,7 @@ test_expect_success 'fetch-pack cannot fetch a raw sha1 that is not advertised a
 	# unadvertised objects, so restrict this test to v0.
 	test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C client fetch-pack ../server \
 		$(git -C server rev-parse refs/heads/main^) 2>err &&
-	test_i18ngrep "Server does not allow request for unadvertised object" err
+	test_grep "Server does not allow request for unadvertised object" err
 '
 
 check_prot_path () {
@@ -1010,7 +1010,7 @@ test_expect_success 'filtering by size has no effect if support for it is not ad
 	git -C client rev-list --objects --missing=allow-any "$commit" >oids &&
 	grep "$blob" oids &&
 
-	test_i18ngrep "filtering not recognized by server" err
+	test_grep "filtering not recognized by server" err
 '
 
 fetch_filter_blob_limit_zero () {
diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh
index 0b8ab4afdb..138e6778a4 100755
--- a/t/t5504-fetch-receive-strict.sh
+++ b/t/t5504-fetch-receive-strict.sh
@@ -144,7 +144,7 @@ test_expect_success 'setup bogus commit' '
 
 test_expect_success 'fsck with no skipList input' '
 	test_must_fail git fsck 2>err &&
-	test_i18ngrep "missingEmail" err
+	test_grep "missingEmail" err
 '
 
 test_expect_success 'setup sorted and unsorted skipLists' '
@@ -169,9 +169,9 @@ test_expect_success 'fsck with unsorted skipList' '
 test_expect_success 'fsck with invalid or bogus skipList input' '
 	git -c fsck.skipList=/dev/null -c fsck.missingEmail=ignore fsck &&
 	test_must_fail git -c fsck.skipList=does-not-exist -c fsck.missingEmail=ignore fsck 2>err &&
-	test_i18ngrep "could not open.*: does-not-exist" err &&
+	test_grep "could not open.*: does-not-exist" err &&
 	test_must_fail git -c fsck.skipList=.git/config -c fsck.missingEmail=ignore fsck 2>err &&
-	test_i18ngrep "invalid object name: \[core\]" err
+	test_grep "invalid object name: \[core\]" err
 '
 
 test_expect_success 'fsck with other accepted skipList input (comments & empty lines)' '
@@ -180,14 +180,14 @@ test_expect_success 'fsck with other accepted skipList input (comments & empty l
 	$(test_oid 001)
 	EOF
 	test_must_fail git -c fsck.skipList=SKIP.with-comment fsck 2>err-with-comment &&
-	test_i18ngrep "missingEmail" err-with-comment &&
+	test_grep "missingEmail" err-with-comment &&
 	cat >SKIP.with-empty-line <<-EOF &&
 	$(test_oid 001)
 
 	$(test_oid 002)
 	EOF
 	test_must_fail git -c fsck.skipList=SKIP.with-empty-line fsck 2>err-with-empty-line &&
-	test_i18ngrep "missingEmail" err-with-empty-line
+	test_grep "missingEmail" err-with-empty-line
 '
 
 test_expect_success 'fsck no garbage output from comments & empty lines errors' '
@@ -198,7 +198,7 @@ test_expect_success 'fsck no garbage output from comments & empty lines errors'
 test_expect_success 'fsck with invalid abbreviated skipList input' '
 	echo $commit | test_copy_bytes 20 >SKIP.abbreviated &&
 	test_must_fail git -c fsck.skipList=SKIP.abbreviated fsck 2>err-abbreviated &&
-	test_i18ngrep "^fatal: invalid object name: " err-abbreviated
+	test_grep "^fatal: invalid object name: " err-abbreviated
 '
 
 test_expect_success 'fsck with exhaustive accepted skipList input (various types of comments etc.)' '
@@ -231,10 +231,10 @@ test_expect_success 'push with receive.fsck.skipList' '
 	test_must_fail git push --porcelain dst bogus &&
 	git --git-dir=dst/.git config receive.fsck.skipList does-not-exist &&
 	test_must_fail git push --porcelain dst bogus 2>err &&
-	test_i18ngrep "could not open.*: does-not-exist" err &&
+	test_grep "could not open.*: does-not-exist" err &&
 	git --git-dir=dst/.git config receive.fsck.skipList config &&
 	test_must_fail git push --porcelain dst bogus 2>err &&
-	test_i18ngrep "invalid object name: \[core\]" err &&
+	test_grep "invalid object name: \[core\]" err &&
 
 	git --git-dir=dst/.git config receive.fsck.skipList SKIP &&
 	git push --porcelain dst bogus
@@ -260,10 +260,10 @@ test_expect_success 'fetch with fetch.fsck.skipList' '
 	test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
 	git --git-dir=dst/.git config fetch.fsck.skipList does-not-exist &&
 	test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec 2>err &&
-	test_i18ngrep "could not open.*: does-not-exist" err &&
+	test_grep "could not open.*: does-not-exist" err &&
 	git --git-dir=dst/.git config fetch.fsck.skipList dst/.git/config &&
 	test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec 2>err &&
-	test_i18ngrep "invalid object name: \[core\]" err &&
+	test_grep "invalid object name: \[core\]" err &&
 
 	git --git-dir=dst/.git config fetch.fsck.skipList dst/.git/SKIP &&
 	git --git-dir=dst/.git fetch "file://$(pwd)" $refspec
@@ -271,7 +271,7 @@ test_expect_success 'fetch with fetch.fsck.skipList' '
 
 test_expect_success 'fsck.<unknownmsg-id> dies' '
 	test_must_fail git -c fsck.whatEver=ignore fsck 2>err &&
-	test_i18ngrep "Unhandled message id: whatever" err
+	test_grep "Unhandled message id: whatever" err
 '
 
 test_expect_success 'push with receive.fsck.missingEmail=warn' '
@@ -293,7 +293,7 @@ test_expect_success 'push with receive.fsck.missingEmail=warn' '
 		receive.fsck.missingEmail warn &&
 	git push --porcelain dst bogus >act 2>&1 &&
 	grep "missingEmail" act &&
-	test_i18ngrep "skipping unknown msg id.*whatever" act &&
+	test_grep "skipping unknown msg id.*whatever" act &&
 	git --git-dir=dst/.git branch -D bogus &&
 	git --git-dir=dst/.git config --add \
 		receive.fsck.missingEmail ignore &&
@@ -321,7 +321,7 @@ test_expect_success 'fetch with fetch.fsck.missingEmail=warn' '
 		fetch.fsck.missingEmail warn &&
 	git --git-dir=dst/.git fetch "file://$(pwd)" $refspec >act 2>&1 &&
 	grep "missingEmail" act &&
-	test_i18ngrep "Skipping unknown msg id.*whatever" act &&
+	test_grep "Skipping unknown msg id.*whatever" act &&
 	rm -rf dst &&
 	git init dst &&
 	git --git-dir=dst/.git config fetch.fsckobjects true &&
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 43b7bcd715..7789ff12c4 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -1075,7 +1075,7 @@ test_expect_success 'remote prune to cause a dangling symref' '
 		cd eight &&
 		git remote prune origin
 	) >err 2>&1 &&
-	test_i18ngrep "has become dangling" err &&
+	test_grep "has become dangling" err &&
 
 	: And the dangling symref will not cause other annoying errors &&
 	(
@@ -1087,7 +1087,7 @@ test_expect_success 'remote prune to cause a dangling symref' '
 		cd eight &&
 		test_must_fail git branch nomore origin
 	) 2>err &&
-	test_i18ngrep "dangling symref" err
+	test_grep "dangling symref" err
 '
 
 test_expect_success 'show empty remote' '
@@ -1419,7 +1419,7 @@ test_expect_success 'extra args: setup' '
 test_extra_arg () {
 	test_expect_success "extra args: $*" "
 		test_must_fail git remote $* bogus_extra_arg 2>actual &&
-		test_i18ngrep '^usage:' actual
+		test_grep '^usage:' actual
 	"
 }
 
@@ -1453,12 +1453,12 @@ test_expect_success 'unqualified <dst> refspec DWIM and advice' '
 				oid=$(git rev-parse some-tag^{$type})
 			fi &&
 			test_must_fail git push origin $oid:dst 2>err &&
-			test_i18ngrep "error: The destination you" err &&
-			test_i18ngrep "hint: Did you mean" err &&
+			test_grep "error: The destination you" err &&
+			test_grep "hint: Did you mean" err &&
 			test_must_fail git -c advice.pushUnqualifiedRefName=false \
 				push origin $oid:dst 2>err &&
-			test_i18ngrep "error: The destination you" err &&
-			test_i18ngrep ! "hint: Did you mean" err ||
+			test_grep "error: The destination you" err &&
+			test_grep ! "hint: Did you mean" err ||
 			exit 1
 		done
 	)
@@ -1479,16 +1479,16 @@ test_expect_success 'refs/remotes/* <src> refspec and unqualified <dst> DWIM and
 		git fetch --no-tags two &&
 
 		test_must_fail git push origin refs/remotes/two/another:dst 2>err &&
-		test_i18ngrep "error: The destination you" err &&
+		test_grep "error: The destination you" err &&
 
 		test_must_fail git push origin refs/remotes/tags-from-two/my-tag:dst-tag 2>err &&
-		test_i18ngrep "error: The destination you" err &&
+		test_grep "error: The destination you" err &&
 
 		test_must_fail git push origin refs/remotes/trees-from-two/my-head-tree:dst-tree 2>err &&
-		test_i18ngrep "error: The destination you" err &&
+		test_grep "error: The destination you" err &&
 
 		test_must_fail git push origin refs/remotes/blobs-from-two/my-file-blob:dst-blob 2>err &&
-		test_i18ngrep "error: The destination you" err
+		test_grep "error: The destination you" err
 	)
 '
 
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 4f289063ce..c940521bcc 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -415,9 +415,9 @@ test_expect_success 'fetch uses remote ref names to describe new refs' '
 	(
 		cd descriptive &&
 		git fetch o 2>actual &&
-		test_i18ngrep "new branch.* -> refs/crazyheads/descriptive-branch$" actual &&
-		test_i18ngrep "new tag.* -> descriptive-tag$" actual &&
-		test_i18ngrep "new ref.* -> crazy$" actual
+		test_grep "new branch.* -> refs/crazyheads/descriptive-branch$" actual &&
+		test_grep "new tag.* -> descriptive-tag$" actual &&
+		test_grep "new ref.* -> crazy$" actual
 	) &&
 	git checkout main
 '
@@ -1113,7 +1113,7 @@ test_expect_success 'fetching with auto-gc does not lock up' '
 		git config gc.autoPackLimit 1 &&
 		git config gc.autoDetach false &&
 		GIT_ASK_YESNO="$D/askyesno" git fetch --verbose >fetch.out 2>&1 &&
-		test_i18ngrep "Auto packing the repository" fetch.out &&
+		test_grep "Auto packing the repository" fetch.out &&
 		! grep "Should I try again" fetch.out
 	)
 '
diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh
index 151c76eb09..5dbe107ce8 100755
--- a/t/t5512-ls-remote.sh
+++ b/t/t5512-ls-remote.sh
@@ -320,7 +320,7 @@ test_expect_success 'ls-remote works outside repository' '
 test_expect_success 'ls-remote --sort fails gracefully outside repository' '
 	# Use a sort key that requires access to the referenced objects.
 	nongit test_must_fail git ls-remote --sort=authordate "$TRASH_DIRECTORY" 2>err &&
-	test_i18ngrep "^fatal: not a git repository, but the field '\''authordate'\'' requires access to object data" err
+	test_grep "^fatal: not a git repository, but the field '\''authordate'\'' requires access to object data" err
 '
 
 test_expect_success 'ls-remote patterns work with all protocol versions' '
diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh
index 98f034aa77..a95841dc36 100755
--- a/t/t5514-fetch-multiple.sh
+++ b/t/t5514-fetch-multiple.sh
@@ -200,8 +200,8 @@ test_expect_success 'parallel' '
 	test_must_fail env GIT_TRACE="$PWD/trace" \
 		git fetch --jobs=2 --multiple one two 2>err &&
 	grep "preparing to run up to 2 tasks" trace &&
-	test_i18ngrep "could not fetch .one.*128" err &&
-	test_i18ngrep "could not fetch .two.*128" err
+	test_grep "could not fetch .one.*128" err &&
+	test_grep "could not fetch .two.*128" err
 '
 
 test_expect_success 'git fetch --multiple --jobs=0 picks a default' '
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 87163d7745..2e7c0e1648 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -227,7 +227,7 @@ test_expect_success 'push with negotiation proceeds anyway even if negotiation f
 	GIT_TEST_PROTOCOL_VERSION=0 GIT_TRACE2_EVENT="$(pwd)/event" \
 		git -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main 2>err &&
 	grep_wrote 5 event && # 2 commits, 2 trees, 1 blob
-	test_i18ngrep "push negotiation failed" err
+	test_grep "push negotiation failed" err
 '
 
 test_expect_success 'push with negotiation does not attempt to fetch submodules' '
@@ -1267,7 +1267,7 @@ test_expect_success 'fetch exact SHA1' '
 		# fetching the hidden object should fail by default
 		test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \
 			git fetch -v ../testrepo $the_commit:refs/heads/copy 2>err &&
-		test_i18ngrep "Server does not allow request for unadvertised object" err &&
+		test_grep "Server does not allow request for unadvertised object" err &&
 		test_must_fail git rev-parse --verify refs/heads/copy &&
 
 		# the server side can allow it to succeed
@@ -1369,7 +1369,7 @@ do
 				git fetch ../testrepo/.git $SHA1_3 2>err &&
 			# ideally we would insist this be on a "remote error:"
 			# line, but it is racy; see the commit message
-			test_i18ngrep "not our ref.*$SHA1_3\$" err
+			test_grep "not our ref.*$SHA1_3\$" err
 		)
 	'
 done
@@ -1407,7 +1407,7 @@ test_expect_success 'peeled advertisements are not considered ref tips' '
 	oid=$(git -C testrepo rev-parse mytag^{commit}) &&
 	test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \
 		git fetch testrepo $oid 2>err &&
-	test_i18ngrep "Server does not allow request for unadvertised object" err
+	test_grep "Server does not allow request for unadvertised object" err
 '
 
 test_expect_success 'pushing a specific ref applies remote.$name.push as refmap' '
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 0b72112fb1..47534f1062 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -31,7 +31,7 @@ test_pull_autostash_fail () {
 	echo dirty >new_file &&
 	git add new_file &&
 	test_must_fail git pull "$@" . copy 2>err &&
-	test_i18ngrep -E "uncommitted changes.|overwritten by merge:" err
+	test_grep -E "uncommitted changes.|overwritten by merge:" err
 }
 
 test_expect_success setup '
@@ -151,7 +151,7 @@ test_expect_success 'fail if wildcard spec does not match any refs' '
 	echo file >expect &&
 	test_cmp expect file &&
 	test_must_fail git pull . "refs/nonexisting1/*:refs/nonexisting2/*" 2>err &&
-	test_i18ngrep "no candidates for merging" err &&
+	test_grep "no candidates for merging" err &&
 	test_cmp expect file
 '
 
@@ -164,7 +164,7 @@ test_expect_success 'fail if no branches specified with non-default remote' '
 	test_cmp expect file &&
 	test_config branch.test.remote origin &&
 	test_must_fail git pull test_remote 2>err &&
-	test_i18ngrep "specify a branch on the command line" err &&
+	test_grep "specify a branch on the command line" err &&
 	test_cmp expect file
 '
 
@@ -176,7 +176,7 @@ test_expect_success 'fail if not on a branch' '
 	echo file >expect &&
 	test_cmp expect file &&
 	test_must_fail git pull 2>err &&
-	test_i18ngrep "not currently on a branch" err &&
+	test_grep "not currently on a branch" err &&
 	test_cmp expect file
 '
 
@@ -189,7 +189,7 @@ test_expect_success 'fail if no configuration for current branch' '
 	echo file >expect &&
 	test_cmp expect file &&
 	test_must_fail git pull 2>err &&
-	test_i18ngrep "no tracking information" err &&
+	test_grep "no tracking information" err &&
 	test_cmp expect file
 '
 
@@ -202,7 +202,7 @@ test_expect_success 'pull --all: fail if no configuration for current branch' '
 	echo file >expect &&
 	test_cmp expect file &&
 	test_must_fail git pull --all 2>err &&
-	test_i18ngrep "There is no tracking information" err &&
+	test_grep "There is no tracking information" err &&
 	test_cmp expect file
 '
 
@@ -214,7 +214,7 @@ test_expect_success 'fail if upstream branch does not exist' '
 	echo file >expect &&
 	test_cmp expect file &&
 	test_must_fail git pull 2>err &&
-	test_i18ngrep "no such ref was fetched" err &&
+	test_grep "no such ref was fetched" err &&
 	test_cmp expect file
 '
 
@@ -248,13 +248,13 @@ test_expect_success 'fail if the index has unresolved entries' '
 	test_file_not_empty unmerged &&
 	cp file expected &&
 	test_must_fail git pull . second 2>err &&
-	test_i18ngrep "Pulling is not possible because you have unmerged files." err &&
+	test_grep "Pulling is not possible because you have unmerged files." err &&
 	test_cmp expected file &&
 	git add file &&
 	git ls-files -u >unmerged &&
 	test_must_be_empty unmerged &&
 	test_must_fail git pull . second 2>err &&
-	test_i18ngrep "You have not concluded your merge" err &&
+	test_grep "You have not concluded your merge" err &&
 	test_cmp expected file
 '
 
@@ -264,7 +264,7 @@ test_expect_success 'fast-forwards working tree if branch head is updated' '
 	echo file >expect &&
 	test_cmp expect file &&
 	git pull . second:third 2>err &&
-	test_i18ngrep "fetch updated the current branch head" err &&
+	test_grep "fetch updated the current branch head" err &&
 	echo modified >expect &&
 	test_cmp expect file &&
 	test_cmp_rev third second
@@ -277,7 +277,7 @@ test_expect_success 'fast-forward fails with conflicting work tree' '
 	test_cmp expect file &&
 	echo conflict >file &&
 	test_must_fail git pull . second:third 2>err &&
-	test_i18ngrep "Cannot fast-forward your working tree" err &&
+	test_grep "Cannot fast-forward your working tree" err &&
 	echo conflict >expect &&
 	test_cmp expect file &&
 	test_cmp_rev third second
@@ -375,7 +375,7 @@ test_expect_success '--rebase with conflicts shows advice' '
 	test_tick &&
 	git commit -m "Create conflict" seq.txt &&
 	test_must_fail git pull --rebase . seq 2>err >out &&
-	test_i18ngrep "Resolve all conflicts manually" err
+	test_grep "Resolve all conflicts manually" err
 '
 
 test_expect_success 'failed --rebase shows advice' '
@@ -389,14 +389,14 @@ test_expect_success 'failed --rebase shows advice' '
 	git checkout -f -b fails-to-rebase HEAD^ &&
 	test_commit v2-without-cr file "2" file2-lf &&
 	test_must_fail git pull --rebase . diverging 2>err >out &&
-	test_i18ngrep "Resolve all conflicts manually" err
+	test_grep "Resolve all conflicts manually" err
 '
 
 test_expect_success '--rebase fails with multiple branches' '
 	git reset --hard before-rebase &&
 	test_must_fail git pull --rebase . copy main 2>err &&
 	test_cmp_rev HEAD before-rebase &&
-	test_i18ngrep "Cannot rebase onto multiple branches" err &&
+	test_grep "Cannot rebase onto multiple branches" err &&
 	echo modified >expect &&
 	git show HEAD:file >actual &&
 	test_cmp expect actual
@@ -520,7 +520,7 @@ test_expect_success 'pull --rebase warns on --verify-signatures' '
 	echo new >expect &&
 	git show HEAD:file2 >actual &&
 	test_cmp expect actual &&
-	test_i18ngrep "ignoring --verify-signatures for rebase" err
+	test_grep "ignoring --verify-signatures for rebase" err
 '
 
 test_expect_success 'pull --rebase does not warn on --no-verify-signatures' '
@@ -530,7 +530,7 @@ test_expect_success 'pull --rebase does not warn on --no-verify-signatures' '
 	echo new >expect &&
 	git show HEAD:file2 >actual &&
 	test_cmp expect actual &&
-	test_i18ngrep ! "verify-signatures" err
+	test_grep ! "verify-signatures" err
 '
 
 # add a feature branch, keep-merge, that is merged into main, so the
@@ -740,7 +740,7 @@ test_expect_success 'pull --rebase fails on unborn branch with staged changes' '
 		test_cmp expect actual &&
 		git show :staged-file >actual &&
 		test_cmp expect actual &&
-		test_i18ngrep "unborn branch with changes added to the index" err
+		test_grep "unborn branch with changes added to the index" err
 	)
 '
 
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
index 264de29c35..d1f0810e42 100755
--- a/t/t5521-pull-options.sh
+++ b/t/t5521-pull-options.sh
@@ -93,7 +93,7 @@ test_expect_success 'git pull --no-write-fetch-head fails' '
 	(cd clonedwfh && git init &&
 	test_expect_code 129 git pull --no-write-fetch-head "../parent" >out 2>err &&
 	test_must_be_empty out &&
-	test_i18ngrep "no-write-fetch-head" err)
+	test_grep "no-write-fetch-head" err)
 '
 
 test_expect_success 'git pull --force' '
diff --git a/t/t5523-push-upstream.sh b/t/t5523-push-upstream.sh
index 1b8d609879..1f859ade16 100755
--- a/t/t5523-push-upstream.sh
+++ b/t/t5523-push-upstream.sh
@@ -87,7 +87,7 @@ test_expect_success TTY 'progress messages go to tty' '
 	ensure_fresh_upstream &&
 
 	test_terminal git push -u upstream main >out 2>err &&
-	test_i18ngrep "Writing objects" err
+	test_grep "Writing objects" err
 '
 
 test_expect_success 'progress messages do not go to non-tty' '
@@ -95,7 +95,7 @@ test_expect_success 'progress messages do not go to non-tty' '
 
 	# skip progress messages, since stderr is non-tty
 	git push -u upstream main >out 2>err &&
-	test_i18ngrep ! "Writing objects" err
+	test_grep ! "Writing objects" err
 '
 
 test_expect_success 'progress messages go to non-tty (forced)' '
@@ -103,22 +103,22 @@ test_expect_success 'progress messages go to non-tty (forced)' '
 
 	# force progress messages to stderr, even though it is non-tty
 	git push -u --progress upstream main >out 2>err &&
-	test_i18ngrep "Writing objects" err
+	test_grep "Writing objects" err
 '
 
 test_expect_success TTY 'push -q suppresses progress' '
 	ensure_fresh_upstream &&
 
 	test_terminal git push -u -q upstream main >out 2>err &&
-	test_i18ngrep ! "Writing objects" err
+	test_grep ! "Writing objects" err
 '
 
 test_expect_success TTY 'push --no-progress suppresses progress' '
 	ensure_fresh_upstream &&
 
 	test_terminal git push -u --no-progress upstream main >out 2>err &&
-	test_i18ngrep ! "Unpacking objects" err &&
-	test_i18ngrep ! "Writing objects" err
+	test_grep ! "Unpacking objects" err &&
+	test_grep ! "Writing objects" err
 '
 
 test_expect_success TTY 'quiet push' '
diff --git a/t/t5528-push-default.sh b/t/t5528-push-default.sh
index 284e20fefd..14f7eced9a 100755
--- a/t/t5528-push-default.sh
+++ b/t/t5528-push-default.sh
@@ -179,7 +179,7 @@ test_expect_success 'push from/to new branch succeeds with simple if push.autoSe
 test_expect_success '"matching" fails if none match' '
 	git init --bare empty &&
 	test_must_fail git push empty : 2>actual &&
-	test_i18ngrep "Perhaps you should specify a branch" actual
+	test_grep "Perhaps you should specify a branch" actual
 '
 
 test_expect_success 'push ambiguously named branch with upstream, matching and simple' '
diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh
index 7c1460eaa9..558eedf25a 100755
--- a/t/t5530-upload-pack-error.sh
+++ b/t/t5530-upload-pack-error.sh
@@ -35,8 +35,8 @@ test_expect_success 'upload-pack fails due to error in pack-objects packing' '
 	printf "%04xwant %s\n00000009done\n0000" \
 		$(($hexsz + 10)) $head >input &&
 	test_must_fail git upload-pack . <input >/dev/null 2>output.err &&
-	test_i18ngrep "unable to read" output.err &&
-	test_i18ngrep "pack-objects died" output.err
+	test_grep "unable to read" output.err &&
+	test_grep "pack-objects died" output.err
 '
 
 test_expect_success 'corrupt repo differently' '
diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh
index 302e4cbdba..f3fff55744 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/t/t5531-deep-submodule-push.sh
@@ -311,7 +311,7 @@ test_expect_success 'submodule entry pointing at a tag is error' '
 	git -C work commit -m "bad commit" &&
 	test_when_finished "git -C work reset --hard HEAD^" &&
 	test_must_fail git -C work push --recurse-submodules=on-demand ../pub.git main 2>err &&
-	test_i18ngrep "is a tag, not a commit" err
+	test_grep "is a tag, not a commit" err
 '
 
 test_expect_success 'push fails if recurse submodules option passed as yes' '
diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh
index 7c0a148e73..b4bc24691c 100755
--- a/t/t5534-push-signed.sh
+++ b/t/t5534-push-signed.sh
@@ -68,13 +68,13 @@ test_expect_success 'talking with a receiver without push certificate support' '
 test_expect_success 'push --signed fails with a receiver without push certificate support' '
 	prepare_dst &&
 	test_must_fail git push --signed dst noop ff +noff 2>err &&
-	test_i18ngrep "the receiving end does not support" err
+	test_grep "the receiving end does not support" err
 '
 
 test_expect_success 'push --signed=1 is accepted' '
 	prepare_dst &&
 	test_must_fail git push --signed=1 dst noop ff +noff 2>err &&
-	test_i18ngrep "the receiving end does not support" err
+	test_grep "the receiving end does not support" err
 '
 
 test_expect_success GPG 'no certificate for a signed push with no update' '
@@ -378,7 +378,7 @@ test_expect_success GPG 'failed atomic push does not execute GPG' '
 			--signed --atomic --porcelain \
 			dst noop ff noff >out 2>err &&
 
-	test_i18ngrep ! "gpg failed to sign" err &&
+	test_grep ! "gpg failed to sign" err &&
 	cat >expect <<-EOF &&
 	To dst
 	=	refs/heads/noop:refs/heads/noop	[up to date]
diff --git a/t/t5536-fetch-conflicts.sh b/t/t5536-fetch-conflicts.sh
index 91f28c2f78..23bf696170 100755
--- a/t/t5536-fetch-conflicts.sh
+++ b/t/t5536-fetch-conflicts.sh
@@ -40,7 +40,7 @@ test_expect_success 'fetch conflict: config vs. config' '
 		"+refs/heads/branch2:refs/remotes/origin/branch1" && (
 		cd ccc &&
 		test_must_fail git fetch origin 2>error &&
-		test_i18ngrep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error
+		test_grep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error
 	)
 '
 
@@ -67,7 +67,7 @@ test_expect_success 'fetch conflict: arg vs. arg' '
 		test_must_fail git fetch origin \
 			refs/heads/*:refs/remotes/origin/* \
 			refs/heads/branch2:refs/remotes/origin/branch1 2>error &&
-		test_i18ngrep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error
+		test_grep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error
 	)
 '
 
@@ -78,8 +78,8 @@ test_expect_success 'fetch conflict: criss-cross args' '
 		git fetch origin \
 			refs/heads/branch1:refs/remotes/origin/branch2 \
 			refs/heads/branch2:refs/remotes/origin/branch1 2>error &&
-		test_i18ngrep "warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2" error &&
-		test_i18ngrep "warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1" error
+		test_grep "warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2" error &&
+		test_grep "warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1" error
 	)
 '
 
diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
index d0211cd8be..df758e187d 100755
--- a/t/t5541-http-push-smart.sh
+++ b/t/t5541-http-push-smart.sh
@@ -153,7 +153,7 @@ test_expect_success 'push fails for non-fast-forward refs unmatched by remote he
 '
 
 test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: our output' '
-	test_i18ngrep "Updates were rejected because" \
+	test_grep "Updates were rejected because" \
 		output
 '
 
@@ -297,7 +297,7 @@ test_expect_success TTY 'push shows progress when stderr is a tty' '
 	cd "$ROOT_PATH"/test_repo_clone &&
 	test_commit noisy &&
 	test_terminal git push >output 2>&1 &&
-	test_i18ngrep "^Writing objects" output
+	test_grep "^Writing objects" output
 '
 
 test_expect_success TTY 'push --quiet silences status and progress' '
@@ -311,16 +311,16 @@ test_expect_success TTY 'push --no-progress silences progress but not status' '
 	cd "$ROOT_PATH"/test_repo_clone &&
 	test_commit no-progress &&
 	test_terminal git push --no-progress >output 2>&1 &&
-	test_i18ngrep "^To http" output &&
-	test_i18ngrep ! "^Writing objects" output
+	test_grep "^To http" output &&
+	test_grep ! "^Writing objects" output
 '
 
 test_expect_success 'push --progress shows progress to non-tty' '
 	cd "$ROOT_PATH"/test_repo_clone &&
 	test_commit progress &&
 	git push --progress >output 2>&1 &&
-	test_i18ngrep "^To http" output &&
-	test_i18ngrep "^Writing objects" output
+	test_grep "^To http" output &&
+	test_grep "^Writing objects" output
 '
 
 test_expect_success 'http push gives sane defaults to reflog' '
@@ -489,10 +489,10 @@ test_expect_success 'colorize errors/hints' '
 		-c color.push=always \
 		push origin origin/main^:main 2>act &&
 	test_decode_color <act >decoded &&
-	test_i18ngrep "<RED>.*rejected.*<RESET>" decoded &&
-	test_i18ngrep "<RED>error: failed to push some refs" decoded &&
-	test_i18ngrep "<YELLOW>hint: " decoded &&
-	test_i18ngrep ! "^hint: " decoded
+	test_grep "<RED>.*rejected.*<RESET>" decoded &&
+	test_grep "<RED>error: failed to push some refs" decoded &&
+	test_grep "<YELLOW>hint: " decoded &&
+	test_grep ! "^hint: " decoded
 '
 
 test_expect_success 'report error server does not provide ref status' '
diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh
index a158e7d2c0..fb13549da7 100755
--- a/t/t5545-push-options.sh
+++ b/t/t5545-push-options.sh
@@ -252,7 +252,7 @@ test_expect_success 'push option denied properly by http server' '
 	mk_http_pair false &&
 	test_commit -C test_http_clone one &&
 	test_must_fail git -C test_http_clone push --push-option=asdf origin main 2>actual &&
-	test_i18ngrep "the receiving end does not support push options" actual &&
+	test_grep "the receiving end does not support push options" actual &&
 	git -C test_http_clone push origin main
 '
 
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
index 8f182a3cbf..e444b30bf6 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/t/t5550-http-fetch-dumb.sh
@@ -376,7 +376,7 @@ test_expect_success 'git client send an empty Accept-Language' '
 
 test_expect_success 'remote-http complains cleanly about malformed urls' '
 	test_must_fail git remote-http http::/example.com/repo.git 2>stderr &&
-	test_i18ngrep "url has no scheme" stderr
+	test_grep "url has no scheme" stderr
 '
 
 # NEEDSWORK: Writing commands to git-remote-curl can race against the latter
@@ -385,7 +385,7 @@ test_expect_success 'remote-http complains cleanly about malformed urls' '
 test_expect_success 'remote-http complains cleanly about empty scheme' '
 	test_must_fail ok=sigpipe git ls-remote \
 		http::${HTTPD_URL#http}/dumb/repo.git 2>stderr &&
-	test_i18ngrep "url has no scheme" stderr
+	test_grep "url has no scheme" stderr
 '
 
 test_expect_success 'redirects can be forbidden/allowed' '
@@ -397,7 +397,7 @@ test_expect_success 'redirects can be forbidden/allowed' '
 
 test_expect_success 'redirects are reported to stderr' '
 	# just look for a snippet of the redirected-to URL
-	test_i18ngrep /dumb/ stderr
+	test_grep /dumb/ stderr
 '
 
 test_expect_success 'non-initial redirects can be forbidden' '
@@ -466,7 +466,7 @@ test_expect_success 'can redirect through non-"info/refs?service=git-upload-pack
 
 test_expect_success 'print HTTP error when any intermediate redirect throws error' '
 	test_must_fail git clone "$HTTPD_URL/redir-to/502" 2> stderr &&
-	test_i18ngrep "unable to access.*/redir-to/502" stderr
+	test_grep "unable to access.*/redir-to/502" stderr
 '
 
 test_expect_success 'fetching via http alternates works' '
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index 21b7767cbd..8a41adf1e1 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -275,7 +275,7 @@ test_expect_success 'GIT_SMART_HTTP can disable smart http' '
 
 test_expect_success 'invalid Content-Type rejected' '
 	test_must_fail git clone $HTTPD_URL/broken_smart/repo.git 2>actual &&
-	test_i18ngrep "not valid:" actual
+	test_grep "not valid:" actual
 '
 
 test_expect_success 'create namespaced refs' '
@@ -558,7 +558,7 @@ test_expect_success 'GIT_TRACE_CURL_NO_DATA prevents data from being traced' '
 
 test_expect_success 'server-side error detected' '
 	test_must_fail git clone $HTTPD_URL/error_smart/repo.git 2>actual &&
-	test_i18ngrep "server-side error" actual
+	test_grep "server-side error" actual
 '
 
 test_expect_success 'http auth remembers successful credentials' '
diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh
index 1131503b76..f9a9bf9503 100755
--- a/t/t5570-git-daemon.sh
+++ b/t/t5570-git-daemon.sh
@@ -10,9 +10,9 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 start_git_daemon
 
 check_verbose_connect () {
-	test_i18ngrep -F "Looking up 127.0.0.1 ..." stderr &&
-	test_i18ngrep -F "Connecting to 127.0.0.1 (port " stderr &&
-	test_i18ngrep -F "done." stderr
+	test_grep -F "Looking up 127.0.0.1 ..." stderr &&
+	test_grep -F "Connecting to 127.0.0.1 (port " stderr &&
+	test_grep -F "done." stderr
 }
 
 test_expect_success 'setup repository' '
@@ -108,7 +108,7 @@ test_expect_success 'fetch notices corrupt idx' '
 
 test_expect_success 'client refuses to ask for repo with newline' '
 	test_must_fail git clone "$GIT_DAEMON_URL/repo$LF.git" dst 2>stderr &&
-	test_i18ngrep newline.is.forbidden stderr
+	test_grep newline.is.forbidden stderr
 '
 
 test_remote_error()
@@ -148,7 +148,7 @@ test_remote_error()
 	fi
 
 	test_must_fail git "$cmd" "$GIT_DAEMON_URL/$repo" "$@" 2>output &&
-	test_i18ngrep "fatal: remote error: $msg: /$repo" output &&
+	test_grep "fatal: remote error: $msg: /$repo" output &&
 	ret=$?
 	chmod +x "$GIT_DAEMON_DOCUMENT_ROOT_PATH/repo.git"
 	(exit $ret)
diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
index 4e917bf87d..51744521f7 100755
--- a/t/t5572-pull-submodule.sh
+++ b/t/t5572-pull-submodule.sh
@@ -177,7 +177,7 @@ test_expect_success 'pull --rebase --recurse-submodules fails if both sides reco
 	# submodule itself, but the merge strategy in submodules
 	# does not support rebase:
 	test_must_fail git -C super pull --rebase --recurse-submodules 2>err &&
-	test_i18ngrep "locally recorded submodule modifications" err
+	test_grep "locally recorded submodule modifications" err
 '
 
 test_expect_success 'pull --rebase --recurse-submodules (no submodule changes, no fork-point)' '
diff --git a/t/t5573-pull-verify-signatures.sh b/t/t5573-pull-verify-signatures.sh
index 1221ac0597..ab05f38a99 100755
--- a/t/t5573-pull-verify-signatures.sh
+++ b/t/t5573-pull-verify-signatures.sh
@@ -47,46 +47,46 @@ test_expect_success GPG 'create repositories with signed commits' '
 test_expect_success GPG 'pull unsigned commit with --verify-signatures' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_must_fail git pull --ff-only --verify-signatures unsigned 2>pullerror &&
-	test_i18ngrep "does not have a GPG signature" pullerror
+	test_grep "does not have a GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit with bad signature with --verify-signatures' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_must_fail git pull --ff-only --verify-signatures bad 2>pullerror &&
-	test_i18ngrep "has a bad GPG signature" pullerror
+	test_grep "has a bad GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_must_fail git pull --ff-only --verify-signatures untrusted 2>pullerror &&
-	test_i18ngrep "has an untrusted GPG signature" pullerror
+	test_grep "has an untrusted GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures and minTrustLevel=ultimate' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config gpg.minTrustLevel ultimate &&
 	test_must_fail git pull --ff-only --verify-signatures untrusted 2>pullerror &&
-	test_i18ngrep "has an untrusted GPG signature" pullerror
+	test_grep "has an untrusted GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures and minTrustLevel=marginal' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config gpg.minTrustLevel marginal &&
 	test_must_fail git pull --ff-only --verify-signatures untrusted 2>pullerror &&
-	test_i18ngrep "has an untrusted GPG signature" pullerror
+	test_grep "has an untrusted GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures and minTrustLevel=undefined' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config gpg.minTrustLevel undefined &&
 	git pull --ff-only --verify-signatures untrusted >pulloutput &&
-	test_i18ngrep "has a good GPG signature" pulloutput
+	test_grep "has a good GPG signature" pulloutput
 '
 
 test_expect_success GPG 'pull signed commit with --verify-signatures' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	git pull --verify-signatures signed >pulloutput &&
-	test_i18ngrep "has a good GPG signature" pulloutput
+	test_grep "has a good GPG signature" pulloutput
 '
 
 test_expect_success GPG 'pull commit with bad signature without verification' '
@@ -106,7 +106,7 @@ test_expect_success GPG 'pull unsigned commit into unborn branch' '
 	git init empty-repo &&
 	test_must_fail \
 		git -C empty-repo pull --verify-signatures ..  2>pullerror &&
-	test_i18ngrep "does not have a GPG signature" pullerror
+	test_grep "does not have a GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit into unborn branch with bad signature and --verify-signatures' '
@@ -114,7 +114,7 @@ test_expect_success GPG 'pull commit into unborn branch with bad signature and -
 	git init empty-repo &&
 	test_must_fail \
 		git -C empty-repo pull --ff-only --verify-signatures ../bad 2>pullerror &&
-	test_i18ngrep "has a bad GPG signature" pullerror
+	test_grep "has a bad GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures' '
@@ -122,7 +122,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature
 	git init empty-repo &&
 	test_must_fail \
 		git -C empty-repo pull --ff-only --verify-signatures ../untrusted 2>pullerror &&
-	test_i18ngrep "has an untrusted GPG signature" pullerror
+	test_grep "has an untrusted GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures and minTrustLevel=ultimate' '
@@ -131,7 +131,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature
 	test_config_global gpg.minTrustLevel ultimate &&
 	test_must_fail \
 		git -C empty-repo pull --ff-only --verify-signatures ../untrusted 2>pullerror &&
-	test_i18ngrep "has an untrusted GPG signature" pullerror
+	test_grep "has an untrusted GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures and minTrustLevel=marginal' '
@@ -140,7 +140,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature
 	test_config_global gpg.minTrustLevel marginal &&
 	test_must_fail \
 		git -C empty-repo pull --ff-only --verify-signatures ../untrusted 2>pullerror &&
-	test_i18ngrep "has an untrusted GPG signature" pullerror
+	test_grep "has an untrusted GPG signature" pullerror
 '
 
 test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures and minTrustLevel=undefined' '
@@ -148,7 +148,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature
 	git init empty-repo &&
 	test_config_global gpg.minTrustLevel undefined &&
 	git -C empty-repo pull --ff-only --verify-signatures ../untrusted >pulloutput &&
-	test_i18ngrep "has a good GPG signature" pulloutput
+	test_grep "has a good GPG signature" pulloutput
 '
 
 test_done
diff --git a/t/t5574-fetch-output.sh b/t/t5574-fetch-output.sh
index 90e6dcb9a7..a9b06b2251 100755
--- a/t/t5574-fetch-output.sh
+++ b/t/t5574-fetch-output.sh
@@ -281,12 +281,12 @@ test_expect_success '--no-show-forced-updates' '
 	(
 		cd forced-update-clone &&
 		git fetch --show-forced-updates origin 2>output &&
-		test_i18ngrep "(forced update)" output
+		test_grep "(forced update)" output
 	) &&
 	(
 		cd no-forced-update-clone &&
 		git fetch --no-show-forced-updates origin 2>output &&
-		test_i18ngrep ! "(forced update)" output
+		test_grep ! "(forced update)" output
 	)
 '
 
diff --git a/t/t5580-unc-paths.sh b/t/t5580-unc-paths.sh
index cd7604fff9..d7537a162b 100755
--- a/t/t5580-unc-paths.sh
+++ b/t/t5580-unc-paths.sh
@@ -75,7 +75,7 @@ test_expect_success push '
 test_expect_success MINGW 'remote nick cannot contain backslashes' '
 	BACKSLASHED="$(winpwd | tr / \\\\)" &&
 	git ls-remote "$BACKSLASHED" 2>err &&
-	test_i18ngrep ! "unable to access" err
+	test_grep ! "unable to access" err
 '
 
 test_expect_success 'unc alternates' '
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index b7d5551262..47eae641f0 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -630,7 +630,7 @@ test_expect_success 'clone on case-insensitive fs' '
 test_expect_success CASE_INSENSITIVE_FS 'colliding file detection' '
 	grep X icasefs/warning &&
 	grep x icasefs/warning &&
-	test_i18ngrep "the following paths have collided" icasefs/warning
+	test_grep "the following paths have collided" icasefs/warning
 '
 
 test_expect_success 'clone with GIT_DEFAULT_HASH' '
@@ -696,7 +696,7 @@ test_expect_success 'partial clone: warn if server does not support object filte
 
 	git clone --filter=blob:limit=0 "file://$(pwd)/server" client 2> err &&
 
-	test_i18ngrep "filtering not recognized by server" err
+	test_grep "filtering not recognized by server" err
 '
 
 test_expect_success 'batch missing blob request during checkout' '
@@ -767,7 +767,7 @@ test_expect_success 'reject cloning shallow repository using HTTP' '
 	test_when_finished "rm -rf repo" &&
 	git clone --bare --no-local --depth=1 src "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
 	test_must_fail git -c protocol.version=2 clone --reject-shallow $HTTPD_URL/smart/repo.git repo 2>err &&
-	test_i18ngrep -e "source repository is shallow, reject to clone." err &&
+	test_grep -e "source repository is shallow, reject to clone." err &&
 
 	git clone --no-reject-shallow $HTTPD_URL/smart/repo.git repo
 '
diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh
index 9845fc04d5..9b32db8478 100755
--- a/t/t5604-clone-reference.sh
+++ b/t/t5604-clone-reference.sh
@@ -317,7 +317,7 @@ test_expect_success SYMLINKS 'clone repo with symlinked or unknown files at obje
 	for option in --local --no-hardlinks --dissociate
 	do
 		test_must_fail git clone $option T T$option 2>err || return 1 &&
-		test_i18ngrep "symlink.*exists" err || return 1
+		test_grep "symlink.*exists" err || return 1
 	done &&
 
 	# But `--shared` clones should still work, even when specifying
diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh
index 5890319b97..fc4bbd9daf 100755
--- a/t/t5606-clone-options.sh
+++ b/t/t5606-clone-options.sh
@@ -39,7 +39,7 @@ test_expect_success 'clone -o' '
 test_expect_success 'rejects invalid -o/--origin' '
 
 	test_must_fail git clone -o "bad...name" parent clone-bad-name 2>err &&
-	test_i18ngrep "'\''bad...name'\'' is not a valid remote name" err
+	test_grep "'\''bad...name'\'' is not a valid remote name" err
 
 '
 
@@ -56,7 +56,7 @@ test_expect_success 'disallows --bare with --separate-git-dir' '
 
 	test_must_fail git clone --bare --separate-git-dir dot-git-destiation parent clone-bare-sgd 2>err &&
 	test_debug "cat err" &&
-	test_i18ngrep -e "options .--bare. and .--separate-git-dir. cannot be used together" err
+	test_grep -e "options .--bare. and .--separate-git-dir. cannot be used together" err
 
 '
 
@@ -71,7 +71,7 @@ test_expect_success 'disallows --bundle-uri with shallow options' '
 test_expect_success 'reject cloning shallow repository' '
 	test_when_finished "rm -rf repo" &&
 	test_must_fail git clone --reject-shallow shallow-repo out 2>err &&
-	test_i18ngrep -e "source repository is shallow, reject to clone." err &&
+	test_grep -e "source repository is shallow, reject to clone." err &&
 
 	git clone --no-reject-shallow shallow-repo repo
 '
@@ -79,7 +79,7 @@ test_expect_success 'reject cloning shallow repository' '
 test_expect_success 'reject cloning non-local shallow repository' '
 	test_when_finished "rm -rf repo" &&
 	test_must_fail git clone --reject-shallow --no-local shallow-repo out 2>err &&
-	test_i18ngrep -e "source repository is shallow, reject to clone." err &&
+	test_grep -e "source repository is shallow, reject to clone." err &&
 
 	git clone --no-reject-shallow --no-local shallow-repo repo
 '
@@ -149,7 +149,7 @@ test_expect_success 'redirected clone does not show progress' '
 
 	git clone "file://$(pwd)/parent" clone-redirected >out 2>err &&
 	! grep % err &&
-	test_i18ngrep ! "Checking connectivity" err
+	test_grep ! "Checking connectivity" err
 
 '
 
diff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh
index 51705aa86a..0d1e92d996 100755
--- a/t/t5607-clone-bundle.sh
+++ b/t/t5607-clone-bundle.sh
@@ -24,7 +24,7 @@ test_expect_success 'setup' '
 test_expect_success '"verify" needs a worktree' '
 	git bundle create tip.bundle -1 main &&
 	nongit test_must_fail git bundle verify ../tip.bundle 2>err &&
-	test_i18ngrep "need a repository" err
+	test_grep "need a repository" err
 '
 
 test_expect_success 'annotated tags can be excluded by rev-list options' '
@@ -166,7 +166,7 @@ test_expect_success 'git bundle v3 rejects unknown capabilities' '
 	@unknown=silly
 	EOF
 	test_must_fail git bundle verify new 2>output &&
-	test_i18ngrep "unknown capability .unknown=silly." output
+	test_grep "unknown capability .unknown=silly." output
 '
 
 test_done
diff --git a/t/t5611-clone-config.sh b/t/t5611-clone-config.sh
index 727caff443..298d4befab 100755
--- a/t/t5611-clone-config.sh
+++ b/t/t5611-clone-config.sh
@@ -103,7 +103,7 @@ test_expect_success 'set up shallow repository' '
 test_expect_success 'clone.rejectshallow=true should reject cloning shallow repo' '
 	test_when_finished "rm -rf out" &&
 	test_must_fail git -c clone.rejectshallow=true clone --no-local shallow-repo out 2>err &&
-	test_i18ngrep -e "source repository is shallow, reject to clone." err &&
+	test_grep -e "source repository is shallow, reject to clone." err &&
 
 	git -c clone.rejectshallow=false clone --no-local shallow-repo out
 '
@@ -111,7 +111,7 @@ test_expect_success 'clone.rejectshallow=true should reject cloning shallow repo
 test_expect_success 'option --[no-]reject-shallow override clone.rejectshallow config' '
 	test_when_finished "rm -rf out" &&
 	test_must_fail git -c clone.rejectshallow=false clone --reject-shallow --no-local shallow-repo out 2>err &&
-	test_i18ngrep -e "source repository is shallow, reject to clone." err &&
+	test_grep -e "source repository is shallow, reject to clone." err &&
 
 	git -c clone.rejectshallow=true clone --no-reject-shallow --no-local shallow-repo out
 '
diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh
index 8759fc2853..2da7291e37 100755
--- a/t/t5616-partial-clone.sh
+++ b/t/t5616-partial-clone.sh
@@ -353,14 +353,14 @@ test_expect_success 'upload-pack complains of bogus filter config' '
 	test_must_fail git \
 		-c uploadpackfilter.tree.maxdepth \
 		upload-pack . >/dev/null 2>err &&
-	test_i18ngrep "unable to parse.*tree.maxdepth" err
+	test_grep "unable to parse.*tree.maxdepth" err
 '
 
 test_expect_success 'upload-pack fails banned object filters' '
 	test_config -C srv.bare uploadpackfilter.blob:none.allow false &&
 	test_must_fail ok=sigpipe git clone --no-checkout --filter=blob:none \
 		"file://$(pwd)/srv.bare" pc3 2>err &&
-	test_i18ngrep "filter '\''blob:none'\'' not supported" err
+	test_grep "filter '\''blob:none'\'' not supported" err
 '
 
 test_expect_success 'upload-pack fails banned combine object filters' '
@@ -370,14 +370,14 @@ test_expect_success 'upload-pack fails banned combine object filters' '
 	test_config -C srv.bare uploadpackfilter.blob:none.allow false &&
 	test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:1 \
 		--filter=blob:none "file://$(pwd)/srv.bare" pc3 2>err &&
-	test_i18ngrep "filter '\''blob:none'\'' not supported" err
+	test_grep "filter '\''blob:none'\'' not supported" err
 '
 
 test_expect_success 'upload-pack fails banned object filters with fallback' '
 	test_config -C srv.bare uploadpackfilter.allow false &&
 	test_must_fail ok=sigpipe git clone --no-checkout --filter=blob:none \
 		"file://$(pwd)/srv.bare" pc3 2>err &&
-	test_i18ngrep "filter '\''blob:none'\'' not supported" err
+	test_grep "filter '\''blob:none'\'' not supported" err
 '
 
 test_expect_success 'upload-pack limits tree depth filters' '
@@ -386,7 +386,7 @@ test_expect_success 'upload-pack limits tree depth filters' '
 	test_config -C srv.bare uploadpackfilter.tree.maxDepth 0 &&
 	test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:1 \
 		"file://$(pwd)/srv.bare" pc3 2>err &&
-	test_i18ngrep "tree filter allows max depth 0, but got 1" err &&
+	test_grep "tree filter allows max depth 0, but got 1" err &&
 
 	git clone --no-checkout --filter=tree:0 "file://$(pwd)/srv.bare" pc4 &&
 
@@ -394,7 +394,7 @@ test_expect_success 'upload-pack limits tree depth filters' '
 	git clone --no-checkout --filter=tree:5 "file://$(pwd)/srv.bare" pc5 &&
 	test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:6 \
 		"file://$(pwd)/srv.bare" pc6 2>err &&
-	test_i18ngrep "tree filter allows max depth 5, but got 6" err
+	test_grep "tree filter allows max depth 5, but got 6" err
 '
 
 test_expect_success 'partial clone fetches blobs pointed to by refs even if normally filtered out' '
@@ -459,11 +459,11 @@ test_expect_success 'partial clone with unresolvable sparse filter fails cleanly
 	test_must_fail git clone --no-local --bare \
 				 --filter=sparse:oid=main:no-such-name \
 				 sparse-src dst.git 2>err &&
-	test_i18ngrep "unable to access sparse blob in .main:no-such-name" err &&
+	test_grep "unable to access sparse blob in .main:no-such-name" err &&
 	test_must_fail git clone --no-local --bare \
 				 --filter=sparse:oid=main \
 				 sparse-src dst.git 2>err &&
-	test_i18ngrep "unable to parse sparse filter data in" err
+	test_grep "unable to parse sparse filter data in" err
 '
 
 setup_triangle () {
@@ -493,8 +493,8 @@ setup_triangle () {
 	TREE_HASH=$(git -C server rev-parse HEAD~1^{tree}) &&
 	git -C promisor-remote fetch --keep "file://$(pwd)/server" "$TREE_HASH" &&
 	git -C promisor-remote count-objects -v >object-count &&
-	test_i18ngrep "count: 0" object-count &&
-	test_i18ngrep "in-pack: 2" object-count &&
+	test_grep "count: 0" object-count &&
+	test_grep "in-pack: 2" object-count &&
 
 	# Set it as the promisor remote of client. Thus, whenever
 	# the client lazy fetches, the lazy fetch will succeed only if it is
@@ -748,7 +748,7 @@ test_expect_success 'upon cloning, check that all refs point to objects' '
 	test_must_fail git -c protocol.version=2 clone \
 		--filter=blob:none $HTTPD_URL/one_time_perl/server repo 2>err &&
 
-	test_i18ngrep "did not send all necessary objects" err &&
+	test_grep "did not send all necessary objects" err &&
 
 	# Ensure that the one-time-perl script was used.
 	! test -e "$HTTPD_ROOT_PATH/one-time-perl"
diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh
index f21e5e9d33..3591bc2417 100755
--- a/t/t5701-git-serve.sh
+++ b/t/t5701-git-serve.sh
@@ -52,7 +52,7 @@ test_expect_success 'request invalid capability' '
 	0000
 	EOF
 	test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
-	test_i18ngrep "unknown capability" err
+	test_grep "unknown capability" err
 '
 
 test_expect_success 'request with no command' '
@@ -62,7 +62,7 @@ test_expect_success 'request with no command' '
 	0000
 	EOF
 	test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
-	test_i18ngrep "no command requested" err
+	test_grep "no command requested" err
 '
 
 test_expect_success 'request invalid command' '
@@ -73,7 +73,7 @@ test_expect_success 'request invalid command' '
 	0000
 	EOF
 	test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
-	test_i18ngrep "invalid command" err
+	test_grep "invalid command" err
 '
 
 test_expect_success 'request capability as command' '
@@ -115,7 +115,7 @@ test_expect_success 'wrong object-format' '
 	0000
 	EOF
 	test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
-	test_i18ngrep "mismatched object format" err
+	test_grep "mismatched object format" err
 '
 
 # Test the basics of ls-refs
diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh
index 6af5c2062f..3c0c6047d5 100755
--- a/t/t5702-protocol-v2.sh
+++ b/t/t5702-protocol-v2.sh
@@ -189,8 +189,8 @@ test_expect_success 'warn if using server-option with ls-remote with legacy prot
 	test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -c protocol.version=0 \
 		ls-remote -o hello -o world "file://$(pwd)/file_parent" main 2>err &&
 
-	test_i18ngrep "see protocol.version in" err &&
-	test_i18ngrep "server options require protocol version 2 or later" err
+	test_grep "see protocol.version in" err &&
+	test_grep "server options require protocol version 2 or later" err
 '
 
 test_expect_success 'clone with file:// using protocol v2' '
@@ -377,8 +377,8 @@ test_expect_success 'warn if using server-option with fetch with legacy protocol
 	test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C temp_child -c protocol.version=0 \
 		fetch -o hello -o world "file://$(pwd)/file_parent" main 2>err &&
 
-	test_i18ngrep "see protocol.version in" err &&
-	test_i18ngrep "server options require protocol version 2 or later" err
+	test_grep "see protocol.version in" err &&
+	test_grep "server options require protocol version 2 or later" err
 '
 
 test_expect_success 'server-options are sent when cloning' '
@@ -399,8 +399,8 @@ test_expect_success 'warn if using server-option with clone with legacy protocol
 		clone --server-option=hello --server-option=world \
 		"file://$(pwd)/file_parent" myclone 2>err &&
 
-	test_i18ngrep "see protocol.version in" err &&
-	test_i18ngrep "server options require protocol version 2 or later" err
+	test_grep "see protocol.version in" err &&
+	test_grep "server options require protocol version 2 or later" err
 '
 
 test_expect_success 'upload-pack respects config using protocol v2' '
@@ -495,7 +495,7 @@ test_expect_success 'partial clone warns if filter is not advertised' '
 	git -C server config uploadpack.allowfilter 0 &&
 	git -c protocol.version=2 \
 		clone --filter=blob:none "file://$(pwd)/server" client 2>err &&
-	test_i18ngrep "filtering not recognized by server, ignoring" err
+	test_grep "filtering not recognized by server, ignoring" err
 '
 
 test_expect_success 'even with handcrafted request, filter does not work if not advertised' '
@@ -736,7 +736,7 @@ test_expect_success 'file:// --negotiate-only with protocol v0' '
 		--negotiate-only \
 		--negotiation-tip=$(git -C client rev-parse HEAD) \
 		origin 2>err &&
-	test_i18ngrep "negotiate-only requires protocol v2" err
+	test_grep "negotiate-only requires protocol v2" err
 '
 
 test_expect_success 'push with custom path does not request v2' '
@@ -809,7 +809,7 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp
 	# Server responded using protocol v2
 	grep "git< version 2" log &&
 	# Client reported appropriate failure
-	test_i18ngrep "bytes of length header were received" err
+	test_grep "bytes of length header were received" err
 '
 
 test_expect_success 'clone repository with http:// using protocol v2 with incomplete pktline body' '
@@ -826,7 +826,7 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp
 	# Server responded using protocol v2
 	grep "git< version 2" log &&
 	# Client reported appropriate failure
-	test_i18ngrep "bytes of body are still expected" err
+	test_grep "bytes of body are still expected" err
 '
 
 test_expect_success 'clone with http:// using protocol v2 and invalid parameters' '
@@ -973,7 +973,7 @@ test_expect_success 'when server sends "ready", expect DELIM' '
 
 	test_must_fail git -C http_child -c protocol.version=2 \
 		fetch "$HTTPD_URL/one_time_perl/http_parent" 2> err &&
-	test_i18ngrep "expected packfile to be sent after .ready." err
+	test_grep "expected packfile to be sent after .ready." err
 '
 
 test_expect_success 'when server does not send "ready", expect FLUSH' '
@@ -1001,7 +1001,7 @@ test_expect_success 'when server does not send "ready", expect FLUSH' '
 		fetch "$HTTPD_URL/one_time_perl/http_parent" 2> err &&
 	grep "fetch< .*acknowledgments" log &&
 	! grep "fetch< .*ready" log &&
-	test_i18ngrep "expected no other sections to be sent after no .ready." err
+	test_grep "expected no other sections to be sent after no .ready." err
 '
 
 configure_exclusion () {
@@ -1111,7 +1111,7 @@ test_expect_success 'fetching with valid packfile URI but invalid hash fails' '
 		git -c protocol.version=2 \
 		-c fetch.uriprotocols=http,https \
 		clone "$HTTPD_URL/smart/http_parent" http_child 2>err &&
-	test_i18ngrep "pack downloaded from.*does not match expected hash" err
+	test_grep "pack downloaded from.*does not match expected hash" err
 '
 
 test_expect_success 'packfile-uri with transfer.fsckobjects' '
@@ -1165,7 +1165,7 @@ test_expect_success 'packfile-uri with transfer.fsckobjects fails on bad object'
 	test_must_fail git -c protocol.version=2 -c transfer.fsckobjects=1 \
 		-c fetch.uriprotocols=http,https \
 		clone "$HTTPD_URL/smart/http_parent" http_child 2>error &&
-	test_i18ngrep "invalid author/committer line - missing email" error
+	test_grep "invalid author/committer line - missing email" error
 '
 
 test_expect_success 'packfile-uri with transfer.fsckobjects succeeds when .gitmodules is separate from tree' '
@@ -1213,7 +1213,7 @@ test_expect_success 'packfile-uri with transfer.fsckobjects fails when .gitmodul
 	test_must_fail git -c protocol.version=2 -c transfer.fsckobjects=1 \
 		-c fetch.uriprotocols=http,https \
 		clone "$HTTPD_URL/smart/http_parent" http_child 2>err &&
-	test_i18ngrep "disallowed submodule name" err
+	test_grep "disallowed submodule name" err
 '
 
 test_expect_success 'packfile-uri path redacted in trace' '
@@ -1296,7 +1296,7 @@ test_expect_success 'http:// --negotiate-only without wait-for-done support' '
 		--negotiate-only \
 		--negotiation-tip=$(git -C client rev-parse HEAD) \
 		origin 2>err &&
-	test_i18ngrep "server does not support wait-for-done" err
+	test_grep "server does not support wait-for-done" err
 '
 
 test_expect_success 'http:// --negotiate-only with protocol v0' '
@@ -1310,7 +1310,7 @@ test_expect_success 'http:// --negotiate-only with protocol v0' '
 		--negotiate-only \
 		--negotiation-tip=$(git -C client rev-parse HEAD) \
 		origin 2>err &&
-	test_i18ngrep "negotiate-only requires protocol v2" err
+	test_grep "negotiate-only requires protocol v2" err
 '
 
 # DO NOT add non-httpd-specific tests here, because the last part of this
diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh
index df74f80061..191097171b 100755
--- a/t/t5703-upload-pack-ref-in-want.sh
+++ b/t/t5703-upload-pack-ref-in-want.sh
@@ -484,7 +484,7 @@ test_expect_success 'server is initially ahead - no ref in want' '
 	cp -r "$LOCAL_PRISTINE" local &&
 	inconsistency main $(test_oid numeric) &&
 	test_must_fail git -C local fetch 2>err &&
-	test_i18ngrep "fatal: remote error: upload-pack: not our ref" err
+	test_grep "fatal: remote error: upload-pack: not our ref" err
 '
 
 test_expect_success 'server is initially ahead - ref in want' '
@@ -530,7 +530,7 @@ test_expect_success 'server loses a ref - ref in want' '
 	echo "s/main/rain/" >"$HTTPD_ROOT_PATH/one-time-perl" &&
 	test_must_fail git -C local fetch 2>err &&
 
-	test_i18ngrep "fatal: remote error: unknown ref refs/heads/rain" err
+	test_grep "fatal: remote error: unknown ref refs/heads/rain" err
 '
 
 # DO NOT add non-httpd-specific tests here, because the last part of this
diff --git a/t/t5704-protocol-violations.sh b/t/t5704-protocol-violations.sh
index ae1a00afb0..11be64fc03 100755
--- a/t/t5704-protocol-violations.sh
+++ b/t/t5704-protocol-violations.sh
@@ -18,7 +18,7 @@ test_expect_success 'extra delim packet in v2 ls-refs args' '
 	} >input &&
 	test_must_fail env GIT_PROTOCOL=version=2 \
 		git upload-pack . <input 2>err &&
-	test_i18ngrep "expected flush after ls-refs arguments" err
+	test_grep "expected flush after ls-refs arguments" err
 '
 
 test_expect_success 'extra delim packet in v2 fetch args' '
@@ -31,7 +31,7 @@ test_expect_success 'extra delim packet in v2 fetch args' '
 	} >input &&
 	test_must_fail env GIT_PROTOCOL=version=2 \
 		git upload-pack . <input 2>err &&
-	test_i18ngrep "expected flush after fetch arguments" err
+	test_grep "expected flush after fetch arguments" err
 '
 
 test_expect_success 'bogus symref in v0 capabilities' '
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index d386076dbd..4e0a77f985 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -137,7 +137,7 @@ test_expect_success 'forced push' '
 test_expect_success 'cloning without refspec' '
 	GIT_REMOTE_TESTGIT_NOREFSPEC=1 \
 	git clone "testgit::${PWD}/server" local2 2>error &&
-	test_i18ngrep "this remote helper should implement refspec capability" error &&
+	test_grep "this remote helper should implement refspec capability" error &&
 	compare_refs local2 HEAD server HEAD
 '
 
@@ -145,7 +145,7 @@ test_expect_success 'pulling without refspecs' '
 	(cd local2 &&
 	git reset --hard &&
 	GIT_REMOTE_TESTGIT_NOREFSPEC=1 git pull 2>../error) &&
-	test_i18ngrep "this remote helper should implement refspec capability" error &&
+	test_grep "this remote helper should implement refspec capability" error &&
 	compare_refs local2 HEAD server HEAD
 '
 
@@ -157,7 +157,7 @@ test_expect_success 'pushing without refspecs' '
 	GIT_REMOTE_TESTGIT_NOREFSPEC=1 &&
 	export GIT_REMOTE_TESTGIT_NOREFSPEC &&
 	test_must_fail git push 2>../error) &&
-	test_i18ngrep "remote-helper doesn.t support push; refspec needed" error
+	test_grep "remote-helper doesn.t support push; refspec needed" error
 '
 
 test_expect_success 'pulling without marks' '
@@ -256,7 +256,7 @@ clean_mark () {
 test_expect_success 'proper failure checks for fetching' '
 	(cd local &&
 	test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
-	test_i18ngrep -q "error while running fast-import" error
+	test_grep -q "error while running fast-import" error
 	)
 '
 
diff --git a/t/t5812-proto-disable-http.sh b/t/t5812-proto-disable-http.sh
index d8da5f58d1..769c717e88 100755
--- a/t/t5812-proto-disable-http.sh
+++ b/t/t5812-proto-disable-http.sh
@@ -20,7 +20,7 @@ test_expect_success 'http(s) transport respects GIT_ALLOW_PROTOCOL' '
 	test_must_fail env GIT_ALLOW_PROTOCOL=http:https \
 			   GIT_SMART_HTTP=0 \
 		git clone "$HTTPD_URL/ftp-redir/repo.git" 2>stderr &&
-	test_i18ngrep -E "(ftp.*disabled|your curl version is too old)" stderr
+	test_grep -E "(ftp.*disabled|your curl version is too old)" stderr
 '
 
 test_expect_success 'curl limits redirects' '
diff --git a/t/t6001-rev-list-graft.sh b/t/t6001-rev-list-graft.sh
index 16635ecc33..73a2465aa0 100755
--- a/t/t6001-rev-list-graft.sh
+++ b/t/t6001-rev-list-graft.sh
@@ -118,10 +118,10 @@ done
 
 test_expect_success 'show advice that grafts are deprecated' '
 	git show HEAD 2>err &&
-	test_i18ngrep "git replace" err &&
+	test_grep "git replace" err &&
 	test_config advice.graftFileDeprecated false &&
 	git show HEAD 2>err &&
-	test_i18ngrep ! "git replace" err
+	test_grep ! "git replace" err
 '
 
 test_done
diff --git a/t/t6021-rev-list-exclude-hidden.sh b/t/t6021-rev-list-exclude-hidden.sh
index 1a9d37e638..cdf7aa9427 100755
--- a/t/t6021-rev-list-exclude-hidden.sh
+++ b/t/t6021-rev-list-exclude-hidden.sh
@@ -151,12 +151,12 @@ do
 	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_grep "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
+			test_grep "error: --exclude-hidden cannot be used together with --$pseudoopt" err
 		'
 	done
 done
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index fb01bd6abc..2a5b7d8379 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -220,7 +220,7 @@ test_expect_success 'bisect start: existing ".git/BISECT_START" not modified if
 	cp .git/BISECT_START saved &&
 	test_must_fail git bisect start $HASH4 foo -- &&
 	git branch > branch.output &&
-	test_i18ngrep "* (no branch, bisect started on other)" branch.output > /dev/null &&
+	test_grep "* (no branch, bisect started on other)" branch.output > /dev/null &&
 	test_cmp saved .git/BISECT_START
 '
 test_expect_success 'bisect start: no ".git/BISECT_START" if mistaken rev' '
@@ -588,7 +588,7 @@ test_expect_success 'bisect starting with a detached HEAD' '
 test_expect_success 'bisect errors out if bad and good are mistaken' '
 	git bisect reset &&
 	test_must_fail git bisect start $HASH2 $HASH4 2> rev_list_error &&
-	test_i18ngrep "mistook good and bad" rev_list_error &&
+	test_grep "mistook good and bad" rev_list_error &&
 	git bisect reset
 '
 
@@ -630,7 +630,7 @@ test_expect_success 'side branch creation' '
 
 test_expect_success 'good merge base when good and bad are siblings' '
 	git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
+	test_grep "merge base must be tested" my_bisect_log.txt &&
 	grep $HASH4 my_bisect_log.txt &&
 	git bisect good > my_bisect_log.txt &&
 	! grep "merge base must be tested" my_bisect_log.txt &&
@@ -639,7 +639,7 @@ test_expect_success 'good merge base when good and bad are siblings' '
 '
 test_expect_success 'skipped merge base when good and bad are siblings' '
 	git bisect start "$SIDE_HASH7" "$HASH7" > my_bisect_log.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
+	test_grep "merge base must be tested" my_bisect_log.txt &&
 	grep $HASH4 my_bisect_log.txt &&
 	git bisect skip > my_bisect_log.txt 2>&1 &&
 	grep "warning" my_bisect_log.txt &&
@@ -649,11 +649,11 @@ test_expect_success 'skipped merge base when good and bad are siblings' '
 
 test_expect_success 'bad merge base when good and bad are siblings' '
 	git bisect start "$HASH7" HEAD > my_bisect_log.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
+	test_grep "merge base must be tested" my_bisect_log.txt &&
 	grep $HASH4 my_bisect_log.txt &&
 	test_must_fail git bisect bad > my_bisect_log.txt 2>&1 &&
-	test_i18ngrep "merge base $HASH4 is bad" my_bisect_log.txt &&
-	test_i18ngrep "fixed between $HASH4 and \[$SIDE_HASH7\]" my_bisect_log.txt &&
+	test_grep "merge base $HASH4 is bad" my_bisect_log.txt &&
+	test_grep "fixed between $HASH4 and \[$SIDE_HASH7\]" my_bisect_log.txt &&
 	git bisect reset
 '
 
@@ -704,9 +704,9 @@ test_expect_success '"git bisect run --first-parent" simple case' '
 
 test_expect_success 'good merge bases when good and bad are siblings' '
 	git bisect start "$B_HASH" "$A_HASH" > my_bisect_log.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
+	test_grep "merge base must be tested" my_bisect_log.txt &&
 	git bisect good > my_bisect_log2.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log2.txt &&
+	test_grep "merge base must be tested" my_bisect_log2.txt &&
 	{
 		{
 			grep "$SIDE_HASH5" my_bisect_log.txt &&
@@ -721,14 +721,14 @@ test_expect_success 'good merge bases when good and bad are siblings' '
 
 test_expect_success 'optimized merge base checks' '
 	git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
+	test_grep "merge base must be tested" my_bisect_log.txt &&
 	grep "$HASH4" my_bisect_log.txt &&
 	git bisect good > my_bisect_log2.txt &&
 	test -f ".git/BISECT_ANCESTORS_OK" &&
 	test "$HASH6" = $(git rev-parse --verify HEAD) &&
 	git bisect bad &&
 	git bisect good "$A_HASH" > my_bisect_log4.txt &&
-	test_i18ngrep "merge base must be tested" my_bisect_log4.txt &&
+	test_grep "merge base must be tested" my_bisect_log4.txt &&
 	test_path_is_missing ".git/BISECT_ANCESTORS_OK"
 '
 
@@ -806,7 +806,7 @@ test_expect_success 'skipping away from skipped commit' '
 
 test_expect_success 'erroring out when using bad path arguments' '
 	test_must_fail git bisect start $PARA_HASH7 $HASH1 -- foobar 2> error.txt &&
-	test_i18ngrep "bad path arguments" error.txt
+	test_grep "bad path arguments" error.txt
 '
 
 test_expect_success 'test bisection on bare repo - --no-checkout specified' '
diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh
index 7ddbd96e58..acc281c116 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -83,13 +83,13 @@ test_expect_success 'checkout (diverged from upstream)' '
 	(
 		cd test && git checkout b1
 	) >actual &&
-	test_i18ngrep "have 1 and 1 different" actual
+	test_grep "have 1 and 1 different" actual
 '
 
 test_expect_success 'checkout with local tracked branch' '
 	git checkout main &&
 	git checkout follower >actual &&
-	test_i18ngrep "is ahead of" actual
+	test_grep "is ahead of" actual
 '
 
 test_expect_success 'checkout (upstream is gone)' '
@@ -97,14 +97,14 @@ test_expect_success 'checkout (upstream is gone)' '
 		cd test &&
 		git checkout b5
 	) >actual &&
-	test_i18ngrep "is based on .*, but the upstream is gone." actual
+	test_grep "is based on .*, but the upstream is gone." actual
 '
 
 test_expect_success 'checkout (up-to-date with upstream)' '
 	(
 		cd test && git checkout b6
 	) >actual &&
-	test_i18ngrep "Your branch is up to date with .origin/main" actual
+	test_grep "Your branch is up to date with .origin/main" actual
 '
 
 test_expect_success 'status (diverged from upstream)' '
@@ -114,7 +114,7 @@ test_expect_success 'status (diverged from upstream)' '
 		# reports nothing to commit
 		test_must_fail git commit --dry-run
 	) >actual &&
-	test_i18ngrep "have 1 and 1 different" actual
+	test_grep "have 1 and 1 different" actual
 '
 
 test_expect_success 'status (upstream is gone)' '
@@ -124,7 +124,7 @@ test_expect_success 'status (upstream is gone)' '
 		# reports nothing to commit
 		test_must_fail git commit --dry-run
 	) >actual &&
-	test_i18ngrep "is based on .*, but the upstream is gone." actual
+	test_grep "is based on .*, but the upstream is gone." actual
 '
 
 test_expect_success 'status (up-to-date with upstream)' '
@@ -134,7 +134,7 @@ test_expect_success 'status (up-to-date with upstream)' '
 		# reports nothing to commit
 		test_must_fail git commit --dry-run
 	) >actual &&
-	test_i18ngrep "Your branch is up to date with .origin/main" actual
+	test_grep "Your branch is up to date with .origin/main" actual
 '
 
 cat >expect <<\EOF
@@ -253,7 +253,7 @@ test_expect_success 'fail to track lightweight tags' '
 	git checkout main &&
 	git tag light &&
 	test_must_fail git branch --track lighttrack light >actual &&
-	test_i18ngrep ! "set up to track" actual &&
+	test_grep ! "set up to track" actual &&
 	test_must_fail git checkout lighttrack
 '
 
@@ -261,7 +261,7 @@ test_expect_success 'fail to track annotated tags' '
 	git checkout main &&
 	git tag -m heavy heavy &&
 	test_must_fail git branch --track heavytrack heavy >actual &&
-	test_i18ngrep ! "set up to track" actual &&
+	test_grep ! "set up to track" actual &&
 	test_must_fail git checkout heavytrack
 '
 
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index c9925edf20..c6e9b33e44 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -44,7 +44,7 @@ commit_peeling_shows_parents ()
 	_parent_number=$(( $_parent_number + 1 ))
     done &&
     test_must_fail git rev-parse --verify $_commit^$_parent_number 2>err &&
-    test_i18ngrep "Needed a single revision" err
+    test_grep "Needed a single revision" err
 }
 
 commit_has_parents ()
@@ -137,8 +137,8 @@ test_expect_success 'tag replaced commit' '
 
 test_expect_success '"git fsck" works' '
 	git fsck main >fsck_main.out &&
-	test_i18ngrep "dangling commit $R" fsck_main.out &&
-	test_i18ngrep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_main.out &&
+	test_grep "dangling commit $R" fsck_main.out &&
+	test_grep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_main.out &&
 	test -z "$(git fsck)"
 '
 
@@ -490,9 +490,9 @@ test_expect_success '--convert-graft-file' '
 		$(git rev-parse HEAD^^ HEAD^ HEAD^^ HEAD^2) \
 		>.git/info/grafts &&
 	git status 2>stderr &&
-	test_i18ngrep "hint:.*grafts is deprecated" stderr &&
+	test_grep "hint:.*grafts is deprecated" stderr &&
 	git replace --convert-graft-file 2>stderr &&
-	test_i18ngrep ! "hint:.*grafts is deprecated" stderr &&
+	test_grep ! "hint:.*grafts is deprecated" stderr &&
 	test_path_is_missing .git/info/grafts &&
 
 	: verify that the history is now "grafted" &&
@@ -503,8 +503,8 @@ test_expect_success '--convert-graft-file' '
 	test_when_finished "rm -f .git/info/grafts" &&
 	echo $EMPTY_BLOB $EMPTY_TREE >.git/info/grafts &&
 	test_must_fail git replace --convert-graft-file 2>err &&
-	test_i18ngrep "$EMPTY_BLOB $EMPTY_TREE" err &&
-	test_i18ngrep "$EMPTY_BLOB $EMPTY_TREE" .git/info/grafts
+	test_grep "$EMPTY_BLOB $EMPTY_TREE" err &&
+	test_grep "$EMPTY_BLOB $EMPTY_TREE" .git/info/grafts
 '
 
 test_done
diff --git a/t/t6102-rev-list-unexpected-objects.sh b/t/t6102-rev-list-unexpected-objects.sh
index 9350b5fd2c..5d28507efc 100755
--- a/t/t6102-rev-list-unexpected-objects.sh
+++ b/t/t6102-rev-list-unexpected-objects.sh
@@ -28,7 +28,7 @@ test_expect_success 'TODO (should fail!): traverse unexpected non-blob entry (lo
 
 test_expect_success 'traverse unexpected non-blob entry (seen)' '
 	test_must_fail git rev-list --objects $tree $broken_tree >output 2>&1 &&
-	test_i18ngrep "is not a blob" output
+	test_grep "is not a blob" output
 '
 
 test_expect_success 'setup unexpected non-tree entry' '
@@ -42,7 +42,7 @@ test_expect_success 'traverse unexpected non-tree entry (lone)' '
 
 test_expect_success 'traverse unexpected non-tree entry (seen)' '
 	test_must_fail git rev-list --objects $blob $broken_tree >output 2>&1 &&
-	test_i18ngrep "is not a tree" output
+	test_grep "is not a tree" output
 '
 
 test_expect_success 'setup unexpected non-commit parent' '
@@ -54,13 +54,13 @@ test_expect_success 'setup unexpected non-commit parent' '
 
 test_expect_success 'traverse unexpected non-commit parent (lone)' '
 	test_must_fail git rev-list --objects $broken_commit >output 2>&1 &&
-	test_i18ngrep "not a commit" output
+	test_grep "not a commit" output
 '
 
 test_expect_success 'traverse unexpected non-commit parent (seen)' '
 	test_must_fail git rev-list --objects $blob $broken_commit \
 		>output 2>&1 &&
-	test_i18ngrep "not a commit" output
+	test_grep "not a commit" output
 '
 
 test_expect_success 'setup unexpected non-tree root' '
@@ -76,7 +76,7 @@ test_expect_success 'traverse unexpected non-tree root (lone)' '
 test_expect_success 'traverse unexpected non-tree root (seen)' '
 	test_must_fail git rev-list --objects $blob $broken_commit \
 		>output 2>&1 &&
-	test_i18ngrep "not a tree" output
+	test_grep "not a tree" output
 '
 
 test_expect_success 'setup unexpected non-commit tag' '
@@ -93,7 +93,7 @@ test_expect_success 'traverse unexpected non-commit tag (lone)' '
 
 test_expect_success 'traverse unexpected non-commit tag (seen)' '
 	test_must_fail git rev-list --objects $blob $tag >output 2>&1 &&
-	test_i18ngrep "not a commit" output
+	test_grep "not a commit" output
 '
 
 test_expect_success 'setup unexpected non-tree tag' '
@@ -110,7 +110,7 @@ test_expect_success 'traverse unexpected non-tree tag (lone)' '
 
 test_expect_success 'traverse unexpected non-tree tag (seen)' '
 	test_must_fail git rev-list --objects $blob $tag >output 2>&1 &&
-	test_i18ngrep "not a tree" output
+	test_grep "not a tree" output
 '
 
 test_expect_success 'setup unexpected non-blob tag' '
@@ -127,7 +127,7 @@ test_expect_success 'traverse unexpected non-blob tag (lone)' '
 
 test_expect_success 'traverse unexpected non-blob tag (seen)' '
 	test_must_fail git rev-list --objects $commit $tag >output 2>&1 &&
-	test_i18ngrep "not a blob" output
+	test_grep "not a blob" output
 '
 
 test_done
diff --git a/t/t6112-rev-list-filters-objects.sh b/t/t6112-rev-list-filters-objects.sh
index 8d9d6604f0..52822b9461 100755
--- a/t/t6112-rev-list-filters-objects.sh
+++ b/t/t6112-rev-list-filters-objects.sh
@@ -457,7 +457,7 @@ expect_invalid_filter_spec () {
 	test_must_fail git -C r3 rev-list --objects --filter="$spec" HEAD \
 		>actual 2>actual_stderr &&
 	test_must_be_empty actual &&
-	test_i18ngrep "$err" actual_stderr
+	test_grep "$err" actual_stderr
 }
 
 test_expect_success 'combine:... while URL-encoding things that should not be' '
diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh
index 0a5c487540..e78315d23d 100755
--- a/t/t6120-describe.sh
+++ b/t/t6120-describe.sh
@@ -392,7 +392,7 @@ test_expect_success 'describe directly tagged blob' '
 test_expect_success 'describe tag object' '
 	git tag test-blob-1 -a -m msg unique-file:file &&
 	test_must_fail git describe test-blob-1 2>actual &&
-	test_i18ngrep "fatal: test-blob-1 is neither a commit nor blob" actual
+	test_grep "fatal: test-blob-1 is neither a commit nor blob" actual
 '
 
 test_expect_success ULIMIT_STACK_SIZE 'name-rev works in a deep repo' '
diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh
index 3214d9db97..16ce4cfcc6 100755
--- a/t/t6134-pathspec-in-submodule.sh
+++ b/t/t6134-pathspec-in-submodule.sh
@@ -27,7 +27,7 @@ test_expect_success 'error message for path inside submodule' '
 
 test_expect_success 'error message for path inside submodule from within submodule' '
 	test_must_fail git -C sub add . 2>actual &&
-	test_i18ngrep "in unpopulated submodule" actual
+	test_grep "in unpopulated submodule" actual
 '
 
 test_done
diff --git a/t/t6135-pathspec-with-attrs.sh b/t/t6135-pathspec-with-attrs.sh
index f70c395e75..a9c1e4e0ec 100755
--- a/t/t6135-pathspec-with-attrs.sh
+++ b/t/t6135-pathspec-with-attrs.sh
@@ -236,7 +236,7 @@ test_expect_success 'check label excluding other labels' '
 
 test_expect_success 'fail on multiple attr specifiers in one pathspec item' '
 	test_must_fail git ls-files . ":(attr:labelB,attr:labelC)" 2>actual &&
-	test_i18ngrep "Only one" actual
+	test_grep "Only one" actual
 '
 
 test_expect_success 'fail if attr magic is used places not implemented' '
@@ -246,7 +246,7 @@ test_expect_success 'fail if attr magic is used places not implemented' '
 	# though, but git-add is convenient as it has its own internal pathspec
 	# parsing.
 	test_must_fail git add ":(attr:labelB)" 2>actual &&
-	test_i18ngrep "magic not supported" actual
+	test_grep "magic not supported" actual
 '
 
 test_expect_success 'abort on giving invalid label on the command line' '
@@ -269,12 +269,12 @@ test_expect_success 'check attribute list' '
 
 test_expect_success 'backslash cannot be the last character' '
 	test_must_fail git ls-files ":(attr:label=foo\\ labelA=bar)" 2>actual &&
-	test_i18ngrep "not allowed as last character in attr value" actual
+	test_grep "not allowed as last character in attr value" actual
 '
 
 test_expect_success 'backslash cannot be used as a value' '
 	test_must_fail git ls-files ":(attr:label=f\\\oo)" 2>actual &&
-	test_i18ngrep "for value matching" actual
+	test_grep "for value matching" actual
 '
 
 test_expect_success 'reading from .gitattributes in a subdirectory (1)' '
diff --git a/t/t6136-pathspec-in-bare.sh b/t/t6136-pathspec-in-bare.sh
index ae8b5379e2..2db37a6596 100755
--- a/t/t6136-pathspec-in-bare.sh
+++ b/t/t6136-pathspec-in-bare.sh
@@ -15,11 +15,11 @@ test_expect_success 'log and ls-files in a bare repository' '
 		cd bare &&
 		test_must_fail git log -- .. >out 2>err &&
 		test_must_be_empty out &&
-		test_i18ngrep "outside repository" err &&
+		test_grep "outside repository" err &&
 
 		test_must_fail git ls-files -- .. >out 2>err &&
 		test_must_be_empty out &&
-		test_i18ngrep "outside repository" err
+		test_grep "outside repository" err
 	)
 '
 
@@ -28,11 +28,11 @@ test_expect_success 'log and ls-files in .git directory' '
 		cd .git &&
 		test_must_fail git log -- .. >out 2>err &&
 		test_must_be_empty out &&
-		test_i18ngrep "outside repository" err &&
+		test_grep "outside repository" err &&
 
 		test_must_fail git ls-files -- .. >out 2>err &&
 		test_must_be_empty out &&
-		test_i18ngrep "outside repository" err
+		test_grep "outside repository" err
 	)
 '
 
diff --git a/t/t6402-merge-rename.sh b/t/t6402-merge-rename.sh
index 772238e582..2738b50c2a 100755
--- a/t/t6402-merge-rename.sh
+++ b/t/t6402-merge-rename.sh
@@ -311,13 +311,13 @@ test_expect_success 'Rename+D/F conflict; renamed file merges but dir in way' '
 	git checkout -q renamed-file-has-no-conflicts^0 &&
 	test_must_fail git merge --strategy=recursive dir-in-way >output &&
 
-	test_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output &&
-	test_i18ngrep "Auto-merging dir" output &&
+	test_grep "CONFLICT (modify/delete): dir/file-in-the-way" output &&
+	test_grep "Auto-merging dir" output &&
 	if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 	then
-		test_i18ngrep "moving it to dir~HEAD instead" output
+		test_grep "moving it to dir~HEAD instead" output
 	else
-		test_i18ngrep "Adding as dir~HEAD instead" output
+		test_grep "Adding as dir~HEAD instead" output
 	fi &&
 
 	test_stdout_line_count = 3 git ls-files -u &&
@@ -338,13 +338,13 @@ test_expect_success 'Same as previous, but merged other way' '
 	test_must_fail git merge --strategy=recursive renamed-file-has-no-conflicts >output 2>errors &&
 
 	! grep "error: refusing to lose untracked file at" errors &&
-	test_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output &&
-	test_i18ngrep "Auto-merging dir" output &&
+	test_grep "CONFLICT (modify/delete): dir/file-in-the-way" output &&
+	test_grep "Auto-merging dir" output &&
 	if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 	then
-		test_i18ngrep "moving it to dir~renamed-file-has-no-conflicts instead" output
+		test_grep "moving it to dir~renamed-file-has-no-conflicts instead" output
 	else
-		test_i18ngrep "Adding as dir~renamed-file-has-no-conflicts instead" output
+		test_grep "Adding as dir~renamed-file-has-no-conflicts instead" output
 	fi &&
 
 	test_stdout_line_count = 3 git ls-files -u &&
diff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh
index 076b6a74d5..80d7b5eaba 100755
--- a/t/t6422-merge-rename-corner-cases.sh
+++ b/t/t6422-merge-rename-corner-cases.sh
@@ -476,7 +476,7 @@ test_expect_success 'handle rename-with-content-merge vs. add' '
 		git checkout A^0 &&
 
 		test_must_fail git merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (.*/add)" out &&
+		test_grep "CONFLICT (.*/add)" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 2 out &&
@@ -522,7 +522,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way'
 		git checkout B^0 &&
 
 		test_must_fail git merge -s recursive A^0 >out &&
-		test_i18ngrep "CONFLICT (.*/add)" out &&
+		test_grep "CONFLICT (.*/add)" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 2 out &&
@@ -602,7 +602,7 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '
 		git checkout B^0 &&
 
 		test_must_fail git merge -s recursive C^0 >out &&
-		test_i18ngrep "CONFLICT (\(.*\)/\1)" out &&
+		test_grep "CONFLICT (\(.*\)/\1)" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 2 out &&
@@ -914,8 +914,8 @@ test_expect_merge_algorithm failure success 'rad-check: rename/add/delete confli
 		# be flexible in the type of console output message(s) reported
 		# for this particular case; we will be more stringent about the
 		# contents of the index and working directory.
-		test_i18ngrep "CONFLICT (.*/add)" out &&
-		test_i18ngrep "CONFLICT (rename.*/delete)" out &&
+		test_grep "CONFLICT (.*/add)" out &&
+		test_grep "CONFLICT (rename.*/delete)" out &&
 		test_must_be_empty err &&
 
 		git ls-files -s >file_count &&
@@ -988,8 +988,8 @@ test_expect_merge_algorithm failure success 'rrdd-check: rename/rename(2to1)/del
 		# be flexible in the type of console output message(s) reported
 		# for this particular case; we will be more stringent about the
 		# contents of the index and working directory.
-		test_i18ngrep "CONFLICT (\(.*\)/\1)" out &&
-		test_i18ngrep "CONFLICT (rename.*delete)" out &&
+		test_grep "CONFLICT (\(.*\)/\1)" out &&
+		test_grep "CONFLICT (rename.*delete)" out &&
 		test_must_be_empty err &&
 
 		git ls-files -s >file_count &&
@@ -1068,7 +1068,7 @@ test_expect_merge_algorithm failure success 'mod6-check: chains of rename/rename
 
 		test_must_fail git merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep "CONFLICT (rename/rename)" out &&
+		test_grep "CONFLICT (rename/rename)" out &&
 		test_must_be_empty err &&
 
 		git ls-files -s >file_count &&
diff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh
index 944de75b80..88d1cf2cde 100755
--- a/t/t6423-merge-rename-directories.sh
+++ b/t/t6423-merge-rename-directories.sh
@@ -276,7 +276,7 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict'
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (\(.*\)/\1)" out &&
+		test_grep "CONFLICT (\(.*\)/\1)" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 8 out &&
@@ -515,7 +515,7 @@ test_expect_success '2a: Directory split into two on one side, with equal number
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT.*directory rename split" out &&
+		test_grep "CONFLICT.*directory rename split" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 3 out &&
@@ -591,7 +591,7 @@ test_expect_success '2b: Directory split into two on one side, with equal number
 		git rev-parse >expect \
 			 O:z/b  O:z/c  B:x/d &&
 		test_cmp expect actual &&
-		test_i18ngrep ! "CONFLICT.*directory rename split" out
+		test_grep ! "CONFLICT.*directory rename split" out
 	)
 '
 
@@ -726,8 +726,8 @@ test_expect_success '3b: Avoid implicit rename if involved as source on current
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep CONFLICT.*rename/rename.*z/d.*x/d.*w/d out &&
-		test_i18ngrep ! CONFLICT.*rename/rename.*y/d out &&
+		test_grep CONFLICT.*rename/rename.*z/d.*x/d.*w/d out &&
+		test_grep ! CONFLICT.*rename/rename.*y/d out &&
 
 		git ls-files -s >out &&
 		test_line_count = 5 out &&
@@ -938,7 +938,7 @@ test_expect_success '5a: Merge directories, other side adds files to original an
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT.*implicit dir rename" out &&
+		test_grep "CONFLICT.*implicit dir rename" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 6 out &&
@@ -1013,7 +1013,7 @@ test_expect_success '5b: Rename/delete in order to get add/add/add conflict' '
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (add/add).* y/d" out &&
+		test_grep "CONFLICT (add/add).* y/d" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 5 out &&
@@ -1094,8 +1094,8 @@ test_expect_success '5c: Transitive rename would cause rename/rename/rename/add/
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (rename/rename).*x/d.*w/d.*z/d" out &&
-		test_i18ngrep "CONFLICT (add/add).* y/d" out &&
+		test_grep "CONFLICT (rename/rename).*x/d.*w/d.*z/d" out &&
+		test_grep "CONFLICT (add/add).* y/d" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 9 out &&
@@ -1179,7 +1179,7 @@ test_expect_success '5d: Directory/file/file conflict due to directory rename' '
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (file/directory).*y/d" out &&
+		test_grep "CONFLICT (file/directory).*y/d" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 6 out &&
@@ -1278,7 +1278,7 @@ test_expect_success '6a: Tricky rename/delete' '
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (rename/delete).*z/c.*y/c" out &&
+		test_grep "CONFLICT (rename/delete).*z/c.*y/c" out &&
 
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
@@ -1740,8 +1740,8 @@ test_expect_success '7a: rename-dir vs. rename-dir (NOT split evenly) PLUS add-o
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (rename/rename).*z/b.*y/b.*w/b" out &&
-		test_i18ngrep "CONFLICT (rename/rename).*z/c.*y/c.*x/c" out &&
+		test_grep "CONFLICT (rename/rename).*z/b.*y/b.*w/b" out &&
+		test_grep "CONFLICT (rename/rename).*z/c.*y/c.*x/c" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 7 out &&
@@ -1813,7 +1813,7 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename'
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (\(.*\)/\1)" out &&
+		test_grep "CONFLICT (\(.*\)/\1)" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 4 out &&
@@ -1900,7 +1900,7 @@ test_expect_success '7c: rename/rename(1to...2or3); transitive rename may add co
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (rename/rename).*x/d.*w/d.*y/d" out &&
+		test_grep "CONFLICT (rename/rename).*x/d.*w/d.*y/d" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 5 out &&
@@ -1965,7 +1965,7 @@ test_expect_success '7d: transitive rename involved in rename/delete; how is it
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (rename/delete).*x/d.*y/d" out &&
+		test_grep "CONFLICT (rename/delete).*x/d.*y/d" out &&
 
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
@@ -2071,7 +2071,7 @@ test_expect_success '7e: transitive rename in rename/delete AND dirs in the way'
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (rename/delete).*x/d.*y/d" out &&
+		test_grep "CONFLICT (rename/delete).*x/d.*y/d" out &&
 
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
@@ -2330,7 +2330,7 @@ test_expect_success '8c: modify/delete or rename+modify/delete' '
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "CONFLICT (modify/delete).* z/d" out &&
+		test_grep "CONFLICT (modify/delete).* z/d" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 5 out &&
@@ -2491,8 +2491,8 @@ test_expect_success '8e: Both sides rename, one side adds to original directory'
 		git checkout A^0 &&
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
-		test_i18ngrep CONFLICT.*rename/rename.*z/c.*y/c.*w/c out &&
-		test_i18ngrep CONFLICT.*rename/rename.*z/b.*y/b.*w/b out &&
+		test_grep CONFLICT.*rename/rename.*z/c.*y/c.*w/c out &&
+		test_grep CONFLICT.*rename/rename.*z/b.*y/b.*w/b out &&
 
 		git ls-files -s >out &&
 		test_line_count = 7 out &&
@@ -2741,7 +2741,7 @@ test_expect_success '9c: Doubly transitive rename?' '
 		git checkout A^0 &&
 
 		git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "WARNING: Avoiding applying x -> z rename to x/f" out &&
+		test_grep "WARNING: Avoiding applying x -> z rename to x/f" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 6 out &&
@@ -2830,10 +2830,10 @@ test_expect_success '9d: N-way transitive rename?' '
 		git checkout A^0 &&
 
 		git -c merge.directoryRenames=true merge -s recursive B^0 >out &&
-		test_i18ngrep "WARNING: Avoiding applying z -> y rename to z/t" out &&
-		test_i18ngrep "WARNING: Avoiding applying y -> x rename to y/a" out &&
-		test_i18ngrep "WARNING: Avoiding applying x -> w rename to x/b" out &&
-		test_i18ngrep "WARNING: Avoiding applying w -> v rename to w/c" out &&
+		test_grep "WARNING: Avoiding applying z -> y rename to z/t" out &&
+		test_grep "WARNING: Avoiding applying y -> x rename to y/a" out &&
+		test_grep "WARNING: Avoiding applying x -> w rename to x/b" out &&
+		test_grep "WARNING: Avoiding applying w -> v rename to w/c" out &&
 
 		git ls-files -s >out &&
 		test_line_count = 7 out &&
@@ -3215,7 +3215,7 @@ test_expect_success '10a: Overwrite untracked with normal rename/delete' '
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
 		test_path_is_missing .git/MERGE_HEAD &&
-		test_i18ngrep "The following untracked working tree files would be overwritten by merge" err &&
+		test_grep "The following untracked working tree files would be overwritten by merge" err &&
 
 		git ls-files -s >out &&
 		test_line_count = 1 out &&
@@ -3287,7 +3287,7 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' '
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err &&
+			test_grep "error: The following untracked working tree files would be overwritten by merge" err &&
 
 			git ls-files -s >out &&
 			test_line_count = 1 out &&
@@ -3296,8 +3296,8 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' '
 			git ls-files -o >out &&
 			test_line_count = 5 out
 		else
-			test_i18ngrep "CONFLICT (rename/delete).*Version B\^0 of y/d left in tree at y/d~B\^0" out &&
-			test_i18ngrep "Error: Refusing to lose untracked file at y/e; writing to y/e~B\^0 instead" out &&
+			test_grep "CONFLICT (rename/delete).*Version B\^0 of y/d left in tree at y/d~B\^0" out &&
+			test_grep "Error: Refusing to lose untracked file at y/e; writing to y/e~B\^0 instead" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 3 out &&
@@ -3377,7 +3377,7 @@ test_expect_success '10c1: Overwrite untracked with dir rename/rename(1to2)' '
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err &&
+			test_grep "error: The following untracked working tree files would be overwritten by merge" err &&
 
 			git ls-files -s >out &&
 			test_line_count = 4 out &&
@@ -3386,8 +3386,8 @@ test_expect_success '10c1: Overwrite untracked with dir rename/rename(1to2)' '
 			git ls-files -o >out &&
 			test_line_count = 3 out
 		else
-			test_i18ngrep "CONFLICT (rename/rename)" out &&
-			test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~B\^0 instead" out &&
+			test_grep "CONFLICT (rename/rename)" out &&
+			test_grep "Refusing to lose untracked file at y/c; adding as y/c~B\^0 instead" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 6 out &&
@@ -3428,7 +3428,7 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err &&
+			test_grep "error: The following untracked working tree files would be overwritten by merge" err &&
 
 			git ls-files -s >out &&
 			test_line_count = 4 out &&
@@ -3437,8 +3437,8 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth
 			git ls-files -o >out &&
 			test_line_count = 3 out
 		else
-			test_i18ngrep "CONFLICT (rename/rename)" out &&
-			test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~HEAD instead" out &&
+			test_grep "CONFLICT (rename/rename)" out &&
+			test_grep "Refusing to lose untracked file at y/c; adding as y/c~HEAD instead" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 6 out &&
@@ -3517,7 +3517,7 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' '
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err &&
+			test_grep "error: The following untracked working tree files would be overwritten by merge" err &&
 
 			git ls-files -s >out &&
 			test_line_count = 6 out &&
@@ -3526,8 +3526,8 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' '
 			git ls-files -o >out &&
 			test_line_count = 3 out
 		else
-			test_i18ngrep "CONFLICT (rename/rename)" out &&
-			test_i18ngrep "Refusing to lose untracked file at y/wham" out &&
+			test_grep "CONFLICT (rename/rename)" out &&
+			test_grep "Refusing to lose untracked file at y/wham" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 6 out &&
@@ -3606,7 +3606,7 @@ test_expect_merge_algorithm failure success '10e: Does git complain about untrac
 		echo random >z/c &&
 
 		git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
-		test_i18ngrep ! "following untracked working tree files would be overwritten by merge" err &&
+		test_grep ! "following untracked working tree files would be overwritten by merge" err &&
 
 		git ls-files -s >out &&
 		test_line_count = 3 out &&
@@ -3690,9 +3690,9 @@ test_expect_success '11a: Avoid losing dirty contents with simple rename' '
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err
+			test_grep "error: Your local changes to the following files would be overwritten by merge" err
 		else
-			test_i18ngrep "Refusing to lose dirty file at z/c" out &&
+			test_grep "Refusing to lose dirty file at z/c" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 2 out &&
@@ -3770,10 +3770,10 @@ test_expect_success '11b: Avoid losing dirty file involved in directory rename'
 		then
 			test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err
+			test_grep "error: Your local changes to the following files would be overwritten by merge" err
 		else
 			git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
-			test_i18ngrep "Refusing to lose dirty file at z/c" out &&
+			test_grep "Refusing to lose dirty file at z/c" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 3 out &&
@@ -3853,9 +3853,9 @@ test_expect_success '11c: Avoid losing not-uptodate with rename + D/F conflict'
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err
+			test_grep "error: Your local changes to the following files would be overwritten by merge" err
 		else
-			test_i18ngrep "following files would be overwritten by merge" err
+			test_grep "following files would be overwritten by merge" err
 		fi &&
 
 		grep -q stuff y/c &&
@@ -3927,9 +3927,9 @@ test_expect_success '11d: Avoid losing not-uptodate with rename + D/F conflict'
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err
+			test_grep "error: Your local changes to the following files would be overwritten by merge" err
 		else
-			test_i18ngrep "Refusing to lose dirty file at z/c" out &&
+			test_grep "Refusing to lose dirty file at z/c" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 4 out &&
@@ -4013,10 +4013,10 @@ test_expect_success '11e: Avoid deleting not-uptodate with dir rename/rename(1to
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err
+			test_grep "error: Your local changes to the following files would be overwritten by merge" err
 		else
-			test_i18ngrep "CONFLICT (rename/rename)" out &&
-			test_i18ngrep "Refusing to lose dirty file at y/c" out &&
+			test_grep "CONFLICT (rename/rename)" out &&
+			test_grep "Refusing to lose dirty file at y/c" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 7 out &&
@@ -4102,10 +4102,10 @@ test_expect_success '11f: Avoid deleting not-uptodate with dir rename/rename(2to
 		if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 		then
 			test_path_is_missing .git/MERGE_HEAD &&
-			test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err
+			test_grep "error: Your local changes to the following files would be overwritten by merge" err
 		else
-			test_i18ngrep "CONFLICT (rename/rename)" out &&
-			test_i18ngrep "Refusing to lose dirty file at y/wham" out &&
+			test_grep "CONFLICT (rename/rename)" out &&
+			test_grep "Refusing to lose dirty file at y/wham" out &&
 
 			git ls-files -s >out &&
 			test_line_count = 4 out &&
@@ -5417,8 +5417,8 @@ test_expect_success '13a(conflict): messages for newly added files' '
 
 		test_must_fail git merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep CONFLICT..file.location.*z/e/f.added.in.B^0.*y/e/f out &&
-		test_i18ngrep CONFLICT..file.location.*z/d.added.in.B^0.*y/d out &&
+		test_grep CONFLICT..file.location.*z/e/f.added.in.B^0.*y/e/f out &&
+		test_grep CONFLICT..file.location.*z/d.added.in.B^0.*y/d out &&
 
 		git ls-files >paths &&
 		! grep z/ paths &&
@@ -5441,8 +5441,8 @@ test_expect_success '13a(info): messages for newly added files' '
 
 		git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep Path.updated:.*z/e/f.added.in.B^0.*y/e/f out &&
-		test_i18ngrep Path.updated:.*z/d.added.in.B^0.*y/d out &&
+		test_grep Path.updated:.*z/e/f.added.in.B^0.*y/e/f out &&
+		test_grep Path.updated:.*z/d.added.in.B^0.*y/d out &&
 
 		git ls-files >paths &&
 		! grep z/ paths &&
@@ -5507,8 +5507,8 @@ test_expect_success '13b(conflict): messages for transitive rename with conflict
 
 		test_must_fail git merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep CONFLICT.*content.*Merge.conflict.in.y/d out &&
-		test_i18ngrep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out &&
+		test_grep CONFLICT.*content.*Merge.conflict.in.y/d out &&
+		test_grep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out &&
 
 		git ls-files >paths &&
 		! grep z/ paths &&
@@ -5529,8 +5529,8 @@ test_expect_success '13b(info): messages for transitive rename with conflicted c
 
 		test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep CONFLICT.*content.*Merge.conflict.in.y/d out &&
-		test_i18ngrep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out &&
+		test_grep CONFLICT.*content.*Merge.conflict.in.y/d out &&
+		test_grep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out &&
 
 		git ls-files >paths &&
 		! grep z/ paths &&
@@ -5593,7 +5593,7 @@ test_expect_success '13c(conflict): messages for rename/rename(1to1) via transit
 
 		test_must_fail git merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out &&
+		test_grep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out &&
 
 		git ls-files >paths &&
 		! grep z/ paths &&
@@ -5614,7 +5614,7 @@ test_expect_success '13c(info): messages for rename/rename(1to1) via transitive
 
 		git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out &&
+		test_grep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out &&
 
 		git ls-files >paths &&
 		! grep z/ paths &&
@@ -5682,8 +5682,8 @@ test_expect_success '13d(conflict): messages for rename/rename(1to1) via dual tr
 
 		test_must_fail git merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep CONFLICT..file.location.*a/y.renamed.to.b/y.*moved.to.d/y out &&
-		test_i18ngrep CONFLICT..file.location.*a/y.renamed.to.c/y.*moved.to.d/y out &&
+		test_grep CONFLICT..file.location.*a/y.renamed.to.b/y.*moved.to.d/y out &&
+		test_grep CONFLICT..file.location.*a/y.renamed.to.c/y.*moved.to.d/y out &&
 
 		git ls-files >paths &&
 		! grep b/ paths &&
@@ -5706,8 +5706,8 @@ test_expect_success '13d(info): messages for rename/rename(1to1) via dual transi
 
 		git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep Path.updated.*a/y.renamed.to.b/y.*moving.it.to.d/y out &&
-		test_i18ngrep Path.updated.*a/y.renamed.to.c/y.*moving.it.to.d/y out &&
+		test_grep Path.updated.*a/y.renamed.to.b/y.*moving.it.to.d/y out &&
+		test_grep Path.updated.*a/y.renamed.to.c/y.*moving.it.to.d/y out &&
 
 		git ls-files >paths &&
 		! grep b/ paths &&
@@ -5821,9 +5821,9 @@ test_expect_success '13e: directory rename detection in recursive case' '
 
 		git -c merge.directoryRenames=conflict merge -s recursive C^0 >out 2>err &&
 
-		test_i18ngrep ! CONFLICT out &&
-		test_i18ngrep ! BUG: err &&
-		test_i18ngrep ! core.dumped err &&
+		test_grep ! CONFLICT out &&
+		test_grep ! BUG: err &&
+		test_grep ! core.dumped err &&
 		test_must_be_empty err &&
 
 		git ls-files >paths &&
diff --git a/t/t6424-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh
index a61f20c22f..7677c5f08d 100755
--- a/t/t6424-merge-unrelated-index-changes.sh
+++ b/t/t6424-merge-unrelated-index-changes.sh
@@ -178,7 +178,7 @@ test_expect_success 'merge-recursive, when index==head but head!=HEAD' '
 	test_when_finished "git clean -fd" &&  # Do not leave untracked around
 	# Merge B & F, with B as "head"
 	git merge-recursive A -- B F > out &&
-	test_i18ngrep "Already up to date" out
+	test_grep "Already up to date" out
 '
 
 test_expect_success 'recursive, when file has staged changes not matching HEAD nor what a merge would give' '
@@ -194,7 +194,7 @@ test_expect_success 'recursive, when file has staged changes not matching HEAD n
 	test_must_fail git merge -s recursive E^0 2>err &&
 	git rev-parse --verify :subdir/a >actual &&
 	test_cmp expect actual &&
-	test_i18ngrep "changes to the following files would be overwritten" err
+	test_grep "changes to the following files would be overwritten" err
 '
 
 test_expect_success 'recursive, when file has staged changes matching what a merge would give' '
@@ -210,7 +210,7 @@ test_expect_success 'recursive, when file has staged changes matching what a mer
 	test_must_fail git merge -s recursive E^0 2>err &&
 	git rev-parse --verify :subdir/a >actual &&
 	test_cmp expect actual &&
-	test_i18ngrep "changes to the following files would be overwritten" err
+	test_grep "changes to the following files would be overwritten" err
 '
 
 test_expect_success 'octopus, unrelated file touched' '
diff --git a/t/t6425-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh
index 93cd2869b1..b95b064311 100755
--- a/t/t6425-merge-rename-delete.sh
+++ b/t/t6425-merge-rename-delete.sh
@@ -21,8 +21,8 @@ test_expect_success 'rename/delete' '
 	git commit -m "delete" &&
 
 	test_must_fail git merge --strategy=recursive rename >output &&
-	test_i18ngrep "CONFLICT (rename/delete): A.* renamed .*to B.* in rename" output &&
-	test_i18ngrep "CONFLICT (rename/delete): A.*deleted in HEAD." output
+	test_grep "CONFLICT (rename/delete): A.* renamed .*to B.* in rename" output &&
+	test_grep "CONFLICT (rename/delete): A.*deleted in HEAD." output
 '
 
 test_done
diff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh
index fd21c1a486..b059475ed0 100755
--- a/t/t6426-merge-skip-unneeded-updates.sh
+++ b/t/t6426-merge-skip-unneeded-updates.sh
@@ -375,7 +375,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '
 		export GIT_MERGE_VERBOSITY &&
 		test_must_fail git merge -s recursive B^0 >out 2>err &&
 
-		test_i18ngrep "CONFLICT (.*/add):" out &&
+		test_grep "CONFLICT (.*/add):" out &&
 		test_must_be_empty err &&
 
 		git ls-files -s >index_files &&
diff --git a/t/t6430-merge-recursive.sh b/t/t6430-merge-recursive.sh
index 07067bb347..ca15e6dd6d 100755
--- a/t/t6430-merge-recursive.sh
+++ b/t/t6430-merge-recursive.sh
@@ -308,13 +308,13 @@ test_expect_success 'fail if the index has unresolved entries' '
 
 	test_must_fail git merge "$c5" &&
 	test_must_fail git merge "$c5" 2> out &&
-	test_i18ngrep "not possible because you have unmerged files" out &&
+	test_grep "not possible because you have unmerged files" out &&
 	git add -u &&
 	test_must_fail git merge "$c5" 2> out &&
-	test_i18ngrep "You have not concluded your merge" out &&
+	test_grep "You have not concluded your merge" out &&
 	rm -f .git/MERGE_HEAD &&
 	test_must_fail git merge "$c5" 2> out &&
-	test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out
+	test_grep "Your local changes to the following files would be overwritten by merge:" out
 '
 
 test_expect_success 'merge-recursive remove conflict' '
@@ -713,7 +713,7 @@ test_expect_success 'merge-recursive remembers the names of all base trees' '
 	test_must_fail git -c merge.verbosity=5 merge-recursive $(cat trees) -- $c1 $c3 >out &&
 
 	# ...but make sure it fails in the expected way
-	test_i18ngrep CONFLICT.*rename/rename out &&
+	test_grep CONFLICT.*rename/rename out &&
 
 	# merge-recursive prints in reverse order, but we do not care
 	sort <trees >expect &&
diff --git a/t/t6433-merge-toplevel.sh b/t/t6433-merge-toplevel.sh
index b16031465f..0f611c4003 100755
--- a/t/t6433-merge-toplevel.sh
+++ b/t/t6433-merge-toplevel.sh
@@ -151,7 +151,7 @@ test_expect_success 'refuse two-project merge by default, quit before --autostas
 	echo change >>one.t &&
 	git diff >expect &&
 	test_must_fail git merge --autostash five 2>err &&
-	test_i18ngrep ! "stash" err &&
+	test_grep ! "stash" err &&
 	git diff >actual &&
 	test_cmp expect actual
 '
@@ -169,7 +169,7 @@ test_expect_success 'two-project merge with --allow-unrelated-histories with --a
 	echo change >>one.t &&
 	git diff one.t >expect &&
 	git merge --allow-unrelated-histories --autostash five 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git diff one.t >actual &&
 	test_cmp expect actual
 '
diff --git a/t/t6436-merge-overwrite.sh b/t/t6436-merge-overwrite.sh
index c0b7bd7c3f..4f4376421e 100755
--- a/t/t6436-merge-overwrite.sh
+++ b/t/t6436-merge-overwrite.sh
@@ -104,12 +104,12 @@ test_expect_success 'will not overwrite unstaged changes in renamed file' '
 	if test "$GIT_TEST_MERGE_ALGORITHM" = ort
 	then
 		test_must_fail git merge c1a >out 2>err &&
-		test_i18ngrep "would be overwritten by merge" err &&
+		test_grep "would be overwritten by merge" err &&
 		test_cmp important other.c &&
 		test_path_is_missing .git/MERGE_HEAD
 	else
 		test_must_fail git merge c1a >out &&
-		test_i18ngrep "Refusing to lose dirty file at other.c" out &&
+		test_grep "Refusing to lose dirty file at other.c" out &&
 		test_path_is_file other.c~HEAD &&
 		test $(git hash-object other.c~HEAD) = $(git rev-parse c1a:c1.c) &&
 		test_cmp important other.c
diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh
index c9a86f2e94..f1440697d1 100755
--- a/t/t6437-submodule-merge.sh
+++ b/t/t6437-submodule-merge.sh
@@ -479,7 +479,7 @@ test_expect_merge_algorithm failure success !FAIL_PREREQS 'directory/submodule c
 		# We do not want files within the submodule to prevent the
 		# merge from starting; we should not be writing to such paths
 		# anyway.
-		test_i18ngrep ! "refusing to lose untracked file at" err
+		test_grep ! "refusing to lose untracked file at" err
 	)
 '
 
diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh
index 69509d0c11..4a188cefb0 100755
--- a/t/t6500-gc.sh
+++ b/t/t6500-gc.sh
@@ -41,7 +41,7 @@ test_expect_success 'gc does not leave behind pid file' '
 
 test_expect_success 'gc --gobbledegook' '
 	test_expect_code 129 git gc --nonsense 2>err &&
-	test_i18ngrep "[Uu]sage: git gc" err
+	test_grep "[Uu]sage: git gc" err
 '
 
 test_expect_success 'gc -h with invalid configuration' '
@@ -52,7 +52,7 @@ test_expect_success 'gc -h with invalid configuration' '
 		echo "[gc] pruneexpire = CORRUPT" >>.git/config &&
 		test_expect_code 129 git gc -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage" broken/usage
+	test_grep "[Uu]sage" broken/usage
 '
 
 test_expect_success 'gc is not aborted due to a stale symref' '
@@ -155,7 +155,7 @@ test_expect_success 'auto gc with too many loose objects does not attempt to cre
 	test_commit "$(test_oid obj4)" &&
 
 	git gc --auto 2>err &&
-	test_i18ngrep ! "^warning:" err &&
+	test_grep ! "^warning:" err &&
 	ls .git/objects/pack/pack-*.pack | sort >post_packs &&
 	comm -1 -3 existing_packs post_packs >new &&
 	comm -2 -3 existing_packs post_packs >del &&
@@ -166,15 +166,15 @@ test_expect_success 'auto gc with too many loose objects does not attempt to cre
 test_expect_success 'gc --no-quiet' '
 	GIT_PROGRESS_DELAY=0 git -c gc.writeCommitGraph=true gc --no-quiet >stdout 2>stderr &&
 	test_must_be_empty stdout &&
-	test_i18ngrep "Computing commit graph generation numbers" stderr
+	test_grep "Computing commit graph generation numbers" stderr
 '
 
 test_expect_success TTY 'with TTY: gc --no-quiet' '
 	test_terminal env GIT_PROGRESS_DELAY=0 \
 		git -c gc.writeCommitGraph=true gc --no-quiet >stdout 2>stderr &&
 	test_must_be_empty stdout &&
-	test_i18ngrep "Enumerating objects" stderr &&
-	test_i18ngrep "Computing commit graph generation numbers" stderr
+	test_grep "Enumerating objects" stderr &&
+	test_grep "Computing commit graph generation numbers" stderr
 '
 
 test_expect_success 'gc --quiet' '
@@ -321,7 +321,7 @@ test_expect_success 'background auto gc does not run if gc.log is present and re
 	test_config gc.autodetach true &&
 	echo fleem >.git/gc.log &&
 	git gc --auto 2>err &&
-	test_i18ngrep "^warning:" err &&
+	test_grep "^warning:" err &&
 	test_config gc.logexpiry 5.days &&
 	test-tool chmtime =-345600 .git/gc.log &&
 	git gc --auto &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index f136ea76f7..879a6dce60 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -296,7 +296,7 @@ test_expect_success 'git mv error on conflicted file' '
 	EOF
 
 	test_must_fail git mv conflict newname 2>actual &&
-	test_i18ngrep "conflicted" actual
+	test_grep "conflicted" actual
 '
 
 test_expect_success 'git mv should overwrite symlink to a file' '
@@ -482,7 +482,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
 	git mv sub sub2 &&
 	git commit -m "moved sub to sub2" &&
 	git checkout -q HEAD^ 2>actual &&
-	test_i18ngrep "^warning: unable to rmdir '\''sub2'\'':" actual &&
+	test_grep "^warning: unable to rmdir '\''sub2'\'':" actual &&
 	git status -s sub2 >actual &&
 	echo "?? sub2/" >expected &&
 	test_cmp expected actual &&
diff --git a/t/t7105-reset-patch.sh b/t/t7105-reset-patch.sh
index 9b46da7aaa..05079c7246 100755
--- a/t/t7105-reset-patch.sh
+++ b/t/t7105-reset-patch.sh
@@ -30,21 +30,21 @@ test_expect_success PERL 'git reset -p' '
 	test_write_lines n y | git reset -p >output &&
 	verify_state dir/foo work head &&
 	verify_saved_state bar &&
-	test_i18ngrep "Unstage" output
+	test_grep "Unstage" output
 '
 
 test_expect_success PERL 'git reset -p HEAD^' '
 	test_write_lines n y | git reset -p HEAD^ >output &&
 	verify_state dir/foo work parent &&
 	verify_saved_state bar &&
-	test_i18ngrep "Apply" output
+	test_grep "Apply" output
 '
 
 test_expect_success PERL 'git reset -p HEAD^^{tree}' '
 	test_write_lines n y | git reset -p HEAD^^{tree} >output &&
 	verify_state dir/foo work parent &&
 	verify_saved_state bar &&
-	test_i18ngrep "Apply" output
+	test_grep "Apply" output
 '
 
 test_expect_success PERL 'git reset -p HEAD^:dir/foo (blob fails)' '
diff --git a/t/t7106-reset-unborn-branch.sh b/t/t7106-reset-unborn-branch.sh
index a0b67a0b84..d20e5709f9 100755
--- a/t/t7106-reset-unborn-branch.sh
+++ b/t/t7106-reset-unborn-branch.sh
@@ -42,7 +42,7 @@ test_expect_success PERL 'reset -p' '
 
 	git ls-files >actual &&
 	test_must_be_empty actual &&
-	test_i18ngrep "Unstage" output
+	test_grep "Unstage" output
 '
 
 test_expect_success 'reset --soft is a no-op' '
diff --git a/t/t7107-reset-pathspec-file.sh b/t/t7107-reset-pathspec-file.sh
index af5ea406db..020db201d5 100755
--- a/t/t7107-reset-pathspec-file.sh
+++ b/t/t7107-reset-pathspec-file.sh
@@ -161,19 +161,19 @@ test_expect_success 'error conditions' '
 	git rm fileA.t &&
 
 	test_must_fail git reset --pathspec-from-file=list --patch 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err &&
 
 	test_must_fail git reset --pathspec-from-file=list -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git reset --pathspec-file-nul 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
 
 	test_must_fail git reset --soft --pathspec-from-file=list 2>err &&
-	test_i18ngrep -e "fatal: Cannot do soft reset with paths" err &&
+	test_grep -e "fatal: Cannot do soft reset with paths" err &&
 
 	test_must_fail git reset --hard --pathspec-from-file=list 2>err &&
-	test_i18ngrep -e "fatal: Cannot do hard reset with paths" err
+	test_grep -e "fatal: Cannot do hard reset with paths" err
 '
 
 test_done
diff --git a/t/t7110-reset-merge.sh b/t/t7110-reset-merge.sh
index 772480a345..7ee180f81d 100755
--- a/t/t7110-reset-merge.sh
+++ b/t/t7110-reset-merge.sh
@@ -238,7 +238,7 @@ test_expect_success '"reset --keep HEAD^" fails with pending merge' '
 	git reset --hard third &&
 	test_must_fail git merge branch1 &&
 	test_must_fail git reset --keep HEAD^ 2>err.log &&
-	test_i18ngrep "middle of a merge" err.log
+	test_grep "middle of a merge" err.log
 '
 
 # The next test will test the following:
@@ -264,7 +264,7 @@ test_expect_success '"reset --keep HEAD" fails with pending merge' '
 	git reset --hard third &&
 	test_must_fail git merge branch1 &&
 	test_must_fail git reset --keep HEAD 2>err.log &&
-	test_i18ngrep "middle of a merge" err.log
+	test_grep "middle of a merge" err.log
 '
 
 test_expect_success '--merge is ok with added/deleted merge' '
@@ -290,7 +290,7 @@ test_expect_success '--keep fails with added/deleted merge' '
 	git diff --exit-code file3 &&
 	git diff --exit-code branch3 file3 &&
 	test_must_fail git reset --keep HEAD 2>err.log &&
-	test_i18ngrep "middle of a merge" err.log
+	test_grep "middle of a merge" err.log
 '
 
 test_done
diff --git a/t/t7201-co.sh b/t/t7201-co.sh
index 35b9e6ed6b..c2550f3028 100755
--- a/t/t7201-co.sh
+++ b/t/t7201-co.sh
@@ -217,7 +217,7 @@ test_expect_success 'switch to another branch while carrying a deletion' '
 	git rm two &&
 
 	test_must_fail git checkout simple 2>errs &&
-	test_i18ngrep overwritten errs &&
+	test_grep overwritten errs &&
 
 	test_must_fail git read-tree --quiet -m -u HEAD simple 2>errs &&
 	test_must_be_empty errs
@@ -229,7 +229,7 @@ test_expect_success 'checkout to detach HEAD (with advice declined)' '
 	git checkout -f renamer &&
 	git clean -f &&
 	git checkout renamer^ 2>messages &&
-	test_i18ngrep "HEAD is now at $rev" messages &&
+	test_grep "HEAD is now at $rev" messages &&
 	test_line_count = 1 messages &&
 	H=$(git rev-parse --verify HEAD) &&
 	M=$(git show-ref -s --verify refs/heads/main) &&
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index 0ef7b78457..1a310a45fd 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -735,7 +735,7 @@ test_expect_success MINGW 'handle clean & core.longpaths = false nicely' '
 	test_must_fail git clean -xdf 2>.git/err &&
 	# grepping for a strerror string is unportable but it is OK here with
 	# MINGW prereq
-	test_i18ngrep "too long" .git/err
+	test_grep "too long" .git/err
 '
 
 test_expect_success 'clean untracked paths by pathspec' '
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index d9fbabb2b9..00c1f1aab1 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -60,7 +60,7 @@ test_expect_success 'submodule init aborts on missing .gitmodules file' '
 	git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&
 	# missing the .gitmodules file here
 	test_must_fail git submodule init 2>actual &&
-	test_i18ngrep "No url found for submodule path" actual
+	test_grep "No url found for submodule path" actual
 '
 
 test_expect_success 'submodule update aborts on missing .gitmodules file' '
@@ -68,7 +68,7 @@ test_expect_success 'submodule update aborts on missing .gitmodules file' '
 	git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&
 	# missing the .gitmodules file here
 	git submodule update sub 2>actual &&
-	test_i18ngrep "Submodule path .sub. not initialized" actual
+	test_grep "Submodule path .sub. not initialized" actual
 '
 
 test_expect_success 'submodule update aborts on missing gitmodules url' '
@@ -100,7 +100,7 @@ test_expect_success 'status should ignore inner git repo when not added' '
 	) &&
 	test_must_fail git submodule status inner 2>output.err &&
 	rm -fr inner &&
-	test_i18ngrep "^error: .*did not match any file(s) known to git" output.err
+	test_grep "^error: .*did not match any file(s) known to git" output.err
 '
 
 test_expect_success 'setup - repository in init subdirectory' '
@@ -196,7 +196,7 @@ test_expect_success 'redirected submodule add does not show progress' '
 	git -C addtest submodule add "file://$submodurl/parent" submod-redirected \
 		2>err &&
 	! grep % err &&
-	test_i18ngrep ! "Checking connectivity" err
+	test_grep ! "Checking connectivity" err
 '
 
 test_expect_success 'redirected submodule add --progress does show progress' '
@@ -263,7 +263,7 @@ test_expect_success 'submodule add relays add --dry-run stderr' '
 		cd addtest &&
 		: >.git/index.lock &&
 		! git submodule add "$submodurl" sub-while-locked 2>output.err &&
-		test_i18ngrep "^fatal: .*index\.lock" output.err &&
+		test_grep "^fatal: .*index\.lock" output.err &&
 		test_path_is_missing sub-while-locked
 	)
 '
@@ -405,7 +405,7 @@ test_expect_success 'submodule add in subdirectory with relative path should fai
 		cd addtest/sub &&
 		test_must_fail git submodule add ../../ submod3 2>../../output.err
 	) &&
-	test_i18ngrep toplevel output.err
+	test_grep toplevel output.err
 '
 
 test_expect_success 'setup - add an example entry to .gitmodules' '
@@ -486,7 +486,7 @@ test_expect_success 'status should still be "missing" after initializing' '
 
 test_failure_with_unknown_submodule () {
 	test_must_fail git submodule $1 no-such-submodule 2>output.err &&
-	test_i18ngrep "^error: .*no-such-submodule" output.err
+	test_grep "^error: .*no-such-submodule" output.err
 }
 
 test_expect_success 'init should fail with unknown submodule' '
@@ -644,7 +644,7 @@ test_expect_success 'update --init' '
 	test_must_fail git config submodule.example.url &&
 
 	git submodule update init 2> update.out &&
-	test_i18ngrep "not initialized" update.out &&
+	test_grep "not initialized" update.out &&
 	test_must_fail git rev-parse --resolve-git-dir init/.git &&
 
 	git submodule update --init init &&
@@ -661,7 +661,7 @@ test_expect_success 'update --init from subdirectory' '
 	(
 		cd sub &&
 		git submodule update ../init 2>update.out &&
-		test_i18ngrep "not initialized" update.out &&
+		test_grep "not initialized" update.out &&
 		test_must_fail git rev-parse --resolve-git-dir ../init/.git &&
 
 		git submodule update --init ../init
@@ -1121,7 +1121,7 @@ test_expect_success 'submodule deinit from subdirectory' '
 		cd sub &&
 		git submodule deinit ../init >../output
 	) &&
-	test_i18ngrep "\\.\\./init" output &&
+	test_grep "\\.\\./init" output &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
 	test -n "$(git config --get-regexp "submodule\.example2\.")" &&
 	test -f example2/.git &&
@@ -1136,8 +1136,8 @@ test_expect_success 'submodule deinit . deinits all initialized submodules' '
 	git submodule deinit . >actual &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
 	test -z "$(git config --get-regexp "submodule\.example2\.")" &&
-	test_i18ngrep "Cleared directory .init" actual &&
-	test_i18ngrep "Cleared directory .example2" actual &&
+	test_grep "Cleared directory .init" actual &&
+	test_grep "Cleared directory .example2" actual &&
 	rmdir init example2
 '
 
@@ -1149,8 +1149,8 @@ test_expect_success 'submodule deinit --all deinits all initialized submodules'
 	git submodule deinit --all >actual &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
 	test -z "$(git config --get-regexp "submodule\.example2\.")" &&
-	test_i18ngrep "Cleared directory .init" actual &&
-	test_i18ngrep "Cleared directory .example2" actual &&
+	test_grep "Cleared directory .init" actual &&
+	test_grep "Cleared directory .example2" actual &&
 	rmdir init example2
 '
 
@@ -1160,8 +1160,8 @@ test_expect_success 'submodule deinit deinits a submodule when its work tree is
 	git submodule deinit init example2 >actual &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
 	test -z "$(git config --get-regexp "submodule\.example2\.")" &&
-	test_i18ngrep ! "Cleared directory .init" actual &&
-	test_i18ngrep "Cleared directory .example2" actual &&
+	test_grep ! "Cleared directory .init" actual &&
+	test_grep "Cleared directory .example2" actual &&
 	rmdir init
 '
 
@@ -1173,7 +1173,7 @@ test_expect_success 'submodule deinit fails when the submodule contains modifica
 	test -f example2/.git &&
 	git submodule deinit -f init >actual &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep "Cleared directory .init" actual &&
 	rmdir init
 '
 
@@ -1185,7 +1185,7 @@ test_expect_success 'submodule deinit fails when the submodule contains untracke
 	test -f example2/.git &&
 	git submodule deinit -f init >actual &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep "Cleared directory .init" actual &&
 	rmdir init
 '
 
@@ -1200,30 +1200,30 @@ test_expect_success 'submodule deinit fails when the submodule HEAD does not mat
 	test -f example2/.git &&
 	git submodule deinit -f init >actual &&
 	test -z "$(git config --get-regexp "submodule\.example\.")" &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep "Cleared directory .init" actual &&
 	rmdir init
 '
 
 test_expect_success 'submodule deinit is silent when used on an uninitialized submodule' '
 	git submodule update --init &&
 	git submodule deinit init >actual &&
-	test_i18ngrep "Submodule .example. (.*) unregistered for path .init" actual &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep "Submodule .example. (.*) unregistered for path .init" actual &&
+	test_grep "Cleared directory .init" actual &&
 	git submodule deinit init >actual &&
-	test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep ! "Submodule .example. (.*) unregistered for path .init" actual &&
+	test_grep "Cleared directory .init" actual &&
 	git submodule deinit . >actual &&
-	test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&
-	test_i18ngrep "Submodule .example2. (.*) unregistered for path .example2" actual &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep ! "Submodule .example. (.*) unregistered for path .init" actual &&
+	test_grep "Submodule .example2. (.*) unregistered for path .example2" actual &&
+	test_grep "Cleared directory .init" actual &&
 	git submodule deinit . >actual &&
-	test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&
-	test_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep ! "Submodule .example. (.*) unregistered for path .init" actual &&
+	test_grep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&
+	test_grep "Cleared directory .init" actual &&
 	git submodule deinit --all >actual &&
-	test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&
-	test_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&
-	test_i18ngrep "Cleared directory .init" actual &&
+	test_grep ! "Submodule .example. (.*) unregistered for path .init" actual &&
+	test_grep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&
+	test_grep "Cleared directory .init" actual &&
 	rmdir init example2
 '
 
diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh
index ff09443a0a..19b6135d11 100755
--- a/t/t7403-submodule-sync.sh
+++ b/t/t7403-submodule-sync.sh
@@ -163,7 +163,7 @@ test_expect_success '"git submodule sync" should update submodule URLs - subdire
 		cd sub &&
 		git submodule sync >../../output
 	) &&
-	test_i18ngrep "\\.\\./submodule" output &&
+	test_grep "\\.\\./submodule" output &&
 	test -d "$(
 		cd super-clone/submodule &&
 		git config remote.origin.url
@@ -194,7 +194,7 @@ test_expect_success '"git submodule sync --recursive" should update all submodul
 		cd sub &&
 		git submodule sync --recursive >../../output
 	) &&
-	test_i18ngrep "\\.\\./submodule/sub-submodule" output &&
+	test_grep "\\.\\./submodule/sub-submodule" output &&
 	test -d "$(
 		cd super-clone/submodule &&
 		git config remote.origin.url
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index 00651c25cb..8491b8c58b 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -945,7 +945,7 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re
 	git clone super_update_r super_update_r2 &&
 	(cd super_update_r2 &&
 	 git submodule update --init --recursive >actual &&
-	 test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual &&
+	 test_grep "Submodule path .submodule/subsubmodule.: checked out" actual &&
 	 (cd submodule/subsubmodule &&
 	  git log > ../../expected
 	 ) &&
@@ -1025,7 +1025,7 @@ test_expect_success 'submodule update clone shallow submodule outside of depth'
 		# unadvertised objects, so restrict this test to v0.
 		test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \
 			git submodule update --init --depth=1 2>actual &&
-		test_i18ngrep "Direct fetching of that commit failed." actual &&
+		test_grep "Direct fetching of that commit failed." actual &&
 		git -C ../submodule config uploadpack.allowReachableSHA1InWant true &&
 		git submodule update --init --depth=1 >actual &&
 		git -C submodule log --oneline >out &&
@@ -1039,7 +1039,7 @@ test_expect_success 'submodule update --recursive drops module name before recur
 	  git checkout HEAD^
 	 ) &&
 	 git submodule update --recursive deeper/submodule >actual &&
-	 test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
+	 test_grep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
 	)
 '
 
diff --git a/t/t7411-submodule-config.sh b/t/t7411-submodule-config.sh
index c0167944ab..31271f8e0a 100755
--- a/t/t7411-submodule-config.sh
+++ b/t/t7411-submodule-config.sh
@@ -45,7 +45,7 @@ test_expect_success 'configuration parsing with error' '
 	(
 		cd repo &&
 		test_must_fail test-tool submodule-config "" s 2>actual &&
-		test_i18ngrep "bad config" actual
+		test_grep "bad config" actual
 	)
 '
 
@@ -101,7 +101,7 @@ test_expect_success 'error in history of one submodule config lets continue, std
 				>actual \
 				2>actual_stderr &&
 		test_cmp expect_error actual &&
-		test_i18ngrep "submodule-blob $sha1:.gitmodules" actual_stderr >/dev/null
+		test_grep "submodule-blob $sha1:.gitmodules" actual_stderr >/dev/null
 	)
 '
 
diff --git a/t/t7414-submodule-mistakes.sh b/t/t7414-submodule-mistakes.sh
index 101afff30f..24f30e3bf9 100755
--- a/t/t7414-submodule-mistakes.sh
+++ b/t/t7414-submodule-mistakes.sh
@@ -13,13 +13,13 @@ test_expect_success 'create embedded repository' '
 test_expect_success 'git-add on embedded repository warns' '
 	test_when_finished "git rm --cached -f embed" &&
 	git add embed 2>stderr &&
-	test_i18ngrep warning stderr
+	test_grep warning stderr
 '
 
 test_expect_success '--no-warn-embedded-repo suppresses warning' '
 	test_when_finished "git rm --cached -f embed" &&
 	git add --no-warn-embedded-repo embed 2>stderr &&
-	test_i18ngrep ! warning stderr
+	test_grep ! warning stderr
 '
 
 test_expect_success 'no warning when updating entry' '
@@ -27,14 +27,14 @@ test_expect_success 'no warning when updating entry' '
 	git add embed &&
 	git -C embed commit --allow-empty -m two &&
 	git add embed 2>stderr &&
-	test_i18ngrep ! warning stderr
+	test_grep ! warning stderr
 '
 
 test_expect_success 'submodule add does not warn' '
 	test_when_finished "git rm -rf submodule .gitmodules" &&
 	git -c protocol.file.allow=always \
 		submodule add ./embed submodule 2>stderr &&
-	test_i18ngrep ! warning stderr
+	test_grep ! warning stderr
 '
 
 test_done
diff --git a/t/t7416-submodule-dash-url.sh b/t/t7416-submodule-dash-url.sh
index 7cf72b9a07..2ab566e717 100755
--- a/t/t7416-submodule-dash-url.sh
+++ b/t/t7416-submodule-dash-url.sh
@@ -41,7 +41,7 @@ test_expect_success 'remove ./ protection from .gitmodules url' '
 test_expect_success 'clone rejects unprotected dash' '
 	test_when_finished "rm -rf dst" &&
 	test_must_fail git clone --recurse-submodules . dst 2>err &&
-	test_i18ngrep ignoring err
+	test_grep ignoring err
 '
 
 test_expect_success 'fsck rejects unprotected dash' '
@@ -63,7 +63,7 @@ test_expect_success 'trailing backslash is handled correctly' '
 	mv .new .gitmodules &&
 	git commit -am "Add testmodule" &&
 	test_must_fail git clone --verbose --recurse-submodules . dolly 2>err &&
-	test_i18ngrep ! "unknown option" err
+	test_grep ! "unknown option" err
 '
 
 test_expect_success 'fsck rejects missing URL scheme' '
diff --git a/t/t7417-submodule-path-url.sh b/t/t7417-submodule-path-url.sh
index 2f4b25dfd7..5e3051da8b 100755
--- a/t/t7417-submodule-path-url.sh
+++ b/t/t7417-submodule-path-url.sh
@@ -21,7 +21,7 @@ test_expect_success 'create submodule with dash in path' '
 test_expect_success 'clone rejects unprotected dash' '
 	test_when_finished "rm -rf dst" &&
 	git clone --recurse-submodules . dst 2>err &&
-	test_i18ngrep ignoring err
+	test_grep ignoring err
 '
 
 test_expect_success 'fsck rejects unprotected dash' '
@@ -46,7 +46,7 @@ test_expect_success MINGW 'submodule paths disallows trailing spaces' '
 	git -C super update-ref refs/heads/main $commit &&
 
 	test_must_fail git clone --recurse-submodules super dst 2>err &&
-	test_i18ngrep "sub " err
+	test_grep "sub " err
 '
 
 test_done
diff --git a/t/t7450-bad-git-dotfiles.sh b/t/t7450-bad-git-dotfiles.sh
index 0d0c3f2c68..35a31acd4d 100755
--- a/t/t7450-bad-git-dotfiles.sh
+++ b/t/t7450-bad-git-dotfiles.sh
@@ -238,7 +238,7 @@ test_expect_success 'fsck detects non-blob .gitmodules' '
 		git ls-tree HEAD | sed s/subdir/.gitmodules/ | git mktree &&
 
 		test_must_fail git fsck 2>output &&
-		test_i18ngrep gitmodulesBlob output
+		test_grep gitmodulesBlob output
 	)
 '
 
@@ -252,8 +252,8 @@ test_expect_success 'fsck detects corrupt .gitmodules' '
 		git commit -m "broken gitmodules" &&
 
 		git fsck 2>output &&
-		test_i18ngrep gitmodulesParse output &&
-		test_i18ngrep ! "bad config" output
+		test_grep gitmodulesParse output &&
+		test_grep ! "bad config" output
 	)
 '
 
@@ -275,7 +275,7 @@ test_expect_success WINDOWS 'prevent git~1 squatting on Windows' '
 		hash="$(echo x | git hash-object -w --stdin)" &&
 		test_must_fail git update-index --add \
 			--cacheinfo 160000,$rev,d\\a 2>err &&
-		test_i18ngrep "Invalid path" err &&
+		test_grep "Invalid path" err &&
 		git -c core.protectNTFS=false update-index --add \
 			--cacheinfo 100644,$modules,.gitmodules \
 			--cacheinfo 160000,$rev,c \
@@ -289,7 +289,7 @@ test_expect_success WINDOWS 'prevent git~1 squatting on Windows' '
 	then
 		test_must_fail git -c core.protectNTFS=false \
 			clone --recurse-submodules squatting squatting-clone 2>err &&
-		test_i18ngrep -e "directory not empty" -e "not an empty directory" err &&
+		test_grep -e "directory not empty" -e "not an empty directory" err &&
 		! grep gitdir squatting-clone/d/a/git~2
 	fi
 '
@@ -314,7 +314,7 @@ test_expect_success 'git dirs of sibling submodules must not be nested' '
 		git commit -m nested
 	) &&
 	test_must_fail git clone --recurse-submodules nested clone 2>err &&
-	test_i18ngrep "is inside git dir" err
+	test_grep "is inside git dir" err
 '
 
 test_done
diff --git a/t/t7500-commit-template-squash-signoff.sh b/t/t7500-commit-template-squash-signoff.sh
index 5fcaa0b4f2..4dca8d97a7 100755
--- a/t/t7500-commit-template-squash-signoff.sh
+++ b/t/t7500-commit-template-squash-signoff.sh
@@ -555,7 +555,7 @@ test_expect_success 'commit without staging files fails and displays hints' '
 	git commit -m initial &&
 	echo "changes" >>file &&
 	test_must_fail git commit -m update >actual &&
-	test_i18ngrep "no changes added to commit (use \"git add\" and/or \"git commit -a\")" actual
+	test_grep "no changes added to commit (use \"git add\" and/or \"git commit -a\")" actual
 '
 
 test_done
diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh
index fb5417d5e7..3d8500a52e 100755
--- a/t/t7501-commit-basic-functionality.sh
+++ b/t/t7501-commit-basic-functionality.sh
@@ -21,7 +21,7 @@ test_expect_success 'initial status' '
 	echo bongo bongo >file &&
 	git add file &&
 	git status >actual &&
-	test_i18ngrep "No commits yet" actual
+	test_grep "No commits yet" actual
 '
 
 test_expect_success 'fail initial amend' '
@@ -141,7 +141,7 @@ test_expect_success 'template "emptyness" check does not kick in with -F' '
 test_expect_success 'template "emptyness" check' '
 	git checkout HEAD file && echo >>file && git add file &&
 	test_must_fail git commit -t file 2>err &&
-	test_i18ngrep "did not edit" err
+	test_grep "did not edit" err
 '
 
 test_expect_success 'setup: commit message from file' '
@@ -671,7 +671,7 @@ test_expect_success 'commit a file whose name is a dash' '
 	git add ./- &&
 	test_tick &&
 	git commit -m "add dash" >output </dev/null &&
-	test_i18ngrep " changed, 5 insertions" output
+	test_grep " changed, 5 insertions" output
 '
 
 test_expect_success '--only works on to-be-born branch' '
diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh
index b5bf7de7cd..61c8e810cc 100755
--- a/t/t7502-commit-porcelain.sh
+++ b/t/t7502-commit-porcelain.sh
@@ -706,14 +706,14 @@ test_expect_success 'cleanup commit message (whitespace config, -m)' '
 test_expect_success 'message shows author when it is not equal to committer' '
 	echo >>negative &&
 	git commit -e -m "sample" -a &&
-	test_i18ngrep \
+	test_grep \
 	  "^# Author: *A U Thor <author@example.com>\$" \
 	  .git/COMMIT_EDITMSG
 '
 
 test_expect_success 'message shows date when it is explicitly set' '
 	git commit --allow-empty -e -m foo --date="2010-01-02T03:04:05" &&
-	test_i18ngrep \
+	test_grep \
 	  "^# Date: *Sat Jan 2 03:04:05 2010 +0000" \
 	  .git/COMMIT_EDITMSG
 '
@@ -728,7 +728,7 @@ test_expect_success AUTOIDENT 'message shows committer when it is automatic' '
 	) &&
 	# the ident is calculated from the system, so we cannot
 	# check the actual value, only that it is there
-	test_i18ngrep "^# Committer: " .git/COMMIT_EDITMSG
+	test_grep "^# Committer: " .git/COMMIT_EDITMSG
 '
 
 write_script .git/FAKE_EDITOR <<EOF
@@ -860,9 +860,9 @@ try_commit () {
 	GIT_EDITOR=.git/FAKE_EDITOR git commit -a $* $use_template &&
 	case "$use_template" in
 	'')
-		test_i18ngrep ! "^## Custom template" .git/COMMIT_EDITMSG ;;
+		test_grep ! "^## Custom template" .git/COMMIT_EDITMSG ;;
 	*)
-		test_i18ngrep "^## Custom template" .git/COMMIT_EDITMSG ;;
+		test_grep "^## Custom template" .git/COMMIT_EDITMSG ;;
 	esac
 }
 
@@ -870,53 +870,53 @@ try_commit_status_combo () {
 
 	test_expect_success 'commit' '
 		try_commit "" &&
-		test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit --status' '
 		try_commit --status &&
-		test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit --no-status' '
 		try_commit --no-status &&
-		test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit with commit.status = yes' '
 		test_config commit.status yes &&
 		try_commit "" &&
-		test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit with commit.status = no' '
 		test_config commit.status no &&
 		try_commit "" &&
-		test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit --status with commit.status = yes' '
 		test_config commit.status yes &&
 		try_commit --status &&
-		test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit --no-status with commit.status = yes' '
 		test_config commit.status yes &&
 		try_commit --no-status &&
-		test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit --status with commit.status = no' '
 		test_config commit.status no &&
 		try_commit --status &&
-		test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 	test_expect_success 'commit --no-status with commit.status = no' '
 		test_config commit.status no &&
 		try_commit --no-status &&
-		test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
+		test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
 }
@@ -930,13 +930,13 @@ try_commit_status_combo
 test_expect_success 'commit --status with custom comment character' '
 	test_config core.commentchar ";" &&
 	try_commit --status &&
-	test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG
+	test_grep "^; Changes to be committed:" .git/COMMIT_EDITMSG
 '
 
 test_expect_success 'switch core.commentchar' '
 	test_commit "#foo" foo &&
 	GIT_EDITOR=.git/FAKE_EDITOR git -c core.commentChar=auto commit --amend &&
-	test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG
+	test_grep "^; Changes to be committed:" .git/COMMIT_EDITMSG
 '
 
 test_expect_success 'switch core.commentchar but out of options' '
diff --git a/t/t7506-status-submodule.sh b/t/t7506-status-submodule.sh
index d050091345..46566d529e 100755
--- a/t/t7506-status-submodule.sh
+++ b/t/t7506-status-submodule.sh
@@ -37,19 +37,19 @@ test_expect_success 'setup' '
 
 test_expect_success 'status clean' '
 	git status >output &&
-	test_i18ngrep "nothing to commit" output
+	test_grep "nothing to commit" output
 '
 
 test_expect_success 'commit --dry-run -a clean' '
 	test_must_fail git commit --dry-run -a >output &&
-	test_i18ngrep "nothing to commit" output
+	test_grep "nothing to commit" output
 '
 
 test_expect_success 'status with modified file in submodule' '
 	(cd sub && git reset --hard) &&
 	echo "changed" >sub/foo &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (modified content)" output
+	test_grep "modified:   sub (modified content)" output
 '
 
 test_expect_success 'status with modified file in submodule (porcelain)' '
@@ -73,7 +73,7 @@ test_expect_success 'status with modified file in submodule (short)' '
 test_expect_success 'status with added file in submodule' '
 	(cd sub && git reset --hard && echo >foo && git add foo) &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (modified content)" output
+	test_grep "modified:   sub (modified content)" output
 '
 
 test_expect_success 'status with added file in submodule (porcelain)' '
@@ -96,12 +96,12 @@ test_expect_success 'status with untracked file in submodule' '
 	(cd sub && git reset --hard) &&
 	echo "content" >sub/new-file &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (untracked content)" output
+	test_grep "modified:   sub (untracked content)" output
 '
 
 test_expect_success 'status -uno with untracked file in submodule' '
 	git status -uno >output &&
-	test_i18ngrep "^nothing to commit" output
+	test_grep "^nothing to commit" output
 '
 
 test_expect_success 'status with untracked file in submodule (porcelain)' '
@@ -122,7 +122,7 @@ test_expect_success 'status with added and untracked file in submodule' '
 	(cd sub && git reset --hard && echo >foo && git add foo) &&
 	echo "content" >sub/new-file &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (modified content, untracked content)" output
+	test_grep "modified:   sub (modified content, untracked content)" output
 '
 
 test_expect_success 'status with added and untracked file in submodule (porcelain)' '
@@ -140,7 +140,7 @@ test_expect_success 'status with modified file in modified submodule' '
 	(cd sub && echo "next change" >foo && git commit -m "next change" foo) &&
 	echo "changed" >sub/foo &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (new commits, modified content)" output
+	test_grep "modified:   sub (new commits, modified content)" output
 '
 
 test_expect_success 'status with modified file in modified submodule (porcelain)' '
@@ -155,7 +155,7 @@ test_expect_success 'status with modified file in modified submodule (porcelain)
 test_expect_success 'status with added file in modified submodule' '
 	(cd sub && git reset --hard && echo >foo && git add foo) &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (new commits, modified content)" output
+	test_grep "modified:   sub (new commits, modified content)" output
 '
 
 test_expect_success 'status with added file in modified submodule (porcelain)' '
@@ -170,7 +170,7 @@ test_expect_success 'status with untracked file in modified submodule' '
 	(cd sub && git reset --hard) &&
 	echo "content" >sub/new-file &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (new commits, untracked content)" output
+	test_grep "modified:   sub (new commits, untracked content)" output
 '
 
 test_expect_success 'status with untracked file in modified submodule (porcelain)' '
@@ -184,7 +184,7 @@ test_expect_success 'status with added and untracked file in modified submodule'
 	(cd sub && git reset --hard && echo >foo && git add foo) &&
 	echo "content" >sub/new-file &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (new commits, modified content, untracked content)" output
+	test_grep "modified:   sub (new commits, modified content, untracked content)" output
 '
 
 test_expect_success 'status with added and untracked file in modified submodule (porcelain)' '
@@ -209,7 +209,7 @@ test_expect_success 'setup .git file for sub' '
 test_expect_success 'status with added file in modified submodule with .git file' '
 	(cd sub && git reset --hard && echo >foo && git add foo) &&
 	git status >output &&
-	test_i18ngrep "modified:   sub (new commits, modified content)" output
+	test_grep "modified:   sub (new commits, modified content)" output
 '
 
 test_expect_success 'status with a lot of untracked files in the submodule' '
@@ -234,12 +234,12 @@ test_expect_success 'rm submodule contents' '
 
 test_expect_success 'status clean (empty submodule dir)' '
 	git status >output &&
-	test_i18ngrep "nothing to commit" output
+	test_grep "nothing to commit" output
 '
 
 test_expect_success 'status -a clean (empty submodule dir)' '
 	test_must_fail git commit --dry-run -a >output &&
-	test_i18ngrep "nothing to commit" output
+	test_grep "nothing to commit" output
 '
 
 cat >status_expect <<\EOF
diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh
index 916470c48b..c3281b192e 100755
--- a/t/t7507-commit-verbose.sh
+++ b/t/t7507-commit-verbose.sh
@@ -89,7 +89,7 @@ test_expect_success 'submodule log is stripped out too with -v' '
 		export GIT_EDITOR &&
 		test_must_fail git commit -a -v 2>err
 	) &&
-	test_i18ngrep "Aborting commit due to empty commit message." err
+	test_grep "Aborting commit due to empty commit message." err
 '
 
 test_expect_success 'verbose diff is stripped out with set core.commentChar' '
@@ -98,7 +98,7 @@ test_expect_success 'verbose diff is stripped out with set core.commentChar' '
 		export GIT_EDITOR &&
 		test_must_fail git -c core.commentchar=";" commit -a -v 2>err
 	) &&
-	test_i18ngrep "Aborting commit due to empty commit message." err
+	test_grep "Aborting commit due to empty commit message." err
 '
 
 test_expect_success 'status does not verbose without --verbose' '
diff --git a/t/t7508-status.sh b/t/t7508-status.sh
index 6928fd89f5..1607df4c2a 100755
--- a/t/t7508-status.sh
+++ b/t/t7508-status.sh
@@ -19,7 +19,7 @@ test_expect_success 'status -h in broken repository' '
 		echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
 		test_expect_code 129 git status -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage" broken/usage
+	test_grep "[Uu]sage" broken/usage
 '
 
 test_expect_success 'commit -h in broken repository' '
@@ -31,7 +31,7 @@ test_expect_success 'commit -h in broken repository' '
 		echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
 		test_expect_code 129 git commit -h >usage 2>&1
 	) &&
-	test_i18ngrep "[Uu]sage" broken/usage
+	test_grep "[Uu]sage" broken/usage
 '
 
 test_expect_success 'create upstream branch' '
@@ -72,7 +72,7 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'status (1)' '
-	test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output
+	test_grep "use \"git rm --cached <file>\.\.\.\" to unstage" output
 '
 
 strip_comments () {
@@ -1542,12 +1542,12 @@ test_expect_success 'git commit will commit a staged but ignored submodule' '
 	git config --add -f .gitmodules submodule.subname.path sm &&
 	git config --add submodule.subname.ignore all &&
 	git status -s --ignore-submodules=dirty >output &&
-	test_i18ngrep "^M. sm" output &&
+	test_grep "^M. sm" output &&
 	GIT_EDITOR="echo hello >>\"\$1\"" &&
 	export GIT_EDITOR &&
 	git commit -uno &&
 	git status -s --ignore-submodules=dirty >output &&
-	test_i18ngrep ! "^M. sm" output
+	test_grep ! "^M. sm" output
 '
 
 test_expect_success 'git commit --dry-run will show a staged but ignored submodule' '
@@ -1572,13 +1572,13 @@ EOF
 	git commit -uno --dry-run >output &&
 	test_cmp expect output &&
 	git status -s --ignore-submodules=dirty >output &&
-	test_i18ngrep "^M. sm" output
+	test_grep "^M. sm" output
 '
 
 test_expect_success 'git commit -m will commit a staged but ignored submodule' '
 	git commit -uno -m message &&
 	git status -s --ignore-submodules=dirty >output &&
-	test_i18ngrep ! "^M. sm" output &&
+	test_grep ! "^M. sm" output &&
 	git config --remove-section submodule.subname &&
 	git config -f .gitmodules  --remove-section submodule.subname
 '
@@ -1591,7 +1591,7 @@ test_expect_success 'show stash info with "--show-stash"' '
 	git stash &&
 	git status >expected_default &&
 	git status --show-stash >expected_with_stash &&
-	test_i18ngrep "^Your stash currently has 1 entry$" expected_with_stash
+	test_grep "^Your stash currently has 1 entry$" expected_with_stash
 '
 
 test_expect_success 'no stash info with "--show-stash --no-show-stash"' '
@@ -1618,14 +1618,14 @@ test_expect_success 'no additional info if no stash entries' '
 test_expect_success '"No commits yet" should be noted in status output' '
 	git checkout --orphan empty-branch-1 &&
 	git status >output &&
-	test_i18ngrep "No commits yet" output
+	test_grep "No commits yet" output
 '
 
 test_expect_success '"No commits yet" should not be noted in status output' '
 	git checkout --orphan empty-branch-2 &&
 	test_commit test-commit-1 &&
 	git status >output &&
-	test_i18ngrep ! "No commits yet" output
+	test_grep ! "No commits yet" output
 '
 
 test_expect_success '"Initial commit" should be noted in commit template' '
@@ -1633,7 +1633,7 @@ test_expect_success '"Initial commit" should be noted in commit template' '
 	touch to_be_committed_1 &&
 	git add to_be_committed_1 &&
 	git commit --dry-run >output &&
-	test_i18ngrep "Initial commit" output
+	test_grep "Initial commit" output
 '
 
 test_expect_success '"Initial commit" should not be noted in commit template' '
@@ -1642,7 +1642,7 @@ test_expect_success '"Initial commit" should not be noted in commit template' '
 	touch to_be_committed_2 &&
 	git add to_be_committed_2 &&
 	git commit --dry-run >output &&
-	test_i18ngrep ! "Initial commit" output
+	test_grep ! "Initial commit" output
 '
 
 test_expect_success '--no-optional-locks prevents index update' '
diff --git a/t/t7509-commit-authorship.sh b/t/t7509-commit-authorship.sh
index 5d890949f7..fd8c8f8f0b 100755
--- a/t/t7509-commit-authorship.sh
+++ b/t/t7509-commit-authorship.sh
@@ -99,7 +99,7 @@ test_expect_success '--amend option with empty author' '
 	echo "Empty author test" >>foo &&
 	test_tick &&
 	test_must_fail git commit -a -m "empty author" --amend 2>err &&
-	test_i18ngrep "empty ident" err
+	test_grep "empty ident" err
 '
 
 test_expect_success '--amend option with missing author' '
@@ -112,7 +112,7 @@ test_expect_success '--amend option with missing author' '
 	echo "Missing author test" >>foo &&
 	test_tick &&
 	test_must_fail git commit -a -m "malformed author" --amend 2>err &&
-	test_i18ngrep "empty ident" err
+	test_grep "empty ident" err
 '
 
 test_expect_success '--reset-author makes the commit ours even with --amend option' '
diff --git a/t/t7518-ident-corner-cases.sh b/t/t7518-ident-corner-cases.sh
index 9ab2ae2f3b..b37de0af49 100755
--- a/t/t7518-ident-corner-cases.sh
+++ b/t/t7518-ident-corner-cases.sh
@@ -15,7 +15,7 @@ test_expect_success 'empty name and missing email' '
 		sane_unset GIT_AUTHOR_EMAIL &&
 		GIT_AUTHOR_NAME= &&
 		test_must_fail git commit --allow-empty -m foo 2>err &&
-		test_i18ngrep ! "(null)" err
+		test_grep ! "(null)" err
 	)
 '
 
@@ -40,8 +40,8 @@ test_expect_success 'empty configured name does not auto-detect' '
 		sane_unset GIT_AUTHOR_NAME &&
 		test_must_fail \
 			git -c user.name= commit --allow-empty -m foo 2>err &&
-		test_i18ngrep "empty ident name" err &&
-		test_i18ngrep "Author identity unknown" err
+		test_grep "empty ident name" err &&
+		test_grep "Author identity unknown" err
 	)
 '
 
@@ -50,8 +50,8 @@ test_expect_success 'empty configured name does not auto-detect for committer' '
 		sane_unset GIT_COMMITTER_NAME &&
 		test_must_fail \
 			git -c user.name= commit --allow-empty -m foo 2>err &&
-		test_i18ngrep "empty ident name" err &&
-		test_i18ngrep "Committer identity unknown" err
+		test_grep "empty ident name" err &&
+		test_grep "Committer identity unknown" err
 	)
 '
 
diff --git a/t/t7519-status-fsmonitor.sh b/t/t7519-status-fsmonitor.sh
index 8348e3ae7d..7ee69ecdd4 100755
--- a/t/t7519-status-fsmonitor.sh
+++ b/t/t7519-status-fsmonitor.sh
@@ -322,14 +322,14 @@ do
 			rm -f marker &&
 			git status >actual &&
 			test_path_is_file marker &&
-			test_i18ngrep ! "Changes not staged for commit:" actual &&
+			test_grep ! "Changes not staged for commit:" actual &&
 			if test $uc_val = true
 			then
-				test_i18ngrep ! "Untracked files:" actual
+				test_grep ! "Untracked files:" actual
 			fi &&
 			if test $uc_val = false
 			then
-				test_i18ngrep "Untracked files:" actual
+				test_grep "Untracked files:" actual
 			fi &&
 			rm -f marker
 		'
diff --git a/t/t7520-ignored-hook-warning.sh b/t/t7520-ignored-hook-warning.sh
index 184b258989..3b63c34a30 100755
--- a/t/t7520-ignored-hook-warning.sh
+++ b/t/t7520-ignored-hook-warning.sh
@@ -13,27 +13,27 @@ test_expect_success setup '
 
 test_expect_success 'no warning if hook is not ignored' '
 	git commit --allow-empty -m "more" 2>message &&
-	test_i18ngrep ! -e "hook was ignored" message
+	test_grep ! -e "hook was ignored" message
 '
 
 test_expect_success POSIXPERM 'warning if hook is ignored' '
 	test_hook --disable pre-commit &&
 	git commit --allow-empty -m "even more" 2>message &&
-	test_i18ngrep -e "hook was ignored" message
+	test_grep -e "hook was ignored" message
 '
 
 test_expect_success POSIXPERM 'no warning if advice.ignoredHook set to false' '
 	test_config advice.ignoredHook false &&
 	test_hook --disable pre-commit &&
 	git commit --allow-empty -m "even more" 2>message &&
-	test_i18ngrep ! -e "hook was ignored" message
+	test_grep ! -e "hook was ignored" message
 '
 
 test_expect_success 'no warning if unset advice.ignoredHook and hook removed' '
 	test_hook --remove pre-commit &&
 	test_unconfig advice.ignoredHook &&
 	git commit --allow-empty -m "even more" 2>message &&
-	test_i18ngrep ! -e "hook was ignored" message
+	test_grep ! -e "hook was ignored" message
 '
 
 test_done
diff --git a/t/t7525-status-rename.sh b/t/t7525-status-rename.sh
index 22bf5c7e5d..a9210d3a3a 100755
--- a/t/t7525-status-rename.sh
+++ b/t/t7525-status-rename.sh
@@ -21,81 +21,81 @@ test_expect_success 'setup' '
 
 test_expect_success 'status no-options' '
 	git status >actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "renamed:" actual
 '
 
 test_expect_success 'status --no-renames' '
 	git status --no-renames >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'status.renames inherits from diff.renames false' '
 	git -c diff.renames=false status >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'status.renames inherits from diff.renames true' '
 	git -c diff.renames=true status >actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "renamed:" actual
 '
 
 test_expect_success 'status.renames overrides diff.renames false' '
 	git -c diff.renames=true -c status.renames=false status >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'status.renames overrides from diff.renames true' '
 	git -c diff.renames=false -c status.renames=true status >actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "renamed:" actual
 '
 
 test_expect_success 'status status.renames=false' '
 	git -c status.renames=false status >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'status status.renames=true' '
 	git -c status.renames=true status >actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "renamed:" actual
 '
 
 test_expect_success 'commit honors status.renames=false' '
 	git -c status.renames=false commit --dry-run >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'commit honors status.renames=true' '
 	git -c status.renames=true commit --dry-run >actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "renamed:" actual
 '
 
 test_expect_success 'status config overridden' '
 	git -c status.renames=true status --no-renames >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'status score=100%' '
 	git status -M=100% >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual &&
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual &&
 
 	git status --find-renames=100% >actual &&
-	test_i18ngrep "deleted:" actual &&
-	test_i18ngrep "new file:" actual
+	test_grep "deleted:" actual &&
+	test_grep "new file:" actual
 '
 
 test_expect_success 'status score=01%' '
 	git status -M=01% >actual &&
-	test_i18ngrep "renamed:" actual &&
+	test_grep "renamed:" actual &&
 
 	git status --find-renames=01% >actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "renamed:" actual
 '
 
 test_expect_success 'copies not overridden by find-renames' '
@@ -103,12 +103,12 @@ test_expect_success 'copies not overridden by find-renames' '
 	git add copy &&
 
 	git -c status.renames=copies status -M=01% >actual &&
-	test_i18ngrep "copied:" actual &&
-	test_i18ngrep "renamed:" actual &&
+	test_grep "copied:" actual &&
+	test_grep "renamed:" actual &&
 
 	git -c status.renames=copies status --find-renames=01% >actual &&
-	test_i18ngrep "copied:" actual &&
-	test_i18ngrep "renamed:" actual
+	test_grep "copied:" actual &&
+	test_grep "renamed:" actual
 '
 
 test_done
diff --git a/t/t7526-commit-pathspec-file.sh b/t/t7526-commit-pathspec-file.sh
index ad011bb9f1..c97c550021 100755
--- a/t/t7526-commit-pathspec-file.sh
+++ b/t/t7526-commit-pathspec-file.sh
@@ -141,25 +141,25 @@ test_expect_success 'error conditions' '
 	>empty_list &&
 
 	test_must_fail git commit --pathspec-from-file=list --interactive -m "Commit" 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
 
 	test_must_fail git commit --pathspec-from-file=list --patch -m "Commit" 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err &&
 
 	test_must_fail git commit --pathspec-from-file=list --all -m "Commit" 2>err &&
-	test_i18ngrep -e "options .--pathspec-from-file. and .-a. cannot be used together" err &&
+	test_grep -e "options .--pathspec-from-file. and .-a. cannot be used together" err &&
 
 	test_must_fail git commit --pathspec-from-file=list -m "Commit" -- fileA.t 2>err &&
-	test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
+	test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err &&
 
 	test_must_fail git commit --pathspec-file-nul -m "Commit" 2>err &&
-	test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
+	test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err &&
 
 	test_must_fail git commit --pathspec-from-file=empty_list --include -m "Commit" 2>err &&
-	test_i18ngrep -e "No paths with --include/--only does not make sense." err &&
+	test_grep -e "No paths with --include/--only does not make sense." err &&
 
 	test_must_fail git commit --pathspec-from-file=empty_list --only -m "Commit" 2>err &&
-	test_i18ngrep -e "No paths with --include/--only does not make sense." err
+	test_grep -e "No paths with --include/--only does not make sense." err
 '
 
 test_done
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index fdc607277c..e5ff073099 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -175,7 +175,7 @@ test_expect_success 'merge -h with invalid index' '
 		>.git/index &&
 		test_expect_code 129 git merge -h 2>usage
 	) &&
-	test_i18ngrep "[Uu]sage: git merge" broken/usage
+	test_grep "[Uu]sage: git merge" broken/usage
 '
 
 test_expect_success 'reject non-strategy with a git-merge-foo name' '
@@ -681,7 +681,7 @@ test_debug 'git log --graph --decorate --oneline --all'
 test_expect_success 'in-index merge' '
 	git reset --hard c0 &&
 	git merge --no-ff -s resolve c1 >out &&
-	test_i18ngrep "Wonderful." out &&
+	test_grep "Wonderful." out &&
 	verify_parents $c0 $c1
 '
 
@@ -697,7 +697,7 @@ test_expect_success 'merge with --autostash' '
 	git reset --hard c1 &&
 	git merge-file file file.orig file.9 &&
 	git merge --autostash c2 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git show HEAD:file >merge-result &&
 	test_cmp result.1-5 merge-result &&
 	test_cmp result.1-5-9 file
@@ -708,7 +708,7 @@ test_expect_success 'merge with merge.autoStash' '
 	git reset --hard c1 &&
 	git merge-file file file.orig file.9 &&
 	git merge c2 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git show HEAD:file >merge-result &&
 	test_cmp result.1-5 merge-result &&
 	test_cmp result.1-5-9 file
@@ -718,7 +718,7 @@ test_expect_success 'fast-forward merge with --autostash' '
 	git reset --hard c0 &&
 	git merge-file file file.orig file.5 &&
 	git merge --autostash c1 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	test_cmp result.1-5 file
 '
 
@@ -728,7 +728,7 @@ test_expect_success 'failed fast-forward merge with --autostash' '
 	cp file.5 other &&
 	test_when_finished "rm other" &&
 	test_must_fail git merge --autostash c1 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	test_cmp file.5 file
 '
 
@@ -736,7 +736,7 @@ test_expect_success 'octopus merge with --autostash' '
 	git reset --hard c1 &&
 	git merge-file file file.orig file.3 &&
 	git merge --autostash c2 c3 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git show HEAD:file >merge-result &&
 	test_cmp result.1-5-9 merge-result &&
 	test_cmp result.1-3-5-9 file
@@ -746,7 +746,7 @@ test_expect_success 'failed merge (exit 2) with --autostash' '
 	git reset --hard c1 &&
 	git merge-file file file.orig file.5 &&
 	test_must_fail git merge -s recursive --autostash c2 c3 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	test_cmp result.1-5 file
 '
 
@@ -755,7 +755,7 @@ test_expect_success 'conflicted merge with --autostash, --abort restores stash'
 	cp file.1 file &&
 	test_must_fail git merge --autostash c7 &&
 	git merge --abort 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	test_cmp file.1 file
 '
 
@@ -767,7 +767,7 @@ test_expect_success 'completed merge (git commit) with --no-commit and --autosta
 	git stash show -p MERGE_AUTOSTASH >actual &&
 	test_cmp expect actual &&
 	git commit 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git show HEAD:file >merge-result &&
 	test_cmp result.1-5 merge-result &&
 	test_cmp result.1-5-9 file
@@ -781,7 +781,7 @@ test_expect_success 'completed merge (git merge --continue) with --no-commit and
 	git stash show -p MERGE_AUTOSTASH >actual &&
 	test_cmp expect actual &&
 	git merge --continue 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git show HEAD:file >merge-result &&
 	test_cmp result.1-5 merge-result &&
 	test_cmp result.1-5-9 file
@@ -795,7 +795,7 @@ test_expect_success 'aborted merge (merge --abort) with --no-commit and --autost
 	git stash show -p MERGE_AUTOSTASH >actual &&
 	test_cmp expect actual &&
 	git merge --abort 2>err &&
-	test_i18ngrep "Applied autostash." err &&
+	test_grep "Applied autostash." err &&
 	git diff >actual &&
 	test_cmp expect actual
 '
@@ -808,7 +808,7 @@ test_expect_success 'aborted merge (reset --hard) with --no-commit and --autosta
 	git stash show -p MERGE_AUTOSTASH >actual &&
 	test_cmp expect actual &&
 	git reset --hard 2>err &&
-	test_i18ngrep "Autostash exists; creating a new stash entry." err &&
+	test_grep "Autostash exists; creating a new stash entry." err &&
 	git diff --exit-code
 '
 
@@ -821,7 +821,7 @@ test_expect_success 'quit merge with --no-commit and --autostash' '
 	test_cmp expect actual &&
 	git diff HEAD >expect &&
 	git merge --quit 2>err &&
-	test_i18ngrep "Autostash exists; creating a new stash entry." err &&
+	test_grep "Autostash exists; creating a new stash entry." err &&
 	git diff HEAD >actual &&
 	test_cmp expect actual
 '
@@ -832,7 +832,7 @@ test_expect_success 'merge with conflicted --autostash changes' '
 	git diff >expect &&
 	test_when_finished "test_might_fail git stash drop" &&
 	git merge --autostash c3 2>err &&
-	test_i18ngrep "Applying autostash resulted in conflicts." err &&
+	test_grep "Applying autostash resulted in conflicts." err &&
 	git show HEAD:file >merge-result &&
 	test_cmp result.1-9 merge-result &&
 	git stash show -p >actual &&
diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh
index bd238d89b0..8cebe2dbe1 100755
--- a/t/t7601-merge-pull-config.sh
+++ b/t/t7601-merge-pull-config.sh
@@ -30,117 +30,117 @@ test_expect_success 'setup' '
 test_expect_success 'pull.rebase not set, ff possible' '
 	git reset --hard c0 &&
 	git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and pull.ff=true' '
 	git reset --hard c0 &&
 	test_config pull.ff true &&
 	git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and pull.ff=false' '
 	git reset --hard c0 &&
 	test_config pull.ff false &&
 	git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and pull.ff=only' '
 	git reset --hard c0 &&
 	test_config pull.ff only &&
 	git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --rebase given' '
 	git reset --hard c0 &&
 	git pull --rebase . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --no-rebase given' '
 	git reset --hard c0 &&
 	git pull --no-rebase . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --ff given' '
 	git reset --hard c0 &&
 	git pull --ff . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --no-ff given' '
 	git reset --hard c0 &&
 	git pull --no-ff . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --ff-only given' '
 	git reset --hard c0 &&
 	git pull --ff-only . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set (not-fast-forward)' '
 	git reset --hard c2 &&
 	test_must_fail git -c color.advice=always pull . c1 2>err &&
 	test_decode_color <err >decoded &&
-	test_i18ngrep "<YELLOW>hint: " decoded &&
-	test_i18ngrep "You have divergent branches" decoded
+	test_grep "<YELLOW>hint: " decoded &&
+	test_grep "You have divergent branches" decoded
 '
 
 test_expect_success 'pull.rebase not set and pull.ff=true (not-fast-forward)' '
 	git reset --hard c2 &&
 	test_config pull.ff true &&
 	git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and pull.ff=false (not-fast-forward)' '
 	git reset --hard c2 &&
 	test_config pull.ff false &&
 	git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and pull.ff=only (not-fast-forward)' '
 	git reset --hard c2 &&
 	test_config pull.ff only &&
 	test_must_fail git pull . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --rebase given (not-fast-forward)' '
 	git reset --hard c2 &&
 	git pull --rebase . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --no-rebase given (not-fast-forward)' '
 	git reset --hard c2 &&
 	git pull --no-rebase . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --ff given (not-fast-forward)' '
 	git reset --hard c2 &&
 	git pull --ff . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --no-ff given (not-fast-forward)' '
 	git reset --hard c2 &&
 	git pull --no-ff . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_expect_success 'pull.rebase not set and --ff-only given (not-fast-forward)' '
 	git reset --hard c2 &&
 	test_must_fail git pull --ff-only . c1 2>err &&
-	test_i18ngrep ! "You have divergent branches" err
+	test_grep ! "You have divergent branches" err
 '
 
 test_does_rebase () {
@@ -202,7 +202,7 @@ test_falls_back_to_full_merge () {
 test_attempts_fast_forward () {
 	git reset --hard c2 &&
 	test_must_fail git "$@" . c1 2>err &&
-	test_i18ngrep "Not possible to fast-forward, aborting" err
+	test_grep "Not possible to fast-forward, aborting" err
 }
 
 #
@@ -328,23 +328,23 @@ test_expect_success 'pull.rebase=false and --ff, ff not possible' '
 test_expect_success 'Multiple heads warns about inability to fast forward' '
 	git reset --hard c1 &&
 	test_must_fail git pull . c2 c3 2>err &&
-	test_i18ngrep "You have divergent branches" err
+	test_grep "You have divergent branches" err
 '
 
 test_expect_success 'Multiple can never be fast forwarded' '
 	git reset --hard c0 &&
 	test_must_fail git -c pull.ff=only pull . c1 c2 c3 2>err &&
-	test_i18ngrep ! "You have divergent branches" err &&
+	test_grep ! "You have divergent branches" err &&
 	# In addition to calling out "cannot fast-forward", we very much
 	# want the "multiple branches" piece to be called out to users.
-	test_i18ngrep "Cannot fast-forward to multiple branches" err
+	test_grep "Cannot fast-forward to multiple branches" err
 '
 
 test_expect_success 'Cannot rebase with multiple heads' '
 	git reset --hard c0 &&
 	test_must_fail git -c pull.rebase=true pull . c1 c2 c3 2>err &&
-	test_i18ngrep ! "You have divergent branches" err &&
-	test_i18ngrep "Cannot rebase onto multiple branches." err
+	test_grep ! "You have divergent branches" err &&
+	test_grep "Cannot rebase onto multiple branches." err
 '
 
 test_expect_success 'merge c1 with c2' '
diff --git a/t/t7611-merge-abort.sh b/t/t7611-merge-abort.sh
index c0e9425115..d6975ca48d 100755
--- a/t/t7611-merge-abort.sh
+++ b/t/t7611-merge-abort.sh
@@ -50,7 +50,7 @@ pre_merge_head="$(git rev-parse HEAD)"
 
 test_expect_success 'fails without MERGE_HEAD (unstarted merge)' '
 	test_must_fail git merge --abort 2>output &&
-	test_i18ngrep MERGE_HEAD output
+	test_grep MERGE_HEAD output
 '
 
 test_expect_success 'fails without MERGE_HEAD (unstarted merge): .git/MERGE_HEAD sanity' '
@@ -64,7 +64,7 @@ test_expect_success 'fails without MERGE_HEAD (completed merge)' '
 	# Merge successfully completed
 	post_merge_head="$(git rev-parse HEAD)" &&
 	test_must_fail git merge --abort 2>output &&
-	test_i18ngrep MERGE_HEAD output
+	test_grep MERGE_HEAD output
 '
 
 test_expect_success 'fails without MERGE_HEAD (completed merge): .git/MERGE_HEAD sanity' '
diff --git a/t/t7612-merge-verify-signatures.sh b/t/t7612-merge-verify-signatures.sh
index f5c90cc22a..84ddb56851 100755
--- a/t/t7612-merge-verify-signatures.sh
+++ b/t/t7612-merge-verify-signatures.sh
@@ -41,54 +41,54 @@ test_expect_success GPG 'create signed commits' '
 test_expect_success GPG 'merge unsigned commit with verification' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_must_fail git merge --ff-only --verify-signatures side-unsigned 2>mergeerror &&
-	test_i18ngrep "does not have a GPG signature" mergeerror
+	test_grep "does not have a GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge unsigned commit with merge.verifySignatures=true' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config merge.verifySignatures true &&
 	test_must_fail git merge --ff-only side-unsigned 2>mergeerror &&
-	test_i18ngrep "does not have a GPG signature" mergeerror
+	test_grep "does not have a GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge commit with bad signature with verification' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_must_fail git merge --ff-only --verify-signatures $(cat forged.commit) 2>mergeerror &&
-	test_i18ngrep "has a bad GPG signature" mergeerror
+	test_grep "has a bad GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge commit with bad signature with merge.verifySignatures=true' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config merge.verifySignatures true &&
 	test_must_fail git merge --ff-only $(cat forged.commit) 2>mergeerror &&
-	test_i18ngrep "has a bad GPG signature" mergeerror
+	test_grep "has a bad GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge commit with untrusted signature with verification' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_must_fail git merge --ff-only --verify-signatures side-untrusted 2>mergeerror &&
-	test_i18ngrep "has an untrusted GPG signature" mergeerror
+	test_grep "has an untrusted GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge commit with untrusted signature with verification and high minTrustLevel' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config gpg.minTrustLevel marginal &&
 	test_must_fail git merge --ff-only --verify-signatures side-untrusted 2>mergeerror &&
-	test_i18ngrep "has an untrusted GPG signature" mergeerror
+	test_grep "has an untrusted GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge commit with untrusted signature with verification and low minTrustLevel' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config gpg.minTrustLevel undefined &&
 	git merge --ff-only --verify-signatures side-untrusted >mergeoutput &&
-	test_i18ngrep "has a good GPG signature" mergeoutput
+	test_grep "has a good GPG signature" mergeoutput
 '
 
 test_expect_success GPG 'merge commit with untrusted signature with merge.verifySignatures=true' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config merge.verifySignatures true &&
 	test_must_fail git merge --ff-only side-untrusted 2>mergeerror &&
-	test_i18ngrep "has an untrusted GPG signature" mergeerror
+	test_grep "has an untrusted GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge commit with untrusted signature with merge.verifySignatures=true and minTrustLevel' '
@@ -96,20 +96,20 @@ test_expect_success GPG 'merge commit with untrusted signature with merge.verify
 	test_config merge.verifySignatures true &&
 	test_config gpg.minTrustLevel marginal &&
 	test_must_fail git merge --ff-only side-untrusted 2>mergeerror &&
-	test_i18ngrep "has an untrusted GPG signature" mergeerror
+	test_grep "has an untrusted GPG signature" mergeerror
 '
 
 test_expect_success GPG 'merge signed commit with verification' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	git merge --verbose --ff-only --verify-signatures side-signed >mergeoutput &&
-	test_i18ngrep "has a good GPG signature" mergeoutput
+	test_grep "has a good GPG signature" mergeoutput
 '
 
 test_expect_success GPG 'merge signed commit with merge.verifySignatures=true' '
 	test_when_finished "git reset --hard && git checkout initial" &&
 	test_config merge.verifySignatures true &&
 	git merge --verbose --ff-only side-signed >mergeoutput &&
-	test_i18ngrep "has a good GPG signature" mergeoutput
+	test_grep "has a good GPG signature" mergeoutput
 '
 
 test_expect_success GPG 'merge commit with bad signature without verification' '
@@ -133,7 +133,7 @@ test_expect_success GPG 'merge unsigned commit into unborn branch' '
 	test_when_finished "git checkout initial" &&
 	git checkout --orphan unborn &&
 	test_must_fail git merge --verify-signatures side-unsigned 2>mergeerror &&
-	test_i18ngrep "does not have a GPG signature" mergeerror
+	test_grep "does not have a GPG signature" mergeerror
 '
 
 test_done
diff --git a/t/t7703-repack-geometric.sh b/t/t7703-repack-geometric.sh
index 00f28fb558..9fc1626fbf 100755
--- a/t/t7703-repack-geometric.sh
+++ b/t/t7703-repack-geometric.sh
@@ -23,7 +23,7 @@ test_expect_success '--geometric with no packs' '
 		cd geometric &&
 
 		git repack --write-midx --geometric 2 >out &&
-		test_i18ngrep "Nothing new to pack" out
+		test_grep "Nothing new to pack" out
 	)
 '
 
@@ -38,7 +38,7 @@ test_expect_success '--geometric with one pack' '
 
 		git repack --geometric 2 >out &&
 
-		test_i18ngrep "Nothing new to pack" out
+		test_grep "Nothing new to pack" out
 	)
 '
 
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 59d3847bf8..6a36be1e63 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -28,14 +28,14 @@ prompt_given ()
 
 test_expect_success 'basic usage requires no repo' '
 	test_expect_code 129 git difftool -h >output &&
-	test_i18ngrep ^usage: output &&
+	test_grep ^usage: output &&
 	# create a ceiling directory to prevent Git from finding a repo
 	mkdir -p not/repo &&
 	test_when_finished rm -r not &&
 	test_expect_code 129 \
 	env GIT_CEILING_DIRECTORIES="$(pwd)/not" \
 	git -C not/repo difftool -h >output &&
-	test_i18ngrep ^usage: output
+	test_grep ^usage: output
 '
 
 # Create a file on main and change it on branch
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 39d6d713ec..bdacb57dcb 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -1386,7 +1386,7 @@ test_expect_success 'grep --no-index pattern -- path' '
 
 test_expect_success 'grep --no-index complains of revs' '
 	test_must_fail git grep --no-index o main -- 2>err &&
-	test_i18ngrep "cannot be used with revs" err
+	test_grep "cannot be used with revs" err
 '
 
 test_expect_success 'grep --no-index prefers paths to revs' '
@@ -1399,7 +1399,7 @@ test_expect_success 'grep --no-index prefers paths to revs' '
 
 test_expect_success 'grep --no-index does not "diagnose" revs' '
 	test_must_fail git grep --no-index o :1:hello.c 2>err &&
-	test_i18ngrep ! -i "did you mean" err
+	test_grep ! -i "did you mean" err
 '
 
 cat >expected <<EOF
diff --git a/t/t7811-grep-open.sh b/t/t7811-grep-open.sh
index 1dd07141a7..fe38d88a1a 100755
--- a/t/t7811-grep-open.sh
+++ b/t/t7811-grep-open.sh
@@ -63,7 +63,7 @@ test_expect_success SIMPLEPAGER 'git grep -O' '
 
 test_expect_success 'git grep -O --cached' '
 	test_must_fail git grep --cached -O GREP_PATTERN >out 2>msg &&
-	test_i18ngrep open-files-in-pager msg
+	test_grep open-files-in-pager msg
 '
 
 test_expect_success 'git grep -O --no-index' '
diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh
index d37c83b464..167fe66150 100755
--- a/t/t7814-grep-recurse-submodules.sh
+++ b/t/t7814-grep-recurse-submodules.sh
@@ -348,7 +348,7 @@ test_incompatible_with_recurse_submodules ()
 {
 	test_expect_success "--recurse-submodules and $1 are incompatible" "
 		test_must_fail git grep -e. --recurse-submodules $1 2>actual &&
-		test_i18ngrep 'not supported with --recurse-submodules' actual
+		test_grep 'not supported with --recurse-submodules' actual
 	"
 }
 
diff --git a/t/t7816-grep-binary-pattern.sh b/t/t7816-grep-binary-pattern.sh
index fdb2355649..4353be5adb 100755
--- a/t/t7816-grep-binary-pattern.sh
+++ b/t/t7816-grep-binary-pattern.sh
@@ -26,7 +26,7 @@ nul_match_internal () {
 			>stderr &&
 			printf '$pattern' | q_to_nul >f &&
 			test_must_fail env LC_ALL=\"$lc_all\" git grep $extra_flags -f f $flags a 2>stderr &&
-			test_i18ngrep ! 'This is only supported with -P under PCRE v2' stderr
+			test_grep ! 'This is only supported with -P under PCRE v2' stderr
 		"
 	elif test "$matches" = P
 	then
@@ -34,7 +34,7 @@ nul_match_internal () {
 			>stderr &&
 			printf '$pattern' | q_to_nul >f &&
 			test_must_fail env LC_ALL=\"$lc_all\" git grep -f f $flags a 2>stderr &&
-			test_i18ngrep 'This is only supported with -P under PCRE v2' stderr
+			test_grep 'This is only supported with -P under PCRE v2' stderr
 		"
 	else
 		test_expect_success "PANIC: Test framework error. Unknown matches value $matches" 'false'
diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh
index 487e326b3f..760079b411 100755
--- a/t/t7900-maintenance.sh
+++ b/t/t7900-maintenance.sh
@@ -33,13 +33,13 @@ test_systemd_analyze_verify () {
 
 test_expect_success 'help text' '
 	test_expect_code 129 git maintenance -h >actual &&
-	test_i18ngrep "usage: git maintenance <subcommand>" actual &&
+	test_grep "usage: git maintenance <subcommand>" actual &&
 	test_expect_code 129 git maintenance barf 2>err &&
-	test_i18ngrep "unknown subcommand: \`barf'\''" err &&
-	test_i18ngrep "usage: git maintenance" err &&
+	test_grep "unknown subcommand: \`barf'\''" err &&
+	test_grep "usage: git maintenance" err &&
 	test_expect_code 129 git maintenance 2>err &&
-	test_i18ngrep "error: need a subcommand" err &&
-	test_i18ngrep "usage: git maintenance" err
+	test_grep "error: need a subcommand" err &&
+	test_grep "usage: git maintenance" err
 '
 
 test_expect_success 'run [--auto|--quiet]' '
@@ -131,12 +131,12 @@ test_expect_success 'commit-graph auto condition' '
 
 test_expect_success 'run --task=bogus' '
 	test_must_fail git maintenance run --task=bogus 2>err &&
-	test_i18ngrep "is not a valid task" err
+	test_grep "is not a valid task" err
 '
 
 test_expect_success 'run --task duplicate' '
 	test_must_fail git maintenance run --task=gc --task=gc 2>err &&
-	test_i18ngrep "cannot be selected multiple times" err
+	test_grep "cannot be selected multiple times" err
 '
 
 test_expect_success 'run --task=prefetch with no remotes' '
@@ -377,12 +377,12 @@ test_expect_success 'pack-refs task' '
 
 test_expect_success '--auto and --schedule incompatible' '
 	test_must_fail git maintenance run --auto --schedule=daily 2>err &&
-	test_i18ngrep "at most one" err
+	test_grep "at most one" err
 '
 
 test_expect_success 'invalid --schedule value' '
 	test_must_fail git maintenance run --schedule=annually 2>err &&
-	test_i18ngrep "unrecognized --schedule" err
+	test_grep "unrecognized --schedule" err
 '
 
 test_expect_success '--schedule inheritance weekly -> daily -> hourly' '
@@ -576,15 +576,15 @@ test_expect_success !MINGW 'register and unregister with regex metacharacters' '
 
 test_expect_success 'start --scheduler=<scheduler>' '
 	test_expect_code 129 git maintenance start --scheduler=foo 2>err &&
-	test_i18ngrep "unrecognized --scheduler argument" err &&
+	test_grep "unrecognized --scheduler argument" err &&
 
 	test_expect_code 129 git maintenance start --no-scheduler 2>err &&
-	test_i18ngrep "unknown option" err &&
+	test_grep "unknown option" err &&
 
 	test_expect_code 128 \
 		env GIT_TEST_MAINT_SCHEDULER="launchctl:true,schtasks:true" \
 		git maintenance start --scheduler=crontab 2>err &&
-	test_i18ngrep "fatal: crontab scheduler is not available" err
+	test_grep "fatal: crontab scheduler is not available" err
 '
 
 test_expect_success 'start from empty cron table' '
diff --git a/t/t8003-blame-corner-cases.sh b/t/t8003-blame-corner-cases.sh
index 8bcd39e81b..731265541a 100755
--- a/t/t8003-blame-corner-cases.sh
+++ b/t/t8003-blame-corner-cases.sh
@@ -207,7 +207,7 @@ EOF
 
 test_expect_success 'blame -L with invalid start' '
 	test_must_fail git blame -L5 tres 2>errors &&
-	test_i18ngrep "has only 2 lines" errors
+	test_grep "has only 2 lines" errors
 '
 
 test_expect_success 'blame -L with invalid end' '
diff --git a/t/t8013-blame-ignore-revs.sh b/t/t8013-blame-ignore-revs.sh
index b18633dee1..9a03b0f361 100755
--- a/t/t8013-blame-ignore-revs.sh
+++ b/t/t8013-blame-ignore-revs.sh
@@ -129,14 +129,14 @@ test_expect_success override_ignore_revs_file '
 	'
 test_expect_success bad_files_and_revs '
 	test_must_fail git blame file --ignore-rev NOREV 2>err &&
-	test_i18ngrep "cannot find revision NOREV to ignore" err &&
+	test_grep "cannot find revision NOREV to ignore" err &&
 
 	test_must_fail git blame file --ignore-revs-file NOFILE 2>err &&
-	test_i18ngrep "could not open.*: NOFILE" err &&
+	test_grep "could not open.*: NOFILE" err &&
 
 	echo NOREV >ignore_norev &&
 	test_must_fail git blame file --ignore-revs-file ignore_norev 2>err &&
-	test_i18ngrep "invalid object name: NOREV" err
+	test_grep "invalid object name: NOREV" err
 '
 
 # For ignored revs that have added 'unblamable' lines, mark those lines with a
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index a60b05ad3f..5307947db8 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -371,7 +371,7 @@ test_expect_success $PREREQ,!AUTOIDENT 'broken implicit ident aborts send-email'
 		--smtp-server="$(pwd)/fake.sendmail" \
 		--to=to@example.com \
 		$patches </dev/null 2>errors &&
-	test_i18ngrep "tell me who you are" errors
+	test_grep "tell me who you are" errors
 	)
 '
 
@@ -2062,7 +2062,7 @@ test_expect_success $PREREQ 'aliases and sendemail.identity' '
 		-c sendemail.aliasesfile=default-aliases \
 		-c sendemail.cloud.aliasesfile=cloud-aliases \
 		send-email -1 2>stderr &&
-	test_i18ngrep "cloud-aliases" stderr
+	test_grep "cloud-aliases" stderr
 '
 
 test_sendmail_aliases () {
@@ -2427,7 +2427,7 @@ test_expect_success $PREREQ 'invoke hook' '
 			--to=nobody@example.com \
 			--smtp-server="$(pwd)/../fake.sendmail" \
 			../another.patch 2>err &&
-		test_i18ngrep "rejected by sendemail-validate hook" err
+		test_grep "rejected by sendemail-validate hook" err
 	)
 '
 
@@ -2483,7 +2483,7 @@ test_expect_success $PREREQ 'test that sendmail config is rejected' '
 		--to=nobody@example.com \
 		--smtp-server="$(pwd)/fake.sendmail" \
 		HEAD^ 2>err &&
-	test_i18ngrep "found configuration options for '"'"sendmail"'"'" err
+	test_grep "found configuration options for '"'"sendmail"'"'" err
 '
 
 test_expect_success $PREREQ 'test that sendmail config rejection is specific' '
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index ac237a1f90..dbb5042b0b 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -2879,7 +2879,7 @@ test_expect_success 'S: filemodify with garbage after mark must fail' '
 	COMMIT
 	M 100644 :403x hello.c
 	EOF
-	test_i18ngrep "space after mark" err
+	test_grep "space after mark" err
 '
 
 # inline is misspelled; fast-import thinks it is some unknown dataref
@@ -2895,7 +2895,7 @@ test_expect_success 'S: filemodify with garbage after inline must fail' '
 	inline
 	BLOB
 	EOF
-	test_i18ngrep "nvalid dataref" err
+	test_grep "nvalid dataref" err
 '
 
 test_expect_success 'S: filemodify with garbage after sha1 must fail' '
@@ -2908,7 +2908,7 @@ test_expect_success 'S: filemodify with garbage after sha1 must fail' '
 	COMMIT
 	M 100644 ${sha1}x hello.c
 	EOF
-	test_i18ngrep "space after SHA1" err
+	test_grep "space after SHA1" err
 '
 
 #
@@ -2923,7 +2923,7 @@ test_expect_success 'S: notemodify with garbage after mark dataref must fail' '
 	COMMIT
 	N :202x :302
 	EOF
-	test_i18ngrep "space after mark" err
+	test_grep "space after mark" err
 '
 
 test_expect_success 'S: notemodify with garbage after inline dataref must fail' '
@@ -2938,7 +2938,7 @@ test_expect_success 'S: notemodify with garbage after inline dataref must fail'
 	note blob
 	BLOB
 	EOF
-	test_i18ngrep "nvalid dataref" err
+	test_grep "nvalid dataref" err
 '
 
 test_expect_success 'S: notemodify with garbage after sha1 dataref must fail' '
@@ -2951,7 +2951,7 @@ test_expect_success 'S: notemodify with garbage after sha1 dataref must fail' '
 	COMMIT
 	N ${sha1}x :302
 	EOF
-	test_i18ngrep "space after SHA1" err
+	test_grep "space after SHA1" err
 '
 
 #
@@ -2966,7 +2966,7 @@ test_expect_success 'S: notemodify with garbage after mark commit-ish must fail'
 	COMMIT
 	N :202 :302x
 	EOF
-	test_i18ngrep "after mark" err
+	test_grep "after mark" err
 '
 
 #
@@ -2999,7 +2999,7 @@ test_expect_success 'S: from with garbage after mark must fail' '
 	EOF
 
 	# now evaluate the error
-	test_i18ngrep "after mark" err
+	test_grep "after mark" err
 '
 
 
@@ -3018,7 +3018,7 @@ test_expect_success 'S: merge with garbage after mark must fail' '
 	merge :303x
 	M 100644 :403 hello.c
 	EOF
-	test_i18ngrep "after mark" err
+	test_grep "after mark" err
 '
 
 #
@@ -3033,7 +3033,7 @@ test_expect_success 'S: tag with garbage after mark must fail' '
 	tag S
 	TAG
 	EOF
-	test_i18ngrep "after mark" err
+	test_grep "after mark" err
 '
 
 #
@@ -3043,7 +3043,7 @@ test_expect_success 'S: cat-blob with garbage after mark must fail' '
 	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
 	cat-blob :403x
 	EOF
-	test_i18ngrep "after mark" err
+	test_grep "after mark" err
 '
 
 #
@@ -3053,7 +3053,7 @@ test_expect_success 'S: ls with garbage after mark must fail' '
 	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
 	ls :302x hello.c
 	EOF
-	test_i18ngrep "space after mark" err
+	test_grep "space after mark" err
 '
 
 test_expect_success 'S: ls with garbage after sha1 must fail' '
@@ -3061,7 +3061,7 @@ test_expect_success 'S: ls with garbage after sha1 must fail' '
 	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
 	ls ${sha1}x hello.c
 	EOF
-	test_i18ngrep "space after tree-ish" err
+	test_grep "space after tree-ish" err
 '
 
 ###
diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index a4b3cb9492..53af8e34ac 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -54,7 +54,7 @@ test_expect_success 'git p4 sync uninitialized repo' '
 	(
 		cd "$git" &&
 		test_must_fail git p4 sync 2>errs &&
-		test_i18ngrep "Perhaps you never did" errs
+		test_grep "Perhaps you never did" errs
 	)
 '
 
@@ -86,7 +86,7 @@ test_expect_success 'git p4 sync existing branch without changes' '
 		test_commit head &&
 		git p4 sync --branch=depot //depot@all &&
 		git p4 sync --branch=refs/remotes/p4/depot >out &&
-		test_i18ngrep "No changes to import!" out
+		test_grep "No changes to import!" out
 	)
 '
 
@@ -101,7 +101,7 @@ test_expect_success 'git p4 sync existing branch with relative name' '
 		test_commit head &&
 		git p4 sync --branch=branch1 //depot@all &&
 		git p4 sync --branch=p4/branch1 >out &&
-		test_i18ngrep "No changes to import!" out
+		test_grep "No changes to import!" out
 	)
 '
 
@@ -116,7 +116,7 @@ test_expect_success 'git p4 sync existing branch with nested path' '
 		test_commit head &&
 		git p4 sync --branch=p4/some/path //depot@all &&
 		git p4 sync --branch=some/path >out &&
-		test_i18ngrep "No changes to import!" out
+		test_grep "No changes to import!" out
 	)
 '
 
@@ -131,7 +131,7 @@ test_expect_success 'git p4 sync branch explicit ref without p4 in path' '
 		test_commit head &&
 		git p4 sync --branch=refs/remotes/someremote/depot //depot@all &&
 		git p4 sync --branch=refs/remotes/someremote/depot >out &&
-		test_i18ngrep "No changes to import!" out
+		test_grep "No changes to import!" out
 	)
 '
 
@@ -143,7 +143,7 @@ test_expect_success 'git p4 sync nonexistent ref' '
 		test_commit head &&
 		git p4 sync --branch=depot //depot@all &&
 		test_must_fail git p4 sync --branch=depot2 2>errs &&
-		test_i18ngrep "Perhaps you never did" errs
+		test_grep "Perhaps you never did" errs
 	)
 '
 
@@ -155,7 +155,7 @@ test_expect_success 'git p4 sync existing non-p4-imported ref' '
 		test_commit head &&
 		git p4 sync --branch=depot //depot@all &&
 		test_must_fail git p4 sync --branch=refs/heads/master 2>errs &&
-		test_i18ngrep "Perhaps you never did" errs
+		test_grep "Perhaps you never did" errs
 	)
 '
 
@@ -290,7 +290,7 @@ test_expect_success 'exit when p4 fails to produce marshaled output' '
 		export PATH &&
 		test_expect_code 1 git p4 clone --dest="$git" //depot >errs 2>&1
 	) &&
-	test_i18ngrep ! Traceback errs
+	test_grep ! Traceback errs
 '
 
 # Hide a file from p4d, make sure we catch its complaint.  This won't fail in
@@ -301,7 +301,7 @@ test_expect_success 'exit gracefully for p4 server errors' '
 	mv "$db"/depot/file1,v "$db"/depot/file1,v,hidden &&
 	test_when_finished cleanup_git &&
 	test_expect_code 1 git p4 clone --dest="$git" //depot@1 >out 2>err &&
-	test_i18ngrep "Error from p4 print" err
+	test_grep "Error from p4 print" err
 '
 
 test_expect_success 'clone --bare should make a bare repository' '
diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh
index 759a14fa87..73cca0d143 100755
--- a/t/t9801-git-p4-branch.sh
+++ b/t/t9801-git-p4-branch.sh
@@ -135,7 +135,7 @@ test_expect_success 'sync specific detected branch' '
 	(
 		cd "$git" &&
 		git p4 sync --branch=depot/branch2 >out &&
-		test_i18ngrep "No changes to import!" out
+		test_grep "No changes to import!" out
 	)
 '
 
diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 7d4109f29d..af4b286f9d 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -75,7 +75,7 @@ test_expect_success 'submit --dry-run' '
 		test_commit "dry-run1" &&
 		test_commit "dry-run2" &&
 		git p4 submit --dry-run >out &&
-		test_i18ngrep "Would apply" out
+		test_grep "Would apply" out
 	) &&
 	(
 		cd "$cli" &&
@@ -99,7 +99,7 @@ test_expect_success 'submit --dry-run --export-labels' '
 		git commit -m "dry-run2" dry-run2 &&
 		git tag -m "dry-run-tag1" dry-run-tag1 HEAD^ &&
 		git p4 submit --dry-run --export-labels >out &&
-		test_i18ngrep "Would create p4 label" out
+		test_grep "Would create p4 label" out
 	) &&
 	(
 		cd "$cli" &&
@@ -443,7 +443,7 @@ test_expect_success 'description with Jobs section and bogus following text' '
 		# build a job
 		make_job $(cat jobname) &&
 		test_must_fail git p4 submit 2>err &&
-		test_i18ngrep "Unknown field name" err
+		test_grep "Unknown field name" err
 	) &&
 	(
 		cd "$cli" &&
@@ -461,9 +461,9 @@ test_expect_success 'submit --prepare-p4-only' '
 		git add prep-only-add &&
 		git commit -m "prep only add" &&
 		git p4 submit --prepare-p4-only >out &&
-		test_i18ngrep "prepared for submission" out &&
-		test_i18ngrep "must be deleted" out &&
-		test_i18ngrep ! "everything below this line is just the diff" out
+		test_grep "prepared for submission" out &&
+		test_grep "must be deleted" out &&
+		test_grep ! "everything below this line is just the diff" out
 	) &&
 	(
 		cd "$cli" &&
diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh
index 0ca9937de6..c766fd159f 100755
--- a/t/t9815-git-p4-submit-fail.sh
+++ b/t/t9815-git-p4-submit-fail.sh
@@ -35,7 +35,7 @@ test_expect_success 'conflict on one commit' '
 		git add file1 &&
 		git commit -m "line3 in file1 will conflict" &&
 		test_expect_code 1 git p4 submit >out &&
-		test_i18ngrep "No commits applied" out
+		test_grep "No commits applied" out
 	)
 '
 
@@ -58,7 +58,7 @@ test_expect_success 'conflict on second of two commits' '
 		git add file1 &&
 		git commit -m "line4 in file1 will conflict" &&
 		test_expect_code 1 git p4 submit >out &&
-		test_i18ngrep "Applied only the commits" out
+		test_grep "Applied only the commits" out
 	)
 '
 
@@ -81,7 +81,7 @@ test_expect_success 'conflict on first of two commits, skip' '
 		# but this commit is okay
 		test_commit "okay_commit_after_skip" &&
 		echo s | test_expect_code 1 git p4 submit >out &&
-		test_i18ngrep "Applied only the commits" out
+		test_grep "Applied only the commits" out
 	)
 '
 
@@ -104,7 +104,7 @@ test_expect_success 'conflict on first of two commits, quit' '
 		# but this commit is okay
 		test_commit "okay_commit_after_quit" &&
 		echo q | test_expect_code 1 git p4 submit >out &&
-		test_i18ngrep "No commits applied" out
+		test_grep "No commits applied" out
 	)
 '
 
@@ -144,7 +144,7 @@ test_expect_success 'conflict on first of two commits, --conflict=skip' '
 		# but this commit is okay
 		test_commit "okay_commit_after_auto_skip" &&
 		test_expect_code 1 git p4 submit --conflict=skip >out &&
-		test_i18ngrep "Applied only the commits" out
+		test_grep "Applied only the commits" out
 	)
 '
 
@@ -167,7 +167,7 @@ test_expect_success 'conflict on first of two commits, --conflict=quit' '
 		# but this commit is okay
 		test_commit "okay_commit_after_auto_quit" &&
 		test_expect_code 1 git p4 submit --conflict=quit >out &&
-		test_i18ngrep "No commits applied" out
+		test_grep "No commits applied" out
 	)
 '
 
-- 
2.42.0-530-g692be87cbb



^ permalink raw reply related	[relevance 1%]

* Re: [PATCH 2/2] pretty: add '%aA' to show domain-part of email addresses
  @ 2023-10-29 23:53  4%       ` Junio C Hamano
  2023-11-20 20:21  4%         ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-10-29 23:53 UTC (permalink / raw)
  To: Jeff King; +Cc: Kousik Sanagavarapu, Liam Beguin, git

Jeff King <peff@peff.net> writes:

> On Sat, Oct 28, 2023 at 09:12:06AM +0900, Junio C Hamano wrote:
>
>> Grouping @gmail.com addresses do not smell all that useful, though.
>> ... 
> One way you could directly use this is in shortlog, which these days
> lets you group by specific formats. So:
>
>   git shortlog -ns --group=format:%aA
>
> is potentially useful.

Exactly.  That is what I meant by "Grouping", and I agree with you
about "potentially" part, too ;-)  Throwing all @gmail.com addresses
into a single bin would not be very useful.

> ... If we could spell it as
> %(authoremail:domain) that would remove the question. But given the
> existence of "%al", I'm not too sad to see another letter allocated to
> this purpose in the meantime.

Another line of thought is perhaps it is potentially useful to teach
the --format= machinery to be a bit more programmable, e.g. allowing
to compute a substring of an existing field %{%aE#*@} without having
to waste a letter each for the local part and domain part.  But as I
already said, we are now talking about "postprocessing", and adding
complexity to our codebase only to have incomplete flexibility may
not be worth it.  A more specific %(authoremail:localpart) and its
domain counterpart may be easier to explain and understand.

In any case, it is a bit too late to say "let's not waste the
precious single letter namespace to add useless features", as we
have come way too far, so I do not mind too much using a currently
unused letter $X for yet another author and committer trait.



^ permalink raw reply	[relevance 4%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-23  7:15 12%           ` Sebastian Thiel
@ 2023-10-29  6:44  9%             ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2023-10-29  6:44 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: Junio C Hamano, Josh Triplett, git

Hi Sebastian,

On Mon, Oct 23, 2023 at 12:15 AM Sebastian Thiel
<sebastian.thiel@icloud.com> wrote:
>
> On 16 Oct 2023, at 8:02, Sebastian Thiel wrote:
>
> > I don't know if this time will be different as I can only offer to implement
> > the syntax adjustment, whatever that might be (possibly after validating
> > the candidate against a corpus of repositories), along with the update
> > to `git clean` so it leaves precious files alone by default and a new flag
> > to also remove precious files.
>
> I am happy to announce this feature can now be contributed in full by me once
> you give it a go. This would mean that the entirety of `git` would become
> aware of precious files over time.
>
> To my mind, and probably out of ignorance, it seems that once the syntax is
> decided on it's possible for the implementation to start. From there I could
> use Elijah's analysis to know which parts of git to make aware of precious files
> in addition to `git clean`.
>
> I am definitely looking forward to hearing from you :).

So, we typically don't pre-approve patches/features.  Junio described
this recently at [1].

However, starting things out with an RFC, as you've done, is certainly
a good first step to gauge whether folks think a feature is useful.

Occasionally, when the feature is bigger or touches lots of areas of
the code, people will even write up a design document, and first get a
review on the document, which then streamlines later reviews since we
have some of the high-level aspects agreed to.  Some examples:
  * Documentation/technical/hash-function-transition.txt
  * Documentation/technical/sparse-checkout.txt
  * Documentation/technical/sparse-index.txt
Each of which are in various stages between "these are ideas we think
are good and our plans to get there" to "most of this document has
since been implemented".  There are others in that directory too,
though not everything in that directory is a planning document; some
of the files are simply documentation of what already exists.

Anyway, creating a similar planning document and covering the various
cases I mentioned would likely be a very useful next step here.  I did
note that multiple ideas have been presented in this thread about the
syntax for specifying precious files, and it'd be good to nail one
down.  It would also be nice to see proposed answers to the several
cases I brought up (some of which Junio answered, others of which I
also have potential answers for so I could potentially help you craft
this document, and a few others that someone else would need to fill
in).  Sometimes we also want to cover pros/cons of the approaches we
have decided upon, in part because others may come along later and if
they discover a new pro or con that we haven't thought of, then we may
need to rethink the plan.

Hope that helps,
Elijah

[1] https://lore.kernel.org/git/xmqq8r9ommyt.fsf@gitster.g/


^ permalink raw reply	[relevance 9%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-15 16:31 12%         ` Junio C Hamano
  2023-10-16  6:02 12%           ` Sebastian Thiel
@ 2023-10-23  7:15 12%           ` Sebastian Thiel
  2023-10-29  6:44  9%             ` Elijah Newren
  1 sibling, 1 reply; 200+ results
From: Sebastian Thiel @ 2023-10-23  7:15 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Elijah Newren, Josh Triplett, git

On 16 Oct 2023, at 8:02, Sebastian Thiel wrote:

> I don't know if this time will be different as I can only offer to implement
> the syntax adjustment, whatever that might be (possibly after validating
> the candidate against a corpus of repositories), along with the update
> to `git clean` so it leaves precious files alone by default and a new flag
> to also remove precious files.

I am happy to announce this feature can now be contributed in full by me once
you give it a go. This would mean that the entirety of `git` would become
aware of precious files over time.

To my mind, and probably out of ignorance, it seems that once the syntax is
decided on it's possible for the implementation to start. From there I could
use Elijah's analysis to know which parts of git to make aware of precious files
in addition to `git clean`.

I am definitely looking forward to hearing from you :).




^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-15 16:31 12%         ` Junio C Hamano
@ 2023-10-16  6:02 12%           ` Sebastian Thiel
  2023-10-23  7:15 12%           ` Sebastian Thiel
  1 sibling, 0 replies; 200+ results
From: Sebastian Thiel @ 2023-10-16  6:02 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Elijah Newren, Josh Triplett, git

Thanks a lot, that makes perfect sense!

Thanks to Elijah we may also have discovered why the idea of precious files
didn't get implemented last time it came up: it's too much work to make
all portions of the code aware.

I don't know if this time will be different as I can only offer to implement
the syntax adjustment, whatever that might be (possibly after validating
the candidate against a corpus of repositories), along with the update
to `git clean` so it leaves precious files alone by default and a new flag
to also remove precious files.

Maybe that already is something worth having, but I can also imagine
that ideally there is a plan for retrofitting other portions of git as
well along with the resources to actually do it.

On 15 Oct 2023, at 18:31, Junio C Hamano wrote:

> Sebastian Thiel <sebastian.thiel@icloud.com> writes:
>
>> A particularly interesting question brought up here also was the question
>> of what's more important: untracked files, or precious files? Are they
>> effectively treated the same, or is there a difference?
>
> Think of it this way.  There are two orthogonal axes.
>
>  (1) Are you a candidate to be tracked, even though you are not
>      tracked right now?
>
>  (2) Should you be kept and make an operation fail that wants to
>      remove you to make room?
>
> For untracked files, both are "Yes".  As we already saw in the long
> discussion, precious files are "not to be added and not to be
> clobbered", so you'd answer "No" and "Yes" [*].
>
> In other words, both are equally protected from getting cloberred.
>
>     Side note: for completeness, for ignored files, the answers are
>     "No", and "No".  The introduction of "precious" class makes a
>     combination "No-Yes" that hasn't been possible so far.
>
> Elijah, thanks for doing a very good job of creating a catalog of
> kludges we accumulated over the years for the lack of proper support
> for the precious paths.  I think they should be kept for backward
> compatibility, but for new users they should not have to learn any
> of them once we have the support for precious paths.


^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-15  7:33 12%       ` Sebastian Thiel
@ 2023-10-15 16:31 12%         ` Junio C Hamano
  2023-10-16  6:02 12%           ` Sebastian Thiel
  2023-10-23  7:15 12%           ` Sebastian Thiel
  0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2023-10-15 16:31 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: Elijah Newren, Josh Triplett, git

Sebastian Thiel <sebastian.thiel@icloud.com> writes:

> A particularly interesting question brought up here also was the question
> of what's more important: untracked files, or precious files? Are they
> effectively treated the same, or is there a difference?

Think of it this way.  There are two orthogonal axes.

 (1) Are you a candidate to be tracked, even though you are not
     tracked right now?

 (2) Should you be kept and make an operation fail that wants to
     remove you to make room?

For untracked files, both are "Yes".  As we already saw in the long
discussion, precious files are "not to be added and not to be
clobbered", so you'd answer "No" and "Yes" [*].

In other words, both are equally protected from getting cloberred.

    Side note: for completeness, for ignored files, the answers are
    "No", and "No".  The introduction of "precious" class makes a
    combination "No-Yes" that hasn't been possible so far.

Elijah, thanks for doing a very good job of creating a catalog of
kludges we accumulated over the years for the lack of proper support
for the precious paths.  I think they should be kept for backward
compatibility, but for new users they should not have to learn any
of them once we have the support for precious paths.



^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-15  6:44 11%     ` Elijah Newren
@ 2023-10-15  7:33 12%       ` Sebastian Thiel
  2023-10-15 16:31 12%         ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Sebastian Thiel @ 2023-10-15  7:33 UTC (permalink / raw)
  To: Elijah Newren; +Cc: Josh Triplett, Junio C Hamano, git

Thanks so much Elijah for your eye-opening response. Thus far I was both
naive and ignorant about the complexity of the matter, and also never
asked the question as to why it wasn't tackled earlier since it came up
already.

Since so many areas of git are affected by precious files, it seems that
rolling it out with everything working is unrealistic and I wonder if
it even had to be behind a feature toggle at first.

A particularly interesting question brought up here also was the question
of what's more important: untracked files, or precious files? Are they
effectively treated the same, or is there a difference?

In any case, it seems easiest to set the desired syntax for such a
feature and/or validate it, and then devise a plan for how it could all
come together.


On 15 Oct 2023, at 8:44, Elijah Newren wrote:

> Hi,
>
> On Fri, Oct 13, 2023 at 11:00 PM Josh Triplett <josh@joshtriplett.org> wrote:
>>
>> On Tue, Oct 10, 2023 at 10:02:20AM -0700, Junio C Hamano wrote:
>>> Sebastian Thiel <sebastian.thiel@icloud.com> writes:
>>>
>>>> I'd like to propose adding a new standard gitattribute "precious".
>>>
>>> ;-).
>>>
>>> Over the years, I've seen many times scenarios that would have been
>>> helped if we had not just "tracked? ignored? unignored?" but also
>>> the fourth kind [*].  The word "ignored" (or "excluded") has always
>>> meant "not tracked, not to be tracked, and expendable" to Git, and
>>> "ignored but unexpendable" class was missing.  I even used the term
>>> "precious" myself in those discussions.  At the concept level, I
>>> support the effort 100%, but as always, the devil will be in the
>>> details.
>>
>> "I've already wanted this for years" is, honestly, the best response we
>> could *possibly* have hoped for.
>>
>>> Scenarios that people wished for "precious" traditionally have been
>>>
>>>  * You are working on 'master'.  You have in your .gitignore or
>>>    .git/info/exclude a line to ignore path A, and have random
>>>    scribbles in a throw-away file there.  There is another branch
>>>    'seen', where they added some tracked contents at path A/B.  You
>>>    do "git checkout seen" and your file A that is an expendable file,
>>>    because it is listed as ignored in .git/info/exclude, is removed
>>>    to make room for creating A/B.
>>
>> Ouch, I hadn't even thought about the issue of branch-switching
>> overwriting a file like that, but that's another great reason to have
>> "precious". (I've been thinking about "precious" as primarily to protect
>> files like `.config`, where they'd be unlikely to be checked in on any
>> branch because they have an established purpose in the project. Though,
>> of course, people *do* sometimes check in `.config` files in
>> special-purpose branches that aren't meant for upstreaming.)
>
> If we're going to implement precious files, I think we should take a
> step back and figure out what parts of the system are affected.  It's
> way more than branch switching and `git clean`.  Some notes (including
> some useful implementation pointers):
>
> A) You will probably learn a lot and get a leg up on the
> implementation by grepping for "preserve_ignored"; lots of the
> plumbing has already been created related to this.
>
> B) checkout has a --no-overwrite-ignore, which for checkout
> operations, essentially turns all ignored files into precious files.
> B1) The code behind --no-overwrite-ignore will probably be helpful in
> your implementation of precious files
> B2) What happens to this --no-overwrite-ignore option?
> Deprecate/remove it after adding precious files, since precious files
> now serve that purpose?  Keep the flag anyway?  What happens to the
> docs around the flag?
> B3) If we keep --no-overwrite-ignore, do we also need to add a
> --overwrite-precious option to allow those to be similarly tweaked?
>
> C) merge has a --no-overwrite-ignore option, which for supported merge
> operations (which are sadly very few), essentially turns all ignored
> files into precious files.
> C1) Same comments as A1-A3 but for merges
> C2) Sadly, merge's --no-overwrite-ignore is almost garbage.
> builtin/merge.c will only pass this option to the "fast-forward" merge
> backend, causing any other type of merge to overwrite ignored files
> despite any such flag.
> C3) most merge backends don't have logic to handle
> --no-overwrite-ignore even if they were passed it, and would need
> explicit support added.
> C4) merge-ort would only essentially need a one-liner; it basically
> has the code in place and a comment but the flag was never plumbed
> through
> C5) it'd be a herculean effort to support this with merge-recursive,
> and a sisyphean effort to attempt to maintain.  Deprecating and
> removing merge-recursive is probably a better option
> C6) merge-resolve and merge-octopus could probably be handled
> automatically by ensuring `git read-tree` gained support for it.
> C7) there'd be no way to ensure user-written merge algorithms would
> support it, but that's kind of a general problem with user-written
> anythings
>
> D) git ls-files would need to have a way to query for precious files,
> much as it can currently be used to query for ignored files (or
> tracked files, or conflicted file, or skip-worktree files, or...).
> Backward compatibility questions arise about whether precious files
> should appear in `git ls-files -o` output.
>
> E) git status has an --ignored option, with multiple flags for
> controlling it.  We'll likely need more flags to be able to pick out
> precious files.
>
> F) We'd probably need to look through several other commands and look
> at what they need for special handling.  e.g., am, stash, reset.  I
> suspect stash will be a particularly sore point, as its unfortunate
> design of implementing shell in C code and attempting to decompose the
> command in terms of other high-level commands is basically a leaky
> abstraction that is very likely to be susceptible to edge and corner
> cases here.  (In fact, I think I may have left some of the issues for
> untracked/ignored files in stash broken when I was fixing such
> problems for other commands.)
>
> G) Documentation.  Commands like `git reset --hard`, `git checkout
> -f`, and `read-tree --reset` are documented to nuke untracked files
> specifically because we expect most commands to preserve untracked
> files.  These would need to mention that "precious" files are also
> nuked (or, if we don't nuke them, why precious-and-ignored files are
> more precious than untracked files).
>
> H) Design of `reset --hard`.  As per
> https://lore.kernel.org/git/xmqqr1e2ejs9.fsf@gitster.g/, `git reset
> --hard` is a little funny and we have thought about changing it.  Will
> the addition of "precious" objects provide more impetus to do so, and
> should a migration story be part of such a new feature?
>
> I) Although git's stated behavior was to nuke ignored files and
> protect untracked files, just a couple years ago we found _many_ bugs
> where Git didn't do that.  A series was pushed to fix most of those[1]
> (incidentally, the same series the introduced the preserve_ignored
> flag I pointed you to earlier), but it left a few things
> commented/broken.  The cover letter and some emails in the thread also
> discussed in more detail some of the ramifications around a "precious"
> setting.  It may be worth reading to catch other things to cover and
> think about.
>
> J) To implement this feature, you're going to have to touch dir.c.
> Good luck with that.  (Seriously, good luck.  The more people that
> touch it that aren't me, the less I'll be pinged/queried about that
> monstrosity.)
>
>
>>> In any case, the "precious" paths are expected to be small minority
>>> of what people never want to "git add" or "git commit", so coming up
>>> with a special syntax to be used in .gitignore, even if that special
>>> syntax is ugly and cumbersome to type, would be perfectly OK.
>>
>> [Following up both to this and to Sebastian's response.]
>>
>> One potentially important question: should the behavior of old git be to
>> treat precious files as ignored, or as not-ignored? If the syntax were
>> something like
>>
>> $.config
>>
>> then old git would treat the file as not-ignored. If the syntax were
>> something like
>>
>> $precious
>> .config
>>
>> then old git would treat the file as ignored.
>>
>> Seems like it would be obtrusive if `git status` in old git showed the
>> file, and `git add .` in old git added it.
>
> A very good set of questions, along similar lines as the question
> about `git ls-files -o` handling.
>
>
> Anyway, I'm a bit worried after digging up and dumping all these
> concerns on you, that it'll sound like I'm trying to bury the feature
> and discourage folks.  In the past I have been against this at times,
> but mostly because it looked like lots of work, I didn't want to touch
> dir.c anymore, and I was worried we'd add a bunch more edge & corner
> cases to the code (when we already had plenty with our more limited
> number of file types).  In a way, the preserve_ignored stuff kind of
> made this a lot more reasonable for us to switch to.  But I do still
> think it's a fair amount of work, and I am kind of worried about
> potential new edge and corner case.
>
>
> Hope that helps,
> Elijah


^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-14  5:59 12%   ` Josh Triplett
  2023-10-14 17:41 12%     ` Junio C Hamano
@ 2023-10-15  6:44 11%     ` Elijah Newren
  2023-10-15  7:33 12%       ` Sebastian Thiel
  1 sibling, 1 reply; 200+ results
From: Elijah Newren @ 2023-10-15  6:44 UTC (permalink / raw)
  To: Josh Triplett; +Cc: Junio C Hamano, Sebastian Thiel, git

Hi,

On Fri, Oct 13, 2023 at 11:00 PM Josh Triplett <josh@joshtriplett.org> wrote:
>
> On Tue, Oct 10, 2023 at 10:02:20AM -0700, Junio C Hamano wrote:
> > Sebastian Thiel <sebastian.thiel@icloud.com> writes:
> >
> > > I'd like to propose adding a new standard gitattribute "precious".
> >
> > ;-).
> >
> > Over the years, I've seen many times scenarios that would have been
> > helped if we had not just "tracked? ignored? unignored?" but also
> > the fourth kind [*].  The word "ignored" (or "excluded") has always
> > meant "not tracked, not to be tracked, and expendable" to Git, and
> > "ignored but unexpendable" class was missing.  I even used the term
> > "precious" myself in those discussions.  At the concept level, I
> > support the effort 100%, but as always, the devil will be in the
> > details.
>
> "I've already wanted this for years" is, honestly, the best response we
> could *possibly* have hoped for.
>
> > Scenarios that people wished for "precious" traditionally have been
> >
> >  * You are working on 'master'.  You have in your .gitignore or
> >    .git/info/exclude a line to ignore path A, and have random
> >    scribbles in a throw-away file there.  There is another branch
> >    'seen', where they added some tracked contents at path A/B.  You
> >    do "git checkout seen" and your file A that is an expendable file,
> >    because it is listed as ignored in .git/info/exclude, is removed
> >    to make room for creating A/B.
>
> Ouch, I hadn't even thought about the issue of branch-switching
> overwriting a file like that, but that's another great reason to have
> "precious". (I've been thinking about "precious" as primarily to protect
> files like `.config`, where they'd be unlikely to be checked in on any
> branch because they have an established purpose in the project. Though,
> of course, people *do* sometimes check in `.config` files in
> special-purpose branches that aren't meant for upstreaming.)

If we're going to implement precious files, I think we should take a
step back and figure out what parts of the system are affected.  It's
way more than branch switching and `git clean`.  Some notes (including
some useful implementation pointers):

A) You will probably learn a lot and get a leg up on the
implementation by grepping for "preserve_ignored"; lots of the
plumbing has already been created related to this.

B) checkout has a --no-overwrite-ignore, which for checkout
operations, essentially turns all ignored files into precious files.
B1) The code behind --no-overwrite-ignore will probably be helpful in
your implementation of precious files
B2) What happens to this --no-overwrite-ignore option?
Deprecate/remove it after adding precious files, since precious files
now serve that purpose?  Keep the flag anyway?  What happens to the
docs around the flag?
B3) If we keep --no-overwrite-ignore, do we also need to add a
--overwrite-precious option to allow those to be similarly tweaked?

C) merge has a --no-overwrite-ignore option, which for supported merge
operations (which are sadly very few), essentially turns all ignored
files into precious files.
C1) Same comments as A1-A3 but for merges
C2) Sadly, merge's --no-overwrite-ignore is almost garbage.
builtin/merge.c will only pass this option to the "fast-forward" merge
backend, causing any other type of merge to overwrite ignored files
despite any such flag.
C3) most merge backends don't have logic to handle
--no-overwrite-ignore even if they were passed it, and would need
explicit support added.
C4) merge-ort would only essentially need a one-liner; it basically
has the code in place and a comment but the flag was never plumbed
through
C5) it'd be a herculean effort to support this with merge-recursive,
and a sisyphean effort to attempt to maintain.  Deprecating and
removing merge-recursive is probably a better option
C6) merge-resolve and merge-octopus could probably be handled
automatically by ensuring `git read-tree` gained support for it.
C7) there'd be no way to ensure user-written merge algorithms would
support it, but that's kind of a general problem with user-written
anythings

D) git ls-files would need to have a way to query for precious files,
much as it can currently be used to query for ignored files (or
tracked files, or conflicted file, or skip-worktree files, or...).
Backward compatibility questions arise about whether precious files
should appear in `git ls-files -o` output.

E) git status has an --ignored option, with multiple flags for
controlling it.  We'll likely need more flags to be able to pick out
precious files.

F) We'd probably need to look through several other commands and look
at what they need for special handling.  e.g., am, stash, reset.  I
suspect stash will be a particularly sore point, as its unfortunate
design of implementing shell in C code and attempting to decompose the
command in terms of other high-level commands is basically a leaky
abstraction that is very likely to be susceptible to edge and corner
cases here.  (In fact, I think I may have left some of the issues for
untracked/ignored files in stash broken when I was fixing such
problems for other commands.)

G) Documentation.  Commands like `git reset --hard`, `git checkout
-f`, and `read-tree --reset` are documented to nuke untracked files
specifically because we expect most commands to preserve untracked
files.  These would need to mention that "precious" files are also
nuked (or, if we don't nuke them, why precious-and-ignored files are
more precious than untracked files).

H) Design of `reset --hard`.  As per
https://lore.kernel.org/git/xmqqr1e2ejs9.fsf@gitster.g/, `git reset
--hard` is a little funny and we have thought about changing it.  Will
the addition of "precious" objects provide more impetus to do so, and
should a migration story be part of such a new feature?

I) Although git's stated behavior was to nuke ignored files and
protect untracked files, just a couple years ago we found _many_ bugs
where Git didn't do that.  A series was pushed to fix most of those[1]
(incidentally, the same series the introduced the preserve_ignored
flag I pointed you to earlier), but it left a few things
commented/broken.  The cover letter and some emails in the thread also
discussed in more detail some of the ramifications around a "precious"
setting.  It may be worth reading to catch other things to cover and
think about.

J) To implement this feature, you're going to have to touch dir.c.
Good luck with that.  (Seriously, good luck.  The more people that
touch it that aren't me, the less I'll be pinged/queried about that
monstrosity.)


> > In any case, the "precious" paths are expected to be small minority
> > of what people never want to "git add" or "git commit", so coming up
> > with a special syntax to be used in .gitignore, even if that special
> > syntax is ugly and cumbersome to type, would be perfectly OK.
>
> [Following up both to this and to Sebastian's response.]
>
> One potentially important question: should the behavior of old git be to
> treat precious files as ignored, or as not-ignored? If the syntax were
> something like
>
> $.config
>
> then old git would treat the file as not-ignored. If the syntax were
> something like
>
> $precious
> .config
>
> then old git would treat the file as ignored.
>
> Seems like it would be obtrusive if `git status` in old git showed the
> file, and `git add .` in old git added it.

A very good set of questions, along similar lines as the question
about `git ls-files -o` handling.


Anyway, I'm a bit worried after digging up and dumping all these
concerns on you, that it'll sound like I'm trying to bury the feature
and discourage folks.  In the past I have been against this at times,
but mostly because it looked like lots of work, I didn't want to touch
dir.c anymore, and I was worried we'd add a bunch more edge & corner
cases to the code (when we already had plenty with our more limited
number of file types).  In a way, the preserve_ignored stuff kind of
made this a lot more reasonable for us to switch to.  But I do still
think it's a fair amount of work, and I am kind of worried about
potential new edge and corner case.


Hope that helps,
Elijah


^ permalink raw reply	[relevance 11%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-14  5:59 12%   ` Josh Triplett
@ 2023-10-14 17:41 12%     ` Junio C Hamano
  2023-10-15  6:44 11%     ` Elijah Newren
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2023-10-14 17:41 UTC (permalink / raw)
  To: Josh Triplett; +Cc: Sebastian Thiel, git

Josh Triplett <josh@joshtriplett.org> writes:

> On Tue, Oct 10, 2023 at 10:02:20AM -0700, Junio C Hamano wrote:
>> Sebastian Thiel <sebastian.thiel@icloud.com> writes:
>> 
>> > I'd like to propose adding a new standard gitattribute "precious".
>> 
>> ;-).
>> 
>> Over the years, I've seen many times scenarios that would have been
>> helped if we had not just "tracked? ignored? unignored?" but also
>> the fourth kind [*].  The word "ignored" (or "excluded") has always
>> meant "not tracked, not to be tracked, and expendable" to Git, and
>> "ignored but unexpendable" class was missing.  I even used the term
>> "precious" myself in those discussions.  At the concept level, I
>> support the effort 100%, but as always, the devil will be in the
>> details.
>
> "I've already wanted this for years" is, honestly, the best response we
> could *possibly* have hoped for.

Yeah, but that is not what I gave here.

It is something I saw people want from time to time over the years;
I am not at all talking about my desire, or lack thereof, to add it
to the system ;-)

>> In previous discussions, nobody was disturbed that "git clean" was
>> unaware of the "precious" class, but if we were to have the
>> "precious" class in addition to "ignored" aka "expendable", I would
>> not oppose to teach "git clean" about it, too.
>> 
>> There was an early and rough design draft there in
>> 
>> https://lore.kernel.org/git/7vipsnar23.fsf@alter.siamese.dyndns.org/
>> 
>> which probably is worth a read, too.

The project can say something like

    # force older git to ignore
    .config
    # older git unignores "$.config" without touching ".config"
    # but newer git applies the "last one wins" rule as usual
    # to mark ".config" as precious.
    !$.config

if our syntax were to retrofit '!' prefix, and even more simply

    #:(precious)
    .config

if we adopt Phillip's "comment abuse" idea, where older Git will
treat it as saying ".config" is not to be added but is expendable,
while newer Git will treat it as saying ".config" is not to be added
and not to be clobbered.


^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-13 10:06 12%       ` Phillip Wood
@ 2023-10-14 16:10  6%         ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-10-14 16:10 UTC (permalink / raw)
  To: Phillip Wood; +Cc: Sebastian Thiel, git, Josh Triplett, Kristoffer Haugsbakk

Phillip Wood <phillip.wood123@gmail.com> writes:

> One thought I had was that we could abuse the comment syntax to
> annotate paths something like
>
> #(keep)
> /my-precious-file
>
> would prevent /my-precious-file from being deleted by git clean (and
> hopefully unpack-trees()[1]). It means that older versions of git
> would treat the file as ignored. If we ever want more than one
> annotation per path we could separate them with commas
>
> #(keep,something-else)
> /my-file
>
> Strictly speaking it is a backward incompatible change but I doubt
> there are many people using comments like that.

;-)

If "#(" feels a bit too generic, that part can be bikeshed.

I might find some example use cases why we shouldn't later, but
offhand, the idea of (ab)using the comment is a very good idea.


^ permalink raw reply	[relevance 6%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-13 16:39 11%         ` Junio C Hamano
@ 2023-10-14  7:30 10%           ` Sebastian Thiel
  0 siblings, 0 replies; 200+ results
From: Sebastian Thiel @ 2023-10-14  7:30 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Josh Triplett, Kristoffer Haugsbakk

On 13 Oct 2023, at 18:39, Junio C Hamano wrote:

> Come to think of it, we might be able to retrofit '!' without too
> much damage.  Something like "!unignored" is now a deprecated but
> still supported way to say "!!unignored", "!*precious" is new, and
> "\!anything" is a pathname that begins with '!'.

I don't know anything about statistics, and I don't which of the proposed
syntax thus far has the lowest probability of accidental breakage, possibly
in combination with the best possible usability.

However, I do like even more the idea to retro-fit `!` instead of having an
entirely new prefix, it seems more intuitive to me.

An apparent disadvantage would be that using `!` prefix with
backwards-compatibility will make any additional future modifier more
breaking. For instance `!*` is potentially ignoring an additional file
in old git, and another `!-` modifier is having the same effect.

Chances for this are probably low though, but if in doubt it would be possible
to check certain patterns against all files of the top-3.5TB of
GitHub repositories.

Using `!*` to signal precious files also seems like a less likely
path prefix than `!$` would be, but then again, it's just a guess
which most definitely doesn't have much bearing.

I personally also like this more than using special comments as 'modifier',
even though doing so would probably have the lowest probability for
accidentally ignoring files in old git.

Maybe it's time to choose one of the options with the possibility to validate
it for accidental exclusion of files against the top 3.5TB of
GitHub repositories to be more sure it?



^ permalink raw reply	[relevance 10%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 17:02 12% ` Junio C Hamano
  2023-10-11 10:06 12%   ` Richard Kerry
  2023-10-12 10:55 11%   ` Sebastian Thiel
@ 2023-10-14  5:59 12%   ` Josh Triplett
  2023-10-14 17:41 12%     ` Junio C Hamano
  2023-10-15  6:44 11%     ` Elijah Newren
  2 siblings, 2 replies; 200+ results
From: Josh Triplett @ 2023-10-14  5:59 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Sebastian Thiel, git

On Tue, Oct 10, 2023 at 10:02:20AM -0700, Junio C Hamano wrote:
> Sebastian Thiel <sebastian.thiel@icloud.com> writes:
> 
> > I'd like to propose adding a new standard gitattribute "precious".
> 
> ;-).
> 
> Over the years, I've seen many times scenarios that would have been
> helped if we had not just "tracked? ignored? unignored?" but also
> the fourth kind [*].  The word "ignored" (or "excluded") has always
> meant "not tracked, not to be tracked, and expendable" to Git, and
> "ignored but unexpendable" class was missing.  I even used the term
> "precious" myself in those discussions.  At the concept level, I
> support the effort 100%, but as always, the devil will be in the
> details.

"I've already wanted this for years" is, honestly, the best response we
could *possibly* have hoped for.

> Scenarios that people wished for "precious" traditionally have been
> 
>  * You are working on 'master'.  You have in your .gitignore or
>    .git/info/exclude a line to ignore path A, and have random
>    scribbles in a throw-away file there.  There is another branch
>    'seen', where they added some tracked contents at path A/B.  You
>    do "git checkout seen" and your file A that is an expendable file,
>    because it is listed as ignored in .git/info/exclude, is removed
>    to make room for creating A/B.

Ouch, I hadn't even thought about the issue of branch-switching
overwriting a file like that, but that's another great reason to have
"precious". (I've been thinking about "precious" as primarily to protect
files like `.config`, where they'd be unlikely to be checked in on any
branch because they have an established purpose in the project. Though,
of course, people *do* sometimes check in `.config` files in
special-purpose branches that aren't meant for upstreaming.)

>  * Similar situation, but this time, 'seen' branch added a tracked
>    contents at path A.  Again, "git checkout seen" will discard the
>    expendable file A and replace it with tracked contents.
> 
>  * Instead of "git checkout", you decide to merge the branch 'seen'
>    to the checkout of 'master', where you have an ignored path A.
>    Because merging 'seen' would need to bring the tracked contents
>    of either A/B (in the first scenario above) or A (in the second
>    scenario), your "expendable" A will be removed to make room.

+1

> In previous discussions, nobody was disturbed that "git clean" was
> unaware of the "precious" class, but if we were to have the
> "precious" class in addition to "ignored" aka "expendable", I would
> not oppose to teach "git clean" about it, too.
> 
> There was an early and rough design draft there in
> 
> https://lore.kernel.org/git/7vipsnar23.fsf@alter.siamese.dyndns.org/
> 
> which probably is worth a read, too.
> 
> Even though I referred to the precious _attribute_ in some of these
> discussions, between the attribute mechanism and the ignore
> mechanism, I am actually leaning toward suggesting to extend the
> exclude/ignore mechanism to introduce the "precious" class.  That
> way, we can avoid possible snafu arising from marking a path in
> .gitignore as ignored, and in .gitattrbutes as precious, and have to
> figure out how these two settings are to work together.

Sounds reasonable.

> In any case, the "precious" paths are expected to be small minority
> of what people never want to "git add" or "git commit", so coming up
> with a special syntax to be used in .gitignore, even if that special
> syntax is ugly and cumbersome to type, would be perfectly OK.

[Following up both to this and to Sebastian's response.]

One potentially important question: should the behavior of old git be to
treat precious files as ignored, or as not-ignored? If the syntax were
something like

$.config

then old git would treat the file as not-ignored. If the syntax were
something like

$precious
.config

then old git would treat the file as ignored.

Seems like it would be obtrusive if `git status` in old git showed the
file, and `git add .` in old git added it.


^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-13  9:09 12%       ` Sebastian Thiel
@ 2023-10-13 16:39 11%         ` Junio C Hamano
  2023-10-14  7:30 10%           ` Sebastian Thiel
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-10-13 16:39 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: git, Josh Triplett, Kristoffer Haugsbakk

Sebastian Thiel <sebastian.thiel@icloud.com> writes:

> But if there is now a prefix, I feel that it might as well be chosen so that it
> is easier to remember and/or less likely to cause conflicts.

Another criteria is that it is not very often used in real
pathnames, of course, and '!' and '$' are good ones.

Come to think of it, we might be able to retrofit '!' without too
much damage.  Something like "!unignored" is now a deprecated but
still supported way to say "!!unignored", "!*precious" is new, and
"\!anything" is a pathname that begins with '!'.

> Yes, I think my paragraph above is exactly that but with examples to practice
> the new syntax-proposal.

OK.


^ permalink raw reply	[relevance 11%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-12 16:58 12%     ` Junio C Hamano
  2023-10-13  9:09 12%       ` Sebastian Thiel
  2023-10-13 10:06 12%       ` Phillip Wood
@ 2023-10-13 11:25 11%       ` Oswald Buddenhagen
  2 siblings, 0 replies; 200+ results
From: Oswald Buddenhagen @ 2023-10-13 11:25 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Sebastian Thiel, git, Josh Triplett, Kristoffer Haugsbakk

On Thu, Oct 12, 2023 at 09:58:19AM -0700, Junio C Hamano wrote:
>I do not think it will be the end of the world if we don't do so,
>but it would be really really nice if we at least explored a way (or
>two) to make a big enough hole in the syntax to not just add
>"precious", but leave room to later add other traits, without having
>to worry about breaking the backward compatibility again.
>
that would invariably make the syntax more verbose, for dubious gain.

that the extension we're deliberating now (again) was coming (in some 
form) was clear for quite a while, while i'm not aware of anything else 
that would semantically fit gitignore (*). "other traits" sounds awfully 
like scope creep, and would most likely fit gitattributes better.

anyway, such a hypothetical "breaking" change wouldn't have much impact, 
because versioned files aren't affected by gitignore. and for the 
misclassification to be actually harmful, the user would have to be 
unable to notice or correct it.

(*) this got me thinking about things that would fit, and i came up with 
a modification of the proposal: one might want to specify just *how* 
precious a file is (which i guess would translate to how many times the 
extra override option would have to be passed to git-clean). (**)

i guess a suitable syntax for that would be

   2>.config

note that even though using the dollar sign to denote "precious" is kind 
of intuitive, i'm not using it for two reasons: a) it's not "crazy" 
enough to use it at not quite the beginning of a file name (note that 
traditionally it isn't even special on windows), and b) the visual 
separation of the prefix isn't as good as with the "arrow-like" 
character.

(**) actually, one would probably want proper type tagging (e.g., config 
files vs. autotools-generated files (which do not belong into a repo, 
but do into a tar-ball)). that really does sound a lot like 
gitattributes, only that the files aren't versioned.

regards


^ permalink raw reply	[relevance 11%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-12 16:58 12%     ` Junio C Hamano
  2023-10-13  9:09 12%       ` Sebastian Thiel
@ 2023-10-13 10:06 12%       ` Phillip Wood
  2023-10-14 16:10  6%         ` Junio C Hamano
  2023-10-13 11:25 11%       ` Oswald Buddenhagen
  2 siblings, 1 reply; 200+ results
From: Phillip Wood @ 2023-10-13 10:06 UTC (permalink / raw)
  To: Junio C Hamano, Sebastian Thiel; +Cc: git, Josh Triplett, Kristoffer Haugsbakk

On 12/10/2023 17:58, Junio C Hamano wrote:
> Sebastian Thiel <sebastian.thiel@icloud.com> writes:

Sebastian - thanks for raising this again, it would be really good to 
get a solution for handling "ignored but not expendable" files

> I have been regretting that I did not make the quoting syntax not
> obviously extensible in f87f9497 (git-ls-files: --exclude mechanism
> updates., 2005-07-24), which technically was a breaking change (as a
> relative pathname that began with '!' were not special, but after
> the change, it became necessary to '\'-quote it).  A relative
> pathname that begins with '$' would be now broken the same way, but
> hopefully the fallout would be minor.  I presume you picked '$'
> exactly because of this reason?
> 
> I do not think it will be the end of the world if we don't do so,
> but it would be really really nice if we at least explored a way (or
> two) to make a big enough hole in the syntax to not just add
> "precious", but leave room to later add other traits, without having
> to worry about breaking the backward compatibility again.  A
> simplest and suboptimal way may be to declare that a path that
> begins with '$' now needs '\'-quoting (just like your proposal),
> reserve '$$' as the precious prefix, and '$' followed by any other
> byte reserved for future use, but there may be better ideas.

One thought I had was that we could abuse the comment syntax to annotate 
paths something like

#(keep)
/my-precious-file

would prevent /my-precious-file from being deleted by git clean (and 
hopefully unpack-trees()[1]). It means that older versions of git would 
treat the file as ignored. If we ever want more than one annotation per 
path we could separate them with commas

#(keep,something-else)
/my-file

Strictly speaking it is a backward incompatible change but I doubt there 
are many people using comments like that. I also wondered about some 
kind of suffix on the file

/my-precious-file #(keep)

but that means that older versions of git would not ignore the file.

Best Wishes

Phillip

[1] Of the cases listed in [2] it is "git checkout" and friends 
overwriting ignored files that I worry about more. At least "git clean" 
defaults to a dry-run and has in interactive mode to select what gets 
deleted.

[2] https://lore.kernel.org/git/xmqqttqytnqb.fsf@gitster.g



^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-12 16:58 12%     ` Junio C Hamano
@ 2023-10-13  9:09 12%       ` Sebastian Thiel
  2023-10-13 16:39 11%         ` Junio C Hamano
  2023-10-13 10:06 12%       ` Phillip Wood
  2023-10-13 11:25 11%       ` Oswald Buddenhagen
  2 siblings, 1 reply; 200+ results
From: Sebastian Thiel @ 2023-10-13  9:09 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Josh Triplett, Kristoffer Haugsbakk

On 12 Oct 2023, at 18:58, Junio C Hamano wrote:

> I presume you picked '$' > exactly because of this reason?

Yes, and because I thought '$' seems a great fit to represent value.

> I do not think it will be the end of the world if we don't do so,
> but it would be really really nice if we at least explored a way (or
> two) to make a big enough hole in the syntax to not just add
> "precious", but leave room to later add other traits, without having
> to worry about breaking the backward compatibility again.  A
> simplest and suboptimal way may be to declare that a path that
> begins with '$' now needs '\'-quoting (just like your proposal),
> reserve '$$' as the precious prefix, and '$' followed by any other
> byte reserved for future use, but there may be better ideas.

Even though I'd love to go with the unextensible option assuming it would last
another 15 years, I can see the appeal of making it extensible from the start.

In a world where '$' is a prefix, I'd also think that it's now possible to
specify exclusion using '$!path' for completeness, if '$$path' marks 'path'
precious.

But if there is now a prefix, I feel that it might as well be chosen so that it
is easier to remember and/or less likely to cause conflicts. I think it must
have been that reason for pathspecs to choose ':' as their prefix, and it seems
to be an equally good choice here.

This would give us the following, taking the Linux kernel as example:

    .*
    !this-file-is-hidden-and-tracked
    :!new-syntax-for-negation-for-completeness
    \!an-ignored-file-with-leading-!
    \:an-ignored-file-with-leading-:-which-is-technically-breaking
    :$.config
    :x-invalid-as-:-needs-either-!-or-$-to-follow-it

Now ':$path' would make any path precious, which is `:$.config` in the example
above.

How does that 'feel'? Is the similarity to pathspecs without being pathspecs
an anti-feature maybe?

>> Thus, to make this work, projects that ship the `.gitignore` files would *have
>> to add patterns* that make certain files precious.
>
> Not really.  They do not have to do anything if they are content
> with the current Git ecosystem.  And users who have precious stuff
> can mark them in the.git/info/excludes no?

Yes, but only if they control all the ignore patterns in their global files. If
the repository decides to exclude a file they deem precious, now it won't be
precious anymore as their ':$make-this-precious' pattern is seen sequentially
after the pattern in the repository.

For instance, tooling-specific ignores are typically fully controlled by the
user, like '/.idea/', which could now easily be made precious with ':$/idea/'.

But as the Linux kernel repository ships with a '.gitignore' file that includes
the '.*' pattern, users won't be able to 'get ahead' of that pattern with their
':$.config' specification.

> The only case that is
> problematic is when the project says 'foo' is ignored and expendable
> but the user thinks otherwise.  So to make this work, projects that
> ship the ".gitignore" files have to avoid adding patterns to ignore
> things that it may reasonably be expected for its users to mark
> precious.

Yes, I think my paragraph above is exactly that but with examples to practice
the new syntax-proposal.

>
>> Such opted-in projects would produce `.gitignore` files like these:
>>
>>     .*
>>     $.config
>
> I would understand if you ignored "*~" or "*.o", but why ignore ".*"?

I don't have an answer, the example is from the Linux Kernel repository was
added in 1e65174a33784 [1].

I am definitely getting excited about the progress the syntax is making :),
thanks for proposing it!

[ Reference ]

1. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1e65174a33784



^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-12 10:55 11%   ` Sebastian Thiel
@ 2023-10-12 16:58 12%     ` Junio C Hamano
  2023-10-13  9:09 12%       ` Sebastian Thiel
                         ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Junio C Hamano @ 2023-10-12 16:58 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: git, Josh Triplett, Kristoffer Haugsbakk

Sebastian Thiel <sebastian.thiel@icloud.com> writes:

> ### What about a `$` syntax in `.gitignore` files?
>
> I looked into adding a new prefix, `$` to indicate the following path is
> precious or… valuable. It can be escaped with `\$` just like `\!`. 

I have been regretting that I did not make the quoting syntax not
obviously extensible in f87f9497 (git-ls-files: --exclude mechanism
updates., 2005-07-24), which technically was a breaking change (as a
relative pathname that began with '!' were not special, but after
the change, it became necessary to '\'-quote it).  A relative
pathname that begins with '$' would be now broken the same way, but
hopefully the fallout would be minor.  I presume you picked '$'
exactly because of this reason?

I do not think it will be the end of the world if we don't do so,
but it would be really really nice if we at least explored a way (or
two) to make a big enough hole in the syntax to not just add
"precious", but leave room to later add other traits, without having
to worry about breaking the backward compatibility again.  A
simplest and suboptimal way may be to declare that a path that
begins with '$' now needs '\'-quoting (just like your proposal),
reserve '$$' as the precious prefix, and '$' followed by any other
byte reserved for future use, but there may be better ideas.

> *Unfortunately*, users can't just add a local `.git/info/exclude` file with
> `$.config` in it and expect `.config` to be considered precious as the pattern
> search order will search this last as it's part of the exclude-globals.

That it nothing new and is the same for ignored files.  The lower
precedence files do not override higher precedence files.

> Thus, to make this work, projects that ship the `.gitignore` files would *have
> to add patterns* that make certain files precious.

Not really.  They do not have to do anything if they are content
with the current Git ecosystem.  And users who have precious stuff
can mark them in the.git/info/excludes no?  The only case that is
problematic is when the project says 'foo' is ignored and expendable
but the user thinks otherwise.  So to make this work, projects that
ship the ".gitignore" files have to avoid adding patterns to ignore
things that it may reasonably be expected for its users to mark
precious.

> Such opted-in projects would produce `.gitignore` files like these:
>
>     .*
>     $.config

I would understand if you ignored "*~" or "*.o", but why ignore ".*"?

THanks.

^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 17:02 12% ` Junio C Hamano
  2023-10-11 10:06 12%   ` Richard Kerry
@ 2023-10-12 10:55 11%   ` Sebastian Thiel
  2023-10-12 16:58 12%     ` Junio C Hamano
  2023-10-14  5:59 12%   ` Josh Triplett
  2 siblings, 1 reply; 200+ results
From: Sebastian Thiel @ 2023-10-12 10:55 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Josh Triplett, Kristoffer Haugsbakk

I liked the idea too see precious files as sub-class of ignored files, and
investigated possibilities on how to achieve that while keeping the overall
effort low and remove any potential for backwards-incompatibility as well.

Currently, `.gitignore` files only contain one pattern per line, which
optionally may be prefixed with `!` to negate it. This can be escaped with `\!`
- and that's it.

Parsing patterns that way makes for simple parsing without a need for
quoting.

### What about a `$` syntax in `.gitignore` files?

I looked into adding a new prefix, `$` to indicate the following path is
precious or… valuable. It can be escaped with `\$` just like `\!`. 

Doing so has the advantage that older `git` versions simply take the
declaration as literal and would now exclude `$.config`, for example, whereas
newer `git` versions will consider them precious.

There is some potential for accidentally excluding files that previously
were untracked with older versions of git, but I'd think chances are low.

#### Example: Linux kernel

`.config` is ignored via `.gitignore: 

    .*

*Unfortunately*, users can't just add a local `.git/info/exclude` file with
`$.config` in it and expect `.config` to be considered precious as the pattern
search order will search this last as it's part of the exclude-globals. The
same is true for per-user git-ignore files. This means that any git would
have the `.*` pattern match before the `$.config` pattern, and stop right there
concluding that it's expendable, instead of precious. This is how users can
expect `.gitignore` files to work, and this is how `!negations` work as well -
the negation has to come after the actual exclusion to be effective.

Thus, to make this work, projects that ship the `.gitignore` files would *have
to add patterns* that make certain files precious.

Alternatively, users have to specify gitignore-overrides on the command-line,
but not all commands (if any except for `git check-ignore`) support that.

In the case of `git clean` one can already pass `--exclude=pattern`, but if
that's needed one doesn't need syntax for precious files in the first place.

**This makes the $precious syntax useful only for projects who chose to opt in,
but makes overrides for users near impossible**.

Such opted-in projects would produce `.gitignore` files like these:

    .*
    $.config

Note that due to the way ignore patterns are searched, the following would
consider `.config` trackable, not precious:

    .*
    $.config
    !.config

It's up the maintainer of the repository to configure their .gitignore files
correctly, so nothing new either.

#### Benefits

* simple implementation, fast
* backwards compatible

#### Disadvantages

* cannot easily be overridden by the user as part of their local settings.
* needs repository-buy-in to be useful
* $file could clash with the file '$file' and cause older git  to ignore it

### What about a `precious` attribute?

The search of `.gitattributes` works differently which makes it possible for
users to set attributes on any file or folder easily using their local files.
Using attributes has the added benefit of being extensible as one can start out
with:

```gitattributes
.config precious
```

and optionally continue with…

```gitattributes
.config precious=input
kernel precious=output
```

…to further classify kinds of precious files, probably for their personal use.
Please note that currently pathspecs can't be used to filter by attribute
for files that are igonred and untracked or I couldn't figure out how.
That even makes sense as it wasn't considered a use-case yet.


#### Benefits

* backwards compatible
* easily extendable with 'tags' or sub-classes of precious files using the
  assignment syntax.
* overridable with user's local files

#### Disadvantages

* any 'exclude' query now also needs a .gitattribute query to support precious
  files (and it's not easy to optimize unless there is a flag to turn precious
  file support on or off)
* `precious` might be in use by some repos which now gains a possibly different
  meaning in `git` as well.

### Conclusion

Weighing advantages and disadvantages of both approaches makes me prefer the
`.gitignore` extension. The `.gitattributes` version of it *could* also be
implemented on top of it at a later date. However, it should be gated behind a
configuration flag so users who need it as they want local overrides
can opt-in. Then they also pay for the feature which for most repositories 
won't be an issue in the first place.

All this seems a bit too good to be true, and I hope you can show where
it wouldn't work or which dangers or possible issues haven't been
mentioned yet.


^ permalink raw reply	[relevance 11%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 19:10 13%     ` Kristoffer Haugsbakk
@ 2023-10-12  9:04 13%       ` Josh Triplett
  0 siblings, 0 replies; 200+ results
From: Josh Triplett @ 2023-10-12  9:04 UTC (permalink / raw)
  To: Kristoffer Haugsbakk; +Cc: Sebastian Thiel, git

On Tue, Oct 10, 2023 at 09:10:34PM +0200, Kristoffer Haugsbakk wrote:
>  Hi Josh
> 
> On Tue, Oct 10, 2023, at 16:10, Josh Triplett wrote:
> > > [snip]
> >
> > While I'd love for it to default to that and require an extra option to
> > clean away precious files, I'd expect that that would break people's
> > workflows and finger memory. If someone expects `git clean -x -d -f` to
> > clean away everything, including `.config`, and then it leaves some
> > files in place, that seems likely to cause problems. (Leaving aside that
> > it might break scripted workflows.)
> >
> > It seems safer to keep the existing behavior for existing options, and
> > add a new option for "remove everything except precious files".
> 
> What's a scenario where it breaks? I'm guessing:
> 
> 1. Someone clones a project
> 2. That project has precious files marked via `.gitattributes`
> 3. They later do a `clean`
> 4. The precious files are left alone even though they expected them to be
>    deleted; they don't check what `clean` did (it deletes everything
>    untracked (they expect) so nothing to check)
> 5. This hurts them somehow

The scenario I had in mind was:

- Project has ignored files; git doesn't have a concept of "precious"
- Users expect that `git clean -x -d -f` deletes everything that isn't
  part of the latest commit.
- Git introduces the concept of "precious"
- Project adopts "precious" and marks some of its ignored files as
  "precious" instead
- Users' finger-macros around `git clean` stop cleaning up files they
  expected to be cleaned.

That said, given Junio's response I'm no longer concerned about this
scenario.

^ permalink raw reply	[relevance 13%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 17:07 13%     ` Junio C Hamano
@ 2023-10-12  8:47 13%       ` Josh Triplett
  0 siblings, 0 replies; 200+ results
From: Josh Triplett @ 2023-10-12  8:47 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Kristoffer Haugsbakk, Sebastian Thiel, git

On Tue, Oct 10, 2023 at 10:07:08AM -0700, Junio C Hamano wrote:
> Josh Triplett <josh@joshtriplett.org> writes:
> 
> > While I'd love for it to default to that and require an extra option to
> > clean away precious files, I'd expect that that would break people's
> > workflows and finger memory. If someone expects `git clean -x -d -f` to
> > clean away everything, including `.config`, and then it leaves some
> > files in place, that seems likely to cause problems. (Leaving aside that
> > it might break scripted workflows.)
> 
> I thought the point of introducing the new "precious" class of
> paths, in addition to the current "tracked", "ignored, untracked,
> and expendable", "not ignored and untracked", is so that people can
> do "git clean -x -d -f" and expect the ".config" that is marked as
> "precious" to stay.  Before their Git learned the precious class, if
> they marked ".config" as "ignored, untracked, and expendable", then
> such an invocation of "clean" would have removed it, but if they add
> it to the new "precious" class, their expectation ought to be that
> precious ones are not removed, no?  Otherwise I am not quite sure
> what the point of adding such a new protection is.

I'd expect a lot of projects to move things *from* the current "ignored"
state to "precious", once "precious" exists. Linux `.config`, for
instance.

That said, I do agree that the ideal behavior is for clean to preserve
precious files by default, and require an extra option to remove
precious files. If you think that doesn't have backwards-compatibility
considerations, then it certainly seems much easier to jump directly to
that behavior.

- Josh Triplett

^ permalink raw reply	[relevance 13%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-11 10:06 12%   ` Richard Kerry
  2023-10-11 22:40 12%     ` Jeff King
@ 2023-10-11 23:35 13%     ` Junio C Hamano
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2023-10-11 23:35 UTC (permalink / raw)
  To: Richard Kerry; +Cc: git@vger.kernel.org

Richard Kerry <richard.kerry@eviden.com> writes:

> An option might be to state, in config, whether a project, or
> everything, should be managed on the basis of "all untracked files
> are precious" or "files may be explicitly marked precious", or, as
> now, "nothing is precious".

I do not think there is any need to have a separate "all or none"
option.  We do not have to make things more complicated than
necessary.

If all untracked files are precious, a user should be able to say so
with an entry that matches all paths "*" to mark them precious, and
nothing more needs to be done.  By default nothing is ignored and
nothing is precious, until you start marking paths with .gitignore
entries.

^ permalink raw reply	[relevance 13%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-11 10:06 12%   ` Richard Kerry
@ 2023-10-11 22:40 12%     ` Jeff King
  2023-10-11 23:35 13%     ` Junio C Hamano
  1 sibling, 0 replies; 200+ results
From: Jeff King @ 2023-10-11 22:40 UTC (permalink / raw)
  To: Richard Kerry; +Cc: git@vger.kernel.org

On Wed, Oct 11, 2023 at 10:06:25AM +0000, Richard Kerry wrote:

> The version of CVS that I used to use, CVSNT, was a lot more careful
> about the user's files than Git is inclined to be.
> If CVSNT, while doing an Update, came across a non-tracked file that
> was in the way of something that it wanted to write, then the Update
> would be aborted showing a list of any files that were "in the way".
> The user could then rename/delete them or redo the Update with a
> "force" parameter to indicate that such items could be overwritten.
> Git has tended to take an approach of "if it's important it'll be
> tracked by Git - anything else can be trashed with impunity.".  Over
> the years people have been caught out by this and lost work.  It may
> well be that in a Linux development world anything other than tracked
> source files can be summarily deleted, but in a wider world, like
> Windows, or environments that are not software development, or that
> need special files lying around, this is not always an entirely
> reasonable approach.

I'm not sure if you are just skipping the details of ".gitignore" here,
but to be clear, blowing away untracked files is _not_ Git's default
behavior.

For example:

  [sample repo with established history]
  $ git init
  $ echo content >base
  $ git add base
  $ git commit -m base

  [one branch touches some-file]
  $ git checkout -b side-branch
  $ echo whatever >some-file
  $ git add some-file
  $ git commit -m 'add some-file'

  [but back on master/main, it is untracked]
  $ git checkout main
  $ echo precious >some-file

  [an operation that tries to overwrite the untracked file will fail]
  $ git checkout side-branch
  $ git checkout side-branch
  error: The following untracked working tree files would be overwritten by checkout:
	some-file
  Please move or remove them before you switch branches.
  Aborting

  [providing --force will obliterate it]
  $ git checkout --force side-branch
  Switched to branch 'side-branch'

The issue that people sometimes find with Git is when the user has
explicitly listed a file in ".gitignore", Git takes that to mean it
should never be tracked _and_ it is not precious. But people sometimes
want a way to say "this should never be tracked, but keep treating it as
precious in the usual way".

From the description above it might sound like Git's current behavior is
conflating two orthogonal things, but if you switched the default
behavior of .gitignore'd files to treat them as precious, you will find
lots of cases that are annoying. E.g., if a file is generated by some
parts of history and tracked in others, you'd have to use --force to
move between them to overwrite the generated version.

-Peff

^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 12:37 20% [RFC] Define "precious" attribute and support it in `git clean` Sebastian Thiel
  2023-10-10 13:38 12% ` Kristoffer Haugsbakk
  2023-10-10 17:02 12% ` Junio C Hamano
@ 2023-10-11 21:41 10% ` Kristoffer Haugsbakk
  2 siblings, 0 replies; 200+ results
From: Kristoffer Haugsbakk @ 2023-10-11 21:41 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: Josh Triplett, git

On Tue, Oct 10, 2023, at 14:37, Sebastian Thiel wrote:
> [Note: I'm collaborating with Josh Triplett (CCed) on the design.]
>
> I'd like to propose adding a new standard gitattribute "precious".  I've
> included proposed documentation at the end of this mail, and I'm happy to write
> the code.  I wanted to get feedback on the concept first.
>
> What's a 'precious' file?
>
> "Precious" files are files that are specific to a user or local configuration
> and thus not tracked by Git.  As such, a user spent time to create or generate
> them, and to tune them to fit their needs.  They are typically also ignored by
> `git` due to `.gitignore` configuration, preventing them to be tracked by
> accident.

How do people deal with these precious files today?

You could track these precious files somewhere else. Maybe a Git directory
which is a sibling of `.git`.

    .git-local

Files that are useless to the project but important to the individual.

It would get its own “excludes” file.

    .gitignore-local

Now the normal repository (`.git`) needs to ignore these things.

    # Cast a wide net: could want other siblings
    # Use another pattern if you have something like `.git-blame-ignore-revs`
    printf '.git-*\n'       >> .git/info/exclude
    printf '.gitignore-*\n' >> .git/info/exclude

You need to pass in two arguments to `git` every time you want to use
`.git-local`.

    alias gitl='git --git-dir=.git-local -c core.excludesFile=.gitignore-local'

Git Local should ignore everything by default. You should check with
`.gitignore` to make sure that it ignores the files that Git Local does
_not_ ignore.

    printf '*\n'                 >> .gitignore-local
    printf '!.gitignore-local\n' >> .gitignore-local
    printf '!.idea/**\n'         >> .gitignore-local

Now you can backup your local files.

    gitl add .gitignore-local
    gitl add .idea
    gitl commit -m'Update local'

But you can also version control them by providing real (intentional)
messages.

(Maybe `.idea/` is just an XML soup and thus hard to make a VCS narrative
around; I don't know yet.)

`git clean` won't help you. But an alias can.

Or if writing a shell-oneliner alias is too hard for you, I mean me.

    #!/bin/sh
    # git-klean
    git --git-dir=.git-local -c core.excludesFile=.gitignore-local add --all
    git --git-dir=.git-local -c core.excludesFile=.gitignore-local commit -mUpdate
    git clean -e .gitignore-local -e .git-local "$@"

The two `-e` switches protect the Git Local things from being wiped by
`-xd` (tested with `--dry-run`).

§ Sibling repositories

At first I thought that `git clean` could use a `pre-clean` hook. But
that's not very satisfying.

Maybe Git could be told about its siblings via a multi-valued
configuration variable.

    sibling=local

Then it expects there to exist `.git-<sibling name>` repository next to
it (`.git/../.git-<sibling name>`).

Then the rule becomes:

Only do destructive operations if all of the working trees[1] of the
sibling repositories are clean (cannot override with `--force`).

Additionally one could say that directories that are Git repositories
should be ignored by `git clean`, always.[2] Or siblings which
match the glob:

    .git-*

... Or if you want something longer:

    .git-sibling-*

(And also ignore `.gitignore-*` and maybe more things)

Then the regular Git repository might still blow away your precious
files. But they will be backed up by the siblings.

Or you put these other Git repositories outside of `.git/..`. Sidestepping
the issue at the cost of some path confusion (for yourself). Maybe at:

    /home/user/git-siblings/repository1/local

† 1: Worktrees not considered.
† 2: And what would that break? People who make Git repositories in their
   working trees and then delete them? (Well they can still use `rm -r`.)

⧫ ⧫

§ Worktrees

But seriously: worktrees probably makes this not work.

-- 
Kristoffer

^ permalink raw reply	[relevance 10%]

* RE: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 17:02 12% ` Junio C Hamano
@ 2023-10-11 10:06 12%   ` Richard Kerry
  2023-10-11 22:40 12%     ` Jeff King
  2023-10-11 23:35 13%     ` Junio C Hamano
  2023-10-12 10:55 11%   ` Sebastian Thiel
  2023-10-14  5:59 12%   ` Josh Triplett
  2 siblings, 2 replies; 200+ results
From: Richard Kerry @ 2023-10-11 10:06 UTC (permalink / raw)
  To: git@vger.kernel.org


> > I'd like to propose adding a new standard gitattribute "precious".
> 
> ;-).

The version of CVS that I used to use, CVSNT, was a lot more careful about the user's files than Git is inclined to be.
If CVSNT, while doing an Update, came across a non-tracked file that was in the way of something that it wanted to write, then the Update would be aborted showing a list of any files that were "in the way".  The user could then rename/delete them or redo the Update with a "force" parameter to indicate that such items could be overwritten.
Git has tended to take an approach of "if it's important it'll be tracked by Git - anything else can be trashed with impunity.".  Over the years people have been caught out by this and lost work.  It may well be that in a Linux development world anything other than tracked source files can be summarily deleted, but in a wider world, like Windows, or environments that are not software development, or that need special files lying around, this is not always an entirely reasonable approach.

> Over the years, I've seen many times scenarios that would have been helped
> if we had not just "tracked? ignored? unignored?" but also the fourth kind
> [*].  The word "ignored" (or "excluded") has always meant "not tracked, not
> to be tracked, and expendable" to Git, and "ignored but unexpendable" class
> was missing.  I even used the term "precious" myself in those discussions.  At
> the concept level, I support the effort 100%, but as always, the devil will be in
> the details.
> 
> Scenarios that people wished for "precious" traditionally have been
> 
>  * You are working on 'master'.  You have in your .gitignore or
>    .git/info/exclude a line to ignore path A, and have random
>    scribbles in a throw-away file there.  There is another branch
>    'seen', where they added some tracked contents at path A/B.  You
>    do "git checkout seen" and your file A that is an expendable file,
>    because it is listed as ignored in .git/info/exclude, is removed
>    to make room for creating A/B.

So checkout aborts, saying "A is in the way".

>  * Similar situation, but this time, 'seen' branch added a tracked
>    contents at path A.  Again, "git checkout seen" will discard the
>    expendable file A and replace it with tracked contents.

So checkout aborts, saying "A is in the way".

>  * Instead of "git checkout", you decide to merge the branch 'seen'
>    to the checkout of 'master', where you have an ignored path A.
>    Because merging 'seen' would need to bring the tracked contents
>    of either A/B (in the first scenario above) or A (in the second
>    scenario), your "expendable" A will be removed to make room.

So merge aborts, saying "A is in the way".  It is entirely conventional to have merge conflicts that the user needs to resolve.  This is just another kind of conflict.

> In previous discussions, nobody was disturbed that "git clean" was unaware
> of the "precious" class, but if we were to have the "precious" class in addition
> to "ignored" aka "expendable", I would not oppose to teach "git clean" about
> it, too.

Indeed, if something is explicitly precious then nothing should summarily delete it.

I know this goes against some stated design decisions of early Git, but in the CVSNT world *all* files were considered precious and would always cause an update to be aborted if there were any inclination to replace them.

An option might be to state, in config, whether a project, or everything, should be managed on the basis of "all untracked files are precious" or "files may be explicitly marked precious", or, as now, "nothing is precious".

Regards,
Richard.

PS.  I think I've caught all places where my fingers typed "previous" when my brain meant "precious" - apologies if I've missed any.



^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 14:10 12%   ` Josh Triplett
  2023-10-10 17:07 13%     ` Junio C Hamano
@ 2023-10-10 19:10 13%     ` Kristoffer Haugsbakk
  2023-10-12  9:04 13%       ` Josh Triplett
  1 sibling, 1 reply; 200+ results
From: Kristoffer Haugsbakk @ 2023-10-10 19:10 UTC (permalink / raw)
  To: Josh Triplett; +Cc: Sebastian Thiel, git

 Hi Josh

On Tue, Oct 10, 2023, at 16:10, Josh Triplett wrote:
> > [snip]
>
> While I'd love for it to default to that and require an extra option to
> clean away precious files, I'd expect that that would break people's
> workflows and finger memory. If someone expects `git clean -x -d -f` to
> clean away everything, including `.config`, and then it leaves some
> files in place, that seems likely to cause problems. (Leaving aside that
> it might break scripted workflows.)
>
> It seems safer to keep the existing behavior for existing options, and
> add a new option for "remove everything except precious files".

What's a scenario where it breaks? I'm guessing:

1. Someone clones a project
2. That project has precious files marked via `.gitattributes`
3. They later do a `clean`
4. The precious files are left alone even though they expected them to be
   deleted; they don't check what `clean` did (it deletes everything
   untracked (they expect) so nothing to check)
5. This hurts them somehow

It seems that the only files that should be deleted with expediency are
secrets. But then why or how would:

1. The project mark such files as precious
2. The user introduces these files (they are precious hence they were not
   part of the clone)
3. They are never deleted

This sounds unlikely to me. And if it was some kind of malignant vector
then all would be vulnerable to it (not just legacy scripts/legacy hands).

What am I missing?

-- 
Kristoffer

^ permalink raw reply	[relevance 13%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 14:10 12%   ` Josh Triplett
@ 2023-10-10 17:07 13%     ` Junio C Hamano
  2023-10-12  8:47 13%       ` Josh Triplett
  2023-10-10 19:10 13%     ` Kristoffer Haugsbakk
  1 sibling, 1 reply; 200+ results
From: Junio C Hamano @ 2023-10-10 17:07 UTC (permalink / raw)
  To: Josh Triplett; +Cc: Kristoffer Haugsbakk, Sebastian Thiel, git

Josh Triplett <josh@joshtriplett.org> writes:

> While I'd love for it to default to that and require an extra option to
> clean away precious files, I'd expect that that would break people's
> workflows and finger memory. If someone expects `git clean -x -d -f` to
> clean away everything, including `.config`, and then it leaves some
> files in place, that seems likely to cause problems. (Leaving aside that
> it might break scripted workflows.)

I thought the point of introducing the new "precious" class of
paths, in addition to the current "tracked", "ignored, untracked,
and expendable", "not ignored and untracked", is so that people can
do "git clean -x -d -f" and expect the ".config" that is marked as
"precious" to stay.  Before their Git learned the precious class, if
they marked ".config" as "ignored, untracked, and expendable", then
such an invocation of "clean" would have removed it, but if they add
it to the new "precious" class, their expectation ought to be that
precious ones are not removed, no?  Otherwise I am not quite sure
what the point of adding such a new protection is.

^ permalink raw reply	[relevance 13%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 12:37 20% [RFC] Define "precious" attribute and support it in `git clean` Sebastian Thiel
  2023-10-10 13:38 12% ` Kristoffer Haugsbakk
@ 2023-10-10 17:02 12% ` Junio C Hamano
  2023-10-11 10:06 12%   ` Richard Kerry
                     ` (2 more replies)
  2023-10-11 21:41 10% ` Kristoffer Haugsbakk
  2 siblings, 3 replies; 200+ results
From: Junio C Hamano @ 2023-10-10 17:02 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: git, Josh Triplett

Sebastian Thiel <sebastian.thiel@icloud.com> writes:

> I'd like to propose adding a new standard gitattribute "precious".

;-).

Over the years, I've seen many times scenarios that would have been
helped if we had not just "tracked? ignored? unignored?" but also
the fourth kind [*].  The word "ignored" (or "excluded") has always
meant "not tracked, not to be tracked, and expendable" to Git, and
"ignored but unexpendable" class was missing.  I even used the term
"precious" myself in those discussions.  At the concept level, I
support the effort 100%, but as always, the devil will be in the
details.

Scenarios that people wished for "precious" traditionally have been

 * You are working on 'master'.  You have in your .gitignore or
   .git/info/exclude a line to ignore path A, and have random
   scribbles in a throw-away file there.  There is another branch
   'seen', where they added some tracked contents at path A/B.  You
   do "git checkout seen" and your file A that is an expendable file,
   because it is listed as ignored in .git/info/exclude, is removed
   to make room for creating A/B.

 * Similar situation, but this time, 'seen' branch added a tracked
   contents at path A.  Again, "git checkout seen" will discard the
   expendable file A and replace it with tracked contents.

 * Instead of "git checkout", you decide to merge the branch 'seen'
   to the checkout of 'master', where you have an ignored path A.
   Because merging 'seen' would need to bring the tracked contents
   of either A/B (in the first scenario above) or A (in the second
   scenario), your "expendable" A will be removed to make room.

In previous discussions, nobody was disturbed that "git clean" was
unaware of the "precious" class, but if we were to have the
"precious" class in addition to "ignored" aka "expendable", I would
not oppose to teach "git clean" about it, too.

There was an early and rough design draft there in

https://lore.kernel.org/git/7vipsnar23.fsf@alter.siamese.dyndns.org/

which probably is worth a read, too.

Even though I referred to the precious _attribute_ in some of these
discussions, between the attribute mechanism and the ignore
mechanism, I am actually leaning toward suggesting to extend the
exclude/ignore mechanism to introduce the "precious" class.  That
way, we can avoid possible snafu arising from marking a path in
.gitignore as ignored, and in .gitattrbutes as precious, and have to
figure out how these two settings are to work together.

In any case, the "precious" paths are expected to be small minority
of what people never want to "git add" or "git commit", so coming up
with a special syntax to be used in .gitignore, even if that special
syntax is ugly and cumbersome to type, would be perfectly OK.


[Reference]

 * https://lore.kernel.org/git/7viptp9jos.fsf@alter.siamese.dyndns.org/
 * https://lore.kernel.org/git/xmqqva534vnb.fsf@gitster-ct.c.googlers.com/

^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 13:38 12% ` Kristoffer Haugsbakk
@ 2023-10-10 14:10 12%   ` Josh Triplett
  2023-10-10 17:07 13%     ` Junio C Hamano
  2023-10-10 19:10 13%     ` Kristoffer Haugsbakk
  0 siblings, 2 replies; 200+ results
From: Josh Triplett @ 2023-10-10 14:10 UTC (permalink / raw)
  To: Kristoffer Haugsbakk; +Cc: Sebastian Thiel, git

On Tue, Oct 10, 2023 at 03:38:51PM +0200, Kristoffer Haugsbakk wrote:
> Hi Sebastian
> 
> On Tue, Oct 10, 2023, at 14:37, Sebastian Thiel wrote:
> > This highlights precious files by calling them out, but doesn't change the
> > behaviour of existing flags.  Instead, the new flag `-p` is added which lets
> > `git clean` spare precious files.
> 
> Why can't `clean` preserve precious files by default? And then delete them
> as well with something like `--no-keep-precious`? Is there some backwards
> compatibility concern?

While I'd love for it to default to that and require an extra option to
clean away precious files, I'd expect that that would break people's
workflows and finger memory. If someone expects `git clean -x -d -f` to
clean away everything, including `.config`, and then it leaves some
files in place, that seems likely to cause problems. (Leaving aside that
it might break scripted workflows.)

It seems safer to keep the existing behavior for existing options, and
add a new option for "remove everything except precious files".

^ permalink raw reply	[relevance 12%]

* Re: [RFC] Define "precious" attribute and support it in `git clean`
  2023-10-10 12:37 20% [RFC] Define "precious" attribute and support it in `git clean` Sebastian Thiel
@ 2023-10-10 13:38 12% ` Kristoffer Haugsbakk
  2023-10-10 14:10 12%   ` Josh Triplett
  2023-10-10 17:02 12% ` Junio C Hamano
  2023-10-11 21:41 10% ` Kristoffer Haugsbakk
  2 siblings, 1 reply; 200+ results
From: Kristoffer Haugsbakk @ 2023-10-10 13:38 UTC (permalink / raw)
  To: Sebastian Thiel; +Cc: Josh Triplett, git

Hi Sebastian

On Tue, Oct 10, 2023, at 14:37, Sebastian Thiel wrote:
> This highlights precious files by calling them out, but doesn't change the
> behaviour of existing flags.  Instead, the new flag `-p` is added which lets
> `git clean` spare precious files.

Why can't `clean` preserve precious files by default? And then delete them
as well with something like `--no-keep-precious`? Is there some backwards
compatibility concern?

^ permalink raw reply	[relevance 12%]

* [RFC] Define "precious" attribute and support it in `git clean`
@ 2023-10-10 12:37 20% Sebastian Thiel
  2023-10-10 13:38 12% ` Kristoffer Haugsbakk
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Sebastian Thiel @ 2023-10-10 12:37 UTC (permalink / raw)
  To: git; +Cc: Josh Triplett

[Note: I'm collaborating with Josh Triplett (CCed) on the design.]

I'd like to propose adding a new standard gitattribute "precious".  I've
included proposed documentation at the end of this mail, and I'm happy to write
the code.  I wanted to get feedback on the concept first.

What's a 'precious' file?

"Precious" files are files that are specific to a user or local configuration
and thus not tracked by Git.  As such, a user spent time to create or generate
them, and to tune them to fit their needs.  They are typically also ignored by
`git` due to `.gitignore` configuration, preventing them to be tracked by
accident.

This proposal suggests to make them known to Git using git-attributes so that
`git clean` can be taught to treat them with care.

Example: A Linux Kernel .config file

Users can mark the `.config` file as 'precious' using `.gitattributes`:

    /.config precious

When checking which ignored files `git clean -nx` would remove, we would see
the following.

    Would remove precious .config
    Would remove scripts/basic/.fixdep.cmd
    Would remove scripts/basic/fixdep
    Would remove scripts/kconfig/.conf.cmd


This highlights precious files by calling them out, but doesn't change the
behaviour of existing flags.  Instead, the new flag `-p` is added which lets
`git clean` spare precious files.

Thus `git clean -np` would print:

    Would remove scripts/basic/.fixdep.cmd
    Would remove scripts/basic/fixdep
    Would remove scripts/kconfig/.conf.cmd

The precious file is not part of the set of files to be removed anymore.

`git clean -[n|f] -xp` will fail with an error indicating that `-x` and `-p`
are mutually exclusive.  The hope is that people can replace some of their
usage of `-x` with `-p` to preserve precious files, while continuing to use
`-x` if they want a completely clean working directory.

Additional Benefits

`git clean -fdp` can now be used to restore the user's directory to a pristine
post-clone state while keeping all files and directories the project or user
identifies as precious.  There is less fear of accidentally deleting files
which are required for local development or otherwise represent a time
investment.

Example: A precious IDE configuration directory.

To keep IDE configuration, one can also mark entire directories - the following
could go into a user-specific gitattributes file denoted by the
`core.attributesFile` configuration.

    /.idea/** precious

With this attributes file in place, `git clean -ndx` would produce the
following output...

    Would remove .DS_Store
    Would remove precious .idea/

...while `git clean -ndp` would look like this:

    Would remove .DS_Store

Here's a patch showing what the documentation could look like.  Happy to write
the corresponding code.

---
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 5e1a3d5148..5b2eab6573 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -60,6 +60,10 @@ OPTIONS
 	Use the given exclude pattern in addition to the standard ignore rules
 	(see linkgit:gitignore[5]).
 
+-p::
+	Remove ignored files as well (like `-x`), but preserve "precious"
+	files (see linkgit:gitattributes[5]).
+
 -x::
 	Don't use the standard ignore rules (see linkgit:gitignore[5]), but
 	still use the ignore rules given with `-e` options from the command
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 6deb89a296..f68aadc3c2 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -1248,6 +1248,20 @@ If this attribute is not set or has an invalid value, the value of the
 (See linkgit:git-config[1]).
 
 
+Preserving precious files
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+`precious`
+^^^^^^^^^^
+
+A file marked as `precious` will be preserved when running linkgit:git-clean[1]
+with the `-p` option. Use this attribute for files such as a Linux kernel
+`.config` file, which are not tracked by git because they contain user-specific
+or build-specific configuration, but which contain valuable information that a
+user spent time and effort to create.
+
+
+
 USING MACRO ATTRIBUTES
 ----------------------
 

What do you think?

Thanks for your feedback,
Sebastian

^ permalink raw reply related	[relevance 20%]

* Re: What's cooking in git.git (Oct 2023, #01; Mon, 2)
  @ 2023-10-05 20:59  4%             ` Sergey Organov
  0 siblings, 0 replies; 200+ results
From: Sergey Organov @ 2023-10-05 20:59 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Junio C Hamano <gitster@pobox.com> writes:

> Sergey Organov <sorganov@gmail.com> writes:

[...]

>>> If I have to pick a candidate for "get me diff" that is the most
>>> useful among those currently are available, it is "give patches to
>>> all single-parent commit, and show tricky conflict resolution part
>>> only for merge commits".
>>
>> I'm afraid you need to pick a candidate that will be natural for '-d',
>> not just most useful output for your workflows, whatever it happens to
>> be.
>
> Literal match to word "diff" does not necessarily mean it is useful,

Sure, who argues? I don't.

> and short-and-sweet single-letter option name is primarily about
> letting users reach useful features with minimum typing [*1*], so you
> cannot avoid "most useful" being a large part of the equation.

I don't try to avoid "most useful" either, quite opposite. With whom do
you argue?

I just pointed that a short-cut would better be natural (or mnemonic)
/as well/, so you probably don't actually want:

  -d:
     give patches to all single-parent commits, and show tricky conflict
     resolution part only for merge commits.

, or do you?

Overall, as an example, I'd understand if you had deflected the patch
with "let's rather use -d for '--decorate=short', or '--date=relative'",
or something like that, but you don't, leaving me uncertain about your
actual worries and intentions.

Anyway, I re-submitted the patches avoiding precious, too hard to
deserve single-letter option.

Thanks,
-- Sergey Organov

^ permalink raw reply	[relevance 4%]

* [PATCH v8 6/9] repack: add `--filter=<filter-spec>` option
  @ 2023-10-02 16:55  2%               ` Christian Couder
  0 siblings, 0 replies; 200+ results
From: Christian Couder @ 2023-10-02 16:55 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some blobs take up a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

It's possible to find which new packfile contains the filtered out
objects using one of the following:

  - `git verify-pack -v ...`,
  - `test-tool find-pack ...`, which a previous commit added,
  - `--filter-to=<dir>`, which a following commit will add to specify
    where the pack containing the filtered out objects will be.

This feature is implemented by running `git pack-objects` twice in a
row. The first command is run with `--filter=<filter-spec>`, using the
specified filter. It packs objects while omitting the objects specified
by the filter. Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

As the interactions with kept packs are a bit tricky, a few related
tests are added.

Helped-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  12 ++++
 builtin/repack.c             |  70 ++++++++++++++++++
 t/t7700-repack.sh            | 135 +++++++++++++++++++++++++++++++++++
 3 files changed, 217 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..6d5bec7716 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,18 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  Also `--no-write-bitmap-index` (or the
+	`repack.writebitmaps` config option set to `false`) should be
+	used otherwise writing bitmap index will fail, as it supposes
+	a single packfile containing all the objects. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 9ef0044384..c7b564192f 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -21,6 +21,7 @@
 #include "pack.h"
 #include "pack-bitmap.h"
 #include "refs.h"
+#include "list-objects-filter-options.h"
 
 #define ALL_INTO_ONE 1
 #define LOOSEN_UNREACHABLE 2
@@ -56,6 +57,7 @@ struct pack_objects_args {
 	int no_reuse_object;
 	int quiet;
 	int local;
+	struct list_objects_filter_options filter_options;
 };
 
 static int repack_config(const char *var, const char *value,
@@ -836,6 +838,56 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct existing_packs *existing,
+			       struct string_list *names)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret;
+	const char *caret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	prepare_pack_objects(&cmd, args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	if (!pack_kept_objects)
+		strvec_push(&cmd.args, "--honor-pack-keep");
+	for_each_string_list_item(item, &existing->kept_packs)
+		strvec_pushf(&cmd.args, "--keep-pack=%s", item->string);
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * Here 'names' contains only the pack(s) that were just
+	 * written, which is exactly the packs we want to keep. Also
+	 * 'existing_kept_packs' already contains the packs in
+	 * 'keep_pack_list'.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, &existing->non_kept_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	for_each_string_list_item(item, &existing->cruft_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	caret = pack_kept_objects ? "" : "^";
+	for_each_string_list_item(item, &existing->kept_packs)
+		fprintf(in, "%s%s.pack\n", caret, item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -966,6 +1018,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_PARSE_LIST_OBJECTS_FILTER(&po_args.filter_options),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -979,6 +1032,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	list_objects_filter_init(&po_args.filter_options);
+
 	git_config(repack_config, &cruft_po_args);
 
 	argc = parse_options(argc, argv, prefix, builtin_repack_options,
@@ -1119,6 +1174,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		strvec_push(&cmd.args, "--incremental");
 	}
 
+	if (po_args.filter_options.choice)
+		strvec_pushf(&cmd.args, "--filter=%s",
+			     expand_list_objects_filter_spec(&po_args.filter_options));
+
 	if (geometry.split_factor)
 		cmd.in = -1;
 	else
@@ -1205,6 +1264,16 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter_options.choice) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(packdir, packtmp),
+					  &existing,
+					  &names);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
@@ -1297,6 +1366,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	string_list_clear(&names, 1);
 	existing_packs_release(&existing);
 	free_pack_geometry(&geometry);
+	list_objects_filter_release(&po_args.filter_options);
 
 	return ret;
 }
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 27b66807cd..39e89445fd 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -327,6 +327,141 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) &&
+	blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack -c 1 HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack -c 1 HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
+test_expect_success '--filter fails with --write-bitmap-index' '
+	test_must_fail \
+		env GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 \
+		git -C bare.git repack -a -d --write-bitmap-index --filter=blob:none
+'
+
+test_expect_success 'repacking with two filters works' '
+	git init two-filters &&
+	(
+		cd two-filters &&
+		mkdir subdir &&
+		test_commit foo &&
+		test_commit subdir_bar subdir/bar &&
+		test_commit subdir_baz subdir/baz
+	) &&
+	git clone --no-local --bare two-filters two-filters.git &&
+	(
+		cd two-filters.git &&
+		test_stdout_line_count = 1 ls objects/pack/*.pack &&
+		git -c repack.writebitmaps=false repack -a -d \
+			--filter=blob:none --filter=tree:1 &&
+		test_stdout_line_count = 2 ls objects/pack/*.pack &&
+		commit_pack=$(test-tool find-pack -c 1 HEAD) &&
+		blob_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		root_tree_pack=$(test-tool find-pack -c 1 HEAD^{tree}) &&
+		subdir_tree_hash=$(git ls-tree --object-only HEAD -- subdir) &&
+		subdir_tree_pack=$(test-tool find-pack -c 1 "$subdir_tree_hash") &&
+
+		# Root tree and subdir tree are not in the same packfiles
+		test "$commit_pack" != "$blob_pack" &&
+		test "$commit_pack" = "$root_tree_pack" &&
+		test "$blob_pack" = "$subdir_tree_pack"
+	)
+'
+
+prepare_for_keep_packs () {
+	git init keep-packs &&
+	(
+		cd keep-packs &&
+		test_commit foo &&
+		test_commit bar
+	) &&
+	git clone --no-local --bare keep-packs keep-packs.git &&
+	(
+		cd keep-packs.git &&
+
+		# Create two packs
+		# The first pack will contain all of the objects except one blob
+		git rev-list --objects --all >objs &&
+		grep -v "bar.t" objs | git pack-objects pack &&
+		# The second pack will contain the excluded object and be kept
+		packid=$(grep "bar.t" objs | git pack-objects pack) &&
+		>pack-$packid.keep &&
+
+		# Replace the existing pack with the 2 new ones
+		rm -f objects/pack/pack* &&
+		mv pack-* objects/pack/
+	)
+}
+
+test_expect_success '--filter works with .keep packs' '
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack_1=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		# Object bar is still only in the old .keep pack
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$bar_pack_1" = "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		test "$foo_pack_1" != "$bar_pack_1" &&
+		test "$foo_pack_1" != "$head_pack_1" &&
+		test "$bar_pack_1" != "$head_pack_1"
+	)
+'
+
+test_expect_success '--filter works with --pack-kept-objects and .keep packs' '
+	rm -rf keep-packs keep-packs.git &&
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none \
+			--pack-kept-objects &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		test-tool find-pack -c 2 HEAD:bar.t >bar_pack_1 &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$foo_pack_1" != "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		# Object bar is in both the old .keep pack and the new
+		# pack that contained the filtered out objects
+		grep "$bar_pack" bar_pack_1 &&
+		grep "$foo_pack_1" bar_pack_1 &&
+		test "$foo_pack_1" != "$head_pack_1"
+	)
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.42.0.305.g5bfd918c90


^ permalink raw reply related	[relevance 2%]

* [PATCH v7 6/9] repack: add `--filter=<filter-spec>` option
  @ 2023-09-25 15:25  2%             ` Christian Couder
    1 sibling, 0 replies; 200+ results
From: Christian Couder @ 2023-09-25 15:25 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some blobs take up a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

It's possible to find which new packfile contains the filtered out
objects using one of the following:

  - `git verify-pack -v ...`,
  - `test-tool find-pack ...`, which a previous commit added,
  - `--filter-to=<dir>`, which a following commit will add to specify
    where the pack containing the filtered out objects will be.

This feature is implemented by running `git pack-objects` twice in a
row. The first command is run with `--filter=<filter-spec>`, using the
specified filter. It packs objects while omitting the objects specified
by the filter. Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

As the interactions with kept packs are a bit tricky, a few related
tests are added.

Helped-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  12 ++++
 builtin/repack.c             |  70 ++++++++++++++++++
 t/t7700-repack.sh            | 135 +++++++++++++++++++++++++++++++++++
 3 files changed, 217 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..6d5bec7716 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,18 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  Also `--no-write-bitmap-index` (or the
+	`repack.writebitmaps` config option set to `false`) should be
+	used otherwise writing bitmap index will fail, as it supposes
+	a single packfile containing all the objects. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 9ef0044384..c7b564192f 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -21,6 +21,7 @@
 #include "pack.h"
 #include "pack-bitmap.h"
 #include "refs.h"
+#include "list-objects-filter-options.h"
 
 #define ALL_INTO_ONE 1
 #define LOOSEN_UNREACHABLE 2
@@ -56,6 +57,7 @@ struct pack_objects_args {
 	int no_reuse_object;
 	int quiet;
 	int local;
+	struct list_objects_filter_options filter_options;
 };
 
 static int repack_config(const char *var, const char *value,
@@ -836,6 +838,56 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct existing_packs *existing,
+			       struct string_list *names)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret;
+	const char *caret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	prepare_pack_objects(&cmd, args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	if (!pack_kept_objects)
+		strvec_push(&cmd.args, "--honor-pack-keep");
+	for_each_string_list_item(item, &existing->kept_packs)
+		strvec_pushf(&cmd.args, "--keep-pack=%s", item->string);
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * Here 'names' contains only the pack(s) that were just
+	 * written, which is exactly the packs we want to keep. Also
+	 * 'existing_kept_packs' already contains the packs in
+	 * 'keep_pack_list'.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, &existing->non_kept_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	for_each_string_list_item(item, &existing->cruft_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	caret = pack_kept_objects ? "" : "^";
+	for_each_string_list_item(item, &existing->kept_packs)
+		fprintf(in, "%s%s.pack\n", caret, item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -966,6 +1018,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_PARSE_LIST_OBJECTS_FILTER(&po_args.filter_options),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -979,6 +1032,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	list_objects_filter_init(&po_args.filter_options);
+
 	git_config(repack_config, &cruft_po_args);
 
 	argc = parse_options(argc, argv, prefix, builtin_repack_options,
@@ -1119,6 +1174,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		strvec_push(&cmd.args, "--incremental");
 	}
 
+	if (po_args.filter_options.choice)
+		strvec_pushf(&cmd.args, "--filter=%s",
+			     expand_list_objects_filter_spec(&po_args.filter_options));
+
 	if (geometry.split_factor)
 		cmd.in = -1;
 	else
@@ -1205,6 +1264,16 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter_options.choice) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(packdir, packtmp),
+					  &existing,
+					  &names);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
@@ -1297,6 +1366,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	string_list_clear(&names, 1);
 	existing_packs_release(&existing);
 	free_pack_geometry(&geometry);
+	list_objects_filter_release(&po_args.filter_options);
 
 	return ret;
 }
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 27b66807cd..39e89445fd 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -327,6 +327,141 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) &&
+	blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack -c 1 HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack -c 1 HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
+test_expect_success '--filter fails with --write-bitmap-index' '
+	test_must_fail \
+		env GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 \
+		git -C bare.git repack -a -d --write-bitmap-index --filter=blob:none
+'
+
+test_expect_success 'repacking with two filters works' '
+	git init two-filters &&
+	(
+		cd two-filters &&
+		mkdir subdir &&
+		test_commit foo &&
+		test_commit subdir_bar subdir/bar &&
+		test_commit subdir_baz subdir/baz
+	) &&
+	git clone --no-local --bare two-filters two-filters.git &&
+	(
+		cd two-filters.git &&
+		test_stdout_line_count = 1 ls objects/pack/*.pack &&
+		git -c repack.writebitmaps=false repack -a -d \
+			--filter=blob:none --filter=tree:1 &&
+		test_stdout_line_count = 2 ls objects/pack/*.pack &&
+		commit_pack=$(test-tool find-pack -c 1 HEAD) &&
+		blob_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		root_tree_pack=$(test-tool find-pack -c 1 HEAD^{tree}) &&
+		subdir_tree_hash=$(git ls-tree --object-only HEAD -- subdir) &&
+		subdir_tree_pack=$(test-tool find-pack -c 1 "$subdir_tree_hash") &&
+
+		# Root tree and subdir tree are not in the same packfiles
+		test "$commit_pack" != "$blob_pack" &&
+		test "$commit_pack" = "$root_tree_pack" &&
+		test "$blob_pack" = "$subdir_tree_pack"
+	)
+'
+
+prepare_for_keep_packs () {
+	git init keep-packs &&
+	(
+		cd keep-packs &&
+		test_commit foo &&
+		test_commit bar
+	) &&
+	git clone --no-local --bare keep-packs keep-packs.git &&
+	(
+		cd keep-packs.git &&
+
+		# Create two packs
+		# The first pack will contain all of the objects except one blob
+		git rev-list --objects --all >objs &&
+		grep -v "bar.t" objs | git pack-objects pack &&
+		# The second pack will contain the excluded object and be kept
+		packid=$(grep "bar.t" objs | git pack-objects pack) &&
+		>pack-$packid.keep &&
+
+		# Replace the existing pack with the 2 new ones
+		rm -f objects/pack/pack* &&
+		mv pack-* objects/pack/
+	)
+}
+
+test_expect_success '--filter works with .keep packs' '
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack_1=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		# Object bar is still only in the old .keep pack
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$bar_pack_1" = "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		test "$foo_pack_1" != "$bar_pack_1" &&
+		test "$foo_pack_1" != "$head_pack_1" &&
+		test "$bar_pack_1" != "$head_pack_1"
+	)
+'
+
+test_expect_success '--filter works with --pack-kept-objects and .keep packs' '
+	rm -rf keep-packs keep-packs.git &&
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none \
+			--pack-kept-objects &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		test-tool find-pack -c 2 HEAD:bar.t >bar_pack_1 &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$foo_pack_1" != "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		# Object bar is in both the old .keep pack and the new
+		# pack that contained the filtered out objects
+		grep "$bar_pack" bar_pack_1 &&
+		grep "$foo_pack_1" bar_pack_1 &&
+		test "$foo_pack_1" != "$head_pack_1"
+	)
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.42.0.279.g57b2ba444c


^ permalink raw reply related	[relevance 2%]

* Re: skip-worktree autostash on pull
  @ 2023-09-14 21:37  4% ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2023-09-14 21:37 UTC (permalink / raw)
  To: Blake Campbell; +Cc: git

[-- Attachment #1: Type: text/plain, Size: 2055 bytes --]

On 2023-09-14 at 09:54:30, Blake Campbell wrote:
> Hi all - I use update-index --skip-worktree on some config files that
> I change locally and don’t want to commit, but every time I pull from
> the remote I have to go through a process of no-skip-worktree, stash,
> pull, stash pop, then skip-worktree again, which is all a bit tedious!
> Ideally some switch like --autostash for git pull would be really
> useful. Does anyone know if something like that exists? 

The Git FAQ[0] outlines that, as you've noticed, skip-worktree doesn't
work for ignoring changes to tracked files:

  Git doesn’t provide a way to do this. The reason is that if Git needs
  to overwrite this file, such as during a checkout, it doesn’t know
  whether the changes to the file are precious and should be kept, or
  whether they are irrelevant and can safely be destroyed. Therefore, it
  has to take the safe route and always preserve them.

  It’s tempting to try to use certain features of git update-index,
  namely the assume-unchanged and skip-worktree bits, but these don’t
  work properly for this purpose and shouldn’t be used this way.

If you take the advice in the FAQ, then the config files won't be
tracked and you won't have this problem:

  If your goal is to modify a configuration file, it can often be
  helpful to have a file checked into the repository which is a template
  or set of defaults which can then be copied alongside and modified as
  appropriate. This second, modified file is usually ignored to prevent
  accidentally committing it.

Your particular case is one of many reasons we suggest this approach.
There is in fact an --autostash argument in git pull, as well as git
rebase, both of which work as you might expect, but in general they
still won't work properly with --skip-worktree and given the FAQ entry
above, we wouldn't add support for that in the option.

[0] https://git-scm.com/docs/gitfaq#ignore-tracked-files
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 263 bytes --]

^ permalink raw reply	[relevance 4%]

* [PATCH v6 6/9] repack: add `--filter=<filter-spec>` option
  @ 2023-09-11 15:06  2%           ` Christian Couder
    1 sibling, 0 replies; 200+ results
From: Christian Couder @ 2023-09-11 15:06 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some blobs take up a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

It's possible to find which new packfile contains the filtered out
objects using one of the following:

  - `git verify-pack -v ...`,
  - `test-tool find-pack ...`, which a previous commit added,
  - `--filter-to=<dir>`, which a following commit will add to specify
    where the pack containing the filtered out objects will be.

This feature is implemented by running `git pack-objects` twice in a
row. The first command is run with `--filter=<filter-spec>`, using the
specified filter. It packs objects while omitting the objects specified
by the filter. Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

As the interactions with kept packs are a bit tricky, a few related
tests are added.

Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  12 ++++
 builtin/repack.c             |  73 +++++++++++++++++++
 t/t7700-repack.sh            | 135 +++++++++++++++++++++++++++++++++++
 3 files changed, 220 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..6d5bec7716 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,18 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  Also `--no-write-bitmap-index` (or the
+	`repack.writebitmaps` config option set to `false`) should be
+	used otherwise writing bitmap index will fail, as it supposes
+	a single packfile containing all the objects. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 8de3009b9f..ac70698a41 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -21,6 +21,7 @@
 #include "pack.h"
 #include "pack-bitmap.h"
 #include "refs.h"
+#include "list-objects-filter-options.h"
 
 #define ALL_INTO_ONE 1
 #define LOOSEN_UNREACHABLE 2
@@ -57,6 +58,7 @@ struct pack_objects_args {
 	int no_reuse_object;
 	int quiet;
 	int local;
+	struct list_objects_filter_options filter_options;
 };
 
 static int repack_config(const char *var, const char *value,
@@ -725,6 +727,57 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct string_list *keep_pack_list,
+			       struct string_list *names,
+			       struct string_list *existing_packs,
+			       struct string_list *existing_kept_packs)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret, i;
+	const char *caret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	prepare_pack_objects(&cmd, args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	if (!pack_kept_objects)
+		strvec_push(&cmd.args, "--honor-pack-keep");
+	for (i = 0; i < keep_pack_list->nr; i++)
+		strvec_pushf(&cmd.args, "--keep-pack=%s",
+			     keep_pack_list->items[i].string);
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * Here 'names' contains only the pack(s) that were just
+	 * written, which is exactly the packs we want to keep. Also
+	 * 'existing_kept_packs' already contains the packs in
+	 * 'keep_pack_list'.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, existing_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	caret = pack_kept_objects ? "" : "^";
+	for_each_string_list_item(item, existing_kept_packs)
+		fprintf(in, "%s%s.pack\n", caret, item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -855,6 +908,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_PARSE_LIST_OBJECTS_FILTER(&po_args.filter_options),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -868,6 +922,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	list_objects_filter_init(&po_args.filter_options);
+
 	git_config(repack_config, &cruft_po_args);
 
 	argc = parse_options(argc, argv, prefix, builtin_repack_options,
@@ -1008,6 +1064,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		strvec_push(&cmd.args, "--incremental");
 	}
 
+	if (po_args.filter_options.choice)
+		strvec_pushf(&cmd.args, "--filter=%s",
+			     expand_list_objects_filter_spec(&po_args.filter_options));
+
 	if (geometry.split_factor)
 		cmd.in = -1;
 	else
@@ -1096,6 +1156,18 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter_options.choice) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(packdir, packtmp),
+					  &keep_pack_list,
+					  &names,
+					  &existing_nonkept_packs,
+					  &existing_kept_packs);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
@@ -1230,6 +1302,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	string_list_clear(&existing_nonkept_packs, 0);
 	string_list_clear(&existing_kept_packs, 0);
 	free_pack_geometry(&geometry);
+	list_objects_filter_release(&po_args.filter_options);
 
 	return ret;
 }
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 27b66807cd..39e89445fd 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -327,6 +327,141 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) &&
+	blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack -c 1 HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack -c 1 HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
+test_expect_success '--filter fails with --write-bitmap-index' '
+	test_must_fail \
+		env GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 \
+		git -C bare.git repack -a -d --write-bitmap-index --filter=blob:none
+'
+
+test_expect_success 'repacking with two filters works' '
+	git init two-filters &&
+	(
+		cd two-filters &&
+		mkdir subdir &&
+		test_commit foo &&
+		test_commit subdir_bar subdir/bar &&
+		test_commit subdir_baz subdir/baz
+	) &&
+	git clone --no-local --bare two-filters two-filters.git &&
+	(
+		cd two-filters.git &&
+		test_stdout_line_count = 1 ls objects/pack/*.pack &&
+		git -c repack.writebitmaps=false repack -a -d \
+			--filter=blob:none --filter=tree:1 &&
+		test_stdout_line_count = 2 ls objects/pack/*.pack &&
+		commit_pack=$(test-tool find-pack -c 1 HEAD) &&
+		blob_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		root_tree_pack=$(test-tool find-pack -c 1 HEAD^{tree}) &&
+		subdir_tree_hash=$(git ls-tree --object-only HEAD -- subdir) &&
+		subdir_tree_pack=$(test-tool find-pack -c 1 "$subdir_tree_hash") &&
+
+		# Root tree and subdir tree are not in the same packfiles
+		test "$commit_pack" != "$blob_pack" &&
+		test "$commit_pack" = "$root_tree_pack" &&
+		test "$blob_pack" = "$subdir_tree_pack"
+	)
+'
+
+prepare_for_keep_packs () {
+	git init keep-packs &&
+	(
+		cd keep-packs &&
+		test_commit foo &&
+		test_commit bar
+	) &&
+	git clone --no-local --bare keep-packs keep-packs.git &&
+	(
+		cd keep-packs.git &&
+
+		# Create two packs
+		# The first pack will contain all of the objects except one blob
+		git rev-list --objects --all >objs &&
+		grep -v "bar.t" objs | git pack-objects pack &&
+		# The second pack will contain the excluded object and be kept
+		packid=$(grep "bar.t" objs | git pack-objects pack) &&
+		>pack-$packid.keep &&
+
+		# Replace the existing pack with the 2 new ones
+		rm -f objects/pack/pack* &&
+		mv pack-* objects/pack/
+	)
+}
+
+test_expect_success '--filter works with .keep packs' '
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack_1=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		# Object bar is still only in the old .keep pack
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$bar_pack_1" = "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		test "$foo_pack_1" != "$bar_pack_1" &&
+		test "$foo_pack_1" != "$head_pack_1" &&
+		test "$bar_pack_1" != "$head_pack_1"
+	)
+'
+
+test_expect_success '--filter works with --pack-kept-objects and .keep packs' '
+	rm -rf keep-packs keep-packs.git &&
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none \
+			--pack-kept-objects &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		test-tool find-pack -c 2 HEAD:bar.t >bar_pack_1 &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$foo_pack_1" != "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		# Object bar is in both the old .keep pack and the new
+		# pack that contained the filtered out objects
+		grep "$bar_pack" bar_pack_1 &&
+		grep "$foo_pack_1" bar_pack_1 &&
+		test "$foo_pack_1" != "$head_pack_1"
+	)
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.42.0.167.gd6ff314189


^ permalink raw reply related	[relevance 2%]

* [PATCH v5 5/8] repack: add `--filter=<filter-spec>` option
  @ 2023-08-12  0:00  2%         ` Christian Couder
    1 sibling, 0 replies; 200+ results
From: Christian Couder @ 2023-08-12  0:00 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some blobs take up a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

It's possible to find which new packfile contains the filtered out
objects using one of the following:

  - `git verify-pack -v ...`,
  - `test-tool find-pack ...`, which a previous commit added,
  - `--filter-to=<dir>`, which a following commit will add to specify
    where the pack containing the filtered out objects will be.

This feature is implemented by running `git pack-objects` twice in a
row. The first command is run with `--filter=<filter-spec>`, using the
specified filter. It packs objects while omitting the objects specified
by the filter. Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

As the interactions with kept packs are a bit tricky, a few related
tests are added.

Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  12 ++++
 builtin/repack.c             |  73 +++++++++++++++++++
 t/t7700-repack.sh            | 135 +++++++++++++++++++++++++++++++++++
 3 files changed, 220 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..6d5bec7716 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,18 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  Also `--no-write-bitmap-index` (or the
+	`repack.writebitmaps` config option set to `false`) should be
+	used otherwise writing bitmap index will fail, as it supposes
+	a single packfile containing all the objects. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 825da1caca..c672387ab9 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -21,6 +21,7 @@
 #include "pack.h"
 #include "pack-bitmap.h"
 #include "refs.h"
+#include "list-objects-filter-options.h"
 
 #define ALL_INTO_ONE 1
 #define LOOSEN_UNREACHABLE 2
@@ -57,6 +58,7 @@ struct pack_objects_args {
 	int no_reuse_object;
 	int quiet;
 	int local;
+	struct list_objects_filter_options filter_options;
 };
 
 static int repack_config(const char *var, const char *value,
@@ -726,6 +728,57 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct string_list *keep_pack_list,
+			       struct string_list *names,
+			       struct string_list *existing_packs,
+			       struct string_list *existing_kept_packs)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret, i;
+	const char *caret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	prepare_pack_objects(&cmd, args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	if (!pack_kept_objects)
+		strvec_push(&cmd.args, "--honor-pack-keep");
+	for (i = 0; i < keep_pack_list->nr; i++)
+		strvec_pushf(&cmd.args, "--keep-pack=%s",
+			     keep_pack_list->items[i].string);
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * Here 'names' contains only the pack(s) that were just
+	 * written, which is exactly the packs we want to keep. Also
+	 * 'existing_kept_packs' already contains the packs in
+	 * 'keep_pack_list'.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, existing_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	caret = pack_kept_objects ? "" : "^";
+	for_each_string_list_item(item, existing_kept_packs)
+		fprintf(in, "%s%s.pack\n", caret, item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -858,6 +911,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_PARSE_LIST_OBJECTS_FILTER(&po_args.filter_options),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -871,6 +925,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	list_objects_filter_init(&po_args.filter_options);
+
 	git_config(repack_config, &cruft_po_args);
 
 	argc = parse_options(argc, argv, prefix, builtin_repack_options,
@@ -1011,6 +1067,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		strvec_push(&cmd.args, "--incremental");
 	}
 
+	if (po_args.filter_options.choice)
+		strvec_pushf(&cmd.args, "--filter=%s",
+			     expand_list_objects_filter_spec(&po_args.filter_options));
+
 	if (geometry)
 		cmd.in = -1;
 	else
@@ -1097,6 +1157,18 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter_options.choice) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(packdir, packtmp),
+					  &keep_pack_list,
+					  &names,
+					  &existing_nonkept_packs,
+					  &existing_kept_packs);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
@@ -1231,6 +1303,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	string_list_clear(&existing_nonkept_packs, 0);
 	string_list_clear(&existing_kept_packs, 0);
 	clear_pack_geometry(geometry);
+	list_objects_filter_release(&po_args.filter_options);
 
 	return ret;
 }
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 27b66807cd..39e89445fd 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -327,6 +327,141 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) &&
+	blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack -c 1 HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack -c 1 HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
+test_expect_success '--filter fails with --write-bitmap-index' '
+	test_must_fail \
+		env GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 \
+		git -C bare.git repack -a -d --write-bitmap-index --filter=blob:none
+'
+
+test_expect_success 'repacking with two filters works' '
+	git init two-filters &&
+	(
+		cd two-filters &&
+		mkdir subdir &&
+		test_commit foo &&
+		test_commit subdir_bar subdir/bar &&
+		test_commit subdir_baz subdir/baz
+	) &&
+	git clone --no-local --bare two-filters two-filters.git &&
+	(
+		cd two-filters.git &&
+		test_stdout_line_count = 1 ls objects/pack/*.pack &&
+		git -c repack.writebitmaps=false repack -a -d \
+			--filter=blob:none --filter=tree:1 &&
+		test_stdout_line_count = 2 ls objects/pack/*.pack &&
+		commit_pack=$(test-tool find-pack -c 1 HEAD) &&
+		blob_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		root_tree_pack=$(test-tool find-pack -c 1 HEAD^{tree}) &&
+		subdir_tree_hash=$(git ls-tree --object-only HEAD -- subdir) &&
+		subdir_tree_pack=$(test-tool find-pack -c 1 "$subdir_tree_hash") &&
+
+		# Root tree and subdir tree are not in the same packfiles
+		test "$commit_pack" != "$blob_pack" &&
+		test "$commit_pack" = "$root_tree_pack" &&
+		test "$blob_pack" = "$subdir_tree_pack"
+	)
+'
+
+prepare_for_keep_packs () {
+	git init keep-packs &&
+	(
+		cd keep-packs &&
+		test_commit foo &&
+		test_commit bar
+	) &&
+	git clone --no-local --bare keep-packs keep-packs.git &&
+	(
+		cd keep-packs.git &&
+
+		# Create two packs
+		# The first pack will contain all of the objects except one blob
+		git rev-list --objects --all >objs &&
+		grep -v "bar.t" objs | git pack-objects pack &&
+		# The second pack will contain the excluded object and be kept
+		packid=$(grep "bar.t" objs | git pack-objects pack) &&
+		>pack-$packid.keep &&
+
+		# Replace the existing pack with the 2 new ones
+		rm -f objects/pack/pack* &&
+		mv pack-* objects/pack/
+	)
+}
+
+test_expect_success '--filter works with .keep packs' '
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack_1=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		# Object bar is still only in the old .keep pack
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$bar_pack_1" = "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		test "$foo_pack_1" != "$bar_pack_1" &&
+		test "$foo_pack_1" != "$head_pack_1" &&
+		test "$bar_pack_1" != "$head_pack_1"
+	)
+'
+
+test_expect_success '--filter works with --pack-kept-objects and .keep packs' '
+	rm -rf keep-packs keep-packs.git &&
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none \
+			--pack-kept-objects &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		test-tool find-pack -c 2 HEAD:bar.t >bar_pack_1 &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$foo_pack_1" != "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		# Object bar is in both the old .keep pack and the new
+		# pack that contained the filtered out objects
+		grep "$bar_pack" bar_pack_1 &&
+		grep "$foo_pack_1" bar_pack_1 &&
+		test "$foo_pack_1" != "$head_pack_1"
+	)
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.42.0.rc1.8.ga52e3a71db


^ permalink raw reply related	[relevance 2%]

* [PATCH v4 0/8] Repack objects into separate packfiles based on a filter
  2023-07-24  8:59  1%   ` [PATCH v3 0/8] Repack objects into separate packfiles based on a filter Christian Couder
  2023-07-24  8:59  2%     ` [PATCH v3 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
@ 2023-08-08  8:26  1%     ` Christian Couder
  2023-08-08  8:26  2%       ` [PATCH v4 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
    1 sibling, 2 replies; 200+ results
From: Christian Couder @ 2023-08-08  8:26 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder

# Intro

Last year, John Cai sent 2 versions of a patch series to implement
`git repack --filter=<filter-spec>` and later I sent 4 versions of a
patch series trying to do it a bit differently:

  - https://lore.kernel.org/git/pull.1206.git.git.1643248180.gitgitgadget@gmail.com/
  - https://lore.kernel.org/git/20221012135114.294680-1-christian.couder@gmail.com/

In these patch series, the `--filter=<filter-spec>` removed the
filtered out objects altogether which was considered very dangerous
even though we implemented different safety checks in some of the
latter series.

In some discussions, it was mentioned that such a feature, or a
similar feature in `git gc`, or in a new standalone command (perhaps
called `git prune-filtered`), should put the filtered out objects into
a new packfile instead of deleting them.

Recently there were internal discussions at GitLab about either moving
blobs from inactive repos onto cheaper storage, or moving large blobs
onto cheaper storage. This lead us to rethink at repacking using a
filter, but moving the filtered out objects into a separate packfile
instead of deleting them.

So here is a new patch series doing that while implementing the
`--filter=<filter-spec>` option in `git repack`.

# Use cases for the new feature

This could be useful for example for the following purposes:

  1) As a way for servers to save storage costs by for example moving
     large blobs, or all the blobs, or all the blobs in inactive
     repos, to separate storage (while still making them accessible
     using for example the alternates mechanism).

  2) As a way to use partial clone on a Git server to offload large
     blobs to, for example, an http server, while using multiple
     promisor remotes (to be able to access everything) on the client
     side. (In this case the packfile that contains the filtered out
     object can be manualy removed after checking that all the objects
     it contains are available through the promisor remote.)

  3) As a way for clients to reclaim some space when they cloned with
     a filter to save disk space but then fetched a lot of unwanted
     objects (for example when checking out old branches) and now want
     to remove these unwanted objects. (In this case they can first
     move the packfile that contains filtered out objects to a
     separate directory or storage, then check that everything works
     well, and then manually remove the packfile after some time.)

As the features and the code are quite different from those in the
previous series, I decided to start a new series instead of continuing
a previous one.

Also since version 2 of this new series, commit messages, don't
mention uses cases like 2) or 3) above, as people have different
opinions on how it should be done. How it should be done could depend
a lot on the way promisor remotes are used, the software and hardware
setups used, etc, so it seems more difficult to "sell" this series by
talking about such use cases. As use case 1) seems simpler and more
appealing, it makes more sense to only talk about it in the commit
messages.

# Changes since version 3

Thanks to Junio who reviewed both version 1, 2 and 3, and to Taylor
who reviewed version 1 and 3! The changes are the following:

- In patch 2/8, which introduces `test-tool find-pack`, a new
  `--check-count <n>` option has been added to check the number of
  packfiles an object is in. To keep things simple and extendable, the
  parse-options API is now used to parse arguments and options.

- Also in patch 2/8, a test script 't0080-find-pack.sh' has been
  introduced to test `test-tool find-pack`, as suggested by Taylor.

- In patch 4/8, which refactors code into a find_pack_prefix()
  function, this function has been changed to accept a `packdir` and a
  `packtmp` argument, instead of using the global variables with the
  same names, as suggested by Taylor.

- In patch 5/8, which introduces `--filter=<filter-spec>` option, a
  `struct list_objects_filter_option` and some related functions and
  macros are now used to handle these options, instead of a character
  string. This allows more than one `--filter=<filter-spec>` option to
  be passed, and a new test has been added to check that this works,
  as suggested by Taylor.

- In patch 5/8, some changes have been made to better handle kept
  packfiles and related tests have been added to check that this works
  well, as suggested by Taylor.

- In patch 5/8, a comment about the 'names' variable has been
  shortened a lot and improved a bit with additional useful
  information, as suggested by Taylor.

- Also in patch 5/8, tests have been improved and shortened by using
  the new `--check-count <n>` option of `test-tool find-pack`.

- Also in patch 5/8, the test that checks that `--filter=...` fails
  with `--write-bitmap-index` has been changed to use
  GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 which should fix a CI test
  that sets this variable to 1. This test has also been simplified by
  removing a useless call to `repack --filter=...` as suggested by
  Taylor.

- Also in patch 5/8, the commit message has been improved a bit and
  now only talks about the use case of moving some blobs that take up
  precious space to a cheaper storage, as suggested by Junio.

- In patch 6/8, which implements the `gc.repackFilter` config option,
  a line in the tests that was too long has been split over 2 lines,
  as suggested by Taylor.

- In patch 7/8, which implements the `--filter-to=<dir>` option, the
  documentation of that option talking about possible corruption has
  been clarified a bit, as suggested by Junio.

- Also in patch 7/8, tests have been improved and shortened by using
  the new `--check-count <n>` option of `test-tool find-pack`.

# Commit overview

* 1/8 pack-objects: allow `--filter` without `--stdout`

  This patch is the same as in v1, v2 and v3. To be able to later
  repack with a filter we need `git pack-objects` to write packfiles
  when it's filtering instead of just writing the pack without the
  filtered out objects to stdout.

* 2/8 t/helper: add 'find-pack' test-tool

  For testing `git repack --filter=...` that we are going to
  implement, it's useful to have a test helper that can tell which
  packfiles contain a specific object. Since v3 the new
  `--check-count <n>` option has been added, and tests have been added
  in a new 't0080-find-pack.sh' test script.

* 3/8 repack: refactor finishing pack-objects command

  No change in this patch compared to v2 and v3. This is a small
  refactoring creating a new useful function, so that `git repack
  --filter=...` will be able to reuse it.

* 4/8 repack: refactor finding pack prefix

  This is another small refactoring creating a small function that
  will be reused in the next patch. Since v3 the new function
  introduced in this patch has been changed to accept a `packdir` and
  a `packtmp` argument, instead of using the global variables with the
  same names.

* 5/8 repack: add `--filter=<filter-spec>` option

  This actually adds the `--filter=<filter-spec>` option. It uses one
  `git pack-objects` process with the `--filter` option. And then
  another `git pack-objects` process with the `--stdin-packs`
  option. A lot of changes have been made since v3:

    - The `list_objects_filter_option` struct and some related
      functions and macros are used to handle the new
      `--filter=<filter-spec>` option. A new test has been added to
      check that using multiple such options works.

    - Handling of kept packfiles has been improved and related tests
      have been added.

    - A comment about the 'names' variable has been shortened a lot
      and improved a bit.

    - Tests have been improved and shortened by using the new
      `--check-count <n>` option of `test-tool find-pack`.

    - The test that checks that `--filter=...` fails with
      `--write-bitmap-index` has been improved to pass a CI test and
      shortened.

    - The commit message has been improved a bit.

* 6/8 gc: add `gc.repackFilter` config option

  This is a gc config option so that `git gc` can also repack using a
  filter and put the filtered out objects into a separate
  packfile. Since v3, a line in the tests that was too long has been
  split over 2 lines.

* 7/8 repack: implement `--filter-to` for storing filtered out objects

  For some use cases, it's interesting to create the packfile that
  contains the filtered out objects into a separate location. This is
  similar to the `--expire-to` option for cruft packfiles. Since v3,
  documentation of that option talking about possible corruption has
  been clarified a bit, and tests have been improved and shortened by
  using the new `--check-count <n>` option of `test-tool find-pack`.

* 8/8 gc: add `gc.repackFilterTo` config option

  No change in this patch compared to v3. This allows specifying the
  location of the packfile that contains the filtered out objects when
  using `gc.repackFilter`.

# Range-diff since v3

(Sorry, but the range-diff doesn't show changes in patches 2/8 and 5/8
as there has been a lot of changes in them. Instead it shows that the
old commit has been removed and a new one added.)

1:  4d75a1d7c3 = 1:  4d75a1d7c3 pack-objects: allow `--filter` without `--stdout`
2:  fdf9b6e8cc < -:  ---------- t/helper: add 'find-pack' test-tool
-:  ---------- > 2:  0bf9f53158 t/helper: add 'find-pack' test-tool
3:  e7cfdebc78 = 3:  54060d775e repack: refactor finishing pack-objects command
4:  9c51063795 ! 4:  948ea541ae repack: refactor finding pack prefix
    @@ builtin/repack.c: static int write_cruft_pack(const struct pack_objects_args *ar
        return finish_pack_objects_cmd(&cmd, names, local);
      }
      
    -+static const char *find_pack_prefix(void)
    ++static const char *find_pack_prefix(char *packdir, char *packtmp)
     +{
     +  const char *pack_prefix;
     +  if (!skip_prefix(packtmp, packdir, &pack_prefix))
    @@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix
     -                      packtmp, packdir);
     -          if (*pack_prefix == '/')
     -                  pack_prefix++;
    -+          const char *pack_prefix = find_pack_prefix();
    ++          const char *pack_prefix = find_pack_prefix(packdir, packtmp);
      
                if (!cruft_po_args.window)
                        cruft_po_args.window = po_args.window;
5:  a90e8045c3 < -:  ---------- repack: add `--filter=<filter-spec>` option
-:  ---------- > 5:  0635425289 repack: add `--filter=<filter-spec>` option
6:  335b7f614d ! 6:  bf8be2c812 gc: add `gc.repackFilter` config option
    @@ t/t6500-gc.sh: test_expect_success 'one of gc.reflogExpire{Unreachable,}=never d
     +  git -C bare.git -c gc.cruftPacks=false gc &&
     +  test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
     +
    -+  GIT_TRACE=$(pwd)/trace.out git -C bare.git -c gc.repackFilter=blob:none -c repack.writeBitmaps=false -c gc.cruftPacks=false gc &&
    ++  GIT_TRACE=$(pwd)/trace.out git -C bare.git -c gc.repackFilter=blob:none \
    ++          -c repack.writeBitmaps=false -c gc.cruftPacks=false gc &&
     +  test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
     +  grep -E "^trace: (built-in|exec|run_command): git repack .* --filter=blob:none ?.*" trace.out
     +'
7:  b1be7f60b7 ! 7:  abe7526222 repack: implement `--filter-to` for storing filtered out objects
    @@ Commit message
     
         Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
     
    -    repack: add test with --max-pack-size
    -
      ## Documentation/git-repack.txt ##
     @@ Documentation/git-repack.txt: depth is 4095.
        a single packfile containing all the objects. See
    @@ Documentation/git-repack.txt: depth is 4095.
     +  used for putting the pack on a separate object directory that
     +  is accessed through the Git alternates mechanism. **WARNING:**
     +  If the packfile containing the filtered out objects is not
    -+  accessible, the repo could be considered corrupt by Git as it
    -+  migh not be able to access the objects in that packfile. See
    -+  the `objects` and `objects/info/alternates` sections of
    ++  accessible, the repo can become corrupt as it might not be
    ++  possible to access the objects in that packfile. See the
    ++  `objects` and `objects/info/alternates` sections of
     +  linkgit:gitrepository-layout[5].
     +
      -b::
    @@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix
        };
      
     @@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix)
    -           strvec_push(&cmd.args, "--incremental");
    -   }
    - 
    -+  if (filter_to && !po_args.filter)
    +   if (po_args.filter_options.choice)
    +           strvec_pushf(&cmd.args, "--filter=%s",
    +                        expand_list_objects_filter_spec(&po_args.filter_options));
    ++  else if (filter_to)
     +          die(_("option '%s' can only be used along with '%s'"), "--filter-to", "--filter");
    -+
    + 
        if (geometry)
                cmd.in = -1;
    -   else
     @@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix)
        }
      
    -   if (po_args.filter) {
    +   if (po_args.filter_options.choice) {
     +          if (!filter_to)
     +                  filter_to = packtmp;
     +
                ret = write_filtered_pack(&po_args,
     -                                    packtmp,
     +                                    filter_to,
    -                                     find_pack_prefix(),
    +                                     find_pack_prefix(packdir, packtmp),
    +                                     &keep_pack_list,
                                          &names,
    -                                     &existing_nonkept_packs,
     
      ## t/t7700-repack.sh ##
    -@@ t/t7700-repack.sh: test_expect_success '--filter fails with --write-bitmap-index' '
    -           --filter=blob:none
    +@@ t/t7700-repack.sh: test_expect_success '--filter works with --pack-kept-objects and .keep packs' '
    +   )
      '
      
     +test_expect_success '--filter-to stores filtered out objects' '
    @@ t/t7700-repack.sh: test_expect_success '--filter fails with --write-bitmap-index
     +  test_stdout_line_count = 1 ls bare.git/objects/pack/pack-*.pack &&
     +  test_stdout_line_count = 1 ls filtered.git/objects/pack/pack-*.pack &&
     +
    -+  commit_pack=$(test-tool -C bare.git find-pack HEAD) &&
    -+  test -n "$commit_pack" &&
    -+  blob_pack=$(test-tool -C bare.git find-pack HEAD:file1) &&
    -+  test -z "$blob_pack" &&
    ++  commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) &&
    ++  blob_pack=$(test-tool -C bare.git find-pack -c 0 HEAD:file1) &&
     +  blob_hash=$(git -C bare.git rev-parse HEAD:file1) &&
     +  test -n "$blob_hash" &&
    -+  blob_pack=$(test-tool -C filtered.git find-pack $blob_hash) &&
    -+  test -n "$blob_pack" &&
    ++  blob_pack=$(test-tool -C filtered.git find-pack -c 1 $blob_hash) &&
     +
     +  echo $(pwd)/filtered.git/objects >bare.git/objects/info/alternates &&
    -+  blob_pack=$(test-tool -C bare.git find-pack HEAD:file1) &&
    -+  test -n "$blob_pack" &&
    ++  blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) &&
     +  blob_content=$(git -C bare.git show $blob_hash) &&
     +  test "$blob_content" = "content1"
     +'
    @@ t/t7700-repack.sh: test_expect_success '--filter fails with --write-bitmap-index
     +          # Check that the 3 blobs are in different packfiles in filtered.git
     +          test_stdout_line_count = 3 ls ../filtered.git/objects/pack/pack-*.pack &&
     +          test_stdout_line_count = 1 ls objects/pack/pack-*.pack &&
    -+          foo_pack=$(test-tool find-pack HEAD:foo) &&
    -+          bar_pack=$(test-tool find-pack HEAD:bar) &&
    -+          base_pack=$(test-tool find-pack HEAD:base.t) &&
    ++          foo_pack=$(test-tool find-pack -c 1 HEAD:foo) &&
    ++          bar_pack=$(test-tool find-pack -c 1 HEAD:bar) &&
    ++          base_pack=$(test-tool find-pack -c 1 HEAD:base.t) &&
     +          test "$foo_pack" != "$bar_pack" &&
     +          test "$foo_pack" != "$base_pack" &&
     +          test "$bar_pack" != "$base_pack" &&
8:  ed66511823 = 8:  ccdc858f73 gc: add `gc.repackFilterTo` config option


Christian Couder (8):
  pack-objects: allow `--filter` without `--stdout`
  t/helper: add 'find-pack' test-tool
  repack: refactor finishing pack-objects command
  repack: refactor finding pack prefix
  repack: add `--filter=<filter-spec>` option
  gc: add `gc.repackFilter` config option
  repack: implement `--filter-to` for storing filtered out objects
  gc: add `gc.repackFilterTo` config option

 Documentation/config/gc.txt            |  16 ++
 Documentation/git-pack-objects.txt     |   4 +-
 Documentation/git-repack.txt           |  23 +++
 Makefile                               |   1 +
 builtin/gc.c                           |  10 ++
 builtin/pack-objects.c                 |   8 +-
 builtin/repack.c                       | 169 +++++++++++++++------
 t/helper/test-find-pack.c              |  50 +++++++
 t/helper/test-tool.c                   |   1 +
 t/helper/test-tool.h                   |   1 +
 t/t0080-find-pack.sh                   |  82 +++++++++++
 t/t5317-pack-objects-filter-objects.sh |   8 +
 t/t6500-gc.sh                          |  24 +++
 t/t7700-repack.sh                      | 196 +++++++++++++++++++++++++
 14 files changed, 543 insertions(+), 50 deletions(-)
 create mode 100644 t/helper/test-find-pack.c
 create mode 100755 t/t0080-find-pack.sh

-- 
2.42.0.rc0.8.g76fac86b0e


^ permalink raw reply	[relevance 1%]

* [PATCH v4 5/8] repack: add `--filter=<filter-spec>` option
  2023-08-08  8:26  1%     ` [PATCH v4 0/8] Repack objects into separate packfiles based on a filter Christian Couder
@ 2023-08-08  8:26  2%       ` Christian Couder
    1 sibling, 0 replies; 200+ results
From: Christian Couder @ 2023-08-08  8:26 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some blobs take up a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

It's possible to find which new packfile contains the filtered out
objects using one of the following:

  - `git verify-pack -v ...`,
  - `test-tool find-pack ...`, which a previous commit added,
  - `--filter-to=<dir>`, which a following commit will add to specify
    where the pack containing the filtered out objects will be.

This feature is implemented by running `git pack-objects` twice in a
row. The first command is run with `--filter=<filter-spec>`, using the
specified filter. It packs objects while omitting the objects specified
by the filter. Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

As the interactions with kept packs are a bit tricky, a few related
tests are added.

Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  12 ++++
 builtin/repack.c             |  75 ++++++++++++++++++++
 t/t7700-repack.sh            | 134 +++++++++++++++++++++++++++++++++++
 3 files changed, 221 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..6d5bec7716 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,18 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  Also `--no-write-bitmap-index` (or the
+	`repack.writebitmaps` config option set to `false`) should be
+	used otherwise writing bitmap index will fail, as it supposes
+	a single packfile containing all the objects. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 4e40f4c04e..876c115cdc 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -21,6 +21,7 @@
 #include "pack.h"
 #include "pack-bitmap.h"
 #include "refs.h"
+#include "list-objects-filter-options.h"
 
 #define ALL_INTO_ONE 1
 #define LOOSEN_UNREACHABLE 2
@@ -57,6 +58,7 @@ struct pack_objects_args {
 	int no_reuse_object;
 	int quiet;
 	int local;
+	struct list_objects_filter_options filter_options;
 };
 
 static int repack_config(const char *var, const char *value,
@@ -726,6 +728,57 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct string_list *keep_pack_list,
+			       struct string_list *names,
+			       struct string_list *existing_packs,
+			       struct string_list *existing_kept_packs)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret, i;
+	const char *caret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	prepare_pack_objects(&cmd, args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	if (!pack_kept_objects)
+		strvec_push(&cmd.args, "--honor-pack-keep");
+	for (i = 0; i < keep_pack_list->nr; i++)
+		strvec_pushf(&cmd.args, "--keep-pack=%s",
+			     keep_pack_list->items[i].string);
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * Here 'names' contains only the pack(s) that were just
+	 * written, which is exactly the packs we want to keep. Also
+	 * 'existing_kept_packs' already contains the packs in
+	 * 'keep_pack_list'.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, existing_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	caret = pack_kept_objects ? "" : "^";
+	for_each_string_list_item(item, existing_kept_packs)
+		fprintf(in, "%s%s.pack\n", caret, item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -858,6 +911,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_PARSE_LIST_OBJECTS_FILTER(&po_args.filter_options),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -871,6 +925,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	list_objects_filter_init(&po_args.filter_options);
+	list_objects_filter_init(&cruft_po_args.filter_options);
+
 	git_config(repack_config, &cruft_po_args);
 
 	argc = parse_options(argc, argv, prefix, builtin_repack_options,
@@ -1011,6 +1068,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		strvec_push(&cmd.args, "--incremental");
 	}
 
+	if (po_args.filter_options.choice)
+		strvec_pushf(&cmd.args, "--filter=%s",
+			     expand_list_objects_filter_spec(&po_args.filter_options));
+
 	if (geometry)
 		cmd.in = -1;
 	else
@@ -1097,6 +1158,18 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter_options.choice) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(packdir, packtmp),
+					  &keep_pack_list,
+					  &names,
+					  &existing_nonkept_packs,
+					  &existing_kept_packs);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
@@ -1231,6 +1304,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	string_list_clear(&existing_nonkept_packs, 0);
 	string_list_clear(&existing_kept_packs, 0);
 	clear_pack_geometry(geometry);
+	list_objects_filter_release(&po_args.filter_options);
+	list_objects_filter_release(&cruft_po_args.filter_options);
 
 	return ret;
 }
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 27b66807cd..5d3e53134c 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -327,6 +327,140 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) &&
+	blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack -c 1 HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack -c 1 HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
+test_expect_success '--filter fails with --write-bitmap-index' '
+	GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 test_must_fail git -C bare.git repack \
+		-a -d --write-bitmap-index --filter=blob:none
+'
+
+test_expect_success 'repacking with two filters works' '
+	git init two-filters &&
+	(
+		cd two-filters &&
+		mkdir subdir &&
+		test_commit foo &&
+		test_commit subdir_bar subdir/bar &&
+		test_commit subdir_baz subdir/baz
+	) &&
+	git clone --no-local --bare two-filters two-filters.git &&
+	(
+		cd two-filters.git &&
+		test_stdout_line_count = 1 ls objects/pack/*.pack &&
+		git -c repack.writebitmaps=false repack -a -d \
+			--filter=blob:none --filter=tree:1 &&
+		test_stdout_line_count = 2 ls objects/pack/*.pack &&
+		commit_pack=$(test-tool find-pack -c 1 HEAD) &&
+		blob_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		root_tree_pack=$(test-tool find-pack -c 1 HEAD^{tree}) &&
+		subdir_tree_hash=$(git ls-tree --object-only HEAD -- subdir) &&
+		subdir_tree_pack=$(test-tool find-pack -c 1 "$subdir_tree_hash") &&
+
+		# Root tree and subdir tree are not in the same packfiles
+		test "$commit_pack" != "$blob_pack" &&
+		test "$commit_pack" = "$root_tree_pack" &&
+		test "$blob_pack" = "$subdir_tree_pack"
+	)
+'
+
+prepare_for_keep_packs () {
+	git init keep-packs &&
+	(
+		cd keep-packs &&
+		test_commit foo &&
+		test_commit bar
+	) &&
+	git clone --no-local --bare keep-packs keep-packs.git &&
+	(
+		cd keep-packs.git &&
+
+		# Create two packs
+		# The first pack will contain all of the objects except one blob
+		git rev-list --objects --all >objs &&
+		grep -v "bar.t" objs | git pack-objects pack &&
+		# The second pack will contain the excluded object and be kept
+		packid=$(grep "bar.t" objs | git pack-objects pack) &&
+		>pack-$packid.keep &&
+
+		# Replace the existing pack with the 2 new ones
+		rm -f objects/pack/pack* &&
+		mv pack-* objects/pack/
+	)
+}
+
+test_expect_success '--filter works with .keep packs' '
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack_1=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		# Object bar is still only in the old .keep pack
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$bar_pack_1" = "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		test "$foo_pack_1" != "$bar_pack_1" &&
+		test "$foo_pack_1" != "$head_pack_1" &&
+		test "$bar_pack_1" != "$head_pack_1"
+	)
+'
+
+test_expect_success '--filter works with --pack-kept-objects and .keep packs' '
+	rm -rf keep-packs keep-packs.git &&
+	prepare_for_keep_packs &&
+	(
+		cd keep-packs.git &&
+
+		foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) &&
+		head_pack=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack" != "$bar_pack" &&
+		test "$foo_pack" = "$head_pack" &&
+
+		git -c repack.writebitmaps=false repack -a -d --filter=blob:none \
+			--pack-kept-objects &&
+
+		foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) &&
+		test-tool find-pack -c 2 HEAD:bar.t >bar_pack_1 &&
+		head_pack_1=$(test-tool find-pack -c 1 HEAD) &&
+
+		test "$foo_pack_1" != "$foo_pack" &&
+		test "$foo_pack_1" != "$bar_pack" &&
+		test "$head_pack_1" != "$head_pack" &&
+
+		# Object bar is in both the old .keep pack and the new
+		# pack that contained the filtered out objects
+		grep "$bar_pack" bar_pack_1 &&
+		grep "$foo_pack_1" bar_pack_1 &&
+		test "$foo_pack_1" != "$head_pack_1"
+	)
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.42.0.rc0.8.g76fac86b0e


^ permalink raw reply related	[relevance 2%]

* Re: .gitignore is not enough
  2023-08-03 21:38  4%     ` brian m. carlson
@ 2023-08-03 21:47  0%       ` Aleem Zaki
  0 siblings, 0 replies; 200+ results
From: Aleem Zaki @ 2023-08-03 21:47 UTC (permalink / raw)
  To: brian m. carlson; +Cc: Johannes Sixt, Hilco Wijbenga, git

I understand, I shall copy the empty config and paste into a new ignored file where I then add my personal customizations. 

What if, however, all git commands besides ‘git pull’ and ‘git fetch’, are able to modify the files in question. Would we then have a potential new git feature?

> On Aug 3, 2023, at 2:38 PM, brian m. carlson <sandals@crustytoothpaste.net> wrote:
> 
> On 2023-08-03 at 17:17:15, Johannes Sixt wrote:
>>> Am 03.08.23 um 07:35 schrieb Hilco Wijbenga:
>>> I think you might be looking for "git update-index --assume-unchanged
>>> <file>"? See https://www.git-scm.com/docs/git-update-index for more
>>> details.
>> 
>> Sorry to tell you that this is a myth that lives on because it is
>> repeated over and over again.
> 
> This is indeed false.
> 
>>> This allows you to tell Git to ignore the changes you made to that
>>> (tracked) file.
>> 
>> No. --assume-unchanged allows you to make the *promise* to Git that you
>> will not change the file, and consequently Git does not have to check
>> whether the file was changed. If you break the promise (because you
>> change it), you will get what you deserve. For example, you may find
>> that Git overwrites your changes, or commits them nevertheless.
>> 
>> Perhaps a better choice is --skip-worktree, but recent answers on
>> Stackoverflow point out that even that is not a suitable solution for
>> "please, Git, ignore these changes".
> 
> Neither of these is an acceptable option.  Here's an entry from the FAQ,
> which I have referred to several times (on StackOverflow and elsewhere):
> 
> How do I ignore changes to a tracked file?
> 
>  Git doesn't provide a way to do this.  The reason is that if Git needs
>  to overwrite this file, such as during a checkout, it doesn't know
>  whether the changes to the file are precious and should be kept, or
>  whether they are irrelevant and can safely be destroyed.  Therefore,
>  it has to take the safe route and always preserve them.
> 
>  It's tempting to try to use certain features of `git update-index`,
>  namely the assume-unchanged and skip-worktree bits, but these don't
>  work properly for this purpose and shouldn't be used this way.
> 
>  If your goal is to modify a configuration file, it can often be
>  helpful to have a file checked into the repository which is a template
>  or set of defaults which can then be copied alongside and modified as
>  appropriate.  This second, modified file is usually ignored to prevent
>  accidentally committing it.
> 
> There's no option to do this and you should adopt a different approach.
> Probably 95% of the circumstances I see where people are trying to
> ignore tracked files can be done by moving the original file to another
> path and using a script to copy and modify the file to an ignored path.
> -- 
> brian m. carlson (he/him or they/them)
> Toronto, Ontario, CA

^ permalink raw reply	[relevance 0%]

* Re: .gitignore is not enough
  @ 2023-08-03 21:38  4%     ` brian m. carlson
  2023-08-03 21:47  0%       ` Aleem Zaki
  0 siblings, 1 reply; 200+ results
From: brian m. carlson @ 2023-08-03 21:38 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Hilco Wijbenga, git, Aleem Zaki

[-- Attachment #1: Type: text/plain, Size: 2464 bytes --]

On 2023-08-03 at 17:17:15, Johannes Sixt wrote:
> Am 03.08.23 um 07:35 schrieb Hilco Wijbenga:
> > I think you might be looking for "git update-index --assume-unchanged
> > <file>"? See https://www.git-scm.com/docs/git-update-index for more
> > details.
> 
> Sorry to tell you that this is a myth that lives on because it is
> repeated over and over again.

This is indeed false.

> > This allows you to tell Git to ignore the changes you made to that
> > (tracked) file.
> 
> No. --assume-unchanged allows you to make the *promise* to Git that you
> will not change the file, and consequently Git does not have to check
> whether the file was changed. If you break the promise (because you
> change it), you will get what you deserve. For example, you may find
> that Git overwrites your changes, or commits them nevertheless.
> 
> Perhaps a better choice is --skip-worktree, but recent answers on
> Stackoverflow point out that even that is not a suitable solution for
> "please, Git, ignore these changes".

Neither of these is an acceptable option.  Here's an entry from the FAQ,
which I have referred to several times (on StackOverflow and elsewhere):

How do I ignore changes to a tracked file?

  Git doesn't provide a way to do this.  The reason is that if Git needs
  to overwrite this file, such as during a checkout, it doesn't know
  whether the changes to the file are precious and should be kept, or
  whether they are irrelevant and can safely be destroyed.  Therefore,
  it has to take the safe route and always preserve them.

  It's tempting to try to use certain features of `git update-index`,
  namely the assume-unchanged and skip-worktree bits, but these don't
  work properly for this purpose and shouldn't be used this way.

  If your goal is to modify a configuration file, it can often be
  helpful to have a file checked into the repository which is a template
  or set of defaults which can then be copied alongside and modified as
  appropriate.  This second, modified file is usually ignored to prevent
  accidentally committing it.

There's no option to do this and you should adopt a different approach.
Probably 95% of the circumstances I see where people are trying to
ignore tracked files can be done by moving the original file to another
path and using a script to copy and modify the file to an ignored path.
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 263 bytes --]

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option
  2023-07-05 17:53  0%     ` Junio C Hamano
@ 2023-07-24  9:01  0%       ` Christian Couder
  0 siblings, 0 replies; 200+ results
From: Christian Couder @ 2023-07-24  9:01 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: git, John Cai, Jonathan Tan, Jonathan Nieder, Taylor Blau,
	Derrick Stolee, Patrick Steinhardt, Christian Couder

On Wed, Jul 5, 2023 at 7:53 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Christian Couder <christian.couder@gmail.com> writes:
>
> > This could be useful if, for example, some large blobs take a lot of
> > precious space on fast storage while they are rarely accessed. It could
> > make sense to move them into a separate cheaper, though slower, storage.
> >
> > In other use cases it might make sense to put all the blobs into
> > separate storage.
>
> Minor nit.  Aren't the above two the same use case?

In the first case only some large blobs are moved to slower storage
and in the other case all the blobs are moved to slower storage. So
yeah the use cases are very similar. Not sure if and how I can improve
the above wording though.

> > This is done by running two `git pack-objects` commands. The first one
> > is run with `--filter=<filter-spec>`, using the specified filter. It
> > packs objects while omitting the objects specified by the filter.
> > Then another `git pack-objects` command is launched using
> > `--stdin-packs`. We pass it all the previously existing packs into its
> > stdin, so that it will pack all the objects in the previously existing
> > packs. But we also pass into its stdin, the pack created by the previous
> > `git pack-objects --filter=<filter-spec>` command as well as the kept
> > packs, all prefixed with '^', so that the objects in these packs will be
> > omitted from the resulting pack.
>
> When I started reading the paragraph, the first question that came
> to my mind was if these two pack-objects processes can and should be
> run in parallel, which is answered in the part near the end of the
> paragraph.  It may be a good idea to start the paragraph with "by
> running `git pack-objects` command twice in a row" or something to
> make it clear that one should (and cannot be) run before the other
> completes.

Ok, in version 3 that I just sent, that paragraph starts with:

"
   This is done by running `git pack-objects` twice in a row. The first
   command is run with `--filter=<filter-spec>`, using the specified
   filter.
"

> In fact, isn't the call site of write_filtered_pack() in this patch
> a bit too early?  The subprocess that runs with "--stdin-packs" is
> started and told about the names of the pack we are going to create,
> and it does not start processing until it reads everything (i.e. we
> run fclose(in) in the write_filtered_pack() function), but the loop
> over "names" string list in the caller that moves the tempfiles to
> their final filenames comes after the call to close_object_store()
> we see in the post context of the call to write_filtered_pack() that
> is new in this patch.

I think it can work if the call to write_filtered_pack() is either
before the call to close_object_store() or after it. It would just use
the tempfiles with their temporary name in the first case and with
their final name in the second case.

write_filtered_pack() is very similar to write_cruft_pack() which is
called before the call to close_object_store(), so I prefer to keep it
before that call too, if possible, for consistency.

> The "--stdin-packs" one is told to exclude objects that appear in
> these packs, so if the main process is a bit slow to finalize the
> packfiles it created (and told the "--stdin-packs" process about),
> it will not lead to repository corruption---just some objects are
> included in the packfiles "--stdin-packs" one creates even though
> they do not have to.  So it does not sound like a huge problem to
> me, but still it somehow looks wrong.  Am I misreading the code?

I would have thought that as finish_pack_objects_cmd() calls
finish_command() the first pack-objects command (which is called
without --stdout) should be completely finished and the packfiles
fully created when write_filtered_pack() (or write_cruft_pack()) is
called, even if the object store is not closed, but you might be
right.

Perhaps this could be dealt with separately though, as I think we
might want to fix write_cruft_pack() first then.

^ permalink raw reply	[relevance 0%]

* [PATCH v3 5/8] repack: add `--filter=<filter-spec>` option
  2023-07-24  8:59  1%   ` [PATCH v3 0/8] Repack objects into separate packfiles based on a filter Christian Couder
@ 2023-07-24  8:59  2%     ` Christian Couder
  2023-08-08  8:26  1%     ` [PATCH v4 0/8] Repack objects into separate packfiles based on a filter Christian Couder
  1 sibling, 0 replies; 200+ results
From: Christian Couder @ 2023-07-24  8:59 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some large blobs take up a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

In other use cases it might make sense to put all the blobs into
separate storage.

It's possible to find which new packfile contains the filtered out
objects using one of the following:

  - `git verify-pack -v ...`,
  - `test-tool find-pack ...`, which a previous commit added,
  - `--filter-to=<dir>`, which a following commit will add to specify
    where the pack containing the filtered out objects will be.

This feature is implemented by running `git pack-objects` twice in a
row. The first command is run with `--filter=<filter-spec>`, using the
specified filter. It packs objects while omitting the objects specified
by the filter. Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt | 12 +++++++
 builtin/repack.c             | 67 ++++++++++++++++++++++++++++++++++++
 t/t7700-repack.sh            | 24 +++++++++++++
 3 files changed, 103 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..6d5bec7716 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,18 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  Also `--no-write-bitmap-index` (or the
+	`repack.writebitmaps` config option set to `false`) should be
+	used otherwise writing bitmap index will fail, as it supposes
+	a single packfile containing all the objects. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 21e3b89f27..2c81b7738e 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -53,6 +53,7 @@ struct pack_objects_args {
 	const char *depth;
 	const char *threads;
 	const char *max_pack_size;
+	const char *filter;
 	int no_reuse_delta;
 	int no_reuse_object;
 	int quiet;
@@ -166,6 +167,8 @@ static void prepare_pack_objects(struct child_process *cmd,
 		strvec_pushf(&cmd->args, "--threads=%s", args->threads);
 	if (args->max_pack_size)
 		strvec_pushf(&cmd->args, "--max-pack-size=%s", args->max_pack_size);
+	if (args->filter)
+		strvec_pushf(&cmd->args, "--filter=%s", args->filter);
 	if (args->no_reuse_delta)
 		strvec_pushf(&cmd->args, "--no-reuse-delta");
 	if (args->no_reuse_object)
@@ -726,6 +729,57 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct string_list *names,
+			       struct string_list *existing_packs,
+			       struct string_list *existing_kept_packs)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	/* We need to copy 'args' to modify it */
+	struct pack_objects_args new_args = *args;
+
+	/* No need to filter again */
+	new_args.filter = NULL;
+
+	prepare_pack_objects(&cmd, &new_args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * names has a confusing double use: it both provides the list
+	 * of just-written new packs, and accepts the name of the
+	 * filtered pack we are writing.
+	 *
+	 * 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.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, existing_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	for_each_string_list_item(item, existing_kept_packs)
+		fprintf(in, "^%s.pack\n", item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -858,6 +912,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_STRING(0, "filter", &po_args.filter, N_("args"),
+				N_("object filtering")),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -1097,6 +1153,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(),
+					  &names,
+					  &existing_nonkept_packs,
+					  &existing_kept_packs);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 27b66807cd..0a2c73bca7 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -327,6 +327,30 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack HEAD) &&
+	test -n "$commit_pack" &&
+	blob_pack=$(test-tool -C bare.git find-pack HEAD:file1) &&
+	test -n "$blob_pack" &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
+test_expect_success '--filter fails with --write-bitmap-index' '
+	test_must_fail git -C bare.git repack -a -d --write-bitmap-index \
+		--filter=blob:none &&
+
+	git -C bare.git repack -a -d --no-write-bitmap-index \
+		--filter=blob:none
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.41.0.384.ged66511823


^ permalink raw reply related	[relevance 2%]

* [PATCH v3 0/8] Repack objects into separate packfiles based on a filter
    2023-07-05  6:08  2%   ` [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
@ 2023-07-24  8:59  1%   ` Christian Couder
  2023-07-24  8:59  2%     ` [PATCH v3 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
  2023-08-08  8:26  1%     ` [PATCH v4 0/8] Repack objects into separate packfiles based on a filter Christian Couder
  1 sibling, 2 replies; 200+ results
From: Christian Couder @ 2023-07-24  8:59 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder

# Intro

Last year, John Cai sent 2 versions of a patch series to implement
`git repack --filter=<filter-spec>` and later I sent 4 versions of a
patch series trying to do it a bit differently:

  - https://lore.kernel.org/git/pull.1206.git.git.1643248180.gitgitgadget@gmail.com/
  - https://lore.kernel.org/git/20221012135114.294680-1-christian.couder@gmail.com/

In these patch series, the `--filter=<filter-spec>` removed the
filtered out objects altogether which was considered very dangerous
even though we implemented different safety checks in some of the
latter series.

In some discussions, it was mentioned that such a feature, or a
similar feature in `git gc`, or in a new standalone command (perhaps
called `git prune-filtered`), should put the filtered out objects into
a new packfile instead of deleting them.

Recently there were internal discussions at GitLab about either moving
blobs from inactive repos onto cheaper storage, or moving large blobs
onto cheaper storage. This lead us to rethink at repacking using a
filter, but moving the filtered out objects into a separate packfile
instead of deleting them.

So here is a new patch series doing that while implementing the
`--filter=<filter-spec>` option in `git repack`.

# Use cases for the new feature

This could be useful for example for the following purposes:

  1) As a way for servers to save storage costs by for example moving
     large blobs, or all the blobs, or all the blobs in inactive
     repos, to separate storage (while still making them accessible
     using for example the alternates mechanism).

  2) As a way to use partial clone on a Git server to offload large
     blobs to, for example, an http server, while using multiple
     promisor remotes (to be able to access everything) on the client
     side. (In this case the packfile that contains the filtered out
     object can be manualy removed after checking that all the objects
     it contains are available through the promisor remote.)

  3) As a way for clients to reclaim some space when they cloned with
     a filter to save disk space but then fetched a lot of unwanted
     objects (for example when checking out old branches) and now want
     to remove these unwanted objects. (In this case they can first
     move the packfile that contains filtered out objects to a
     separate directory or storage, then check that everything works
     well, and then manually remove the packfile after some time.)

As the features and the code are quite different from those in the
previous series, I decided to start a new series instead of continuing
a previous one.

Also since version 2 of this new series, commit messages, don't
mention uses cases like 2) or 3) above, as people have different
opinions on how it should be done. How it should be done could depend
a lot on the way promisor remotes are used, the software and hardware
setups used, etc, so it seems more difficult to "sell" this series by
talking about such use cases. As use case 1) seems simpler and more
appealing, it makes more sense to only talk about it in the commit
messages.

# Changes since version 2

Thanks to Junio who reviewed both version 1 and 2, and to Taylor who
reviewed version 1! The changes are the following:

- In patch 5/8, which introduces `--filter=<filter-spec>` option, some
  explanations about how to find which new packfile contains the
  filtered out objects have been added to the commit message following
  Junio's comments.

- In patch 5/8, it was clarified in the commit message that `git
  pack-objects` is run twice in row (and not in parallel) to implement
  the new option according to Junio's comments.

- In patch 5/8 also, the documentaion of the new option says that
  `--no-write-bitmap-index` (or the ++ `repack.writebitmaps` config
  option set to `false`) should be used along with the option as
  otherwise writing bitmap index will fail. And a corresponding new
  test called '--filter fails with --write-bitmap-index' has been
  added to t/t7700-repack.sh. This should address Taylor's comments
  about v1 that were not addressed by v2.

- In patch 7/8, which implements the `--filter-to=<dir>` option, the
  commit message now recommends using Git alternates mechanism before
  this option is used to make sure the directory specified by the new
  option is accessible by the repo as it could otherwise corrupt the
  repo. It also says that in some cases it might not be necessary to
  use such a mechanism, which is why the feature doesn't check that
  directory specified is accessible. The documentation of the new
  option also loudly warns that the repo could be corrupted if the Git
  alternates mechanism, and has a new link to that mechanism's
  documentation. This is to address Junio's comments.

- In patch 8/8, which implements the `gc.repackFilterTo` config
  option, a similar loud warning has been added, and similar doc
  changes have been made, to the documentation of the new config
  option (which corresponds to the `--filter-to=<dir>` command line
  option).

# Commit overview

* 1/8 pack-objects: allow `--filter` without `--stdout`

  This patch is the same as in v1 and v2. To be able to later repack
  with a filter we need `git pack-objects` to write packfiles when
  it's filtering instead of just writing the pack without the filtered
  out objects to stdout.

* 2/8 t/helper: add 'find-pack' test-tool

  No change in this patch compared to v1 and v2. For testing `git
  repack --filter=...` that we are going to implement, it's useful to
  have a test helper that can tell which packfiles contain a specific
  object.

* 3/8 repack: refactor finishing pack-objects command

  No change in this patch compared to v2. This is a small refactoring
  creating a new useful function, so that `git repack --filter=...`
  will be able to reuse it.

* 4/8 repack: refactor finding pack prefix

  No change in this patch compared to v2. This is another small
  refactoring creating a small function that will be reused in the
  next patch.

* 5/8 repack: add `--filter=<filter-spec>` option

  This actually adds the `--filter=<filter-spec>` option. It uses one
  `git pack-objects` process with the `--filter` option. And then
  another `git pack-objects` process with the `--stdin-packs`
  option. Only the commit message, documentation and tests have been
  changed a bit since v2.

* 6/8 gc: add `gc.repackFilter` config option

  No change in this patch compared to v2 and v1. This is a gc config
  option so that `git gc` can also repack using a filter and put the
  filtered out objects into a separate packfile.

* 7/8 repack: implement `--filter-to` for storing filtered out objects

  For some use cases, it's interesting to create the packfile that
  contains the filtered out objects into a separate location. This is
  similar to the `--expire-to` option for cruft packfiles. Only the
  commit message and the documentation have changed since version
  2. They now explain and discuss the risks of using this option
  without making sure the specified directory is not accessible by the
  repo.

* 8/8 gc: add `gc.repackFilterTo` config option

  This allows specifying the location of the packfile that contains
  the filtered out objects when using `gc.repackFilter`. As with the
  previous commit, since v2, the doc now explain and discuss the risks
  of using this option without making sure the specified directory is
  not accessible by the repo.

# Range-diff since v2

1:  0bd1ad3071 = 1:  4d75a1d7c3 pack-objects: allow `--filter` without `--stdout`
2:  e49cd723c7 = 2:  fdf9b6e8cc t/helper: add 'find-pack' test-tool
3:  3f87772ea6 = 3:  e7cfdebc78 repack: refactor finishing pack-objects command
4:  9997efaf33 = 4:  9c51063795 repack: refactor finding pack prefix
5:  da27ecb91b ! 5:  a90e8045c3 repack: add `--filter=<filter-spec>` option
    @@ Commit message
         This new option puts the objects specified by `<filter-spec>` into a
         separate packfile.
     
    -    This could be useful if, for example, some large blobs take a lot of
    +    This could be useful if, for example, some large blobs take up a lot of
         precious space on fast storage while they are rarely accessed. It could
         make sense to move them into a separate cheaper, though slower, storage.
     
         In other use cases it might make sense to put all the blobs into
         separate storage.
     
    -    This is done by running two `git pack-objects` commands. The first one
    -    is run with `--filter=<filter-spec>`, using the specified filter. It
    -    packs objects while omitting the objects specified by the filter.
    -    Then another `git pack-objects` command is launched using
    +    It's possible to find which new packfile contains the filtered out
    +    objects using one of the following:
    +
    +      - `git verify-pack -v ...`,
    +      - `test-tool find-pack ...`, which a previous commit added,
    +      - `--filter-to=<dir>`, which a following commit will add to specify
    +        where the pack containing the filtered out objects will be.
    +
    +    This feature is implemented by running `git pack-objects` twice in a
    +    row. The first command is run with `--filter=<filter-spec>`, using the
    +    specified filter. It packs objects while omitting the objects specified
    +    by the filter. Then another `git pack-objects` command is launched using
         `--stdin-packs`. We pass it all the previously existing packs into its
         stdin, so that it will pack all the objects in the previously existing
         packs. But we also pass into its stdin, the pack created by the previous
    @@ Documentation/git-repack.txt: depth is 4095.
     +  that objects used in the working directory are not filtered
     +  out. So for the split to fully work, it's best to perform it
     +  in a bare repo and to use the `-a` and `-d` options along with
    -+  this option.  See linkgit:git-rev-list[1] for valid
    -+  `<filter-spec>` forms.
    ++  this option.  Also `--no-write-bitmap-index` (or the
    ++  `repack.writebitmaps` config option set to `false`) should be
    ++  used otherwise writing bitmap index will fail, as it supposes
    ++  a single packfile containing all the objects. See
    ++  linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
     +
      -b::
      --write-bitmap-index::
    @@ t/t7700-repack.sh: test_expect_success 'auto-bitmaps do not complain if unavaila
     +  blob_pack2=$(test-tool -C bare.git find-pack HEAD:file2) &&
     +  test "$blob_pack2" = "$blob_pack"
     +'
    ++
    ++test_expect_success '--filter fails with --write-bitmap-index' '
    ++  test_must_fail git -C bare.git repack -a -d --write-bitmap-index \
    ++          --filter=blob:none &&
    ++
    ++  git -C bare.git repack -a -d --no-write-bitmap-index \
    ++          --filter=blob:none
    ++'
     +
      objdir=.git/objects
      midx=$objdir/pack/multi-pack-index
6:  49e4a184b4 = 6:  335b7f614d gc: add `gc.repackFilter` config option
7:  243c93aad3 ! 7:  b1be7f60b7 repack: implement `--filter-to` for storing filtered out objects
    @@ Commit message
         It would be nice if this new different pack could be created in a
         different directory than the regular pack. This would make it possible
         to move large blobs into a pack on a different kind of storage, for
    -    example cheaper storage. Even in a different directory this pack can be
    -    accessible if, for example, the Git alternates mechanism is used to
    -    point to it.
    +    example cheaper storage.
    +
    +    Even in a different directory, this pack can be accessible if, for
    +    example, the Git alternates mechanism is used to point to it. In fact
    +    not using the Git alternates mechanism can corrupt a repo as the
    +    generated pack containing the filtered objects might not be accessible
    +    from the repo any more. So setting up the Git alternates mechanism
    +    should be done before using this feature if the user wants the repo to
    +    be fully usable while this feature is used.
    +
    +    In some cases, like when a repo has just been cloned or when there is no
    +    other activity in the repo, it's Ok to setup the Git alternates
    +    mechanism afterwards though. It's also Ok to just inspect the generated
    +    packfile containing the filtered objects and then just move it into the
    +    '.git/objects/pack/' directory manually. That's why it's not necessary
    +    for this command to check that the Git alternates mechanism has been
    +    already setup.
     
         While at it, as an example to show that `--filter` and `--filter-to`
         work well with other options, let's also add a test to check that these
    @@ Commit message
     
      ## Documentation/git-repack.txt ##
     @@ Documentation/git-repack.txt: depth is 4095.
    -   this option.  See linkgit:git-rev-list[1] for valid
    -   `<filter-spec>` forms.
    +   a single packfile containing all the objects. See
    +   linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
      
     +--filter-to=<dir>::
     +  Write the pack containing filtered out objects to the
    -+  directory `<dir>`. This can be used for putting the pack on a
    -+  separate object directory that is accessed through the Git
    -+  alternates mechanism. Only useful with `--filter`.
    ++  directory `<dir>`. Only useful with `--filter`. This can be
    ++  used for putting the pack on a separate object directory that
    ++  is accessed through the Git alternates mechanism. **WARNING:**
    ++  If the packfile containing the filtered out objects is not
    ++  accessible, the repo could be considered corrupt by Git as it
    ++  migh not be able to access the objects in that packfile. See
    ++  the `objects` and `objects/info/alternates` sections of
    ++  linkgit:gitrepository-layout[5].
     +
      -b::
      --write-bitmap-index::
    @@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix
                                          &existing_nonkept_packs,
     
      ## t/t7700-repack.sh ##
    -@@ t/t7700-repack.sh: test_expect_success 'repacking with a filter works' '
    -   test "$blob_pack2" = "$blob_pack"
    +@@ t/t7700-repack.sh: test_expect_success '--filter fails with --write-bitmap-index' '
    +           --filter=blob:none
      '
      
     +test_expect_success '--filter-to stores filtered out objects' '
8:  8cb3faa74c ! 8:  ed66511823 gc: add `gc.repackFilterTo` config option
    @@ Documentation/config/gc.txt: gc.repackFilter::
     +gc.repackFilterTo::
     +  When repacking and using a filter, see `gc.repackFilter`, the
     +  specified location will be used to create the packfile
    -+  containing the filtered out objects.  See the
    -+  `--filter-to=<dir>` option of linkgit:git-repack[1].
    ++  containing the filtered out objects. **WARNING:** The
    ++  specified location should be accessible, using for example the
    ++  Git alternates mechanism, otherwise the repo could be
    ++  considered corrupt by Git as it migh not be able to access the
    ++  objects in that packfile. See the `--filter-to=<dir>` option
    ++  of linkgit:git-repack[1] and the `objects/info/alternates`
    ++  section of linkgit:gitrepository-layout[5].
     +
      gc.rerereResolved::
        Records of conflicted merge you resolved earlier are


Christian Couder (8):
  pack-objects: allow `--filter` without `--stdout`
  t/helper: add 'find-pack' test-tool
  repack: refactor finishing pack-objects command
  repack: refactor finding pack prefix
  repack: add `--filter=<filter-spec>` option
  gc: add `gc.repackFilter` config option
  repack: implement `--filter-to` for storing filtered out objects
  gc: add `gc.repackFilterTo` config option

 Documentation/config/gc.txt            |  16 +++
 Documentation/git-pack-objects.txt     |   4 +-
 Documentation/git-repack.txt           |  23 ++++
 Makefile                               |   1 +
 builtin/gc.c                           |  10 ++
 builtin/pack-objects.c                 |   8 +-
 builtin/repack.c                       | 162 ++++++++++++++++++-------
 t/helper/test-find-pack.c              |  35 ++++++
 t/helper/test-tool.c                   |   1 +
 t/helper/test-tool.h                   |   1 +
 t/t5317-pack-objects-filter-objects.sh |   8 ++
 t/t6500-gc.sh                          |  23 ++++
 t/t7700-repack.sh                      |  90 ++++++++++++++
 13 files changed, 332 insertions(+), 50 deletions(-)
 create mode 100644 t/helper/test-find-pack.c

-- 
2.41.0.384.ged66511823


^ permalink raw reply	[relevance 1%]

* Re: Lost files after git stash && git stash pop
  2023-07-22 21:44  4% ` Torsten Bögershausen
@ 2023-07-23 10:01  0%   ` Phillip Wood
  0 siblings, 0 replies; 200+ results
From: Phillip Wood @ 2023-07-23 10:01 UTC (permalink / raw)
  To: Torsten Bögershausen, Till Friebe; +Cc: git

On 22/07/2023 22:44, Torsten Bögershausen wrote:
> On Fri, Jul 21, 2023 at 07:31:53PM +0200, Till Friebe wrote:
>> Thank you for filling out a Git bug report!
>> Please answer the following questions to help us understand your issue.
>>
>> What did you do before the bug happened? (Steps to reproduce your issue)
>> ```
>> git init
>> mkdir README
>> touch README/README
>> git add .
>> git commit -m "Init project"
>> echo "Test" > README/README
>> mv README/README README2
>> rmdir README
>> mv README2 README
>> git stash
>> git stash pop
>> ```
>>
>> What did you expect to happen? (Expected behavior)
>> I expected that after the `git stash pop` the README file would be back.
>>
>> What happened instead? (Actual behavior)
>> This README with "Test" file was deleted and I lost 5 hours of work.
> 
> That is always sad to hear, when work is lost.

Indeed it is. Thanks Till for providing an easy reproducer.

> However, I personally wonder if this is a bug or not.

I think whenever git overwrites an untracked file without the user 
passing some option indicating that they want to do so it is a bug. For 
example "git checkout" refuses to overwrite untracked files by default. 
Sadly this seems to be a known bug in do_push_stash() where we are using 
"git reset --hard" to remove the stashed changes from the working copy. 
This was documented in 94b7f1563a (Comment important codepaths regarding 
nuking untracked files/dirs, 2021-09-27). The stash implementation does 
a lot of necessary forking of subprocesses, in this case I think it 
would be better to call unpack_trees() directly with 
UNPACK_RESET_PROTECT_UNTRACKED.

Best Wishes

Phillip

> First, Git is told to track a file called README/README
> Then the file is removed, without telling Git.
> And a new, unkown file appers on disk (which collides with the name
> of the directory)
> 
> Using this sequence could have told Git, what is going on:
> git mv README/README README2
> rmdir README
> git mv README2 README
> 
> (a temporary branch may be checked out, with the option
>   to merge-squash the final result)
> 
> 
> An other alternative could be to tell `git stash` to care
> about untracked file(s):
> 
> git stash -u
> git stash pop
> 
> Which will refuse to apply the stash.
> 
> A third alternative could be to keep the file inside an
> editor, to have the content still available.
> 
> However, it would/could be nice, if files are not simply deleted,
> but saved into a "lost+found" folder, or a wastebasket kind of thing.
> 
> But which files ?
> Those that are untracked ?
> They may be important (local config files, passwords, help scripts, ...)
> or not (.o files from a C compiler).
> 
> In some older discussions they had been named "precious" files.
> But, as far as I remember, there was no easy solution.
> In that sense I don't have a better answer.
> Others may have.
> 
> Thanks for reporting, it make me read [1] and come to the conclusion
> that it is sometimes safer to checkout out a temporary branch, commit
> everything and clean up later, rather than relying too much on
> `git stash`
> 
> 
> <https://stackoverflow.com/questions/835501/how-do-you-stash-an-untracked-file>
>>
>> What's different between what you expected and what actually happened?
>> The file doesn't exist anymore and I can't recover it.
>>
>> Anything else you want to add:
>> This is just a reproducible example.
>>

^ permalink raw reply	[relevance 0%]

* Re: Lost files after git stash && git stash pop
  @ 2023-07-22 21:44  4% ` Torsten Bögershausen
  2023-07-23 10:01  0%   ` Phillip Wood
  0 siblings, 1 reply; 200+ results
From: Torsten Bögershausen @ 2023-07-22 21:44 UTC (permalink / raw)
  To: Till Friebe; +Cc: git

On Fri, Jul 21, 2023 at 07:31:53PM +0200, Till Friebe wrote:
> Thank you for filling out a Git bug report!
> Please answer the following questions to help us understand your issue.
>
> What did you do before the bug happened? (Steps to reproduce your issue)
> ```
> git init
> mkdir README
> touch README/README
> git add .
> git commit -m "Init project"
> echo "Test" > README/README
> mv README/README README2
> rmdir README
> mv README2 README
> git stash
> git stash pop
> ```
>
> What did you expect to happen? (Expected behavior)
> I expected that after the `git stash pop` the README file would be back.
>
> What happened instead? (Actual behavior)
> This README with "Test" file was deleted and I lost 5 hours of work.

That is always sad to hear, when work is lost.

However, I personally wonder if this is a bug or not.
First, Git is told to track a file called README/README
Then the file is removed, without telling Git.
And a new, unkown file appers on disk (which collides with the name
of the directory)

Using this sequence could have told Git, what is going on:
git mv README/README README2
rmdir README
git mv README2 README

(a temporary branch may be checked out, with the option
 to merge-squash the final result)


An other alternative could be to tell `git stash` to care
about untracked file(s):

git stash -u
git stash pop

Which will refuse to apply the stash.

A third alternative could be to keep the file inside an
editor, to have the content still available.

However, it would/could be nice, if files are not simply deleted,
but saved into a "lost+found" folder, or a wastebasket kind of thing.

But which files ?
Those that are untracked ?
They may be important (local config files, passwords, help scripts, ...)
or not (.o files from a C compiler).

In some older discussions they had been named "precious" files.
But, as far as I remember, there was no easy solution.
In that sense I don't have a better answer.
Others may have.

Thanks for reporting, it make me read [1] and come to the conclusion
that it is sometimes safer to checkout out a temporary branch, commit
everything and clean up later, rather than relying too much on
`git stash`


<https://stackoverflow.com/questions/835501/how-do-you-stash-an-untracked-file>
>
> What's different between what you expected and what actually happened?
> The file doesn't exist anymore and I can't recover it.
>
> Anything else you want to add:
> This is just a reproducible example.
>

^ permalink raw reply	[relevance 4%]

* [RFC] short help: allow a gap smaller than USAGE_GAP
  @ 2023-07-18 22:58  3%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-18 22:58 UTC (permalink / raw)
  To: git

The parse-options API responds to "git cmd -h" by listing the option
flag (padded to the USAGE_OPTS_WIDTH column), followed by USAGE_GAP
(set to 2) whitespaces, followed by the help text.  If the flags
part does not fit within the USAGE_OPTS_WIDTH, the help text is given
on its own line.  Imagine that "@" below depicts the USAGE_OPTS_WIDTH'th
column, and "#" are for the usage help text, the output may look
like this:

    @@@@@@@@@@@@@  ########################################
    -f		   description of the flag '-f' comes here
    --short=<num>  description of the flag '--short'
    --very-long-option=<number>
                   description of the flag '--very-long-option'

This is all good and nice in principle, but it becomes awkward when
the flags part is just one column over the limit and forces a line
break.  See the description of the "--almost" option below:

    @@@@@@@@@@@@@  ########################################
    -f		   description of the flag '-f' comes here
    --short=<num>  description of the flag '--short'
    --almost=<num>
                   description of the flag '--almost'
    --very-long-option=<number>
                   description of the flag '--very-long-option'

If we allow shrinking the gap to a single whitespace only in such a
case, we would instead get:

    @@@@@@@@@@@@@  ########################################
    -f		   description of the flag '-f' comes here
    --short=<num>  description of the flag '--short'
    --almost=<num> description of the flag '--almost'
    --very-long-option=<number>
                   description of the flag '--very-long-option'

and the boundary between the flags and their descriptions does not
become any harder to see, while saving precious vertical screen real
estate.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 * This makes "git remote add -h" a bit easier to read, because
   there is one such option whose flag part is exactly 24-columns
   long.  Also the changes to t0040 illustrates the effect.

 parse-options.c               | 4 +++-
 t/helper/test-parse-options.c | 2 ++
 t/t0040-parse-options.sh      | 3 +--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/parse-options.c b/parse-options.c
index 817416db99..87c9fae634 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -1146,7 +1146,9 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
 		    !(opts->flags & PARSE_OPT_NOARG))
 			pos += usage_argh(opts, outfile);
 
-		if (pos <= USAGE_OPTS_WIDTH)
+		if (pos == USAGE_OPTS_WIDTH + 1)
+			pad = -1;
+		else if (pos <= USAGE_OPTS_WIDTH)
 			pad = USAGE_OPTS_WIDTH - pos;
 		else {
 			fputc('\n', outfile);
diff --git a/t/helper/test-parse-options.c b/t/helper/test-parse-options.c
index 00fa281a9c..a4f6e24b0c 100644
--- a/t/helper/test-parse-options.c
+++ b/t/helper/test-parse-options.c
@@ -133,6 +133,8 @@ int cmd__parse_options(int argc, const char **argv)
 		OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
 		OPT_STRING('o', NULL, &string, "str", "get another string"),
 		OPT_NOOP_NOARG(0, "obsolete"),
+		OPT_SET_INT_F(0, "longhelp", &integer, "help text of this entry\n"
+			      "spans multiple lines", 0, PARSE_OPT_NONEG),
 		OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
 		OPT_GROUP("Magic arguments"),
 		OPT_NUMBER_CALLBACK(&integer, "set integer to NUM",
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index 83e5d4eeb6..e19a199636 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -30,8 +30,7 @@ usage: test-tool parse-options <options>
     -F, --file <file>     set file to <file>
 
 String options
-    -s, --string <string>
-                          get a string
+    -s, --string <string> get a string
     --string2 <str>       get another string
     --st <st>             get another string (pervert ordering)
     -o <str>              get another string
-- 
2.41.0-376-gcba07a324d


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option
  2023-07-05  6:08  2%   ` [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
@ 2023-07-05 17:53  0%     ` Junio C Hamano
  2023-07-24  9:01  0%       ` Christian Couder
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-07-05 17:53 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, John Cai, Jonathan Tan, Jonathan Nieder, Taylor Blau,
	Derrick Stolee, Patrick Steinhardt, Christian Couder

Christian Couder <christian.couder@gmail.com> writes:

> This could be useful if, for example, some large blobs take a lot of
> precious space on fast storage while they are rarely accessed. It could
> make sense to move them into a separate cheaper, though slower, storage.
>
> In other use cases it might make sense to put all the blobs into
> separate storage.

Minor nit.  Aren't the above two the same use case?

> This is done by running two `git pack-objects` commands. The first one
> is run with `--filter=<filter-spec>`, using the specified filter. It
> packs objects while omitting the objects specified by the filter.
> Then another `git pack-objects` command is launched using
> `--stdin-packs`. We pass it all the previously existing packs into its
> stdin, so that it will pack all the objects in the previously existing
> packs. But we also pass into its stdin, the pack created by the previous
> `git pack-objects --filter=<filter-spec>` command as well as the kept
> packs, all prefixed with '^', so that the objects in these packs will be
> omitted from the resulting pack.

When I started reading the paragraph, the first question that came
to my mind was if these two pack-objects processes can and should be
run in parallel, which is answered in the part near the end of the
paragraph.  It may be a good idea to start the paragraph with "by
running `git pack-objects` command twice in a row" or something to
make it clear that one should (and cannot be) run before the other
completes.

In fact, isn't the call site of write_filtered_pack() in this patch
a bit too early?  The subprocess that runs with "--stdin-packs" is
started and told about the names of the pack we are going to create,
and it does not start processing until it reads everything (i.e. we
run fclose(in) in the write_filtered_pack() function), but the loop
over "names" string list in the caller that moves the tempfiles to
their final filenames comes after the call to close_object_store()
we see in the post context of the call to write_filtered_pack() that
is new in this patch.

The "--stdin-packs" one is told to exclude objects that appear in
these packs, so if the main process is a bit slow to finalize the
packfiles it created (and told the "--stdin-packs" process about),
it will not lead to repository corruption---just some objects are
included in the packfiles "--stdin-packs" one creates even though
they do not have to.  So it does not sound like a huge problem to
me, but still it somehow looks wrong.  Am I misreading the code?

Thanks.

^ permalink raw reply	[relevance 0%]

* [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option
  @ 2023-07-05  6:08  2%   ` Christian Couder
  2023-07-05 17:53  0%     ` Junio C Hamano
  2023-07-24  8:59  1%   ` [PATCH v3 0/8] Repack objects into separate packfiles based on a filter Christian Couder
  1 sibling, 1 reply; 200+ results
From: Christian Couder @ 2023-07-05  6:08 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

This new option puts the objects specified by `<filter-spec>` into a
separate packfile.

This could be useful if, for example, some large blobs take a lot of
precious space on fast storage while they are rarely accessed. It could
make sense to move them into a separate cheaper, though slower, storage.

In other use cases it might make sense to put all the blobs into
separate storage.

This is done by running two `git pack-objects` commands. The first one
is run with `--filter=<filter-spec>`, using the specified filter. It
packs objects while omitting the objects specified by the filter.
Then another `git pack-objects` command is launched using
`--stdin-packs`. We pass it all the previously existing packs into its
stdin, so that it will pack all the objects in the previously existing
packs. But we also pass into its stdin, the pack created by the previous
`git pack-objects --filter=<filter-spec>` command as well as the kept
packs, all prefixed with '^', so that the objects in these packs will be
omitted from the resulting pack. The result is that only the objects
filtered out by the first `git pack-objects` command are in the pack
resulting from the second `git pack-objects` command.

Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  9 +++++
 builtin/repack.c             | 67 ++++++++++++++++++++++++++++++++++++
 t/t7700-repack.sh            | 16 +++++++++
 3 files changed, 92 insertions(+)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..d702553033 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,15 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. Note
+	that objects used in the working directory are not filtered
+	out. So for the split to fully work, it's best to perform it
+	in a bare repo and to use the `-a` and `-d` options along with
+	this option.  See linkgit:git-rev-list[1] for valid
+	`<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index 4e5afee8d8..e2661b956c 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -54,6 +54,7 @@ struct pack_objects_args {
 	const char *depth;
 	const char *threads;
 	const char *max_pack_size;
+	const char *filter;
 	int no_reuse_delta;
 	int no_reuse_object;
 	int quiet;
@@ -174,6 +175,8 @@ static void prepare_pack_objects(struct child_process *cmd,
 		strvec_pushf(&cmd->args, "--threads=%s", args->threads);
 	if (args->max_pack_size)
 		strvec_pushf(&cmd->args, "--max-pack-size=%s", args->max_pack_size);
+	if (args->filter)
+		strvec_pushf(&cmd->args, "--filter=%s", args->filter);
 	if (args->no_reuse_delta)
 		strvec_pushf(&cmd->args, "--no-reuse-delta");
 	if (args->no_reuse_object)
@@ -734,6 +737,57 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	return finish_command(cmd);
 }
 
+static int write_filtered_pack(const struct pack_objects_args *args,
+			       const char *destination,
+			       const char *pack_prefix,
+			       struct string_list *names,
+			       struct string_list *existing_packs,
+			       struct string_list *existing_kept_packs)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list_item *item;
+	FILE *in;
+	int ret;
+	const char *scratch;
+	int local = skip_prefix(destination, packdir, &scratch);
+
+	/* We need to copy 'args' to modify it */
+	struct pack_objects_args new_args = *args;
+
+	/* No need to filter again */
+	new_args.filter = NULL;
+
+	prepare_pack_objects(&cmd, &new_args, destination);
+
+	strvec_push(&cmd.args, "--stdin-packs");
+
+	cmd.in = -1;
+
+	ret = start_command(&cmd);
+	if (ret)
+		return ret;
+
+	/*
+	 * names has a confusing double use: it both provides the list
+	 * of just-written new packs, and accepts the name of the
+	 * filtered pack we are writing.
+	 *
+	 * 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.
+	 */
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, names)
+		fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string);
+	for_each_string_list_item(item, existing_packs)
+		fprintf(in, "%s.pack\n", item->string);
+	for_each_string_list_item(item, existing_kept_packs)
+		fprintf(in, "^%s.pack\n", item->string);
+	fclose(in);
+
+	return finish_pack_objects_cmd(&cmd, names, local);
+}
+
 static int write_cruft_pack(const struct pack_objects_args *args,
 			    const char *destination,
 			    const char *pack_prefix,
@@ -866,6 +920,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_STRING(0, "filter", &po_args.filter, N_("args"),
+				N_("object filtering")),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -1105,6 +1161,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter) {
+		ret = write_filtered_pack(&po_args,
+					  packtmp,
+					  find_pack_prefix(),
+					  &names,
+					  &existing_nonkept_packs,
+					  &existing_kept_packs);
+		if (ret)
+			goto cleanup;
+	}
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index af79266c58..66589e4217 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -293,6 +293,22 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack HEAD) &&
+	test -n "$commit_pack" &&
+	blob_pack=$(test-tool -C bare.git find-pack HEAD:file1) &&
+	test -n "$blob_pack" &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.41.0.244.g8cb3faa74c


^ permalink raw reply related	[relevance 2%]

* [PATCH v2] t7701: make annotated tag unreachable
  @ 2023-06-24 14:33  4% ` Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-06-24 14:33 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Junio C Hamano

In 4dc16e2cb0 (gc: introduce `gc.recentObjectsHook`, 2023-06-07), we
added tests to ensure that prune-able (i.e. unreachable and with mtime
older than the cutoff) objects which are marked as recent via the new
`gc.recentObjectsHook` configuration are unpacked as loose with
`--unpack-unreachable`.

In that test, we also ensure that objects which are reachable from other
unreachable objects which were *not* pruned are kept as well, regardless
of their mtimes. For this, we use an annotated tag pointing at a blob
($obj2) which would otherwise be pruned.

But after pruning, that object is kept around for two reasons. One, the
tag object's mtime wasn't adjusted to be beyond the 1-hour cutoff, so it
would be kept as due to its recency regardless. The other reason is
because the tag itself is reachable.

Use mktag to write the tag object directly without pointing a reference
at it, and adjust the mtime of the tag object to be older than the
cutoff to ensure that our `gc.recentObjectsHook` configuration is
working as intended.

Noticed-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
Fixes a trivial oversight from an earlier version of this patch noticed
by Peff.

Range-diff against v1:
1:  48d3c2c187 ! 1:  259b1b5591 t7701: make annotated tag unreachable
    @@ t/t7701-repack-unpack-unreachable.sh: test_expect_success 'gc.recentObjectsHook'
      	git cat-file -p $obj2 &&
      	git cat-file -p $obj3 &&

    +-	git tag -a -m tag obj2-tag $obj2 &&
    +-	obj2_tag="$(git rev-parse obj2-tag)" &&
     +	# make an unreachable annotated tag object to ensure we rescue objects
     +	# which are reachable from non-pruned unreachable objects
    - 	git tag -a -m tag obj2-tag $obj2 &&
    --	obj2_tag="$(git rev-parse obj2-tag)" &&
     +	obj2_tag="$(git mktag <<-EOF
     +	object $obj2
     +	type blob

 t/t7701-repack-unpack-unreachable.sh | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index ba428c18a8..fe6c3e77a3 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -126,8 +126,18 @@ test_expect_success 'gc.recentObjectsHook' '
 	git cat-file -p $obj2 &&
 	git cat-file -p $obj3 &&

-	git tag -a -m tag obj2-tag $obj2 &&
-	obj2_tag="$(git rev-parse obj2-tag)" &&
+	# make an unreachable annotated tag object to ensure we rescue objects
+	# which are reachable from non-pruned unreachable objects
+	obj2_tag="$(git mktag <<-EOF
+	object $obj2
+	type blob
+	tag obj2-tag
+	tagger T A Gger <tagger@example.com> 1234567890 -0000
+	EOF
+	)" &&
+
+	obj2_tag_pack="$(echo $obj2_tag | git pack-objects .git/objects/pack/pack)" &&
+	git prune-packed &&

 	write_script precious-objects <<-EOF &&
 	echo $obj2_tag
@@ -136,6 +146,7 @@ test_expect_success 'gc.recentObjectsHook' '

 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
+	test-tool chmtime =-86400 .git/objects/pack/pack-$obj2_tag_pack.pack &&
 	git repack -A -d --unpack-unreachable=1.hour.ago &&

 	git cat-file -p $obj1 &&
--
2.40.1.479.g48d3c2c187.dirty

^ permalink raw reply related	[relevance 4%]

* Re: [PATCH 6/9] repack: add `--filter=<filter-spec>` option
  @ 2023-06-22  8:39  3%         ` Christian Couder
  0 siblings, 0 replies; 200+ results
From: Christian Couder @ 2023-06-22  8:39 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: git, John Cai, Jonathan Tan, Jonathan Nieder, Taylor Blau,
	Derrick Stolee, Patrick Steinhardt, Christian Couder

On Wed, Jun 21, 2023 at 6:53 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Christian Couder <christian.couder@gmail.com> writes:
>
> > It might indicate that we prefer to be safe, do things in different
> > steps and not provide an easy way for users to shoot their own foot.
> > For example it seems pretty safe to do things like this:
> >
> >   1) put all the objects we think should be on the promisor remote in
> > a separate packfile
> >   2) start checking that each object in that packfile is available on
> > the promisor remote
> >   3) if an object in that packfile isn't on the promisor remote, try
> > to send it there
> >   4) if we couldn't send the object, error out
> >   5) if we haven't errored out after checking all the objects in the
> > packfile, it means all these objects are now available from the
> > promisor remote and we can safely delete the packfile
>
> I may be missing something, but to me, the above sound more like a
> tail wagging the dog.
>
> Instead of saying "while repacking, we'll create the new pack with
> the objects that we suspect that we cannot re-fetch from the
> promisor (allowing false positives for safety), and store the rest
> in a backup pack (that can immediately be discarded)",

This might be a good idea, but what if users prefer to send to a
promisor remote the objects that should be on that promisor remote as
soon as possible, instead of keeping them on the local machine where
they take up possibly valuable space for no good reason?

My point is that there are a lot of different strategies that people
operating with a promisor remote could adopt, so it's better to
iteratively give them building blocks that can help them instead of
trying to find and implement right away the best solution for a
special use case or for every use case.

> the above
> says "while repacking, we'll create the new pack with objects that
> match the filter, and store the rest to another pack".  But because
> the object selection criteria used in the latter is not something
> with practical/useful meaning, in other words, it does not exactly
> match what we want,

"What we want" depends on the strategy chosen to manage objects on
promisor remotes and I am not sure that the strategy you mention is
always better than the example strategy I talked about. For some users
it might be better for others it might not.

> we fill the gaps between what we want (i.e. sift
> the objects into "refetchable" and "other" bins) and what we
> happened to have implemented (i.e. sift the objects into "match
> filter" and "other" bints) by sending the objects that we _should_
> have included in the new pack (i.e. "not refetchable") to the
> promisor to make them refetchable.
>
> I do not know what to think about that.  I do not think there is
> even a way to guarantee that the push done for 3) will always be
> taken and still leave the resulting promisor usable (e.g.  we can
> make them connected by coming up with a random new ref to point
> these "we are sending these only because we failed to include them
> in the set of objects we should consider local" objects, but then
> how would we avoid bloating the refs at the promisor remote side
> (which now has become a "dumping ground", rather than holding the
> objects needed for histories that project participants care about).

There are some configurations where users never want to delete any git
object. In those cases it doesn't matter if the promisor remote is a
"dumping ground". Users might just want a promisor remote to keep all
the large files that have ever been pushed into the repo, to save more
precious space on the machine hosting the regular repo.

There are configurations where users can have garanties that the push
done for 3) will work with a very high probability so that the example
strategy I talked about can work reliably enough.

The example strategy I talked about is just one example where having
repack --filter work like it does in this patch series can be useful
and safe. I don't pretend that it is always the best strategy and that
some users might not prefer another better strategy for them. If
that's the case perhaps they can implement another different option
that just checks that filtered out objects are indeed available from a
promisor remote and then just omit these objects from the resulting
pack. In fact I would have nothing against such an option, and I might
even implement it myself one day (no promise though).

Right now they have nearly no helpful command (except perhaps using
pack-objects directly), so even if this is not the best possible help
in all use cases, I am just saying that this can be useful in _some_
cases.

> As an argument to salvage this series as (one of the possible
> ingredients to) a solution to "slim down a bloated lazy clone"
> problem, it sounds a bit weak.

I don't quite agree, but anyway I will use this argument less in
version 2 of this patch series, and I will talk more about the
argument that `repack --filter=...` allows users to put packfiles
containing some kinds of objects (like large blobs or all the blobs)
on cheaper disks (when not using a promisor remote).

Thanks.

^ permalink raw reply	[relevance 3%]

* Re: [PATCH 6/9] repack: add `--filter=<filter-spec>` option
  2023-06-16  0:43  5%   ` Junio C Hamano
@ 2023-06-21 14:40  0%     ` Christian Couder
    0 siblings, 1 reply; 200+ results
From: Christian Couder @ 2023-06-21 14:40 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: git, John Cai, Jonathan Tan, Jonathan Nieder, Taylor Blau,
	Derrick Stolee, Patrick Steinhardt, Christian Couder

On Fri, Jun 16, 2023 at 2:43 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> Christian Couder <christian.couder@gmail.com> writes:
>
> > After cloning with --filter=<filter-spec>, for example to avoid
> > getting unneeded large files on a user machine, it's possible
> > that some of these large files still get fetched for some reasons
> > (like checking out old branches) over time.
> >
> > In this case the repo size could grow too much for no good reason and a
> > way to filter out some objects would be useful to remove the unneeded
> > large files.
>
> Makes sense.
>
> If we repack without these objects, when the repository has a
> promisor remote, we should be able to rely on that remote to supply
> them on demand, once we need them again, no?

Yeah, sure.

> > Deleting objects right away could corrupt a repo though,...
>
> Hmph, could you elaborate why it is the case?  Isn't it the whole
> point to have promisor remote and use a lazy clone with the --filter
> option, so that objects that _ought_ to exist from connectivity's
> point of view _are_ allowed to be missing because the promisor
> promises to make them available on-demand?
>
>         Side note: I think I know the answer. While trying to remove
>         UNNEEDED large files, doing so may discard NEEDED large
>         files when done carelessly (e.g. the file may have been
>         created locally and haven't been pushed back).

Yeah, right.

>         But (1) if
>         that is the problem, perhaps we should be more careful in
>         the first place?

Yeah, but earlier when we implemented `repack --filter=...` that was
removing objects, saying that one should be very careful in the docs
and implementing safeguards didn't seem to be safe enough for
reviewers. Reviewers said that the feature would anyway provide a too
easy way for users to shoot their own foot.

>        (2) if it inherently is impossible to tell
>         which ones are unneeded reliably, the reason why it is
>         impossible, and the reason why "try sifting into two bins,
>         one that we _think_ are unneeded and another for the rest,
>         and verify what we _thought_ are unneeded are all available
>         from the promisor remote" is the best we can do, must be
>         described, I think.

You mean described in the `repack --filter=` doc? Yeah, I can describe
this use case in the doc, but see below.

> > ... so it might be
> > better to put those objects into a separate packfile instead of
> > deleting them. The separate pack could then be removed after checking
> > that all the objects in it are still available on a promisor remote it
> > can access.
>
> Surely, sifting the objects into two bins (i.e. those that we
> wouldn't have received if we cloned from the promisor remote just
> now, which are prunable, and those that we cannot lose because the
> promisor remote would not have them, e.g. we created them and have
> not pushed them to the remote yet) without removing anything would
> be safe, but if the result of such sifting must be verified, doesn't
> it indicate that the sifting step was buggy or misdesigned?

It might indicate that we prefer to be safe, do things in different
steps and not provide an easy way for users to shoot their own foot.
For example it seems pretty safe to do things like this:

  1) put all the objects we think should be on the promisor remote in
a separate packfile
  2) start checking that each object in that packfile is available on
the promisor remote
  3) if an object in that packfile isn't on the promisor remote, try
to send it there
  4) if we couldn't send the object, error out
  5) if we haven't errored out after checking all the objects in the
packfile, it means all these objects are now available from the
promisor remote and we can safely delete the packfile

The above steps can be done while new objects are created on the repo,
or fetched, or pushed into the repo. And, at least for now, it would
be done by a custom script, so users writing and installing it should
know what they are doing and would hopefully not complain that we
provided an easy way for them to shoot their foot.

If we don't even document the above in the --filter=... doc, it makes
it even less likely that they will do this and that their script might
be wrong. So even if I could document it in version 2, I am not sure I
should.

>  It does
> not sound like a very good justification to save them in a separate
> packfile.  It does smell somewhat similar to the cruft packs but not
> really (the choice over there is between exploding to loose and
> keeping in a pack, and never involves loss of objects).

If we are still worried about possible loss of objects, I am Ok with
not talking at all about use cases involving possible loss of objects.

> > Also splitting a packfile into 2 packs depending on a filter could be
> > useful in other usecases. For example some large blobs might take a lot
> > of precious space on fast storage while they are rarely accessed, and
> > it could make sense to move them in a separate cheaper, though slower,
> > storage.
>
> This one, outside the context of partial clone client, does make
> tons of sense.

Ok, so perhaps it is enough to justify this feature and patch series.
And I can just avoid talking about other use cases at all?

> I guess what I suspect is that this option, while it would be very
> useful for the "in other usecases" scenario above, may not become
> all that useful in the "our lazy clone got bloated and we want to
> trim objects we know we can retrieve from the promisor remote again
> if necessary" scenario, until the repack machinery learns to use an
> extra piece of information (namely "these are objects that we can
> fetch from the promisor remote") at the same time.

Yeah, perhaps we should wait for a command or a repack option or some
helper scripts to be able to perform steps 2) to 4) or 2) to 5) above
before talking about use cases involving a promisor remote.

On the other hand, it's possible to imagine other steps than the steps
2) to 4) described above. For example, if we want to repack on a
server where new large blobs can hardly be created and where there is
a receive hook that automatically sends all the large blobs to a
promisor remote as soon as they are received, we might not need steps
3) and 4) to send objects to the promisor remote. Just checking that
they are on the promisor remote might be enough.

Also even if we think we should have features covering all the 5
steps, should we cover all the ways blobs could be sent to the
promisor remote as part of step 3)? Some people or server platforms
might want to use git for that purpose, but others might prefer for
example FTP or plain HTTP(S) so that a transfer can be restarted if it
fails.

So should we really wait until we have all possible such use cases
covered by some features or scripts, or not? When does it become Ok to
talk about this? And then how much is it Ok to talk about this?

> > This commit implements a new `--filter=<filter-spec>` option in
> > `git repack` that moves filtered out objects into a separate pack.
> >
> > This is done by reading filtered out objects from `git pack-objects`'s
> > output and piping them into a separate `git pack-objects` process that
> > will put them into a separate packfile.
>
> So, for example, you may say "no blobs" in the filter, and while
> packing the local repository with the filter, resulting in a pack
> that exclude all blobs, we will learn what blob objects we did not
> pack into that packfile.  We can pack them into a separate one, and
> most of the blobs are what we could retrieve again from the promisor
> remote, but some of the blobs are what we locally created ourselves
> and haven't pushed back to the promisor remote yet.  Now what?  My
> earlier suspicion that this mechanism may not be all that useful for
> the "slim bloated lazy clone" comes from that I cannot think of a
> good answer to this "Now what?" question---my naive solution would
> involve enumerating the objects in that "separate packfile" that is
> a mixture of precious ones and expendable ones, and then learning
> which ones are precious, and creating a new pack that is a subset of
> that "separate packfile" with only the precious ones.  But if I do
> so, I do not think we need this new mechanism that seems to go only
> the half-way.

I hope the above 2) to 5) steps and related explanations are a good
answer to the "Now what?" question.

Thanks,
Christian.

^ permalink raw reply	[relevance 0%]

* [PATCH] t7701: make annotated tag unreachable
@ 2023-06-21 10:21  4% Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-06-21 10:21 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Junio C Hamano

In 4dc16e2cb0 (gc: introduce `gc.recentObjectsHook`, 2023-06-07), we
added tests to ensure that prune-able (i.e. unreachable and with mtime
older than the cutoff) objects which are marked as recent via the new
`gc.recentObjectsHook` configuration are unpacked as loose with
`--unpack-unreachable`.

In that test, we also ensure that objects which are reachable from other
unreachable objects which were *not* pruned are kept as well, regardless
of their mtimes. For this, we use an annotated tag pointing at a blob
($obj2) which would otherwise be pruned.

But after pruning, that object is kept around for two reasons. One, the
tag object's mtime wasn't adjusted to be beyond the 1-hour cutoff, so it
would be kept as due to its recency regardless. The other reason is
because the tag itself is reachable.

Use mktag to write the tag object directly without pointing a reference
at it, and adjust the mtime of the tag object to be older than the
cutoff to ensure that our `gc.recentObjectsHook` configuration is
working as intended.

Noticed-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
Peff pointed this out to me after the gc.recentObjectsHook stuff was in
'next', but this should go on top. This patch is based off of the tip of
"tb/gc-recent-object-hook".

 t/t7701-repack-unpack-unreachable.sh | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index ba428c18a8..ceb4e805d2 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -126,8 +126,19 @@ test_expect_success 'gc.recentObjectsHook' '
 	git cat-file -p $obj2 &&
 	git cat-file -p $obj3 &&

+	# make an unreachable annotated tag object to ensure we rescue objects
+	# which are reachable from non-pruned unreachable objects
 	git tag -a -m tag obj2-tag $obj2 &&
-	obj2_tag="$(git rev-parse obj2-tag)" &&
+	obj2_tag="$(git mktag <<-EOF
+	object $obj2
+	type blob
+	tag obj2-tag
+	tagger T A Gger <tagger@example.com> 1234567890 -0000
+	EOF
+	)" &&
+
+	obj2_tag_pack="$(echo $obj2_tag | git pack-objects .git/objects/pack/pack)" &&
+	git prune-packed &&

 	write_script precious-objects <<-EOF &&
 	echo $obj2_tag
@@ -136,6 +147,7 @@ test_expect_success 'gc.recentObjectsHook' '

 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
+	test-tool chmtime =-86400 .git/objects/pack/pack-$obj2_tag_pack.pack &&
 	git repack -A -d --unpack-unreachable=1.hour.ago &&

 	git cat-file -p $obj1 &&
--
2.40.1.478.g4dc16e2cb0

^ permalink raw reply related	[relevance 4%]

* Re: [PATCH v3] Introduced force flag to the git stash clear subcommand.
  2023-06-20 21:01  0%       ` Eric Sunshine
@ 2023-06-20 21:42  0%         ` Nadav Goldstein
  0 siblings, 0 replies; 200+ results
From: Nadav Goldstein @ 2023-06-20 21:42 UTC (permalink / raw)
  To: Eric Sunshine
  Cc: Junio C Hamano, Nadav Goldstein via GitGitGadget, git,
	Derrick Stolee

I see both of your points, and I agree adding the flag will only make 
users type the flag without thinking.


But I still don't understand why do we need git clean without any flags.


The only users that will run git clean are new users that don't know you 
need to run it with -f or experienced users that set clean.requireforce 
= false.


Moreover, we can also assume that every user that have 
clean.requireforce = true (the default), and ran git clean, did so by 
mistake/intended to clean, So why don't we offer him interactive way to 
understand the consequences and confirm his action? (and explain about 
clean.requireforce like we currently do).
By doing it this way, the change will not effect experienced users 
because they either run git clean -f when they need to clean or they set 
clean.requireforce = false, and then the change will not apply to them.


This argument is also for stash clear.


Thanks.

On 21/06/2023 0:01, Eric Sunshine wrote:
> On Tue, Jun 20, 2023 at 4:05 PM Nadav Goldstein
> <nadav.goldstein96@gmail.com> wrote:
>>> I am not sure how much value users would get by requiring "--force",
>>> though.  I know this was (partly) modeled after "git clean", but
>>> over there, when the required "--force" is not given, the user would
>>> give "--dry-run" (or "-n"), and the user will see what would be
>>> removed if the user gave "--force".  If missing "--force" made "git
>>> stash clear" show the stash entries that would be lost, then after
>>> seeing an error message, it would be easier for the user to decide
>>> if their next move should be to re-run the command with "--force",
>>> or there are some precious entries and the user is not ready to do
>>> "stash clear".
>>>
>>> But just refusing to run without giving any other information will
>>> just train the user to give "git stash clear --force" without
>>> thinking, because getting "because you did not give the required
>>> --force option, I am not doing anything" is only annoying without
>>> giving any useful information.
>> I see, but isn't the same argument apply for git clean? if not adding
>> the force flag, the same message as I wrote appear in git clean (I
>> copied it from there), and it will exit without any other information,
>> hence given your argument, running git clean is also not very useful.
> For what it's worth, I had the same reaction as Junio upon reading
> this patch; specifically, that it will train users to type "git stash
> clear --force" mechanically without thinking, thus won't be much of a
> safeguard.
>
>> I suggested in the beginning of this thread to ask the user if he is
>> sure he want to proceed (default to no), and only if he wrote y/yes
>> proceed with the action (and force will just do it, or requireforce=false).
>>
>> The reason I suggested it is because when running git stash clear, it
>> will remain in the user recent commands, and when the user will navigate
>> through the commands history in the terminal, he might accidentally fire
>> git stash clear, and this confirmation will be another safeguard against
>> this mistake.
>>
>> Maybe it will be useful for git clean as well for the same reasons.
>> Also when the user types git clean, I argue he wanted to clean or he did
>> it by mistake, and In both scenarios I don't see why making git clean
>> just fail will be useful.
> "git clean" is in a rather different (and more severe) boat since file
> deletion is irrevocable, whereas a stash thrown away by "git stash
> clear" (or "git stash drop") can be recovered (at least until it gets
> garbage-collected). So, rather than adding a --force option or an
> interactive "yes/no" prompt, perhaps a better approach would be to
> have "git stash clear" (and "git stash drop") print out advice
> explaining to the user how to recover the dropped stash(es), much like
> "git switch" or "git checkout" prints advice explaining how to recover
> commits left dangling on a detached head.
>
>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3] Introduced force flag to the git stash clear subcommand.
  2023-06-20 19:54  0%     ` Nadav Goldstein
@ 2023-06-20 21:01  0%       ` Eric Sunshine
  2023-06-20 21:42  0%         ` Nadav Goldstein
  0 siblings, 1 reply; 200+ results
From: Eric Sunshine @ 2023-06-20 21:01 UTC (permalink / raw)
  To: Nadav Goldstein
  Cc: Junio C Hamano, Nadav Goldstein via GitGitGadget, git,
	Derrick Stolee

On Tue, Jun 20, 2023 at 4:05 PM Nadav Goldstein
<nadav.goldstein96@gmail.com> wrote:
> > I am not sure how much value users would get by requiring "--force",
> > though.  I know this was (partly) modeled after "git clean", but
> > over there, when the required "--force" is not given, the user would
> > give "--dry-run" (or "-n"), and the user will see what would be
> > removed if the user gave "--force".  If missing "--force" made "git
> > stash clear" show the stash entries that would be lost, then after
> > seeing an error message, it would be easier for the user to decide
> > if their next move should be to re-run the command with "--force",
> > or there are some precious entries and the user is not ready to do
> > "stash clear".
> >
> > But just refusing to run without giving any other information will
> > just train the user to give "git stash clear --force" without
> > thinking, because getting "because you did not give the required
> > --force option, I am not doing anything" is only annoying without
> > giving any useful information.
>
> I see, but isn't the same argument apply for git clean? if not adding
> the force flag, the same message as I wrote appear in git clean (I
> copied it from there), and it will exit without any other information,
> hence given your argument, running git clean is also not very useful.

For what it's worth, I had the same reaction as Junio upon reading
this patch; specifically, that it will train users to type "git stash
clear --force" mechanically without thinking, thus won't be much of a
safeguard.

> I suggested in the beginning of this thread to ask the user if he is
> sure he want to proceed (default to no), and only if he wrote y/yes
> proceed with the action (and force will just do it, or requireforce=false).
>
> The reason I suggested it is because when running git stash clear, it
> will remain in the user recent commands, and when the user will navigate
> through the commands history in the terminal, he might accidentally fire
> git stash clear, and this confirmation will be another safeguard against
> this mistake.
>
> Maybe it will be useful for git clean as well for the same reasons.
> Also when the user types git clean, I argue he wanted to clean or he did
> it by mistake, and In both scenarios I don't see why making git clean
> just fail will be useful.

"git clean" is in a rather different (and more severe) boat since file
deletion is irrevocable, whereas a stash thrown away by "git stash
clear" (or "git stash drop") can be recovered (at least until it gets
garbage-collected). So, rather than adding a --force option or an
interactive "yes/no" prompt, perhaps a better approach would be to
have "git stash clear" (and "git stash drop") print out advice
explaining to the user how to recover the dropped stash(es), much like
"git switch" or "git checkout" prints advice explaining how to recover
commits left dangling on a detached head.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3] Introduced force flag to the git stash clear subcommand.
  2023-06-20  6:25  3%   ` Junio C Hamano
@ 2023-06-20 19:54  0%     ` Nadav Goldstein
  2023-06-20 21:01  0%       ` Eric Sunshine
  0 siblings, 1 reply; 200+ results
From: Nadav Goldstein @ 2023-06-20 19:54 UTC (permalink / raw)
  To: Junio C Hamano, Nadav Goldstein via GitGitGadget; +Cc: git, Derrick Stolee

> I am not sure how much value users would get by requiring "--force",
> though.  I know this was (partly) modeled after "git clean", but
> over there, when the required "--force" is not given, the user would
> give "--dry-run" (or "-n"), and the user will see what would be
> removed if the user gave "--force".  If missing "--force" made "git
> stash clear" show the stash entries that would be lost, then after
> seeing an error message, it would be easier for the user to decide
> if their next move should be to re-run the command with "--force",
> or there are some precious entries and the user is not ready to do
> "stash clear".
>
> But just refusing to run without giving any other information will
> just train the user to give "git stash clear --force" without
> thinking, because getting "because you did not give the required
> --force option, I am not doing anything" is only annoying without
> giving any useful information.


I see, but isn't the same argument apply for git clean? if not adding 
the force flag, the same message as I wrote appear in git clean (I 
copied it from there), and it will exit without any other information, 
hence given your argument, running git clean is also not very useful.


One can argue that git clean --dry-run == git stash list


I suggested in the beginning of this thread to ask the user if he is 
sure he want to proceed (default to no), and only if he wrote y/yes 
proceed with the action (and force will just do it, or requireforce=false).


The reason I suggested it is because when running git stash clear, it 
will remain in the user recent commands, and when the user will navigate 
through the commands history in the terminal, he might accidentally fire 
git stash clear, and this confirmation will be another safeguard against 
this mistake.


Maybe it will be useful for git clean as well for the same reasons.
Also when the user types git clean, I argue he wanted to clean or he did 
it by mistake, and In both scenarios I don't see why making git clean 
just fail will be useful.


So what do you think? Maybe we should present in both clean and clear a 
confirmation message? (only if requireforce=true)


What do you think?


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3] Introduced force flag to the git stash clear subcommand.
  @ 2023-06-20  6:25  3%   ` Junio C Hamano
  2023-06-20 19:54  0%     ` Nadav Goldstein
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-06-20  6:25 UTC (permalink / raw)
  To: Nadav Goldstein via GitGitGadget; +Cc: git, Derrick Stolee, Nadav Goldstein

"Nadav Goldstein via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: Nadav Goldstein <nadav.goldstein96@gmail.com>
>
> stash clean subcommand now support the force flag, along
> with the configuration var stash.requireforce, that if
> set to true, will make git stash clear fail unless supplied
> with force flag.

Documentation/SubmittingPatches gives many helpful hints on how to
write log messages for the project.

> @@ -208,6 +208,14 @@ to learn how to operate the `--patch` mode.
>  The `--patch` option implies `--keep-index`.  You can use
>  `--no-keep-index` to override this.
>  
> +-f::
> +--force::
> +	This option is only valid for `clear` command

Missing full-stop?

> ++
> +If the Git configuration variable stash.requireForce is set

Drop "Git" perhaps?  I haven't seen any other place that says "Git
configuration variable X" when talking about a single variable (it
probably is OK to call those defined in a Git configuration file
collectively as "Git configuration variables", though).

> +to true, 'git stash clear' will refuse to remove all the stash 
> +entries unless given -f.

I am not sure how much value users would get by requiring "--force",
though.  I know this was (partly) modeled after "git clean", but
over there, when the required "--force" is not given, the user would
give "--dry-run" (or "-n"), and the user will see what would be
removed if the user gave "--force".  If missing "--force" made "git
stash clear" show the stash entries that would be lost, then after
seeing an error message, it would be easier for the user to decide
if their next move should be to re-run the command with "--force",
or there are some precious entries and the user is not ready to do
"stash clear".

But just refusing to run without giving any other information will
just train the user to give "git stash clear --force" without
thinking, because getting "because you did not give the required
--force option, I am not doing anything" is only annoying without
giving any useful information.

> diff --git a/builtin/stash.c b/builtin/stash.c
> index a7e17ffe384..d037bc4f69c 100644
> --- a/builtin/stash.c
> +++ b/builtin/stash.c
> @@ -53,7 +53,7 @@
>  #define BUILTIN_STASH_CREATE_USAGE \
>  	N_("git stash create [<message>]")
>  #define BUILTIN_STASH_CLEAR_USAGE \
> -	"git stash clear"
> +	"git stash clear [-f | --force]"
>  
>  static const char * const git_stash_usage[] = {
>  	BUILTIN_STASH_LIST_USAGE,
> @@ -122,6 +122,7 @@ static const char * const git_stash_save_usage[] = {
>  
>  static const char ref_stash[] = "refs/stash";
>  static struct strbuf stash_index_path = STRBUF_INIT;
> +static int clear_require_force = 0;

Do not explicitly initialize globals to 0 or NULL; let BSS take care
of the zero initialization, instead.

> @@ -246,7 +247,9 @@ static int do_clear_stash(void)
>  
>  static int clear_stash(int argc, const char **argv, const char *prefix)
>  {
> +	int force = 0;
>  	struct option options[] = {
> +		OPT__FORCE(&force, N_("force"), PARSE_OPT_NOCOMPLETE),
>  		OPT_END()
>  	};

As this topic focuses on "git stash clear", this is OK (and the
description in the documentation that says that "force" is currently
supported only by "clear" is also fine), but is "clear" the only
destructive subcommand and no other subcommand will want to learn
the "--force" for similar safety in the future?  The answer to this
question matters because ...

> @@ -258,6 +261,9 @@ static int clear_stash(int argc, const char **argv, const char *prefix)
>  		return error(_("git stash clear with arguments is "
>  			       "unimplemented"));
>  
> +	if (!force && clear_require_force)
> +		return error(_("fatal: stash.requireForce set to true and -f was not given; refusing to clear stash"));
> +
>  	return do_clear_stash();
>  }
>  
> @@ -851,6 +857,10 @@ static int git_stash_config(const char *var, const char *value, void *cb)
>  		show_include_untracked = git_config_bool(var, value);
>  		return 0;
>  	}
> +	if (!strcmp(var, "stash.requireforce")) {

... the naming of this variable, facing the end users, does not
limit itself to "clear" at all.  It gives an impression that setting
this will require "--force" for all other subcommands that would
support it.  However ...

> +		clear_require_force = git_config_bool(var, value);

... inside the code, the variable is named in such a way that it is
only about the "clear" subcommand and nothing else.

I suspect that the end-user facing "stash.requireforce" should be
renamed to make it clear that it is about "stash clear" subcommand,
and not everywhere in "stash" requires "--force".  Nobody wants to
keep saying "git stash save --force" ;-)

> +		return 0;
> +	}

Thanks.

^ permalink raw reply	[relevance 3%]

* Re: [PATCH 6/9] repack: add `--filter=<filter-spec>` option
  2023-06-14 19:25  2% ` [PATCH 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
@ 2023-06-16  0:43  5%   ` Junio C Hamano
  2023-06-21 14:40  0%     ` Christian Couder
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-06-16  0:43 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, John Cai, Jonathan Tan, Jonathan Nieder, Taylor Blau,
	Derrick Stolee, Patrick Steinhardt, Christian Couder

Christian Couder <christian.couder@gmail.com> writes:

> After cloning with --filter=<filter-spec>, for example to avoid
> getting unneeded large files on a user machine, it's possible
> that some of these large files still get fetched for some reasons
> (like checking out old branches) over time.
>
> In this case the repo size could grow too much for no good reason and a
> way to filter out some objects would be useful to remove the unneeded
> large files.

Makes sense.

If we repack without these objects, when the repository has a
promisor remote, we should be able to rely on that remote to supply
them on demand, once we need them again, no?

> Deleting objects right away could corrupt a repo though,...

Hmph, could you elaborate why it is the case?  Isn't it the whole
point to have promisor remote and use a lazy clone with the --filter
option, so that objects that _ought_ to exist from connectivity's
point of view _are_ allowed to be missing because the promisor
promises to make them available on-demand?

	Side note: I think I know the answer. While trying to remove
	UNNEEDED large files, doing so may discard NEEDED large
	files when done carelessly (e.g. the file may have been
	created locally and haven't been pushed back). But (1) if
	that is the problem, perhaps we should be more careful in
	the first place? (2) if it inherently is impossible to tell
	which ones are unneeded reliably, the reason why it is
	impossible, and the reason why "try sifting into two bins,
	one that we _think_ are unneeded and another for the rest,
	and verify what we _thought_ are unneeded are all available
	from the promisor remote" is the best we can do, must be
	described, I think.

> ... so it might be
> better to put those objects into a separate packfile instead of
> deleting them. The separate pack could then be removed after checking
> that all the objects in it are still available on a promisor remote it
> can access.

Surely, sifting the objects into two bins (i.e. those that we
wouldn't have received if we cloned from the promisor remote just
now, which are prunable, and those that we cannot lose because the
promisor remote would not have them, e.g. we created them and have
not pushed them to the remote yet) without removing anything would
be safe, but if the result of such sifting must be verified, doesn't
it indicate that the sifting step was buggy or misdesigned?  It does
not sound like a very good justification to save them in a separate
packfile.  It does smell somewhat similar to the cruft packs but not
really (the choice over there is between exploding to loose and
keeping in a pack, and never involves loss of objects).

> Also splitting a packfile into 2 packs depending on a filter could be
> useful in other usecases. For example some large blobs might take a lot
> of precious space on fast storage while they are rarely accessed, and
> it could make sense to move them in a separate cheaper, though slower,
> storage.

This one, outside the context of partial clone client, does make
tons of sense.

I guess what I suspect is that this option, while it would be very
useful for the "in other usecases" scenario above, may not become
all that useful in the "our lazy clone got bloated and we want to
trim objects we know we can retrieve from the promisor remote again
if necessary" scenario, until the repack machinery learns to use an
extra piece of information (namely "these are objects that we can
fetch from the promisor remote") at the same time.

> This commit implements a new `--filter=<filter-spec>` option in
> `git repack` that moves filtered out objects into a separate pack.
>
> This is done by reading filtered out objects from `git pack-objects`'s
> output and piping them into a separate `git pack-objects` process that
> will put them into a separate packfile.

So, for example, you may say "no blobs" in the filter, and while
packing the local repository with the filter, resulting in a pack
that exclude all blobs, we will learn what blob objects we did not
pack into that packfile.  We can pack them into a separate one, and
most of the blobs are what we could retrieve again from the promisor
remote, but some of the blobs are what we locally created ourselves
and haven't pushed back to the promisor remote yet.  Now what?  My
earlier suspicion that this mechanism may not be all that useful for
the "slim bloated lazy clone" comes from that I cannot think of a
good answer to this "Now what?" question---my naive solution would
involve enumerating the objects in that "separate packfile" that is
a mixture of precious ones and expendable ones, and then learning
which ones are precious, and creating a new pack that is a subset of
that "separate packfile" with only the precious ones.  But if I do
so, I do not think we need this new mechanism that seems to go only
the half-way.

^ permalink raw reply	[relevance 5%]

* [PATCH 6/9] repack: add `--filter=<filter-spec>` option
  @ 2023-06-14 19:25  2% ` Christian Couder
  2023-06-16  0:43  5%   ` Junio C Hamano
    1 sibling, 1 reply; 200+ results
From: Christian Couder @ 2023-06-14 19:25 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, John Cai, Jonathan Tan, Jonathan Nieder,
	Taylor Blau, Derrick Stolee, Patrick Steinhardt, Christian Couder,
	Christian Couder

After cloning with --filter=<filter-spec>, for example to avoid
getting unneeded large files on a user machine, it's possible
that some of these large files still get fetched for some reasons
(like checking out old branches) over time.

In this case the repo size could grow too much for no good reason and a
way to filter out some objects would be useful to remove the unneeded
large files.

Deleting objects right away could corrupt a repo though, so it might be
better to put those objects into a separate packfile instead of
deleting them. The separate pack could then be removed after checking
that all the objects in it are still available on a promisor remote it
can access.

Also splitting a packfile into 2 packs depending on a filter could be
useful in other usecases. For example some large blobs might take a lot
of precious space on fast storage while they are rarely accessed, and
it could make sense to move them in a separate cheaper, though slower,
storage.

This commit implements a new `--filter=<filter-spec>` option in
`git repack` that moves filtered out objects into a separate pack.

This is done by reading filtered out objects from `git pack-objects`'s
output and piping them into a separate `git pack-objects` process that
will put them into a separate packfile.

Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-repack.txt |  5 +++
 builtin/repack.c             | 75 ++++++++++++++++++++++++++++++++++--
 t/t7700-repack.sh            | 16 ++++++++
 3 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4017157949..aa29c7e648 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -143,6 +143,11 @@ depth is 4095.
 	a larger and slower repository; see the discussion in
 	`pack.packSizeLimit`.
 
+--filter=<filter-spec>::
+	Remove objects matching the filter specification from the
+	resulting packfile and put them into a separate packfile. See
+	linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+
 -b::
 --write-bitmap-index::
 	Write a reachability bitmap index as part of the repack. This
diff --git a/builtin/repack.c b/builtin/repack.c
index f1adacf1d0..b13d7196de 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -53,6 +53,7 @@ struct pack_objects_args {
 	const char *depth;
 	const char *threads;
 	const char *max_pack_size;
+	const char *filter;
 	int no_reuse_delta;
 	int no_reuse_object;
 	int quiet;
@@ -167,6 +168,10 @@ static void prepare_pack_objects(struct child_process *cmd,
 		strvec_pushf(&cmd->args, "--threads=%s", args->threads);
 	if (args->max_pack_size)
 		strvec_pushf(&cmd->args, "--max-pack-size=%s", args->max_pack_size);
+	if (args->filter) {
+		strvec_pushf(&cmd->args, "--filter=%s", args->filter);
+		strvec_pushf(&cmd->args, "--print-filtered");
+	}
 	if (args->no_reuse_delta)
 		strvec_pushf(&cmd->args, "--no-reuse-delta");
 	if (args->no_reuse_object)
@@ -703,13 +708,21 @@ static void remove_redundant_bitmaps(struct string_list *include,
 	strbuf_release(&path);
 }
 
+static void pack_filtered(const char *oid_hex, struct child_process *cmd)
+{
+	write_oid_hex_cmd(oid_hex, cmd,
+			  _("could not start pack-objects to pack filtered objects"));
+}
+
 static int finish_pack_objects_cmd(struct child_process *cmd,
 				   struct string_list *names,
-				   const char *destination)
+				   const char *destination,
+				   struct child_process *pack_filtered_cmd)
 {
 	int local = 1;
 	FILE *out;
 	struct strbuf line = STRBUF_INIT;
+	int filtered_start = 0;
 
 	if (destination) {
 		const char *scratch;
@@ -720,9 +733,20 @@ static int finish_pack_objects_cmd(struct child_process *cmd,
 	while (strbuf_getline_lf(&line, out) != EOF) {
 		struct string_list_item *item;
 
+		if (!filtered_start && pack_filtered_cmd && !strcmp(line.buf, "------")) {
+			filtered_start = 1;
+			continue;
+		}
+
 		if (line.len != the_hash_algo->hexsz)
 			die(_("repack: Expecting full hex object ID lines only "
 			      "from pack-objects."));
+
+		if (pack_filtered_cmd && filtered_start) {
+			pack_filtered(line.buf, pack_filtered_cmd);
+			continue;
+		}
+
 		/*
 		 * Avoid putting packs written outside of the repository in the
 		 * list of names.
@@ -791,9 +815,44 @@ static int write_cruft_pack(const struct pack_objects_args *args,
 		fprintf(in, "%s.pack\n", item->string);
 	fclose(in);
 
-	return finish_pack_objects_cmd(&cmd, names, destination);
+	return finish_pack_objects_cmd(&cmd, names, destination, NULL);
 }
 
+/*
+ * Prepare the command that will pack objects that have been filtered
+ * out from the original pack, so that they will end up in a separate
+ * pack.
+ */
+static void prepare_pack_filtered_cmd(struct child_process *cmd,
+				      const struct pack_objects_args *args,
+				      const char *destination)
+{
+	/* We need to copy args to modify it */
+	struct pack_objects_args new_args = *args;
+
+	/* No need to filter again */
+	new_args.filter = NULL;
+
+	prepare_pack_objects(cmd, &new_args, destination);
+	cmd->in = -1;
+}
+
+static void finish_pack_filtered_cmd(struct child_process *cmd,
+				     struct string_list *names)
+{
+	if (cmd->in == -1) {
+		/* No packed objects; cmd was never started */
+		child_process_clear(cmd);
+		return;
+	}
+
+	close(cmd->in);
+
+	if (finish_pack_objects_cmd(cmd, names, NULL, NULL))
+		die(_("could not finish pack-objects to pack filtered objects"));
+}
+
+
 int cmd_repack(int argc, const char **argv, const char *prefix)
 {
 	struct child_process cmd = CHILD_PROCESS_INIT;
@@ -817,6 +876,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	int write_midx = 0;
 	const char *cruft_expiration = NULL;
 	const char *expire_to = NULL;
+	struct child_process pack_filtered_cmd = CHILD_PROCESS_INIT;
 
 	struct option builtin_repack_options[] = {
 		OPT_BIT('a', NULL, &pack_everything,
@@ -858,6 +918,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				N_("limits the maximum number of threads")),
 		OPT_STRING(0, "max-pack-size", &po_args.max_pack_size, N_("bytes"),
 				N_("maximum size of each packfile")),
+		OPT_STRING(0, "filter", &po_args.filter, N_("args"),
+				N_("object filtering")),
 		OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
 				N_("repack objects in packs marked with .keep")),
 		OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
@@ -1011,6 +1073,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		strvec_push(&cmd.args, "--incremental");
 	}
 
+	if (po_args.filter)
+		prepare_pack_filtered_cmd(&pack_filtered_cmd, &po_args, packtmp);
+
 	if (geometry)
 		cmd.in = -1;
 	else
@@ -1034,7 +1099,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		fclose(in);
 	}
 
-	ret = finish_pack_objects_cmd(&cmd, &names, NULL);
+	ret = finish_pack_objects_cmd(&cmd, &names, NULL,
+				      po_args.filter ? &pack_filtered_cmd : NULL);
 	if (ret)
 		goto cleanup;
 
@@ -1102,6 +1168,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 		}
 	}
 
+	if (po_args.filter)
+		finish_pack_filtered_cmd(&pack_filtered_cmd, &names);
+
 	string_list_sort(&names);
 
 	close_object_store(the_repository->objects);
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index faa739eeb9..9e7654090f 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -270,6 +270,22 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'repacking with a filter works' '
+	git -C bare.git repack -a -d &&
+	test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack &&
+	git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none &&
+	test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack &&
+	commit_pack=$(test-tool -C bare.git find-pack HEAD) &&
+	test -n "$commit_pack" &&
+	blob_pack=$(test-tool -C bare.git find-pack HEAD:file1) &&
+	test -n "$blob_pack" &&
+	test "$commit_pack" != "$blob_pack" &&
+	tree_pack=$(test-tool -C bare.git find-pack HEAD^{tree}) &&
+	test "$tree_pack" = "$commit_pack" &&
+	blob_pack2=$(test-tool -C bare.git find-pack HEAD:file2) &&
+	test "$blob_pack2" = "$blob_pack"
+'
+
 objdir=.git/objects
 midx=$objdir/pack/multi-pack-index
 
-- 
2.41.0.37.gae45d9845e


^ permalink raw reply related	[relevance 2%]

* [PATCH v5 2/2] gc: introduce `gc.recentObjectsHook`
  2023-06-07 22:58  5% ` [PATCH v5 0/2] " Taylor Blau
@ 2023-06-07 22:58  8%   ` Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-06-07 22:58 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Chris Torek, Derrick Stolee, Junio C Hamano, Glen Choo

This patch introduces a new multi-valued configuration option,
`gc.recentObjectsHook` as a means to mark certain objects as recent (and
thus exempt from garbage collection), regardless of their age.

When performing a garbage collection operation on a repository with
unreachable objects, Git makes its decision on what to do with those
object(s) bed on how recent the objects are or not. Generally speaking,
unreachable-but-recent objects stay in the repository, and older objects
are discarded.

However, we have no convenient way to keep certain precious, unreachable
objects around in the repository, even if they have aged out and would
be pruned. Our options today consist of:

  - Point references at the reachability tips of any objects you
    consider precious, which may be undesirable or infeasible if there
    are many such objects.

  - Track them via the reflog, which may be undesirable since the
    reflog's lifetime is limited to that of the reference it's tracking
    (and callers may want to keep those unreachable objects around for
    longer).

  - Extend the grace period, which may keep around other objects that
    the caller *does* want to discard.

  - Manually modify the mtimes of objects you want to keep. If those
    objects are already loose, this is easy enough to do (you can just
    enumerate and `touch -m` each one).

    But if they are packed, you will either end up modifying the mtimes
    of *all* objects in that pack, or be forced to write out a loose
    copy of that object, both of which may be undesirable. Even worse,
    if they are in a cruft pack, that requires modifying its `*.mtimes`
    file by hand, since there is no exposed plumbing for this.

  - Force the caller to construct the pack of objects they want
    to keep themselves, and then mark the pack as kept by adding a
    ".keep" file. This works, but is burdensome for the caller, and
    having extra packs is awkward as you roll forward your cruft pack.

This patch introduces a new option to the above list via the
`gc.recentObjectsHook` configuration, which allows the caller to
specify a program (or set of programs) whose output is treated as a set
of objects to treat as recent, regardless of their true age.

The implementation is straightforward. Git enumerates recent objects via
`add_unseen_recent_objects_to_traversal()`, which enumerates loose and
packed objects, and eventually calls add_recent_object() on any objects
for which `want_recent_object()`'s conditions are met.

This patch modifies the recency condition from simply "is the mtime of
this object more recent than the cutoff?" to "[...] or, is this object
mentioned by at least one `gc.recentObjectsHook`?".

Depending on whether or not we are generating a cruft pack, this allows
the caller to do one of two things:

  - If generating a cruft pack, the caller is able to retain additional
    objects via the cruft pack, even if they would have otherwise been
    pruned due to their age.

  - If not generating a cruft pack, the caller is likewise able to
    retain additional objects as loose.

A potential alternative here is to introduce a new mode to alter the
contents of the reachable pack instead of the cruft one. One could
imagine a new option to `pack-objects`, say `--extra-reachable-tips`
that does the same thing as above, adding the visited set of objects
along the traversal to the pack.

But this has the unfortunate side-effect of altering the reachability
closure of that pack. If parts of the unreachable object graph mentioned
by one or more of the "extra reachable tips" programs is not closed,
then the resulting pack won't be either. This makes it impossible in the
general case to write out reachability bitmaps for that pack, since
closure is a requirement there.

Instead, keep these unreachable objects in the cruft pack (or set of
unreachable, loose objects) instead, to ensure that we can continue to
have a pack containing just reachable objects, which is always safe to
write a bitmap over.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
 Documentation/config/gc.txt          |  15 +++
 reachable.c                          |  79 ++++++++++++-
 t/t5304-prune.sh                     |  14 +++
 t/t5329-pack-objects-cruft.sh        | 171 +++++++++++++++++++++++++++
 t/t7701-repack-unpack-unreachable.sh |  31 +++++
 5 files changed, 307 insertions(+), 3 deletions(-)

diff --git a/Documentation/config/gc.txt b/Documentation/config/gc.txt
index 7f95c866e1..ca47eb2008 100644
--- a/Documentation/config/gc.txt
+++ b/Documentation/config/gc.txt
@@ -130,6 +130,21 @@ or rebase occurring.  Since these changes are not part of the current
 project most users will want to expire them sooner, which is why the
 default is more aggressive than `gc.reflogExpire`.
 
+gc.recentObjectsHook::
+	When considering whether or not to remove an object (either when
+	generating a cruft pack or storing unreachable objects as
+	loose), use the shell to execute the specified command(s).
+	Interpret their output as object IDs which Git will consider as
+	"recent", regardless of their age. By treating their mtimes as
+	"now", any objects (and their descendants) mentioned in the
+	output will be kept regardless of their true age.
++
+Output must contain exactly one hex object ID per line, and nothing
+else. Objects which cannot be found in the repository are ignored.
+Multiple hooks are supported, but all must exit successfully, else the
+operation (either generating a cruft pack or unpacking unreachable
+objects) will be halted.
+
 gc.rerereResolved::
 	Records of conflicted merge you resolved earlier are
 	kept for this many days when 'git rerere gc' is run.
diff --git a/reachable.c b/reachable.c
index 7a42da5d39..60a7336b87 100644
--- a/reachable.c
+++ b/reachable.c
@@ -16,6 +16,8 @@
 #include "object-store.h"
 #include "pack-bitmap.h"
 #include "pack-mtimes.h"
+#include "config.h"
+#include "run-command.h"
 
 struct connectivity_progress {
 	struct progress *progress;
@@ -67,12 +69,75 @@ struct recent_data {
 	timestamp_t timestamp;
 	report_recent_object_fn *cb;
 	int ignore_in_core_kept_packs;
+
+	struct oidset extra_recent_oids;
+	int extra_recent_oids_loaded;
 };
 
+static int run_one_gc_recent_objects_hook(struct oidset *set,
+					    const char *args)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct strbuf buf = STRBUF_INIT;
+	FILE *out;
+	int ret = 0;
+
+	cmd.use_shell = 1;
+	cmd.out = -1;
+
+	strvec_push(&cmd.args, args);
+
+	if (start_command(&cmd))
+		return -1;
+
+	out = xfdopen(cmd.out, "r");
+	while (strbuf_getline(&buf, out) != EOF) {
+		struct object_id oid;
+		const char *rest;
+
+		if (parse_oid_hex(buf.buf, &oid, &rest) || *rest) {
+			ret = error(_("invalid extra cruft tip: '%s'"), buf.buf);
+			break;
+		}
+
+		oidset_insert(set, &oid);
+	}
+
+	fclose(out);
+	ret |= finish_command(&cmd);
+
+	strbuf_release(&buf);
+	return ret;
+}
+
+static void load_gc_recent_objects(struct recent_data *data)
+{
+	const struct string_list *programs;
+	int ret = 0;
+	size_t i;
+
+	data->extra_recent_oids_loaded = 1;
+
+	if (git_config_get_string_multi("gc.recentobjectshook", &programs))
+		return;
+
+	for (i = 0; i < programs->nr; i++) {
+		ret = run_one_gc_recent_objects_hook(&data->extra_recent_oids,
+						       programs->items[i].string);
+		if (ret)
+			die(_("unable to enumerate additional recent objects"));
+	}
+}
+
 static int obj_is_recent(const struct object_id *oid, timestamp_t mtime,
 			 struct recent_data *data)
 {
-	return mtime > data->timestamp;
+	if (mtime > data->timestamp)
+		return 1;
+
+	if (!data->extra_recent_oids_loaded)
+		load_gc_recent_objects(data);
+	return oidset_contains(&data->extra_recent_oids, oid);
 }
 
 static void add_recent_object(const struct object_id *oid,
@@ -199,16 +264,24 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
 	data.cb = cb;
 	data.ignore_in_core_kept_packs = ignore_in_core_kept_packs;
 
+	oidset_init(&data.extra_recent_oids, 0);
+	data.extra_recent_oids_loaded = 0;
+
 	r = for_each_loose_object(add_recent_loose, &data,
 				  FOR_EACH_OBJECT_LOCAL_ONLY);
 	if (r)
-		return r;
+		goto done;
 
 	flags = FOR_EACH_OBJECT_LOCAL_ONLY | FOR_EACH_OBJECT_PACK_ORDER;
 	if (ignore_in_core_kept_packs)
 		flags |= FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS;
 
-	return for_each_packed_object(add_recent_packed, &data, flags);
+	r = for_each_packed_object(add_recent_packed, &data, flags);
+
+done:
+	oidset_clear(&data.extra_recent_oids);
+
+	return r;
 }
 
 static int mark_object_seen(const struct object_id *oid,
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index f367327441..b4df545e5a 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -350,4 +350,18 @@ test_expect_success 'old reachable-from-recent retained with bitmaps' '
 	test_must_fail git cat-file -e $to_drop
 '
 
+test_expect_success 'gc.recentObjectsHook' '
+	add_blob &&
+	test-tool chmtime =-86500 $BLOB_FILE &&
+
+	write_script precious-objects <<-EOF &&
+	echo $BLOB
+	EOF
+	test_config gc.recentObjectsHook ./precious-objects &&
+
+	git prune --expire=now &&
+
+	git cat-file -p $BLOB
+'
+
 test_done
diff --git a/t/t5329-pack-objects-cruft.sh b/t/t5329-pack-objects-cruft.sh
index 303f7a5d84..45667d4999 100755
--- a/t/t5329-pack-objects-cruft.sh
+++ b/t/t5329-pack-objects-cruft.sh
@@ -739,4 +739,175 @@ test_expect_success 'cruft objects are freshend via loose' '
 	)
 '
 
+test_expect_success 'gc.recentObjectsHook' '
+	git init repo &&
+	test_when_finished "rm -fr repo" &&
+	(
+		cd repo &&
+
+		# Create a handful of objects.
+		#
+		#   - one reachable commit, "base", designated for the reachable
+		#     pack
+		#   - one unreachable commit, "cruft.discard", which is marked
+		#     for deletion
+		#   - one unreachable commit, "cruft.old", which would be marked
+		#     for deletion, but is rescued as an extra cruft tip
+		#   - one unreachable commit, "cruft.new", which is not marked
+		#     for deletion
+		test_commit base &&
+		git branch -M main &&
+
+		git checkout --orphan discard &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.discard &&
+
+		git checkout --orphan old &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.old &&
+		cruft_old="$(git rev-parse HEAD)" &&
+
+		git checkout --orphan new &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.new &&
+		cruft_new="$(git rev-parse HEAD)" &&
+
+		git checkout main &&
+		git branch -D discard old new &&
+		git reflog expire --all --expire=all &&
+
+		# mark cruft.old with an mtime that is many minutes
+		# older than the expiration period, and mark cruft.new
+		# with an mtime that is in the future (and thus not
+		# eligible for pruning).
+		test-tool chmtime -2000 "$objdir/$(test_oid_to_path $cruft_old)" &&
+		test-tool chmtime +1000 "$objdir/$(test_oid_to_path $cruft_new)" &&
+
+		# Write the list of cruft objects we expect to
+		# accumulate, which is comprised of everything reachable
+		# from cruft.old and cruft.new, but not cruft.discard.
+		git rev-list --objects --no-object-names \
+			$cruft_old $cruft_new >cruft.raw &&
+		sort cruft.raw >cruft.expect &&
+
+		# Write the script to list extra tips, which are limited
+		# to cruft.old, in this case.
+		write_script extra-tips <<-EOF &&
+		echo $cruft_old
+		EOF
+		git config gc.recentObjectsHook ./extra-tips &&
+
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft | sort >cruft.actual &&
+		test_cmp cruft.expect cruft.actual &&
+
+		# Ensure that the "old" objects are removed after
+		# dropping the gc.recentObjectsHook hook.
+		git config --unset gc.recentObjectsHook &&
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft | sort >cruft.actual &&
+
+		git rev-list --objects --no-object-names $cruft_new >cruft.raw &&
+		cp cruft.expect cruft.old &&
+		sort cruft.raw >cruft.expect &&
+		test_cmp cruft.expect cruft.actual &&
+
+		# ensure objects which are no longer in the cruft pack were
+		# removed from the repository
+		for object in $(comm -13 cruft.expect cruft.old)
+		do
+			test_must_fail git cat-file -t $object || return 1
+		done
+	)
+'
+
+test_expect_success 'multi-valued gc.recentObjectsHook' '
+	git init repo &&
+	test_when_finished "rm -fr repo" &&
+	(
+		cd repo &&
+
+		test_commit base &&
+		git branch -M main &&
+
+		git checkout --orphan cruft.a &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.a &&
+		cruft_a="$(git rev-parse HEAD)" &&
+
+		git checkout --orphan cruft.b &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.b &&
+		cruft_b="$(git rev-parse HEAD)" &&
+
+		git checkout main &&
+		git branch -D cruft.a cruft.b &&
+		git reflog expire --all --expire=all &&
+
+		echo "echo $cruft_a" | write_script extra-tips.a &&
+		echo "echo $cruft_b" | write_script extra-tips.b &&
+		echo "false" | write_script extra-tips.c &&
+
+		git rev-list --objects --no-object-names $cruft_a $cruft_b \
+			>cruft.raw &&
+		sort cruft.raw >cruft.expect &&
+
+		# ensure that each extra cruft tip is saved by its
+		# respective hook
+		git config --add gc.recentObjectsHook ./extra-tips.a &&
+		git config --add gc.recentObjectsHook ./extra-tips.b &&
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft | sort >cruft.actual &&
+		test_cmp cruft.expect cruft.actual &&
+
+		# ensure that a dirty exit halts cruft pack generation
+		git config --add gc.recentObjectsHook ./extra-tips.c &&
+		test_must_fail git repack --cruft --cruft-expiration=now -d 2>err &&
+		grep "unable to enumerate additional recent objects" err &&
+
+		# and that the existing cruft pack is left alone
+		test_path_is_file "$mtimes"
+	)
+'
+
+test_expect_success 'additional cruft blobs via gc.recentObjectsHook' '
+	git init repo &&
+	test_when_finished "rm -fr repo" &&
+	(
+		cd repo &&
+
+		test_commit base &&
+
+		blob=$(echo "unreachable" | git hash-object -w --stdin) &&
+
+		# mark the unreachable blob we wrote above as having
+		# aged out of the retention period
+		test-tool chmtime -2000 "$objdir/$(test_oid_to_path $blob)" &&
+
+		# Write the script to list extra tips, which is just the
+		# extra blob as above.
+		write_script extra-tips <<-EOF &&
+		echo $blob
+		EOF
+		git config gc.recentObjectsHook ./extra-tips &&
+
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft >actual &&
+		echo $blob >expect &&
+		test_cmp expect actual
+	)
+'
+
 test_done
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index ebb267855f..ba428c18a8 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -113,6 +113,37 @@ test_expect_success 'do not bother loosening old objects' '
 	test_must_fail git cat-file -p $obj2
 '
 
+test_expect_success 'gc.recentObjectsHook' '
+	obj1=$(echo one | git hash-object -w --stdin) &&
+	obj2=$(echo two | git hash-object -w --stdin) &&
+	obj3=$(echo three | git hash-object -w --stdin) &&
+	pack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&
+	pack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&
+	pack3=$(echo $obj3 | git pack-objects .git/objects/pack/pack) &&
+	git prune-packed &&
+
+	git cat-file -p $obj1 &&
+	git cat-file -p $obj2 &&
+	git cat-file -p $obj3 &&
+
+	git tag -a -m tag obj2-tag $obj2 &&
+	obj2_tag="$(git rev-parse obj2-tag)" &&
+
+	write_script precious-objects <<-EOF &&
+	echo $obj2_tag
+	EOF
+	git config gc.recentObjectsHook ./precious-objects &&
+
+	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
+	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
+	git repack -A -d --unpack-unreachable=1.hour.ago &&
+
+	git cat-file -p $obj1 &&
+	git cat-file -p $obj2 &&
+	git cat-file -p $obj2_tag &&
+	test_must_fail git cat-file -p $obj3
+'
+
 test_expect_success 'keep packed objects found only in index' '
 	echo my-unique-content >file &&
 	git add file &&
-- 
2.41.0.2.gaaae24b3a6.dirty

^ permalink raw reply related	[relevance 8%]

* [PATCH v5 0/2] gc: introduce `gc.recentObjectsHook`
      2023-05-16  0:23  5% ` [PATCH v4 0/2] gc: introduce `gc.recentObjectsHook` Taylor Blau
@ 2023-06-07 22:58  5% ` Taylor Blau
  2023-06-07 22:58  8%   ` [PATCH v5 2/2] " Taylor Blau
  2 siblings, 1 reply; 200+ results
From: Taylor Blau @ 2023-06-07 22:58 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Chris Torek, Derrick Stolee, Junio C Hamano, Glen Choo

Here is a version of my series to implement the mutli-valued
"gc.recentObjectHook" configuration, which allows users to define custom
programs whose output determines an additional set of objects to retain
(along with their descendants) when GCing, regardless of their true age.

It is largely the same as the previous round, with the following
changes:

  - a small handful of wordsmithing changes in the second patch's
    message thanks to a very helpful review from the Google team's
    "Review Club" meeting.

  - removed a pair of stray references to "cruft tips" in favor of
    "recent objects".

  - rebased onto v2.41.0

Based on previous rounds of review, I think that this version should be
pretty much ready to go. But I'd appreciate some extra eyes on it just
to make sure.

Thanks in advance for your (hopefully final!) review.

Taylor Blau (2):
  reachable.c: extract `obj_is_recent()`
  gc: introduce `gc.recentObjectsHook`

 Documentation/config/gc.txt          |  15 +++
 reachable.c                          |  85 ++++++++++++-
 t/t5304-prune.sh                     |  14 +++
 t/t5329-pack-objects-cruft.sh        | 171 +++++++++++++++++++++++++++
 t/t7701-repack-unpack-unreachable.sh |  31 +++++
 5 files changed, 313 insertions(+), 3 deletions(-)

Range-diff against v4:
1:  9c1b59c8cf = 1:  38c4c4a17f reachable.c: extract `obj_is_recent()`
2:  18e50d2517 ! 2:  f661b54941 gc: introduce `gc.recentObjectsHook`
    @@ Commit message
         be pruned. Our options today consist of:
     
           - Point references at the reachability tips of any objects you
    -        consider precious, which may be undesirable or infeasible.
    +        consider precious, which may be undesirable or infeasible if there
    +        are many such objects.
     
           - Track them via the reflog, which may be undesirable since the
             reflog's lifetime is limited to that of the reference it's tracking
    @@ Documentation/config/gc.txt: or rebase occurring.  Since these changes are not p
      default is more aggressive than `gc.reflogExpire`.
      
     +gc.recentObjectsHook::
    -+	When considering the recency of an object (e.g., when generating
    -+	a cruft pack or storing unreachable objects as loose), use the
    -+	shell to execute the specified command(s). Interpret their
    -+	output as object IDs which Git will consider as "recent",
    -+	regardless of their age.
    ++	When considering whether or not to remove an object (either when
    ++	generating a cruft pack or storing unreachable objects as
    ++	loose), use the shell to execute the specified command(s).
    ++	Interpret their output as object IDs which Git will consider as
    ++	"recent", regardless of their age. By treating their mtimes as
    ++	"now", any objects (and their descendants) mentioned in the
    ++	output will be kept regardless of their true age.
     ++
     +Output must contain exactly one hex object ID per line, and nothing
     +else. Objects which cannot be found in the repository are ignored.
    @@ reachable.c: struct recent_data {
     +		ret = run_one_gc_recent_objects_hook(&data->extra_recent_oids,
     +						       programs->items[i].string);
     +		if (ret)
    -+			die(_("unable to enumerate additional cruft tips"));
    ++			die(_("unable to enumerate additional recent objects"));
     +	}
     +}
     +
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +		# ensure that a dirty exit halts cruft pack generation
     +		git config --add gc.recentObjectsHook ./extra-tips.c &&
     +		test_must_fail git repack --cruft --cruft-expiration=now -d 2>err &&
    -+		grep "unable to enumerate additional cruft tips" err &&
    ++		grep "unable to enumerate additional recent objects" err &&
     +
     +		# and that the existing cruft pack is left alone
     +		test_path_is_file "$mtimes"
-- 
2.41.0.2.gaaae24b3a6.dirty

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v4 2/2] gc: introduce `gc.recentObjectsHook`
  2023-05-24 23:21  6%     ` Glen Choo
@ 2023-06-07 22:56  5%       ` Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-06-07 22:56 UTC (permalink / raw)
  To: Glen Choo
  Cc: git, Derrick Stolee, Jeff King, Junio C Hamano, Chris Torek, me,
	martinvonz

Hi Glen,

Apologies for my delayed response. Now that we are on the other side of
2.41 I think that it's the right time to pick this back up again.

On Wed, May 24, 2023 at 04:21:34PM -0700, Glen Choo wrote:
> Hi Taylor! It was great seeing you at Review Club today :)

It was fun :-).

> It would be useful to flesh out why keeping these extra refs are
> either "undesirable" or "infeasible". Presumably, you already have
> some idea of why this is the case for the GitHub 'audit log'.

Yes, thanks for suggesting it. I think the gap in my explanation is
"[...] if there are many such objects". Hopefully that clarifies it.

> Another potential use case I can think of is client-side third party Git
> tools that implement custom workflows on top of a Git repo, e.g.
> git-branchless (https://github.com/arxanas/git-branchless) and jj
> (https://github.com/martinvonz/jj/, btw I contribute a little to jj
> too).

I thought that this was an interesting part of the discussion. I hadn't
thought of it when writing up these patches, but I think that it could
be potentially useful for those tools if they want to keep around some
precious set of metadata objects without having to point refs at them.

It also introduces a little bit of a higher barrier between the tool and
user to destroy those objects. Without pinning them with this hook, all
a user has to do to remove them is drop the reference(s) which points at
them, and then GC. Now they'd have to modify the hook, etc.

> > +gc.recentObjectsHook::
>
> I have a small preference to use "command" instead of "hook" to avoid
> confusion with Git hooks (I've already observed some of this confusion
> in off-list conversations). There's some precedent for "hook" in
> `uploadpack.packObjectsHook`, but that's a one-off (and it used to
> confuse me a lot too :P).

Unless you feel strongly, let's leave it as-is. "gc.recentObjectsHook"
is the third iteration of this name, and I'd like to avoid spending much
more time on naming if we can help it.

> > +	When considering the recency of an object (e.g., when generating
> > +	a cruft pack or storing unreachable objects as loose), use the
> > +	shell to execute the specified command(s). Interpret their
> > +	output as object IDs which Git will consider as "recent",
> > +	regardless of their age.
>
> >From a potential user's POV, two things seem unclear:
>
> - What does "recenct" mean in this context? Does it just mean
>   "precious"?
> - What objects do I need to list? Is it every object I want to keep or
>   just the reachable tips?

To answer your questions: recency is referring to the "mtime" of an
object [^1], not whether or not it is precious. I clarified this by
removing the term "recent" from this sentence altogether, to instead
read:

    "When considering whether or not to remove an object [...]"

You only need to list the tips, since Git will treat the output of the
hook as input to a traversal which allows for missing objects. Any
object visited along that traversal will be kept in the repository and
rescued from deletion. I tried to clarify this by adding a final
sentence (emphasis mine):

    "By treating their mtimes as "now", any objects **(and their
    descendants)** mentioned in the output will be kept regardless of
    their true age."

> In the code changes, I noticed a few out-of-date references to "cruft
> tips", but everything else looked reasonable to me.

Thanks, I'll clean those up and resubmit it with the above fixes
squashed in.

Thanks,
Taylor

[^1]: an object's mtime is the most recent of (1) the st_mtime of a its
  loose object file, if it exists, (2) the st_mtime of any non-cruft
  pack(s) that contain that object, or (3) the value listed in the .mtimes
  file of the cruft pack corresponding to that object's entry.

^ permalink raw reply	[relevance 5%]

* [PATCH v2 0/3] Create stronger guard rails on replace refs
    2023-05-26 18:43  3% ` [PATCH 1/3] repository: create disable_replace_refs() Derrick Stolee via GitGitGadget
@ 2023-06-02 14:29  2% ` Derrick Stolee via GitGitGadget
  1 sibling, 0 replies; 200+ results
From: Derrick Stolee via GitGitGadget @ 2023-06-02 14:29 UTC (permalink / raw)
  To: git; +Cc: vdye, me, newren, gitster, Jeff King, Derrick Stolee

(This series is based on tb/pack-bitmap-traversal-with-boundary due to
wanting to modify prepare_repo_settings() in a similar way.)

The replace-refs can be ignored via the core.useReplaceRefs=false config
setting. This setting is possible to miss in some Git commands if they do
not load default config at the appropriate time. See [1] for a recent
example of this.

[1]
https://lore.kernel.org/git/pull.1530.git.1683745654800.gitgitgadget@gmail.com/

This series aims to avoid this kind of error from happening in the future.
The idea is to encapsulate the setting in such a way that we can guarantee
that config has been checked before using the in-memory value.

Further, we must be careful that some Git commands want to disable replace
refs unconditionally, as if GIT_NO_REPLACE_REFS was enabled in the
environment.

The approach taken here is to split the global into two different sources.
First, read_replace_refs is kept (but moved to replace-objects.c scope) and
reflects whether or not the feature is permitted by the environment and the
current command. Second, a new value is added to repo-settings and this is
checked after using prepare_repo_settings() to guarantee the config has been
read.

This presents a potential behavior change, in that now core.useReplaceRefs
is specific to each in-memory repository instead of applying the
superproject value to all submodules. I could not find a Git command that
has multiple in-memory repositories and follows OIDs to object contents, so
I'm not sure how to demonstrate it in a test.

Here is the breakdown of the series:

 * Patch 1 creates disable_replace_refs() to encapsulate the global
   disabling of the feature.
 * Patch 2 creates replace_refs_enabled() to check if the feature is enabled
   (with respect to a given repository). This is a thin wrapper of the
   global at this point, but does allow us to remove it from environment.h.
 * Patch 3 creates the value in repo-settings as well as ensures that the
   repo settings have been prepared before accessing the value within
   replace_refs_enabled(). A test is added to demonstrate how the config
   value is now scoped on a per-repository basis.


Updates in v2
=============

Thanks for the careful review on v1!

 * disable_replace_refs() now replaces "read_replace_refs = 0" in the exact
   same line to avoid possible behavior change.
 * Stale comments, include headers, and commit messages are updated to
   include the latest status.
 * Patch 3 contains a test of the repo-scoped value using 'git grep'.

Thanks, -Stolee

Derrick Stolee (3):
  repository: create disable_replace_refs()
  replace-objects: create wrapper around setting
  repository: create read_replace_refs setting

 builtin/cat-file.c                 |  2 +-
 builtin/commit-graph.c             |  2 +-
 builtin/fsck.c                     |  2 +-
 builtin/index-pack.c               |  2 +-
 builtin/pack-objects.c             |  2 +-
 builtin/prune.c                    |  2 +-
 builtin/replace.c                  |  2 +-
 builtin/unpack-objects.c           |  2 +-
 builtin/upload-pack.c              |  2 +-
 commit-graph.c                     |  4 +--
 config.c                           |  5 ----
 environment.c                      |  3 +--
 git.c                              |  2 +-
 log-tree.c                         |  2 +-
 replace-object.c                   | 23 ++++++++++++++++-
 replace-object.h                   | 31 ++++++++++++++++-------
 repo-settings.c                    |  1 +
 repository.h                       |  9 +++++++
 t/t7814-grep-recurse-submodules.sh | 40 ++++++++++++++++++++++++++++++
 19 files changed, 107 insertions(+), 31 deletions(-)


base-commit: b0afdce5dab61f224fd66c13768facc36a7f8705
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1537%2Fderrickstolee%2Freplace-refs-safety-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1537/derrickstolee/replace-refs-safety-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1537

Range-diff vs v1:

 1:  56544abc15d ! 1:  0616fdbf303 repository: create disable_replace_refs()
     @@ Commit message
          transition by abstracting the purpose of these global assignments with a
          method call.
      
     -    We will never scope this to an in-memory repository as we want to make
     -    sure that we never use replace refs throughout the life of the process
     -    if this method is called.
     +    We will need to keep this read_replace_refs global forever, as we want
     +    to make sure that we never use replace refs throughout the life of the
     +    process if this method is called. Future changes may present a
     +    repository-scoped version of the variable to represent that repository's
     +    core.useReplaceRefs config value, but a zero-valued read_replace_refs
     +    will always override such a setting.
      
          Signed-off-by: Derrick Stolee <derrickstolee@github.com>
      
     @@ builtin/cat-file.c: static int batch_objects(struct batch_options *opt)
       		cb.expand = &data;
      
       ## builtin/commit-graph.c ##
     -@@ builtin/commit-graph.c: static int graph_verify(int argc, const char **argv, const char *prefix)
     - 	return ret;
     - }
     - 
     --extern int read_replace_refs;
     - static struct commit_graph_opts write_opts;
     - 
     - static int write_option_parse_split(const struct option *opt, const char *arg,
      @@ builtin/commit-graph.c: int cmd_commit_graph(int argc, const char **argv, const char *prefix)
     - 	struct option *options = parse_options_concat(builtin_commit_graph_options, common_opts);
       
       	git_config(git_default_config, NULL);
     --
     + 
      -	read_replace_refs = 0;
     ++	disable_replace_refs();
       	save_commit_buffer = 0;
       
       	argc = parse_options(argc, argv, prefix, options,
     - 			     builtin_commit_graph_usage, 0);
     - 	FREE_AND_NULL(options);
     - 
     -+	disable_replace_refs();
     -+
     - 	return fn(argc, argv, prefix);
     - }
      
       ## builtin/fsck.c ##
      @@ builtin/fsck.c: int cmd_fsck(int argc, const char **argv, const char *prefix)
     @@ builtin/fsck.c: int cmd_fsck(int argc, const char **argv, const char *prefix)
       
       	errors_found = 0;
      -	read_replace_refs = 0;
     ++	disable_replace_refs();
       	save_commit_buffer = 0;
       
       	argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
     -@@ builtin/fsck.c: int cmd_fsck(int argc, const char **argv, const char *prefix)
     - 
     - 	git_config(git_fsck_config, &fsck_obj_options);
     - 	prepare_repo_settings(the_repository);
     -+	disable_replace_refs();
     - 
     - 	if (connectivity_only) {
     - 		for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
      
       ## builtin/index-pack.c ##
      @@ builtin/index-pack.c: int cmd_index_pack(int argc, const char **argv, const char *prefix)
     @@ builtin/pack-objects.c: int cmd_pack_objects(int argc, const char **argv, const
       		BUG("too many dfs states, increase OE_DFS_STATE_BITS");
       
      -	read_replace_refs = 0;
     --
     - 	sparse = git_env_bool("GIT_TEST_PACK_SPARSE", -1);
      +	disable_replace_refs();
     + 
     + 	sparse = git_env_bool("GIT_TEST_PACK_SPARSE", -1);
       	if (the_repository->gitdir) {
     - 		prepare_repo_settings(the_repository);
     - 		if (sparse < 0)
      
       ## builtin/prune.c ##
      @@ builtin/prune.c: int cmd_prune(int argc, const char **argv, const char *prefix)
     @@ builtin/prune.c: int cmd_prune(int argc, const char **argv, const char *prefix)
       	expire = TIME_MAX;
       	save_commit_buffer = 0;
      -	read_replace_refs = 0;
     ++	disable_replace_refs();
       	repo_init_revisions(the_repository, &revs, prefix);
       
       	argc = parse_options(argc, argv, prefix, options, prune_usage, 0);
     -@@ builtin/prune.c: int cmd_prune(int argc, const char **argv, const char *prefix)
     - 	if (repository_format_precious_objects)
     - 		die(_("cannot prune in a precious-objects repo"));
     - 
     -+	disable_replace_refs();
     -+
     - 	while (argc--) {
     - 		struct object_id oid;
     - 		const char *name = *argv++;
      
       ## builtin/replace.c ##
      @@ builtin/replace.c: int cmd_replace(int argc, const char **argv, const char *prefix)
     @@ builtin/replace.c: int cmd_replace(int argc, const char **argv, const char *pref
       	};
       
      -	read_replace_refs = 0;
     ++	disable_replace_refs();
       	git_config(git_default_config, NULL);
       
       	argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
     - 
     -+	disable_replace_refs();
     -+
     - 	if (!cmdmode)
     - 		cmdmode = argc ? MODE_REPLACE : MODE_LIST;
     - 
      
       ## builtin/unpack-objects.c ##
      @@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
     @@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc, const char **argv, co
       	struct object_id oid;
       
      -	read_replace_refs = 0;
     --
     - 	git_config(git_default_config, NULL);
      +	disable_replace_refs();
       
     - 	quiet = !isatty(2);
     + 	git_config(git_default_config, NULL);
       
      
       ## builtin/upload-pack.c ##
     @@ builtin/upload-pack.c: int cmd_upload_pack(int argc, const char **argv, const ch
       
       	packet_trace_identity("upload-pack");
      -	read_replace_refs = 0;
     ++	disable_replace_refs();
       
       	argc = parse_options(argc, argv, prefix, options, upload_pack_usage, 0);
       
     -@@ builtin/upload-pack.c: int cmd_upload_pack(int argc, const char **argv, const char *prefix)
     - 	if (!enter_repo(dir, strict))
     - 		die("'%s' does not appear to be a git repository", dir);
     - 
     -+	disable_replace_refs();
     -+
     - 	switch (determine_protocol_version_server()) {
     - 	case protocol_v2:
     - 		if (advertise_refs)
      
       ## environment.c ##
      @@ environment.c: void setup_git_env(const char *git_dir)
     @@ replace-object.h: static inline const struct object_id *lookup_replace_object(st
      +void disable_replace_refs(void);
      +
       #endif /* REPLACE_OBJECT_H */
     -
     - ## repo-settings.c ##
     -@@
     - #include "repository.h"
     - #include "midx.h"
     - #include "compat/fsmonitor/fsm-listen.h"
     -+#include "environment.h"
     - 
     - static void repo_cfg_bool(struct repository *r, const char *key, int *dest,
     - 			  int def)
 2:  5fc2f923d9e = 2:  0831e7f8b5e replace-objects: create wrapper around setting
 3:  481a81a515e ! 3:  4c7dbeb8c6d repository: create read_replace_refs setting
     @@ Commit message
          then it would now respect the core.useReplaceRefs config value in each
          repository.
      
     -    Unfortunately, the existing processes that recurse into submodules do
     -    not appear to follow object IDs to their contents, so this behavior
     -    change is not visible in the current implementation. It is something
     -    valuable for future behavior changes.
     +    'git grep --recurse-submodules' is such a command that recurses into
     +    submodules in-process. We can demonstrate the granularity of this config
     +    value via a test in t7814.
      
          Signed-off-by: Derrick Stolee <derrickstolee@github.com>
      
     @@ repository.h: struct repo_settings {
       	int pack_use_bitmap_boundary_traversal;
       
      +	/*
     -+	 * Do replace refs need to be checked this run?  This variable is
     -+	 * initialized to true unless --no-replace-object is used or
     -+	 * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some
     -+	 * commands that do not want replace references to be active.
     ++	 * Has this repository have core.useReplaceRefs=true (on by
     ++	 * default)? This provides a repository-scoped version of this
     ++	 * config, though it could be disabled process-wide via some Git
     ++	 * builtins or the --no-replace-objects option. See
     ++	 * replace_refs_enabled() for more details.
      +	 */
      +	int read_replace_refs;
      +
       	struct fsmonitor_settings *fsmonitor; /* lazily loaded */
       
       	int index_version;
     +
     + ## t/t7814-grep-recurse-submodules.sh ##
     +@@ t/t7814-grep-recurse-submodules.sh: test_expect_success 'grep partially-cloned submodule' '
     + 	)
     + '
     + 
     ++test_expect_success 'check scope of core.useReplaceRefs' '
     ++	git init base &&
     ++	git init base/sub &&
     ++
     ++	echo A >base/a &&
     ++	echo B >base/b &&
     ++	echo C >base/sub/c &&
     ++	echo D >base/sub/d &&
     ++
     ++	git -C base/sub add c d &&
     ++	git -C base/sub commit -m "Add files" &&
     ++
     ++	git -C base submodule add ./sub &&
     ++	git -C base add a b sub &&
     ++	git -C base commit -m "Add files and submodule" &&
     ++
     ++	A=$(git -C base rev-parse HEAD:a) &&
     ++	B=$(git -C base rev-parse HEAD:b) &&
     ++	C=$(git -C base/sub rev-parse HEAD:c) &&
     ++	D=$(git -C base/sub rev-parse HEAD:d) &&
     ++
     ++	git -C base replace $A $B &&
     ++	git -C base/sub replace $C $D &&
     ++
     ++	test_must_fail git -C base grep --cached --recurse-submodules A &&
     ++	test_must_fail git -C base grep --cached --recurse-submodules C &&
     ++
     ++	git -C base config core.useReplaceRefs false &&
     ++	git -C base grep --recurse-submodules A &&
     ++	test_must_fail git -C base grep --cached --recurse-submodules C &&
     ++
     ++	git -C base/sub config core.useReplaceRefs false &&
     ++	git -C base grep --cached --recurse-submodules A &&
     ++	git -C base grep --cached --recurse-submodules C &&
     ++
     ++	git -C base config --unset core.useReplaceRefs &&
     ++	test_must_fail git -C base grep --cached --recurse-submodules A &&
     ++	git -C base grep --cached --recurse-submodules C
     ++'
     ++
     + test_done

-- 
gitgitgadget

^ permalink raw reply	[relevance 2%]

* Re: [PATCH v2 3/3] repository: move 'repository_format_worktree_config' to repo scope
  @ 2023-06-01  4:43  4%       ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-01  4:43 UTC (permalink / raw)
  To: Glen Choo
  Cc: Victoria Dye via GitGitGadget, git, Jonathan Tan, derrickstolee,
	Victoria Dye

Glen Choo <chooglen@google.com> writes:

>> @@ -1423,6 +1422,9 @@ int discover_git_directory(struct strbuf *commondir,
>>  		return -1;
>>  	}
>>  
>> +	the_repository->repository_format_worktree_config =
>> +		candidate.worktree_config;
>> +
>>  	/* take ownership of candidate.partial_clone */
>>  	the_repository->repository_format_partial_clone =
>>  		candidate.partial_clone;
>
> This hunk does not copy .hash_algo. I initially wondered if it is safe
> to just copy .hash_algo here too, but I now suspect that we shouldn't
> have done the_repository setup in discover_git_directory() in the first
> place.

That's quite a departure from the established practice, isn't it?
Due to recent and not so recent header shuffling (moving everything
out of cache.h, dropping "extern", etc.), "git blame" is a bit hard
to follow, but ever since 16ac8b8d (setup: introduce the
discover_git_directory() function, 2017-03-13) added the function,
we do execute the "setup" when we know we are in a repository.

It would probably be worth mentioning that the "global state" Dscho
refers to in that commit is primarily about the current directory of
the Git process.  During the discovery, we used to go up one level
at a time and tried to see if the current directory is either the
top of the working tree (i.e.  has ".git/" that is a git repository)
or the top of a GIT_DIR-looking directory.  That was changed in
ce9b8aab (setup_git_directory_1(): avoid changing global state,
2017-03-13) in the same series and discusses what "global state" the
series addresses.

If a relatively recent and oddball caller calls the function when it
does not want any of the setup donw after finding out that we could
use the directory as a repository, a new early "pure discovery" part
should be split out of the function, and both the function itself
and the oddball caller should be taught to call that pure-discovery
helper, I think.

> If I'm wrong and we _should_ be doing the_repository setup, then I'm
> guessing it's safe to copy .hash_algo here too. So either way, I think
> we should introduce a helper function to do the copying, especially
> because we will probably need to repeat this process yet again for
> "repository_format_precious_objects".

I do not know (or care in the context of this thread) about the
"precious objects" bit, but .worktree-config is the third one on top
of .hash_algo and .partial_clone, and it generally is a good time to
refactor when you find yourself adding the third instance of
repetitive code.  So I agree with you that it is time to introduce a
helper function to copy from a "struct repository_format" to the
repository instance.


^ permalink raw reply	[relevance 4%]

* Re: [PATCH 1/3] repository: create disable_replace_refs()
  2023-05-26 18:43  3% ` [PATCH 1/3] repository: create disable_replace_refs() Derrick Stolee via GitGitGadget
@ 2023-05-31  4:41  0%   ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2023-05-31  4:41 UTC (permalink / raw)
  To: Derrick Stolee via GitGitGadget; +Cc: git, vdye, me, gitster, Derrick Stolee

On Fri, May 26, 2023 at 11:43 AM Derrick Stolee via GitGitGadget
<gitgitgadget@gmail.com> wrote:
>
> From: Derrick Stolee <derrickstolee@github.com>
>
> Several builtins depend on being able to disable the replace references
> so we actually operate on each object individually. These currently do
> so by directly mutating the 'read_replace_refs' global.
>
> A future change will move this global into a different place, so it will
> be necessary to change all of these lines. However, we can simplify that
> transition by abstracting the purpose of these global assignments with a
> method call.
>
> We will never scope this to an in-memory repository as we want to make
> sure that we never use replace refs throughout the life of the process
> if this method is called.

I'm confused; doesn't the 3rd patch do exactly what this paragraph
says you'll never do?

> Signed-off-by: Derrick Stolee <derrickstolee@github.com>
> ---
>  builtin/cat-file.c       | 2 +-
>  builtin/commit-graph.c   | 5 ++---
>  builtin/fsck.c           | 2 +-
>  builtin/index-pack.c     | 2 +-
>  builtin/pack-objects.c   | 3 +--
>  builtin/prune.c          | 3 ++-
>  builtin/replace.c        | 3 ++-
>  builtin/unpack-objects.c | 3 +--
>  builtin/upload-pack.c    | 3 ++-
>  environment.c            | 2 +-
>  git.c                    | 2 +-
>  replace-object.c         | 5 +++++
>  replace-object.h         | 8 ++++++++
>  repo-settings.c          | 1 +
>  14 files changed, 29 insertions(+), 15 deletions(-)
>
> diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> index 0bafc14e6c0..27f070267a4 100644
> --- a/builtin/cat-file.c
> +++ b/builtin/cat-file.c
> @@ -805,7 +805,7 @@ static int batch_objects(struct batch_options *opt)
>                 if (repo_has_promisor_remote(the_repository))
>                         warning("This repository uses promisor remotes. Some objects may not be loaded.");
>
> -               read_replace_refs = 0;
> +               disable_replace_refs();
>
>                 cb.opt = opt;
>                 cb.expand = &data;
> diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
> index a3d00fa232b..639c9ca8b91 100644
> --- a/builtin/commit-graph.c
> +++ b/builtin/commit-graph.c
> @@ -122,7 +122,6 @@ static int graph_verify(int argc, const char **argv, const char *prefix)
>         return ret;
>  }
>
> -extern int read_replace_refs;
>  static struct commit_graph_opts write_opts;
>
>  static int write_option_parse_split(const struct option *opt, const char *arg,
> @@ -323,13 +322,13 @@ int cmd_commit_graph(int argc, const char **argv, const char *prefix)
>         struct option *options = parse_options_concat(builtin_commit_graph_options, common_opts);
>
>         git_config(git_default_config, NULL);
> -
> -       read_replace_refs = 0;
>         save_commit_buffer = 0;
>
>         argc = parse_options(argc, argv, prefix, options,
>                              builtin_commit_graph_usage, 0);
>         FREE_AND_NULL(options);
>
> +       disable_replace_refs();
> +

In this place and several others in the file, you opt to not just
replace the assignment with a function call, but move the action line
to later in the file.  In some cases, much later.

I don't think it hurts things, but it certainly makes me wonder why it
was moved.  Did it break for some reason when called earlier?  (Is
there something trickier about this patch than I expected?)

>         return fn(argc, argv, prefix);
>  }
> diff --git a/builtin/fsck.c b/builtin/fsck.c
> index 2cd461b84c1..8a2d7afc83a 100644
> --- a/builtin/fsck.c
> +++ b/builtin/fsck.c
> @@ -927,7 +927,6 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
>         fetch_if_missing = 0;
>
>         errors_found = 0;
> -       read_replace_refs = 0;
>         save_commit_buffer = 0;
>
>         argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
> @@ -953,6 +952,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
>
>         git_config(git_fsck_config, &fsck_obj_options);
>         prepare_repo_settings(the_repository);
> +       disable_replace_refs();
>
>         if (connectivity_only) {
>                 for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
> diff --git a/builtin/index-pack.c b/builtin/index-pack.c
> index bb67e166559..d0d8067510b 100644
> --- a/builtin/index-pack.c
> +++ b/builtin/index-pack.c
> @@ -1752,7 +1752,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
>         if (argc == 2 && !strcmp(argv[1], "-h"))
>                 usage(index_pack_usage);
>
> -       read_replace_refs = 0;
> +       disable_replace_refs();
>         fsck_options.walk = mark_link;
>
>         reset_pack_idx_option(&opts);
> diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
> index a5b466839ba..55635bdf4b4 100644
> --- a/builtin/pack-objects.c
> +++ b/builtin/pack-objects.c
> @@ -4284,9 +4284,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
>         if (DFS_NUM_STATES > (1 << OE_DFS_STATE_BITS))
>                 BUG("too many dfs states, increase OE_DFS_STATE_BITS");
>
> -       read_replace_refs = 0;
> -
>         sparse = git_env_bool("GIT_TEST_PACK_SPARSE", -1);
> +       disable_replace_refs();
>         if (the_repository->gitdir) {
>                 prepare_repo_settings(the_repository);
>                 if (sparse < 0)
> diff --git a/builtin/prune.c b/builtin/prune.c
> index 5dc9b207200..a8f3848c3a3 100644
> --- a/builtin/prune.c
> +++ b/builtin/prune.c
> @@ -164,7 +164,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
>
>         expire = TIME_MAX;
>         save_commit_buffer = 0;
> -       read_replace_refs = 0;
>         repo_init_revisions(the_repository, &revs, prefix);
>
>         argc = parse_options(argc, argv, prefix, options, prune_usage, 0);
> @@ -172,6 +171,8 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
>         if (repository_format_precious_objects)
>                 die(_("cannot prune in a precious-objects repo"));
>
> +       disable_replace_refs();
> +
>         while (argc--) {
>                 struct object_id oid;
>                 const char *name = *argv++;
> diff --git a/builtin/replace.c b/builtin/replace.c
> index 981f1894436..6c6f0b3ed01 100644
> --- a/builtin/replace.c
> +++ b/builtin/replace.c
> @@ -566,11 +566,12 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
>                 OPT_END()
>         };
>
> -       read_replace_refs = 0;
>         git_config(git_default_config, NULL);
>
>         argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
>
> +       disable_replace_refs();
> +
>         if (!cmdmode)
>                 cmdmode = argc ? MODE_REPLACE : MODE_LIST;
>
> diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
> index 2c52c3a741f..3f5f6719405 100644
> --- a/builtin/unpack-objects.c
> +++ b/builtin/unpack-objects.c
> @@ -609,9 +609,8 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
>         int i;
>         struct object_id oid;
>
> -       read_replace_refs = 0;
> -
>         git_config(git_default_config, NULL);
> +       disable_replace_refs();
>
>         quiet = !isatty(2);
>
> diff --git a/builtin/upload-pack.c b/builtin/upload-pack.c
> index beb9dd08610..6fc9a8feab0 100644
> --- a/builtin/upload-pack.c
> +++ b/builtin/upload-pack.c
> @@ -36,7 +36,6 @@ int cmd_upload_pack(int argc, const char **argv, const char *prefix)
>         };
>
>         packet_trace_identity("upload-pack");
> -       read_replace_refs = 0;
>
>         argc = parse_options(argc, argv, prefix, options, upload_pack_usage, 0);
>
> @@ -50,6 +49,8 @@ int cmd_upload_pack(int argc, const char **argv, const char *prefix)
>         if (!enter_repo(dir, strict))
>                 die("'%s' does not appear to be a git repository", dir);
>
> +       disable_replace_refs();
> +
>         switch (determine_protocol_version_server()) {
>         case protocol_v2:
>                 if (advertise_refs)
> diff --git a/environment.c b/environment.c
> index 8a96997539a..3b4d87c322f 100644
> --- a/environment.c
> +++ b/environment.c
> @@ -185,7 +185,7 @@ void setup_git_env(const char *git_dir)
>         strvec_clear(&to_free);
>
>         if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
> -               read_replace_refs = 0;
> +               disable_replace_refs();
>         replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT);
>         git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base
>                                                           : "refs/replace/");
> diff --git a/git.c b/git.c
> index 45899be8265..3252d4c7661 100644
> --- a/git.c
> +++ b/git.c
> @@ -185,7 +185,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
>                         if (envchanged)
>                                 *envchanged = 1;
>                 } else if (!strcmp(cmd, "--no-replace-objects")) {
> -                       read_replace_refs = 0;
> +                       disable_replace_refs();
>                         setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1);
>                         if (envchanged)
>                                 *envchanged = 1;
> diff --git a/replace-object.c b/replace-object.c
> index e98825d5852..ceec81c940c 100644
> --- a/replace-object.c
> +++ b/replace-object.c
> @@ -84,3 +84,8 @@ const struct object_id *do_lookup_replace_object(struct repository *r,
>         }
>         die(_("replace depth too high for object %s"), oid_to_hex(oid));
>  }
> +
> +void disable_replace_refs(void)
> +{
> +       read_replace_refs = 0;
> +}
> diff --git a/replace-object.h b/replace-object.h
> index 500482b02b3..7786d4152b0 100644
> --- a/replace-object.h
> +++ b/replace-object.h
> @@ -48,4 +48,12 @@ static inline const struct object_id *lookup_replace_object(struct repository *r
>         return do_lookup_replace_object(r, oid);
>  }
>
> +/*
> + * Some commands override config and environment settings for using
> + * replace references. Use this method to disable the setting and ensure
> + * those other settings will not override this choice. This applies
> + * globally to all in-process repositories.
> + */
> +void disable_replace_refs(void);
> +
>  #endif /* REPLACE_OBJECT_H */
> diff --git a/repo-settings.c b/repo-settings.c
> index 7b566d729d0..1df0320bf33 100644
> --- a/repo-settings.c
> +++ b/repo-settings.c
> @@ -3,6 +3,7 @@
>  #include "repository.h"
>  #include "midx.h"
>  #include "compat/fsmonitor/fsm-listen.h"
> +#include "environment.h"

Why?  There are no other changes in this file, so I don't see why
you'd need another include.

>
>  static void repo_cfg_bool(struct repository *r, const char *key, int *dest,
>                           int def)
> --
> gitgitgadget

I think the patch is probably fine, but I saw a few things that made
me wonder if I had missed something important, highlighted above.

^ permalink raw reply	[relevance 0%]

* [PATCH 1/3] repository: create disable_replace_refs()
  @ 2023-05-26 18:43  3% ` Derrick Stolee via GitGitGadget
  2023-05-31  4:41  0%   ` Elijah Newren
  2023-06-02 14:29  2% ` [PATCH v2 0/3] Create stronger guard rails on replace refs Derrick Stolee via GitGitGadget
  1 sibling, 1 reply; 200+ results
From: Derrick Stolee via GitGitGadget @ 2023-05-26 18:43 UTC (permalink / raw)
  To: git; +Cc: vdye, me, newren, gitster, Derrick Stolee, Derrick Stolee

From: Derrick Stolee <derrickstolee@github.com>

Several builtins depend on being able to disable the replace references
so we actually operate on each object individually. These currently do
so by directly mutating the 'read_replace_refs' global.

A future change will move this global into a different place, so it will
be necessary to change all of these lines. However, we can simplify that
transition by abstracting the purpose of these global assignments with a
method call.

We will never scope this to an in-memory repository as we want to make
sure that we never use replace refs throughout the life of the process
if this method is called.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
---
 builtin/cat-file.c       | 2 +-
 builtin/commit-graph.c   | 5 ++---
 builtin/fsck.c           | 2 +-
 builtin/index-pack.c     | 2 +-
 builtin/pack-objects.c   | 3 +--
 builtin/prune.c          | 3 ++-
 builtin/replace.c        | 3 ++-
 builtin/unpack-objects.c | 3 +--
 builtin/upload-pack.c    | 3 ++-
 environment.c            | 2 +-
 git.c                    | 2 +-
 replace-object.c         | 5 +++++
 replace-object.h         | 8 ++++++++
 repo-settings.c          | 1 +
 14 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 0bafc14e6c0..27f070267a4 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -805,7 +805,7 @@ static int batch_objects(struct batch_options *opt)
 		if (repo_has_promisor_remote(the_repository))
 			warning("This repository uses promisor remotes. Some objects may not be loaded.");
 
-		read_replace_refs = 0;
+		disable_replace_refs();
 
 		cb.opt = opt;
 		cb.expand = &data;
diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
index a3d00fa232b..639c9ca8b91 100644
--- a/builtin/commit-graph.c
+++ b/builtin/commit-graph.c
@@ -122,7 +122,6 @@ static int graph_verify(int argc, const char **argv, const char *prefix)
 	return ret;
 }
 
-extern int read_replace_refs;
 static struct commit_graph_opts write_opts;
 
 static int write_option_parse_split(const struct option *opt, const char *arg,
@@ -323,13 +322,13 @@ int cmd_commit_graph(int argc, const char **argv, const char *prefix)
 	struct option *options = parse_options_concat(builtin_commit_graph_options, common_opts);
 
 	git_config(git_default_config, NULL);
-
-	read_replace_refs = 0;
 	save_commit_buffer = 0;
 
 	argc = parse_options(argc, argv, prefix, options,
 			     builtin_commit_graph_usage, 0);
 	FREE_AND_NULL(options);
 
+	disable_replace_refs();
+
 	return fn(argc, argv, prefix);
 }
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 2cd461b84c1..8a2d7afc83a 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -927,7 +927,6 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 	fetch_if_missing = 0;
 
 	errors_found = 0;
-	read_replace_refs = 0;
 	save_commit_buffer = 0;
 
 	argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
@@ -953,6 +952,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 
 	git_config(git_fsck_config, &fsck_obj_options);
 	prepare_repo_settings(the_repository);
+	disable_replace_refs();
 
 	if (connectivity_only) {
 		for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index bb67e166559..d0d8067510b 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -1752,7 +1752,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 	if (argc == 2 && !strcmp(argv[1], "-h"))
 		usage(index_pack_usage);
 
-	read_replace_refs = 0;
+	disable_replace_refs();
 	fsck_options.walk = mark_link;
 
 	reset_pack_idx_option(&opts);
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index a5b466839ba..55635bdf4b4 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -4284,9 +4284,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 	if (DFS_NUM_STATES > (1 << OE_DFS_STATE_BITS))
 		BUG("too many dfs states, increase OE_DFS_STATE_BITS");
 
-	read_replace_refs = 0;
-
 	sparse = git_env_bool("GIT_TEST_PACK_SPARSE", -1);
+	disable_replace_refs();
 	if (the_repository->gitdir) {
 		prepare_repo_settings(the_repository);
 		if (sparse < 0)
diff --git a/builtin/prune.c b/builtin/prune.c
index 5dc9b207200..a8f3848c3a3 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -164,7 +164,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
 
 	expire = TIME_MAX;
 	save_commit_buffer = 0;
-	read_replace_refs = 0;
 	repo_init_revisions(the_repository, &revs, prefix);
 
 	argc = parse_options(argc, argv, prefix, options, prune_usage, 0);
@@ -172,6 +171,8 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
 	if (repository_format_precious_objects)
 		die(_("cannot prune in a precious-objects repo"));
 
+	disable_replace_refs();
+
 	while (argc--) {
 		struct object_id oid;
 		const char *name = *argv++;
diff --git a/builtin/replace.c b/builtin/replace.c
index 981f1894436..6c6f0b3ed01 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -566,11 +566,12 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
-	read_replace_refs = 0;
 	git_config(git_default_config, NULL);
 
 	argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
 
+	disable_replace_refs();
+
 	if (!cmdmode)
 		cmdmode = argc ? MODE_REPLACE : MODE_LIST;
 
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 2c52c3a741f..3f5f6719405 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -609,9 +609,8 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
 	int i;
 	struct object_id oid;
 
-	read_replace_refs = 0;
-
 	git_config(git_default_config, NULL);
+	disable_replace_refs();
 
 	quiet = !isatty(2);
 
diff --git a/builtin/upload-pack.c b/builtin/upload-pack.c
index beb9dd08610..6fc9a8feab0 100644
--- a/builtin/upload-pack.c
+++ b/builtin/upload-pack.c
@@ -36,7 +36,6 @@ int cmd_upload_pack(int argc, const char **argv, const char *prefix)
 	};
 
 	packet_trace_identity("upload-pack");
-	read_replace_refs = 0;
 
 	argc = parse_options(argc, argv, prefix, options, upload_pack_usage, 0);
 
@@ -50,6 +49,8 @@ int cmd_upload_pack(int argc, const char **argv, const char *prefix)
 	if (!enter_repo(dir, strict))
 		die("'%s' does not appear to be a git repository", dir);
 
+	disable_replace_refs();
+
 	switch (determine_protocol_version_server()) {
 	case protocol_v2:
 		if (advertise_refs)
diff --git a/environment.c b/environment.c
index 8a96997539a..3b4d87c322f 100644
--- a/environment.c
+++ b/environment.c
@@ -185,7 +185,7 @@ void setup_git_env(const char *git_dir)
 	strvec_clear(&to_free);
 
 	if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
-		read_replace_refs = 0;
+		disable_replace_refs();
 	replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT);
 	git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base
 							  : "refs/replace/");
diff --git a/git.c b/git.c
index 45899be8265..3252d4c7661 100644
--- a/git.c
+++ b/git.c
@@ -185,7 +185,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 			if (envchanged)
 				*envchanged = 1;
 		} else if (!strcmp(cmd, "--no-replace-objects")) {
-			read_replace_refs = 0;
+			disable_replace_refs();
 			setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1);
 			if (envchanged)
 				*envchanged = 1;
diff --git a/replace-object.c b/replace-object.c
index e98825d5852..ceec81c940c 100644
--- a/replace-object.c
+++ b/replace-object.c
@@ -84,3 +84,8 @@ const struct object_id *do_lookup_replace_object(struct repository *r,
 	}
 	die(_("replace depth too high for object %s"), oid_to_hex(oid));
 }
+
+void disable_replace_refs(void)
+{
+	read_replace_refs = 0;
+}
diff --git a/replace-object.h b/replace-object.h
index 500482b02b3..7786d4152b0 100644
--- a/replace-object.h
+++ b/replace-object.h
@@ -48,4 +48,12 @@ static inline const struct object_id *lookup_replace_object(struct repository *r
 	return do_lookup_replace_object(r, oid);
 }
 
+/*
+ * Some commands override config and environment settings for using
+ * replace references. Use this method to disable the setting and ensure
+ * those other settings will not override this choice. This applies
+ * globally to all in-process repositories.
+ */
+void disable_replace_refs(void);
+
 #endif /* REPLACE_OBJECT_H */
diff --git a/repo-settings.c b/repo-settings.c
index 7b566d729d0..1df0320bf33 100644
--- a/repo-settings.c
+++ b/repo-settings.c
@@ -3,6 +3,7 @@
 #include "repository.h"
 #include "midx.h"
 #include "compat/fsmonitor/fsm-listen.h"
+#include "environment.h"
 
 static void repo_cfg_bool(struct repository *r, const char *key, int *dest,
 			  int def)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH v4 2/2] gc: introduce `gc.recentObjectsHook`
  2023-05-16  0:24  8%   ` [PATCH v4 2/2] " Taylor Blau
@ 2023-05-24 23:21  6%     ` Glen Choo
  2023-06-07 22:56  5%       ` Taylor Blau
  0 siblings, 1 reply; 200+ results
From: Glen Choo @ 2023-05-24 23:21 UTC (permalink / raw)
  To: Taylor Blau, git
  Cc: Derrick Stolee, Jeff King, Junio C Hamano, Chris Torek, me,
	martinvonz

Hi Taylor! It was great seeing you at Review Club today :)

If you'd like, the notes are available at:

  https://docs.google.com/document/d/14L8BAumGTpsXpjDY8VzZ4rRtpAjuGrFSRqn3stCuS_w/edit

but that's optional, since a ground rule is that all important feedback
should be sent to the mailing list.

Taylor Blau <me@ttaylorr.com> writes:

> This patch introduces a new multi-valued configuration option,
> `gc.recentObjectsHook` as a means to mark certain objects as recent (and
> thus exempt from garbage collection), regardless of their age.
>
> However, we have no convenient way to keep certain precious, unreachable
> objects around in the repository, even if they have aged out and would
> be pruned. Our options today consist of:
>
>   - Point references at the reachability tips of any objects you
>     consider precious, which may be undesirable or infeasible.

What I like about the hook is that it matches the desired use case quite
well - if an object is precious but unreachable, it can't be because Git
thinks it's precious. Rather, something else thinks it's precious, so
the obvious fix is for Git to learn how to listen to that tool. Based
off only what's in this commit message though, this feature doesn't seem
sufficiently justified yet. In particular, it's not immediately clear
how this fits in with the alternatives, especially pointing refs at
precious objects (which is probably the most popular way people have
been doing this). It would be useful to flesh out why keeping these
extra refs are either "undesirable" or "infeasible". Presumably, you
already have some idea of why this is the case for the GitHub 'audit
log'.

Another potential use case I can think of is client-side third party Git
tools that implement custom workflows on top of a Git repo, e.g.
git-branchless (https://github.com/arxanas/git-branchless) and jj
(https://github.com/martinvonz/jj/, btw I contribute a little to jj
too). Both of those tools reference commits that Git can consider
unreachable (e.g. they support anonymous branches and "undo"
operations), and so they both create custom refs to keep those commits
alive. The number of refs isn't huge, though it is more than what a
typical repo would see (maybe in the 100s), and ISTR that some users
have reported that it's enough to noticeably slow down the "git fetch"
negotiation. I don't think managing these refs is "infeasible", and
there are workarounds to shrink the number of refs (e.g. creating an
octopus merge of the commits you want and pointing a ref at it), but it
would certainly be a lot easier to use the hook instead.

I've cc-ed the maintainers of both projects here in case they have more
to share.

> +gc.recentObjectsHook::

I have a small preference to use "command" instead of "hook" to avoid
confusion with Git hooks (I've already observed some of this confusion
in off-list conversations). There's some precedent for "hook" in
`uploadpack.packObjectsHook`, but that's a one-off (and it used to
confuse me a lot too :P).

> +	When considering the recency of an object (e.g., when generating
> +	a cruft pack or storing unreachable objects as loose), use the
> +	shell to execute the specified command(s). Interpret their
> +	output as object IDs which Git will consider as "recent",
> +	regardless of their age.

From a potential user's POV, two things seem unclear:

- What does "recenct" mean in this context? Does it just mean
  "precious"?
- What objects do I need to list? Is it every object I want to keep or
  just the reachable tips?

Documentation/git-gc.txt has some pointers:

  . Any object with modification time newer than the `--prune` date is kept,
    along with everything reachable from it.

but it seems quite hard to discover this and put the pieces together. I
wonder if we could make this easier by:

- Replacing "recent" with "precious" (if this is really what we mean),
  and the fact that we use the recency check is an implementation
  detail.
- Explicitly saying that everything reachable from the object is also
  kept.

In the code changes, I noticed a few out-of-date references to "cruft
tips", but everything else looked reasonable to me.

> diff --git a/t/t5329-pack-objects-cruft.sh b/t/t5329-pack-objects-cruft.sh
> index 303f7a5d84..3ae61ca995 100755
> --- a/t/t5329-pack-objects-cruft.sh
> +++ b/t/t5329-pack-objects-cruft.sh
> @@ -739,4 +739,175 @@ test_expect_success 'cruft objects are freshend via loose' '
>  	)
>  '
>  
> +test_expect_success 'gc.recentObjectsHook' '
> +	git init repo &&
> +	test_when_finished "rm -fr repo" &&
> +	(
> +		cd repo &&
> +
> +		# Create a handful of objects.
> +		#
> +		#   - one reachable commit, "base", designated for the reachable
> +		#     pack
> +		#   - one unreachable commit, "cruft.discard", which is marked
> +		#     for deletion
> +		#   - one unreachable commit, "cruft.old", which would be marked
> +		#     for deletion, but is rescued as an extra cruft tip
> +		#   - one unreachable commit, "cruft.new", which is not marked
> +		#     for deletion
> +		test_commit base &&
> +		git branch -M main &&
> +
> +		git checkout --orphan discard &&
> +		git rm -fr . &&
> +		test_commit --no-tag cruft.discard &&
> +
> +		git checkout --orphan old &&
> +		git rm -fr . &&
> +		test_commit --no-tag cruft.old &&
> +		cruft_old="$(git rev-parse HEAD)" &&
> +
> +		git checkout --orphan new &&
> +		git rm -fr . &&
> +		test_commit --no-tag cruft.new &&
> +		cruft_new="$(git rev-parse HEAD)" &&
> +
> +		git checkout main &&
> +		git branch -D discard old new &&
> +		git reflog expire --all --expire=all &&
> +
> +		# mark cruft.old with an mtime that is many minutes
> +		# older than the expiration period, and mark cruft.new
> +		# with an mtime that is in the future (and thus not
> +		# eligible for pruning).
> +		test-tool chmtime -2000 "$objdir/$(test_oid_to_path $cruft_old)" &&
> +		test-tool chmtime +1000 "$objdir/$(test_oid_to_path $cruft_new)" &&
> +
> +		# Write the list of cruft objects we expect to
> +		# accumulate, which is comprised of everything reachable
> +		# from cruft.old and cruft.new, but not cruft.discard.
> +		git rev-list --objects --no-object-names \
> +			$cruft_old $cruft_new >cruft.raw &&
> +		sort cruft.raw >cruft.expect &&
> +
> +		# Write the script to list extra tips, which are limited
> +		# to cruft.old, in this case.
> +		write_script extra-tips <<-EOF &&
> +		echo $cruft_old
> +		EOF
> +		git config gc.recentObjectsHook ./extra-tips &&
> +
> +		git repack --cruft --cruft-expiration=now -d &&
> +
> +		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
> +		git show-index <${mtimes%.mtimes}.idx >cruft &&
> +		cut -d" " -f2 cruft | sort >cruft.actual &&
> +		test_cmp cruft.expect cruft.actual &&
> +
> +		# Ensure that the "old" objects are removed after
> +		# dropping the gc.recentObjectsHook hook.
> +		git config --unset gc.recentObjectsHook &&
> +		git repack --cruft --cruft-expiration=now -d &&
> +
> +		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
> +		git show-index <${mtimes%.mtimes}.idx >cruft &&
> +		cut -d" " -f2 cruft | sort >cruft.actual &&
> +
> +		git rev-list --objects --no-object-names $cruft_new >cruft.raw &&
> +		cp cruft.expect cruft.old &&
> +		sort cruft.raw >cruft.expect &&
> +		test_cmp cruft.expect cruft.actual &&
> +
> +		# ensure objects which are no longer in the cruft pack were
> +		# removed from the repository
> +		for object in $(comm -13 cruft.expect cruft.old)
> +		do
> +			test_must_fail git cat-file -t $object || return 1
> +		done
> +	)

Thanks for the comments. The tests are quite verbose, and I wouldn't
be able to understand them otherwise. I thought it would be nice to have
a test helper to check that the cruft pack contains the expected objects
(replacing the "git show-index" + "cut | sort" + "test_cmp" recipe), but
this test fits in with the existing style, so I don't consider that a
blocker.

^ permalink raw reply	[relevance 6%]

* [PATCH v4 2/2] gc: introduce `gc.recentObjectsHook`
  2023-05-16  0:23  5% ` [PATCH v4 0/2] gc: introduce `gc.recentObjectsHook` Taylor Blau
@ 2023-05-16  0:24  8%   ` Taylor Blau
  2023-05-24 23:21  6%     ` Glen Choo
  0 siblings, 1 reply; 200+ results
From: Taylor Blau @ 2023-05-16  0:24 UTC (permalink / raw)
  To: git; +Cc: Derrick Stolee, Jeff King, Junio C Hamano, Chris Torek

This patch introduces a new multi-valued configuration option,
`gc.recentObjectsHook` as a means to mark certain objects as recent (and
thus exempt from garbage collection), regardless of their age.

When performing a garbage collection operation on a repository with
unreachable objects, Git makes its decision on what to do with those
object(s) bed on how recent the objects are or not. Generally speaking,
unreachable-but-recent objects stay in the repository, and older objects
are discarded.

However, we have no convenient way to keep certain precious, unreachable
objects around in the repository, even if they have aged out and would
be pruned. Our options today consist of:

  - Point references at the reachability tips of any objects you
    consider precious, which may be undesirable or infeasible.

  - Track them via the reflog, which may be undesirable since the
    reflog's lifetime is limited to that of the reference it's tracking
    (and callers may want to keep those unreachable objects around for
    longer).

  - Extend the grace period, which may keep around other objects that
    the caller *does* want to discard.

  - Manually modify the mtimes of objects you want to keep. If those
    objects are already loose, this is easy enough to do (you can just
    enumerate and `touch -m` each one).

    But if they are packed, you will either end up modifying the mtimes
    of *all* objects in that pack, or be forced to write out a loose
    copy of that object, both of which may be undesirable. Even worse,
    if they are in a cruft pack, that requires modifying its `*.mtimes`
    file by hand, since there is no exposed plumbing for this.

  - Force the caller to construct the pack of objects they want
    to keep themselves, and then mark the pack as kept by adding a
    ".keep" file. This works, but is burdensome for the caller, and
    having extra packs is awkward as you roll forward your cruft pack.

This patch introduces a new option to the above list via the
`gc.recentObjectsHook` configuration, which allows the caller to
specify a program (or set of programs) whose output is treated as a set
of objects to treat as recent, regardless of their true age.

The implementation is straightforward. Git enumerates recent objects via
`add_unseen_recent_objects_to_traversal()`, which enumerates loose and
packed objects, and eventually calls add_recent_object() on any objects
for which `want_recent_object()`'s conditions are met.

This patch modifies the recency condition from simply "is the mtime of
this object more recent than the cutoff?" to "[...] or, is this object
mentioned by at least one `gc.recentObjectsHook`?".

Depending on whether or not we are generating a cruft pack, this allows
the caller to do one of two things:

  - If generating a cruft pack, the caller is able to retain additional
    objects via the cruft pack, even if they would have otherwise been
    pruned due to their age.

  - If not generating a cruft pack, the caller is likewise able to
    retain additional objects as loose.

A potential alternative here is to introduce a new mode to alter the
contents of the reachable pack instead of the cruft one. One could
imagine a new option to `pack-objects`, say `--extra-reachable-tips`
that does the same thing as above, adding the visited set of objects
along the traversal to the pack.

But this has the unfortunate side-effect of altering the reachability
closure of that pack. If parts of the unreachable object graph mentioned
by one or more of the "extra reachable tips" programs is not closed,
then the resulting pack won't be either. This makes it impossible in the
general case to write out reachability bitmaps for that pack, since
closure is a requirement there.

Instead, keep these unreachable objects in the cruft pack (or set of
unreachable, loose objects) instead, to ensure that we can continue to
have a pack containing just reachable objects, which is always safe to
write a bitmap over.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
 Documentation/config/gc.txt          |  13 ++
 reachable.c                          |  79 ++++++++++++-
 t/t5304-prune.sh                     |  14 +++
 t/t5329-pack-objects-cruft.sh        | 171 +++++++++++++++++++++++++++
 t/t7701-repack-unpack-unreachable.sh |  31 +++++
 5 files changed, 305 insertions(+), 3 deletions(-)

diff --git a/Documentation/config/gc.txt b/Documentation/config/gc.txt
index 7f95c866e1..16190be877 100644
--- a/Documentation/config/gc.txt
+++ b/Documentation/config/gc.txt
@@ -130,6 +130,19 @@ or rebase occurring.  Since these changes are not part of the current
 project most users will want to expire them sooner, which is why the
 default is more aggressive than `gc.reflogExpire`.
 
+gc.recentObjectsHook::
+	When considering the recency of an object (e.g., when generating
+	a cruft pack or storing unreachable objects as loose), use the
+	shell to execute the specified command(s). Interpret their
+	output as object IDs which Git will consider as "recent",
+	regardless of their age.
++
+Output must contain exactly one hex object ID per line, and nothing
+else. Objects which cannot be found in the repository are ignored.
+Multiple hooks are supported, but all must exit successfully, else the
+operation (either generating a cruft pack or unpacking unreachable
+objects) will be halted.
+
 gc.rerereResolved::
 	Records of conflicted merge you resolved earlier are
 	kept for this many days when 'git rerere gc' is run.
diff --git a/reachable.c b/reachable.c
index 7a42da5d39..e82ab33444 100644
--- a/reachable.c
+++ b/reachable.c
@@ -16,6 +16,8 @@
 #include "object-store.h"
 #include "pack-bitmap.h"
 #include "pack-mtimes.h"
+#include "config.h"
+#include "run-command.h"
 
 struct connectivity_progress {
 	struct progress *progress;
@@ -67,12 +69,75 @@ struct recent_data {
 	timestamp_t timestamp;
 	report_recent_object_fn *cb;
 	int ignore_in_core_kept_packs;
+
+	struct oidset extra_recent_oids;
+	int extra_recent_oids_loaded;
 };
 
+static int run_one_gc_recent_objects_hook(struct oidset *set,
+					    const char *args)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct strbuf buf = STRBUF_INIT;
+	FILE *out;
+	int ret = 0;
+
+	cmd.use_shell = 1;
+	cmd.out = -1;
+
+	strvec_push(&cmd.args, args);
+
+	if (start_command(&cmd))
+		return -1;
+
+	out = xfdopen(cmd.out, "r");
+	while (strbuf_getline(&buf, out) != EOF) {
+		struct object_id oid;
+		const char *rest;
+
+		if (parse_oid_hex(buf.buf, &oid, &rest) || *rest) {
+			ret = error(_("invalid extra cruft tip: '%s'"), buf.buf);
+			break;
+		}
+
+		oidset_insert(set, &oid);
+	}
+
+	fclose(out);
+	ret |= finish_command(&cmd);
+
+	strbuf_release(&buf);
+	return ret;
+}
+
+static void load_gc_recent_objects(struct recent_data *data)
+{
+	const struct string_list *programs;
+	int ret = 0;
+	size_t i;
+
+	data->extra_recent_oids_loaded = 1;
+
+	if (git_config_get_string_multi("gc.recentobjectshook", &programs))
+		return;
+
+	for (i = 0; i < programs->nr; i++) {
+		ret = run_one_gc_recent_objects_hook(&data->extra_recent_oids,
+						       programs->items[i].string);
+		if (ret)
+			die(_("unable to enumerate additional cruft tips"));
+	}
+}
+
 static int obj_is_recent(const struct object_id *oid, timestamp_t mtime,
 			 struct recent_data *data)
 {
-	return mtime > data->timestamp;
+	if (mtime > data->timestamp)
+		return 1;
+
+	if (!data->extra_recent_oids_loaded)
+		load_gc_recent_objects(data);
+	return oidset_contains(&data->extra_recent_oids, oid);
 }
 
 static void add_recent_object(const struct object_id *oid,
@@ -199,16 +264,24 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
 	data.cb = cb;
 	data.ignore_in_core_kept_packs = ignore_in_core_kept_packs;
 
+	oidset_init(&data.extra_recent_oids, 0);
+	data.extra_recent_oids_loaded = 0;
+
 	r = for_each_loose_object(add_recent_loose, &data,
 				  FOR_EACH_OBJECT_LOCAL_ONLY);
 	if (r)
-		return r;
+		goto done;
 
 	flags = FOR_EACH_OBJECT_LOCAL_ONLY | FOR_EACH_OBJECT_PACK_ORDER;
 	if (ignore_in_core_kept_packs)
 		flags |= FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS;
 
-	return for_each_packed_object(add_recent_packed, &data, flags);
+	r = for_each_packed_object(add_recent_packed, &data, flags);
+
+done:
+	oidset_clear(&data.extra_recent_oids);
+
+	return r;
 }
 
 static int mark_object_seen(const struct object_id *oid,
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 662ae9b152..a635fe98f8 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -350,4 +350,18 @@ test_expect_success 'old reachable-from-recent retained with bitmaps' '
 	test_must_fail git cat-file -e $to_drop
 '
 
+test_expect_success 'gc.recentObjectsHook' '
+	add_blob &&
+	test-tool chmtime =-86500 $BLOB_FILE &&
+
+	write_script precious-objects <<-EOF &&
+	echo $BLOB
+	EOF
+	test_config gc.recentObjectsHook ./precious-objects &&
+
+	git prune --expire=now &&
+
+	git cat-file -p $BLOB
+'
+
 test_done
diff --git a/t/t5329-pack-objects-cruft.sh b/t/t5329-pack-objects-cruft.sh
index 303f7a5d84..3ae61ca995 100755
--- a/t/t5329-pack-objects-cruft.sh
+++ b/t/t5329-pack-objects-cruft.sh
@@ -739,4 +739,175 @@ test_expect_success 'cruft objects are freshend via loose' '
 	)
 '
 
+test_expect_success 'gc.recentObjectsHook' '
+	git init repo &&
+	test_when_finished "rm -fr repo" &&
+	(
+		cd repo &&
+
+		# Create a handful of objects.
+		#
+		#   - one reachable commit, "base", designated for the reachable
+		#     pack
+		#   - one unreachable commit, "cruft.discard", which is marked
+		#     for deletion
+		#   - one unreachable commit, "cruft.old", which would be marked
+		#     for deletion, but is rescued as an extra cruft tip
+		#   - one unreachable commit, "cruft.new", which is not marked
+		#     for deletion
+		test_commit base &&
+		git branch -M main &&
+
+		git checkout --orphan discard &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.discard &&
+
+		git checkout --orphan old &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.old &&
+		cruft_old="$(git rev-parse HEAD)" &&
+
+		git checkout --orphan new &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.new &&
+		cruft_new="$(git rev-parse HEAD)" &&
+
+		git checkout main &&
+		git branch -D discard old new &&
+		git reflog expire --all --expire=all &&
+
+		# mark cruft.old with an mtime that is many minutes
+		# older than the expiration period, and mark cruft.new
+		# with an mtime that is in the future (and thus not
+		# eligible for pruning).
+		test-tool chmtime -2000 "$objdir/$(test_oid_to_path $cruft_old)" &&
+		test-tool chmtime +1000 "$objdir/$(test_oid_to_path $cruft_new)" &&
+
+		# Write the list of cruft objects we expect to
+		# accumulate, which is comprised of everything reachable
+		# from cruft.old and cruft.new, but not cruft.discard.
+		git rev-list --objects --no-object-names \
+			$cruft_old $cruft_new >cruft.raw &&
+		sort cruft.raw >cruft.expect &&
+
+		# Write the script to list extra tips, which are limited
+		# to cruft.old, in this case.
+		write_script extra-tips <<-EOF &&
+		echo $cruft_old
+		EOF
+		git config gc.recentObjectsHook ./extra-tips &&
+
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft | sort >cruft.actual &&
+		test_cmp cruft.expect cruft.actual &&
+
+		# Ensure that the "old" objects are removed after
+		# dropping the gc.recentObjectsHook hook.
+		git config --unset gc.recentObjectsHook &&
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft | sort >cruft.actual &&
+
+		git rev-list --objects --no-object-names $cruft_new >cruft.raw &&
+		cp cruft.expect cruft.old &&
+		sort cruft.raw >cruft.expect &&
+		test_cmp cruft.expect cruft.actual &&
+
+		# ensure objects which are no longer in the cruft pack were
+		# removed from the repository
+		for object in $(comm -13 cruft.expect cruft.old)
+		do
+			test_must_fail git cat-file -t $object || return 1
+		done
+	)
+'
+
+test_expect_success 'multi-valued gc.recentObjectsHook' '
+	git init repo &&
+	test_when_finished "rm -fr repo" &&
+	(
+		cd repo &&
+
+		test_commit base &&
+		git branch -M main &&
+
+		git checkout --orphan cruft.a &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.a &&
+		cruft_a="$(git rev-parse HEAD)" &&
+
+		git checkout --orphan cruft.b &&
+		git rm -fr . &&
+		test_commit --no-tag cruft.b &&
+		cruft_b="$(git rev-parse HEAD)" &&
+
+		git checkout main &&
+		git branch -D cruft.a cruft.b &&
+		git reflog expire --all --expire=all &&
+
+		echo "echo $cruft_a" | write_script extra-tips.a &&
+		echo "echo $cruft_b" | write_script extra-tips.b &&
+		echo "false" | write_script extra-tips.c &&
+
+		git rev-list --objects --no-object-names $cruft_a $cruft_b \
+			>cruft.raw &&
+		sort cruft.raw >cruft.expect &&
+
+		# ensure that each extra cruft tip is saved by its
+		# respective hook
+		git config --add gc.recentObjectsHook ./extra-tips.a &&
+		git config --add gc.recentObjectsHook ./extra-tips.b &&
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft | sort >cruft.actual &&
+		test_cmp cruft.expect cruft.actual &&
+
+		# ensure that a dirty exit halts cruft pack generation
+		git config --add gc.recentObjectsHook ./extra-tips.c &&
+		test_must_fail git repack --cruft --cruft-expiration=now -d 2>err &&
+		grep "unable to enumerate additional cruft tips" err &&
+
+		# and that the existing cruft pack is left alone
+		test_path_is_file "$mtimes"
+	)
+'
+
+test_expect_success 'additional cruft blobs via gc.recentObjectsHook' '
+	git init repo &&
+	test_when_finished "rm -fr repo" &&
+	(
+		cd repo &&
+
+		test_commit base &&
+
+		blob=$(echo "unreachable" | git hash-object -w --stdin) &&
+
+		# mark the unreachable blob we wrote above as having
+		# aged out of the retention period
+		test-tool chmtime -2000 "$objdir/$(test_oid_to_path $blob)" &&
+
+		# Write the script to list extra tips, which is just the
+		# extra blob as above.
+		write_script extra-tips <<-EOF &&
+		echo $blob
+		EOF
+		git config gc.recentObjectsHook ./extra-tips &&
+
+		git repack --cruft --cruft-expiration=now -d &&
+
+		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
+		git show-index <${mtimes%.mtimes}.idx >cruft &&
+		cut -d" " -f2 cruft >actual &&
+		echo $blob >expect &&
+		test_cmp expect actual
+	)
+'
+
 test_done
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index ebb267855f..ba428c18a8 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -113,6 +113,37 @@ test_expect_success 'do not bother loosening old objects' '
 	test_must_fail git cat-file -p $obj2
 '
 
+test_expect_success 'gc.recentObjectsHook' '
+	obj1=$(echo one | git hash-object -w --stdin) &&
+	obj2=$(echo two | git hash-object -w --stdin) &&
+	obj3=$(echo three | git hash-object -w --stdin) &&
+	pack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&
+	pack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&
+	pack3=$(echo $obj3 | git pack-objects .git/objects/pack/pack) &&
+	git prune-packed &&
+
+	git cat-file -p $obj1 &&
+	git cat-file -p $obj2 &&
+	git cat-file -p $obj3 &&
+
+	git tag -a -m tag obj2-tag $obj2 &&
+	obj2_tag="$(git rev-parse obj2-tag)" &&
+
+	write_script precious-objects <<-EOF &&
+	echo $obj2_tag
+	EOF
+	git config gc.recentObjectsHook ./precious-objects &&
+
+	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
+	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
+	git repack -A -d --unpack-unreachable=1.hour.ago &&
+
+	git cat-file -p $obj1 &&
+	git cat-file -p $obj2 &&
+	git cat-file -p $obj2_tag &&
+	test_must_fail git cat-file -p $obj3
+'
+
 test_expect_success 'keep packed objects found only in index' '
 	echo my-unique-content >file &&
 	git add file &&
-- 
2.40.1.558.g18e50d2517

^ permalink raw reply related	[relevance 8%]

* [PATCH v4 0/2] gc: introduce `gc.recentObjectsHook`
    @ 2023-05-16  0:23  5% ` Taylor Blau
  2023-05-16  0:24  8%   ` [PATCH v4 2/2] " Taylor Blau
  2023-06-07 22:58  5% ` [PATCH v5 0/2] " Taylor Blau
  2 siblings, 1 reply; 200+ results
From: Taylor Blau @ 2023-05-16  0:23 UTC (permalink / raw)
  To: git; +Cc: Derrick Stolee, Jeff King, Junio C Hamano, Chris Torek

Here is another reworked version of the patch which introduced a new
configuration `gc.extraCruftTips` to keep additional objects when
pruning which might have otherwise aged out of the repository.

Notable changes since last time include:

  - updating the name of this configuration to "gc.recentObjectsHook",
  - significantly reworking the substantive patch's message
  - improved test coverage to cover more cases of loose object pruning,
    as well as `git prune`'s interaction with `gc.recentObjectsHook`.

(Again, since we're expecting -rc0, I don't expect a ton of movement on
this series before 2.41 is shipped, but I figured I'd share it out
anyways to get it off of my laptop).

Thanks in advance for your review.

Taylor Blau (2):
  reachable.c: extract `obj_is_recent()`
  gc: introduce `gc.recentObjectsHook`

 Documentation/config/gc.txt          |  13 ++
 reachable.c                          |  85 ++++++++++++-
 t/t5304-prune.sh                     |  14 +++
 t/t5329-pack-objects-cruft.sh        | 171 +++++++++++++++++++++++++++
 t/t7701-repack-unpack-unreachable.sh |  31 +++++
 5 files changed, 311 insertions(+), 3 deletions(-)

Range-diff against v3:
1:  f5f3b0f334 = 1:  9c1b59c8cf reachable.c: extract `obj_is_recent()`
2:  2ce8a79fa4 ! 2:  18e50d2517 builtin/pack-objects.c: introduce `pack.recentObjectsHook`
    @@ Metadata
     Author: Taylor Blau <me@ttaylorr.com>
     
      ## Commit message ##
    -    builtin/pack-objects.c: introduce `pack.recentObjectsHook`
    +    gc: introduce `gc.recentObjectsHook`
     
         This patch introduces a new multi-valued configuration option,
    -    `pack.recentObjectsHook` as a means to mark certain objects as recent,
    -    regardless of their age.
    +    `gc.recentObjectsHook` as a means to mark certain objects as recent (and
    +    thus exempt from garbage collection), regardless of their age.
     
    -    Depending on whether or not we are generating a cruft pack, this allows
    -    the caller to do one of two things:
    +    When performing a garbage collection operation on a repository with
    +    unreachable objects, Git makes its decision on what to do with those
    +    object(s) bed on how recent the objects are or not. Generally speaking,
    +    unreachable-but-recent objects stay in the repository, and older objects
    +    are discarded.
     
    -      - If generating a cruft pack, the caller is able to retain additional
    -        objects via the cruft pack, even if they would have otherwise been
    -        pruned due to their age.
    +    However, we have no convenient way to keep certain precious, unreachable
    +    objects around in the repository, even if they have aged out and would
    +    be pruned. Our options today consist of:
     
    -      - If not generating a cruft pack, the caller is likewise able to
    -        retain additional objects as loose.
    +      - Point references at the reachability tips of any objects you
    +        consider precious, which may be undesirable or infeasible.
     
    -    There is currently no option to be able to keep around certain objects
    -    that have otherwise aged out of the grace period. The only way to retain
    -    those objects is:
    -
    -      - to point a reference at them, which may be undesirable or
    -        infeasible,
    -
    -      - to track them via the reflog, which may be undesirable since the
    +      - Track them via the reflog, which may be undesirable since the
             reflog's lifetime is limited to that of the reference it's tracking
             (and callers may want to keep those unreachable objects around for
    -        longer)
    +        longer).
     
    -      - to extend the grace period, which may keep around other objects that
    -        the caller *does* want to discard,
    +      - Extend the grace period, which may keep around other objects that
    +        the caller *does* want to discard.
     
    -      - or, to force the caller to construct the pack of objects they want
    +      - Manually modify the mtimes of objects you want to keep. If those
    +        objects are already loose, this is easy enough to do (you can just
    +        enumerate and `touch -m` each one).
    +
    +        But if they are packed, you will either end up modifying the mtimes
    +        of *all* objects in that pack, or be forced to write out a loose
    +        copy of that object, both of which may be undesirable. Even worse,
    +        if they are in a cruft pack, that requires modifying its `*.mtimes`
    +        file by hand, since there is no exposed plumbing for this.
    +
    +      - Force the caller to construct the pack of objects they want
             to keep themselves, and then mark the pack as kept by adding a
    -        ".keep" file.
    +        ".keep" file. This works, but is burdensome for the caller, and
    +        having extra packs is awkward as you roll forward your cruft pack.
     
    -    This patch introduces a new configuration, `pack.recentObjectsHook`
    -    which allows the caller to specify a program (or set of programs) whose
    -    output is treated as a set of objects to treat as recent, regardless of
    -    their true age.
    +    This patch introduces a new option to the above list via the
    +    `gc.recentObjectsHook` configuration, which allows the caller to
    +    specify a program (or set of programs) whose output is treated as a set
    +    of objects to treat as recent, regardless of their true age.
     
    -    The implementation is straightforward. In either case (cruft packs or
    -    not), Git enumerates recent objects via
    -    `add_unseen_recent_objects_to_traversal()`. That enumerates loose and
    +    The implementation is straightforward. Git enumerates recent objects via
    +    `add_unseen_recent_objects_to_traversal()`, which enumerates loose and
         packed objects, and eventually calls add_recent_object() on any objects
         for which `want_recent_object()`'s conditions are met.
     
         This patch modifies the recency condition from simply "is the mtime of
         this object more recent than the cutoff?" to "[...] or, is this object
    -    mentioned by at least one `pack.recentObjectsHook`?".
    +    mentioned by at least one `gc.recentObjectsHook`?".
     
    -    We then add those as tips to another reachability traversal (along with
    -    any recent objects, if pruning), marking every object along the way
    -    (either adding it to the cruft pack, or writing it out as a loose
    -    object).
    +    Depending on whether or not we are generating a cruft pack, this allows
    +    the caller to do one of two things:
    +
    +      - If generating a cruft pack, the caller is able to retain additional
    +        objects via the cruft pack, even if they would have otherwise been
    +        pruned due to their age.
    +
    +      - If not generating a cruft pack, the caller is likewise able to
    +        retain additional objects as loose.
     
         A potential alternative here is to introduce a new mode to alter the
         contents of the reachable pack instead of the cruft one. One could
    @@ Commit message
         Helped-by: Jeff King <peff@peff.net>
         Signed-off-by: Taylor Blau <me@ttaylorr.com>
     
    - ## Documentation/config/pack.txt ##
    -@@ Documentation/config/pack.txt: pack.deltaCacheLimit::
    - 	result once the best match for all objects is found.
    - 	Defaults to 1000. Maximum value is 65535.
    + ## Documentation/config/gc.txt ##
    +@@ Documentation/config/gc.txt: or rebase occurring.  Since these changes are not part of the current
    + project most users will want to expire them sooner, which is why the
    + default is more aggressive than `gc.reflogExpire`.
      
    -+pack.recentObjectsHook::
    ++gc.recentObjectsHook::
     +	When considering the recency of an object (e.g., when generating
     +	a cruft pack or storing unreachable objects as loose), use the
     +	shell to execute the specified command(s). Interpret their
    @@ Documentation/config/pack.txt: pack.deltaCacheLimit::
     +operation (either generating a cruft pack or unpacking unreachable
     +objects) will be halted.
     +
    - pack.threads::
    - 	Specifies the number of threads to spawn when searching for best
    - 	delta matches.  This requires that linkgit:git-pack-objects[1]
    -
    - ## builtin/pack-objects.c ##
    -@@
    - #include "pack-mtimes.h"
    - #include "parse-options.h"
    - #include "wrapper.h"
    -+#include "run-command.h"
    - 
    - /*
    -  * Objects we are going to pack are collected in the `to_pack` structure.
    + gc.rerereResolved::
    + 	Records of conflicted merge you resolved earlier are
    + 	kept for this many days when 'git rerere gc' is run.
     
      ## reachable.c ##
     @@
    @@ reachable.c: struct recent_data {
     +	int extra_recent_oids_loaded;
      };
      
    -+static int run_one_pack_recent_objects_hook(struct oidset *set,
    ++static int run_one_gc_recent_objects_hook(struct oidset *set,
     +					    const char *args)
     +{
     +	struct child_process cmd = CHILD_PROCESS_INIT;
    @@ reachable.c: struct recent_data {
     +
     +		if (parse_oid_hex(buf.buf, &oid, &rest) || *rest) {
     +			ret = error(_("invalid extra cruft tip: '%s'"), buf.buf);
    -+			goto done;
    ++			break;
     +		}
     +
     +		oidset_insert(set, &oid);
     +	}
     +
    -+	ret = finish_command(&cmd);
    ++	fclose(out);
    ++	ret |= finish_command(&cmd);
     +
    -+done:
    -+	if (out)
    -+		fclose(out);
     +	strbuf_release(&buf);
    -+	child_process_clear(&cmd);
    -+
     +	return ret;
     +}
     +
    -+static void load_pack_recent_objects(struct recent_data *data)
    ++static void load_gc_recent_objects(struct recent_data *data)
     +{
     +	const struct string_list *programs;
     +	int ret = 0;
    @@ reachable.c: struct recent_data {
     +
     +	data->extra_recent_oids_loaded = 1;
     +
    -+	if (git_config_get_string_multi("pack.recentobjectshook", &programs))
    ++	if (git_config_get_string_multi("gc.recentobjectshook", &programs))
     +		return;
     +
     +	for (i = 0; i < programs->nr; i++) {
    -+		ret = run_one_pack_recent_objects_hook(&data->extra_recent_oids,
    ++		ret = run_one_gc_recent_objects_hook(&data->extra_recent_oids,
     +						       programs->items[i].string);
     +		if (ret)
    -+			break;
    ++			die(_("unable to enumerate additional cruft tips"));
     +	}
    -+
    -+	if (ret)
    -+		die(_("unable to enumerate additional cruft tips"));
     +}
     +
      static int obj_is_recent(const struct object_id *oid, timestamp_t mtime,
    @@ reachable.c: struct recent_data {
     +		return 1;
     +
     +	if (!data->extra_recent_oids_loaded)
    -+		load_pack_recent_objects(data);
    ++		load_gc_recent_objects(data);
     +	return oidset_contains(&data->extra_recent_oids, oid);
      }
      
      static void add_recent_object(const struct object_id *oid,
    -@@ reachable.c: static int want_recent_object(struct recent_data *data,
    - 			      const struct object_id *oid)
    - {
    - 	if (data->ignore_in_core_kept_packs &&
    --	    has_object_kept_pack(oid, IN_CORE_KEEP_PACKS))
    -+	    has_object_kept_pack(oid, IN_CORE_KEEP_PACKS)) {
    -+		if (!data->extra_recent_oids_loaded)
    -+			load_pack_recent_objects(data);
    -+		if (oidset_contains(&data->extra_recent_oids, oid))
    -+			return 1;
    -+
    - 		return 0;
    -+	}
    - 	return 1;
    - }
    - 
     @@ reachable.c: int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
      	data.cb = cb;
      	data.ignore_in_core_kept_packs = ignore_in_core_kept_packs;
    @@ reachable.c: int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
      
      static int mark_object_seen(const struct object_id *oid,
     
    + ## t/t5304-prune.sh ##
    +@@ t/t5304-prune.sh: test_expect_success 'old reachable-from-recent retained with bitmaps' '
    + 	test_must_fail git cat-file -e $to_drop
    + '
    + 
    ++test_expect_success 'gc.recentObjectsHook' '
    ++	add_blob &&
    ++	test-tool chmtime =-86500 $BLOB_FILE &&
    ++
    ++	write_script precious-objects <<-EOF &&
    ++	echo $BLOB
    ++	EOF
    ++	test_config gc.recentObjectsHook ./precious-objects &&
    ++
    ++	git prune --expire=now &&
    ++
    ++	git cat-file -p $BLOB
    ++'
    ++
    + test_done
    +
      ## t/t5329-pack-objects-cruft.sh ##
     @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend via loose' '
      	)
      '
      
    -+test_expect_success 'additional cruft tips may be specified via pack.extraCruftTips' '
    ++test_expect_success 'gc.recentObjectsHook' '
     +	git init repo &&
     +	test_when_finished "rm -fr repo" &&
     +	(
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +		write_script extra-tips <<-EOF &&
     +		echo $cruft_old
     +		EOF
    -+		git config pack.recentObjectsHook ./extra-tips &&
    ++		git config gc.recentObjectsHook ./extra-tips &&
     +
     +		git repack --cruft --cruft-expiration=now -d &&
     +
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +		test_cmp cruft.expect cruft.actual &&
     +
     +		# Ensure that the "old" objects are removed after
    -+		# dropping the pack.extraCruftTips hook.
    -+		git config --unset pack.recentObjectsHook &&
    ++		# dropping the gc.recentObjectsHook hook.
    ++		git config --unset gc.recentObjectsHook &&
     +		git repack --cruft --cruft-expiration=now -d &&
     +
     +		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +	)
     +'
     +
    -+test_expect_success 'multi-valued pack.extraCruftTips' '
    ++test_expect_success 'multi-valued gc.recentObjectsHook' '
     +	git init repo &&
     +	test_when_finished "rm -fr repo" &&
     +	(
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +
     +		# ensure that each extra cruft tip is saved by its
     +		# respective hook
    -+		git config --add pack.recentObjectsHook ./extra-tips.a &&
    -+		git config --add pack.recentObjectsHook ./extra-tips.b &&
    ++		git config --add gc.recentObjectsHook ./extra-tips.a &&
    ++		git config --add gc.recentObjectsHook ./extra-tips.b &&
     +		git repack --cruft --cruft-expiration=now -d &&
     +
     +		mtimes="$(ls .git/objects/pack/pack-*.mtimes)" &&
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +		test_cmp cruft.expect cruft.actual &&
     +
     +		# ensure that a dirty exit halts cruft pack generation
    -+		git config --add pack.recentObjectsHook ./extra-tips.c &&
    ++		git config --add gc.recentObjectsHook ./extra-tips.c &&
     +		test_must_fail git repack --cruft --cruft-expiration=now -d 2>err &&
     +		grep "unable to enumerate additional cruft tips" err &&
     +
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +	)
     +'
     +
    -+test_expect_success 'additional cruft blobs via pack.extraCruftTips' '
    ++test_expect_success 'additional cruft blobs via gc.recentObjectsHook' '
     +	git init repo &&
     +	test_when_finished "rm -fr repo" &&
     +	(
    @@ t/t5329-pack-objects-cruft.sh: test_expect_success 'cruft objects are freshend v
     +		write_script extra-tips <<-EOF &&
     +		echo $blob
     +		EOF
    -+		git config pack.recentObjectsHook ./extra-tips &&
    ++		git config gc.recentObjectsHook ./extra-tips &&
     +
     +		git repack --cruft --cruft-expiration=now -d &&
     +
    @@ t/t7701-repack-unpack-unreachable.sh: test_expect_success 'do not bother looseni
      	test_must_fail git cat-file -p $obj2
      '
      
    -+test_expect_success 'extra recent tips are kept regardless of age' '
    ++test_expect_success 'gc.recentObjectsHook' '
     +	obj1=$(echo one | git hash-object -w --stdin) &&
     +	obj2=$(echo two | git hash-object -w --stdin) &&
    ++	obj3=$(echo three | git hash-object -w --stdin) &&
     +	pack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&
     +	pack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&
    ++	pack3=$(echo $obj3 | git pack-objects .git/objects/pack/pack) &&
     +	git prune-packed &&
     +
     +	git cat-file -p $obj1 &&
     +	git cat-file -p $obj2 &&
    ++	git cat-file -p $obj3 &&
     +
    -+	write_script extra-tips <<-EOF &&
    -+	echo $obj2
    ++	git tag -a -m tag obj2-tag $obj2 &&
    ++	obj2_tag="$(git rev-parse obj2-tag)" &&
    ++
    ++	write_script precious-objects <<-EOF &&
    ++	echo $obj2_tag
     +	EOF
    -+	git config pack.recentObjectsHook ./extra-tips &&
    ++	git config gc.recentObjectsHook ./precious-objects &&
     +
     +	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
    ++	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
     +	git repack -A -d --unpack-unreachable=1.hour.ago &&
     +
     +	git cat-file -p $obj1 &&
    -+	git cat-file -p $obj2
    ++	git cat-file -p $obj2 &&
    ++	git cat-file -p $obj2_tag &&
    ++	test_must_fail git cat-file -p $obj3
     +'
     +
      test_expect_success 'keep packed objects found only in index' '
-- 
2.40.1.558.g18e50d2517

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook`
  2023-05-12 21:45  0%     ` Jeff King
@ 2023-05-15 20:49  0%       ` Taylor Blau
  0 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-05-15 20:49 UTC (permalink / raw)
  To: Jeff King; +Cc: git, Chris Torek, Derrick Stolee, Junio C Hamano

On Fri, May 12, 2023 at 05:45:42PM -0400, Jeff King wrote:
> On Fri, May 12, 2023 at 05:24:56PM -0400, Jeff King wrote:
>
> > > This patch introduces a new configuration, `pack.recentObjectsHook`
> > > which allows the caller to specify a program (or set of programs) whose
> > > output is treated as a set of objects to treat as recent, regardless of
> > > their true age.
> >
> > I was going to complain about putting this in the "pack" section,
> > because I thought by touching reachable.c, we'd also affect git-prune.
> > But I don't think we do, because it does its own direct mtime check on
> > the loose objects.
> >
> > But I'm not sure that's the right behavior.
> >
> > It feels like even before your patch, this is a huge gap in our
> > object-retention strategy.  During repacking, we try to avoid dropping
> > objects which are reachable from recent-but-unreachable things we're
> > keeping (since otherwise it effectively corrupts those recent objects,
> > making them less valuable to keep). But git-prune will happily drop them
> > anyway!
> >
> > And I think the same thing would apply to your hook. If the hook says
> > "object XYZ is precious even if unreachable, keep it", then git-prune
> > ignoring that seems like it would be a source of errors.
> >
> > I suspect both could be fixed by having git-prune trigger the same
> > add_unseen_recent_objects_to_traversal() call either as part of
> > the perform_reachability_traversal() walk, or maybe in its own walk (I
> > think maybe it has to be its own because the second walk should avoid
> > complaining about missing objects).
>
> <phew> I am happy to say that I was wrong here, and git-prune behaves as
> it should, courtesy of d3038d22f9 (prune: keep objects reachable from
> recent objects, 2014-10-15). The magic happens in mark_reachable_objects(),
> which handles walking the recent objects by calling...you guessed it,
> add_unseen_recent_objects_to_traversal().

Phew. Thanks for digging into it before I was able to respond. I'm glad
that this works (though I agree that we should add a test).

> So it does the right thing now, and your patch should kick in
> automatically for git-prune, too. But I think we'd want two things:
>
>   1. Should the config variable name be made more generic to match?
>      Maybe "core" is too broad (though certainly I'd expect it to apply
>      anywhere in Git where we check recent-ness of objects), but perhaps
>      "gc" would make sense (even though it is not strictly part of the
>      gc command, it is within that realm of concepts).

"core" does feel pretty broad. There's some precedence for adding
hook-like configuration there, at least with
`core.alternateRefsCommand`. But I think that was an appropriate choice
given the scope of that feature.

I think that calling it "gc.recentObjectsHook" makes the most sense.

>   2. We probably want a test covering git-prune in this situation.

Yup.

Thanks,
Taylor

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook`
  2023-05-12 21:24  3%   ` Jeff King
  2023-05-12 21:36  0%     ` Taylor Blau
  2023-05-12 21:45  0%     ` Jeff King
@ 2023-05-15 20:38  7%     ` Taylor Blau
  2 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-05-15 20:38 UTC (permalink / raw)
  To: Jeff King; +Cc: git, Chris Torek, Derrick Stolee, Junio C Hamano

On Fri, May 12, 2023 at 05:24:56PM -0400, Jeff King wrote:
> I think this description suffers a bit from being adapted from the
> original patch which was targeting cruft packs. It's not clear to me
> what "the caller" means here. And really, I think this is getting into
> the details before giving an overview and motivation.
>
> I'd expect something the rationale to be something like:

Re-reading it myself, I tend to agree with you. I modified it quite a
bit, and I'm much happier with the result. Thanks for mentioning it.

> One option I don't see here is: update the mtime on the objects you want
> to salvage.
>
> Why would we want this patch instead of just having the caller update
> the mtimes of objects (or in a cruft-pack world, call a command that
> rewrites the .mtimes file with new values)?
>
> I can think of some possible arguments against it (you might want to
> retain the old mtimes, or you might find it a hassle to have to
> continually update them before gc kills them). But I think the commit
> message should probably make those arguments.

I agree with everything you wrote here.

> > We then add those as tips to another reachability traversal (along with
> > any recent objects, if pruning), marking every object along the way
> > (either adding it to the cruft pack, or writing it out as a loose
> > object).
>
> I didn't understand this "if pruning" comment. If we are not pruning at
> all, wouldn't we skip the extra traversal entirely, since we know we are
> saving everything?

I was talking about the rescuing traversal for generating a cruft pack.
But I ended up dropping this whole paragraph anyway, since I don't think
it's adding anything in the context of the new patch message.

> > @@ -126,8 +198,14 @@ static int want_recent_object(struct recent_data *data,
> >  			      const struct object_id *oid)
> >  {
> >  	if (data->ignore_in_core_kept_packs &&
> > -	    has_object_kept_pack(oid, IN_CORE_KEEP_PACKS))
> > +	    has_object_kept_pack(oid, IN_CORE_KEEP_PACKS)) {
> > +		if (!data->extra_recent_oids_loaded)
> > +			load_pack_recent_objects(data);
> > +		if (oidset_contains(&data->extra_recent_oids, oid))
> > +			return 1;
> > +
> >  		return 0;
> > +	}
> >  	return 1;
> >  }
>
> This hunk I'm less sure about. The purpose of this function is that the
> caller has told us about some packs which are "special", and we avoid
> adding their objects to the traversal.
>
> This kicks in for cruft packs, when the git-repack caller says "I just
> made pack xyz.pack; do not bother saving anything in it to the cruft
> pack, since xyz.pack is here to stay". So if a hook says "you should
> keep object X", why would we want to override that check? It is already
> a reachable object that has been packed into xyz.pack, so we know there
> is no point in even considering its recency.

Yup, you're absolutely right here. Thanks for catching it.

> > --- a/t/t5329-pack-objects-cruft.sh
> > +++ b/t/t5329-pack-objects-cruft.sh
> > @@ -739,4 +739,175 @@ test_expect_success 'cruft objects are freshend via loose' '
> >  	)
> >  '
> >
> > +test_expect_success 'additional cruft tips may be specified via pack.extraCruftTips' '
>
> This title (and others below) seems out of date. :)

Thanks for noticing, fixed.

> > diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
> > index ebb267855f..d2eea6e754 100755
> > --- a/t/t7701-repack-unpack-unreachable.sh
> > +++ b/t/t7701-repack-unpack-unreachable.sh
> > @@ -113,6 +113,28 @@ test_expect_success 'do not bother loosening old objects' '
> >  	test_must_fail git cat-file -p $obj2
> >  '
> >
> > +test_expect_success 'extra recent tips are kept regardless of age' '
> > +	obj1=$(echo one | git hash-object -w --stdin) &&
> > +	obj2=$(echo two | git hash-object -w --stdin) &&
> > +	pack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&
> > +	pack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&
> > +	git prune-packed &&
> > +
> > +	git cat-file -p $obj1 &&
> > +	git cat-file -p $obj2 &&
> > +
> > +	write_script extra-tips <<-EOF &&
> > +	echo $obj2
> > +	EOF
> > +	git config pack.recentObjectsHook ./extra-tips &&
> > +
> > +	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
> > +	git repack -A -d --unpack-unreachable=1.hour.ago &&
> > +
> > +	git cat-file -p $obj1 &&
> > +	git cat-file -p $obj2
> > +'
>
> And this is the new test in this iteration covering the "repack -A"
> case.
>
> It is checking that $obj2, which our hook mentions, is saved. It also
> checks that $obj1 is saved because it is still recent. But there are two
> other possibly interesting cases:
>
>   - an object that is too old and is _not_ saved. It seems useful to
>     confirm that the new patch does not simply break the ability to drop
>     objects. ;)
>
>   - an object that is reachable from $obj2 is also saved. From a
>     white-box perspective this is less interesting, because we should
>     already test elsewhere that this works for recent objects, and we
>     know the new feature is implemented by faking recency. But it might
>     be worth it for completeness, and because it's easy to do (making
>     $obj2 a tag pointing to a blob should work).

All very good cases to check for. Here's a patch on top (which I'll
obviously squash into my new version, but figured I'd send it as a
response to you directly, too):

--- 8< ---
S
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index d2eea6e754..fa2df6016b 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -116,23 +116,33 @@ test_expect_success 'do not bother loosening old objects' '
 test_expect_success 'extra recent tips are kept regardless of age' '
 	obj1=$(echo one | git hash-object -w --stdin) &&
 	obj2=$(echo two | git hash-object -w --stdin) &&
+	obj3=$(echo three | git hash-object -w --stdin) &&
 	pack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&
 	pack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&
+	pack3=$(echo $obj3 | git pack-objects .git/objects/pack/pack) &&
 	git prune-packed &&

 	git cat-file -p $obj1 &&
 	git cat-file -p $obj2 &&
+	git cat-file -p $obj3 &&

-	write_script extra-tips <<-EOF &&
-	echo $obj2
+	git tag -a -m tag obj2-tag $obj2 &&
+	obj2_tag="$(git rev-parse obj2-tag)" &&
+
+
+	write_script precious-objects <<-EOF &&
+	echo $obj2_tag
 	EOF
-	git config pack.recentObjectsHook ./extra-tips &&
+	git config pack.recentObjectsHook ./precious-objects &&

 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
+	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
 	git repack -A -d --unpack-unreachable=1.hour.ago &&

 	git cat-file -p $obj1 &&
-	git cat-file -p $obj2
+	git cat-file -p $obj2 &&
+	git cat-file -p $obj2_tag &&
+	test_must_fail git cat-file -p $obj3
 '

 test_expect_success 'keep packed objects found only in index' '
--- >8 ---

Thanks,
Taylor

^ permalink raw reply related	[relevance 7%]

* Re: [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook`
  2023-05-12 21:24  3%   ` Jeff King
  2023-05-12 21:36  0%     ` Taylor Blau
@ 2023-05-12 21:45  0%     ` Jeff King
  2023-05-15 20:49  0%       ` Taylor Blau
  2023-05-15 20:38  7%     ` Taylor Blau
  2 siblings, 1 reply; 200+ results
From: Jeff King @ 2023-05-12 21:45 UTC (permalink / raw)
  To: Taylor Blau; +Cc: git, Chris Torek, Derrick Stolee, Junio C Hamano

On Fri, May 12, 2023 at 05:24:56PM -0400, Jeff King wrote:

> > This patch introduces a new configuration, `pack.recentObjectsHook`
> > which allows the caller to specify a program (or set of programs) whose
> > output is treated as a set of objects to treat as recent, regardless of
> > their true age.
> 
> I was going to complain about putting this in the "pack" section,
> because I thought by touching reachable.c, we'd also affect git-prune.
> But I don't think we do, because it does its own direct mtime check on
> the loose objects.
> 
> But I'm not sure that's the right behavior.
> 
> It feels like even before your patch, this is a huge gap in our
> object-retention strategy.  During repacking, we try to avoid dropping
> objects which are reachable from recent-but-unreachable things we're
> keeping (since otherwise it effectively corrupts those recent objects,
> making them less valuable to keep). But git-prune will happily drop them
> anyway!
> 
> And I think the same thing would apply to your hook. If the hook says
> "object XYZ is precious even if unreachable, keep it", then git-prune
> ignoring that seems like it would be a source of errors.
> 
> I suspect both could be fixed by having git-prune trigger the same
> add_unseen_recent_objects_to_traversal() call either as part of
> the perform_reachability_traversal() walk, or maybe in its own walk (I
> think maybe it has to be its own because the second walk should avoid
> complaining about missing objects).

<phew> I am happy to say that I was wrong here, and git-prune behaves as
it should, courtesy of d3038d22f9 (prune: keep objects reachable from
recent objects, 2014-10-15). The magic happens in mark_reachable_objects(),
which handles walking the recent objects by calling...you guessed it,
add_unseen_recent_objects_to_traversal().

So it does the right thing now, and your patch should kick in
automatically for git-prune, too. But I think we'd want two things:

  1. Should the config variable name be made more generic to match?
     Maybe "core" is too broad (though certainly I'd expect it to apply
     anywhere in Git where we check recent-ness of objects), but perhaps
     "gc" would make sense (even though it is not strictly part of the
     gc command, it is within that realm of concepts).

  2. We probably want a test covering git-prune in this situation.

The thing that confused me when looking at the code earlier is that
git-prune itself checks the mtime of the objects, too, even if they were
not mentioned in the recent-but-reachable walk. That seems redundant to
me, but somehow it isn't. If I do:

diff --git a/builtin/prune.c b/builtin/prune.c
index 5dc9b20720..22b7ce4b10 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -92,7 +92,7 @@ static int prune_object(const struct object_id *oid, const char *fullpath,
 		return 0;
 	}
 	if (st.st_mtime > expire)
-		return 0;
+		BUG("object should have been saved via is_object_reachable!");
 	if (show_only || verbose) {
 		enum object_type type = oid_object_info(the_repository, oid,
 							NULL);

then t5304 shows some failures. I'm not quite sure what is going on, but
_if_ that mtime check in prune_object() is important, then it probably
should also respect the hook mechanism. So there may be a (3) to add to
your patch there.

-Peff

^ permalink raw reply related	[relevance 0%]

* Re: [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook`
  2023-05-12 21:24  3%   ` Jeff King
@ 2023-05-12 21:36  0%     ` Taylor Blau
  2023-05-12 21:45  0%     ` Jeff King
  2023-05-15 20:38  7%     ` Taylor Blau
  2 siblings, 0 replies; 200+ results
From: Taylor Blau @ 2023-05-12 21:36 UTC (permalink / raw)
  To: Jeff King; +Cc: git, Chris Torek, Derrick Stolee, Junio C Hamano

On Fri, May 12, 2023 at 05:24:56PM -0400, Jeff King wrote:
> > This patch introduces a new configuration, `pack.recentObjectsHook`
> > which allows the caller to specify a program (or set of programs) whose
> > output is treated as a set of objects to treat as recent, regardless of
> > their true age.
>
> I was going to complain about putting this in the "pack" section,
> because I thought by touching reachable.c, we'd also affect git-prune.
> But I don't think we do, because it does its own direct mtime check on
> the loose objects.
>
> But I'm not sure that's the right behavior.
>
> It feels like even before your patch, this is a huge gap in our
> object-retention strategy.  During repacking, we try to avoid dropping
> objects which are reachable from recent-but-unreachable things we're
> keeping (since otherwise it effectively corrupts those recent objects,
> making them less valuable to keep). But git-prune will happily drop them
> anyway!
>
> And I think the same thing would apply to your hook. If the hook says
> "object XYZ is precious even if unreachable, keep it", then git-prune
> ignoring that seems like it would be a source of errors.
>
> I suspect both could be fixed by having git-prune trigger the same
> add_unseen_recent_objects_to_traversal() call either as part of
> the perform_reachability_traversal() walk, or maybe in its own walk (I
> think maybe it has to be its own because the second walk should avoid
> complaining about missing objects).

I might be missing something, but I think we already (kind of) do the
right thing here.

AFAICT, the path is:

  - cmd_prune()
  - for_each_loose_file_in_objdir()
  - prune_object() (as a callback to the above)
  - is_object_reachable()
  - perform_reachability_traversal()
  - mark_reachable_objects()
  - add_unseen_recent_objects_to_traversal()

That only happens when `mark_recent != 0`, though.

Thanks,
Taylor

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook`
  @ 2023-05-12 21:24  3%   ` Jeff King
  2023-05-12 21:36  0%     ` Taylor Blau
                       ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Jeff King @ 2023-05-12 21:24 UTC (permalink / raw)
  To: Taylor Blau; +Cc: git, Chris Torek, Derrick Stolee, Junio C Hamano

On Thu, May 11, 2023 at 07:20:37PM -0400, Taylor Blau wrote:

> This patch introduces a new multi-valued configuration option,
> `pack.recentObjectsHook` as a means to mark certain objects as recent,
> regardless of their age.
> 
> Depending on whether or not we are generating a cruft pack, this allows
> the caller to do one of two things:
> 
>   - If generating a cruft pack, the caller is able to retain additional
>     objects via the cruft pack, even if they would have otherwise been
>     pruned due to their age.
> 
>   - If not generating a cruft pack, the caller is likewise able to
>     retain additional objects as loose.

I think this description suffers a bit from being adapted from the
original patch which was targeting cruft packs. It's not clear to me
what "the caller" means here. And really, I think this is getting into
the details before giving an overview and motivation.

I'd expect something the rationale to be something like:

  1. Git considers the recent-ness of objects when deciding how to handle
     unreachable objects (discarding those that are too old, and keeping
     new-enough ones)

  2. you might want to consider more objects as "recent" because you know
     something Git doesn't (that certain objects are more interesting
     than others; specific examples may help here)

  3. so this patch gives you a way to override the recent-ness check for
     certain objects

And then get into the details of the implementation, why other solutions
don't work, etc.

> There is currently no option to be able to keep around certain objects
> that have otherwise aged out of the grace period. The only way to retain
> those objects is:
> 
>   - to point a reference at them, which may be undesirable or
>     infeasible,
> 
>   - to track them via the reflog, which may be undesirable since the
>     reflog's lifetime is limited to that of the reference it's tracking
>     (and callers may want to keep those unreachable objects around for
>     longer)
> 
>   - to extend the grace period, which may keep around other objects that
>     the caller *does* want to discard,
> 
>   - or, to force the caller to construct the pack of objects they want
>     to keep themselves, and then mark the pack as kept by adding a
>     ".keep" file.

One option I don't see here is: update the mtime on the objects you want
to salvage.

Why would we want this patch instead of just having the caller update
the mtimes of objects (or in a cruft-pack world, call a command that
rewrites the .mtimes file with new values)?

I can think of some possible arguments against it (you might want to
retain the old mtimes, or you might find it a hassle to have to
continually update them before gc kills them). But I think the commit
message should probably make those arguments.

Likewise, I think you'd want to argue why the ".keep" approach isn't as
good (and I guess it is "having extra packs is awkward especially as you
roll forward your cruft packs").

> This patch introduces a new configuration, `pack.recentObjectsHook`
> which allows the caller to specify a program (or set of programs) whose
> output is treated as a set of objects to treat as recent, regardless of
> their true age.

I was going to complain about putting this in the "pack" section,
because I thought by touching reachable.c, we'd also affect git-prune.
But I don't think we do, because it does its own direct mtime check on
the loose objects.

But I'm not sure that's the right behavior.

It feels like even before your patch, this is a huge gap in our
object-retention strategy.  During repacking, we try to avoid dropping
objects which are reachable from recent-but-unreachable things we're
keeping (since otherwise it effectively corrupts those recent objects,
making them less valuable to keep). But git-prune will happily drop them
anyway!

And I think the same thing would apply to your hook. If the hook says
"object XYZ is precious even if unreachable, keep it", then git-prune
ignoring that seems like it would be a source of errors.

I suspect both could be fixed by having git-prune trigger the same
add_unseen_recent_objects_to_traversal() call either as part of
the perform_reachability_traversal() walk, or maybe in its own walk (I
think maybe it has to be its own because the second walk should avoid
complaining about missing objects).

> We then add those as tips to another reachability traversal (along with
> any recent objects, if pruning), marking every object along the way
> (either adding it to the cruft pack, or writing it out as a loose
> object).

I didn't understand this "if pruning" comment. If we are not pruning at
all, wouldn't we skip the extra traversal entirely, since we know we are
saving everything?

> A potential alternative here is to introduce a new mode to alter the
> contents of the reachable pack instead of the cruft one. One could
> imagine a new option to `pack-objects`, say `--extra-reachable-tips`
> that does the same thing as above, adding the visited set of objects
> along the traversal to the pack.
> 
> But this has the unfortunate side-effect of altering the reachability
> closure of that pack. If parts of the unreachable object graph mentioned
> by one or more of the "extra reachable tips" programs is not closed,
> then the resulting pack won't be either. This makes it impossible in the
> general case to write out reachability bitmaps for that pack, since
> closure is a requirement there.

Makes sense.

> +	while (strbuf_getline(&buf, out) != EOF) {
> +		struct object_id oid;
> +		const char *rest;
> +
> +		if (parse_oid_hex(buf.buf, &oid, &rest) || *rest) {
> +			ret = error(_("invalid extra cruft tip: '%s'"), buf.buf);
> +			goto done;
> +		}
> +
> +		oidset_insert(set, &oid);
> +	}
> +
> +	ret = finish_command(&cmd);
> +
> +done:

I mentioned the "goto done" issue in another email.

>  static int obj_is_recent(const struct object_id *oid, timestamp_t mtime,
>  			 struct recent_data *data)
>  {
> -	return mtime > data->timestamp;
> +	if (mtime > data->timestamp)
> +		return 1;
> +
> +	if (!data->extra_recent_oids_loaded)
> +		load_pack_recent_objects(data);
> +	return oidset_contains(&data->extra_recent_oids, oid);
>  }

OK, so this is where we override the timestamp check. Makes sense.

> @@ -126,8 +198,14 @@ static int want_recent_object(struct recent_data *data,
>  			      const struct object_id *oid)
>  {
>  	if (data->ignore_in_core_kept_packs &&
> -	    has_object_kept_pack(oid, IN_CORE_KEEP_PACKS))
> +	    has_object_kept_pack(oid, IN_CORE_KEEP_PACKS)) {
> +		if (!data->extra_recent_oids_loaded)
> +			load_pack_recent_objects(data);
> +		if (oidset_contains(&data->extra_recent_oids, oid))
> +			return 1;
> +
>  		return 0;
> +	}
>  	return 1;
>  }

This hunk I'm less sure about. The purpose of this function is that the
caller has told us about some packs which are "special", and we avoid
adding their objects to the traversal.

This kicks in for cruft packs, when the git-repack caller says "I just
made pack xyz.pack; do not bother saving anything in it to the cruft
pack, since xyz.pack is here to stay". So if a hook says "you should
keep object X", why would we want to override that check? It is already
a reachable object that has been packed into xyz.pack, so we know there
is no point in even considering its recency.

> @@ -199,16 +277,24 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
>  	data.cb = cb;
>  	data.ignore_in_core_kept_packs = ignore_in_core_kept_packs;
>  
> +	oidset_init(&data.extra_recent_oids, 0);
> +	data.extra_recent_oids_loaded = 0;
> +
>  	r = for_each_loose_object(add_recent_loose, &data,
>  				  FOR_EACH_OBJECT_LOCAL_ONLY);
>  	if (r)
> -		return r;
> +		goto done;
>  
>  	flags = FOR_EACH_OBJECT_LOCAL_ONLY | FOR_EACH_OBJECT_PACK_ORDER;
>  	if (ignore_in_core_kept_packs)
>  		flags |= FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS;
>  
> -	return for_each_packed_object(add_recent_packed, &data, flags);
> +	r = for_each_packed_object(add_recent_packed, &data, flags);
> +
> +done:
> +	oidset_clear(&data.extra_recent_oids);
> +
> +	return r;
>  }

This handles the cleanup that I was too lazy to do in my earlier patch.
Good. :)

> --- a/t/t5329-pack-objects-cruft.sh
> +++ b/t/t5329-pack-objects-cruft.sh
> @@ -739,4 +739,175 @@ test_expect_success 'cruft objects are freshend via loose' '
>  	)
>  '
>  
> +test_expect_success 'additional cruft tips may be specified via pack.extraCruftTips' '

This title (and others below) seems out of date. :)

> diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
> index ebb267855f..d2eea6e754 100755
> --- a/t/t7701-repack-unpack-unreachable.sh
> +++ b/t/t7701-repack-unpack-unreachable.sh
> @@ -113,6 +113,28 @@ test_expect_success 'do not bother loosening old objects' '
>  	test_must_fail git cat-file -p $obj2
>  '
>  
> +test_expect_success 'extra recent tips are kept regardless of age' '
> +	obj1=$(echo one | git hash-object -w --stdin) &&
> +	obj2=$(echo two | git hash-object -w --stdin) &&
> +	pack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&
> +	pack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&
> +	git prune-packed &&
> +
> +	git cat-file -p $obj1 &&
> +	git cat-file -p $obj2 &&
> +
> +	write_script extra-tips <<-EOF &&
> +	echo $obj2
> +	EOF
> +	git config pack.recentObjectsHook ./extra-tips &&
> +
> +	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
> +	git repack -A -d --unpack-unreachable=1.hour.ago &&
> +
> +	git cat-file -p $obj1 &&
> +	git cat-file -p $obj2
> +'

And this is the new test in this iteration covering the "repack -A"
case.

It is checking that $obj2, which our hook mentions, is saved. It also
checks that $obj1 is saved because it is still recent. But there are two
other possibly interesting cases:

  - an object that is too old and is _not_ saved. It seems useful to
    confirm that the new patch does not simply break the ability to drop
    objects. ;)

  - an object that is reachable from $obj2 is also saved. From a
    white-box perspective this is less interesting, because we should
    already test elsewhere that this works for recent objects, and we
    know the new feature is implemented by faking recency. But it might
    be worth it for completeness, and because it's easy to do (making
    $obj2 a tag pointing to a blob should work).

-Peff

^ permalink raw reply	[relevance 3%]

* Add a way to disable «git clean» per repo
@ 2023-04-01 20:50  4% Guillem Jover
  0 siblings, 0 replies; 200+ results
From: Guillem Jover @ 2023-04-01 20:50 UTC (permalink / raw)
  To: git

Hi!

[ I initially filed this in the Debian bug tracking system as it
  seemed to me that filing a feature request on a mailing list had
  a great potential to get lost. But I guess I can try anyway. :) ]

For repositories that are not tracking code, say when storing your ~/
under git, or to store say collections of data files such as photos,
texts or similar, you might end up using .gitignore to unclutter
«git status». The problem is that both ignored and non-ignored
untracked files can be “precious”, as in not version-tracked by losing
them might imply data loss.

Accidentally running «git clean -xdf» or «git clean -Xdf» might be
catastrophic there. But for the ~/ case (or any such tracking in a
parent of git trees, this is even worse, as an accidental «cd» too
much while in some code repo might end up accidentally recursively
running those «git clean» on an unexpected working tree and all of
its subdirectories (except for other git working trees).

I tend to be rather careful with this, but I recently had a scare
where this happened to me, and lost a few (not essential) files before
I noticed and Ctrl-C'd git. I then set out to try to disable git clean
on these situations, but I see no way to do that as aliases do not work
with built-ins, and adding a ~/bin/git wrapper to check for this seems
extremely cumbersome.

It would thus be nice if there was an option that could be set to
completely disable «git clean» on a repo. I guess it might make sense
to disable for any untracked file, or perhaps for ignored and/or
non-ignored. So that these kind of work trees could be protected.

Thanks,
Guillem

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 5/8] rebase: preserve interactive todo file on checkout failure
  2023-03-23 23:23  4%     ` Oswald Buddenhagen
@ 2023-03-24  4:31  0%       ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-03-24  4:31 UTC (permalink / raw)
  To: Oswald Buddenhagen; +Cc: git

Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:

> On Thu, Mar 23, 2023 at 01:16:47PM -0700, Junio C Hamano wrote:
>>Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:
>>
>>> Creating a suitable todo file is a potentially labor-intensive process,
>>> so be less cavalier about discarding it when something goes wrong (e.g.,
>>> the user messed with the repo while editing the todo).
>>
>>Is there a reason why we do not always keep it?  Why is the file
>>sometimes precious but not precious at all in other times?
>>
> the unedited initial todo just isn't precious. that implies that in a
> non-interactive rebase, it is always worthless at the time of the
> initial reset.

I see.  Thanks for clarifying.

Just FYI, the primary purpose reviewers ask questions on the
proposed change is to help submitters polish their patch (both the
proposed log message text and the code) to clarify points they found
hard to understand and/or they suspect would be hard to understand
for other readers.  So please do not be happy by just receiving "I
see, thanks" and stop there.  Instead, please update the patch so
that future readers would not have to ask similar question again.

>>(and if you can reliably ensure that the file has contents
>>that are expected, that would be even better)?
>>
> i could grep for a shortened sha1 i would obtain from the branch. but
> given that the error scenario of a present but somehow corrupted todo
> seems implausible given the circumstances, that seems like overkill.

It is OK.  If it were easy to prepare the "todo should look like
this" golden copy, then doing test_cmp the actual file with it would
have been a simple way to ensure both existence of and sane contents
in the file at the same time, but if it isn't cheap to prepare such
an expected output, I agree with you that it is not worth the extra
effort.

Thanks.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 5/8] rebase: preserve interactive todo file on checkout failure
  2023-03-23 20:16  6%   ` Junio C Hamano
@ 2023-03-23 23:23  4%     ` Oswald Buddenhagen
  2023-03-24  4:31  0%       ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Oswald Buddenhagen @ 2023-03-23 23:23 UTC (permalink / raw)
  To: git

On Thu, Mar 23, 2023 at 01:16:47PM -0700, Junio C Hamano wrote:
>Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:
>
>> Creating a suitable todo file is a potentially labor-intensive process,
>> so be less cavalier about discarding it when something goes wrong (e.g.,
>> the user messed with the repo while editing the todo).
>
>Is there a reason why we do not always keep it?  Why is the file
>sometimes precious but not precious at all in other times?
>
the unedited initial todo just isn't precious. that implies that in a 
non-interactive rebase, it is always worthless at the time of the 
initial reset.

>Tying the previous bit to "-i was explicitly given" feels a bit
>unintuitive---when the sequencer machinery was implicitly chosen,
>and gives the control back to the user, should a user be forbidden
>to muck with the todo list?
>
that would be an --edit-todo and --continue during a mid-rebase stop.  
rather different case.

>No // comments, please.
>
(apparently with a special exception for examples in the apidocs, 
presumably because escaping nested comments would be just too ugly.)

>> -	test_path_is_missing .git/rebase-merge &&
>> +	test_path_is_dir .git/rebase-merge &&
>
>Are we happy to just see that the directory still exists?  I thought
>the original motivation explained in the proposed log message was to
>keep the todo list file, so shouldn't you be checking if the file is
>there
>
fair point.

>(and if you can reliably ensure that the file has contents
>that are expected, that would be even better)?
>
i could grep for a shortened sha1 i would obtain from the branch. but 
given that the error scenario of a present but somehow corrupted todo 
seems implausible given the circumstances, that seems like overkill.

>Also, as the keeping of the todo list is now conditional, we should
>have another test that checks that the file is gone when that
>condition ("INTERACTIVE_EXPLICIT"?) does not trigger, I think.
>
that would be for t3400-rebase.sh.
i suppose we could extend 'Show verbose error when HEAD could not be 
detached'.

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 5/8] rebase: preserve interactive todo file on checkout failure
  @ 2023-03-23 20:16  6%   ` Junio C Hamano
  2023-03-23 23:23  4%     ` Oswald Buddenhagen
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-03-23 20:16 UTC (permalink / raw)
  To: Oswald Buddenhagen; +Cc: git

Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:

> Creating a suitable todo file is a potentially labor-intensive process,
> so be less cavalier about discarding it when something goes wrong (e.g.,
> the user messed with the repo while editing the todo).

Is there a reason why we do not always keep it?  Why is the file
sometimes precious but not precious at all in other times?

Tying the previous bit to "-i was explicitly given" feels a bit
unintuitive---when the sequencer machinery was implicitly chosen,
and gives the control back to the user, should a user be forbidden
to muck with the todo list?

> diff --git a/builtin/rebase.c b/builtin/rebase.c
> index a309addd50..728c869db4 100644
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@ -153,6 +153,7 @@ static struct replay_opts get_replay_opts(const struct rebase_options *opts)
>  	replay.keep_redundant_commits = (opts->empty == EMPTY_KEEP);
>  	replay.quiet = !(opts->flags & REBASE_NO_QUIET);
>  	replay.verbose = opts->flags & REBASE_VERBOSE;
> +	replay.precious_todo = opts->flags & REBASE_INTERACTIVE_EXPLICIT;
>  	replay.reschedule_failed_exec = opts->reschedule_failed_exec;
>  	replay.committer_date_is_author_date =
>  					opts->committer_date_is_author_date;
> diff --git a/sequencer.c b/sequencer.c
> index b1c29c8802..f8a7f4e721 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -4570,6 +4570,10 @@ static int checkout_onto(struct repository *r, struct replay_opts *opts,
>  		.default_reflog_action = sequencer_reflog_action(opts)
>  	};
>  	if (reset_head(r, &ropts)) {
> +		// Editing the todo may have been costly; don't just discard it.
> +		if (opts->precious_todo)
> +			exit(1);  // Error was already printed

No // comments, please.

> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
> index ff0afad63e..c625aad10a 100755
> --- a/t/t3404-rebase-interactive.sh
> +++ b/t/t3404-rebase-interactive.sh
> @@ -288,13 +288,14 @@ test_expect_success 'abort' '
>  '
>  
>  test_expect_success 'abort with error when new base cannot be checked out' '
> +	test_when_finished "git rebase --abort ||:" &&
>  	git rm --cached file1 &&
>  	git commit -m "remove file in base" &&
>  	test_must_fail git rebase -i primary > output 2>&1 &&
>  	test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" \
>  		output &&
>  	test_i18ngrep "file1" output &&
> -	test_path_is_missing .git/rebase-merge &&
> +	test_path_is_dir .git/rebase-merge &&
>  	rm file1 &&
>  	git reset --hard HEAD^
>  '

Are we happy to just see that the directory still exists?  I thought
the original motivation explained in the proposed log message was to
keep the todo list file, so shouldn't you be checking if the file is
there (and if you can reliably ensure that the file has contents
that are expected, that would be even better)?

Also, as the keeping of the todo list is now conditional, we should
have another test that checks that the file is gone when that
condition ("INTERACTIVE_EXPLICIT"?) does not trigger, I think.

Other than that, nicely written.  Thanks.

^ permalink raw reply	[relevance 6%]

* [PATCH v2 13/16] setup.h: move declarations for setup.c functions from cache.h
  @ 2023-03-21  6:26  2%   ` Elijah Newren via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2023-03-21  6:26 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Elijah Newren,
	Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 apply.c                                      |   1 +
 archive.c                                    |   1 +
 attr.c                                       |   1 +
 blame.c                                      |   1 +
 builtin/blame.c                              |   1 +
 builtin/bugreport.c                          |   1 +
 builtin/bundle.c                             |   1 +
 builtin/check-attr.c                         |   1 +
 builtin/check-ref-format.c                   |   1 +
 builtin/checkout-index.c                     |   1 +
 builtin/checkout.c                           |   1 +
 builtin/clean.c                              |   1 +
 builtin/clone.c                              |   1 +
 builtin/config.c                             |   1 +
 builtin/describe.c                           |   1 +
 builtin/diff-index.c                         |   1 +
 builtin/diff.c                               |   1 +
 builtin/difftool.c                           |   1 +
 builtin/gc.c                                 |   1 +
 builtin/grep.c                               |   1 +
 builtin/hash-object.c                        |   1 +
 builtin/help.c                               |   1 +
 builtin/index-pack.c                         |   1 +
 builtin/init-db.c                            |   1 +
 builtin/ls-files.c                           |   1 +
 builtin/merge-file.c                         |   1 +
 builtin/mv.c                                 |   1 +
 builtin/read-tree.c                          |   1 +
 builtin/reset.c                              |   1 +
 builtin/rev-parse.c                          |   1 +
 builtin/rm.c                                 |   1 +
 builtin/shortlog.c                           |   1 +
 builtin/sparse-checkout.c                    |   1 +
 builtin/stash.c                              |   1 +
 builtin/stripspace.c                         |   1 +
 builtin/submodule--helper.c                  |   1 +
 builtin/update-index.c                       |   1 +
 cache.h                                      | 163 ------------------
 commit.c                                     |   1 +
 common-main.c                                |   1 +
 config.c                                     |   1 +
 daemon.c                                     |   1 +
 diff.c                                       |   1 +
 dir.c                                        |   1 +
 environment.c                                |   1 +
 git.c                                        |   1 +
 http-fetch.c                                 |   1 +
 http-push.c                                  |   1 +
 imap-send.c                                  |   1 +
 line-log.c                                   |   1 +
 mailmap.c                                    |   1 +
 object-file.c                                |   1 +
 object-name.c                                |   1 +
 path.c                                       |   1 +
 pathspec.c                                   |   1 +
 refs.c                                       |   1 +
 refs/files-backend.c                         |   1 +
 remote-curl.c                                |   1 +
 remote.c                                     |   1 +
 repository.c                                 |   1 +
 revision.c                                   |   1 +
 scalar.c                                     |   1 +
 setup.c                                      |   1 +
 setup.h                                      | 168 +++++++++++++++++++
 submodule.c                                  |   1 +
 symlinks.c                                   |   1 +
 t/helper/test-advise.c                       |   1 +
 t/helper/test-bitmap.c                       |   1 +
 t/helper/test-bloom.c                        |   1 +
 t/helper/test-cache-tree.c                   |   1 +
 t/helper/test-config.c                       |   1 +
 t/helper/test-dump-cache-tree.c              |   2 +-
 t/helper/test-dump-fsmonitor.c               |   1 +
 t/helper/test-dump-split-index.c             |   1 +
 t/helper/test-dump-untracked-cache.c         |   1 +
 t/helper/test-fast-rebase.c                  |   1 +
 t/helper/test-fsmonitor-client.c             |   1 +
 t/helper/test-lazy-init-name-hash.c          |   1 +
 t/helper/test-match-trees.c                  |   1 +
 t/helper/test-oid-array.c                    |   1 +
 t/helper/test-oidmap.c                       |   1 +
 t/helper/test-oidtree.c                      |   1 +
 t/helper/test-pack-mtimes.c                  |   1 +
 t/helper/test-partial-clone.c                |   1 +
 t/helper/test-path-utils.c                   |   1 +
 t/helper/test-proc-receive.c                 |   1 +
 t/helper/test-reach.c                        |   1 +
 t/helper/test-read-cache.c                   |   1 +
 t/helper/test-read-graph.c                   |   1 +
 t/helper/test-read-midx.c                    |   1 +
 t/helper/test-ref-store.c                    |   1 +
 t/helper/test-repository.c                   |   1 +
 t/helper/test-revision-walking.c             |   1 +
 t/helper/test-scrap-cache-tree.c             |   1 +
 t/helper/test-serve-v2.c                     |   1 +
 t/helper/test-submodule-config.c             |   1 +
 t/helper/test-submodule-nested-repo-config.c |   1 +
 t/helper/test-submodule.c                    |   1 +
 t/helper/test-subprocess.c                   |   1 +
 t/helper/test-userdiff.c                     |   1 +
 t/helper/test-write-cache.c                  |   1 +
 trace.c                                      |   1 +
 unpack-trees.c                               |   1 +
 worktree.c                                   |   1 +
 wt-status.c                                  |   1 +
 105 files changed, 271 insertions(+), 164 deletions(-)
 create mode 100644 setup.h

diff --git a/apply.c b/apply.c
index a7c0bccb15c..caa2e0a3bc6 100644
--- a/apply.c
+++ b/apply.c
@@ -27,6 +27,7 @@
 #include "rerere.h"
 #include "apply.h"
 #include "entry.h"
+#include "setup.h"
 #include "wrapper.h"
 
 struct gitdiff_data {
diff --git a/archive.c b/archive.c
index 7aeaaf368f4..cdce5b783a7 100644
--- a/archive.c
+++ b/archive.c
@@ -5,6 +5,7 @@
 #include "environment.h"
 #include "gettext.h"
 #include "hex.h"
+#include "setup.h"
 #include "refs.h"
 #include "object-store.h"
 #include "commit.h"
diff --git a/attr.c b/attr.c
index 62127196cb1..2d8aeb8b58c 100644
--- a/attr.c
+++ b/attr.c
@@ -18,6 +18,7 @@
 #include "quote.h"
 #include "revision.h"
 #include "object-store.h"
+#include "setup.h"
 #include "thread-utils.h"
 
 const char git_attr__true[] = "(builtin)true";
diff --git a/blame.c b/blame.c
index b7cd849bb6b..838eb128f01 100644
--- a/blame.c
+++ b/blame.c
@@ -7,6 +7,7 @@
 #include "diffcore.h"
 #include "gettext.h"
 #include "hex.h"
+#include "setup.h"
 #include "tag.h"
 #include "blame.h"
 #include "alloc.h"
diff --git a/builtin/blame.c b/builtin/blame.c
index 9ec82edcbde..fb271bae70e 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -31,6 +31,7 @@
 #include "object-store.h"
 #include "blame.h"
 #include "refs.h"
+#include "setup.h"
 #include "tag.h"
 
 static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
diff --git a/builtin/bugreport.c b/builtin/bugreport.c
index 160590e4ef6..52955e1d389 100644
--- a/builtin/bugreport.c
+++ b/builtin/bugreport.c
@@ -8,6 +8,7 @@
 #include "hook.h"
 #include "hook-list.h"
 #include "diagnose.h"
+#include "setup.h"
 #include "wrapper.h"
 
 static void get_system_info(struct strbuf *sys_info)
diff --git a/builtin/bundle.c b/builtin/bundle.c
index 9e2aecadf7d..e68fc83d943 100644
--- a/builtin/bundle.c
+++ b/builtin/bundle.c
@@ -1,6 +1,7 @@
 #include "builtin.h"
 #include "abspath.h"
 #include "gettext.h"
+#include "setup.h"
 #include "strvec.h"
 #include "parse-options.h"
 #include "cache.h"
diff --git a/builtin/check-attr.c b/builtin/check-attr.c
index 5870c4683ab..ec37b8164af 100644
--- a/builtin/check-attr.c
+++ b/builtin/check-attr.c
@@ -6,6 +6,7 @@
 #include "environment.h"
 #include "gettext.h"
 #include "quote.h"
+#include "setup.h"
 #include "parse-options.h"
 
 static int all_attrs;
diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c
index fd0e5f86832..b0263467424 100644
--- a/builtin/check-ref-format.c
+++ b/builtin/check-ref-format.c
@@ -5,6 +5,7 @@
 #include "cache.h"
 #include "refs.h"
 #include "builtin.h"
+#include "setup.h"
 #include "strbuf.h"
 
 static const char builtin_check_ref_format_usage[] =
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 828c0363f8a..7df673e3e70 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -15,6 +15,7 @@
 #include "parse-options.h"
 #include "entry.h"
 #include "parallel-checkout.h"
+#include "setup.h"
 
 #define CHECKOUT_ALL 4
 static int nul_term_line;
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 5541e76c337..73b6e581f39 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -23,6 +23,7 @@
 #include "resolve-undo.h"
 #include "revision.h"
 #include "run-command.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "tree.h"
diff --git a/builtin/clean.c b/builtin/clean.c
index fdcf62c5dfe..14c0d555eac 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -14,6 +14,7 @@
 #include "dir.h"
 #include "gettext.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "string-list.h"
 #include "quote.h"
 #include "column.h"
diff --git a/builtin/clone.c b/builtin/clone.c
index 15dc15408ed..34f46965b95 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -33,6 +33,7 @@
 #include "branch.h"
 #include "remote.h"
 #include "run-command.h"
+#include "setup.h"
 #include "connected.h"
 #include "packfile.h"
 #include "list-objects-filter-options.h"
diff --git a/builtin/config.c b/builtin/config.c
index cf994a216c0..fe79fb60c43 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -9,6 +9,7 @@
 #include "parse-options.h"
 #include "urlmatch.h"
 #include "quote.h"
+#include "setup.h"
 #include "worktree.h"
 #include "wrapper.h"
 
diff --git a/builtin/describe.c b/builtin/describe.c
index 27c6670e934..43b62348bc7 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -15,6 +15,7 @@
 #include "revision.h"
 #include "diff.h"
 #include "hashmap.h"
+#include "setup.h"
 #include "strvec.h"
 #include "run-command.h"
 #include "object-store.h"
diff --git a/builtin/diff-index.c b/builtin/diff-index.c
index 35dc9b23eef..b9a19bb7d38 100644
--- a/builtin/diff-index.c
+++ b/builtin/diff-index.c
@@ -5,6 +5,7 @@
 #include "commit.h"
 #include "revision.h"
 #include "builtin.h"
+#include "setup.h"
 #include "submodule.h"
 
 static const char diff_cache_usage[] =
diff --git a/builtin/diff.c b/builtin/diff.c
index 20bdb6e6cec..3945683bfe4 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -19,6 +19,7 @@
 #include "revision.h"
 #include "log-tree.h"
 #include "builtin.h"
+#include "setup.h"
 #include "submodule.h"
 #include "oid-array.h"
 
diff --git a/builtin/difftool.c b/builtin/difftool.c
index 3613de6389f..176437d6da3 100644
--- a/builtin/difftool.c
+++ b/builtin/difftool.c
@@ -28,6 +28,7 @@
 #include "object-store.h"
 #include "dir.h"
 #include "entry.h"
+#include "setup.h"
 #include "wrapper.h"
 
 static int trust_exit_code;
diff --git a/builtin/gc.c b/builtin/gc.c
index 525c5de5b27..a85f9e3ed3d 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -36,6 +36,7 @@
 #include "exec-cmd.h"
 #include "gettext.h"
 #include "hook.h"
+#include "setup.h"
 #include "wrapper.h"
 
 #define FAILED_RUN "failed to run %s"
diff --git a/builtin/grep.c b/builtin/grep.c
index 3c9c6b38031..b8ebf014f40 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -23,6 +23,7 @@
 #include "quote.h"
 #include "dir.h"
 #include "pathspec.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "object-store.h"
diff --git a/builtin/hash-object.c b/builtin/hash-object.c
index 7651a7a5f56..a2e160db026 100644
--- a/builtin/hash-object.c
+++ b/builtin/hash-object.c
@@ -14,6 +14,7 @@
 #include "quote.h"
 #include "parse-options.h"
 #include "exec-cmd.h"
+#include "setup.h"
 
 /*
  * This is to create corrupt objects for debugging and as such it
diff --git a/builtin/help.c b/builtin/help.c
index 3fde5c4fd35..87333a02ec4 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -11,6 +11,7 @@
 #include "config-list.h"
 #include "help.h"
 #include "alias.h"
+#include "setup.h"
 
 #ifndef DEFAULT_HELP_FORMAT
 #define DEFAULT_HELP_FORMAT "man"
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index fdce8f88724..823dc5aefb5 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -20,6 +20,7 @@
 #include "object-store.h"
 #include "replace-object.h"
 #include "promisor-remote.h"
+#include "setup.h"
 #include "wrapper.h"
 
 static const char index_pack_usage[] =
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 2ebc9023f56..ba6e0b20fa5 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -12,6 +12,7 @@
 #include "builtin.h"
 #include "exec-cmd.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "worktree.h"
 #include "wrapper.h"
 
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 09deb752ab3..4a8de95ddc4 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -20,6 +20,7 @@
 #include "string-list.h"
 #include "pathspec.h"
 #include "run-command.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 
diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index c0096ee0810..781818d08f5 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "config.h"
 #include "gettext.h"
+#include "setup.h"
 #include "xdiff/xdiff.h"
 #include "xdiff-interface.h"
 #include "parse-options.h"
diff --git a/builtin/mv.c b/builtin/mv.c
index c2dd42efbf2..b7c5ffbd8c7 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -16,6 +16,7 @@
 #include "cache-tree.h"
 #include "string-list.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "submodule.h"
 #include "entry.h"
 
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index ec66008d07e..5f24453dcd7 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c
@@ -19,6 +19,7 @@
 #include "builtin.h"
 #include "parse-options.h"
 #include "resolve-undo.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 
diff --git a/builtin/reset.c b/builtin/reset.c
index b5dfce1159e..af2afc2c982 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -26,6 +26,7 @@
 #include "parse-options.h"
 #include "unpack-trees.h"
 #include "cache-tree.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "dir.h"
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index bba49d56b9f..3a5a2ee5b2d 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -18,6 +18,7 @@
 #include "parse-options.h"
 #include "diff.h"
 #include "revision.h"
+#include "setup.h"
 #include "split-index.h"
 #include "submodule.h"
 #include "commit-reach.h"
diff --git a/builtin/rm.c b/builtin/rm.c
index 5982c3d8122..97775e4c4d0 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -15,6 +15,7 @@
 #include "tree-walk.h"
 #include "parse-options.h"
 #include "string-list.h"
+#include "setup.h"
 #include "submodule.h"
 #include "pathspec.h"
 
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 31f81c25ea2..59d9c440fb5 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -9,6 +9,7 @@
 #include "revision.h"
 #include "utf8.h"
 #include "mailmap.h"
+#include "setup.h"
 #include "shortlog.h"
 #include "parse-options.h"
 #include "trailer.h"
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index f6a120c7c45..512df0f8f54 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -16,6 +16,7 @@
 #include "unpack-trees.h"
 #include "wt-status.h"
 #include "quote.h"
+#include "setup.h"
 #include "sparse-index.h"
 #include "worktree.h"
 
diff --git a/builtin/stash.c b/builtin/stash.c
index 94f81d75d03..30d547fff1f 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -18,6 +18,7 @@
 #include "entry.h"
 #include "rerere.h"
 #include "revision.h"
+#include "setup.h"
 #include "log-tree.h"
 #include "diffcore.h"
 #include "exec-cmd.h"
diff --git a/builtin/stripspace.c b/builtin/stripspace.c
index d8e61459333..53930458ffa 100644
--- a/builtin/stripspace.c
+++ b/builtin/stripspace.c
@@ -3,6 +3,7 @@
 #include "config.h"
 #include "gettext.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "strbuf.h"
 
 static void comment_lines(struct strbuf *buf)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2bf2a1a8be5..3cb4a3ce217 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -12,6 +12,7 @@
 #include "quote.h"
 #include "pathspec.h"
 #include "dir.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "string-list.h"
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 4642afaeb77..f97f8d4c9d5 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -20,6 +20,7 @@
 #include "parse-options.h"
 #include "pathspec.h"
 #include "dir.h"
+#include "setup.h"
 #include "split-index.h"
 #include "fsmonitor.h"
 
diff --git a/cache.h b/cache.h
index 720c88f9fd6..bffedd240e7 100644
--- a/cache.h
+++ b/cache.h
@@ -452,67 +452,6 @@ static inline enum object_type object_type(unsigned int mode)
 		OBJ_BLOB;
 }
 
-int is_inside_git_dir(void);
-int is_inside_work_tree(void);
-int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
-int get_common_dir(struct strbuf *sb, const char *gitdir);
-
-/*
- * Return true if the given path is a git directory; note that this _just_
- * looks at the directory itself. If you want to know whether "foo/.git"
- * is a repository, you must feed that path, not just "foo".
- */
-int is_git_directory(const char *path);
-
-/*
- * Return 1 if the given path is the root of a git repository or
- * submodule, else 0. Will not return 1 for bare repositories with the
- * exception of creating a bare repository in "foo/.git" and calling
- * is_git_repository("foo").
- *
- * If we run into read errors, we err on the side of saying "yes, it is",
- * as we usually consider sub-repos precious, and would prefer to err on the
- * side of not disrupting or deleting them.
- */
-int is_nonbare_repository_dir(struct strbuf *path);
-
-#define READ_GITFILE_ERR_STAT_FAILED 1
-#define READ_GITFILE_ERR_NOT_A_FILE 2
-#define READ_GITFILE_ERR_OPEN_FAILED 3
-#define READ_GITFILE_ERR_READ_FAILED 4
-#define READ_GITFILE_ERR_INVALID_FORMAT 5
-#define READ_GITFILE_ERR_NO_PATH 6
-#define READ_GITFILE_ERR_NOT_A_REPO 7
-#define READ_GITFILE_ERR_TOO_LARGE 8
-void read_gitfile_error_die(int error_code, const char *path, const char *dir);
-const char *read_gitfile_gently(const char *path, int *return_error_code);
-#define read_gitfile(path) read_gitfile_gently((path), NULL)
-const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
-#define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
-
-void setup_work_tree(void);
-/*
- * Find the commondir and gitdir of the repository that contains the current
- * working directory, without changing the working directory or other global
- * state. The result is appended to commondir and gitdir.  If the discovered
- * gitdir does not correspond to a worktree, then 'commondir' and 'gitdir' will
- * both have the same result appended to the buffer.  The return value is
- * either 0 upon success and non-zero if no repository was found.
- */
-int discover_git_directory(struct strbuf *commondir,
-			   struct strbuf *gitdir);
-const char *setup_git_directory_gently(int *);
-const char *setup_git_directory(void);
-char *prefix_path(const char *prefix, int len, const char *path);
-char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
-
-int check_filename(const char *prefix, const char *name);
-void verify_filename(const char *prefix,
-		     const char *name,
-		     int diagnose_misspelt_rev);
-void verify_non_filename(const char *prefix, const char *name);
-int path_inside_repo(const char *prefix, const char *path);
-
 #define INIT_DB_QUIET 0x0001
 #define INIT_DB_EXIST_OK 0x0002
 
@@ -521,9 +460,6 @@ int init_db(const char *git_dir, const char *real_git_dir,
 	    const char *initial_branch, unsigned int flags);
 void initialize_repository_version(int hash_algo, int reinit);
 
-void sanitize_stdfds(void);
-int daemonize(void);
-
 /* Initialize and use the cache information */
 struct lock_file;
 void preload_index(struct index_state *index,
@@ -807,79 +743,6 @@ enum fsync_method {
 
 extern enum fsync_method fsync_method;
 
-/*
- * GIT_REPO_VERSION is the version we write by default. The
- * _READ variant is the highest number we know how to
- * handle.
- */
-#define GIT_REPO_VERSION 0
-#define GIT_REPO_VERSION_READ 1
-
-/*
- * You _have_ to initialize a `struct repository_format` using
- * `= REPOSITORY_FORMAT_INIT` before calling `read_repository_format()`.
- */
-struct repository_format {
-	int version;
-	int precious_objects;
-	char *partial_clone; /* value of extensions.partialclone */
-	int worktree_config;
-	int is_bare;
-	int hash_algo;
-	int sparse_index;
-	char *work_tree;
-	struct string_list unknown_extensions;
-	struct string_list v1_only_extensions;
-};
-
-/*
- * Always use this to initialize a `struct repository_format`
- * to a well-defined, default state before calling
- * `read_repository()`.
- */
-#define REPOSITORY_FORMAT_INIT \
-{ \
-	.version = -1, \
-	.is_bare = -1, \
-	.hash_algo = GIT_HASH_SHA1, \
-	.unknown_extensions = STRING_LIST_INIT_DUP, \
-	.v1_only_extensions = STRING_LIST_INIT_DUP, \
-}
-
-/*
- * Read the repository format characteristics from the config file "path" into
- * "format" struct. Returns the numeric version. On error, or if no version is
- * found in the configuration, -1 is returned, format->version is set to -1,
- * and all other fields in the struct are set to the default configuration
- * (REPOSITORY_FORMAT_INIT). Always initialize the struct using
- * REPOSITORY_FORMAT_INIT before calling this function.
- */
-int read_repository_format(struct repository_format *format, const char *path);
-
-/*
- * Free the memory held onto by `format`, but not the struct itself.
- * (No need to use this after `read_repository_format()` fails.)
- */
-void clear_repository_format(struct repository_format *format);
-
-/*
- * Verify that the repository described by repository_format is something we
- * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
- * any errors encountered.
- */
-int verify_repository_format(const struct repository_format *format,
-			     struct strbuf *err);
-
-/*
- * Check the repository format version in the path found in get_git_dir(),
- * and die if it is a version we don't understand. Generally one would
- * set_git_dir() before calling this, and use it only for "are we in a valid
- * repo?".
- *
- * If successful and fmt is not NULL, fill fmt with data.
- */
-void check_repository_format(struct repository_format *fmt);
-
 #define MTIME_CHANGED	0x0001
 #define CTIME_CHANGED	0x0002
 #define OWNER_CHANGED	0x0004
@@ -908,23 +771,6 @@ const char *repo_find_unique_abbrev(struct repository *r, const struct object_id
 int repo_find_unique_abbrev_r(struct repository *r, char *hex, const struct object_id *oid, int len);
 #define find_unique_abbrev_r(hex, oid, len) repo_find_unique_abbrev_r(the_repository, hex, oid, len)
 
-/*
- * NOTE NOTE NOTE!!
- *
- * PERM_UMASK, OLD_PERM_GROUP and OLD_PERM_EVERYBODY enumerations must
- * not be changed. Old repositories have core.sharedrepository written in
- * numeric format, and therefore these values are preserved for compatibility
- * reasons.
- */
-enum sharedrepo {
-	PERM_UMASK          = 0,
-	OLD_PERM_GROUP      = 1,
-	OLD_PERM_EVERYBODY  = 2,
-	PERM_GROUP          = 0660,
-	PERM_EVERYBODY      = 0664
-};
-int git_config_perm(const char *var, const char *value);
-
 /*
  * Create the directory containing the named path, using care to be
  * somewhat safe against races. Return one of the scld_error values to
@@ -1283,15 +1129,6 @@ int ws_blank_line(const char *line, int len);
 void overlay_tree_on_index(struct index_state *istate,
 			   const char *tree_name, const char *prefix);
 
-/* setup.c */
-struct startup_info {
-	int have_repository;
-	const char *prefix;
-	const char *original_cwd;
-};
-extern struct startup_info *startup_info;
-extern const char *tmp_original_cwd;
-
 /* merge.c */
 struct commit_list;
 int try_merge_command(struct repository *r,
diff --git a/commit.c b/commit.c
index f88fc5e1a2c..3868f047f1b 100644
--- a/commit.c
+++ b/commit.c
@@ -23,6 +23,7 @@
 #include "refs.h"
 #include "commit-reach.h"
 #include "run-command.h"
+#include "setup.h"
 #include "shallow.h"
 #include "hook.h"
 
diff --git a/common-main.c b/common-main.c
index 184d1534d2d..b83cb5cf066 100644
--- a/common-main.c
+++ b/common-main.c
@@ -2,6 +2,7 @@
 #include "exec-cmd.h"
 #include "gettext.h"
 #include "attr.h"
+#include "setup.h"
 
 /*
  * Many parts of Git have subprograms communicate via pipe, expect the
diff --git a/config.c b/config.c
index 5b1a5d52052..03a4fcaba5b 100644
--- a/config.c
+++ b/config.c
@@ -27,6 +27,7 @@
 #include "color.h"
 #include "replace-object.h"
 #include "refs.h"
+#include "setup.h"
 #include "worktree.h"
 #include "wrapper.h"
 
diff --git a/daemon.c b/daemon.c
index b56a8f9717d..db8a31a6ea2 100644
--- a/daemon.c
+++ b/daemon.c
@@ -5,6 +5,7 @@
 #include "environment.h"
 #include "pkt-line.h"
 #include "run-command.h"
+#include "setup.h"
 #include "strbuf.h"
 #include "string-list.h"
 #include "wrapper.h"
diff --git a/diff.c b/diff.c
index dcf1a940942..b858e59c5ae 100644
--- a/diff.c
+++ b/diff.c
@@ -33,6 +33,7 @@
 #include "help.h"
 #include "promisor-remote.h"
 #include "dir.h"
+#include "setup.h"
 #include "strmap.h"
 #include "wrapper.h"
 
diff --git a/dir.c b/dir.c
index 06f8aa3c01b..4cc2b1ead47 100644
--- a/dir.c
+++ b/dir.c
@@ -21,6 +21,7 @@
 #include "varint.h"
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "wrapper.h"
 
diff --git a/environment.c b/environment.c
index bf02f3cf487..649d16ac27c 100644
--- a/environment.c
+++ b/environment.c
@@ -22,6 +22,7 @@
 #include "replace-object.h"
 #include "tmp-objdir.h"
 #include "chdir-notify.h"
+#include "setup.h"
 #include "shallow.h"
 #include "wrapper.h"
 
diff --git a/git.c b/git.c
index b24c105e83f..77f920a6f6f 100644
--- a/git.c
+++ b/git.c
@@ -7,6 +7,7 @@
 #include "run-command.h"
 #include "alias.h"
 #include "replace-object.h"
+#include "setup.h"
 #include "shallow.h"
 
 #define RUN_SETUP		(1<<0)
diff --git a/http-fetch.c b/http-fetch.c
index 454933351b2..c874d3402dd 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -5,6 +5,7 @@
 #include "hex.h"
 #include "http.h"
 #include "walker.h"
+#include "setup.h"
 #include "strvec.h"
 #include "urlmatch.h"
 #include "trace2.h"
diff --git a/http-push.c b/http-push.c
index 40373bc4863..e73864b51f5 100644
--- a/http-push.c
+++ b/http-push.c
@@ -12,6 +12,7 @@
 #include "exec-cmd.h"
 #include "remote.h"
 #include "list-objects.h"
+#include "setup.h"
 #include "sigchain.h"
 #include "strvec.h"
 #include "packfile.h"
diff --git a/imap-send.c b/imap-send.c
index aa5b2f252d2..a62424e90a4 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -28,6 +28,7 @@
 #include "gettext.h"
 #include "run-command.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "wrapper.h"
 #if defined(NO_OPENSSL) && !defined(HAVE_OPENSSL_CSPRNG)
 typedef void *SSL;
diff --git a/line-log.c b/line-log.c
index 6e7fc4b2e0b..84c8093c517 100644
--- a/line-log.c
+++ b/line-log.c
@@ -16,6 +16,7 @@
 #include "graph.h"
 #include "userdiff.h"
 #include "line-log.h"
+#include "setup.h"
 #include "strvec.h"
 #include "bloom.h"
 
diff --git a/mailmap.c b/mailmap.c
index 2c6e9b238dd..c24a16eaf48 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -3,6 +3,7 @@
 #include "string-list.h"
 #include "mailmap.h"
 #include "object-store.h"
+#include "setup.h"
 
 #define DEBUG_MAILMAP 0
 #if DEBUG_MAILMAP
diff --git a/object-file.c b/object-file.c
index 3da6cd68861..05fff230f73 100644
--- a/object-file.c
+++ b/object-file.c
@@ -37,6 +37,7 @@
 #include "packfile.h"
 #include "object-store.h"
 #include "promisor-remote.h"
+#include "setup.h"
 #include "submodule.h"
 #include "fsck.h"
 #include "wrapper.h"
diff --git a/object-name.c b/object-name.c
index 3b0ce8ef05a..ce973e01505 100644
--- a/object-name.c
+++ b/object-name.c
@@ -15,6 +15,7 @@
 #include "packfile.h"
 #include "object-store.h"
 #include "repository.h"
+#include "setup.h"
 #include "submodule.h"
 #include "midx.h"
 #include "commit-reach.h"
diff --git a/path.c b/path.c
index 5d5a15c13d6..a1702434979 100644
--- a/path.c
+++ b/path.c
@@ -11,6 +11,7 @@
 #include "string-list.h"
 #include "dir.h"
 #include "worktree.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "path.h"
 #include "packfile.h"
diff --git a/pathspec.c b/pathspec.c
index 5fb7b5f26c9..6972d515f0c 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -6,6 +6,7 @@
 #include "gettext.h"
 #include "pathspec.h"
 #include "attr.h"
+#include "setup.h"
 #include "strvec.h"
 #include "quote.h"
 
diff --git a/refs.c b/refs.c
index 04520e5a6b8..21b317e8153 100644
--- a/refs.c
+++ b/refs.c
@@ -22,6 +22,7 @@
 #include "worktree.h"
 #include "strvec.h"
 #include "repository.h"
+#include "setup.h"
 #include "sigchain.h"
 #include "date.h"
 #include "commit.h"
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 0c3138ede8f..d2b8925ebd0 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -14,6 +14,7 @@
 #include "../object.h"
 #include "../dir.h"
 #include "../chdir-notify.h"
+#include "../setup.h"
 #include "../worktree.h"
 #include "../wrapper.h"
 
diff --git a/remote-curl.c b/remote-curl.c
index eb382a1e35d..260ea200bb0 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -18,6 +18,7 @@
 #include "credential.h"
 #include "oid-array.h"
 #include "send-pack.h"
+#include "setup.h"
 #include "protocol.h"
 #include "quote.h"
 #include "transport.h"
diff --git a/remote.c b/remote.c
index aeca3ff8136..c29e2f52981 100644
--- a/remote.c
+++ b/remote.c
@@ -15,6 +15,7 @@
 #include "revision.h"
 #include "dir.h"
 #include "tag.h"
+#include "setup.h"
 #include "string-list.h"
 #include "strvec.h"
 #include "commit-reach.h"
diff --git a/repository.c b/repository.c
index 4412f633224..f6d9f5db08e 100644
--- a/repository.c
+++ b/repository.c
@@ -11,6 +11,7 @@
 #include "object.h"
 #include "lockfile.h"
 #include "remote.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "sparse-index.h"
 #include "promisor-remote.h"
diff --git a/revision.c b/revision.c
index 53fdeef0787..f98691a3531 100644
--- a/revision.c
+++ b/revision.c
@@ -29,6 +29,7 @@
 #include "bisect.h"
 #include "packfile.h"
 #include "worktree.h"
+#include "setup.h"
 #include "strvec.h"
 #include "commit-reach.h"
 #include "commit-graph.h"
diff --git a/scalar.c b/scalar.c
index fe61a3ebdd7..27635658c01 100644
--- a/scalar.c
+++ b/scalar.c
@@ -15,6 +15,7 @@
 #include "dir.h"
 #include "packfile.h"
 #include "help.h"
+#include "setup.h"
 
 static void setup_enlistment_directory(int argc, const char **argv,
 				       const char * const *usagestr,
diff --git a/setup.c b/setup.c
index cfdc849a78c..6c5b85e96c1 100644
--- a/setup.c
+++ b/setup.c
@@ -5,6 +5,7 @@
 #include "repository.h"
 #include "config.h"
 #include "dir.h"
+#include "setup.h"
 #include "string-list.h"
 #include "chdir-notify.h"
 #include "promisor-remote.h"
diff --git a/setup.h b/setup.h
new file mode 100644
index 00000000000..4c1ca9d0c94
--- /dev/null
+++ b/setup.h
@@ -0,0 +1,168 @@
+#ifndef SETUP_H
+#define SETUP_H
+
+#include "string-list.h"
+
+int is_inside_git_dir(void);
+int is_inside_work_tree(void);
+int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
+int get_common_dir(struct strbuf *sb, const char *gitdir);
+
+/*
+ * Return true if the given path is a git directory; note that this _just_
+ * looks at the directory itself. If you want to know whether "foo/.git"
+ * is a repository, you must feed that path, not just "foo".
+ */
+int is_git_directory(const char *path);
+
+/*
+ * Return 1 if the given path is the root of a git repository or
+ * submodule, else 0. Will not return 1 for bare repositories with the
+ * exception of creating a bare repository in "foo/.git" and calling
+ * is_git_repository("foo").
+ *
+ * If we run into read errors, we err on the side of saying "yes, it is",
+ * as we usually consider sub-repos precious, and would prefer to err on the
+ * side of not disrupting or deleting them.
+ */
+int is_nonbare_repository_dir(struct strbuf *path);
+
+#define READ_GITFILE_ERR_STAT_FAILED 1
+#define READ_GITFILE_ERR_NOT_A_FILE 2
+#define READ_GITFILE_ERR_OPEN_FAILED 3
+#define READ_GITFILE_ERR_READ_FAILED 4
+#define READ_GITFILE_ERR_INVALID_FORMAT 5
+#define READ_GITFILE_ERR_NO_PATH 6
+#define READ_GITFILE_ERR_NOT_A_REPO 7
+#define READ_GITFILE_ERR_TOO_LARGE 8
+void read_gitfile_error_die(int error_code, const char *path, const char *dir);
+const char *read_gitfile_gently(const char *path, int *return_error_code);
+#define read_gitfile(path) read_gitfile_gently((path), NULL)
+const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
+#define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
+
+void setup_work_tree(void);
+/*
+ * Find the commondir and gitdir of the repository that contains the current
+ * working directory, without changing the working directory or other global
+ * state. The result is appended to commondir and gitdir.  If the discovered
+ * gitdir does not correspond to a worktree, then 'commondir' and 'gitdir' will
+ * both have the same result appended to the buffer.  The return value is
+ * either 0 upon success and non-zero if no repository was found.
+ */
+int discover_git_directory(struct strbuf *commondir,
+			   struct strbuf *gitdir);
+const char *setup_git_directory_gently(int *);
+const char *setup_git_directory(void);
+char *prefix_path(const char *prefix, int len, const char *path);
+char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
+
+int check_filename(const char *prefix, const char *name);
+void verify_filename(const char *prefix,
+		     const char *name,
+		     int diagnose_misspelt_rev);
+void verify_non_filename(const char *prefix, const char *name);
+int path_inside_repo(const char *prefix, const char *path);
+
+void sanitize_stdfds(void);
+int daemonize(void);
+
+/*
+ * GIT_REPO_VERSION is the version we write by default. The
+ * _READ variant is the highest number we know how to
+ * handle.
+ */
+#define GIT_REPO_VERSION 0
+#define GIT_REPO_VERSION_READ 1
+
+/*
+ * You _have_ to initialize a `struct repository_format` using
+ * `= REPOSITORY_FORMAT_INIT` before calling `read_repository_format()`.
+ */
+struct repository_format {
+	int version;
+	int precious_objects;
+	char *partial_clone; /* value of extensions.partialclone */
+	int worktree_config;
+	int is_bare;
+	int hash_algo;
+	int sparse_index;
+	char *work_tree;
+	struct string_list unknown_extensions;
+	struct string_list v1_only_extensions;
+};
+
+/*
+ * Always use this to initialize a `struct repository_format`
+ * to a well-defined, default state before calling
+ * `read_repository()`.
+ */
+#define REPOSITORY_FORMAT_INIT \
+{ \
+	.version = -1, \
+	.is_bare = -1, \
+	.hash_algo = GIT_HASH_SHA1, \
+	.unknown_extensions = STRING_LIST_INIT_DUP, \
+	.v1_only_extensions = STRING_LIST_INIT_DUP, \
+}
+
+/*
+ * Read the repository format characteristics from the config file "path" into
+ * "format" struct. Returns the numeric version. On error, or if no version is
+ * found in the configuration, -1 is returned, format->version is set to -1,
+ * and all other fields in the struct are set to the default configuration
+ * (REPOSITORY_FORMAT_INIT). Always initialize the struct using
+ * REPOSITORY_FORMAT_INIT before calling this function.
+ */
+int read_repository_format(struct repository_format *format, const char *path);
+
+/*
+ * Free the memory held onto by `format`, but not the struct itself.
+ * (No need to use this after `read_repository_format()` fails.)
+ */
+void clear_repository_format(struct repository_format *format);
+
+/*
+ * Verify that the repository described by repository_format is something we
+ * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
+ * any errors encountered.
+ */
+int verify_repository_format(const struct repository_format *format,
+			     struct strbuf *err);
+
+/*
+ * Check the repository format version in the path found in get_git_dir(),
+ * and die if it is a version we don't understand. Generally one would
+ * set_git_dir() before calling this, and use it only for "are we in a valid
+ * repo?".
+ *
+ * If successful and fmt is not NULL, fill fmt with data.
+ */
+void check_repository_format(struct repository_format *fmt);
+
+/*
+ * NOTE NOTE NOTE!!
+ *
+ * PERM_UMASK, OLD_PERM_GROUP and OLD_PERM_EVERYBODY enumerations must
+ * not be changed. Old repositories have core.sharedrepository written in
+ * numeric format, and therefore these values are preserved for compatibility
+ * reasons.
+ */
+enum sharedrepo {
+	PERM_UMASK          = 0,
+	OLD_PERM_GROUP      = 1,
+	OLD_PERM_EVERYBODY  = 2,
+	PERM_GROUP          = 0660,
+	PERM_EVERYBODY      = 0664
+};
+int git_config_perm(const char *var, const char *value);
+
+struct startup_info {
+	int have_repository;
+	const char *prefix;
+	const char *original_cwd;
+};
+extern struct startup_info *startup_info;
+extern const char *tmp_original_cwd;
+
+#endif /* SETUP_H */
diff --git a/submodule.c b/submodule.c
index acf030b95e4..75e0d45cbcb 100644
--- a/submodule.c
+++ b/submodule.c
@@ -26,6 +26,7 @@
 #include "parse-options.h"
 #include "object-store.h"
 #include "commit-reach.h"
+#include "setup.h"
 #include "shallow.h"
 
 static int config_update_recurse_submodules = RECURSE_SUBMODULES_OFF;
diff --git a/symlinks.c b/symlinks.c
index c35c8d4408d..27ecc93693b 100644
--- a/symlinks.c
+++ b/symlinks.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "gettext.h"
+#include "setup.h"
 
 static int threaded_check_leading_path(struct cache_def *cache, const char *name,
 				       int len, int warn_on_lstat_err);
diff --git a/t/helper/test-advise.c b/t/helper/test-advise.c
index cb881139f73..4e6ed30afa1 100644
--- a/t/helper/test-advise.c
+++ b/t/helper/test-advise.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "advice.h"
 #include "config.h"
+#include "setup.h"
 
 int cmd__advise_if_enabled(int argc, const char **argv)
 {
diff --git a/t/helper/test-bitmap.c b/t/helper/test-bitmap.c
index 5bb489882da..af43ee1cb5e 100644
--- a/t/helper/test-bitmap.c
+++ b/t/helper/test-bitmap.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "git-compat-util.h"
 #include "pack-bitmap.h"
+#include "setup.h"
 
 static int bitmap_list_commits(void)
 {
diff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c
index 127f134a2a6..e5754b8da62 100644
--- a/t/helper/test-bloom.c
+++ b/t/helper/test-bloom.c
@@ -3,6 +3,7 @@
 #include "hex.h"
 #include "test-tool.h"
 #include "commit.h"
+#include "setup.h"
 
 static struct bloom_filter_settings settings = DEFAULT_BLOOM_FILTER_SETTINGS;
 
diff --git a/t/helper/test-cache-tree.c b/t/helper/test-cache-tree.c
index 8b7a8fce1ee..cdaf5046f5a 100644
--- a/t/helper/test-cache-tree.c
+++ b/t/helper/test-cache-tree.c
@@ -6,6 +6,7 @@
 #include "tree.h"
 #include "cache-tree.h"
 #include "parse-options.h"
+#include "setup.h"
 
 static char const * const test_cache_tree_usage[] = {
 	N_("test-tool cache-tree <options> (control|prime|update)"),
diff --git a/t/helper/test-config.c b/t/helper/test-config.c
index 4ba9eb65606..5877188f3ad 100644
--- a/t/helper/test-config.c
+++ b/t/helper/test-config.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "config.h"
+#include "setup.h"
 #include "string-list.h"
 
 /*
diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c
index 92dfc1aa8c4..715aabfbae7 100644
--- a/t/helper/test-dump-cache-tree.c
+++ b/t/helper/test-dump-cache-tree.c
@@ -4,7 +4,7 @@
 #include "hex.h"
 #include "tree.h"
 #include "cache-tree.h"
-
+#include "setup.h"
 
 static void dump_one(struct cache_tree *it, const char *pfx, const char *x)
 {
diff --git a/t/helper/test-dump-fsmonitor.c b/t/helper/test-dump-fsmonitor.c
index 975f0ac8905..7e9de296db3 100644
--- a/t/helper/test-dump-fsmonitor.c
+++ b/t/helper/test-dump-fsmonitor.c
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "setup.h"
 
 int cmd__dump_fsmonitor(int ac, const char **av)
 {
diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c
index 813d0a38fae..289a01c10ac 100644
--- a/t/helper/test-dump-split-index.c
+++ b/t/helper/test-dump-split-index.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "hex.h"
+#include "setup.h"
 #include "split-index.h"
 #include "ewah/ewok.h"
 
diff --git a/t/helper/test-dump-untracked-cache.c b/t/helper/test-dump-untracked-cache.c
index af953fabe87..415f55f31da 100644
--- a/t/helper/test-dump-untracked-cache.c
+++ b/t/helper/test-dump-untracked-cache.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "dir.h"
 #include "hex.h"
+#include "setup.h"
 
 static int compare_untracked(const void *a_, const void *b_)
 {
diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c
index 627a6bdc3d0..e402c35a702 100644
--- a/t/helper/test-fast-rebase.c
+++ b/t/helper/test-fast-rebase.c
@@ -23,6 +23,7 @@
 #include "refs.h"
 #include "revision.h"
 #include "sequencer.h"
+#include "setup.h"
 #include "strvec.h"
 #include "tree.h"
 
diff --git a/t/helper/test-fsmonitor-client.c b/t/helper/test-fsmonitor-client.c
index c43fc976b82..a37236cd0a6 100644
--- a/t/helper/test-fsmonitor-client.c
+++ b/t/helper/test-fsmonitor-client.c
@@ -7,6 +7,7 @@
 #include "cache.h"
 #include "parse-options.h"
 #include "fsmonitor-ipc.h"
+#include "setup.h"
 #include "thread-utils.h"
 #include "trace2.h"
 #include "wrapper.h"
diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c
index 2b678a45793..06ce3a47ccf 100644
--- a/t/helper/test-lazy-init-name-hash.c
+++ b/t/helper/test-lazy-init-name-hash.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "environment.h"
 #include "parse-options.h"
+#include "setup.h"
 
 static int single;
 static int multi;
diff --git a/t/helper/test-match-trees.c b/t/helper/test-match-trees.c
index 04bc2563f3e..64705734dfe 100644
--- a/t/helper/test-match-trees.c
+++ b/t/helper/test-match-trees.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "hex.h"
+#include "setup.h"
 #include "tree.h"
 
 int cmd__match_trees(int ac, const char **av)
diff --git a/t/helper/test-oid-array.c b/t/helper/test-oid-array.c
index 0906993ad59..fd6f73ea03b 100644
--- a/t/helper/test-oid-array.c
+++ b/t/helper/test-oid-array.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "oid-array.h"
+#include "setup.h"
 
 static int print_oid(const struct object_id *oid, void *data)
 {
diff --git a/t/helper/test-oidmap.c b/t/helper/test-oidmap.c
index 883d40efd45..f1b3dbe376b 100644
--- a/t/helper/test-oidmap.c
+++ b/t/helper/test-oidmap.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "oidmap.h"
+#include "setup.h"
 #include "strbuf.h"
 
 /* key is an oid and value is a name (could be a refname for example) */
diff --git a/t/helper/test-oidtree.c b/t/helper/test-oidtree.c
index 0b82431a70f..edcb7e9f448 100644
--- a/t/helper/test-oidtree.c
+++ b/t/helper/test-oidtree.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "oidtree.h"
+#include "setup.h"
 
 static enum cb_next print_oid(const struct object_id *oid, void *data)
 {
diff --git a/t/helper/test-pack-mtimes.c b/t/helper/test-pack-mtimes.c
index 0e53dee9e57..75ca1505a37 100644
--- a/t/helper/test-pack-mtimes.c
+++ b/t/helper/test-pack-mtimes.c
@@ -5,6 +5,7 @@
 #include "object-store.h"
 #include "packfile.h"
 #include "pack-mtimes.h"
+#include "setup.h"
 
 static void dump_mtimes(struct packed_git *p)
 {
diff --git a/t/helper/test-partial-clone.c b/t/helper/test-partial-clone.c
index da17fd37eb1..cce496944ac 100644
--- a/t/helper/test-partial-clone.c
+++ b/t/helper/test-partial-clone.c
@@ -3,6 +3,7 @@
 #include "test-tool.h"
 #include "repository.h"
 #include "object-store.h"
+#include "setup.h"
 
 /*
  * Prints the size of the object corresponding to the given hash in a specific
diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c
index cc266e3ec09..4f5ac2fadce 100644
--- a/t/helper/test-path-utils.c
+++ b/t/helper/test-path-utils.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "abspath.h"
 #include "environment.h"
+#include "setup.h"
 #include "string-list.h"
 #include "utf8.h"
 
diff --git a/t/helper/test-proc-receive.c b/t/helper/test-proc-receive.c
index 7e12d4f9aa2..7c8de7b562a 100644
--- a/t/helper/test-proc-receive.c
+++ b/t/helper/test-proc-receive.c
@@ -3,6 +3,7 @@
 #include "hex.h"
 #include "parse-options.h"
 #include "pkt-line.h"
+#include "setup.h"
 #include "sigchain.h"
 #include "test-tool.h"
 
diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c
index 09c711038ce..91bb2dec1df 100644
--- a/t/helper/test-reach.c
+++ b/t/helper/test-reach.c
@@ -8,6 +8,7 @@
 #include "hex.h"
 #include "parse-options.h"
 #include "ref-filter.h"
+#include "setup.h"
 #include "string-list.h"
 #include "tag.h"
 
diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c
index 84818363d5b..a4c24d0e421 100644
--- a/t/helper/test-read-cache.c
+++ b/t/helper/test-read-cache.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "config.h"
+#include "setup.h"
 #include "wrapper.h"
 
 int cmd__read_cache(int argc, const char **argv)
diff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c
index 98b73bb8f25..e21b0805f3c 100644
--- a/t/helper/test-read-graph.c
+++ b/t/helper/test-read-graph.c
@@ -4,6 +4,7 @@
 #include "repository.h"
 #include "object-store.h"
 #include "bloom.h"
+#include "setup.h"
 
 int cmd__read_graph(int argc, const char **argv)
 {
diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c
index 0a883cdf26b..05c4f2b2625 100644
--- a/t/helper/test-read-midx.c
+++ b/t/helper/test-read-midx.c
@@ -5,6 +5,7 @@
 #include "repository.h"
 #include "object-store.h"
 #include "pack-bitmap.h"
+#include "setup.h"
 
 static int read_midx_file(const char *object_dir, int show_objects)
 {
diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c
index 1745b088b7c..8717b95e84f 100644
--- a/t/helper/test-ref-store.c
+++ b/t/helper/test-ref-store.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "refs.h"
+#include "setup.h"
 #include "worktree.h"
 #include "object-store.h"
 #include "repository.h"
diff --git a/t/helper/test-repository.c b/t/helper/test-repository.c
index c444775eb0f..6774f6245f0 100644
--- a/t/helper/test-repository.c
+++ b/t/helper/test-repository.c
@@ -8,6 +8,7 @@
 #include "object-store.h"
 #include "object.h"
 #include "repository.h"
+#include "setup.h"
 #include "tree.h"
 
 static void test_parse_commit_in_graph(const char *gitdir, const char *worktree,
diff --git a/t/helper/test-revision-walking.c b/t/helper/test-revision-walking.c
index 4a45d5bac2a..f2df4334063 100644
--- a/t/helper/test-revision-walking.c
+++ b/t/helper/test-revision-walking.c
@@ -13,6 +13,7 @@
 #include "commit.h"
 #include "diff.h"
 #include "revision.h"
+#include "setup.h"
 
 static void print_commit(struct commit *commit)
 {
diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c
index a26107ed70a..15b7688774c 100644
--- a/t/helper/test-scrap-cache-tree.c
+++ b/t/helper/test-scrap-cache-tree.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "lockfile.h"
+#include "setup.h"
 #include "tree.h"
 #include "cache-tree.h"
 
diff --git a/t/helper/test-serve-v2.c b/t/helper/test-serve-v2.c
index 497d72058de..7d590ab7227 100644
--- a/t/helper/test-serve-v2.c
+++ b/t/helper/test-serve-v2.c
@@ -3,6 +3,7 @@
 #include "gettext.h"
 #include "parse-options.h"
 #include "serve.h"
+#include "setup.h"
 
 static char const * const serve_usage[] = {
 	N_("test-tool serve-v2 [<options>]"),
diff --git a/t/helper/test-submodule-config.c b/t/helper/test-submodule-config.c
index 22a41c40926..256bfa6e9e1 100644
--- a/t/helper/test-submodule-config.c
+++ b/t/helper/test-submodule-config.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "config.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "submodule.h"
 
diff --git a/t/helper/test-submodule-nested-repo-config.c b/t/helper/test-submodule-nested-repo-config.c
index a3848a8b668..aaffd422d6e 100644
--- a/t/helper/test-submodule-nested-repo-config.c
+++ b/t/helper/test-submodule-nested-repo-config.c
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "setup.h"
 #include "submodule-config.h"
 
 static void die_usage(const char **argv, const char *msg)
diff --git a/t/helper/test-submodule.c b/t/helper/test-submodule.c
index e060cc62268..f18ca46dce4 100644
--- a/t/helper/test-submodule.c
+++ b/t/helper/test-submodule.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "parse-options.h"
 #include "remote.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "submodule.h"
 
diff --git a/t/helper/test-subprocess.c b/t/helper/test-subprocess.c
index ff22f2fa2c5..65a355cc590 100644
--- a/t/helper/test-subprocess.c
+++ b/t/helper/test-subprocess.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "run-command.h"
+#include "setup.h"
 
 int cmd__subprocess(int argc, const char **argv)
 {
diff --git a/t/helper/test-userdiff.c b/t/helper/test-userdiff.c
index a2b56b9cae5..0cd7ee12b7e 100644
--- a/t/helper/test-userdiff.c
+++ b/t/helper/test-userdiff.c
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "setup.h"
 #include "userdiff.h"
 #include "config.h"
 
diff --git a/t/helper/test-write-cache.c b/t/helper/test-write-cache.c
index 7d45cd61e82..a93417ed3a9 100644
--- a/t/helper/test-write-cache.c
+++ b/t/helper/test-write-cache.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "lockfile.h"
+#include "setup.h"
 
 int cmd__write_cache(int argc, const char **argv)
 {
diff --git a/trace.c b/trace.c
index 9c85b71ec6a..81318a2455d 100644
--- a/trace.c
+++ b/trace.c
@@ -25,6 +25,7 @@
 #include "abspath.h"
 #include "environment.h"
 #include "quote.h"
+#include "setup.h"
 #include "wrapper.h"
 
 struct trace_key trace_default_key = { "GIT_TRACE", 0, 0, 0 };
diff --git a/unpack-trees.c b/unpack-trees.c
index 0ff4bbc6b96..a26fda3493f 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -22,6 +22,7 @@
 #include "promisor-remote.h"
 #include "entry.h"
 #include "parallel-checkout.h"
+#include "setup.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
diff --git a/worktree.c b/worktree.c
index c2671b0cdf3..7f0f04eab56 100644
--- a/worktree.c
+++ b/worktree.c
@@ -5,6 +5,7 @@
 #include "gettext.h"
 #include "repository.h"
 #include "refs.h"
+#include "setup.h"
 #include "strbuf.h"
 #include "worktree.h"
 #include "dir.h"
diff --git a/wt-status.c b/wt-status.c
index 106e46480a1..16e0df5736f 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -16,6 +16,7 @@
 #include "refs.h"
 #include "submodule.h"
 #include "column.h"
+#include "setup.h"
 #include "strbuf.h"
 #include "utf8.h"
 #include "worktree.h"
-- 
gitgitgadget


^ permalink raw reply related	[relevance 2%]

* [PATCH 13/16] setup.h: move declarations for setup.c functions from cache.h
  @ 2023-03-19  6:27  2% ` Elijah Newren via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2023-03-19  6:27 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 apply.c                                      |   1 +
 archive.c                                    |   1 +
 attr.c                                       |   1 +
 blame.c                                      |   1 +
 builtin/blame.c                              |   1 +
 builtin/bugreport.c                          |   1 +
 builtin/bundle.c                             |   1 +
 builtin/check-attr.c                         |   1 +
 builtin/check-ref-format.c                   |   1 +
 builtin/checkout-index.c                     |   1 +
 builtin/checkout.c                           |   1 +
 builtin/clean.c                              |   1 +
 builtin/clone.c                              |   1 +
 builtin/config.c                             |   1 +
 builtin/describe.c                           |   1 +
 builtin/diff-index.c                         |   1 +
 builtin/diff.c                               |   1 +
 builtin/difftool.c                           |   1 +
 builtin/gc.c                                 |   1 +
 builtin/grep.c                               |   1 +
 builtin/hash-object.c                        |   1 +
 builtin/help.c                               |   1 +
 builtin/index-pack.c                         |   1 +
 builtin/init-db.c                            |   1 +
 builtin/ls-files.c                           |   1 +
 builtin/merge-file.c                         |   1 +
 builtin/mv.c                                 |   1 +
 builtin/read-tree.c                          |   1 +
 builtin/reset.c                              |   1 +
 builtin/rev-parse.c                          |   1 +
 builtin/rm.c                                 |   1 +
 builtin/shortlog.c                           |   1 +
 builtin/sparse-checkout.c                    |   1 +
 builtin/stash.c                              |   1 +
 builtin/stripspace.c                         |   1 +
 builtin/submodule--helper.c                  |   1 +
 builtin/update-index.c                       |   1 +
 cache.h                                      | 163 ------------------
 commit.c                                     |   1 +
 common-main.c                                |   1 +
 config.c                                     |   1 +
 daemon.c                                     |   1 +
 diff.c                                       |   1 +
 dir.c                                        |   1 +
 environment.c                                |   1 +
 git.c                                        |   1 +
 http-fetch.c                                 |   1 +
 http-push.c                                  |   1 +
 imap-send.c                                  |   1 +
 line-log.c                                   |   1 +
 mailmap.c                                    |   1 +
 object-file.c                                |   1 +
 object-name.c                                |   1 +
 path.c                                       |   1 +
 pathspec.c                                   |   1 +
 refs.c                                       |   1 +
 refs/files-backend.c                         |   1 +
 remote-curl.c                                |   1 +
 remote.c                                     |   1 +
 repository.c                                 |   1 +
 revision.c                                   |   1 +
 scalar.c                                     |   1 +
 setup.c                                      |   1 +
 setup.h                                      | 168 +++++++++++++++++++
 submodule.c                                  |   1 +
 symlinks.c                                   |   1 +
 t/helper/test-advise.c                       |   1 +
 t/helper/test-bitmap.c                       |   1 +
 t/helper/test-bloom.c                        |   1 +
 t/helper/test-cache-tree.c                   |   1 +
 t/helper/test-config.c                       |   1 +
 t/helper/test-dump-cache-tree.c              |   2 +-
 t/helper/test-dump-fsmonitor.c               |   1 +
 t/helper/test-dump-split-index.c             |   1 +
 t/helper/test-dump-untracked-cache.c         |   1 +
 t/helper/test-fast-rebase.c                  |   1 +
 t/helper/test-fsmonitor-client.c             |   1 +
 t/helper/test-lazy-init-name-hash.c          |   1 +
 t/helper/test-match-trees.c                  |   1 +
 t/helper/test-oid-array.c                    |   1 +
 t/helper/test-oidmap.c                       |   1 +
 t/helper/test-oidtree.c                      |   1 +
 t/helper/test-pack-mtimes.c                  |   1 +
 t/helper/test-partial-clone.c                |   1 +
 t/helper/test-path-utils.c                   |   1 +
 t/helper/test-proc-receive.c                 |   1 +
 t/helper/test-reach.c                        |   1 +
 t/helper/test-read-cache.c                   |   1 +
 t/helper/test-read-graph.c                   |   1 +
 t/helper/test-read-midx.c                    |   1 +
 t/helper/test-ref-store.c                    |   1 +
 t/helper/test-repository.c                   |   1 +
 t/helper/test-revision-walking.c             |   1 +
 t/helper/test-scrap-cache-tree.c             |   1 +
 t/helper/test-serve-v2.c                     |   1 +
 t/helper/test-submodule-config.c             |   1 +
 t/helper/test-submodule-nested-repo-config.c |   1 +
 t/helper/test-submodule.c                    |   1 +
 t/helper/test-subprocess.c                   |   1 +
 t/helper/test-userdiff.c                     |   1 +
 t/helper/test-write-cache.c                  |   1 +
 trace.c                                      |   1 +
 unpack-trees.c                               |   1 +
 worktree.c                                   |   1 +
 wt-status.c                                  |   1 +
 105 files changed, 271 insertions(+), 164 deletions(-)
 create mode 100644 setup.h

diff --git a/apply.c b/apply.c
index a7c0bccb15c..caa2e0a3bc6 100644
--- a/apply.c
+++ b/apply.c
@@ -27,6 +27,7 @@
 #include "rerere.h"
 #include "apply.h"
 #include "entry.h"
+#include "setup.h"
 #include "wrapper.h"
 
 struct gitdiff_data {
diff --git a/archive.c b/archive.c
index 7aeaaf368f4..cdce5b783a7 100644
--- a/archive.c
+++ b/archive.c
@@ -5,6 +5,7 @@
 #include "environment.h"
 #include "gettext.h"
 #include "hex.h"
+#include "setup.h"
 #include "refs.h"
 #include "object-store.h"
 #include "commit.h"
diff --git a/attr.c b/attr.c
index 62127196cb1..2d8aeb8b58c 100644
--- a/attr.c
+++ b/attr.c
@@ -18,6 +18,7 @@
 #include "quote.h"
 #include "revision.h"
 #include "object-store.h"
+#include "setup.h"
 #include "thread-utils.h"
 
 const char git_attr__true[] = "(builtin)true";
diff --git a/blame.c b/blame.c
index b7cd849bb6b..838eb128f01 100644
--- a/blame.c
+++ b/blame.c
@@ -7,6 +7,7 @@
 #include "diffcore.h"
 #include "gettext.h"
 #include "hex.h"
+#include "setup.h"
 #include "tag.h"
 #include "blame.h"
 #include "alloc.h"
diff --git a/builtin/blame.c b/builtin/blame.c
index 9ec82edcbde..fb271bae70e 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -31,6 +31,7 @@
 #include "object-store.h"
 #include "blame.h"
 #include "refs.h"
+#include "setup.h"
 #include "tag.h"
 
 static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
diff --git a/builtin/bugreport.c b/builtin/bugreport.c
index 160590e4ef6..52955e1d389 100644
--- a/builtin/bugreport.c
+++ b/builtin/bugreport.c
@@ -8,6 +8,7 @@
 #include "hook.h"
 #include "hook-list.h"
 #include "diagnose.h"
+#include "setup.h"
 #include "wrapper.h"
 
 static void get_system_info(struct strbuf *sys_info)
diff --git a/builtin/bundle.c b/builtin/bundle.c
index 8ea1232dbce..9e4ae604580 100644
--- a/builtin/bundle.c
+++ b/builtin/bundle.c
@@ -1,6 +1,7 @@
 #include "builtin.h"
 #include "abspath.h"
 #include "gettext.h"
+#include "setup.h"
 #include "strvec.h"
 #include "parse-options.h"
 #include "cache.h"
diff --git a/builtin/check-attr.c b/builtin/check-attr.c
index 5870c4683ab..ec37b8164af 100644
--- a/builtin/check-attr.c
+++ b/builtin/check-attr.c
@@ -6,6 +6,7 @@
 #include "environment.h"
 #include "gettext.h"
 #include "quote.h"
+#include "setup.h"
 #include "parse-options.h"
 
 static int all_attrs;
diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c
index fd0e5f86832..b0263467424 100644
--- a/builtin/check-ref-format.c
+++ b/builtin/check-ref-format.c
@@ -5,6 +5,7 @@
 #include "cache.h"
 #include "refs.h"
 #include "builtin.h"
+#include "setup.h"
 #include "strbuf.h"
 
 static const char builtin_check_ref_format_usage[] =
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 828c0363f8a..7df673e3e70 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -15,6 +15,7 @@
 #include "parse-options.h"
 #include "entry.h"
 #include "parallel-checkout.h"
+#include "setup.h"
 
 #define CHECKOUT_ALL 4
 static int nul_term_line;
diff --git a/builtin/checkout.c b/builtin/checkout.c
index e2daad4065c..015011cf84d 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -23,6 +23,7 @@
 #include "resolve-undo.h"
 #include "revision.h"
 #include "run-command.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "tree.h"
diff --git a/builtin/clean.c b/builtin/clean.c
index fdcf62c5dfe..14c0d555eac 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -14,6 +14,7 @@
 #include "dir.h"
 #include "gettext.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "string-list.h"
 #include "quote.h"
 #include "column.h"
diff --git a/builtin/clone.c b/builtin/clone.c
index 15dc15408ed..34f46965b95 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -33,6 +33,7 @@
 #include "branch.h"
 #include "remote.h"
 #include "run-command.h"
+#include "setup.h"
 #include "connected.h"
 #include "packfile.h"
 #include "list-objects-filter-options.h"
diff --git a/builtin/config.c b/builtin/config.c
index cf994a216c0..fe79fb60c43 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -9,6 +9,7 @@
 #include "parse-options.h"
 #include "urlmatch.h"
 #include "quote.h"
+#include "setup.h"
 #include "worktree.h"
 #include "wrapper.h"
 
diff --git a/builtin/describe.c b/builtin/describe.c
index 27c6670e934..43b62348bc7 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -15,6 +15,7 @@
 #include "revision.h"
 #include "diff.h"
 #include "hashmap.h"
+#include "setup.h"
 #include "strvec.h"
 #include "run-command.h"
 #include "object-store.h"
diff --git a/builtin/diff-index.c b/builtin/diff-index.c
index 35dc9b23eef..b9a19bb7d38 100644
--- a/builtin/diff-index.c
+++ b/builtin/diff-index.c
@@ -5,6 +5,7 @@
 #include "commit.h"
 #include "revision.h"
 #include "builtin.h"
+#include "setup.h"
 #include "submodule.h"
 
 static const char diff_cache_usage[] =
diff --git a/builtin/diff.c b/builtin/diff.c
index 20bdb6e6cec..3945683bfe4 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -19,6 +19,7 @@
 #include "revision.h"
 #include "log-tree.h"
 #include "builtin.h"
+#include "setup.h"
 #include "submodule.h"
 #include "oid-array.h"
 
diff --git a/builtin/difftool.c b/builtin/difftool.c
index 3613de6389f..176437d6da3 100644
--- a/builtin/difftool.c
+++ b/builtin/difftool.c
@@ -28,6 +28,7 @@
 #include "object-store.h"
 #include "dir.h"
 #include "entry.h"
+#include "setup.h"
 #include "wrapper.h"
 
 static int trust_exit_code;
diff --git a/builtin/gc.c b/builtin/gc.c
index 525c5de5b27..a85f9e3ed3d 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -36,6 +36,7 @@
 #include "exec-cmd.h"
 #include "gettext.h"
 #include "hook.h"
+#include "setup.h"
 #include "wrapper.h"
 
 #define FAILED_RUN "failed to run %s"
diff --git a/builtin/grep.c b/builtin/grep.c
index 3c9c6b38031..b8ebf014f40 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -23,6 +23,7 @@
 #include "quote.h"
 #include "dir.h"
 #include "pathspec.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "object-store.h"
diff --git a/builtin/hash-object.c b/builtin/hash-object.c
index 7651a7a5f56..a2e160db026 100644
--- a/builtin/hash-object.c
+++ b/builtin/hash-object.c
@@ -14,6 +14,7 @@
 #include "quote.h"
 #include "parse-options.h"
 #include "exec-cmd.h"
+#include "setup.h"
 
 /*
  * This is to create corrupt objects for debugging and as such it
diff --git a/builtin/help.c b/builtin/help.c
index 3fde5c4fd35..87333a02ec4 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -11,6 +11,7 @@
 #include "config-list.h"
 #include "help.h"
 #include "alias.h"
+#include "setup.h"
 
 #ifndef DEFAULT_HELP_FORMAT
 #define DEFAULT_HELP_FORMAT "man"
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index fdce8f88724..823dc5aefb5 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -20,6 +20,7 @@
 #include "object-store.h"
 #include "replace-object.h"
 #include "promisor-remote.h"
+#include "setup.h"
 #include "wrapper.h"
 
 static const char index_pack_usage[] =
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 2ebc9023f56..ba6e0b20fa5 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -12,6 +12,7 @@
 #include "builtin.h"
 #include "exec-cmd.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "worktree.h"
 #include "wrapper.h"
 
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 09deb752ab3..4a8de95ddc4 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -20,6 +20,7 @@
 #include "string-list.h"
 #include "pathspec.h"
 #include "run-command.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 
diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index c0096ee0810..781818d08f5 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "config.h"
 #include "gettext.h"
+#include "setup.h"
 #include "xdiff/xdiff.h"
 #include "xdiff-interface.h"
 #include "parse-options.h"
diff --git a/builtin/mv.c b/builtin/mv.c
index c2dd42efbf2..b7c5ffbd8c7 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -16,6 +16,7 @@
 #include "cache-tree.h"
 #include "string-list.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "submodule.h"
 #include "entry.h"
 
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index ec66008d07e..5f24453dcd7 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c
@@ -19,6 +19,7 @@
 #include "builtin.h"
 #include "parse-options.h"
 #include "resolve-undo.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 
diff --git a/builtin/reset.c b/builtin/reset.c
index 0b62c9651e6..02891e35a84 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -26,6 +26,7 @@
 #include "parse-options.h"
 #include "unpack-trees.h"
 #include "cache-tree.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "dir.h"
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index bba49d56b9f..3a5a2ee5b2d 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -18,6 +18,7 @@
 #include "parse-options.h"
 #include "diff.h"
 #include "revision.h"
+#include "setup.h"
 #include "split-index.h"
 #include "submodule.h"
 #include "commit-reach.h"
diff --git a/builtin/rm.c b/builtin/rm.c
index 5982c3d8122..97775e4c4d0 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -15,6 +15,7 @@
 #include "tree-walk.h"
 #include "parse-options.h"
 #include "string-list.h"
+#include "setup.h"
 #include "submodule.h"
 #include "pathspec.h"
 
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 31f81c25ea2..59d9c440fb5 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -9,6 +9,7 @@
 #include "revision.h"
 #include "utf8.h"
 #include "mailmap.h"
+#include "setup.h"
 #include "shortlog.h"
 #include "parse-options.h"
 #include "trailer.h"
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index f6a120c7c45..512df0f8f54 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -16,6 +16,7 @@
 #include "unpack-trees.h"
 #include "wt-status.h"
 #include "quote.h"
+#include "setup.h"
 #include "sparse-index.h"
 #include "worktree.h"
 
diff --git a/builtin/stash.c b/builtin/stash.c
index 94f81d75d03..30d547fff1f 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -18,6 +18,7 @@
 #include "entry.h"
 #include "rerere.h"
 #include "revision.h"
+#include "setup.h"
 #include "log-tree.h"
 #include "diffcore.h"
 #include "exec-cmd.h"
diff --git a/builtin/stripspace.c b/builtin/stripspace.c
index d8e61459333..53930458ffa 100644
--- a/builtin/stripspace.c
+++ b/builtin/stripspace.c
@@ -3,6 +3,7 @@
 #include "config.h"
 #include "gettext.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "strbuf.h"
 
 static void comment_lines(struct strbuf *buf)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2bf2a1a8be5..3cb4a3ce217 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -12,6 +12,7 @@
 #include "quote.h"
 #include "pathspec.h"
 #include "dir.h"
+#include "setup.h"
 #include "submodule.h"
 #include "submodule-config.h"
 #include "string-list.h"
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 4642afaeb77..f97f8d4c9d5 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -20,6 +20,7 @@
 #include "parse-options.h"
 #include "pathspec.h"
 #include "dir.h"
+#include "setup.h"
 #include "split-index.h"
 #include "fsmonitor.h"
 
diff --git a/cache.h b/cache.h
index 720c88f9fd6..bffedd240e7 100644
--- a/cache.h
+++ b/cache.h
@@ -452,67 +452,6 @@ static inline enum object_type object_type(unsigned int mode)
 		OBJ_BLOB;
 }
 
-int is_inside_git_dir(void);
-int is_inside_work_tree(void);
-int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
-int get_common_dir(struct strbuf *sb, const char *gitdir);
-
-/*
- * Return true if the given path is a git directory; note that this _just_
- * looks at the directory itself. If you want to know whether "foo/.git"
- * is a repository, you must feed that path, not just "foo".
- */
-int is_git_directory(const char *path);
-
-/*
- * Return 1 if the given path is the root of a git repository or
- * submodule, else 0. Will not return 1 for bare repositories with the
- * exception of creating a bare repository in "foo/.git" and calling
- * is_git_repository("foo").
- *
- * If we run into read errors, we err on the side of saying "yes, it is",
- * as we usually consider sub-repos precious, and would prefer to err on the
- * side of not disrupting or deleting them.
- */
-int is_nonbare_repository_dir(struct strbuf *path);
-
-#define READ_GITFILE_ERR_STAT_FAILED 1
-#define READ_GITFILE_ERR_NOT_A_FILE 2
-#define READ_GITFILE_ERR_OPEN_FAILED 3
-#define READ_GITFILE_ERR_READ_FAILED 4
-#define READ_GITFILE_ERR_INVALID_FORMAT 5
-#define READ_GITFILE_ERR_NO_PATH 6
-#define READ_GITFILE_ERR_NOT_A_REPO 7
-#define READ_GITFILE_ERR_TOO_LARGE 8
-void read_gitfile_error_die(int error_code, const char *path, const char *dir);
-const char *read_gitfile_gently(const char *path, int *return_error_code);
-#define read_gitfile(path) read_gitfile_gently((path), NULL)
-const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
-#define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
-
-void setup_work_tree(void);
-/*
- * Find the commondir and gitdir of the repository that contains the current
- * working directory, without changing the working directory or other global
- * state. The result is appended to commondir and gitdir.  If the discovered
- * gitdir does not correspond to a worktree, then 'commondir' and 'gitdir' will
- * both have the same result appended to the buffer.  The return value is
- * either 0 upon success and non-zero if no repository was found.
- */
-int discover_git_directory(struct strbuf *commondir,
-			   struct strbuf *gitdir);
-const char *setup_git_directory_gently(int *);
-const char *setup_git_directory(void);
-char *prefix_path(const char *prefix, int len, const char *path);
-char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
-
-int check_filename(const char *prefix, const char *name);
-void verify_filename(const char *prefix,
-		     const char *name,
-		     int diagnose_misspelt_rev);
-void verify_non_filename(const char *prefix, const char *name);
-int path_inside_repo(const char *prefix, const char *path);
-
 #define INIT_DB_QUIET 0x0001
 #define INIT_DB_EXIST_OK 0x0002
 
@@ -521,9 +460,6 @@ int init_db(const char *git_dir, const char *real_git_dir,
 	    const char *initial_branch, unsigned int flags);
 void initialize_repository_version(int hash_algo, int reinit);
 
-void sanitize_stdfds(void);
-int daemonize(void);
-
 /* Initialize and use the cache information */
 struct lock_file;
 void preload_index(struct index_state *index,
@@ -807,79 +743,6 @@ enum fsync_method {
 
 extern enum fsync_method fsync_method;
 
-/*
- * GIT_REPO_VERSION is the version we write by default. The
- * _READ variant is the highest number we know how to
- * handle.
- */
-#define GIT_REPO_VERSION 0
-#define GIT_REPO_VERSION_READ 1
-
-/*
- * You _have_ to initialize a `struct repository_format` using
- * `= REPOSITORY_FORMAT_INIT` before calling `read_repository_format()`.
- */
-struct repository_format {
-	int version;
-	int precious_objects;
-	char *partial_clone; /* value of extensions.partialclone */
-	int worktree_config;
-	int is_bare;
-	int hash_algo;
-	int sparse_index;
-	char *work_tree;
-	struct string_list unknown_extensions;
-	struct string_list v1_only_extensions;
-};
-
-/*
- * Always use this to initialize a `struct repository_format`
- * to a well-defined, default state before calling
- * `read_repository()`.
- */
-#define REPOSITORY_FORMAT_INIT \
-{ \
-	.version = -1, \
-	.is_bare = -1, \
-	.hash_algo = GIT_HASH_SHA1, \
-	.unknown_extensions = STRING_LIST_INIT_DUP, \
-	.v1_only_extensions = STRING_LIST_INIT_DUP, \
-}
-
-/*
- * Read the repository format characteristics from the config file "path" into
- * "format" struct. Returns the numeric version. On error, or if no version is
- * found in the configuration, -1 is returned, format->version is set to -1,
- * and all other fields in the struct are set to the default configuration
- * (REPOSITORY_FORMAT_INIT). Always initialize the struct using
- * REPOSITORY_FORMAT_INIT before calling this function.
- */
-int read_repository_format(struct repository_format *format, const char *path);
-
-/*
- * Free the memory held onto by `format`, but not the struct itself.
- * (No need to use this after `read_repository_format()` fails.)
- */
-void clear_repository_format(struct repository_format *format);
-
-/*
- * Verify that the repository described by repository_format is something we
- * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
- * any errors encountered.
- */
-int verify_repository_format(const struct repository_format *format,
-			     struct strbuf *err);
-
-/*
- * Check the repository format version in the path found in get_git_dir(),
- * and die if it is a version we don't understand. Generally one would
- * set_git_dir() before calling this, and use it only for "are we in a valid
- * repo?".
- *
- * If successful and fmt is not NULL, fill fmt with data.
- */
-void check_repository_format(struct repository_format *fmt);
-
 #define MTIME_CHANGED	0x0001
 #define CTIME_CHANGED	0x0002
 #define OWNER_CHANGED	0x0004
@@ -908,23 +771,6 @@ const char *repo_find_unique_abbrev(struct repository *r, const struct object_id
 int repo_find_unique_abbrev_r(struct repository *r, char *hex, const struct object_id *oid, int len);
 #define find_unique_abbrev_r(hex, oid, len) repo_find_unique_abbrev_r(the_repository, hex, oid, len)
 
-/*
- * NOTE NOTE NOTE!!
- *
- * PERM_UMASK, OLD_PERM_GROUP and OLD_PERM_EVERYBODY enumerations must
- * not be changed. Old repositories have core.sharedrepository written in
- * numeric format, and therefore these values are preserved for compatibility
- * reasons.
- */
-enum sharedrepo {
-	PERM_UMASK          = 0,
-	OLD_PERM_GROUP      = 1,
-	OLD_PERM_EVERYBODY  = 2,
-	PERM_GROUP          = 0660,
-	PERM_EVERYBODY      = 0664
-};
-int git_config_perm(const char *var, const char *value);
-
 /*
  * Create the directory containing the named path, using care to be
  * somewhat safe against races. Return one of the scld_error values to
@@ -1283,15 +1129,6 @@ int ws_blank_line(const char *line, int len);
 void overlay_tree_on_index(struct index_state *istate,
 			   const char *tree_name, const char *prefix);
 
-/* setup.c */
-struct startup_info {
-	int have_repository;
-	const char *prefix;
-	const char *original_cwd;
-};
-extern struct startup_info *startup_info;
-extern const char *tmp_original_cwd;
-
 /* merge.c */
 struct commit_list;
 int try_merge_command(struct repository *r,
diff --git a/commit.c b/commit.c
index f88fc5e1a2c..3868f047f1b 100644
--- a/commit.c
+++ b/commit.c
@@ -23,6 +23,7 @@
 #include "refs.h"
 #include "commit-reach.h"
 #include "run-command.h"
+#include "setup.h"
 #include "shallow.h"
 #include "hook.h"
 
diff --git a/common-main.c b/common-main.c
index 184d1534d2d..b83cb5cf066 100644
--- a/common-main.c
+++ b/common-main.c
@@ -2,6 +2,7 @@
 #include "exec-cmd.h"
 #include "gettext.h"
 #include "attr.h"
+#include "setup.h"
 
 /*
  * Many parts of Git have subprograms communicate via pipe, expect the
diff --git a/config.c b/config.c
index 5b1a5d52052..03a4fcaba5b 100644
--- a/config.c
+++ b/config.c
@@ -27,6 +27,7 @@
 #include "color.h"
 #include "replace-object.h"
 #include "refs.h"
+#include "setup.h"
 #include "worktree.h"
 #include "wrapper.h"
 
diff --git a/daemon.c b/daemon.c
index b56a8f9717d..db8a31a6ea2 100644
--- a/daemon.c
+++ b/daemon.c
@@ -5,6 +5,7 @@
 #include "environment.h"
 #include "pkt-line.h"
 #include "run-command.h"
+#include "setup.h"
 #include "strbuf.h"
 #include "string-list.h"
 #include "wrapper.h"
diff --git a/diff.c b/diff.c
index dcf1a940942..b858e59c5ae 100644
--- a/diff.c
+++ b/diff.c
@@ -33,6 +33,7 @@
 #include "help.h"
 #include "promisor-remote.h"
 #include "dir.h"
+#include "setup.h"
 #include "strmap.h"
 #include "wrapper.h"
 
diff --git a/dir.c b/dir.c
index 06f8aa3c01b..4cc2b1ead47 100644
--- a/dir.c
+++ b/dir.c
@@ -21,6 +21,7 @@
 #include "varint.h"
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "wrapper.h"
 
diff --git a/environment.c b/environment.c
index bf02f3cf487..649d16ac27c 100644
--- a/environment.c
+++ b/environment.c
@@ -22,6 +22,7 @@
 #include "replace-object.h"
 #include "tmp-objdir.h"
 #include "chdir-notify.h"
+#include "setup.h"
 #include "shallow.h"
 #include "wrapper.h"
 
diff --git a/git.c b/git.c
index b24c105e83f..77f920a6f6f 100644
--- a/git.c
+++ b/git.c
@@ -7,6 +7,7 @@
 #include "run-command.h"
 #include "alias.h"
 #include "replace-object.h"
+#include "setup.h"
 #include "shallow.h"
 
 #define RUN_SETUP		(1<<0)
diff --git a/http-fetch.c b/http-fetch.c
index 454933351b2..c874d3402dd 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -5,6 +5,7 @@
 #include "hex.h"
 #include "http.h"
 #include "walker.h"
+#include "setup.h"
 #include "strvec.h"
 #include "urlmatch.h"
 #include "trace2.h"
diff --git a/http-push.c b/http-push.c
index 40373bc4863..e73864b51f5 100644
--- a/http-push.c
+++ b/http-push.c
@@ -12,6 +12,7 @@
 #include "exec-cmd.h"
 #include "remote.h"
 #include "list-objects.h"
+#include "setup.h"
 #include "sigchain.h"
 #include "strvec.h"
 #include "packfile.h"
diff --git a/imap-send.c b/imap-send.c
index aa5b2f252d2..a62424e90a4 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -28,6 +28,7 @@
 #include "gettext.h"
 #include "run-command.h"
 #include "parse-options.h"
+#include "setup.h"
 #include "wrapper.h"
 #if defined(NO_OPENSSL) && !defined(HAVE_OPENSSL_CSPRNG)
 typedef void *SSL;
diff --git a/line-log.c b/line-log.c
index 6e7fc4b2e0b..84c8093c517 100644
--- a/line-log.c
+++ b/line-log.c
@@ -16,6 +16,7 @@
 #include "graph.h"
 #include "userdiff.h"
 #include "line-log.h"
+#include "setup.h"
 #include "strvec.h"
 #include "bloom.h"
 
diff --git a/mailmap.c b/mailmap.c
index 2c6e9b238dd..c24a16eaf48 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -3,6 +3,7 @@
 #include "string-list.h"
 #include "mailmap.h"
 #include "object-store.h"
+#include "setup.h"
 
 #define DEBUG_MAILMAP 0
 #if DEBUG_MAILMAP
diff --git a/object-file.c b/object-file.c
index 3da6cd68861..05fff230f73 100644
--- a/object-file.c
+++ b/object-file.c
@@ -37,6 +37,7 @@
 #include "packfile.h"
 #include "object-store.h"
 #include "promisor-remote.h"
+#include "setup.h"
 #include "submodule.h"
 #include "fsck.h"
 #include "wrapper.h"
diff --git a/object-name.c b/object-name.c
index 3b0ce8ef05a..ce973e01505 100644
--- a/object-name.c
+++ b/object-name.c
@@ -15,6 +15,7 @@
 #include "packfile.h"
 #include "object-store.h"
 #include "repository.h"
+#include "setup.h"
 #include "submodule.h"
 #include "midx.h"
 #include "commit-reach.h"
diff --git a/path.c b/path.c
index 5d5a15c13d6..a1702434979 100644
--- a/path.c
+++ b/path.c
@@ -11,6 +11,7 @@
 #include "string-list.h"
 #include "dir.h"
 #include "worktree.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "path.h"
 #include "packfile.h"
diff --git a/pathspec.c b/pathspec.c
index 5fb7b5f26c9..6972d515f0c 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -6,6 +6,7 @@
 #include "gettext.h"
 #include "pathspec.h"
 #include "attr.h"
+#include "setup.h"
 #include "strvec.h"
 #include "quote.h"
 
diff --git a/refs.c b/refs.c
index 04520e5a6b8..21b317e8153 100644
--- a/refs.c
+++ b/refs.c
@@ -22,6 +22,7 @@
 #include "worktree.h"
 #include "strvec.h"
 #include "repository.h"
+#include "setup.h"
 #include "sigchain.h"
 #include "date.h"
 #include "commit.h"
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 0c3138ede8f..d2b8925ebd0 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -14,6 +14,7 @@
 #include "../object.h"
 #include "../dir.h"
 #include "../chdir-notify.h"
+#include "../setup.h"
 #include "../worktree.h"
 #include "../wrapper.h"
 
diff --git a/remote-curl.c b/remote-curl.c
index eb382a1e35d..260ea200bb0 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -18,6 +18,7 @@
 #include "credential.h"
 #include "oid-array.h"
 #include "send-pack.h"
+#include "setup.h"
 #include "protocol.h"
 #include "quote.h"
 #include "transport.h"
diff --git a/remote.c b/remote.c
index aeca3ff8136..c29e2f52981 100644
--- a/remote.c
+++ b/remote.c
@@ -15,6 +15,7 @@
 #include "revision.h"
 #include "dir.h"
 #include "tag.h"
+#include "setup.h"
 #include "string-list.h"
 #include "strvec.h"
 #include "commit-reach.h"
diff --git a/repository.c b/repository.c
index 4412f633224..f6d9f5db08e 100644
--- a/repository.c
+++ b/repository.c
@@ -11,6 +11,7 @@
 #include "object.h"
 #include "lockfile.h"
 #include "remote.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "sparse-index.h"
 #include "promisor-remote.h"
diff --git a/revision.c b/revision.c
index 53fdeef0787..f98691a3531 100644
--- a/revision.c
+++ b/revision.c
@@ -29,6 +29,7 @@
 #include "bisect.h"
 #include "packfile.h"
 #include "worktree.h"
+#include "setup.h"
 #include "strvec.h"
 #include "commit-reach.h"
 #include "commit-graph.h"
diff --git a/scalar.c b/scalar.c
index fe61a3ebdd7..27635658c01 100644
--- a/scalar.c
+++ b/scalar.c
@@ -15,6 +15,7 @@
 #include "dir.h"
 #include "packfile.h"
 #include "help.h"
+#include "setup.h"
 
 static void setup_enlistment_directory(int argc, const char **argv,
 				       const char * const *usagestr,
diff --git a/setup.c b/setup.c
index cfdc849a78c..6c5b85e96c1 100644
--- a/setup.c
+++ b/setup.c
@@ -5,6 +5,7 @@
 #include "repository.h"
 #include "config.h"
 #include "dir.h"
+#include "setup.h"
 #include "string-list.h"
 #include "chdir-notify.h"
 #include "promisor-remote.h"
diff --git a/setup.h b/setup.h
new file mode 100644
index 00000000000..4c1ca9d0c94
--- /dev/null
+++ b/setup.h
@@ -0,0 +1,168 @@
+#ifndef SETUP_H
+#define SETUP_H
+
+#include "string-list.h"
+
+int is_inside_git_dir(void);
+int is_inside_work_tree(void);
+int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
+int get_common_dir(struct strbuf *sb, const char *gitdir);
+
+/*
+ * Return true if the given path is a git directory; note that this _just_
+ * looks at the directory itself. If you want to know whether "foo/.git"
+ * is a repository, you must feed that path, not just "foo".
+ */
+int is_git_directory(const char *path);
+
+/*
+ * Return 1 if the given path is the root of a git repository or
+ * submodule, else 0. Will not return 1 for bare repositories with the
+ * exception of creating a bare repository in "foo/.git" and calling
+ * is_git_repository("foo").
+ *
+ * If we run into read errors, we err on the side of saying "yes, it is",
+ * as we usually consider sub-repos precious, and would prefer to err on the
+ * side of not disrupting or deleting them.
+ */
+int is_nonbare_repository_dir(struct strbuf *path);
+
+#define READ_GITFILE_ERR_STAT_FAILED 1
+#define READ_GITFILE_ERR_NOT_A_FILE 2
+#define READ_GITFILE_ERR_OPEN_FAILED 3
+#define READ_GITFILE_ERR_READ_FAILED 4
+#define READ_GITFILE_ERR_INVALID_FORMAT 5
+#define READ_GITFILE_ERR_NO_PATH 6
+#define READ_GITFILE_ERR_NOT_A_REPO 7
+#define READ_GITFILE_ERR_TOO_LARGE 8
+void read_gitfile_error_die(int error_code, const char *path, const char *dir);
+const char *read_gitfile_gently(const char *path, int *return_error_code);
+#define read_gitfile(path) read_gitfile_gently((path), NULL)
+const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
+#define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
+
+void setup_work_tree(void);
+/*
+ * Find the commondir and gitdir of the repository that contains the current
+ * working directory, without changing the working directory or other global
+ * state. The result is appended to commondir and gitdir.  If the discovered
+ * gitdir does not correspond to a worktree, then 'commondir' and 'gitdir' will
+ * both have the same result appended to the buffer.  The return value is
+ * either 0 upon success and non-zero if no repository was found.
+ */
+int discover_git_directory(struct strbuf *commondir,
+			   struct strbuf *gitdir);
+const char *setup_git_directory_gently(int *);
+const char *setup_git_directory(void);
+char *prefix_path(const char *prefix, int len, const char *path);
+char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
+
+int check_filename(const char *prefix, const char *name);
+void verify_filename(const char *prefix,
+		     const char *name,
+		     int diagnose_misspelt_rev);
+void verify_non_filename(const char *prefix, const char *name);
+int path_inside_repo(const char *prefix, const char *path);
+
+void sanitize_stdfds(void);
+int daemonize(void);
+
+/*
+ * GIT_REPO_VERSION is the version we write by default. The
+ * _READ variant is the highest number we know how to
+ * handle.
+ */
+#define GIT_REPO_VERSION 0
+#define GIT_REPO_VERSION_READ 1
+
+/*
+ * You _have_ to initialize a `struct repository_format` using
+ * `= REPOSITORY_FORMAT_INIT` before calling `read_repository_format()`.
+ */
+struct repository_format {
+	int version;
+	int precious_objects;
+	char *partial_clone; /* value of extensions.partialclone */
+	int worktree_config;
+	int is_bare;
+	int hash_algo;
+	int sparse_index;
+	char *work_tree;
+	struct string_list unknown_extensions;
+	struct string_list v1_only_extensions;
+};
+
+/*
+ * Always use this to initialize a `struct repository_format`
+ * to a well-defined, default state before calling
+ * `read_repository()`.
+ */
+#define REPOSITORY_FORMAT_INIT \
+{ \
+	.version = -1, \
+	.is_bare = -1, \
+	.hash_algo = GIT_HASH_SHA1, \
+	.unknown_extensions = STRING_LIST_INIT_DUP, \
+	.v1_only_extensions = STRING_LIST_INIT_DUP, \
+}
+
+/*
+ * Read the repository format characteristics from the config file "path" into
+ * "format" struct. Returns the numeric version. On error, or if no version is
+ * found in the configuration, -1 is returned, format->version is set to -1,
+ * and all other fields in the struct are set to the default configuration
+ * (REPOSITORY_FORMAT_INIT). Always initialize the struct using
+ * REPOSITORY_FORMAT_INIT before calling this function.
+ */
+int read_repository_format(struct repository_format *format, const char *path);
+
+/*
+ * Free the memory held onto by `format`, but not the struct itself.
+ * (No need to use this after `read_repository_format()` fails.)
+ */
+void clear_repository_format(struct repository_format *format);
+
+/*
+ * Verify that the repository described by repository_format is something we
+ * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
+ * any errors encountered.
+ */
+int verify_repository_format(const struct repository_format *format,
+			     struct strbuf *err);
+
+/*
+ * Check the repository format version in the path found in get_git_dir(),
+ * and die if it is a version we don't understand. Generally one would
+ * set_git_dir() before calling this, and use it only for "are we in a valid
+ * repo?".
+ *
+ * If successful and fmt is not NULL, fill fmt with data.
+ */
+void check_repository_format(struct repository_format *fmt);
+
+/*
+ * NOTE NOTE NOTE!!
+ *
+ * PERM_UMASK, OLD_PERM_GROUP and OLD_PERM_EVERYBODY enumerations must
+ * not be changed. Old repositories have core.sharedrepository written in
+ * numeric format, and therefore these values are preserved for compatibility
+ * reasons.
+ */
+enum sharedrepo {
+	PERM_UMASK          = 0,
+	OLD_PERM_GROUP      = 1,
+	OLD_PERM_EVERYBODY  = 2,
+	PERM_GROUP          = 0660,
+	PERM_EVERYBODY      = 0664
+};
+int git_config_perm(const char *var, const char *value);
+
+struct startup_info {
+	int have_repository;
+	const char *prefix;
+	const char *original_cwd;
+};
+extern struct startup_info *startup_info;
+extern const char *tmp_original_cwd;
+
+#endif /* SETUP_H */
diff --git a/submodule.c b/submodule.c
index acf030b95e4..75e0d45cbcb 100644
--- a/submodule.c
+++ b/submodule.c
@@ -26,6 +26,7 @@
 #include "parse-options.h"
 #include "object-store.h"
 #include "commit-reach.h"
+#include "setup.h"
 #include "shallow.h"
 
 static int config_update_recurse_submodules = RECURSE_SUBMODULES_OFF;
diff --git a/symlinks.c b/symlinks.c
index c35c8d4408d..27ecc93693b 100644
--- a/symlinks.c
+++ b/symlinks.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "gettext.h"
+#include "setup.h"
 
 static int threaded_check_leading_path(struct cache_def *cache, const char *name,
 				       int len, int warn_on_lstat_err);
diff --git a/t/helper/test-advise.c b/t/helper/test-advise.c
index cb881139f73..4e6ed30afa1 100644
--- a/t/helper/test-advise.c
+++ b/t/helper/test-advise.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "advice.h"
 #include "config.h"
+#include "setup.h"
 
 int cmd__advise_if_enabled(int argc, const char **argv)
 {
diff --git a/t/helper/test-bitmap.c b/t/helper/test-bitmap.c
index 5bb489882da..af43ee1cb5e 100644
--- a/t/helper/test-bitmap.c
+++ b/t/helper/test-bitmap.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "git-compat-util.h"
 #include "pack-bitmap.h"
+#include "setup.h"
 
 static int bitmap_list_commits(void)
 {
diff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c
index 127f134a2a6..e5754b8da62 100644
--- a/t/helper/test-bloom.c
+++ b/t/helper/test-bloom.c
@@ -3,6 +3,7 @@
 #include "hex.h"
 #include "test-tool.h"
 #include "commit.h"
+#include "setup.h"
 
 static struct bloom_filter_settings settings = DEFAULT_BLOOM_FILTER_SETTINGS;
 
diff --git a/t/helper/test-cache-tree.c b/t/helper/test-cache-tree.c
index 8b7a8fce1ee..cdaf5046f5a 100644
--- a/t/helper/test-cache-tree.c
+++ b/t/helper/test-cache-tree.c
@@ -6,6 +6,7 @@
 #include "tree.h"
 #include "cache-tree.h"
 #include "parse-options.h"
+#include "setup.h"
 
 static char const * const test_cache_tree_usage[] = {
 	N_("test-tool cache-tree <options> (control|prime|update)"),
diff --git a/t/helper/test-config.c b/t/helper/test-config.c
index 4ba9eb65606..5877188f3ad 100644
--- a/t/helper/test-config.c
+++ b/t/helper/test-config.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "config.h"
+#include "setup.h"
 #include "string-list.h"
 
 /*
diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c
index 92dfc1aa8c4..715aabfbae7 100644
--- a/t/helper/test-dump-cache-tree.c
+++ b/t/helper/test-dump-cache-tree.c
@@ -4,7 +4,7 @@
 #include "hex.h"
 #include "tree.h"
 #include "cache-tree.h"
-
+#include "setup.h"
 
 static void dump_one(struct cache_tree *it, const char *pfx, const char *x)
 {
diff --git a/t/helper/test-dump-fsmonitor.c b/t/helper/test-dump-fsmonitor.c
index 975f0ac8905..7e9de296db3 100644
--- a/t/helper/test-dump-fsmonitor.c
+++ b/t/helper/test-dump-fsmonitor.c
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "setup.h"
 
 int cmd__dump_fsmonitor(int ac, const char **av)
 {
diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c
index 813d0a38fae..289a01c10ac 100644
--- a/t/helper/test-dump-split-index.c
+++ b/t/helper/test-dump-split-index.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "hex.h"
+#include "setup.h"
 #include "split-index.h"
 #include "ewah/ewok.h"
 
diff --git a/t/helper/test-dump-untracked-cache.c b/t/helper/test-dump-untracked-cache.c
index af953fabe87..415f55f31da 100644
--- a/t/helper/test-dump-untracked-cache.c
+++ b/t/helper/test-dump-untracked-cache.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "dir.h"
 #include "hex.h"
+#include "setup.h"
 
 static int compare_untracked(const void *a_, const void *b_)
 {
diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c
index 627a6bdc3d0..e402c35a702 100644
--- a/t/helper/test-fast-rebase.c
+++ b/t/helper/test-fast-rebase.c
@@ -23,6 +23,7 @@
 #include "refs.h"
 #include "revision.h"
 #include "sequencer.h"
+#include "setup.h"
 #include "strvec.h"
 #include "tree.h"
 
diff --git a/t/helper/test-fsmonitor-client.c b/t/helper/test-fsmonitor-client.c
index c43fc976b82..a37236cd0a6 100644
--- a/t/helper/test-fsmonitor-client.c
+++ b/t/helper/test-fsmonitor-client.c
@@ -7,6 +7,7 @@
 #include "cache.h"
 #include "parse-options.h"
 #include "fsmonitor-ipc.h"
+#include "setup.h"
 #include "thread-utils.h"
 #include "trace2.h"
 #include "wrapper.h"
diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c
index 2b678a45793..06ce3a47ccf 100644
--- a/t/helper/test-lazy-init-name-hash.c
+++ b/t/helper/test-lazy-init-name-hash.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "environment.h"
 #include "parse-options.h"
+#include "setup.h"
 
 static int single;
 static int multi;
diff --git a/t/helper/test-match-trees.c b/t/helper/test-match-trees.c
index 04bc2563f3e..64705734dfe 100644
--- a/t/helper/test-match-trees.c
+++ b/t/helper/test-match-trees.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "hex.h"
+#include "setup.h"
 #include "tree.h"
 
 int cmd__match_trees(int ac, const char **av)
diff --git a/t/helper/test-oid-array.c b/t/helper/test-oid-array.c
index 0906993ad59..fd6f73ea03b 100644
--- a/t/helper/test-oid-array.c
+++ b/t/helper/test-oid-array.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "oid-array.h"
+#include "setup.h"
 
 static int print_oid(const struct object_id *oid, void *data)
 {
diff --git a/t/helper/test-oidmap.c b/t/helper/test-oidmap.c
index 883d40efd45..f1b3dbe376b 100644
--- a/t/helper/test-oidmap.c
+++ b/t/helper/test-oidmap.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "oidmap.h"
+#include "setup.h"
 #include "strbuf.h"
 
 /* key is an oid and value is a name (could be a refname for example) */
diff --git a/t/helper/test-oidtree.c b/t/helper/test-oidtree.c
index 0b82431a70f..edcb7e9f448 100644
--- a/t/helper/test-oidtree.c
+++ b/t/helper/test-oidtree.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "oidtree.h"
+#include "setup.h"
 
 static enum cb_next print_oid(const struct object_id *oid, void *data)
 {
diff --git a/t/helper/test-pack-mtimes.c b/t/helper/test-pack-mtimes.c
index 0e53dee9e57..75ca1505a37 100644
--- a/t/helper/test-pack-mtimes.c
+++ b/t/helper/test-pack-mtimes.c
@@ -5,6 +5,7 @@
 #include "object-store.h"
 #include "packfile.h"
 #include "pack-mtimes.h"
+#include "setup.h"
 
 static void dump_mtimes(struct packed_git *p)
 {
diff --git a/t/helper/test-partial-clone.c b/t/helper/test-partial-clone.c
index da17fd37eb1..cce496944ac 100644
--- a/t/helper/test-partial-clone.c
+++ b/t/helper/test-partial-clone.c
@@ -3,6 +3,7 @@
 #include "test-tool.h"
 #include "repository.h"
 #include "object-store.h"
+#include "setup.h"
 
 /*
  * Prints the size of the object corresponding to the given hash in a specific
diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c
index cc266e3ec09..4f5ac2fadce 100644
--- a/t/helper/test-path-utils.c
+++ b/t/helper/test-path-utils.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "abspath.h"
 #include "environment.h"
+#include "setup.h"
 #include "string-list.h"
 #include "utf8.h"
 
diff --git a/t/helper/test-proc-receive.c b/t/helper/test-proc-receive.c
index 7e12d4f9aa2..7c8de7b562a 100644
--- a/t/helper/test-proc-receive.c
+++ b/t/helper/test-proc-receive.c
@@ -3,6 +3,7 @@
 #include "hex.h"
 #include "parse-options.h"
 #include "pkt-line.h"
+#include "setup.h"
 #include "sigchain.h"
 #include "test-tool.h"
 
diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c
index 09c711038ce..91bb2dec1df 100644
--- a/t/helper/test-reach.c
+++ b/t/helper/test-reach.c
@@ -8,6 +8,7 @@
 #include "hex.h"
 #include "parse-options.h"
 #include "ref-filter.h"
+#include "setup.h"
 #include "string-list.h"
 #include "tag.h"
 
diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c
index 84818363d5b..a4c24d0e421 100644
--- a/t/helper/test-read-cache.c
+++ b/t/helper/test-read-cache.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "config.h"
+#include "setup.h"
 #include "wrapper.h"
 
 int cmd__read_cache(int argc, const char **argv)
diff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c
index 98b73bb8f25..e21b0805f3c 100644
--- a/t/helper/test-read-graph.c
+++ b/t/helper/test-read-graph.c
@@ -4,6 +4,7 @@
 #include "repository.h"
 #include "object-store.h"
 #include "bloom.h"
+#include "setup.h"
 
 int cmd__read_graph(int argc, const char **argv)
 {
diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c
index 0a883cdf26b..05c4f2b2625 100644
--- a/t/helper/test-read-midx.c
+++ b/t/helper/test-read-midx.c
@@ -5,6 +5,7 @@
 #include "repository.h"
 #include "object-store.h"
 #include "pack-bitmap.h"
+#include "setup.h"
 
 static int read_midx_file(const char *object_dir, int show_objects)
 {
diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c
index 1745b088b7c..8717b95e84f 100644
--- a/t/helper/test-ref-store.c
+++ b/t/helper/test-ref-store.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "hex.h"
 #include "refs.h"
+#include "setup.h"
 #include "worktree.h"
 #include "object-store.h"
 #include "repository.h"
diff --git a/t/helper/test-repository.c b/t/helper/test-repository.c
index c444775eb0f..6774f6245f0 100644
--- a/t/helper/test-repository.c
+++ b/t/helper/test-repository.c
@@ -8,6 +8,7 @@
 #include "object-store.h"
 #include "object.h"
 #include "repository.h"
+#include "setup.h"
 #include "tree.h"
 
 static void test_parse_commit_in_graph(const char *gitdir, const char *worktree,
diff --git a/t/helper/test-revision-walking.c b/t/helper/test-revision-walking.c
index 4a45d5bac2a..f2df4334063 100644
--- a/t/helper/test-revision-walking.c
+++ b/t/helper/test-revision-walking.c
@@ -13,6 +13,7 @@
 #include "commit.h"
 #include "diff.h"
 #include "revision.h"
+#include "setup.h"
 
 static void print_commit(struct commit *commit)
 {
diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c
index a26107ed70a..15b7688774c 100644
--- a/t/helper/test-scrap-cache-tree.c
+++ b/t/helper/test-scrap-cache-tree.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "lockfile.h"
+#include "setup.h"
 #include "tree.h"
 #include "cache-tree.h"
 
diff --git a/t/helper/test-serve-v2.c b/t/helper/test-serve-v2.c
index 497d72058de..7d590ab7227 100644
--- a/t/helper/test-serve-v2.c
+++ b/t/helper/test-serve-v2.c
@@ -3,6 +3,7 @@
 #include "gettext.h"
 #include "parse-options.h"
 #include "serve.h"
+#include "setup.h"
 
 static char const * const serve_usage[] = {
 	N_("test-tool serve-v2 [<options>]"),
diff --git a/t/helper/test-submodule-config.c b/t/helper/test-submodule-config.c
index 22a41c40926..256bfa6e9e1 100644
--- a/t/helper/test-submodule-config.c
+++ b/t/helper/test-submodule-config.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "config.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "submodule.h"
 
diff --git a/t/helper/test-submodule-nested-repo-config.c b/t/helper/test-submodule-nested-repo-config.c
index a3848a8b668..aaffd422d6e 100644
--- a/t/helper/test-submodule-nested-repo-config.c
+++ b/t/helper/test-submodule-nested-repo-config.c
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "setup.h"
 #include "submodule-config.h"
 
 static void die_usage(const char **argv, const char *msg)
diff --git a/t/helper/test-submodule.c b/t/helper/test-submodule.c
index e060cc62268..f18ca46dce4 100644
--- a/t/helper/test-submodule.c
+++ b/t/helper/test-submodule.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "parse-options.h"
 #include "remote.h"
+#include "setup.h"
 #include "submodule-config.h"
 #include "submodule.h"
 
diff --git a/t/helper/test-subprocess.c b/t/helper/test-subprocess.c
index ff22f2fa2c5..65a355cc590 100644
--- a/t/helper/test-subprocess.c
+++ b/t/helper/test-subprocess.c
@@ -1,6 +1,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "run-command.h"
+#include "setup.h"
 
 int cmd__subprocess(int argc, const char **argv)
 {
diff --git a/t/helper/test-userdiff.c b/t/helper/test-userdiff.c
index a2b56b9cae5..0cd7ee12b7e 100644
--- a/t/helper/test-userdiff.c
+++ b/t/helper/test-userdiff.c
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "setup.h"
 #include "userdiff.h"
 #include "config.h"
 
diff --git a/t/helper/test-write-cache.c b/t/helper/test-write-cache.c
index 7d45cd61e82..a93417ed3a9 100644
--- a/t/helper/test-write-cache.c
+++ b/t/helper/test-write-cache.c
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "lockfile.h"
+#include "setup.h"
 
 int cmd__write_cache(int argc, const char **argv)
 {
diff --git a/trace.c b/trace.c
index 9c85b71ec6a..81318a2455d 100644
--- a/trace.c
+++ b/trace.c
@@ -25,6 +25,7 @@
 #include "abspath.h"
 #include "environment.h"
 #include "quote.h"
+#include "setup.h"
 #include "wrapper.h"
 
 struct trace_key trace_default_key = { "GIT_TRACE", 0, 0, 0 };
diff --git a/unpack-trees.c b/unpack-trees.c
index 0ff4bbc6b96..a26fda3493f 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -22,6 +22,7 @@
 #include "promisor-remote.h"
 #include "entry.h"
 #include "parallel-checkout.h"
+#include "setup.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
diff --git a/worktree.c b/worktree.c
index 3861ab639ca..edef9e161dc 100644
--- a/worktree.c
+++ b/worktree.c
@@ -5,6 +5,7 @@
 #include "gettext.h"
 #include "repository.h"
 #include "refs.h"
+#include "setup.h"
 #include "strbuf.h"
 #include "worktree.h"
 #include "dir.h"
diff --git a/wt-status.c b/wt-status.c
index 106e46480a1..16e0df5736f 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -16,6 +16,7 @@
 #include "refs.h"
 #include "submodule.h"
 #include "column.h"
+#include "setup.h"
 #include "strbuf.h"
 #include "utf8.h"
 #include "worktree.h"
-- 
gitgitgadget


^ permalink raw reply related	[relevance 2%]

* Re: Fetching everything in another bare repo
  2023-03-09 15:35  5%     ` Jeff King
@ 2023-03-09 17:57  0%       ` Konstantin Ryabitsev
  0 siblings, 0 replies; 200+ results
From: Konstantin Ryabitsev @ 2023-03-09 17:57 UTC (permalink / raw)
  To: Jeff King; +Cc: Paul Smith, git

On Thu, Mar 09, 2023 at 10:35:46AM -0500, Jeff King wrote:
> You may want to try the "preciousObjects" repository extension, which
> was designed to prevent accidents for a case like this. Something like:
> 
>   [this will cause old versions of Git that don't understand
>    extensions.* to bail on all commands for safety]
>   $ git config core.repositoryformatversion 1
> 
>   [this will tell old versions of Git that don't understand this
>    particular extension to bail on all commands for safety. But more
>    importantly, it will tell recent versions (> 2.6.3) to allow most
>    commands, but not ones that would delete unreachable objects]
>   $ git config extensions.preciousObjects true
> 
>   [this is it in action]
>   $ git repack -ad
>   fatal: cannot delete packs in a precious-objects repo
>   $ git prune
>   fatal: cannot prune in a precious-objects repo
> 
> Sadly it's not quite smart enough to realize that "git repack -adk" is
> safe. If you want to occasionally repack with that, you'd have to
> manually disable the flag for a moment.
> 
> I will also say that while I implemented this extension a while back, it
> never actually saw production use for my intended case. So I think it's
> pretty good (and certainly safer than nothing), but it's not thoroughly
> tested in the wild.

We use it in grokmirror for objstore repositories [1] (the super-parents of
all forks), as a precautionary measure against a sysadmin running any kind of
manual operation that may result in loose objects being deleted. I do believe
it works well for that purpose.

-K

[1] https://github.com/mricon/grokmirror#object-storage-repositories

^ permalink raw reply	[relevance 0%]

* Re: Fetching everything in another bare repo
  @ 2023-03-09 15:35  5%     ` Jeff King
  2023-03-09 17:57  0%       ` Konstantin Ryabitsev
  0 siblings, 1 reply; 200+ results
From: Jeff King @ 2023-03-09 15:35 UTC (permalink / raw)
  To: Paul Smith; +Cc: git

On Thu, Mar 09, 2023 at 08:55:27AM -0500, Paul Smith wrote:

> > OK. It's not clear to me if this archive repo retains the old
> > references, or if it simply has a bunch of unreachable objects.
> > That distinction will matter below.
> 
> Sorry; I've been using Git for a long time but am still not totally
> immersed in the terminology :).
> 
> Basically, these bare clones have "gc.pruneExpire=never" set, and have
> never had any GC operations run so all commits are still present (when
> you say "unreachable" I assume you mean, not reachable through any
> reference).

Right, that's what I mean by unreachable. And no, you didn't use any
terminology wrong. I was just not sure if you realized that running
"fetch" would not get the unreachable objects. :)

> There is a separate database of information containing SHAs for these
> commits, that is used to find them, but there is nothing in Git itself
> that references them so they are indeed unreachable as far as Git is
> concerned.

OK, that makes sense (and I've done something like that before, as
well).

> Oh interesting.  I did a quick verification and all of the objects /
> packfiles in the old clone either don't exist in the new one, or are
> identical.  I'm sure you expected that but I needed to reassure myself
> I wouldn't be overwriting anything :).

The files are named after the sha1 of their contents (and that goes for
both loose objects and packfiles). But certainly it's a good idea to
double check that nothing funny is going on.

> One question: is the objects/info/packs file anything to be concerned
> about or will git repack (or something) take care of handling it?

You can ignore it.  It will be regenerated by git-repack. But also, it's
pretty useless these days. It's only used for "dumb" fetches (e.g., when
you export a repo via static http, but without using the git-aware CGI).

> > And then you can do any ref updates in the new repository (since it
> > now has all objects from both).
> 
> It's actually possible that I don't care about refs at all.  I might
> only care about objects.  I'm not sure, I can check what exists in the
> old clone.

Yeah, if you have a separate database of branch tips, etc, then the refs
aren't necessary. As long as you are careful not to run "gc" or repack
without "-k".

You may want to try the "preciousObjects" repository extension, which
was designed to prevent accidents for a case like this. Something like:

  [this will cause old versions of Git that don't understand
   extensions.* to bail on all commands for safety]
  $ git config core.repositoryformatversion 1

  [this will tell old versions of Git that don't understand this
   particular extension to bail on all commands for safety. But more
   importantly, it will tell recent versions (> 2.6.3) to allow most
   commands, but not ones that would delete unreachable objects]
  $ git config extensions.preciousObjects true

  [this is it in action]
  $ git repack -ad
  fatal: cannot delete packs in a precious-objects repo
  $ git prune
  fatal: cannot prune in a precious-objects repo

Sadly it's not quite smart enough to realize that "git repack -adk" is
safe. If you want to occasionally repack with that, you'd have to
manually disable the flag for a moment.

I will also say that while I implemented this extension a while back, it
never actually saw production use for my intended case. So I think it's
pretty good (and certainly safer than nothing), but it's not thoroughly
tested in the wild.

-Peff

^ permalink raw reply	[relevance 5%]

* Re: [PATCH 0/3] fsck index files from all worktrees
  2023-02-24  8:05  0% ` [PATCH 0/3] fsck index files from all worktrees Jeff King
@ 2023-02-26 21:49  0%   ` Johannes Sixt
  0 siblings, 0 replies; 200+ results
From: Johannes Sixt @ 2023-02-26 21:49 UTC (permalink / raw)
  To: Jeff King; +Cc: Git Mailing List

Am 24.02.23 um 09:05 schrieb Jeff King:
> On Sat, Feb 18, 2023 at 10:38:33AM +0100, Johannes Sixt wrote:
> 
>> I see three problems here:
>>
>> - git fsck should detect the problem (if it really is one) in the
>> worktree index. It seems that it is just an index extension that is
>> affected. Perhaps it should be just a warning, not an error.
> 
> We do fsck the resolve-undo extension, but I think fsck just doesn't
> know anything about worktrees. That should be easy enough to fix.
> Patches below.
> 
>> - If the objects mentioned in the index extension are precious, they
>> should not have been garbage-collected in earlier rounds of git gc
>> (which I certainly did at some point).
> 
> Correct, but the gc error you're getting indicates that we _are_ trying
> to treat them as included. I wonder if you ran git-gc long ago with an
> older version of Git, and this breakage was waiting to surface. AFAICT
> this was all fixed by 8a044c7f1d (Merge branch 'nd/prune-in-worktree',
> 2017-09-19).

I don't know how I got into the situation. The worktree is a lot younger
than that and was made with a Git version young enough to include this
commit. I'll see if it happens again.

>> - I can't git gc the repository now, which is particularly annoying when
>> auto-gc is attempted after almost every git command. Of course, I know
>> how to get out of the situation, but it took some time to identify the
>> worktree index as the culprit. Not something that a beginner would be
>> able to do easily.
> 
> I think in general that "oops, there's something corrupt" can be hard to
> get out of, just because there are so many possibilities. But if we can
> at least report the nature of the problem and the offending filename via
> git-fsck, that would help with pointing people in the right direction.

Agreed. Thanks a lot for the patches, they are certainly helpful.

-- Hannes


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"
  2023-02-24 22:06  5%                 ` Sergey Organov
@ 2023-02-24 23:59  0%                   ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2023-02-24 23:59 UTC (permalink / raw)
  To: Sergey Organov
  Cc: Tao Klerks, phillip.wood, Alex Henrie,
	Tao Klerks via GitGitGadget, git, Johannes Schindelin

On Fri, Feb 24, 2023 at 2:06 PM Sergey Organov <sorganov@gmail.com> wrote:
>
> Elijah Newren <newren@gmail.com> writes:
>
> > On Wed, Feb 22, 2023 at 6:27 AM Sergey Organov <sorganov@gmail.com> wrote:

> >> I also agree (in particular with Buga) that from the POV of user
> >> experience the method suggested by Phillip should be superior.
> >> [...]
> >> Even this would be a huge step forward compared to silent
> >> drop of merge commits and blindly re-merging of updated parents.
> >
> > I'm not so sure it's a huge step forward.  Or even a step forward.
>
> Git currently throws away my precious merges! Silently! How it's not a
> step forward to stop doing this?! Sorry for getting that heated :)

I totally agree with you that we have a big problem.  No need to
convince me on that.  :-)

But having a big problem does not imply we have to implement and ship
the first proposal that comes along to change things.  Or second, or
third.  Such proposals might actually make things even worse.  You
correctly point out that we do not need to require perfection, but we
can and should require that the proposed solutions not only make some
things better but that they make things better overall.

And in order to convincingly persuade others to adopt various
proposals, we should be aware of what the advantages and shortcomings
are...at least the ones that have already been discovered and
publicized, and be able to talk about those shortcomings candidly.

> As for Dscho results specifically, I've got an impression that he never
> needed rebasing of merges in the first place, and re-merging always
> suited him just fine, so it'd be rather a surprise if rebasing of merges
> suddenly started to work better for his needs and workflows once he has
> implemented it.

Are you serious?

You're claiming the author of --preserve-merges; and the author of
--rebase-merges; and someone who actually implemented the ideas you,
Buga, and Phillip were all discussing to improve rebasing of
merges[1]; and who maintains a project (Git for Windows) that has
countless branches with hundreds of commits and myriad merge points
and needs to rebase the whole lot as Git is updated...is someone who
doesn't actually care about rebasing of merges?

I thought you had tried to read up on this subject and were commenting
in good faith, but I'm starting to have my doubts.

Please, go read at least [1] to see Johannes comments about how the
prior proposals don't work beyond simple cases.  He didn't discard
those ideas because he didn't care about the useful information in
merge commits, he discarded them because in practice those ideas
resulted in behavior that was *even worse* than the current big
problems.

[1] https://lore.kernel.org/git/nycvar.QRO.7.76.6.1804130002090.65@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz/

[...]
> for now I do believe we need something
> reliable that has been checked to actually work for common cases, as
> blind re-merging simply does not.

I agree with you.  The word "reliable" is particularly key, and IMO
rules out any suggestion that involves applying the diff between a
merge commit and either of its parents.  Not only do I think it's the
wrong solution theoretically, I also think they have empirically been
shown to provide problems that many will consider to be as bad or
worse than our current poison.  I obviously don't have veto power or
anything close to it, but in my opinion any solution based on those
ideas do not meet the threshold bar for inclusion in Git and I'll
raise my voice against them.

Solutions based on other ideas are fair game.  Heck, I've proposed one
and I know of simpler variants to my proposal.  Other solutions may
exist too.  But can we stop pushing already discredited proposals and
instead reach for something that has a more solid foundation?

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"
  @ 2023-02-24 22:06  5%                 ` Sergey Organov
  2023-02-24 23:59  0%                   ` Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Sergey Organov @ 2023-02-24 22:06 UTC (permalink / raw)
  To: Elijah Newren
  Cc: Tao Klerks, phillip.wood, Alex Henrie,
	Tao Klerks via GitGitGadget, git, Johannes Schindelin

Elijah Newren <newren@gmail.com> writes:

> On Wed, Feb 22, 2023 at 6:27 AM Sergey Organov <sorganov@gmail.com> wrote:
>>
>> Tao Klerks <tao@klerks.biz> writes:
>>
>> > On Sat, Feb 18, 2023 at 5:39 PM Phillip Wood <phillip.wood123@gmail.com> wrote:
>> >>
>> >> On 18/02/2023 03:17, Elijah Newren wrote:
>
> [...]
>
>> I also agree (in particular with Buga) that from the POV of user
>> experience the method suggested by Phillip should be superior, as it
>> emphasizes the natural dominance of the "current branch", as opposed to
>> originally described symmetric method that is more suitable for formal
>> analysis than for actual convenient implementation. Yet creating U1' and
>> U2' from the original method could be useful for the purpose of checking
>> for possible problems with automatic rebase that the user may need to be
>> aware of.
>>
>> The biggest problem here, as I see it, is designing UI that'd make sense
>> in the case of conflicts in multiple stages of the suggested algorithms,
>> but I think we can simplify it for now by stopping and suggesting blind
>> re-merge in case of any conflict but that on rebasing of changes to the
>> first parent. Even this would be a huge step forward compared to silent
>> drop of merge commits and blindly re-merging of updated parents.
>
> I'm not so sure it's a huge step forward.  Or even a step forward.

Git currently throws away my precious merges! Silently! How it's not a
step forward to stop doing this?! Sorry for getting that heated :)

Git is well-known for being extremely careful with user content, and
there is the only case where it fails miserably: rebasing merges. The
above method will simply fix this long-standing deficiency that is even
more dangerous as users do trust Git so much.

I can only tell that I, for example, will definitely benefit a lot once
it is implemented, as currently a rebase containing merge is at roughly
the same level of risk as "cvs update" was in the old days: run and keep
your fingers crossed. Well, with Git it's unless you are careful to do
2-step merge-fixup thingy every time you merge, that is basically just
poor man attempt at fighting long-standing Git weakness.

> Dscho actually implemented the old proposals and tried them out, as
> mentioned in the threads I linked to.  The results on balance were
> significantly worse to him than just throwing away the previous merge
> resolution information and redoing the merge from scratch.  He really
> wanted a better solution, but the previous proposals didn't provide
> it.

OTOH, Buga has sketched the proposals, confirmed problem with my
original one (that Dscho predicted), then sketched the update I came up
with, and showed it does work in common cases as expected.
 
That said, I'm almost sure that for any method of rebasing and/or
merging of whatever, one motivated enough will be able to find corner
cases where the method fails, yet we do have both merges and rebases in
Git, and rebasing of merges falls to the same category. We need them.
Merges need to be properly rebased, not silently replaced with
(different) merges, unless user asks for re-merge explicitly. To me
Dscho (or anybody else) finding rough cases is an expected outcome, and
is not a convincing argument against the feature.

As for Dscho results specifically, I've got an impression that he never
needed rebasing of merges in the first place, and re-merging always
suited him just fine, so it'd be rather a surprise if rebasing of merges
suddenly started to work better for his needs and workflows once he has
implemented it.

That said, when better method(s) of rebasing of merges will be found,
I'm sure they'll be adopted, but for now I do believe we need something
reliable that has been checked to actually work for common cases, as
blind re-merging simply does not, and I still suspect the best choice
for the time being is Phillip's incremental method.

Overall, I'm still in desperate need for my precious merge-the-commits
be rebased, and not replaced with Git idea of how merge commit would
look if [current version of] 'git-merge' algorithm merged my branch in
[using Git current default settings]. It's my dream that Git finally
stops silently substituting a result of 'git-merge'
(just-a-helper-operation intended to simplify creation of merge commits)
for actual merge-the-commit that is part of my content.

Best regards,
-- Sergey Organov

^ permalink raw reply	[relevance 5%]

* [PATCH 0/3] fsck index files from all worktrees
  2023-02-18  9:38  4% Bug: fsck and repack don't agree when a worktree index extension is "broken" Johannes Sixt
@ 2023-02-24  8:05  0% ` Jeff King
  2023-02-26 21:49  0%   ` Johannes Sixt
  0 siblings, 1 reply; 200+ results
From: Jeff King @ 2023-02-24  8:05 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Git Mailing List

On Sat, Feb 18, 2023 at 10:38:33AM +0100, Johannes Sixt wrote:

> I see three problems here:
> 
> - git fsck should detect the problem (if it really is one) in the
> worktree index. It seems that it is just an index extension that is
> affected. Perhaps it should be just a warning, not an error.

We do fsck the resolve-undo extension, but I think fsck just doesn't
know anything about worktrees. That should be easy enough to fix.
Patches below.

> - If the objects mentioned in the index extension are precious, they
> should not have been garbage-collected in earlier rounds of git gc
> (which I certainly did at some point).

Correct, but the gc error you're getting indicates that we _are_ trying
to treat them as included. I wonder if you ran git-gc long ago with an
older version of Git, and this breakage was waiting to surface. AFAICT
this was all fixed by 8a044c7f1d (Merge branch 'nd/prune-in-worktree',
2017-09-19).

> - I can't git gc the repository now, which is particularly annoying when
> auto-gc is attempted after almost every git command. Of course, I know
> how to get out of the situation, but it took some time to identify the
> worktree index as the culprit. Not something that a beginner would be
> able to do easily.

I think in general that "oops, there's something corrupt" can be hard to
get out of, just because there are so many possibilities. But if we can
at least report the nature of the problem and the offending filename via
git-fsck, that would help with pointing people in the right direction.

> The repository I use for the above commands is attached. I hope vger
> doesn't strip it away.

Thanks, it was nice to have a test case. I ended up writing a separate
test with a missing blob, just because that's simpler to do. It looks
like we don't test fsck_resolve_undo() or fsck_cache_tree() at all. That
might be a nice addition, but I punted for now to stay focused on the
worktree aspects.

  [1/3]: fsck: factor out index fsck
  [2/3]: fsck: check index files in all worktrees
  [3/3]: fsck: mention file path for index errors

 builtin/fsck.c  | 93 ++++++++++++++++++++++++++++++++-----------------
 t/t1450-fsck.sh | 30 ++++++++++++++++
 2 files changed, 92 insertions(+), 31 deletions(-)

-Peff

^ permalink raw reply	[relevance 0%]

* Bug: fsck and repack don't agree when a worktree index extension is "broken"
@ 2023-02-18  9:38  4% Johannes Sixt
  2023-02-24  8:05  0% ` [PATCH 0/3] fsck index files from all worktrees Jeff King
  0 siblings, 1 reply; 200+ results
From: Johannes Sixt @ 2023-02-18  9:38 UTC (permalink / raw)
  To: Git Mailing List

[-- Attachment #1: Type: text/plain, Size: 1770 bytes --]

I came into a situation where a worktree index contains an invalid
object ID in an extension. This causes git gc to abort half-way:

$ git gc
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
fatal: unable to read d3e1a3edd7d7851bbf811064090e03475d62fd44
fatal: failed to run repack

However, fsck does not find any problem:

$ git fsck
Checking object directories: 100% (256/256), done.

The problem is an invalid object ID that occurs in a worktree index. If
I copy the index to the main worktree, fsck does find the culprit:

$ cp .git/worktrees/wt/index .git/index
$ git fsck
Checking object directories: 100% (256/256), done.
error: d3e1a3edd7d7851bbf811064090e03475d62fd44: invalid sha1 pointer in
resolve-undo
error: 4b40bf1072d6dfeebc09b11ee4d4f22ca2ce3109: invalid sha1 pointer in
resolve-undo
error: 5a494fd3a2182795e0723300ab1ac75c0797be5b: invalid sha1 pointer in
resolve-undo

and git gc fails in the same way as before (of course).

I see three problems here:

- git fsck should detect the problem (if it really is one) in the
worktree index. It seems that it is just an index extension that is
affected. Perhaps it should be just a warning, not an error.

- If the objects mentioned in the index extension are precious, they
should not have been garbage-collected in earlier rounds of git gc
(which I certainly did at some point).

- I can't git gc the repository now, which is particularly annoying when
auto-gc is attempted after almost every git command. Of course, I know
how to get out of the situation, but it took some time to identify the
worktree index as the culprit. Not something that a beginner would be
able to do easily.

The repository I use for the above commands is attached. I hope vger
doesn't strip it away.

-- Hannes

[-- Attachment #2: git-bug-gc-w-worktree-index.tar.gz --]
[-- Type: application/gzip, Size: 3431 bytes --]

^ permalink raw reply	[relevance 4%]

* Re: [PATCH] ci: only run win+VS build & tests in Git for Windows' fork
  @ 2022-12-20  9:35  3%   ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2022-12-20  9:35 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Johannes Schindelin via GitGitGadget, git, phillip.wood, peff, me,
	phillip.wood123, Eric Sunshine

[-- Attachment #1: Type: text/plain, Size: 3807 bytes --]

Hi Ævar,

On Mon, 19 Dec 2022, Ævar Arnfjörð Bjarmason wrote:

> On Mon, Dec 19 2022, Johannes Schindelin via GitGitGadget wrote:
>
> > diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
> > index e67847a682c..8af3c67f605 100644
> > --- a/.github/workflows/main.yml
> > +++ b/.github/workflows/main.yml
> > @@ -132,7 +132,7 @@ jobs:
> >    vs-build:
> >      name: win+VS build
> >      needs: ci-config
> > -    if: needs.ci-config.outputs.enabled == 'yes'
> > +    if: github.event.repository.owner.login == 'git-for-windows' && needs.ci-config.outputs.enabled == 'yes'
> >      env:
> >        NO_PERL: 1
> >        GIT_CONFIG_PARAMETERS: "'user.name=CI' 'user.email=ci@git'"
>
> In terms of implementation: I would like this to use ci-config.

I really do not see any value in that.

If you _really_ want to run those tests, you can easily add a commit on
top of your branch.

It's not like you always want to run the win+VS tests on a certain subset
of your branches.

But. A big part of the reason for this patch is to codify that it
is _not_ the responsibility of core Git contributors to take care of these
tests. Trying to do this via the utterly convoluted and under-documented
`ci-config` would only water down this quite clear statement.

> The outstanding "tb/ci-concurrency" topic shows how to do that (and
> tweaks an earlier submission of yours where it was similarly hardcoded).

I fear that the `tb/ci-concurrency` topic is a good example of "death by
committee". Let's put in a collective effort to avoid that here.

> > The purpose of these win+VS jobs is to maintain the CMake-based build
> > of Git, with the target audience being Visual Studio users on Windows
> > who are typically quite unfamiliar with `make` and POSIX shell
>
> I thought the initial purpose of it was to test compiling & testing with
> MSVC rather than GCC?

That might have been the motivation, but there have been preciously few
patches coming in from that side.

So few, in fact, that the question "is it worth spending all of that
energy to run these builds and tests all the time" most likely has to be
answered with a resounding "No".

I can think of just two bugs that were identified in the MSVC builds, one
where we had to change some code to explicitly use a stable sort (which
MSVC would otherwise not have used), and one where we now avoid an
unsigned/signed comparison where MSVC cast the signed value to a
now-insanely-large unsigned, i.e. in the wrong direction.

That's two bugs identified in how many years?

We still can catch those bugs in git-for-windows/git. And avoid some of
the long build times.

> > A very welcome side effect is to reduce the CI build time again, which
> > became alarmingly long as of recent, causing friction on its own.
>
> I think this is a good goal, but what does the "as of recent" refer to
> here? When the ASAN job was introduced?

It's not only `linux-asan`. The overall build time of every single job has
gone up. I picked randomly two runs that were roughly 6 months apart,
https://github.com/git/git/actions/runs/2537915353 and
https://github.com/git/git/actions/runs/3728047162. As an indicator, the
`osx-gcc` job took 35m half a year ago, now it takes 40m. The overall time
went up from 7h40 (which is already _quite_ a cost!) to 8h01.

I don't think that we, collectively, are judicious enough about the
balance between cost and benefit here.

Having said that, there is a silver lining: while the linux-asan job is
new and takes a whopping 44m to complete, the difference between the total
run time 6 months ago and today is less than that, so we must have saved
on _something_, _somewhere_. Or GitHub bought faster hardware.

Ciao,
Johannes

^ permalink raw reply	[relevance 3%]

* [PATCH] Makefile: fix cygwin build failure
@ 2022-11-09 22:46  3% Ramsay Jones
  0 siblings, 0 replies; 200+ results
From: Ramsay Jones @ 2022-11-09 22:46 UTC (permalink / raw)
  To: Taylor Blau, Ævar Arnfjörð Bjarmason
  Cc: Adam Dinwoodie, Johannes Schindelin, GIT Mailing-list,
	Junio C Hamano


Commit 1c97a5043f (Makefile: define "TEST_{PROGRAM,OBJS}" variables
earlier, 2022-10-31) breaks the cygwin build, like so:

    $ make
    GIT_VERSION = 2.38.1.674.gca75de31c9
        * new build flags
        CC oss-fuzz/fuzz-commit-graph.o
        CC oss-fuzz/fuzz-pack-headers.o
        CC oss-fuzz/fuzz-pack-idx.o
    make: *** No rule to make target 't/helper/test-fake-ssh', needed by 'all'.  Stop.
    $

This is caused by moving an 'all::' target higher in the Makefile,
before the 'include' of the config.mak.* files. This results in
the $X make variable having the default value (empty) rather than
a value suitable for cygwin (ie. '.exe'). Although the value of
this variable is lazily evaluated, the 'all::' target forces an
evaluation prior to it being correctly set.

In order to fix the build, move the 'all::' target lower in the
Makefile (close to where it was originally placed). Although it
could come anywhere after the 'include's, placing it here makes
the diff of the build outputs smaller (placing it directly after
the 'include's causes a change in the order of build products).

Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
---

Hi Taylor, Ævar,

I decided to spend some time tonight cleaning up my cygwin git repo (I
have _far_ too many branches scattered across history, some _very_ old,
some half done, some with no commit message etc., etc.). So, before
looking to rebase/re-work some old commits on the current version of
git, I thought it might be an idea to peek at the latest work; I have
not seen any updates to my origin repo, for the last couple of weeks,
since Junio took a break (as you may recall :) ).

So, I set up a 'git' remote:

    $ git remote get-url git
    git@github.com:git/git.git
    $ 

.. to have a peek at the updates to the 'master', 'next' and 'seen'
branches. Also, out of habit, I decided to build all three branches in
the usual way (well, apart from being on a detached HEAD, of course).

First 'git/master' failed to build! ;) It turned out that I had updated
cygwin and installed a bad update to the gettext-devel package, in
particular '/usr/bin/msgfmt.exe' was completely broken. :( (Adam, if you
haven't already run into this, you may appreciate the solution given
at [1] below).

Having fixed my cygwin installation, 'git/master' and 'git/next' built
just fine, 'git/seen' however failed to build (see commit message
above).

I'm not sure what the plans are for the 'ab/make-bin-wrappers' branch,
but if it is going to be re-rolled, could you please squash this into
the patch corresponding to commit 1c97a5043f. (Otherwise, could you
maybe add this to the tip of that branch?).

Note: this patch was created directly on top of 'git/seen'@ca75de31c9,
but I wouldn't anticipate any problem adding it to that branch.

I am a little surprised that it has taken this long to spot this build
failure, since this should also affect a (vanilla) MSYS2 build, along
with a Git-For-Windows Makefile build. Hmm, I have no way of knowing,
but this seems to indicate that nobody builds GFW using the Makefile
these days! :D

If anything in the commit message is unclear, please let me know.

Thanks!

ATB,
Ramsay Jones

[1] After a cygwin update, '/usr/bin/msgfmt.exe' refused to run, saying
that it could not locate the 'cygunistring-5.dll' file. Using cygcheck,
I found that this dll is provided by the 'libunistring5 1.1-1' package.
After installing this package, everything works just fine.

I don't know how package dependencies are specified/updated, but it
would seem the 'gettext-devel' package has a direct or indirect
dependency on the 'libunistring5' package. Looking at my setup.log file
I would guess one-or-more of the following packages needs an update to
note this dependency: 'gettext-devel 0.21.1-1', 'gettext 0.21.1-1',
'libgettextpo0 0.21.1-1', 'libintl-devel 0.21.1-1', 'libintl8 0.21.1-1',
or 'libasprintf0 0.21.1-1'.

Unfortunately, I am not subscribed to the cygwin mailinglist :(

 Makefile | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index acb02f3882..03ceaf3e79 100644
--- a/Makefile
+++ b/Makefile
@@ -869,7 +869,6 @@ TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-tool
 
 TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
-all:: $(TEST_PROGRAMS)
 TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%.o,$(TEST_PROGRAMS_NEED_X))
 .PRECIOUS: $(TEST_PROGRAM_OBJS)
 
@@ -3208,7 +3207,7 @@ $(call bin_wrappers_template,TEST_PROGRAMS_NEED_X,'$$(@F)',t/helper/,$$X)
 endef
 $(eval $(call bin_wrappers_templates))
 
-all:: $(BIN_WRAPPERS)
+all:: $(TEST_PROGRAMS) $(BIN_WRAPPERS)
 
 # GNU make supports exporting all variables by "export" without parameters.
 # However, the environment gets quite big, and some programs have problems
-- 
2.38.0

^ permalink raw reply related	[relevance 3%]

* [PATCH v3 2/4] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier
  @ 2022-10-31 22:28 11%       ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-10-31 22:28 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Johannes Schindelin, Victoria Dye, Derrick Stolee,
	Taylor Blau, Ævar Arnfjörð Bjarmason

Define the variables that make up TEST_OBJS earlier, and don't go back
& forth in their definition. Before we'd first append $X to
$(TEST_PROGRAMS), and then substitute $X back out of it to define
$(TEST_OBJS). Let's instead add a new $(TEST_PROGRAM_OBJS) variable,
which avoids this needless back & forth substitution.

See daa99a91729 (Makefile: make sure test helpers are rebuilt when
headers change, 2010-01-26) for how we ended up with the original
$(TEST_OBJS).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 Makefile | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/Makefile b/Makefile
index 679c24377f4..911cce6d487 100644
--- a/Makefile
+++ b/Makefile
@@ -617,7 +617,8 @@ SCRIPT_PYTHON =
 SCRIPT_SH =
 SCRIPT_LIB =
 TEST_BUILTINS_OBJS =
-TEST_OBJS =
+TEST_PROGRAMS =
+TEST_PROGRAM_OBJS =
 TEST_PROGRAMS_NEED_X =
 THIRD_PARTY_SOURCES =
 
@@ -796,6 +797,7 @@ TEST_BUILTINS_OBJS += test-wildmatch.o
 TEST_BUILTINS_OBJS += test-windows-named-pipe.o
 TEST_BUILTINS_OBJS += test-write-cache.o
 TEST_BUILTINS_OBJS += test-xml-encode.o
+TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
 
 # Do not add more tests here unless they have extra dependencies. Add
 # them in TEST_BUILTINS_OBJS above.
@@ -803,6 +805,9 @@ TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-tool
 
 TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
+all:: $(TEST_PROGRAMS)
+TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%.o,$(TEST_PROGRAMS_NEED_X))
+.PRECIOUS: $(TEST_PROGRAM_OBJS)
 
 # List built-in command $C whose implementation cmd_$C() is not in
 # builtin/$C.o but is linked in as part of some other command.
@@ -2546,10 +2551,8 @@ REFTABLE_TEST_OBJS += reftable/stack_test.o
 REFTABLE_TEST_OBJS += reftable/test_framework.o
 REFTABLE_TEST_OBJS += reftable/tree_test.o
 
-TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
-
 .PHONY: test-objs
-test-objs: $(TEST_OBJS)
+test-objs: $(TEST_PROGRAM_OBJS)
 
 GIT_OBJS += $(LIB_OBJS)
 GIT_OBJS += $(BUILTIN_OBJS)
@@ -2565,7 +2568,7 @@ scalar-objs: $(SCALAR_OBJS)
 OBJECTS += $(GIT_OBJS)
 OBJECTS += $(SCALAR_OBJS)
 OBJECTS += $(PROGRAM_OBJS)
-OBJECTS += $(TEST_OBJS)
+OBJECTS += $(TEST_PROGRAM_OBJS)
 OBJECTS += $(XDIFF_OBJS)
 OBJECTS += $(FUZZ_OBJS)
 OBJECTS += $(REFTABLE_OBJS) $(REFTABLE_TEST_OBJS)
@@ -3065,7 +3068,7 @@ endif
 
 test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))
 
-all:: $(TEST_PROGRAMS) $(test_bindir_programs)
+all:: $(test_bindir_programs)
 
 bin-wrappers/%: wrap-for-bin.sh
 	$(call mkdir_p_parent_template)
@@ -3091,8 +3094,6 @@ perf: all
 
 .PHONY: test perf
 
-.PRECIOUS: $(TEST_OBJS)
-
 t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
-- 
2.38.0.1280.g8136eb6fab2


^ permalink raw reply related	[relevance 11%]

* Re: [PATCH v2 2/3] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier
  2022-10-26 14:42 11%     ` [PATCH v2 2/3] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier Ævar Arnfjörð Bjarmason
@ 2022-10-26 16:47  0%       ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-10-26 16:47 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: git, Johannes Schindelin, Victoria Dye, Derrick Stolee

Ævar Arnfjörð Bjarmason  <avarab@gmail.com> writes:

> Define the variables that make up TEST_OBJS earlier, and don't go back
> & forth in their definition. Before we'd first append $X to
> $(TEST_PROGRAMS), and then substitute $X back out of it to define
> $(TEST_OBJS). Let's instead add a new $(TEST_PROGRAM_OBJS) variable,
> which avoids this needless back & forth substitution.

Makes sense, I guess.  So TEST_OBJS is no longer used?

>  TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
> +all:: $(TEST_PROGRAMS)

This change is not necessary to achieve the stated goal of this
step, though.  It is one of those "while at it" distraction that
consumes our already constrained reviewer bandwidth, no?

Having said that, "all::" being able to be built up with independent
pieces shine here in this split from the original.  It probably is
easier to reason about while seeing this isolated area of Makefile
what is being done to TEST_PROGRAMS.

The rest of the patch is quite straight-forward renaming of
TEST_OBJS to TEST_PROGRAM_OBJS and an improvement of how the
elements on the list are computed from the source-of-truth list that
is TEST_PROGRAMS_NEED_X that looks correct.

> +TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%.o,$(TEST_PROGRAMS_NEED_X))
> +.PRECIOUS: $(TEST_PROGRAM_OBJS)

>  # List built-in command $C whose implementation cmd_$C() is not in
>  # builtin/$C.o but is linked in as part of some other command.
> @@ -2543,10 +2548,8 @@ REFTABLE_TEST_OBJS += reftable/stack_test.o
>  REFTABLE_TEST_OBJS += reftable/test_framework.o
>  REFTABLE_TEST_OBJS += reftable/tree_test.o
>  
> -TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
> -
>  .PHONY: test-objs
> -test-objs: $(TEST_OBJS)
> +test-objs: $(TEST_PROGRAM_OBJS)
>  
>  GIT_OBJS += $(LIB_OBJS)
>  GIT_OBJS += $(BUILTIN_OBJS)
> @@ -2562,7 +2565,7 @@ scalar-objs: $(SCALAR_OBJS)
>  OBJECTS += $(GIT_OBJS)
>  OBJECTS += $(SCALAR_OBJS)
>  OBJECTS += $(PROGRAM_OBJS)
> -OBJECTS += $(TEST_OBJS)
> +OBJECTS += $(TEST_PROGRAM_OBJS)
>  OBJECTS += $(XDIFF_OBJS)
>  OBJECTS += $(FUZZ_OBJS)
>  OBJECTS += $(REFTABLE_OBJS) $(REFTABLE_TEST_OBJS)
> @@ -3061,7 +3064,7 @@ endif
>  
>  test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))
>  
> -all:: $(TEST_PROGRAMS) $(test_bindir_programs)
> +all:: $(test_bindir_programs)
>  
>  bin-wrappers/%: wrap-for-bin.sh
>  	$(call mkdir_p_parent_template)
> @@ -3087,8 +3090,6 @@ perf: all
>  
>  .PHONY: test perf
>  
> -.PRECIOUS: $(TEST_OBJS)
> -
>  t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
>  
>  t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)

^ permalink raw reply	[relevance 0%]

* [PATCH v2 2/3] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier
  @ 2022-10-26 14:42 11%     ` Ævar Arnfjörð Bjarmason
  2022-10-26 16:47  0%       ` Junio C Hamano
    1 sibling, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-10-26 14:42 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Johannes Schindelin, Victoria Dye, Derrick Stolee,
	Ævar Arnfjörð Bjarmason

Define the variables that make up TEST_OBJS earlier, and don't go back
& forth in their definition. Before we'd first append $X to
$(TEST_PROGRAMS), and then substitute $X back out of it to define
$(TEST_OBJS). Let's instead add a new $(TEST_PROGRAM_OBJS) variable,
which avoids this needless back & forth substitution.

See daa99a91729 (Makefile: make sure test helpers are rebuilt when
headers change, 2010-01-26) for how we ended up with the original
$(TEST_OBJS).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 Makefile | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/Makefile b/Makefile
index 45b22d33513..a8cfa096dc1 100644
--- a/Makefile
+++ b/Makefile
@@ -617,7 +617,8 @@ SCRIPT_PYTHON =
 SCRIPT_SH =
 SCRIPT_LIB =
 TEST_BUILTINS_OBJS =
-TEST_OBJS =
+TEST_PROGRAMS =
+TEST_PROGRAM_OBJS =
 TEST_PROGRAMS_NEED_X =
 THIRD_PARTY_SOURCES =
 
@@ -795,6 +796,7 @@ TEST_BUILTINS_OBJS += test-wildmatch.o
 TEST_BUILTINS_OBJS += test-windows-named-pipe.o
 TEST_BUILTINS_OBJS += test-write-cache.o
 TEST_BUILTINS_OBJS += test-xml-encode.o
+TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
 
 # Do not add more tests here unless they have extra dependencies. Add
 # them in TEST_BUILTINS_OBJS above.
@@ -802,6 +804,9 @@ TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-tool
 
 TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
+all:: $(TEST_PROGRAMS)
+TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%.o,$(TEST_PROGRAMS_NEED_X))
+.PRECIOUS: $(TEST_PROGRAM_OBJS)
 
 # List built-in command $C whose implementation cmd_$C() is not in
 # builtin/$C.o but is linked in as part of some other command.
@@ -2543,10 +2548,8 @@ REFTABLE_TEST_OBJS += reftable/stack_test.o
 REFTABLE_TEST_OBJS += reftable/test_framework.o
 REFTABLE_TEST_OBJS += reftable/tree_test.o
 
-TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
-
 .PHONY: test-objs
-test-objs: $(TEST_OBJS)
+test-objs: $(TEST_PROGRAM_OBJS)
 
 GIT_OBJS += $(LIB_OBJS)
 GIT_OBJS += $(BUILTIN_OBJS)
@@ -2562,7 +2565,7 @@ scalar-objs: $(SCALAR_OBJS)
 OBJECTS += $(GIT_OBJS)
 OBJECTS += $(SCALAR_OBJS)
 OBJECTS += $(PROGRAM_OBJS)
-OBJECTS += $(TEST_OBJS)
+OBJECTS += $(TEST_PROGRAM_OBJS)
 OBJECTS += $(XDIFF_OBJS)
 OBJECTS += $(FUZZ_OBJS)
 OBJECTS += $(REFTABLE_OBJS) $(REFTABLE_TEST_OBJS)
@@ -3061,7 +3064,7 @@ endif
 
 test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))
 
-all:: $(TEST_PROGRAMS) $(test_bindir_programs)
+all:: $(test_bindir_programs)
 
 bin-wrappers/%: wrap-for-bin.sh
 	$(call mkdir_p_parent_template)
@@ -3087,8 +3090,6 @@ perf: all
 
 .PHONY: test perf
 
-.PRECIOUS: $(TEST_OBJS)
-
 t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
-- 
2.38.0.1251.g3eefdfb5e7a


^ permalink raw reply related	[relevance 11%]

* Re: [PATCH v2 3/3] glossary: add reachability bitmap description
  @ 2022-10-25 15:53  4%             ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-10-25 15:53 UTC (permalink / raw)
  To: Derrick Stolee
  Cc: Philip Oakley, Abhradeep Chakraborty, Taylor Blau, GitList,
	Derrick Stolee

Derrick Stolee <derrickstolee@github.com> writes:

> The one thing I will say is that there can be multiple .bitmap
> files, but Git will only use one of them. Not sure if that is
> worth being pedantic about here, though.

That matches my understanding, but "can be" is less of the norm
these days, no?  "repack -b" would refuse without "-a" so we may
have more than one by accident, or am I missing a common scenario
that we do perfectly normal things and still end up with multiple?

I agree with you that it probably is a good idea to say there can
be, so that the readers do not have to alarmed.

      Only one '.bitmap' file (which stores multiple reachability
      bitmaps) per repository is used in a repository (note. it is
      not wrong to have more than one).  The bitmap file may belong
      to either one pack, or the repository's multi-pack index (if
      it exists).

But then the readers who do have more than one would next think "how
do I get rid of the ones that are not used? they are wasting my
precious disk space".  So I also am not sure if it helps to write
more.  "It is generally true that.." white lie may be better than
technical correctness in this case.

> We'll need to keep this glossary section in mind in case things
> change (such as "at most one bitmap file").

True.

Thanks.

^ permalink raw reply	[relevance 4%]

* Re: [suggestion] Fail cherry-pick if it overwrites untracked files with the matching file names
  2022-10-15 19:09  0%   ` Rupinderjeet Singh
@ 2022-10-16 17:08  4%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-10-16 17:08 UTC (permalink / raw)
  To: Rupinderjeet Singh; +Cc: git

Rupinderjeet Singh <rupinderjeet47@gmail.com> writes:

> Yes, thank you for being so through with the example. I understand now.
>
> I want to ask if you would suggest that local configuration (or any
> information required by the project) that is too sensitive to be
> tracked in git, should either be kept as 'untracked' files or 'outside
> of git repository'.

I think it depends on the project and participants may not have
control over it if it is ingrained in the project's build structure,
but a separate place may likely be more appropriate, as it would
reduce the chance of accidental "git add ." adding everything.

> With your explanation, am I correct to think that only the following
> kind of information is suitable to be put in .gitignore files?
> 1. that can be regenerated

Yes.

> 2. that doesn't matter when it is lost

Natural consequence of the above

> 3. that isn't used by the files tracked in git repository

I do not get this, so I decline to comment ;) Is mylib.o that is
"ignored", created from tracked mylib.c source, used by mymain.c
source that is tracked, when mymain.o would not link without what
mylib.o gives it?

Some other SCMs have an extra class "precious" to handle exactly the
case you have in mind.  You do not accidentally let "git add ." to
slurp them into the committed history, but you do want them to be
left alone.  We don't have it, and that is not because we have any
reason to be against having it.  It is just it didn't happen.

And nobody bothered to explore the ramification of adding the new
class yet.  We know about "checkout" and other mergy operations and
"add", but there probably are trickier interactions with other parts
of the existing system that somebody need to carefully go through
and make sure it does not introduce funny inconsistencies.

^ permalink raw reply	[relevance 4%]

* Re: [suggestion] Fail cherry-pick if it overwrites untracked files with the matching file names
  @ 2022-10-16 16:57  6%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-10-16 16:57 UTC (permalink / raw)
  To: Elijah Newren; +Cc: Rupinderjeet Singh, git

Elijah Newren <newren@gmail.com> writes:

> There is a command line option meant to allow tweaking this behavior:
> --[no-]overwrite-ignore.

Ah, I totally forgot that relatively recent invention.  Thanks for
bringing it up.

I personally consider it a bit too blunt an instrument, and in the
longer term, it would probably be a better direction to introduce a
new class of paths that are not tracked, and call the class
"precious", which (1) is similar to "ignored" in that the paths in
the class do not get added with "git add ." but (2) unlike "ignored"
but like "untracked", they are not considered to be expendable.

Until that happens, though, treating all "ignored" paths as if they
are "precious" may be a usable workaround.

^ permalink raw reply	[relevance 6%]

* Re: [suggestion] Fail cherry-pick if it overwrites untracked files with the matching file names
  2022-10-15 18:35  4% ` Junio C Hamano
@ 2022-10-15 19:09  0%   ` Rupinderjeet Singh
  2022-10-16 17:08  4%     ` Junio C Hamano
    1 sibling, 1 reply; 200+ results
From: Rupinderjeet Singh @ 2022-10-15 19:09 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Yes, thank you for being so through with the example. I understand now.

I want to ask if you would suggest that local configuration (or any
information required by the project) that is too sensitive to be
tracked in git, should either be kept as 'untracked' files or 'outside
of git repository'.

Since, any merge or similar action can do this, it should be
considered risky to keep files with important information in
.gitignore file.

As an example, when I am working on an android project, I usually add
firebase-integration info and keystore details in the .gitignore,
because I don't want to add them to version control (even by mistake).
I have seen it as a good practice suggested by many devs around me,
codelabs, online courses, and from experienced developers at google
too.

With your explanation, am I correct to think that only the following
kind of information is suitable to be put in .gitignore files?
1. that can be regenerated
2. that doesn't matter when it is lost
3. that isn't used by the files tracked in git repository

Honestly, the name .gitignore implies that git will completely ignore
these files. Overwriting an ignored file does seem like a violation of
the rule present in .gitignore file. But, if the implementation is
intended as you describe, I have definitely learned something new.

Thank you for your answer. My bad for not including the report-file as
text, it slipped my mind.

From,
Rupinderjeet Singh Hans.


On Sun, 16 Oct 2022 at 00:05, Junio C Hamano <gitster@pobox.com> wrote:
>
> If the situation is about cherry-picking a commit that adds a new
> file F to a checkout of another commit that lacks the file F, I
> think the command is working exactly as designed.
>
>     $ git init
>     $ git commit -m 'initial' --allow-empty
>     $ git tag initial
>     $ date >file
>     $ git add file
>     $ git commit -m 'add file'
>     $ git tag added
>     $ git checkout -b second initial
>     ... at this point we are back to the original state
>     ... without 'file'
>     $ >file
>     ... the file is untracked with precious contents
>     ... and the presence of it stops a cherry-pick that clobbers it
>     $ git cherry-pick added
>     error: The following untracked working tree files would be overwritten by merge:
>             file
>     Please move or remove them before you merge.
>     Aborting
>     fatal: cherry-pick failed
>
> Now continuing from the above, things get (slightly) interesting
>
>     $ echo file >.gitignore
>     $ git cherry-pick added
>
> This will replace "file" with the one from the "added" commit, and
> that is because the user marked that the "file" in the working tree
> is expendable.
>
> Files in a working tree controlled by git fall into one of three
> classes.  Tracked files are those that are known to the index and
> appear in "git ls-files" output.  Among the others, ignored files
> are those that .gitignore mechanism says are expendable.  The rest
> are "untracked", possibly containing valuable contents that should
> not be lost as the user may choose to 'git add' them later.
>
> Not just cherry-pick but any merge-related operations, including
> "checkout", follow this semantics.  Untracked files are kept, but
> ignored files are expendable and will be removed if they are in the
> way to complete the operation the user asks.
>
>     $ rm .gitignore
>     $ git checkout master
>     error: The following untracked working tree files would be overwritten by checkout:
>             file
>     Please move or remove them before you switch branches.
>     Aborting
>
>     $ echo file >.gitignore
>     $ git checkout master
>     ... this should succeed, removing "file" whose contents were
>     ... marked expendable.
>
> Of course, after switching to 'master' (or cherry-picking 'added'),
> the project now cares about the 'file'.  After all, it bothered to
> add it to keep track of the changes to its contents.  So it is
> recommended that you would adjust the contents of .gitignore so that
> it no longer is marked as expendable.

^ permalink raw reply	[relevance 0%]

* Re: [suggestion] Fail cherry-pick if it overwrites untracked files with the matching file names
  @ 2022-10-15 18:35  4% ` Junio C Hamano
  2022-10-15 19:09  0%   ` Rupinderjeet Singh
    0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2022-10-15 18:35 UTC (permalink / raw)
  To: Rupinderjeet Singh; +Cc: git

If the situation is about cherry-picking a commit that adds a new
file F to a checkout of another commit that lacks the file F, I
think the command is working exactly as designed.

    $ git init
    $ git commit -m 'initial' --allow-empty
    $ git tag initial
    $ date >file
    $ git add file
    $ git commit -m 'add file'
    $ git tag added
    $ git checkout -b second initial
    ... at this point we are back to the original state
    ... without 'file'
    $ >file
    ... the file is untracked with precious contents
    ... and the presence of it stops a cherry-pick that clobbers it
    $ git cherry-pick added
    error: The following untracked working tree files would be overwritten by merge:
            file
    Please move or remove them before you merge.
    Aborting
    fatal: cherry-pick failed

Now continuing from the above, things get (slightly) interesting

    $ echo file >.gitignore
    $ git cherry-pick added

This will replace "file" with the one from the "added" commit, and
that is because the user marked that the "file" in the working tree
is expendable.

Files in a working tree controlled by git fall into one of three
classes.  Tracked files are those that are known to the index and
appear in "git ls-files" output.  Among the others, ignored files
are those that .gitignore mechanism says are expendable.  The rest
are "untracked", possibly containing valuable contents that should
not be lost as the user may choose to 'git add' them later.

Not just cherry-pick but any merge-related operations, including
"checkout", follow this semantics.  Untracked files are kept, but
ignored files are expendable and will be removed if they are in the
way to complete the operation the user asks.

    $ rm .gitignore
    $ git checkout master
    error: The following untracked working tree files would be overwritten by checkout:
            file
    Please move or remove them before you switch branches.
    Aborting

    $ echo file >.gitignore
    $ git checkout master
    ... this should succeed, removing "file" whose contents were
    ... marked expendable.

Of course, after switching to 'master' (or cherry-picking 'added'),
the project now cares about the 'file'.  After all, it bothered to
add it to keep track of the changes to its contents.  So it is
recommended that you would adjust the contents of .gitignore so that
it no longer is marked as expendable.

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 0/3] [RFC] tests: add test_todo() for known failures
  2022-10-06 19:28  2% ` Ævar Arnfjörð Bjarmason
@ 2022-10-07 13:26  0%   ` Phillip Wood
  0 siblings, 0 replies; 200+ results
From: Phillip Wood @ 2022-10-07 13:26 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason,
	Phillip Wood via GitGitGadget
  Cc: git, Derrick Stolee, Junio C Hamano

Hi Ævar

On 06/10/2022 20:28, Ævar Arnfjörð Bjarmason wrote:
> 
> On Thu, Oct 06 2022, Phillip Wood via GitGitGadget wrote:
> 
>> test_todo() is intended as a fine grained alternative to
>> test_expect_failure(). Rather than marking the whole test as failing
>> test_todo() is used to mark individual failing commands within a test. This
>> approach to writing failing tests allows us to detect unexpected failures
>> that are hidden by test_expect_failure().
>>
>> This series attempts to keep most of the benefits test_expect_todo()
>> previously proposed by Ævar[1] while being simpler to use.
>>
>> [1]
>> https://lore.kernel.org/git/cover-0.7-00000000000-20220318T002951Z-avarab@gmail.com/
> 
> I like the interface you've got here much better than the one I
> submitted in [1], so much that it's what I tried to write at first :)
> 
> But as you noted in 1/3:
> 
> 	test_todo cannot be used in a subshell.
> 
> Anyway, the core difference between the APIs we proposed for this is
> that you'd do:
> 
> 	test_expect_success 'desc' 'test_todo false'
> 
> Whereas I suggested:
> 
> 	test_expect_todo 'desc' '! false'
> 
> Now, let's pick apart the differences:
> 
>   1. With "test_expect_todo" we're declaring "this is a TODO test" for
>      the test as a whole.
 >
>   2. With your "test_todo" we're not doing that, instead we proceed as
>      normal, and then we might note "we had a TODO" midway through, then
>      at the end we'll spot that we had a TODO test (but this approach
>      won't work with subshells).

Yes, this series avoids adding test_expect_todo and reuses 
test_expect_success as Junio suggested [1]. By using a new toplevel form 
your series was able to handle test_todo in a subshell because it did 
not need any global state related to whether a test_todo had passed/failed.

The series here uses a variable to check if any test_todo statements 
were present in a test that ran successfully and that does not work if 
the test_todo happens in a subshell because the variable in the parent 
is not updated. First we need to consider whether there is any need for 
supporting test_todo in a subshell. If there is then a possible 
alternative is to store the state in a file. That would add the cost of 
"test -f" to test_expect_success but our tests do so much i/o that a 
single extra stat should not be noticeable. In particular I believe a 
file based approach can be implemented without adding any new processes 
to tests that do not use test_todo.

>   3. Your "test_todo" is basically a "let's let this pass", whereas mine
>      was a helper which exhaustively declared *what* the bad behavior
>      was.
> 
>      (Although some of yours seems to be midway between the two,
>      i.e. https://lore.kernel.org/git/c3f4a79c-2dc6-fbf4-fc61-591ebf417682@dunelm.org.uk/)

The only thing my series tries to assert is that a test_todo command is 
not failing due to a usage error so that it can catch buggy tests. 
Beyond that it does not care what the reason for failure is.

> I think the main critique you and Junio had of my series was to do with
> #3, i.e. that it was a hassle to exhaustively declare what the behavior
> is & should be, as you note in:

That was certainly my main objection, but Junio was not that keen on 
adding test_expect_todo [1]

> https://lore.kernel.org/git/c3f4a79c-2dc6-fbf4-fc61-591ebf417682@dunelm.org.uk/
> 
> 	test_todo \
> 		--want "test_must_fail git" \
> 		--reset "git reset --hard" \
> 		--expect git \
> 		-- \
> 		rm d/f &&
> 
> That's fair enough, maybe that's not worth the effort. The reason I
> initially hacked this up was because I'd noticed a behavior difference
> in a command that was only revealed in a test_expect_failure block, but
> because we didn't assert *what* the behavior was we didn't notice.
> 
> My version (if fully used) would spot that, but that's because of how I
> wrote the "tes_todo", it's orthagonal to #1 and #2 above.
> 
> So I don't see why we wouldn't instead have a "test_expect_todo" and
> just write the helper differently, or have a mode where it's less
> strict, and (if we find it worthwhile) one where it's more strict.

I think there is a question of whether we need a new toplevel 
test_expect_todo - why would we add it if we can just reuse 
test_expect_success? That way when a test failure is fixed all that 
needs to be done is to remove the test_todo calls.

Best Wishes

Phillip

[1] https://lore.kernel.org/git/xmqq8rt77zp7.fsf@gitster.g/


> I rebased my
> https://lore.kernel.org/git/patch-1.7-4624abc2591-20220318T002951Z-avarab@gmail.com/
> just now and applied the below on top, which seems to me to give you
> pretty much the end result you want, the only difference is that my
> version will also work in subshells (see the t2500 one):
> 
> diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
> index de1ec89007d..fe47e503bd1 100755
> --- a/t/t1091-sparse-checkout-builtin.sh
> +++ b/t/t1091-sparse-checkout-builtin.sh
> @@ -468,7 +468,7 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with unmerged stat
>   	git -C unmerged sparse-checkout disable
>   '
>   
> -test_expect_failure 'sparse-checkout reapply' '
> +test_expect_todo 'sparse-checkout reapply' '
>   	git clone repo tweak &&
>   
>   	echo dirty >tweak/deep/deeper2/a &&
> @@ -502,11 +502,11 @@ test_expect_failure 'sparse-checkout reapply' '
>   
>   	# NEEDSWORK: We are asking to update a file outside of the
>   	# sparse-checkout cone, but this is no longer allowed.
> -	git -C tweak add folder1/a &&
> +	test_todo git -C tweak add folder1/a &&
>   	git -C tweak sparse-checkout reapply 2>err &&
> -	test_must_be_empty err &&
> +	test_todo test_must_be_empty err &&
>   	test_path_is_missing tweak/deep/deeper2/a &&
> -	test_path_is_missing tweak/folder1/a &&
> +	test_todo test_path_is_missing tweak/folder1/a &&
>   
>   	git -C tweak sparse-checkout disable
>   '
> diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
> index 5c0bf4d21fc..db7c72d38d8 100755
> --- a/t/t2500-untracked-overwriting.sh
> +++ b/t/t2500-untracked-overwriting.sh
> @@ -167,7 +167,7 @@ test_expect_success 'git rebase fast forwarding and untracked files' '
>   	)
>   '
>   
> -test_expect_failure 'git rebase --autostash and untracked files' '
> +test_expect_todo 'git rebase --autostash and untracked files' '
>   	test_setup_sequencing rebase_autostash_and_untracked &&
>   	(
>   		cd sequencing_rebase_autostash_and_untracked &&
> @@ -176,7 +176,7 @@ test_expect_failure 'git rebase --autostash and untracked files' '
>   		mkdir filler &&
>   		echo precious >filler/file &&
>   		cp filler/file expect &&
> -		git rebase --autostash init &&
> +		test_todo git rebase --autostash init &&
>   		test_path_is_file filler/file
>   	)
>   '
> diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
> index 3b0fa66c33d..b31b6b0f7a0 100755
> --- a/t/t3510-cherry-pick-sequence.sh
> +++ b/t/t3510-cherry-pick-sequence.sh
> @@ -577,7 +577,7 @@ test_expect_success '--continue respects -x in first commit in multi-pick' '
>   	grep "cherry picked from.*$picked" msg
>   '
>   
> -test_expect_failure '--signoff is automatically propagated to resolved conflict' '
> +test_expect_todo '--signoff is automatically propagated to resolved conflict' '
>   	pristine_detach initial &&
>   	test_expect_code 1 git cherry-pick --signoff base..anotherpick &&
>   	echo "c" >foo &&
> @@ -591,7 +591,7 @@ test_expect_failure '--signoff is automatically propagated to resolved conflict'
>   	git cat-file commit HEAD~3 >initial_msg &&
>   	! grep "Signed-off-by:" initial_msg &&
>   	grep "Signed-off-by:" unrelatedpick_msg &&
> -	! grep "Signed-off-by:" picked_msg &&
> +	test_todo ! grep "Signed-off-by:" picked_msg &&
>   	grep "Signed-off-by:" anotherpick_msg
>   '
>   
> diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
> index e74a318ac33..6c7929f5557 100755
> --- a/t/t3600-rm.sh
> +++ b/t/t3600-rm.sh
> @@ -790,7 +790,7 @@ test_expect_success SYMLINKS 'rm across a symlinked leading path (no index)' '
>   	test_path_is_file e/f
>   '
>   
> -test_expect_failure SYMLINKS 'rm across a symlinked leading path (w/ index)' '
> +test_expect_todo SYMLINKS 'rm across a symlinked leading path (w/ index)' '
>   	rm -rf d e &&
>   	mkdir d &&
>   	echo content >d/f &&
> @@ -798,10 +798,10 @@ test_expect_failure SYMLINKS 'rm across a symlinked leading path (w/ index)' '
>   	git commit -m "d/f exists" &&
>   	mv d e &&
>   	ln -s e d &&
> -	test_must_fail git rm d/f &&
> -	git rev-parse --verify :d/f &&
> +	test_todo test_must_fail git rm d/f &&
> +	test_todo git rev-parse --verify :d/f &&
>   	test -h d &&
> -	test_path_is_file e/f
> +	test_todo test_path_is_file e/f
>   '
>   
>   test_expect_success 'setup for testing rm messages' '
> diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
> index ad5c0292794..a6a5a330180 100755
> --- a/t/t4014-format-patch.sh
> +++ b/t/t4014-format-patch.sh
> @@ -165,12 +165,12 @@ test_expect_success 'additional command line cc (ascii)' '
>   	grep "^ *S E Cipient <scipient@example.com>\$" hdrs5
>   '
>   
> -test_expect_failure 'additional command line cc (rfc822)' '
> +test_expect_todo 'additional command line cc (rfc822)' '
>   	git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
>   	git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 &&
>   	sed -e "/^\$/q" patch5 >hdrs5 &&
>   	grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 &&
> -	grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
> +	test_todo grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
>   '
>   
>   test_expect_success 'command line headers' '
> diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
> index f342954de11..9d5706454a5 100644
> --- a/t/test-lib-functions.sh
> +++ b/t/test-lib-functions.sh
> @@ -1049,6 +1049,21 @@ test_must_fail_acceptable () {
>   	esac
>   }
>   
> +test_todo () {
> +	local negate=-ne
> +	local cmp_op=-ne
> +	if test "$1" = "!"
> +	then
> +		negate=t &&
> +		cmp_op=-eq
> +		shift
> +	fi &&
> +	"$@" 2>&7
> +	exit_code=$?
> +	say "test_todo: got $exit_code ${negate:+negated!} from $*"
> +	test "$exit_code" "$cmp_op" 0
> +}
> +
>   # This is not among top-level (test_expect_success | test_expect_failure)
>   # but is a prefix that can be used in the test script, like:
>   #
> 
> 

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 0/3] [RFC] tests: add test_todo() for known failures
  @ 2022-10-06 19:28  2% ` Ævar Arnfjörð Bjarmason
  2022-10-07 13:26  0%   ` Phillip Wood
  0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-10-06 19:28 UTC (permalink / raw)
  To: Phillip Wood via GitGitGadget; +Cc: git, Derrick Stolee, Phillip Wood


On Thu, Oct 06 2022, Phillip Wood via GitGitGadget wrote:

> test_todo() is intended as a fine grained alternative to
> test_expect_failure(). Rather than marking the whole test as failing
> test_todo() is used to mark individual failing commands within a test. This
> approach to writing failing tests allows us to detect unexpected failures
> that are hidden by test_expect_failure().
>
> This series attempts to keep most of the benefits test_expect_todo()
> previously proposed by Ævar[1] while being simpler to use.
>
> [1]
> https://lore.kernel.org/git/cover-0.7-00000000000-20220318T002951Z-avarab@gmail.com/

I like the interface you've got here much better than the one I
submitted in [1], so much that it's what I tried to write at first :)

But as you noted in 1/3:

	test_todo cannot be used in a subshell.

So when we do this:
	
	diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
	index 93d3930d9f6..75b84a09592 100755
	--- a/t/t0000-basic.sh
	+++ b/t/t0000-basic.sh
	@@ -147,7 +147,7 @@ test_expect_success 'subtest: a failing test_todo' '
	 		false
	 	}
	 	test_expect_success "passing test" "true"
	-	test_expect_success "known todo" "test_todo test_false"
	+	test_expect_success "known todo" "(test_todo test_false)"
	 	test_done
	 	EOF
	 	check_sub_test_lib_test failing-test-todo <<-\EOF

We'll get:
	
	+ diff -u failing-test-todo/expect.out failing-test-todo/out
	--- failing-test-todo/expect.out        2022-10-06 19:30:14.093338392 +0000
	+++ failing-test-todo/out       2022-10-06 19:30:14.093338392 +0000
	@@ -1,5 +1,4 @@
	 ok 1 - passing test
	-not ok 2 - known todo # TODO known breakage
	-# still have 1 known breakage(s)
	-# passed all remaining 1 test(s)
	+ok 2 - known todo
	+# passed all 2 test(s)
	 1..2

What I was initially trying to do when I tried this approach was to make
the "test_todo" be the equivalent of a sub-test, i.e. when we encounter
one we'd say "ok N - DESC" for the current test so far, and then an "ok
N+1 - DESC # TODO: $cmd" for the "test_todo" command.

I think I lost the code for that, but I tried hacking something rough up
on top of your series. I don't think it's a viable approach but it works
as long as we don't have a subshell (the "remaining N tests" count is
off, but it's fixable, I just couldn't be bothered for a WIP hack):
	
	diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
	index 93d3930d9f6..7e8e0a54558 100755
	--- a/t/t0000-basic.sh
	+++ b/t/t0000-basic.sh
	@@ -148,14 +148,17 @@ test_expect_success 'subtest: a failing test_todo' '
	 	}
	 	test_expect_success "passing test" "true"
	 	test_expect_success "known todo" "test_todo test_false"
	+	test_expect_success "passing test 2" "true"
	 	test_done
	 	EOF
	 	check_sub_test_lib_test failing-test-todo <<-\EOF
	 	> ok 1 - passing test
	-	> not ok 2 - known todo # TODO known breakage
	+	> not ok 2 - known todo: test_false # TODO known breakage
	+	> ok 3 - known todo (post-test_todo)
	+	> ok 4 - passing test 2
	 	> # still have 1 known breakage(s)
	-	> # passed all remaining 1 test(s)
	-	> 1..2
	+	> # passed all remaining 3 test(s)
	+	> 1..4
	 	EOF
	 '
	 
	@@ -171,7 +174,8 @@ test_expect_success 'subtest: a passing test_todo' '
	 	check_sub_test_lib_test passing-test-todo <<-\EOF
	 	> not ok 1 - pretend we have fixed a test_todo breakage
	 	> #	test_todo test_true
	-	> # failed 1 among 1 test(s)
	+	> # 1 known breakage(s) vanished; please update test(s)
	+	> # failed 1 among remaining 0 test(s)
	 	> 1..1
	 	EOF
	 '
	diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
	index 068a0702809..54365fe202f 100644
	--- a/t/test-lib-functions.sh
	+++ b/t/test-lib-functions.sh
	@@ -826,15 +826,12 @@ test_expect_success () {
	 	then
	 		test -n "$test_skip_test_preamble" ||
	 		say >&3 "expecting success of $TEST_NUMBER.$test_count '$1': $2"
	-		test_todo_=test_expect_success
	+		test_todo_title_="$1"
	+		test_had_todo_=
	 		if test_run_ "$2"
	 		then
	-			if test "$test_todo_" = "todo"
	-			then
	-				test_known_broken_failure_ "$1"
	-			else
	-				test_ok_ "$1"
	-			fi
	+			test_ok_ "$1${test_had_todo_:+ (post-test_todo)}"
	+			test_had_todo_=
	 		else
	 			test_failure_ "$@"
	 		fi
	@@ -1167,12 +1164,26 @@ test_must_fail_helper () {
	 # "test_*" assertions such as test_cmp().
	 
	 test_todo () {
	+	if test -z "$test_todo_title_"
	+	then
	+		BUG 'test_todo: expected a $test_todo_title_'
	+	fi &&
	 	if test "$test_todo_" = "test_expect_failure"
	 	then
	 		BUG "test_todo_ cannot be used inside test_expect_failure"
	+	fi &&
	+	# Tell "test_expect_success" it had a "test_todo"
	+	test_had_todo_=1 &&
	+	# We say that the test up until this point is OK, and emit an "ok .." for it.
	+	test_ok_ "$test_todo_title_" &&
	+	if test_must_fail_helper todo "$@" 2>&7
	+	then
	+		test_known_broken_failure_ "$test_todo_title_: $*" 1>&5 2>&6 &&
	+		test_count=$(($test_count+1))
	+	else
	+		test_known_broken_ok_ "$test_todo_title_: $*" &&
	+		return 1
	 	fi
	-	test_todo_=todo
	-	test_must_fail_helper todo "$@" 2>&7
	 } 7>&2 2>&4
	 
	 # This is not among top-level (test_expect_success | test_expect_failure)

Anyway, the core difference between the APIs we proposed for this is
that you'd do:

	test_expect_success 'desc' 'test_todo false'

Whereas I suggested:

	test_expect_todo 'desc' '! false'

Now, let's pick apart the differences:

 1. With "test_expect_todo" we're declaring "this is a TODO test" for
    the test as a whole.

 2. With your "test_todo" we're not doing that, instead we proceed as
    normal, and then we might note "we had a TODO" midway through, then
    at the end we'll spot that we had a TODO test (but this approach
    won't work with subshells).

 3. Your "test_todo" is basically a "let's let this pass", whereas mine
    was a helper which exhaustively declared *what* the bad behavior
    was.

    (Although some of yours seems to be midway between the two,
    i.e. https://lore.kernel.org/git/c3f4a79c-2dc6-fbf4-fc61-591ebf417682@dunelm.org.uk/)

I think the main critique you and Junio had of my series was to do with
#3, i.e. that it was a hassle to exhaustively declare what the behavior
is & should be, as you note in:
https://lore.kernel.org/git/c3f4a79c-2dc6-fbf4-fc61-591ebf417682@dunelm.org.uk/

	test_todo \
		--want "test_must_fail git" \
		--reset "git reset --hard" \
		--expect git \
		-- \
		rm d/f &&

That's fair enough, maybe that's not worth the effort. The reason I
initially hacked this up was because I'd noticed a behavior difference
in a command that was only revealed in a test_expect_failure block, but
because we didn't assert *what* the behavior was we didn't notice.

My version (if fully used) would spot that, but that's because of how I
wrote the "tes_todo", it's orthagonal to #1 and #2 above.

So I don't see why we wouldn't instead have a "test_expect_todo" and
just write the helper differently, or have a mode where it's less
strict, and (if we find it worthwhile) one where it's more strict.

I rebased my
https://lore.kernel.org/git/patch-1.7-4624abc2591-20220318T002951Z-avarab@gmail.com/
just now and applied the below on top, which seems to me to give you
pretty much the end result you want, the only difference is that my
version will also work in subshells (see the t2500 one):

diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
index de1ec89007d..fe47e503bd1 100755
--- a/t/t1091-sparse-checkout-builtin.sh
+++ b/t/t1091-sparse-checkout-builtin.sh
@@ -468,7 +468,7 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with unmerged stat
 	git -C unmerged sparse-checkout disable
 '
 
-test_expect_failure 'sparse-checkout reapply' '
+test_expect_todo 'sparse-checkout reapply' '
 	git clone repo tweak &&
 
 	echo dirty >tweak/deep/deeper2/a &&
@@ -502,11 +502,11 @@ test_expect_failure 'sparse-checkout reapply' '
 
 	# NEEDSWORK: We are asking to update a file outside of the
 	# sparse-checkout cone, but this is no longer allowed.
-	git -C tweak add folder1/a &&
+	test_todo git -C tweak add folder1/a &&
 	git -C tweak sparse-checkout reapply 2>err &&
-	test_must_be_empty err &&
+	test_todo test_must_be_empty err &&
 	test_path_is_missing tweak/deep/deeper2/a &&
-	test_path_is_missing tweak/folder1/a &&
+	test_todo test_path_is_missing tweak/folder1/a &&
 
 	git -C tweak sparse-checkout disable
 '
diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
index 5c0bf4d21fc..db7c72d38d8 100755
--- a/t/t2500-untracked-overwriting.sh
+++ b/t/t2500-untracked-overwriting.sh
@@ -167,7 +167,7 @@ test_expect_success 'git rebase fast forwarding and untracked files' '
 	)
 '
 
-test_expect_failure 'git rebase --autostash and untracked files' '
+test_expect_todo 'git rebase --autostash and untracked files' '
 	test_setup_sequencing rebase_autostash_and_untracked &&
 	(
 		cd sequencing_rebase_autostash_and_untracked &&
@@ -176,7 +176,7 @@ test_expect_failure 'git rebase --autostash and untracked files' '
 		mkdir filler &&
 		echo precious >filler/file &&
 		cp filler/file expect &&
-		git rebase --autostash init &&
+		test_todo git rebase --autostash init &&
 		test_path_is_file filler/file
 	)
 '
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index 3b0fa66c33d..b31b6b0f7a0 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh
@@ -577,7 +577,7 @@ test_expect_success '--continue respects -x in first commit in multi-pick' '
 	grep "cherry picked from.*$picked" msg
 '
 
-test_expect_failure '--signoff is automatically propagated to resolved conflict' '
+test_expect_todo '--signoff is automatically propagated to resolved conflict' '
 	pristine_detach initial &&
 	test_expect_code 1 git cherry-pick --signoff base..anotherpick &&
 	echo "c" >foo &&
@@ -591,7 +591,7 @@ test_expect_failure '--signoff is automatically propagated to resolved conflict'
 	git cat-file commit HEAD~3 >initial_msg &&
 	! grep "Signed-off-by:" initial_msg &&
 	grep "Signed-off-by:" unrelatedpick_msg &&
-	! grep "Signed-off-by:" picked_msg &&
+	test_todo ! grep "Signed-off-by:" picked_msg &&
 	grep "Signed-off-by:" anotherpick_msg
 '
 
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index e74a318ac33..6c7929f5557 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -790,7 +790,7 @@ test_expect_success SYMLINKS 'rm across a symlinked leading path (no index)' '
 	test_path_is_file e/f
 '
 
-test_expect_failure SYMLINKS 'rm across a symlinked leading path (w/ index)' '
+test_expect_todo SYMLINKS 'rm across a symlinked leading path (w/ index)' '
 	rm -rf d e &&
 	mkdir d &&
 	echo content >d/f &&
@@ -798,10 +798,10 @@ test_expect_failure SYMLINKS 'rm across a symlinked leading path (w/ index)' '
 	git commit -m "d/f exists" &&
 	mv d e &&
 	ln -s e d &&
-	test_must_fail git rm d/f &&
-	git rev-parse --verify :d/f &&
+	test_todo test_must_fail git rm d/f &&
+	test_todo git rev-parse --verify :d/f &&
 	test -h d &&
-	test_path_is_file e/f
+	test_todo test_path_is_file e/f
 '
 
 test_expect_success 'setup for testing rm messages' '
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index ad5c0292794..a6a5a330180 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -165,12 +165,12 @@ test_expect_success 'additional command line cc (ascii)' '
 	grep "^ *S E Cipient <scipient@example.com>\$" hdrs5
 '
 
-test_expect_failure 'additional command line cc (rfc822)' '
+test_expect_todo 'additional command line cc (rfc822)' '
 	git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
 	git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 &&
 	sed -e "/^\$/q" patch5 >hdrs5 &&
 	grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 &&
-	grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
+	test_todo grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
 '
 
 test_expect_success 'command line headers' '
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index f342954de11..9d5706454a5 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -1049,6 +1049,21 @@ test_must_fail_acceptable () {
 	esac
 }
 
+test_todo () {
+	local negate=-ne
+	local cmp_op=-ne
+	if test "$1" = "!"
+	then
+		negate=t &&
+		cmp_op=-eq
+		shift
+	fi &&
+	"$@" 2>&7
+	exit_code=$?
+	say "test_todo: got $exit_code ${negate:+negated!} from $*"
+	test "$exit_code" "$cmp_op" 0
+}
+
 # This is not among top-level (test_expect_success | test_expect_failure)
 # but is a prefix that can be used in the test script, like:
 #



^ permalink raw reply related	[relevance 2%]

* [PATCH 2/5] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier
  @ 2022-09-01 13:17 11%   ` Ævar Arnfjörð Bjarmason
    1 sibling, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-09-01 13:17 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Johannes Schindelin, Victoria Dye,
	Ævar Arnfjörð Bjarmason

Define the variables that make up TEST_OBJS earlier, and don't go back
& forth in their definition. Before we'd first append $X to
$(TEST_PROGRAMS), and then substitute $X back out of it to define
$(TEST_OBJS). Let's instead add a new $(TEST_PROGRAM_OBJS) variable,
which avoids this needless back & forth substitution.

See daa99a91729 (Makefile: make sure test helpers are rebuilt when
headers change, 2010-01-26) for how we ended up with the original
$(TEST_OBJS).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 Makefile | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/Makefile b/Makefile
index b2304aa93a3..0d6b2caa7d9 100644
--- a/Makefile
+++ b/Makefile
@@ -617,7 +617,8 @@ SCRIPT_PYTHON =
 SCRIPT_SH =
 SCRIPT_LIB =
 TEST_BUILTINS_OBJS =
-TEST_OBJS =
+TEST_PROGRAMS =
+TEST_PROGRAM_OBJS =
 TEST_PROGRAMS_NEED_X =
 THIRD_PARTY_SOURCES =
 
@@ -794,6 +795,7 @@ TEST_BUILTINS_OBJS += test-wildmatch.o
 TEST_BUILTINS_OBJS += test-windows-named-pipe.o
 TEST_BUILTINS_OBJS += test-write-cache.o
 TEST_BUILTINS_OBJS += test-xml-encode.o
+TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
 
 # Do not add more tests here unless they have extra dependencies. Add
 # them in TEST_BUILTINS_OBJS above.
@@ -801,6 +803,9 @@ TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-tool
 
 TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
+all:: $(TEST_PROGRAMS)
+TEST_PROGRAM_OBJS += $(patsubst %,t/helper/%.o,$(TEST_PROGRAMS_NEED_X))
+.PRECIOUS: $(TEST_PROGRAM_OBJS)
 
 # List built-in command $C whose implementation cmd_$C() is not in
 # builtin/$C.o but is linked in as part of some other command.
@@ -2537,10 +2542,8 @@ REFTABLE_TEST_OBJS += reftable/stack_test.o
 REFTABLE_TEST_OBJS += reftable/test_framework.o
 REFTABLE_TEST_OBJS += reftable/tree_test.o
 
-TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
-
 .PHONY: test-objs
-test-objs: $(TEST_OBJS)
+test-objs: $(TEST_PROGRAM_OBJS)
 
 GIT_OBJS += $(LIB_OBJS)
 GIT_OBJS += $(BUILTIN_OBJS)
@@ -2551,7 +2554,7 @@ git-objs: $(GIT_OBJS)
 
 OBJECTS += $(GIT_OBJS)
 OBJECTS += $(PROGRAM_OBJS)
-OBJECTS += $(TEST_OBJS)
+OBJECTS += $(TEST_PROGRAM_OBJS)
 OBJECTS += $(XDIFF_OBJS)
 OBJECTS += $(FUZZ_OBJS)
 OBJECTS += $(REFTABLE_OBJS) $(REFTABLE_TEST_OBJS)
@@ -3060,7 +3063,7 @@ endif
 
 test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))
 
-all:: $(TEST_PROGRAMS) $(test_bindir_programs)
+all:: $(test_bindir_programs)
 
 bin-wrappers/%: wrap-for-bin.sh
 	$(call mkdir_p_parent_template)
@@ -3086,8 +3089,6 @@ perf: all
 
 .PHONY: test perf
 
-.PRECIOUS: $(TEST_OBJS)
-
 t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) $(REFTABLE_TEST_LIB)
-- 
2.37.3.1426.g360dd7cf8ca


^ permalink raw reply related	[relevance 11%]

* [PATCH v2] t64xx: convert 'test_create_repo' to 'git init'
  2022-08-20 22:33  1% [PATCH] t64??: convert 'test_create_repo' to 'git init' Elijah Newren via GitGitGadget
@ 2022-08-26  3:49  1% ` Elijah Newren via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2022-08-26  3:49 UTC (permalink / raw)
  To: git; +Cc: Johannes Schindelin, Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

Convert the merge-specific tests (those in the t64xx range) over to
using 'git init' instead of 'test_create_repo'.

Reviewed-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
    t64xx: convert 'test_create_repo' to 'git init'
    
    As promised[1].
    
    This patch merges cleanly with main & next & seen, and there are no
    current in-flight topics that add a test_create_repo call to the t64xx
    range of tests. This patch also gets rid of 37% of the test_create_repo
    calls in the entire testsuite.
    
    Changes since v1:
    
     * Tweaked commit message
     * Added Dscho's Reviewed-by
    
    [1]
    https://lore.kernel.org/git/CABPp-BEcojvfeuhp7rSi-O+9oEu4KpwPDwbKS-MiD1qCKde-CA@mail.gmail.com/

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1303%2Fnewren%2Fnuke_test_create_repo_in_merge_tests-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1303/newren/nuke_test_create_repo_in_merge_tests-v2
Pull-Request: https://github.com/git/git/pull/1303

Range-diff vs v1:

 1:  ad1c38cc1eb ! 1:  cd2ebd98e3c t64??: convert 'test_create_repo' to 'git init'
     @@ Metadata
      Author: Elijah Newren <newren@gmail.com>
      
       ## Commit message ##
     -    t64??: convert 'test_create_repo' to 'git init'
     +    t64xx: convert 'test_create_repo' to 'git init'
      
     -    As promised[1], convert the merge-specific tests over to using 'git
     -    init' instead of 'test_create_repo'.
     -
     -    [1] https://lore.kernel.org/git/CABPp-BEcojvfeuhp7rSi-O+9oEu4KpwPDwbKS-MiD1qCKde-CA@mail.gmail.com/
     +    Convert the merge-specific tests (those in the t64xx range) over to
     +    using 'git init' instead of 'test_create_repo'.
      
     +    Reviewed-by: Johannes Schindelin <johannes.schindelin@gmx.de>
          Signed-off-by: Elijah Newren <newren@gmail.com>
      
       ## t/t6400-merge-df.sh ##


 t/t6400-merge-df.sh                      |   2 +-
 t/t6406-merge-attr.sh                    |   4 +-
 t/t6416-recursive-corner-cases.sh        |  38 +++----
 t/t6421-merge-partial-clone.sh           |   2 +-
 t/t6422-merge-rename-corner-cases.sh     |  38 +++----
 t/t6423-merge-rename-directories.sh      | 138 +++++++++++------------
 t/t6426-merge-skip-unneeded-updates.sh   |  16 +--
 t/t6427-diff3-conflict-markers.sh        |  10 +-
 t/t6428-merge-conflicts-sparse.sh        |   2 +-
 t/t6429-merge-sequence-rename-caching.sh |  14 +--
 t/t6437-submodule-merge.sh               |   8 +-
 11 files changed, 136 insertions(+), 136 deletions(-)

diff --git a/t/t6400-merge-df.sh b/t/t6400-merge-df.sh
index 57a67cf3627..3de4ef6bd9e 100755
--- a/t/t6400-merge-df.sh
+++ b/t/t6400-merge-df.sh
@@ -126,7 +126,7 @@ test_expect_success 'Simple merge in repo with interesting pathnames' '
 	#     foo/bar-2/baz
 	# The fact that foo/bar-2 appears between foo/bar and foo/bar/baz
 	# can trip up some codepaths, and is the point of this test.
-	test_create_repo name-ordering &&
+	git init name-ordering &&
 	(
 		cd name-ordering &&
 
diff --git a/t/t6406-merge-attr.sh b/t/t6406-merge-attr.sh
index 99abefd44b9..8650a88c40a 100755
--- a/t/t6406-merge-attr.sh
+++ b/t/t6406-merge-attr.sh
@@ -162,8 +162,8 @@ test_expect_success 'custom merge backend' '
 '
 
 test_expect_success 'up-to-date merge without common ancestor' '
-	test_create_repo repo1 &&
-	test_create_repo repo2 &&
+	git init repo1 &&
+	git init repo2 &&
 	test_tick &&
 	(
 		cd repo1 &&
diff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh
index 690c8482b13..17b54d625d0 100755
--- a/t/t6416-recursive-corner-cases.sh
+++ b/t/t6416-recursive-corner-cases.sh
@@ -19,7 +19,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 #
 
 test_expect_success 'setup basic criss-cross + rename with no modifications' '
-	test_create_repo basic-rename &&
+	git init basic-rename &&
 	(
 		cd basic-rename &&
 
@@ -85,7 +85,7 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '
 #
 
 test_expect_success 'setup criss-cross + rename merges with basic modification' '
-	test_create_repo rename-modify &&
+	git init rename-modify &&
 	(
 		cd rename-modify &&
 
@@ -160,7 +160,7 @@ test_expect_success 'merge criss-cross + rename merges with basic modification'
 #
 
 test_expect_success 'setup differently handled merges of rename/add conflict' '
-	test_create_repo rename-add &&
+	git init rename-add &&
 	(
 		cd rename-add &&
 
@@ -324,7 +324,7 @@ test_expect_success 'git detects differently handled merges conflict, swapped' '
 # Merging commits D & E should result in modify/delete conflict.
 
 test_expect_success 'setup criss-cross + modify/delete resolved differently' '
-	test_create_repo modify-delete &&
+	git init modify-delete &&
 	(
 		cd modify-delete &&
 
@@ -499,7 +499,7 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev
 #
 
 test_expect_success 'setup differently handled merges of directory/file conflict' '
-	test_create_repo directory-file &&
+	git init directory-file &&
 	(
 		cd directory-file &&
 
@@ -867,7 +867,7 @@ test_expect_failure 'merge of D2 & E4 merges a2s & reports conflict for a/file'
 # but that may cancel out at the final merge stage".
 
 test_expect_success 'setup rename/rename(1to2)/modify followed by what looks like rename/rename(2to1)/modify' '
-	test_create_repo rename-squared-squared &&
+	git init rename-squared-squared &&
 	(
 		cd rename-squared-squared &&
 
@@ -944,7 +944,7 @@ test_expect_success 'handle rename/rename(1to2)/modify followed by what looks li
 # content merge handled.
 
 test_expect_success 'setup criss-cross + rename/rename/add-source + modify/modify' '
-	test_create_repo rename-rename-add-source &&
+	git init rename-rename-add-source &&
 	(
 		cd rename-rename-add-source &&
 
@@ -1032,7 +1032,7 @@ test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '
 # base of B & C needs to not delete B:c for that to work, though...
 
 test_expect_success 'setup criss-cross+rename/rename/add-dest + simple modify' '
-	test_create_repo rename-rename-add-dest &&
+	git init rename-rename-add-dest &&
 	(
 		cd rename-rename-add-dest &&
 
@@ -1111,7 +1111,7 @@ test_expect_success 'virtual merge base handles rename/rename(1to2)/add-dest' '
 # git detect it?
 
 test_expect_success 'setup symlink modify/modify' '
-	test_create_repo symlink-modify-modify &&
+	git init symlink-modify-modify &&
 	(
 		cd symlink-modify-modify &&
 
@@ -1178,7 +1178,7 @@ test_expect_merge_algorithm failure success 'check symlink modify/modify' '
 # git detect it?
 
 test_expect_success 'setup symlink add/add' '
-	test_create_repo symlink-add-add &&
+	git init symlink-add-add &&
 	(
 		cd symlink-add-add &&
 
@@ -1244,11 +1244,11 @@ test_expect_merge_algorithm failure success 'check symlink add/add' '
 # git detect it?
 
 test_expect_success 'setup submodule modify/modify' '
-	test_create_repo submodule-modify-modify &&
+	git init submodule-modify-modify &&
 	(
 		cd submodule-modify-modify &&
 
-		test_create_repo submod &&
+		git init submod &&
 		(
 			cd submod &&
 			touch file-A &&
@@ -1332,11 +1332,11 @@ test_expect_merge_algorithm failure success 'check submodule modify/modify' '
 # git detect it?
 
 test_expect_success 'setup submodule add/add' '
-	test_create_repo submodule-add-add &&
+	git init submodule-add-add &&
 	(
 		cd submodule-add-add &&
 
-		test_create_repo submod &&
+		git init submod &&
 		(
 			cd submod &&
 			touch file-A &&
@@ -1419,11 +1419,11 @@ test_expect_merge_algorithm failure success 'check submodule add/add' '
 # This is an obvious add/add conflict for 'path'.  Can git detect it?
 
 test_expect_success 'setup conflicting entry types (submodule vs symlink)' '
-	test_create_repo submodule-symlink-add-add &&
+	git init submodule-symlink-add-add &&
 	(
 		cd submodule-symlink-add-add &&
 
-		test_create_repo path &&
+		git init path &&
 		(
 			cd path &&
 			touch file-B &&
@@ -1494,7 +1494,7 @@ test_expect_merge_algorithm failure success 'check conflicting entry types (subm
 # This is an obvious add/add mode conflict.  Can git detect it?
 
 test_expect_success 'setup conflicting modes for regular file' '
-	test_create_repo regular-file-mode-conflict &&
+	git init regular-file-mode-conflict &&
 	(
 		cd regular-file-mode-conflict &&
 
@@ -1571,7 +1571,7 @@ test_expect_failure 'check conflicting modes for regular file' '
 #   to ensure that we handle it as well as practical.
 
 test_expect_success 'setup nested conflicts' '
-	test_create_repo nested_conflicts &&
+	git init nested_conflicts &&
 	(
 		cd nested_conflicts &&
 
@@ -1757,7 +1757,7 @@ test_expect_success 'check nested conflicts' '
 #   have three levels of conflict markers.  Can we distinguish all three?
 
 test_expect_success 'setup virtual merge base with nested conflicts' '
-	test_create_repo virtual_merge_base_has_nested_conflicts &&
+	git init virtual_merge_base_has_nested_conflicts &&
 	(
 		cd virtual_merge_base_has_nested_conflicts &&
 
diff --git a/t/t6421-merge-partial-clone.sh b/t/t6421-merge-partial-clone.sh
index 36bcd7c3280..5413e5dd9d6 100755
--- a/t/t6421-merge-partial-clone.sh
+++ b/t/t6421-merge-partial-clone.sh
@@ -31,7 +31,7 @@ test_description="limiting blob downloads when merging with partial clones"
 
 test_setup_repo () {
 	test -d server && return
-	test_create_repo server &&
+	git init server &&
 	(
 		cd server &&
 
diff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh
index 9b65768aed6..346253c7c88 100755
--- a/t/t6422-merge-rename-corner-cases.sh
+++ b/t/t6422-merge-rename-corner-cases.sh
@@ -11,7 +11,7 @@ TEST_PASSES_SANITIZE_LEAK=true
 . "$TEST_DIRECTORY"/lib-merge.sh
 
 test_setup_rename_delete_untracked () {
-	test_create_repo rename-delete-untracked &&
+	git init rename-delete-untracked &&
 	(
 		cd rename-delete-untracked &&
 
@@ -56,7 +56,7 @@ test_expect_success "Does git preserve Gollum's precious artifact?" '
 # We should be able to merge B & C cleanly
 
 test_setup_rename_modify_add_source () {
-	test_create_repo rename-modify-add-source &&
+	git init rename-modify-add-source &&
 	(
 		cd rename-modify-add-source &&
 
@@ -96,7 +96,7 @@ test_expect_failure 'rename/modify/add-source conflict resolvable' '
 '
 
 test_setup_break_detection_1 () {
-	test_create_repo break-detection-1 &&
+	git init break-detection-1 &&
 	(
 		cd break-detection-1 &&
 
@@ -144,7 +144,7 @@ test_expect_failure 'conflict caused if rename not detected' '
 '
 
 test_setup_break_detection_2 () {
-	test_create_repo break-detection-2 &&
+	git init break-detection-2 &&
 	(
 		cd break-detection-2 &&
 
@@ -192,7 +192,7 @@ test_expect_failure 'missed conflict if rename not detected' '
 #   Commit C: rename a->b, add unrelated a
 
 test_setup_break_detection_3 () {
-	test_create_repo break-detection-3 &&
+	git init break-detection-3 &&
 	(
 		cd break-detection-3 &&
 
@@ -268,7 +268,7 @@ test_expect_failure 'detect rename/add-source and preserve all data, merge other
 '
 
 test_setup_rename_directory () {
-	test_create_repo rename-directory-$1 &&
+	git init rename-directory-$1 &&
 	(
 		cd rename-directory-$1 &&
 
@@ -386,7 +386,7 @@ test_expect_success 'rename/directory conflict + content merge conflict' '
 '
 
 test_setup_rename_directory_2 () {
-	test_create_repo rename-directory-2 &&
+	git init rename-directory-2 &&
 	(
 		cd rename-directory-2 &&
 
@@ -445,7 +445,7 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '
 #   Commit B: modify a, add different b
 
 test_setup_rename_with_content_merge_and_add () {
-	test_create_repo rename-with-content-merge-and-add-$1 &&
+	git init rename-with-content-merge-and-add-$1 &&
 	(
 		cd rename-with-content-merge-and-add-$1 &&
 
@@ -570,7 +570,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way'
 #   * Nothing else should be present.  Is anything?
 
 test_setup_rename_rename_2to1 () {
-	test_create_repo rename-rename-2to1 &&
+	git init rename-rename-2to1 &&
 	(
 		cd rename-rename-2to1 &&
 
@@ -642,7 +642,7 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '
 #   Commit B: rename a->b
 #   Commit C: rename a->c
 test_setup_rename_rename_1to2 () {
-	test_create_repo rename-rename-1to2 &&
+	git init rename-rename-1to2 &&
 	(
 		cd rename-rename-1to2 &&
 
@@ -700,7 +700,7 @@ test_expect_success 'merge has correct working tree contents' '
 # Merging of B & C should NOT be clean; there's a rename/rename conflict
 
 test_setup_rename_rename_1to2_add_source_1 () {
-	test_create_repo rename-rename-1to2-add-source-1 &&
+	git init rename-rename-1to2-add-source-1 &&
 	(
 		cd rename-rename-1to2-add-source-1 &&
 
@@ -748,7 +748,7 @@ test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge'
 '
 
 test_setup_rename_rename_1to2_add_source_2 () {
-	test_create_repo rename-rename-1to2-add-source-2 &&
+	git init rename-rename-1to2-add-source-2 &&
 	(
 		cd rename-rename-1to2-add-source-2 &&
 
@@ -794,7 +794,7 @@ test_expect_failure 'rename/rename/add-source still tracks new a file' '
 '
 
 test_setup_rename_rename_1to2_add_dest () {
-	test_create_repo rename-rename-1to2-add-dest &&
+	git init rename-rename-1to2-add-dest &&
 	(
 		cd rename-rename-1to2-add-dest &&
 
@@ -874,7 +874,7 @@ test_expect_success 'rename/rename/add-dest merge still knows about conflicting
 #   Expected: CONFLICT (rename/add/delete), two-way merged bar
 
 test_setup_rad () {
-	test_create_repo rad &&
+	git init rad &&
 	(
 		cd rad &&
 		echo "original file" >foo &&
@@ -946,7 +946,7 @@ test_expect_merge_algorithm failure success 'rad-check: rename/add/delete confli
 #   Expected: CONFLICT (rename/rename/delete/delete), two-way merged baz
 
 test_setup_rrdd () {
-	test_create_repo rrdd &&
+	git init rrdd &&
 	(
 		cd rrdd &&
 		echo foo >foo &&
@@ -1022,7 +1022,7 @@ test_expect_merge_algorithm failure success 'rrdd-check: rename/rename(2to1)/del
 #             multi-way merged contents found in two, four, six
 
 test_setup_mod6 () {
-	test_create_repo mod6 &&
+	git init mod6 &&
 	(
 		cd mod6 &&
 		test_seq 11 19 >one &&
@@ -1160,7 +1160,7 @@ test_conflicts_with_adds_and_renames() {
 	#      tree
 	test_setup_collision_conflict () {
 	#test_expect_success "setup simple $sideL/$sideR conflict" '
-		test_create_repo simple_${sideL}_${sideR} &&
+		git init simple_${sideL}_${sideR} &&
 		(
 			cd simple_${sideL}_${sideR} &&
 
@@ -1308,7 +1308,7 @@ test_conflicts_with_adds_and_renames add    add
 #   So, we have four different conflicting files that all end up at path
 #   'three'.
 test_setup_nested_conflicts_from_rename_rename () {
-	test_create_repo nested_conflicts_from_rename_rename &&
+	git init nested_conflicts_from_rename_rename &&
 	(
 		cd nested_conflicts_from_rename_rename &&
 
@@ -1417,7 +1417,7 @@ test_expect_success 'check nested conflicts from rename/rename(2to1)' '
 #   Expected: CONFLICT(rename/rename) message, three unstaged entries in the
 #             index, and contents of orig-[AB] at path orig-[AB]
 test_setup_rename_rename_1_to_2_binary () {
-	test_create_repo rename_rename_1_to_2_binary &&
+	git init rename_rename_1_to_2_binary &&
 	(
 		cd rename_rename_1_to_2_binary &&
 
diff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh
index 99baf77cbfd..a4941878fe2 100755
--- a/t/t6423-merge-rename-directories.sh
+++ b/t/t6423-merge-rename-directories.sh
@@ -40,7 +40,7 @@ test_description="recursive merge with directory renames"
 #   Expected: y/{b,c,d,e/f}
 
 test_setup_1a () {
-	test_create_repo 1a &&
+	git init 1a &&
 	(
 		cd 1a &&
 
@@ -106,7 +106,7 @@ test_expect_success '1a: Simple directory rename detection' '
 #   Expected: y/{b,c,d,e}
 
 test_setup_1b () {
-	test_create_repo 1b &&
+	git init 1b &&
 	(
 		cd 1b &&
 
@@ -169,7 +169,7 @@ test_expect_success '1b: Merge a directory with another' '
 #   Expected: y/{b,c,d}  (because x/d -> z/d -> y/d)
 
 test_setup_1c () {
-	test_create_repo 1c &&
+	git init 1c &&
 	(
 		cd 1c &&
 
@@ -232,7 +232,7 @@ test_expect_success '1c: Transitive renaming' '
 #         y/wham_1 & z/wham_2 should too...giving us a conflict.
 
 test_setup_1d () {
-	test_create_repo 1d &&
+	git init 1d &&
 	(
 		cd 1d &&
 
@@ -328,7 +328,7 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict'
 #   Expected: y/{newb,newc,d}
 
 test_setup_1e () {
-	test_create_repo 1e &&
+	git init 1e &&
 	(
 		cd 1e &&
 
@@ -387,7 +387,7 @@ test_expect_success '1e: Renamed directory, with all files being renamed too' '
 #   Expected: y/{b,c}, x/{d,e,f,g}
 
 test_setup_1f () {
-	test_create_repo 1f &&
+	git init 1f &&
 	(
 		cd 1f &&
 
@@ -476,7 +476,7 @@ test_expect_success '1f: Split a directory into two other directories' '
 #   Commit B: z/{b,c,d}
 #   Expected: y/b, w/c, z/d, with warning about z/ -> (y/ vs. w/) conflict
 test_setup_2a () {
-	test_create_repo 2a &&
+	git init 2a &&
 	(
 		cd 2a &&
 
@@ -538,7 +538,7 @@ test_expect_success '2a: Directory split into two on one side, with equal number
 #   Commit B: z/{b,c}, x/d
 #   Expected: y/b, w/c, x/d; No warning about z/ -> (y/ vs. w/) conflict
 test_setup_2b () {
-	test_create_repo 2b &&
+	git init 2b &&
 	(
 		cd 2b &&
 
@@ -620,7 +620,7 @@ test_expect_success '2b: Directory split into two on one side, with equal number
 #   Commit B: y/{b,c}, x/d
 #   Expected: y/{b,c}, x/d
 test_setup_3a () {
-	test_create_repo 3a &&
+	git init 3a &&
 	(
 		cd 3a &&
 
@@ -684,7 +684,7 @@ test_expect_success '3a: Avoid implicit rename if involved as source on other si
 #         end up with CONFLICT:(z/d -> y/d vs. x/d vs. w/d), i.e. a
 #         rename/rename/rename(1to3) conflict, which is just weird.
 test_setup_3b () {
-	test_create_repo 3b &&
+	git init 3b &&
 	(
 		cd 3b &&
 
@@ -807,7 +807,7 @@ test_expect_success '3b: Avoid implicit rename if involved as source on current
 #   NOTE: Even though most files from z moved to y, we don't want f to follow.
 
 test_setup_4a () {
-	test_create_repo 4a &&
+	git init 4a &&
 	(
 		cd 4a &&
 
@@ -896,7 +896,7 @@ test_expect_success '4a: Directory split, with original directory still present'
 #         index.
 
 test_setup_5a () {
-	test_create_repo 5a &&
+	git init 5a &&
 	(
 		cd 5a &&
 
@@ -971,7 +971,7 @@ test_expect_success '5a: Merge directories, other side adds files to original an
 #         back to git behavior without the directory rename detection.
 
 test_setup_5b () {
-	test_create_repo 5b &&
+	git init 5b &&
 	(
 		cd 5b &&
 
@@ -1048,7 +1048,7 @@ test_expect_success '5b: Rename/delete in order to get add/add/add conflict' '
 #             though, because it doesn't have anything in the way.
 
 test_setup_5c () {
-	test_create_repo 5c &&
+	git init 5c &&
 	(
 		cd 5c &&
 
@@ -1138,7 +1138,7 @@ test_expect_success '5c: Transitive rename would cause rename/rename/rename/add/
 #         directory rename detection for z/f -> y/f.
 
 test_setup_5d () {
-	test_create_repo 5d &&
+	git init 5d &&
 	(
 		cd 5d &&
 
@@ -1239,7 +1239,7 @@ test_expect_success '5d: Directory/file/file conflict due to directory rename' '
 #         it is also involved in a rename/delete conflict.
 
 test_setup_6a () {
-	test_create_repo 6a &&
+	git init 6a &&
 	(
 		cd 6a &&
 
@@ -1337,7 +1337,7 @@ test_expect_success '6a: Tricky rename/delete' '
 #         the behavior on testcases 6b2 and 8e, and introduced this 6b1 testcase.
 
 test_setup_6b1 () {
-	test_create_repo 6b1 &&
+	git init 6b1 &&
 	(
 		cd 6b1 &&
 
@@ -1415,7 +1415,7 @@ test_expect_merge_algorithm failure success '6b1: Same renames done on both side
 #         the z/ -> y/ rename.
 
 test_setup_6b2 () {
-	test_create_repo 6b2 &&
+	git init 6b2 &&
 	(
 		cd 6b2 &&
 
@@ -1479,7 +1479,7 @@ test_expect_merge_algorithm failure success '6b2: Same rename done on both sides
 #         "accidentally detect a rename" and give us y/{b,c,d}.
 
 test_setup_6c () {
-	test_create_repo 6c &&
+	git init 6c &&
 	(
 		cd 6c &&
 
@@ -1542,7 +1542,7 @@ test_expect_success '6c: Rename only done on same side' '
 #         doesn't "accidentally detect a rename" and give us y/{b,c,d}.
 
 test_setup_6d () {
-	test_create_repo 6d &&
+	git init 6d &&
 	(
 		cd 6d &&
 
@@ -1605,7 +1605,7 @@ test_expect_success '6d: We do not always want transitive renaming' '
 #         add/add conflict on y/d_1 vs y/d_2.
 
 test_setup_6e () {
-	test_create_repo 6e &&
+	git init 6e &&
 	(
 		cd 6e &&
 
@@ -1700,7 +1700,7 @@ test_expect_success '6e: Add/add from one side' '
 #   NOTE: There's a rename of z/ here, y/ has more renames, so z/d -> y/d.
 
 test_setup_7a () {
-	test_create_repo 7a &&
+	git init 7a &&
 	(
 		cd 7a &&
 
@@ -1772,7 +1772,7 @@ test_expect_success '7a: rename-dir vs. rename-dir (NOT split evenly) PLUS add-o
 #   Expected: y/{b,c}, CONFLICT(rename/rename(2to1): x/d_1, w/d_2 -> y_d)
 
 test_setup_7b () {
-	test_create_repo 7b &&
+	git init 7b &&
 	(
 		cd 7b &&
 
@@ -1861,7 +1861,7 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename'
 #         nor CONFLiCT x/d -> w/d vs. y/d vs. z/d)
 
 test_setup_7c () {
-	test_create_repo 7c &&
+	git init 7c &&
 	(
 		cd 7c &&
 
@@ -1926,7 +1926,7 @@ test_expect_success '7c: rename/rename(1to...2or3); transitive rename may add co
 #   NOTE: z->y so NOT CONFLICT(delete x/d vs rename to z/d)
 
 test_setup_7d () {
-	test_create_repo 7d &&
+	git init 7d &&
 	(
 		cd 7d &&
 
@@ -2027,7 +2027,7 @@ test_expect_success '7d: transitive rename involved in rename/delete; how is it
 #         how it's resolved.
 
 test_setup_7e () {
-	test_create_repo 7e &&
+	git init 7e &&
 	(
 		cd 7e &&
 
@@ -2137,7 +2137,7 @@ test_expect_success '7e: transitive rename in rename/delete AND dirs in the way'
 # we potentially could.
 
 test_setup_8a () {
-	test_create_repo 8a &&
+	git init 8a &&
 	(
 		cd 8a &&
 
@@ -2216,7 +2216,7 @@ test_expect_success '8a: Dual-directory rename, one into the others way' '
 # e_1 and e_2.
 
 test_setup_8b () {
-	test_create_repo 8b &&
+	git init 8b &&
 	(
 		cd 8b &&
 
@@ -2290,7 +2290,7 @@ test_expect_success '8b: Dual-directory rename, one into the others way, with co
 #         notes in 8d.
 
 test_setup_8c () {
-	test_create_repo 8c &&
+	git init 8c &&
 	(
 		cd 8c &&
 
@@ -2370,7 +2370,7 @@ test_expect_success '8c: modify/delete or rename+modify/delete' '
 #   differently.
 
 test_setup_8d () {
-	test_create_repo 8d &&
+	git init 8d &&
 	(
 		cd 8d &&
 
@@ -2453,7 +2453,7 @@ test_expect_success '8d: rename/delete...or not?' '
 #        the behavior, and predict it without computing as many details.
 
 test_setup_8e () {
-	test_create_repo 8e &&
+	git init 8e &&
 	(
 		cd 8e &&
 
@@ -2537,7 +2537,7 @@ test_expect_success '8e: Both sides rename, one side adds to original directory'
 #         of that could take the new file in commit B at z/i to x/w/i or x/i.
 
 test_setup_9a () {
-	test_create_repo 9a &&
+	git init 9a &&
 	(
 		cd 9a &&
 
@@ -2609,7 +2609,7 @@ test_expect_success '9a: Inner renamed directory within outer renamed directory'
 #   Expected: y/{b,c,d_merged}
 
 test_setup_9b () {
-	test_create_repo 9b &&
+	git init 9b &&
 	(
 		cd 9b &&
 
@@ -2697,7 +2697,7 @@ test_expect_success '9b: Transitive rename with content merge' '
 #         history for any implicit directory renames.
 
 test_setup_9c () {
-	test_create_repo 9c &&
+	git init 9c &&
 	(
 		cd 9c &&
 
@@ -2786,7 +2786,7 @@ test_expect_success '9c: Doubly transitive rename?' '
 #   testcases and simplifies things for the user.
 
 test_setup_9d () {
-	test_create_repo 9d &&
+	git init 9d &&
 	(
 		cd 9d &&
 
@@ -2861,7 +2861,7 @@ test_expect_success '9d: N-way transitive rename?' '
 #             dir1/yo, dir2/yo, dir3/yo, dirN/yo
 
 test_setup_9e () {
-	test_create_repo 9e &&
+	git init 9e &&
 	(
 		cd 9e &&
 
@@ -2954,7 +2954,7 @@ test_expect_success '9e: N-to-1 whammo' '
 #   Expected: priority/{a,b}/$more_files, priority/c
 
 test_setup_9f () {
-	test_create_repo 9f &&
+	git init 9f &&
 	(
 		cd 9f &&
 
@@ -3027,7 +3027,7 @@ test_expect_success '9f: Renamed directory that only contained immediate subdirs
 # viewpoint...
 
 test_setup_9g () {
-	test_create_repo 9g &&
+	git init 9g &&
 	(
 		cd 9g &&
 
@@ -3096,7 +3096,7 @@ test_expect_failure '9g: Renamed directory that only contained immediate subdirs
 #   NOTE: If we applied the z/ -> y/ rename to z/d, then we'd end up with
 #         a rename/rename(1to2) conflict (z/d -> y/d vs. x/d)
 test_setup_9h () {
-	test_create_repo 9h &&
+	git init 9h &&
 	(
 		cd 9h &&
 
@@ -3177,7 +3177,7 @@ test_expect_success '9h: Avoid dir rename on merely modified path' '
 #       ERROR_MSG(untracked working tree files would be overwritten by merge)
 
 test_setup_10a () {
-	test_create_repo 10a &&
+	git init 10a &&
 	(
 		cd 10a &&
 
@@ -3243,7 +3243,7 @@ test_expect_success '10a: Overwrite untracked with normal rename/delete' '
 #       ERROR_MSG(refusing to lose untracked file at 'y/d')
 
 test_setup_10b () {
-	test_create_repo 10b &&
+	git init 10b &&
 	(
 		cd 10b &&
 
@@ -3334,7 +3334,7 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' '
 #             ERROR_MSG(Refusing to lose untracked file at y/c)
 
 test_setup_10c () {
-	test_create_repo 10c_$1 &&
+	git init 10c_$1 &&
 	(
 		cd 10c_$1 &&
 
@@ -3472,7 +3472,7 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth
 #             ERROR_MSG(Refusing to lose untracked file at y/wham)
 
 test_setup_10d () {
-	test_create_repo 10d &&
+	git init 10d &&
 	(
 		cd 10d &&
 
@@ -3568,7 +3568,7 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' '
 #   Expected: y/{a,b,c} + untracked z/c
 
 test_setup_10e () {
-	test_create_repo 10e &&
+	git init 10e &&
 	(
 		cd 10e &&
 
@@ -3650,7 +3650,7 @@ test_expect_merge_algorithm failure success '10e: Does git complain about untrac
 #             z/c with uncommitted mods on top of A:z/c_v1
 
 test_setup_11a () {
-	test_create_repo 11a &&
+	git init 11a &&
 	(
 		cd 11a &&
 
@@ -3728,7 +3728,7 @@ test_expect_success '11a: Avoid losing dirty contents with simple rename' '
 
 
 test_setup_11b () {
-	test_create_repo 11b &&
+	git init 11b &&
 	(
 		cd 11b &&
 
@@ -3810,7 +3810,7 @@ test_expect_success '11b: Avoid losing dirty file involved in directory rename'
 #             y/c left untouched (still has uncommitted mods)
 
 test_setup_11c () {
-	test_create_repo 11c &&
+	git init 11c &&
 	(
 		cd 11c &&
 
@@ -3883,7 +3883,7 @@ test_expect_success '11c: Avoid losing not-uptodate with rename + D/F conflict'
 #             y/{a,c~HEAD,c/d}, x/b, now-untracked z/c_v1 with uncommitted mods
 
 test_setup_11d () {
-	test_create_repo 11d &&
+	git init 11d &&
 	(
 		cd 11d &&
 
@@ -3968,7 +3968,7 @@ test_expect_success '11d: Avoid losing not-uptodate with rename + D/F conflict'
 #             y/c has dirty file from before merge
 
 test_setup_11e () {
-	test_create_repo 11e &&
+	git init 11e &&
 	(
 		cd 11e &&
 
@@ -4060,7 +4060,7 @@ test_expect_success '11e: Avoid deleting not-uptodate with dir rename/rename(1to
 #             ERROR_MSG(Refusing to lose dirty file at y/wham)
 
 test_setup_11f () {
-	test_create_repo 11f &&
+	git init 11f &&
 	(
 		cd 11f &&
 
@@ -4155,7 +4155,7 @@ test_expect_success '11f: Avoid deleting not-uptodate with dir rename/rename(2to
 #   Expected: node1/{leaf1,leaf2,leaf5,node2/{leaf3,leaf4,leaf6}}
 
 test_setup_12a () {
-	test_create_repo 12a &&
+	git init 12a &&
 	(
 		cd 12a &&
 
@@ -4238,7 +4238,7 @@ test_expect_success '12a: Moving one directory hierarchy into another' '
 #             node2/node1/{leaf1, leaf2}
 
 test_setup_12b1 () {
-	test_create_repo 12b1 &&
+	git init 12b1 &&
 	(
 		cd 12b1 &&
 
@@ -4327,7 +4327,7 @@ test_expect_merge_algorithm failure success '12b1: Moving two directory hierarch
 #         even simple rules give weird results when given weird inputs.
 
 test_setup_12b2 () {
-	test_create_repo 12b2 &&
+	git init 12b2 &&
 	(
 		cd 12b2 &&
 
@@ -4402,7 +4402,7 @@ test_expect_success '12b2: Moving two directory hierarchies into each other' '
 #         each side of the merge.
 
 test_setup_12c1 () {
-	test_create_repo 12c1 &&
+	git init 12c1 &&
 	(
 		cd 12c1 &&
 
@@ -4492,7 +4492,7 @@ test_expect_merge_algorithm failure success '12c1: Moving one directory hierarch
 #         on each side of the merge.
 
 test_setup_12c2 () {
-	test_create_repo 12c2 &&
+	git init 12c2 &&
 	(
 		cd 12c2 &&
 
@@ -4584,7 +4584,7 @@ test_expect_success '12c2: Moving one directory hierarchy into another w/ conten
 #   Expected: subdir/foo, bar
 
 test_setup_12d () {
-	test_create_repo 12d &&
+	git init 12d &&
 	(
 		cd 12d &&
 
@@ -4642,7 +4642,7 @@ test_expect_success '12d: Rename/merge subdir into the root, variant 1' '
 #   Expected: foo, bar
 
 test_setup_12e () {
-	test_create_repo 12e &&
+	git init 12e &&
 	(
 		cd 12e &&
 
@@ -4743,7 +4743,7 @@ test_expect_success '12e: Rename/merge subdir into the root, variant 2' '
 #      pick and re-applying them in the subsequent one.
 
 test_setup_12f () {
-	test_create_repo 12f &&
+	git init 12f &&
 	(
 		cd 12f &&
 
@@ -4902,7 +4902,7 @@ test_expect_merge_algorithm failure success '12f: Trivial directory resolve, cac
 #   Expected: newfile_{merged}, newdir/{a_B,b_B,c_A}
 
 test_setup_12g () {
-	test_create_repo 12g &&
+	git init 12g &&
 	(
 		cd 12g &&
 
@@ -4973,7 +4973,7 @@ test_expect_success '12g: Testcase with two kinds of "relevant" renames' '
 #   Expected: newdir/{alpha_2, b}
 
 test_setup_12h () {
-	test_create_repo 12h &&
+	git init 12h &&
 	(
 		cd 12h &&
 
@@ -5032,7 +5032,7 @@ test_expect_failure '12h: renaming a file within a renamed directory' '
 #                source/bar vs. source/subdir/bar
 
 test_setup_12i () {
-	test_create_repo 12i &&
+	git init 12i &&
 	(
 		cd 12i &&
 
@@ -5090,7 +5090,7 @@ test_expect_success '12i: Directory rename causes rename-to-self' '
 #   Expected: {foo, bar, baz_2}, with conflicts on bar vs. subdir/bar
 
 test_setup_12j () {
-	test_create_repo 12j &&
+	git init 12j &&
 	(
 		cd 12j &&
 
@@ -5148,7 +5148,7 @@ test_expect_success '12j: Directory rename to root causes rename-to-self' '
 #   Expected: dirA/{foo, bar, baz_2}, with conflicts on dirA/bar vs. dirB/bar
 
 test_setup_12k () {
-	test_create_repo 12k &&
+	git init 12k &&
 	(
 		cd 12k &&
 
@@ -5218,7 +5218,7 @@ test_expect_success '12k: Directory rename with sibling causes rename-to-self' '
 #   is needed for there to be a sub1/ -> sub3/ rename.
 
 test_setup_12l () {
-	test_create_repo 12l_$1 &&
+	git init 12l_$1 &&
 	(
 		cd 12l_$1 &&
 
@@ -5322,7 +5322,7 @@ test_expect_merge_algorithm failure success '12l (A into B): Rename into each ot
 #   Expected: y/{b,c,d,e/f}, with notices/conflicts for both y/d and y/e/f
 
 test_setup_13a () {
-	test_create_repo 13a_$1 &&
+	git init 13a_$1 &&
 	(
 		cd 13a_$1 &&
 
@@ -5409,7 +5409,7 @@ test_expect_success '13a(info): messages for newly added files' '
 #             one about content, and one about file location
 
 test_setup_13b () {
-	test_create_repo 13b_$1 &&
+	git init 13b_$1 &&
 	(
 		cd 13b_$1 &&
 
@@ -5496,7 +5496,7 @@ test_expect_success '13b(info): messages for transitive rename with conflicted c
 #             shown in testcase 13d.
 
 test_setup_13c () {
-	test_create_repo 13c_$1 &&
+	git init 13c_$1 &&
 	(
 		cd 13c_$1 &&
 
@@ -5584,7 +5584,7 @@ test_expect_success '13c(info): messages for rename/rename(1to1) via transitive
 #               No conflict in where a/y ends up, so put it in d/y.
 
 test_setup_13d () {
-	test_create_repo 13d_$1 &&
+	git init 13d_$1 &&
 	(
 		cd 13d_$1 &&
 
@@ -5710,7 +5710,7 @@ test_expect_success '13d(info): messages for rename/rename(1to1) via dual transi
 #          least avoids hitting a BUG().
 #
 test_setup_13e () {
-	test_create_repo 13e &&
+	git init 13e &&
 	(
 		cd 13e &&
 
diff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh
index 7b5f1c1dcd1..2bb8e7f09bb 100755
--- a/t/t6426-merge-skip-unneeded-updates.sh
+++ b/t/t6426-merge-skip-unneeded-updates.sh
@@ -38,7 +38,7 @@ test_description="merge cases"
 #   Expected: b_2
 
 test_setup_1a () {
-	test_create_repo 1a_$1 &&
+	git init 1a_$1 &&
 	(
 		cd 1a_$1 &&
 
@@ -136,7 +136,7 @@ test_expect_success '1a-R: Modify(A)/Modify(B), change on B subset of A' '
 #   Expected: c_2
 
 test_setup_2a () {
-	test_create_repo 2a_$1 &&
+	git init 2a_$1 &&
 	(
 		cd 2a_$1 &&
 
@@ -229,7 +229,7 @@ test_expect_success '2a-R: Modify/rename, merge into rename side' '
 #   Expected: c_2
 
 test_setup_2b () {
-	test_create_repo 2b_$1 &&
+	git init 2b_$1 &&
 	(
 		cd 2b_$1 &&
 
@@ -336,7 +336,7 @@ test_expect_success '2b-R: Rename+Mod(A)/Mod(B), B mods subset of A' '
 #         not make that particular mistake.
 
 test_setup_2c () {
-	test_create_repo 2c &&
+	git init 2c &&
 	(
 		cd 2c &&
 
@@ -437,7 +437,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '
 #   Expected: bar/{bq_2, whatever}
 
 test_setup_3a () {
-	test_create_repo 3a_$1 &&
+	git init 3a_$1 &&
 	(
 		cd 3a_$1 &&
 
@@ -537,7 +537,7 @@ test_expect_success '3a-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
 #   Expected: bar/{bq_2, whatever}
 
 test_setup_3b () {
-	test_create_repo 3b_$1 &&
+	git init 3b_$1 &&
 	(
 		cd 3b_$1 &&
 
@@ -642,7 +642,7 @@ test_expect_success '3b-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
 #   Expected: b_2 for merge, b_4 in working copy
 
 test_setup_4a () {
-	test_create_repo 4a &&
+	git init 4a &&
 	(
 		cd 4a &&
 
@@ -714,7 +714,7 @@ test_expect_merge_algorithm failure success '4a: Change on A, change on B subset
 #   Expected: c_2
 
 test_setup_4b () {
-	test_create_repo 4b &&
+	git init 4b &&
 	(
 		cd 4b &&
 
diff --git a/t/t6427-diff3-conflict-markers.sh b/t/t6427-diff3-conflict-markers.sh
index a9ee4cb207a..dd5fe6a4021 100755
--- a/t/t6427-diff3-conflict-markers.sh
+++ b/t/t6427-diff3-conflict-markers.sh
@@ -19,7 +19,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 #
 
 test_expect_success 'setup no merge base' '
-	test_create_repo no_merge_base &&
+	git init no_merge_base &&
 	(
 		cd no_merge_base &&
 
@@ -55,7 +55,7 @@ test_expect_success 'check no merge base' '
 #
 
 test_expect_success 'setup unique merge base' '
-	test_create_repo unique_merge_base &&
+	git init unique_merge_base &&
 	(
 		cd unique_merge_base &&
 
@@ -116,7 +116,7 @@ test_expect_success 'check unique merge base' '
 #
 
 test_expect_success 'setup multiple merge bases' '
-	test_create_repo multiple_merge_bases &&
+	git init multiple_merge_bases &&
 	(
 		cd multiple_merge_bases &&
 
@@ -190,7 +190,7 @@ test_expect_success 'check multiple merge bases' '
 '
 
 test_expect_success 'rebase --merge describes parent of commit being picked' '
-	test_create_repo rebase &&
+	git init rebase &&
 	(
 		cd rebase &&
 		test_commit base file &&
@@ -212,7 +212,7 @@ test_expect_success 'rebase --apply describes fake ancestor base' '
 '
 
 test_setup_zdiff3 () {
-	test_create_repo zdiff3 &&
+	git init zdiff3 &&
 	(
 		cd zdiff3 &&
 
diff --git a/t/t6428-merge-conflicts-sparse.sh b/t/t6428-merge-conflicts-sparse.sh
index 064be1b629e..9919c3fa7cd 100755
--- a/t/t6428-merge-conflicts-sparse.sh
+++ b/t/t6428-merge-conflicts-sparse.sh
@@ -29,7 +29,7 @@ test_description="merge cases"
 # Testcase basic, conflicting changes in 'numerals'
 
 test_setup_numerals () {
-	test_create_repo numerals_$1 &&
+	git init numerals_$1 &&
 	(
 		cd numerals_$1 &&
 
diff --git a/t/t6429-merge-sequence-rename-caching.sh b/t/t6429-merge-sequence-rename-caching.sh
index e1ce9199164..7a630d970c6 100755
--- a/t/t6429-merge-sequence-rename-caching.sh
+++ b/t/t6429-merge-sequence-rename-caching.sh
@@ -35,7 +35,7 @@ test_description="remember regular & dir renames in sequence of merges"
 # preventing us from finding new renames.
 #
 test_expect_success 'caching renames does not preclude finding new ones' '
-	test_create_repo caching-renames-and-new-renames &&
+	git init caching-renames-and-new-renames &&
 	(
 		cd caching-renames-and-new-renames &&
 
@@ -106,7 +106,7 @@ test_expect_success 'caching renames does not preclude finding new ones' '
 # should be able to only run rename detection on the upstream side one
 # time.)
 test_expect_success 'cherry-pick both a commit and its immediate revert' '
-	test_create_repo pick-commit-and-its-immediate-revert &&
+	git init pick-commit-and-its-immediate-revert &&
 	(
 		cd pick-commit-and-its-immediate-revert &&
 
@@ -162,7 +162,7 @@ test_expect_success 'cherry-pick both a commit and its immediate revert' '
 # could cause a spurious rename/add conflict.
 #
 test_expect_success 'rename same file identically, then reintroduce it' '
-	test_create_repo rename-rename-1to1-then-add-old-filename &&
+	git init rename-rename-1to1-then-add-old-filename &&
 	(
 		cd rename-rename-1to1-then-add-old-filename &&
 
@@ -229,7 +229,7 @@ test_expect_success 'rename same file identically, then reintroduce it' '
 # cached, the directory rename could put newfile in the wrong directory.
 #
 test_expect_success 'rename same file identically, then add file to old dir' '
-	test_create_repo rename-rename-1to1-then-add-file-to-old-dir &&
+	git init rename-rename-1to1-then-add-file-to-old-dir &&
 	(
 		cd rename-rename-1to1-then-add-file-to-old-dir &&
 
@@ -311,7 +311,7 @@ test_expect_success 'rename same file identically, then add file to old dir' '
 # should avoid the need to re-detect upstream renames.)
 #
 test_expect_success 'cached dir rename does not prevent noticing later conflict' '
-	test_create_repo dir-rename-cache-not-occluding-later-conflict &&
+	git init dir-rename-cache-not-occluding-later-conflict &&
 	(
 		cd dir-rename-cache-not-occluding-later-conflict &&
 
@@ -365,7 +365,7 @@ test_expect_success 'cached dir rename does not prevent noticing later conflict'
 
 # Helper for the next two tests
 test_setup_upstream_rename () {
-	test_create_repo $1 &&
+	git init $1 &&
 	(
 		cd $1 &&
 
@@ -537,7 +537,7 @@ test_expect_success 'dir rename unneeded, then rename existing file into old dir
 
 # Helper for the next two tests
 test_setup_topic_rename () {
-	test_create_repo $1 &&
+	git init $1 &&
 	(
 		cd $1 &&
 
diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh
index c253bf759ab..744c7b8bf87 100755
--- a/t/t6437-submodule-merge.sh
+++ b/t/t6437-submodule-merge.sh
@@ -310,7 +310,7 @@ test_expect_success 'recursive merge with submodule' '
 #   Expected: path/ is submodule and file contents for B's path are somewhere
 
 test_expect_success 'setup file/submodule conflict' '
-	test_create_repo file-submodule &&
+	git init file-submodule &&
 	(
 		cd file-submodule &&
 
@@ -325,7 +325,7 @@ test_expect_success 'setup file/submodule conflict' '
 		git commit -m B &&
 
 		git checkout A &&
-		test_create_repo path &&
+		git init path &&
 		test_commit -C path world &&
 		git submodule add ./path &&
 		git commit -m A
@@ -385,7 +385,7 @@ test_expect_success 'file/submodule conflict; merge --abort works afterward' '
 #     under the submodule to be treated as untracked or in the way.
 
 test_expect_success 'setup directory/submodule conflict' '
-	test_create_repo directory-submodule &&
+	git init directory-submodule &&
 	(
 		cd directory-submodule &&
 
@@ -408,7 +408,7 @@ test_expect_success 'setup directory/submodule conflict' '
 		git commit -m B2 &&
 
 		git checkout A &&
-		test_create_repo path &&
+		git init path &&
 		test_commit -C path hello world &&
 		git submodule add ./path &&
 		git commit -m A

base-commit: 6a475b71f8c4ce708d69fdc9317aefbde3769e25
-- 
gitgitgadget

^ permalink raw reply related	[relevance 1%]

* [PATCH] t64??: convert 'test_create_repo' to 'git init'
@ 2022-08-20 22:33  1% Elijah Newren via GitGitGadget
  2022-08-26  3:49  1% ` [PATCH v2] t64xx: " Elijah Newren via GitGitGadget
  0 siblings, 1 reply; 200+ results
From: Elijah Newren via GitGitGadget @ 2022-08-20 22:33 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

As promised[1], convert the merge-specific tests over to using 'git
init' instead of 'test_create_repo'.

[1] https://lore.kernel.org/git/CABPp-BEcojvfeuhp7rSi-O+9oEu4KpwPDwbKS-MiD1qCKde-CA@mail.gmail.com/

Signed-off-by: Elijah Newren <newren@gmail.com>
---
    t64??: convert 'test_create_repo' to 'git init'

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1303%2Fnewren%2Fnuke_test_create_repo_in_merge_tests-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1303/newren/nuke_test_create_repo_in_merge_tests-v1
Pull-Request: https://github.com/git/git/pull/1303

 t/t6400-merge-df.sh                      |   2 +-
 t/t6406-merge-attr.sh                    |   4 +-
 t/t6416-recursive-corner-cases.sh        |  38 +++----
 t/t6421-merge-partial-clone.sh           |   2 +-
 t/t6422-merge-rename-corner-cases.sh     |  38 +++----
 t/t6423-merge-rename-directories.sh      | 138 +++++++++++------------
 t/t6426-merge-skip-unneeded-updates.sh   |  16 +--
 t/t6427-diff3-conflict-markers.sh        |  10 +-
 t/t6428-merge-conflicts-sparse.sh        |   2 +-
 t/t6429-merge-sequence-rename-caching.sh |  14 +--
 t/t6437-submodule-merge.sh               |   8 +-
 11 files changed, 136 insertions(+), 136 deletions(-)

diff --git a/t/t6400-merge-df.sh b/t/t6400-merge-df.sh
index 57a67cf3627..3de4ef6bd9e 100755
--- a/t/t6400-merge-df.sh
+++ b/t/t6400-merge-df.sh
@@ -126,7 +126,7 @@ test_expect_success 'Simple merge in repo with interesting pathnames' '
 	#     foo/bar-2/baz
 	# The fact that foo/bar-2 appears between foo/bar and foo/bar/baz
 	# can trip up some codepaths, and is the point of this test.
-	test_create_repo name-ordering &&
+	git init name-ordering &&
 	(
 		cd name-ordering &&
 
diff --git a/t/t6406-merge-attr.sh b/t/t6406-merge-attr.sh
index 99abefd44b9..8650a88c40a 100755
--- a/t/t6406-merge-attr.sh
+++ b/t/t6406-merge-attr.sh
@@ -162,8 +162,8 @@ test_expect_success 'custom merge backend' '
 '
 
 test_expect_success 'up-to-date merge without common ancestor' '
-	test_create_repo repo1 &&
-	test_create_repo repo2 &&
+	git init repo1 &&
+	git init repo2 &&
 	test_tick &&
 	(
 		cd repo1 &&
diff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh
index 690c8482b13..17b54d625d0 100755
--- a/t/t6416-recursive-corner-cases.sh
+++ b/t/t6416-recursive-corner-cases.sh
@@ -19,7 +19,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 #
 
 test_expect_success 'setup basic criss-cross + rename with no modifications' '
-	test_create_repo basic-rename &&
+	git init basic-rename &&
 	(
 		cd basic-rename &&
 
@@ -85,7 +85,7 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '
 #
 
 test_expect_success 'setup criss-cross + rename merges with basic modification' '
-	test_create_repo rename-modify &&
+	git init rename-modify &&
 	(
 		cd rename-modify &&
 
@@ -160,7 +160,7 @@ test_expect_success 'merge criss-cross + rename merges with basic modification'
 #
 
 test_expect_success 'setup differently handled merges of rename/add conflict' '
-	test_create_repo rename-add &&
+	git init rename-add &&
 	(
 		cd rename-add &&
 
@@ -324,7 +324,7 @@ test_expect_success 'git detects differently handled merges conflict, swapped' '
 # Merging commits D & E should result in modify/delete conflict.
 
 test_expect_success 'setup criss-cross + modify/delete resolved differently' '
-	test_create_repo modify-delete &&
+	git init modify-delete &&
 	(
 		cd modify-delete &&
 
@@ -499,7 +499,7 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev
 #
 
 test_expect_success 'setup differently handled merges of directory/file conflict' '
-	test_create_repo directory-file &&
+	git init directory-file &&
 	(
 		cd directory-file &&
 
@@ -867,7 +867,7 @@ test_expect_failure 'merge of D2 & E4 merges a2s & reports conflict for a/file'
 # but that may cancel out at the final merge stage".
 
 test_expect_success 'setup rename/rename(1to2)/modify followed by what looks like rename/rename(2to1)/modify' '
-	test_create_repo rename-squared-squared &&
+	git init rename-squared-squared &&
 	(
 		cd rename-squared-squared &&
 
@@ -944,7 +944,7 @@ test_expect_success 'handle rename/rename(1to2)/modify followed by what looks li
 # content merge handled.
 
 test_expect_success 'setup criss-cross + rename/rename/add-source + modify/modify' '
-	test_create_repo rename-rename-add-source &&
+	git init rename-rename-add-source &&
 	(
 		cd rename-rename-add-source &&
 
@@ -1032,7 +1032,7 @@ test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '
 # base of B & C needs to not delete B:c for that to work, though...
 
 test_expect_success 'setup criss-cross+rename/rename/add-dest + simple modify' '
-	test_create_repo rename-rename-add-dest &&
+	git init rename-rename-add-dest &&
 	(
 		cd rename-rename-add-dest &&
 
@@ -1111,7 +1111,7 @@ test_expect_success 'virtual merge base handles rename/rename(1to2)/add-dest' '
 # git detect it?
 
 test_expect_success 'setup symlink modify/modify' '
-	test_create_repo symlink-modify-modify &&
+	git init symlink-modify-modify &&
 	(
 		cd symlink-modify-modify &&
 
@@ -1178,7 +1178,7 @@ test_expect_merge_algorithm failure success 'check symlink modify/modify' '
 # git detect it?
 
 test_expect_success 'setup symlink add/add' '
-	test_create_repo symlink-add-add &&
+	git init symlink-add-add &&
 	(
 		cd symlink-add-add &&
 
@@ -1244,11 +1244,11 @@ test_expect_merge_algorithm failure success 'check symlink add/add' '
 # git detect it?
 
 test_expect_success 'setup submodule modify/modify' '
-	test_create_repo submodule-modify-modify &&
+	git init submodule-modify-modify &&
 	(
 		cd submodule-modify-modify &&
 
-		test_create_repo submod &&
+		git init submod &&
 		(
 			cd submod &&
 			touch file-A &&
@@ -1332,11 +1332,11 @@ test_expect_merge_algorithm failure success 'check submodule modify/modify' '
 # git detect it?
 
 test_expect_success 'setup submodule add/add' '
-	test_create_repo submodule-add-add &&
+	git init submodule-add-add &&
 	(
 		cd submodule-add-add &&
 
-		test_create_repo submod &&
+		git init submod &&
 		(
 			cd submod &&
 			touch file-A &&
@@ -1419,11 +1419,11 @@ test_expect_merge_algorithm failure success 'check submodule add/add' '
 # This is an obvious add/add conflict for 'path'.  Can git detect it?
 
 test_expect_success 'setup conflicting entry types (submodule vs symlink)' '
-	test_create_repo submodule-symlink-add-add &&
+	git init submodule-symlink-add-add &&
 	(
 		cd submodule-symlink-add-add &&
 
-		test_create_repo path &&
+		git init path &&
 		(
 			cd path &&
 			touch file-B &&
@@ -1494,7 +1494,7 @@ test_expect_merge_algorithm failure success 'check conflicting entry types (subm
 # This is an obvious add/add mode conflict.  Can git detect it?
 
 test_expect_success 'setup conflicting modes for regular file' '
-	test_create_repo regular-file-mode-conflict &&
+	git init regular-file-mode-conflict &&
 	(
 		cd regular-file-mode-conflict &&
 
@@ -1571,7 +1571,7 @@ test_expect_failure 'check conflicting modes for regular file' '
 #   to ensure that we handle it as well as practical.
 
 test_expect_success 'setup nested conflicts' '
-	test_create_repo nested_conflicts &&
+	git init nested_conflicts &&
 	(
 		cd nested_conflicts &&
 
@@ -1757,7 +1757,7 @@ test_expect_success 'check nested conflicts' '
 #   have three levels of conflict markers.  Can we distinguish all three?
 
 test_expect_success 'setup virtual merge base with nested conflicts' '
-	test_create_repo virtual_merge_base_has_nested_conflicts &&
+	git init virtual_merge_base_has_nested_conflicts &&
 	(
 		cd virtual_merge_base_has_nested_conflicts &&
 
diff --git a/t/t6421-merge-partial-clone.sh b/t/t6421-merge-partial-clone.sh
index 36bcd7c3280..5413e5dd9d6 100755
--- a/t/t6421-merge-partial-clone.sh
+++ b/t/t6421-merge-partial-clone.sh
@@ -31,7 +31,7 @@ test_description="limiting blob downloads when merging with partial clones"
 
 test_setup_repo () {
 	test -d server && return
-	test_create_repo server &&
+	git init server &&
 	(
 		cd server &&
 
diff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh
index 9b65768aed6..346253c7c88 100755
--- a/t/t6422-merge-rename-corner-cases.sh
+++ b/t/t6422-merge-rename-corner-cases.sh
@@ -11,7 +11,7 @@ TEST_PASSES_SANITIZE_LEAK=true
 . "$TEST_DIRECTORY"/lib-merge.sh
 
 test_setup_rename_delete_untracked () {
-	test_create_repo rename-delete-untracked &&
+	git init rename-delete-untracked &&
 	(
 		cd rename-delete-untracked &&
 
@@ -56,7 +56,7 @@ test_expect_success "Does git preserve Gollum's precious artifact?" '
 # We should be able to merge B & C cleanly
 
 test_setup_rename_modify_add_source () {
-	test_create_repo rename-modify-add-source &&
+	git init rename-modify-add-source &&
 	(
 		cd rename-modify-add-source &&
 
@@ -96,7 +96,7 @@ test_expect_failure 'rename/modify/add-source conflict resolvable' '
 '
 
 test_setup_break_detection_1 () {
-	test_create_repo break-detection-1 &&
+	git init break-detection-1 &&
 	(
 		cd break-detection-1 &&
 
@@ -144,7 +144,7 @@ test_expect_failure 'conflict caused if rename not detected' '
 '
 
 test_setup_break_detection_2 () {
-	test_create_repo break-detection-2 &&
+	git init break-detection-2 &&
 	(
 		cd break-detection-2 &&
 
@@ -192,7 +192,7 @@ test_expect_failure 'missed conflict if rename not detected' '
 #   Commit C: rename a->b, add unrelated a
 
 test_setup_break_detection_3 () {
-	test_create_repo break-detection-3 &&
+	git init break-detection-3 &&
 	(
 		cd break-detection-3 &&
 
@@ -268,7 +268,7 @@ test_expect_failure 'detect rename/add-source and preserve all data, merge other
 '
 
 test_setup_rename_directory () {
-	test_create_repo rename-directory-$1 &&
+	git init rename-directory-$1 &&
 	(
 		cd rename-directory-$1 &&
 
@@ -386,7 +386,7 @@ test_expect_success 'rename/directory conflict + content merge conflict' '
 '
 
 test_setup_rename_directory_2 () {
-	test_create_repo rename-directory-2 &&
+	git init rename-directory-2 &&
 	(
 		cd rename-directory-2 &&
 
@@ -445,7 +445,7 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '
 #   Commit B: modify a, add different b
 
 test_setup_rename_with_content_merge_and_add () {
-	test_create_repo rename-with-content-merge-and-add-$1 &&
+	git init rename-with-content-merge-and-add-$1 &&
 	(
 		cd rename-with-content-merge-and-add-$1 &&
 
@@ -570,7 +570,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way'
 #   * Nothing else should be present.  Is anything?
 
 test_setup_rename_rename_2to1 () {
-	test_create_repo rename-rename-2to1 &&
+	git init rename-rename-2to1 &&
 	(
 		cd rename-rename-2to1 &&
 
@@ -642,7 +642,7 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '
 #   Commit B: rename a->b
 #   Commit C: rename a->c
 test_setup_rename_rename_1to2 () {
-	test_create_repo rename-rename-1to2 &&
+	git init rename-rename-1to2 &&
 	(
 		cd rename-rename-1to2 &&
 
@@ -700,7 +700,7 @@ test_expect_success 'merge has correct working tree contents' '
 # Merging of B & C should NOT be clean; there's a rename/rename conflict
 
 test_setup_rename_rename_1to2_add_source_1 () {
-	test_create_repo rename-rename-1to2-add-source-1 &&
+	git init rename-rename-1to2-add-source-1 &&
 	(
 		cd rename-rename-1to2-add-source-1 &&
 
@@ -748,7 +748,7 @@ test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge'
 '
 
 test_setup_rename_rename_1to2_add_source_2 () {
-	test_create_repo rename-rename-1to2-add-source-2 &&
+	git init rename-rename-1to2-add-source-2 &&
 	(
 		cd rename-rename-1to2-add-source-2 &&
 
@@ -794,7 +794,7 @@ test_expect_failure 'rename/rename/add-source still tracks new a file' '
 '
 
 test_setup_rename_rename_1to2_add_dest () {
-	test_create_repo rename-rename-1to2-add-dest &&
+	git init rename-rename-1to2-add-dest &&
 	(
 		cd rename-rename-1to2-add-dest &&
 
@@ -874,7 +874,7 @@ test_expect_success 'rename/rename/add-dest merge still knows about conflicting
 #   Expected: CONFLICT (rename/add/delete), two-way merged bar
 
 test_setup_rad () {
-	test_create_repo rad &&
+	git init rad &&
 	(
 		cd rad &&
 		echo "original file" >foo &&
@@ -946,7 +946,7 @@ test_expect_merge_algorithm failure success 'rad-check: rename/add/delete confli
 #   Expected: CONFLICT (rename/rename/delete/delete), two-way merged baz
 
 test_setup_rrdd () {
-	test_create_repo rrdd &&
+	git init rrdd &&
 	(
 		cd rrdd &&
 		echo foo >foo &&
@@ -1022,7 +1022,7 @@ test_expect_merge_algorithm failure success 'rrdd-check: rename/rename(2to1)/del
 #             multi-way merged contents found in two, four, six
 
 test_setup_mod6 () {
-	test_create_repo mod6 &&
+	git init mod6 &&
 	(
 		cd mod6 &&
 		test_seq 11 19 >one &&
@@ -1160,7 +1160,7 @@ test_conflicts_with_adds_and_renames() {
 	#      tree
 	test_setup_collision_conflict () {
 	#test_expect_success "setup simple $sideL/$sideR conflict" '
-		test_create_repo simple_${sideL}_${sideR} &&
+		git init simple_${sideL}_${sideR} &&
 		(
 			cd simple_${sideL}_${sideR} &&
 
@@ -1308,7 +1308,7 @@ test_conflicts_with_adds_and_renames add    add
 #   So, we have four different conflicting files that all end up at path
 #   'three'.
 test_setup_nested_conflicts_from_rename_rename () {
-	test_create_repo nested_conflicts_from_rename_rename &&
+	git init nested_conflicts_from_rename_rename &&
 	(
 		cd nested_conflicts_from_rename_rename &&
 
@@ -1417,7 +1417,7 @@ test_expect_success 'check nested conflicts from rename/rename(2to1)' '
 #   Expected: CONFLICT(rename/rename) message, three unstaged entries in the
 #             index, and contents of orig-[AB] at path orig-[AB]
 test_setup_rename_rename_1_to_2_binary () {
-	test_create_repo rename_rename_1_to_2_binary &&
+	git init rename_rename_1_to_2_binary &&
 	(
 		cd rename_rename_1_to_2_binary &&
 
diff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh
index 99baf77cbfd..a4941878fe2 100755
--- a/t/t6423-merge-rename-directories.sh
+++ b/t/t6423-merge-rename-directories.sh
@@ -40,7 +40,7 @@ test_description="recursive merge with directory renames"
 #   Expected: y/{b,c,d,e/f}
 
 test_setup_1a () {
-	test_create_repo 1a &&
+	git init 1a &&
 	(
 		cd 1a &&
 
@@ -106,7 +106,7 @@ test_expect_success '1a: Simple directory rename detection' '
 #   Expected: y/{b,c,d,e}
 
 test_setup_1b () {
-	test_create_repo 1b &&
+	git init 1b &&
 	(
 		cd 1b &&
 
@@ -169,7 +169,7 @@ test_expect_success '1b: Merge a directory with another' '
 #   Expected: y/{b,c,d}  (because x/d -> z/d -> y/d)
 
 test_setup_1c () {
-	test_create_repo 1c &&
+	git init 1c &&
 	(
 		cd 1c &&
 
@@ -232,7 +232,7 @@ test_expect_success '1c: Transitive renaming' '
 #         y/wham_1 & z/wham_2 should too...giving us a conflict.
 
 test_setup_1d () {
-	test_create_repo 1d &&
+	git init 1d &&
 	(
 		cd 1d &&
 
@@ -328,7 +328,7 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict'
 #   Expected: y/{newb,newc,d}
 
 test_setup_1e () {
-	test_create_repo 1e &&
+	git init 1e &&
 	(
 		cd 1e &&
 
@@ -387,7 +387,7 @@ test_expect_success '1e: Renamed directory, with all files being renamed too' '
 #   Expected: y/{b,c}, x/{d,e,f,g}
 
 test_setup_1f () {
-	test_create_repo 1f &&
+	git init 1f &&
 	(
 		cd 1f &&
 
@@ -476,7 +476,7 @@ test_expect_success '1f: Split a directory into two other directories' '
 #   Commit B: z/{b,c,d}
 #   Expected: y/b, w/c, z/d, with warning about z/ -> (y/ vs. w/) conflict
 test_setup_2a () {
-	test_create_repo 2a &&
+	git init 2a &&
 	(
 		cd 2a &&
 
@@ -538,7 +538,7 @@ test_expect_success '2a: Directory split into two on one side, with equal number
 #   Commit B: z/{b,c}, x/d
 #   Expected: y/b, w/c, x/d; No warning about z/ -> (y/ vs. w/) conflict
 test_setup_2b () {
-	test_create_repo 2b &&
+	git init 2b &&
 	(
 		cd 2b &&
 
@@ -620,7 +620,7 @@ test_expect_success '2b: Directory split into two on one side, with equal number
 #   Commit B: y/{b,c}, x/d
 #   Expected: y/{b,c}, x/d
 test_setup_3a () {
-	test_create_repo 3a &&
+	git init 3a &&
 	(
 		cd 3a &&
 
@@ -684,7 +684,7 @@ test_expect_success '3a: Avoid implicit rename if involved as source on other si
 #         end up with CONFLICT:(z/d -> y/d vs. x/d vs. w/d), i.e. a
 #         rename/rename/rename(1to3) conflict, which is just weird.
 test_setup_3b () {
-	test_create_repo 3b &&
+	git init 3b &&
 	(
 		cd 3b &&
 
@@ -807,7 +807,7 @@ test_expect_success '3b: Avoid implicit rename if involved as source on current
 #   NOTE: Even though most files from z moved to y, we don't want f to follow.
 
 test_setup_4a () {
-	test_create_repo 4a &&
+	git init 4a &&
 	(
 		cd 4a &&
 
@@ -896,7 +896,7 @@ test_expect_success '4a: Directory split, with original directory still present'
 #         index.
 
 test_setup_5a () {
-	test_create_repo 5a &&
+	git init 5a &&
 	(
 		cd 5a &&
 
@@ -971,7 +971,7 @@ test_expect_success '5a: Merge directories, other side adds files to original an
 #         back to git behavior without the directory rename detection.
 
 test_setup_5b () {
-	test_create_repo 5b &&
+	git init 5b &&
 	(
 		cd 5b &&
 
@@ -1048,7 +1048,7 @@ test_expect_success '5b: Rename/delete in order to get add/add/add conflict' '
 #             though, because it doesn't have anything in the way.
 
 test_setup_5c () {
-	test_create_repo 5c &&
+	git init 5c &&
 	(
 		cd 5c &&
 
@@ -1138,7 +1138,7 @@ test_expect_success '5c: Transitive rename would cause rename/rename/rename/add/
 #         directory rename detection for z/f -> y/f.
 
 test_setup_5d () {
-	test_create_repo 5d &&
+	git init 5d &&
 	(
 		cd 5d &&
 
@@ -1239,7 +1239,7 @@ test_expect_success '5d: Directory/file/file conflict due to directory rename' '
 #         it is also involved in a rename/delete conflict.
 
 test_setup_6a () {
-	test_create_repo 6a &&
+	git init 6a &&
 	(
 		cd 6a &&
 
@@ -1337,7 +1337,7 @@ test_expect_success '6a: Tricky rename/delete' '
 #         the behavior on testcases 6b2 and 8e, and introduced this 6b1 testcase.
 
 test_setup_6b1 () {
-	test_create_repo 6b1 &&
+	git init 6b1 &&
 	(
 		cd 6b1 &&
 
@@ -1415,7 +1415,7 @@ test_expect_merge_algorithm failure success '6b1: Same renames done on both side
 #         the z/ -> y/ rename.
 
 test_setup_6b2 () {
-	test_create_repo 6b2 &&
+	git init 6b2 &&
 	(
 		cd 6b2 &&
 
@@ -1479,7 +1479,7 @@ test_expect_merge_algorithm failure success '6b2: Same rename done on both sides
 #         "accidentally detect a rename" and give us y/{b,c,d}.
 
 test_setup_6c () {
-	test_create_repo 6c &&
+	git init 6c &&
 	(
 		cd 6c &&
 
@@ -1542,7 +1542,7 @@ test_expect_success '6c: Rename only done on same side' '
 #         doesn't "accidentally detect a rename" and give us y/{b,c,d}.
 
 test_setup_6d () {
-	test_create_repo 6d &&
+	git init 6d &&
 	(
 		cd 6d &&
 
@@ -1605,7 +1605,7 @@ test_expect_success '6d: We do not always want transitive renaming' '
 #         add/add conflict on y/d_1 vs y/d_2.
 
 test_setup_6e () {
-	test_create_repo 6e &&
+	git init 6e &&
 	(
 		cd 6e &&
 
@@ -1700,7 +1700,7 @@ test_expect_success '6e: Add/add from one side' '
 #   NOTE: There's a rename of z/ here, y/ has more renames, so z/d -> y/d.
 
 test_setup_7a () {
-	test_create_repo 7a &&
+	git init 7a &&
 	(
 		cd 7a &&
 
@@ -1772,7 +1772,7 @@ test_expect_success '7a: rename-dir vs. rename-dir (NOT split evenly) PLUS add-o
 #   Expected: y/{b,c}, CONFLICT(rename/rename(2to1): x/d_1, w/d_2 -> y_d)
 
 test_setup_7b () {
-	test_create_repo 7b &&
+	git init 7b &&
 	(
 		cd 7b &&
 
@@ -1861,7 +1861,7 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename'
 #         nor CONFLiCT x/d -> w/d vs. y/d vs. z/d)
 
 test_setup_7c () {
-	test_create_repo 7c &&
+	git init 7c &&
 	(
 		cd 7c &&
 
@@ -1926,7 +1926,7 @@ test_expect_success '7c: rename/rename(1to...2or3); transitive rename may add co
 #   NOTE: z->y so NOT CONFLICT(delete x/d vs rename to z/d)
 
 test_setup_7d () {
-	test_create_repo 7d &&
+	git init 7d &&
 	(
 		cd 7d &&
 
@@ -2027,7 +2027,7 @@ test_expect_success '7d: transitive rename involved in rename/delete; how is it
 #         how it's resolved.
 
 test_setup_7e () {
-	test_create_repo 7e &&
+	git init 7e &&
 	(
 		cd 7e &&
 
@@ -2137,7 +2137,7 @@ test_expect_success '7e: transitive rename in rename/delete AND dirs in the way'
 # we potentially could.
 
 test_setup_8a () {
-	test_create_repo 8a &&
+	git init 8a &&
 	(
 		cd 8a &&
 
@@ -2216,7 +2216,7 @@ test_expect_success '8a: Dual-directory rename, one into the others way' '
 # e_1 and e_2.
 
 test_setup_8b () {
-	test_create_repo 8b &&
+	git init 8b &&
 	(
 		cd 8b &&
 
@@ -2290,7 +2290,7 @@ test_expect_success '8b: Dual-directory rename, one into the others way, with co
 #         notes in 8d.
 
 test_setup_8c () {
-	test_create_repo 8c &&
+	git init 8c &&
 	(
 		cd 8c &&
 
@@ -2370,7 +2370,7 @@ test_expect_success '8c: modify/delete or rename+modify/delete' '
 #   differently.
 
 test_setup_8d () {
-	test_create_repo 8d &&
+	git init 8d &&
 	(
 		cd 8d &&
 
@@ -2453,7 +2453,7 @@ test_expect_success '8d: rename/delete...or not?' '
 #        the behavior, and predict it without computing as many details.
 
 test_setup_8e () {
-	test_create_repo 8e &&
+	git init 8e &&
 	(
 		cd 8e &&
 
@@ -2537,7 +2537,7 @@ test_expect_success '8e: Both sides rename, one side adds to original directory'
 #         of that could take the new file in commit B at z/i to x/w/i or x/i.
 
 test_setup_9a () {
-	test_create_repo 9a &&
+	git init 9a &&
 	(
 		cd 9a &&
 
@@ -2609,7 +2609,7 @@ test_expect_success '9a: Inner renamed directory within outer renamed directory'
 #   Expected: y/{b,c,d_merged}
 
 test_setup_9b () {
-	test_create_repo 9b &&
+	git init 9b &&
 	(
 		cd 9b &&
 
@@ -2697,7 +2697,7 @@ test_expect_success '9b: Transitive rename with content merge' '
 #         history for any implicit directory renames.
 
 test_setup_9c () {
-	test_create_repo 9c &&
+	git init 9c &&
 	(
 		cd 9c &&
 
@@ -2786,7 +2786,7 @@ test_expect_success '9c: Doubly transitive rename?' '
 #   testcases and simplifies things for the user.
 
 test_setup_9d () {
-	test_create_repo 9d &&
+	git init 9d &&
 	(
 		cd 9d &&
 
@@ -2861,7 +2861,7 @@ test_expect_success '9d: N-way transitive rename?' '
 #             dir1/yo, dir2/yo, dir3/yo, dirN/yo
 
 test_setup_9e () {
-	test_create_repo 9e &&
+	git init 9e &&
 	(
 		cd 9e &&
 
@@ -2954,7 +2954,7 @@ test_expect_success '9e: N-to-1 whammo' '
 #   Expected: priority/{a,b}/$more_files, priority/c
 
 test_setup_9f () {
-	test_create_repo 9f &&
+	git init 9f &&
 	(
 		cd 9f &&
 
@@ -3027,7 +3027,7 @@ test_expect_success '9f: Renamed directory that only contained immediate subdirs
 # viewpoint...
 
 test_setup_9g () {
-	test_create_repo 9g &&
+	git init 9g &&
 	(
 		cd 9g &&
 
@@ -3096,7 +3096,7 @@ test_expect_failure '9g: Renamed directory that only contained immediate subdirs
 #   NOTE: If we applied the z/ -> y/ rename to z/d, then we'd end up with
 #         a rename/rename(1to2) conflict (z/d -> y/d vs. x/d)
 test_setup_9h () {
-	test_create_repo 9h &&
+	git init 9h &&
 	(
 		cd 9h &&
 
@@ -3177,7 +3177,7 @@ test_expect_success '9h: Avoid dir rename on merely modified path' '
 #       ERROR_MSG(untracked working tree files would be overwritten by merge)
 
 test_setup_10a () {
-	test_create_repo 10a &&
+	git init 10a &&
 	(
 		cd 10a &&
 
@@ -3243,7 +3243,7 @@ test_expect_success '10a: Overwrite untracked with normal rename/delete' '
 #       ERROR_MSG(refusing to lose untracked file at 'y/d')
 
 test_setup_10b () {
-	test_create_repo 10b &&
+	git init 10b &&
 	(
 		cd 10b &&
 
@@ -3334,7 +3334,7 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' '
 #             ERROR_MSG(Refusing to lose untracked file at y/c)
 
 test_setup_10c () {
-	test_create_repo 10c_$1 &&
+	git init 10c_$1 &&
 	(
 		cd 10c_$1 &&
 
@@ -3472,7 +3472,7 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth
 #             ERROR_MSG(Refusing to lose untracked file at y/wham)
 
 test_setup_10d () {
-	test_create_repo 10d &&
+	git init 10d &&
 	(
 		cd 10d &&
 
@@ -3568,7 +3568,7 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' '
 #   Expected: y/{a,b,c} + untracked z/c
 
 test_setup_10e () {
-	test_create_repo 10e &&
+	git init 10e &&
 	(
 		cd 10e &&
 
@@ -3650,7 +3650,7 @@ test_expect_merge_algorithm failure success '10e: Does git complain about untrac
 #             z/c with uncommitted mods on top of A:z/c_v1
 
 test_setup_11a () {
-	test_create_repo 11a &&
+	git init 11a &&
 	(
 		cd 11a &&
 
@@ -3728,7 +3728,7 @@ test_expect_success '11a: Avoid losing dirty contents with simple rename' '
 
 
 test_setup_11b () {
-	test_create_repo 11b &&
+	git init 11b &&
 	(
 		cd 11b &&
 
@@ -3810,7 +3810,7 @@ test_expect_success '11b: Avoid losing dirty file involved in directory rename'
 #             y/c left untouched (still has uncommitted mods)
 
 test_setup_11c () {
-	test_create_repo 11c &&
+	git init 11c &&
 	(
 		cd 11c &&
 
@@ -3883,7 +3883,7 @@ test_expect_success '11c: Avoid losing not-uptodate with rename + D/F conflict'
 #             y/{a,c~HEAD,c/d}, x/b, now-untracked z/c_v1 with uncommitted mods
 
 test_setup_11d () {
-	test_create_repo 11d &&
+	git init 11d &&
 	(
 		cd 11d &&
 
@@ -3968,7 +3968,7 @@ test_expect_success '11d: Avoid losing not-uptodate with rename + D/F conflict'
 #             y/c has dirty file from before merge
 
 test_setup_11e () {
-	test_create_repo 11e &&
+	git init 11e &&
 	(
 		cd 11e &&
 
@@ -4060,7 +4060,7 @@ test_expect_success '11e: Avoid deleting not-uptodate with dir rename/rename(1to
 #             ERROR_MSG(Refusing to lose dirty file at y/wham)
 
 test_setup_11f () {
-	test_create_repo 11f &&
+	git init 11f &&
 	(
 		cd 11f &&
 
@@ -4155,7 +4155,7 @@ test_expect_success '11f: Avoid deleting not-uptodate with dir rename/rename(2to
 #   Expected: node1/{leaf1,leaf2,leaf5,node2/{leaf3,leaf4,leaf6}}
 
 test_setup_12a () {
-	test_create_repo 12a &&
+	git init 12a &&
 	(
 		cd 12a &&
 
@@ -4238,7 +4238,7 @@ test_expect_success '12a: Moving one directory hierarchy into another' '
 #             node2/node1/{leaf1, leaf2}
 
 test_setup_12b1 () {
-	test_create_repo 12b1 &&
+	git init 12b1 &&
 	(
 		cd 12b1 &&
 
@@ -4327,7 +4327,7 @@ test_expect_merge_algorithm failure success '12b1: Moving two directory hierarch
 #         even simple rules give weird results when given weird inputs.
 
 test_setup_12b2 () {
-	test_create_repo 12b2 &&
+	git init 12b2 &&
 	(
 		cd 12b2 &&
 
@@ -4402,7 +4402,7 @@ test_expect_success '12b2: Moving two directory hierarchies into each other' '
 #         each side of the merge.
 
 test_setup_12c1 () {
-	test_create_repo 12c1 &&
+	git init 12c1 &&
 	(
 		cd 12c1 &&
 
@@ -4492,7 +4492,7 @@ test_expect_merge_algorithm failure success '12c1: Moving one directory hierarch
 #         on each side of the merge.
 
 test_setup_12c2 () {
-	test_create_repo 12c2 &&
+	git init 12c2 &&
 	(
 		cd 12c2 &&
 
@@ -4584,7 +4584,7 @@ test_expect_success '12c2: Moving one directory hierarchy into another w/ conten
 #   Expected: subdir/foo, bar
 
 test_setup_12d () {
-	test_create_repo 12d &&
+	git init 12d &&
 	(
 		cd 12d &&
 
@@ -4642,7 +4642,7 @@ test_expect_success '12d: Rename/merge subdir into the root, variant 1' '
 #   Expected: foo, bar
 
 test_setup_12e () {
-	test_create_repo 12e &&
+	git init 12e &&
 	(
 		cd 12e &&
 
@@ -4743,7 +4743,7 @@ test_expect_success '12e: Rename/merge subdir into the root, variant 2' '
 #      pick and re-applying them in the subsequent one.
 
 test_setup_12f () {
-	test_create_repo 12f &&
+	git init 12f &&
 	(
 		cd 12f &&
 
@@ -4902,7 +4902,7 @@ test_expect_merge_algorithm failure success '12f: Trivial directory resolve, cac
 #   Expected: newfile_{merged}, newdir/{a_B,b_B,c_A}
 
 test_setup_12g () {
-	test_create_repo 12g &&
+	git init 12g &&
 	(
 		cd 12g &&
 
@@ -4973,7 +4973,7 @@ test_expect_success '12g: Testcase with two kinds of "relevant" renames' '
 #   Expected: newdir/{alpha_2, b}
 
 test_setup_12h () {
-	test_create_repo 12h &&
+	git init 12h &&
 	(
 		cd 12h &&
 
@@ -5032,7 +5032,7 @@ test_expect_failure '12h: renaming a file within a renamed directory' '
 #                source/bar vs. source/subdir/bar
 
 test_setup_12i () {
-	test_create_repo 12i &&
+	git init 12i &&
 	(
 		cd 12i &&
 
@@ -5090,7 +5090,7 @@ test_expect_success '12i: Directory rename causes rename-to-self' '
 #   Expected: {foo, bar, baz_2}, with conflicts on bar vs. subdir/bar
 
 test_setup_12j () {
-	test_create_repo 12j &&
+	git init 12j &&
 	(
 		cd 12j &&
 
@@ -5148,7 +5148,7 @@ test_expect_success '12j: Directory rename to root causes rename-to-self' '
 #   Expected: dirA/{foo, bar, baz_2}, with conflicts on dirA/bar vs. dirB/bar
 
 test_setup_12k () {
-	test_create_repo 12k &&
+	git init 12k &&
 	(
 		cd 12k &&
 
@@ -5218,7 +5218,7 @@ test_expect_success '12k: Directory rename with sibling causes rename-to-self' '
 #   is needed for there to be a sub1/ -> sub3/ rename.
 
 test_setup_12l () {
-	test_create_repo 12l_$1 &&
+	git init 12l_$1 &&
 	(
 		cd 12l_$1 &&
 
@@ -5322,7 +5322,7 @@ test_expect_merge_algorithm failure success '12l (A into B): Rename into each ot
 #   Expected: y/{b,c,d,e/f}, with notices/conflicts for both y/d and y/e/f
 
 test_setup_13a () {
-	test_create_repo 13a_$1 &&
+	git init 13a_$1 &&
 	(
 		cd 13a_$1 &&
 
@@ -5409,7 +5409,7 @@ test_expect_success '13a(info): messages for newly added files' '
 #             one about content, and one about file location
 
 test_setup_13b () {
-	test_create_repo 13b_$1 &&
+	git init 13b_$1 &&
 	(
 		cd 13b_$1 &&
 
@@ -5496,7 +5496,7 @@ test_expect_success '13b(info): messages for transitive rename with conflicted c
 #             shown in testcase 13d.
 
 test_setup_13c () {
-	test_create_repo 13c_$1 &&
+	git init 13c_$1 &&
 	(
 		cd 13c_$1 &&
 
@@ -5584,7 +5584,7 @@ test_expect_success '13c(info): messages for rename/rename(1to1) via transitive
 #               No conflict in where a/y ends up, so put it in d/y.
 
 test_setup_13d () {
-	test_create_repo 13d_$1 &&
+	git init 13d_$1 &&
 	(
 		cd 13d_$1 &&
 
@@ -5710,7 +5710,7 @@ test_expect_success '13d(info): messages for rename/rename(1to1) via dual transi
 #          least avoids hitting a BUG().
 #
 test_setup_13e () {
-	test_create_repo 13e &&
+	git init 13e &&
 	(
 		cd 13e &&
 
diff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh
index 7b5f1c1dcd1..2bb8e7f09bb 100755
--- a/t/t6426-merge-skip-unneeded-updates.sh
+++ b/t/t6426-merge-skip-unneeded-updates.sh
@@ -38,7 +38,7 @@ test_description="merge cases"
 #   Expected: b_2
 
 test_setup_1a () {
-	test_create_repo 1a_$1 &&
+	git init 1a_$1 &&
 	(
 		cd 1a_$1 &&
 
@@ -136,7 +136,7 @@ test_expect_success '1a-R: Modify(A)/Modify(B), change on B subset of A' '
 #   Expected: c_2
 
 test_setup_2a () {
-	test_create_repo 2a_$1 &&
+	git init 2a_$1 &&
 	(
 		cd 2a_$1 &&
 
@@ -229,7 +229,7 @@ test_expect_success '2a-R: Modify/rename, merge into rename side' '
 #   Expected: c_2
 
 test_setup_2b () {
-	test_create_repo 2b_$1 &&
+	git init 2b_$1 &&
 	(
 		cd 2b_$1 &&
 
@@ -336,7 +336,7 @@ test_expect_success '2b-R: Rename+Mod(A)/Mod(B), B mods subset of A' '
 #         not make that particular mistake.
 
 test_setup_2c () {
-	test_create_repo 2c &&
+	git init 2c &&
 	(
 		cd 2c &&
 
@@ -437,7 +437,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '
 #   Expected: bar/{bq_2, whatever}
 
 test_setup_3a () {
-	test_create_repo 3a_$1 &&
+	git init 3a_$1 &&
 	(
 		cd 3a_$1 &&
 
@@ -537,7 +537,7 @@ test_expect_success '3a-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
 #   Expected: bar/{bq_2, whatever}
 
 test_setup_3b () {
-	test_create_repo 3b_$1 &&
+	git init 3b_$1 &&
 	(
 		cd 3b_$1 &&
 
@@ -642,7 +642,7 @@ test_expect_success '3b-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
 #   Expected: b_2 for merge, b_4 in working copy
 
 test_setup_4a () {
-	test_create_repo 4a &&
+	git init 4a &&
 	(
 		cd 4a &&
 
@@ -714,7 +714,7 @@ test_expect_merge_algorithm failure success '4a: Change on A, change on B subset
 #   Expected: c_2
 
 test_setup_4b () {
-	test_create_repo 4b &&
+	git init 4b &&
 	(
 		cd 4b &&
 
diff --git a/t/t6427-diff3-conflict-markers.sh b/t/t6427-diff3-conflict-markers.sh
index a9ee4cb207a..dd5fe6a4021 100755
--- a/t/t6427-diff3-conflict-markers.sh
+++ b/t/t6427-diff3-conflict-markers.sh
@@ -19,7 +19,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 #
 
 test_expect_success 'setup no merge base' '
-	test_create_repo no_merge_base &&
+	git init no_merge_base &&
 	(
 		cd no_merge_base &&
 
@@ -55,7 +55,7 @@ test_expect_success 'check no merge base' '
 #
 
 test_expect_success 'setup unique merge base' '
-	test_create_repo unique_merge_base &&
+	git init unique_merge_base &&
 	(
 		cd unique_merge_base &&
 
@@ -116,7 +116,7 @@ test_expect_success 'check unique merge base' '
 #
 
 test_expect_success 'setup multiple merge bases' '
-	test_create_repo multiple_merge_bases &&
+	git init multiple_merge_bases &&
 	(
 		cd multiple_merge_bases &&
 
@@ -190,7 +190,7 @@ test_expect_success 'check multiple merge bases' '
 '
 
 test_expect_success 'rebase --merge describes parent of commit being picked' '
-	test_create_repo rebase &&
+	git init rebase &&
 	(
 		cd rebase &&
 		test_commit base file &&
@@ -212,7 +212,7 @@ test_expect_success 'rebase --apply describes fake ancestor base' '
 '
 
 test_setup_zdiff3 () {
-	test_create_repo zdiff3 &&
+	git init zdiff3 &&
 	(
 		cd zdiff3 &&
 
diff --git a/t/t6428-merge-conflicts-sparse.sh b/t/t6428-merge-conflicts-sparse.sh
index 064be1b629e..9919c3fa7cd 100755
--- a/t/t6428-merge-conflicts-sparse.sh
+++ b/t/t6428-merge-conflicts-sparse.sh
@@ -29,7 +29,7 @@ test_description="merge cases"
 # Testcase basic, conflicting changes in 'numerals'
 
 test_setup_numerals () {
-	test_create_repo numerals_$1 &&
+	git init numerals_$1 &&
 	(
 		cd numerals_$1 &&
 
diff --git a/t/t6429-merge-sequence-rename-caching.sh b/t/t6429-merge-sequence-rename-caching.sh
index e1ce9199164..7a630d970c6 100755
--- a/t/t6429-merge-sequence-rename-caching.sh
+++ b/t/t6429-merge-sequence-rename-caching.sh
@@ -35,7 +35,7 @@ test_description="remember regular & dir renames in sequence of merges"
 # preventing us from finding new renames.
 #
 test_expect_success 'caching renames does not preclude finding new ones' '
-	test_create_repo caching-renames-and-new-renames &&
+	git init caching-renames-and-new-renames &&
 	(
 		cd caching-renames-and-new-renames &&
 
@@ -106,7 +106,7 @@ test_expect_success 'caching renames does not preclude finding new ones' '
 # should be able to only run rename detection on the upstream side one
 # time.)
 test_expect_success 'cherry-pick both a commit and its immediate revert' '
-	test_create_repo pick-commit-and-its-immediate-revert &&
+	git init pick-commit-and-its-immediate-revert &&
 	(
 		cd pick-commit-and-its-immediate-revert &&
 
@@ -162,7 +162,7 @@ test_expect_success 'cherry-pick both a commit and its immediate revert' '
 # could cause a spurious rename/add conflict.
 #
 test_expect_success 'rename same file identically, then reintroduce it' '
-	test_create_repo rename-rename-1to1-then-add-old-filename &&
+	git init rename-rename-1to1-then-add-old-filename &&
 	(
 		cd rename-rename-1to1-then-add-old-filename &&
 
@@ -229,7 +229,7 @@ test_expect_success 'rename same file identically, then reintroduce it' '
 # cached, the directory rename could put newfile in the wrong directory.
 #
 test_expect_success 'rename same file identically, then add file to old dir' '
-	test_create_repo rename-rename-1to1-then-add-file-to-old-dir &&
+	git init rename-rename-1to1-then-add-file-to-old-dir &&
 	(
 		cd rename-rename-1to1-then-add-file-to-old-dir &&
 
@@ -311,7 +311,7 @@ test_expect_success 'rename same file identically, then add file to old dir' '
 # should avoid the need to re-detect upstream renames.)
 #
 test_expect_success 'cached dir rename does not prevent noticing later conflict' '
-	test_create_repo dir-rename-cache-not-occluding-later-conflict &&
+	git init dir-rename-cache-not-occluding-later-conflict &&
 	(
 		cd dir-rename-cache-not-occluding-later-conflict &&
 
@@ -365,7 +365,7 @@ test_expect_success 'cached dir rename does not prevent noticing later conflict'
 
 # Helper for the next two tests
 test_setup_upstream_rename () {
-	test_create_repo $1 &&
+	git init $1 &&
 	(
 		cd $1 &&
 
@@ -537,7 +537,7 @@ test_expect_success 'dir rename unneeded, then rename existing file into old dir
 
 # Helper for the next two tests
 test_setup_topic_rename () {
-	test_create_repo $1 &&
+	git init $1 &&
 	(
 		cd $1 &&
 
diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh
index c253bf759ab..744c7b8bf87 100755
--- a/t/t6437-submodule-merge.sh
+++ b/t/t6437-submodule-merge.sh
@@ -310,7 +310,7 @@ test_expect_success 'recursive merge with submodule' '
 #   Expected: path/ is submodule and file contents for B's path are somewhere
 
 test_expect_success 'setup file/submodule conflict' '
-	test_create_repo file-submodule &&
+	git init file-submodule &&
 	(
 		cd file-submodule &&
 
@@ -325,7 +325,7 @@ test_expect_success 'setup file/submodule conflict' '
 		git commit -m B &&
 
 		git checkout A &&
-		test_create_repo path &&
+		git init path &&
 		test_commit -C path world &&
 		git submodule add ./path &&
 		git commit -m A
@@ -385,7 +385,7 @@ test_expect_success 'file/submodule conflict; merge --abort works afterward' '
 #     under the submodule to be treated as untracked or in the way.
 
 test_expect_success 'setup directory/submodule conflict' '
-	test_create_repo directory-submodule &&
+	git init directory-submodule &&
 	(
 		cd directory-submodule &&
 
@@ -408,7 +408,7 @@ test_expect_success 'setup directory/submodule conflict' '
 		git commit -m B2 &&
 
 		git checkout A &&
-		test_create_repo path &&
+		git init path &&
 		test_commit -C path hello world &&
 		git submodule add ./path &&
 		git commit -m A

base-commit: 6a475b71f8c4ce708d69fdc9317aefbde3769e25
-- 
gitgitgadget

^ permalink raw reply related	[relevance 1%]

* Re: [PATCH v4 1/3] hide-refs: add hook to force hide refs
  @ 2022-08-19 15:30  4% ` 孙超
  0 siblings, 0 replies; 200+ results
From: 孙超 @ 2022-08-19 15:30 UTC (permalink / raw)
  To: Calvin Wan; +Cc: Sun Chao via GitGitGadget, Git List, Sun Chao



> On Aug 19, 2022, at 02:51, Calvin Wan <calvinwan@google.com> wrote:
> 
> Hi Sun,
> 
> A couple of us from the mailing list reviewed your patch yesterday during
> review club and I'm going to summarize our thoughts here.
> 
> Starting with you commit message, it is not entirely clear what your
> series is trying to achieve. While you do attempt to set the scene in
> the first paragraph, it would be better to go into more detail of how a
> user would use this hook. Do you already have something like this
> working downstream for you at your company? If so, that would be a good
> reference to provide context for readers. If not, try to sell your use
> case better to us by providing examples and anything else this could be
> useful for. Your commit message should also have a broad description of
> the changes, explain difficult/tricky changes, and dicuss
> tradeoffs/complexity.  

First, I really appreciate that you spent your precious time reviewing my
patches and tell me where is not enough and how to do it. I will check
my patches again and I wish I can update it with better descriptions in
a week (I can do it only in the evening time so it need couple days).

> 
> As Junio has noted, there is a lot going on here. For example, changes
> you make to pre-existing functionality should come with an explanation.
> One way to manage this complexity for reviewers is by splitting up your
> changes into more logically different commits.

Yes, Junio had given me some important comments just like yours and I
still very seriously consider how to solve them. I will split up my changes
and write more explanations.

> 
> For your tests, they should show a working example of thie feature, the
> motivation behind the feature, and a description of the interface. The

Thanks, will do it.

> structure of the tests is also confusing and there seem to be many
> unnecessary tests. It is OK to be verbose and obvious in tests -- it is
> very important for reviewers and others looking at your tests to easily
> understand what each test is doing.

Thanks, I will refactor the tests and add more descriptions to make them easily
understand.

> 
>> `hide-refs` to hide the private data.
> 
> Why is Gerrit being centralized relevant to ref-level access control?

Will explain it in my next new update why I think so.

> 
>> to the client and can not fetch its private data even in protocol V2.
> 
> What is the reasoning behind special casing v2 here? Is it possible
> you're confusing remote helper protocol and wire protocol?

I will try to learn about the differences between them and answer the
question here.

> 
>> +static int lazy_load_hidden = 0;
>> +// lazy load hidden refs for protocol V2
>> +void lazy_load_hidden_refs(void) {
>> +	lazy_load_hidden = 1;
>> +}
>> +
> 
> What does lazy_load_hidden do?
> 
> I know this is a lot to go thru for your first patch series, but please
> don't get discouraged! Feel free to ask any questions if you're confused
> about any of the feedback. We didn't dive too deeply into the specifics
> of your code since we believe there are higher level fundamental issues
> you should address first. There has also been similar discussion regarding
> differing ACLs within a single repository so it is probably worth a read
> here[1].

I will not be discouraged, and I’m very glad and appreciate that I can receive
important review notes from Junio and the mailing list. I want to do more
contributions to git and wish one day I can help to review other patches. But
first I will fix my patches and make it more clearly.

I need to reply first and wishing not making noise, because I think it will
take me couple days to resolve the review comments and update the patches again.

Thanks again.

> 
> [1] <CAJoAoZmsuwYCA8XGziEA-qwghg9h22Af98JQE1AuHHBRfQgrDA@mail.gmail.com>
> 


^ permalink raw reply	[relevance 4%]

* [PATCH v8 07/14] merge-one-file: rewrite in C
  @ 2022-08-09 18:54  1%   ` Alban Gruin
  0 siblings, 0 replies; 200+ results
From: Alban Gruin @ 2022-08-09 18:54 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Phillip Wood, Johannes Schindelin, Alban Gruin

This rewrites `git merge-one-file' from shell to C.  This port is not
completely straightforward: to save precious cycles by avoiding reading
and flushing the index repeatedly, write temporary files when an
operation can be performed in-memory, or allow other function to use the
rewrite without forking nor worrying about the index, the calls to
external processes are replaced by calls to functions in libgit.a:

 - calls to `update-index --add --cacheinfo' are replaced by calls to
   add_to_index_cacheinfo();

 - calls to `update-index --remove' are replaced by calls to
   remove_file_from_index();

 - calls to `checkout-index -u -f' are replaced by calls to
   checkout_entry();

 - calls to `unpack-file' and `merge-files' are replaced by calls to
   read_mmblob() and xdl_merge(), respectively, to merge files
   in-memory;

 - calls to `checkout-index -f --stage=2' are removed, as this is needed
   to have the correct permission bits on the merged file from the
   script, but not in the C version;

 - calls to `update-index' are replaced by calls to add_file_to_index().

The bulk of the rewrite is done in a new file in libgit.a,
merge-strategies.c.  This will enable the resolve and octopus strategies
to directly call it instead of forking.

This also fixes a bug present in the original script: instead of
checking if a _regular_ file exists when a file exists in the branch to
merge, but not in our branch, the rewritten version checks if a file of
any kind (ie. a directory, ...) exists.  This fixes the tests t6035.14,
where the branch to merge had a new file, `a/b', but our branch had a
directory there; it should have failed because a directory exists, but
it did not because there was no regular file called `a/b'.  This test is
now marked as successful.

This also teaches `merge-index' to call merge_three_way() (when invoked
with `--use=merge-one-file') without forking using a new callback,
merge_one_file_func().

To avoid any issue with a shrinking index because of the merge function
used (directly in the process or by forking), as described earlier, the
iterator of the loop of merge_all_index() is increased by the number of
entries with the same name, minus the difference between the number of
entries in the index before and after the merge.

This should handle a shrinking index correctly, but could lead to issues
with a growing index.  However, this case is not treated, as there is no
callback that can produce such a case.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
---
 Makefile                        |   2 +-
 builtin.h                       |   1 +
 builtin/merge-index.c           |   4 +-
 builtin/merge-one-file.c        |  92 ++++++++++++++
 git-merge-one-file.sh           | 167 -------------------------
 git.c                           |   1 +
 merge-strategies.c              | 208 +++++++++++++++++++++++++++++++-
 merge-strategies.h              |  13 ++
 t/t6060-merge-index.sh          |   2 +-
 t/t6415-merge-dir-to-symlink.sh |   2 +-
 10 files changed, 317 insertions(+), 175 deletions(-)
 create mode 100644 builtin/merge-one-file.c
 delete mode 100755 git-merge-one-file.sh

diff --git a/Makefile b/Makefile
index 40d1be4e5e..e2e6cbbb41 100644
--- a/Makefile
+++ b/Makefile
@@ -631,7 +631,6 @@ SCRIPT_SH += git-bisect.sh
 SCRIPT_SH += git-difftool--helper.sh
 SCRIPT_SH += git-filter-branch.sh
 SCRIPT_SH += git-merge-octopus.sh
-SCRIPT_SH += git-merge-one-file.sh
 SCRIPT_SH += git-merge-resolve.sh
 SCRIPT_SH += git-mergetool.sh
 SCRIPT_SH += git-quiltimport.sh
@@ -1186,6 +1185,7 @@ BUILTIN_OBJS += builtin/mailsplit.o
 BUILTIN_OBJS += builtin/merge-base.o
 BUILTIN_OBJS += builtin/merge-file.o
 BUILTIN_OBJS += builtin/merge-index.o
+BUILTIN_OBJS += builtin/merge-one-file.o
 BUILTIN_OBJS += builtin/merge-ours.o
 BUILTIN_OBJS += builtin/merge-recursive.o
 BUILTIN_OBJS += builtin/merge-tree.o
diff --git a/builtin.h b/builtin.h
index 40e9ecc848..cdbe91bbe8 100644
--- a/builtin.h
+++ b/builtin.h
@@ -182,6 +182,7 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix);
 int cmd_merge_index(int argc, const char **argv, const char *prefix);
 int cmd_merge_ours(int argc, const char **argv, const char *prefix);
 int cmd_merge_file(int argc, const char **argv, const char *prefix);
+int cmd_merge_one_file(int argc, const char **argv, const char *prefix);
 int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
 int cmd_merge_tree(int argc, const char **argv, const char *prefix);
 int cmd_mktag(int argc, const char **argv, const char *prefix);
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index aba3ba5694..a242b357f8 100644
--- a/builtin/merge-index.c
+++ b/builtin/merge-index.c
@@ -72,9 +72,11 @@ int cmd_merge_index(int argc, const char **argv, const char *prefix)
 
 	if (skip_prefix(pgm, "--use=", &use_internal)) {
 		if (!strcmp(use_internal, "merge-one-file"))
-			pgm = "git-merge-one-file";
+			merge_action = merge_one_file_func;
 		else
 			die(_("git merge-index: unknown internal program %s"), use_internal);
+
+		repo_hold_locked_index(r, &lock, LOCK_DIE_ON_ERROR);
 	}
 
 	for (; i < argc; i++) {
diff --git a/builtin/merge-one-file.c b/builtin/merge-one-file.c
new file mode 100644
index 0000000000..ec718cc1c9
--- /dev/null
+++ b/builtin/merge-one-file.c
@@ -0,0 +1,92 @@
+/*
+ * Builtin "git merge-one-file"
+ *
+ * Copyright (c) 2020 Alban Gruin
+ *
+ * Based on git-merge-one-file.sh, written by Linus Torvalds.
+ *
+ * This is the git per-file merge utility, called with
+ *
+ *   argv[1] - original file object name (or empty)
+ *   argv[2] - file in branch1 object name (or empty)
+ *   argv[3] - file in branch2 object name (or empty)
+ *   argv[4] - pathname in repository
+ *   argv[5] - original file mode (or empty)
+ *   argv[6] - file in branch1 mode (or empty)
+ *   argv[7] - file in branch2 mode (or empty)
+ *
+ * Handle some trivial cases. The _really_ trivial cases have been
+ * handled already by git read-tree, but that one doesn't do any merges
+ * that might change the tree layout.
+ */
+
+#include "cache.h"
+#include "builtin.h"
+#include "lockfile.h"
+#include "merge-strategies.h"
+
+static const char builtin_merge_one_file_usage[] =
+	"git merge-one-file <orig blob> <our blob> <their blob> <path> "
+	"<orig mode> <our mode> <their mode>\n\n"
+	"Blob ids and modes should be empty for missing files.";
+
+static int read_param(const char *name, const char *arg_blob, const char *arg_mode,
+		      struct object_id *blob, struct object_id **p_blob, unsigned int *mode)
+{
+	if (*arg_blob && !get_oid_hex(arg_blob, blob)) {
+		char *last;
+
+		*p_blob = blob;
+		*mode = strtol(arg_mode, &last, 8);
+
+		if (*last)
+			return error(_("invalid '%s' mode: expected nothing, got '%c'"), name, *last);
+		else if (!(S_ISREG(*mode) || S_ISDIR(*mode) || S_ISLNK(*mode)))
+			return error(_("invalid '%s' mode: %o"), name, *mode);
+	} else if (!*arg_blob && *arg_mode)
+		return error(_("no '%s' object id given, but a mode was still given."), name);
+
+	return 0;
+}
+
+int cmd_merge_one_file(int argc, const char **argv, const char *prefix)
+{
+	struct object_id orig_blob, our_blob, their_blob,
+		*p_orig_blob = NULL, *p_our_blob = NULL, *p_their_blob = NULL;
+	unsigned int orig_mode = 0, our_mode = 0, their_mode = 0, ret = 0;
+	struct lock_file lock = LOCK_INIT;
+	struct repository *r = the_repository;
+
+	if (argc != 8)
+		usage(builtin_merge_one_file_usage);
+
+	if (repo_read_index(r) < 0)
+		die("invalid index");
+
+	repo_hold_locked_index(r, &lock, LOCK_DIE_ON_ERROR);
+
+	if (read_param("orig", argv[1], argv[5], &orig_blob,
+		       &p_orig_blob, &orig_mode))
+		ret = -1;
+
+	if (read_param("our", argv[2], argv[6], &our_blob,
+		       &p_our_blob, &our_mode))
+		ret = -1;
+
+	if (read_param("their", argv[3], argv[7], &their_blob,
+		       &p_their_blob, &their_mode))
+		ret = -1;
+
+	if (ret)
+		return ret;
+
+	ret = merge_three_way(r->index, p_orig_blob, p_our_blob, p_their_blob,
+			      argv[4], orig_mode, our_mode, their_mode);
+
+	if (ret) {
+		rollback_lock_file(&lock);
+		return !!ret;
+	}
+
+	return write_locked_index(r->index, &lock, COMMIT_LOCK);
+}
diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh
deleted file mode 100755
index f6d9852d2f..0000000000
--- a/git-merge-one-file.sh
+++ /dev/null
@@ -1,167 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) Linus Torvalds, 2005
-#
-# This is the git per-file merge script, called with
-#
-#   $1 - original file SHA1 (or empty)
-#   $2 - file in branch1 SHA1 (or empty)
-#   $3 - file in branch2 SHA1 (or empty)
-#   $4 - pathname in repository
-#   $5 - original file mode (or empty)
-#   $6 - file in branch1 mode (or empty)
-#   $7 - file in branch2 mode (or empty)
-#
-# Handle some trivial cases.. The _really_ trivial cases have
-# been handled already by git read-tree, but that one doesn't
-# do any merges that might change the tree layout.
-
-USAGE='<orig blob> <our blob> <their blob> <path>'
-USAGE="$USAGE <orig mode> <our mode> <their mode>"
-LONG_USAGE="usage: git merge-one-file $USAGE
-
-Blob ids and modes should be empty for missing files."
-
-SUBDIRECTORY_OK=Yes
-. git-sh-setup
-cd_to_toplevel
-require_work_tree
-
-if test $# != 7
-then
-	echo "$LONG_USAGE"
-	exit 1
-fi
-
-case "${1:-.}${2:-.}${3:-.}" in
-#
-# Deleted in both or deleted in one and unchanged in the other
-#
-"$1.." | "$1.$1" | "$1$1.")
-	if { test -z "$6" && test "$5" != "$7"; } ||
-	   { test -z "$7" && test "$5" != "$6"; }
-	then
-		echo "ERROR: File $4 deleted on one branch but had its" >&2
-		echo "ERROR: permissions changed on the other." >&2
-		exit 1
-	fi
-
-	if test -n "$2"
-	then
-		echo "Removing $4"
-	else
-		# read-tree checked that index matches HEAD already,
-		# so we know we do not have this path tracked.
-		# there may be an unrelated working tree file here,
-		# which we should just leave unmolested.  Make sure
-		# we do not have it in the index, though.
-		exec git update-index --remove -- "$4"
-	fi
-	if test -f "$4"
-	then
-		rm -f -- "$4" &&
-		rmdir -p "$(expr "z$4" : 'z\(.*\)/')" 2>/dev/null || :
-	fi &&
-		exec git update-index --remove -- "$4"
-	;;
-
-#
-# Added in one.
-#
-".$2.")
-	# the other side did not add and we added so there is nothing
-	# to be done, except making the path merged.
-	exec git update-index --add --cacheinfo "$6" "$2" "$4"
-	;;
-"..$3")
-	echo "Adding $4"
-	if test -f "$4"
-	then
-		echo "ERROR: untracked $4 is overwritten by the merge." >&2
-		exit 1
-	fi
-	git update-index --add --cacheinfo "$7" "$3" "$4" &&
-		exec git checkout-index -u -f -- "$4"
-	;;
-
-#
-# Added in both, identically (check for same permissions).
-#
-".$3$2")
-	if test "$6" != "$7"
-	then
-		echo "ERROR: File $4 added identically in both branches," >&2
-		echo "ERROR: but permissions conflict $6->$7." >&2
-		exit 1
-	fi
-	echo "Adding $4"
-	git update-index --add --cacheinfo "$6" "$2" "$4" &&
-		exec git checkout-index -u -f -- "$4"
-	;;
-
-#
-# Modified in both, but differently.
-#
-"$1$2$3" | ".$2$3")
-
-	case ",$6,$7," in
-	*,120000,*)
-		echo "ERROR: $4: Not merging symbolic link changes." >&2
-		exit 1
-		;;
-	*,160000,*)
-		echo "ERROR: $4: Not merging conflicting submodule changes." >&2
-		exit 1
-		;;
-	esac
-
-	src1=$(git unpack-file $2)
-	src2=$(git unpack-file $3)
-	case "$1" in
-	'')
-		echo "Added $4 in both, but differently."
-		orig=$(git unpack-file $(git hash-object /dev/null))
-		;;
-	*)
-		echo "Auto-merging $4"
-		orig=$(git unpack-file $1)
-		;;
-	esac
-
-	git merge-file "$src1" "$orig" "$src2"
-	ret=$?
-	msg=
-	if test $ret != 0 || test -z "$1"
-	then
-		msg='content conflict'
-		ret=1
-	fi
-
-	# Create the working tree file, using "our tree" version from the
-	# index, and then store the result of the merge.
-	git checkout-index -f --stage=2 -- "$4" && cat "$src1" >"$4" || exit 1
-	rm -f -- "$orig" "$src1" "$src2"
-
-	if test "$6" != "$7"
-	then
-		if test -n "$msg"
-		then
-			msg="$msg, "
-		fi
-		msg="${msg}permissions conflict: $5->$6,$7"
-		ret=1
-	fi
-
-	if test $ret != 0
-	then
-		echo "ERROR: $msg in $4" >&2
-		exit 1
-	fi
-	exec git update-index -- "$4"
-	;;
-
-*)
-	echo "ERROR: $4: Not handling case $1 -> $2 -> $3" >&2
-	;;
-esac
-exit 1
diff --git a/git.c b/git.c
index e5d62fa5a9..f5d3c6cb39 100644
--- a/git.c
+++ b/git.c
@@ -561,6 +561,7 @@ static struct cmd_struct commands[] = {
 	{ "merge-file", cmd_merge_file, RUN_SETUP_GENTLY },
 	{ "merge-index", cmd_merge_index, RUN_SETUP | NO_PARSEOPT },
 	{ "merge-ours", cmd_merge_ours, RUN_SETUP | NO_PARSEOPT },
+	{ "merge-one-file", cmd_merge_one_file, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
 	{ "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
 	{ "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
 	{ "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
diff --git a/merge-strategies.c b/merge-strategies.c
index 418c9dd710..373b69c10b 100644
--- a/merge-strategies.c
+++ b/merge-strategies.c
@@ -1,5 +1,198 @@
 #include "cache.h"
+#include "dir.h"
+#include "entry.h"
 #include "merge-strategies.h"
+#include "xdiff-interface.h"
+
+static int add_merge_result_to_index(struct index_state *istate, unsigned int mode,
+				     const struct object_id *oid, const char *path,
+				     int checkout)
+{
+	struct cache_entry *ce;
+	int res;
+
+	res = add_to_index_cacheinfo(istate, mode, oid, path, 0, 1, 1, &ce);
+	if (res == -1)
+		return error(_("Invalid path '%s'"), path);
+	else if (res == -2)
+		return -1;
+
+	if (checkout) {
+		struct checkout state = CHECKOUT_INIT;
+
+		state.istate = istate;
+		state.force = 1;
+		state.base_dir = "";
+		state.base_dir_len = 0;
+
+		if (checkout_entry(ce, &state, NULL, NULL) < 0)
+			return error(_("%s: cannot checkout file"), path);
+	}
+
+	return 0;
+}
+
+static int merge_one_file_deleted(struct index_state *istate,
+				  const struct object_id *our_blob,
+				  const struct object_id *their_blob, const char *path,
+				  unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode)
+{
+	if ((!our_blob && orig_mode != their_mode) ||
+	    (!their_blob && orig_mode != our_mode))
+		return error(_("File %s deleted on one branch but had its "
+			       "permissions changed on the other."), path);
+
+	if (our_blob) {
+		printf(_("Removing %s\n"), path);
+
+		if (file_exists(path))
+			remove_path(path);
+	}
+
+	if (remove_file_from_index(istate, path))
+		return error("%s: cannot remove from the index", path);
+	return 0;
+}
+
+static int do_merge_one_file(struct index_state *istate,
+			     const struct object_id *orig_blob,
+			     const struct object_id *our_blob,
+			     const struct object_id *their_blob, const char *path,
+			     unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode)
+{
+	int ret, i, dest;
+	ssize_t written;
+	mmbuffer_t result = {NULL, 0};
+	mmfile_t mmfs[3];
+	xmparam_t xmp = {{0}};
+
+	if (our_mode == S_IFLNK || their_mode == S_IFLNK)
+		return error(_("%s: Not merging symbolic link changes."), path);
+	else if (our_mode == S_IFGITLINK || their_mode == S_IFGITLINK)
+		return error(_("%s: Not merging conflicting submodule changes."), path);
+
+	if (orig_blob) {
+		printf(_("Auto-merging %s\n"), path);
+		read_mmblob(mmfs + 0, orig_blob);
+	} else {
+		printf(_("Added %s in both, but differently.\n"), path);
+		read_mmblob(mmfs + 0, null_oid());
+	}
+
+	read_mmblob(mmfs + 1, our_blob);
+	read_mmblob(mmfs + 2, their_blob);
+
+	xmp.level = XDL_MERGE_ZEALOUS_ALNUM;
+	xmp.style = 0;
+	xmp.favor = 0;
+
+	ret = xdl_merge(mmfs + 0, mmfs + 1, mmfs + 2, &xmp, &result);
+
+	for (i = 0; i < 3; i++)
+		free(mmfs[i].ptr);
+
+	if (ret < 0) {
+		free(result.ptr);
+		return error(_("Failed to execute internal merge"));
+	}
+
+	if (ret > 0 || !orig_blob)
+		ret = error(_("content conflict in %s"), path);
+	if (our_mode != their_mode)
+		ret = error(_("permission conflict: %o->%o,%o in %s"),
+			    orig_mode, our_mode, their_mode, path);
+
+	unlink(path);
+	if ((dest = open(path, O_WRONLY | O_CREAT, our_mode)) < 0) {
+		free(result.ptr);
+		return error_errno(_("failed to open file '%s'"), path);
+	}
+
+	written = write_in_full(dest, result.ptr, result.size);
+	close(dest);
+
+	free(result.ptr);
+
+	if (written < 0)
+		return error_errno(_("failed to write to '%s'"), path);
+	if (ret)
+		return ret;
+
+	return add_file_to_index(istate, path, 0);
+}
+
+int merge_three_way(struct index_state *istate,
+		    const struct object_id *orig_blob,
+		    const struct object_id *our_blob,
+		    const struct object_id *their_blob, const char *path,
+		    unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode)
+{
+	if (orig_blob &&
+	    ((!our_blob && !their_blob) ||
+	     (!their_blob && our_blob && oideq(orig_blob, our_blob)) ||
+	     (!our_blob && their_blob && oideq(orig_blob, their_blob)))) {
+		/* Deleted in both or deleted in one and unchanged in the other. */
+		return merge_one_file_deleted(istate, our_blob, their_blob, path,
+					      orig_mode, our_mode, their_mode);
+	} else if (!orig_blob && our_blob && !their_blob) {
+		/*
+		 * Added in ours.  The other side did not add and we
+		 * added so there is nothing to be done, except making
+		 * the path merged.
+		 */
+		return add_merge_result_to_index(istate, our_mode, our_blob, path, 0);
+	} else if (!orig_blob && !our_blob && their_blob) {
+		printf(_("Adding %s\n"), path);
+
+		if (file_exists(path))
+			return error(_("untracked %s is overwritten by the merge."), path);
+
+		return add_merge_result_to_index(istate, their_mode, their_blob, path, 1);
+	} else if (!orig_blob && our_blob && their_blob &&
+		   oideq(our_blob, their_blob)) {
+		/* Added in both, identically (check for same permissions). */
+		if (our_mode != their_mode)
+			return error(_("File %s added identically in both branches, "
+				       "but permissions conflict %o->%o."),
+				     path, our_mode, their_mode);
+
+		printf(_("Adding %s\n"), path);
+
+		return add_merge_result_to_index(istate, our_mode, our_blob, path, 1);
+	} else if (our_blob && their_blob) {
+		/* Modified in both, but differently. */
+		return do_merge_one_file(istate,
+					 orig_blob, our_blob, their_blob, path,
+					 orig_mode, our_mode, their_mode);
+	} else {
+		char orig_hex[GIT_MAX_HEXSZ] = {0}, our_hex[GIT_MAX_HEXSZ] = {0},
+			their_hex[GIT_MAX_HEXSZ] = {0};
+
+		if (orig_blob)
+			oid_to_hex_r(orig_hex, orig_blob);
+		if (our_blob)
+			oid_to_hex_r(our_hex, our_blob);
+		if (their_blob)
+			oid_to_hex_r(their_hex, their_blob);
+
+		return error(_("%s: Not handling case %s -> %s -> %s"),
+			     path, orig_hex, our_hex, their_hex);
+	}
+
+	return 0;
+}
+
+int merge_one_file_func(struct index_state *istate,
+			const struct object_id *orig_blob,
+			const struct object_id *our_blob,
+			const struct object_id *their_blob, const char *path,
+			unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode,
+			void *data)
+{
+	return merge_three_way(istate,
+			       orig_blob, our_blob, their_blob, path,
+			       orig_mode, our_mode, their_mode);
+}
 
 static int merge_entry(struct index_state *istate, unsigned int pos,
 		       const char *path, int *err, merge_fn fn, void *data)
@@ -54,7 +247,7 @@ int merge_all_index(struct index_state *istate, int oneshot, int quiet,
 		    merge_fn fn, void *data)
 {
 	int err = 0, ret;
-	unsigned int i;
+	unsigned int i, prev_nr;
 
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(istate);
@@ -63,10 +256,17 @@ int merge_all_index(struct index_state *istate, int oneshot, int quiet,
 		if (!ce_stage(ce))
 			continue;
 
+		prev_nr = istate->cache_nr;
 		ret = merge_entry(istate, i, ce->name, &err, fn, data);
-		if (ret > 0)
-			i += ret - 1;
-		else if (ret == -1)
+		if (ret > 0) {
+			/*
+			 * Don't bother handling an index that has
+			 * grown, since merge_one_file_func() can't grow
+			 * it, and merge_one_file_spawn() can't change
+			 * it.
+			 */
+			i += ret - (prev_nr - istate->cache_nr) - 1;
+		} else if (ret == -1)
 			return -1;
 
 		if (err && !oneshot) {
diff --git a/merge-strategies.h b/merge-strategies.h
index 88f476f170..8705a550ca 100644
--- a/merge-strategies.h
+++ b/merge-strategies.h
@@ -3,6 +3,12 @@
 
 #include "object.h"
 
+int merge_three_way(struct index_state *istate,
+		    const struct object_id *orig_blob,
+		    const struct object_id *our_blob,
+		    const struct object_id *their_blob, const char *path,
+		    unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode);
+
 typedef int (*merge_fn)(struct index_state *istate,
 			const struct object_id *orig_blob,
 			const struct object_id *our_blob,
@@ -10,6 +16,13 @@ typedef int (*merge_fn)(struct index_state *istate,
 			unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode,
 			void *data);
 
+int merge_one_file_func(struct index_state *istate,
+			const struct object_id *orig_blob,
+			const struct object_id *our_blob,
+			const struct object_id *their_blob, const char *path,
+			unsigned int orig_mode, unsigned int our_mode, unsigned int their_mode,
+			void *data);
+
 int merge_index_path(struct index_state *istate, int oneshot, int quiet,
 		     const char *path, merge_fn fn, void *data);
 int merge_all_index(struct index_state *istate, int oneshot, int quiet,
diff --git a/t/t6060-merge-index.sh b/t/t6060-merge-index.sh
index 3845a9d3cc..9976996c80 100755
--- a/t/t6060-merge-index.sh
+++ b/t/t6060-merge-index.sh
@@ -70,7 +70,7 @@ test_expect_success 'merge-one-file fails without a work tree' '
 	(cd bare.git &&
 	 GIT_INDEX_FILE=$PWD/merge.index &&
 	 export GIT_INDEX_FILE &&
-	 test_must_fail git merge-index git-merge-one-file -a
+	 test_must_fail git merge-index --use=merge-one-file -a
 	)
 '
 
diff --git a/t/t6415-merge-dir-to-symlink.sh b/t/t6415-merge-dir-to-symlink.sh
index 2655e295f5..10bc5eb8c4 100755
--- a/t/t6415-merge-dir-to-symlink.sh
+++ b/t/t6415-merge-dir-to-symlink.sh
@@ -99,7 +99,7 @@ test_expect_success SYMLINKS 'a/b was resolved as symlink' '
 	test -h a/b
 '
 
-test_expect_failure 'do not lose untracked in merge (resolve)' '
+test_expect_success 'do not lose untracked in merge (resolve)' '
 	git reset --hard &&
 	git checkout baseline^0 &&
 	>a/b/c/e &&
-- 
2.37.1.412.gcfdce49ffd


^ permalink raw reply related	[relevance 1%]

* [PATCH v2 1/6] t6424: make sure a failed merge preserves local changes
  @ 2022-06-19  6:50  3%   ` Junio C Hamano via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano via GitGitGadget @ 2022-06-19  6:50 UTC (permalink / raw)
  To: git; +Cc: ZheNing Hu, Elijah Newren, Junio C Hamano

From: Junio C Hamano <gitster@pobox.com>

We do make sure that an attempt to merge with various forms of local
changes will "fail", but the point of stopping the merge is so that
we refrain from discarding uncommitted local changes that could be
precious.  Add a few more checks for each case to make sure the
local changes are left intact.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t6424-merge-unrelated-index-changes.sh | 32 ++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/t/t6424-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh
index 89dd544f388..b6e424a427b 100755
--- a/t/t6424-merge-unrelated-index-changes.sh
+++ b/t/t6424-merge-unrelated-index-changes.sh
@@ -71,7 +71,9 @@ test_expect_success 'ff update' '
 	git merge E^0 &&
 
 	test_must_fail git rev-parse HEAD:random_file &&
-	test "$(git diff --name-only --cached E)" = "random_file"
+	test "$(git diff --name-only --cached E)" = "random_file" &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file
 '
 
 test_expect_success 'ff update, important file modified' '
@@ -83,6 +85,8 @@ test_expect_success 'ff update, important file modified' '
 	git add subdir/e &&
 
 	test_must_fail git merge E^0 &&
+	test_path_is_file subdir/e &&
+	git rev-parse --verify :subdir/e &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -93,6 +97,8 @@ test_expect_success 'resolve, trivial' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s resolve C^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -103,6 +109,8 @@ test_expect_success 'resolve, non-trivial' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s resolve D^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -113,6 +121,8 @@ test_expect_success 'recursive' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s recursive C^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -145,9 +155,12 @@ test_expect_success 'recursive, when file has staged changes not matching HEAD n
 	mkdir subdir &&
 	test_seq 1 10 >subdir/a &&
 	git add subdir/a &&
+	git rev-parse --verify :subdir/a >expect &&
 
 	# We have staged changes; merge should error out
 	test_must_fail git merge -s recursive E^0 2>err &&
+	git rev-parse --verify :subdir/a >actual &&
+	test_cmp expect actual &&
 	test_i18ngrep "changes to the following files would be overwritten" err
 '
 
@@ -158,9 +171,12 @@ test_expect_success 'recursive, when file has staged changes matching what a mer
 	mkdir subdir &&
 	test_seq 1 11 >subdir/a &&
 	git add subdir/a &&
+	git rev-parse --verify :subdir/a >expect &&
 
 	# We have staged changes; merge should error out
 	test_must_fail git merge -s recursive E^0 2>err &&
+	git rev-parse --verify :subdir/a >actual &&
+	test_cmp expect actual &&
 	test_i18ngrep "changes to the following files would be overwritten" err
 '
 
@@ -171,7 +187,9 @@ test_expect_success 'octopus, unrelated file touched' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge C^0 D^0 &&
-	test_path_is_missing .git/MERGE_HEAD
+	test_path_is_missing .git/MERGE_HEAD &&
+	git rev-parse --verify :random_file &&
+	test_path_exists random_file
 '
 
 test_expect_success 'octopus, related file removed' '
@@ -181,6 +199,8 @@ test_expect_success 'octopus, related file removed' '
 	git rm b &&
 
 	test_must_fail git merge C^0 D^0 &&
+	test_path_is_missing b &&
+	test_must_fail git rev-parse --verify :b &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -189,8 +209,12 @@ test_expect_success 'octopus, related file modified' '
 	git checkout B^0 &&
 
 	echo 12 >>a && git add a &&
+	git rev-parse --verify :a >expect &&
 
 	test_must_fail git merge C^0 D^0 &&
+	test_path_is_file a &&
+	git rev-parse --verify :a >actual &&
+	test_cmp expect actual &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -201,6 +225,8 @@ test_expect_success 'ours' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s ours C^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -211,6 +237,8 @@ test_expect_success 'subtree' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s subtree E^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* [PATCH v2 2/4] merge with untracked file that are the same without failure
  2022-05-27 19:55  2% ` [PATCH v2 0/4] " Jonathan Bressat
@ 2022-05-27 19:55  2%   ` Jonathan Bressat
  0 siblings, 0 replies; 200+ results
From: Jonathan Bressat @ 2022-05-27 19:55 UTC (permalink / raw)
  To: git.jonathan.bressat
  Cc: Matthieu.Moy, cogoni.guillaume, git, gitster, guillaume.cogoni,
	jonathan.bressat

Keep the old behavior as default.

Add the option --overwrite-same-content, when this option is used merge
will overwrite untracked file that have the same content.

It make the merge nicer to the user, usefull for a simple utilisation,
for exemple if you copy and paste files from another project and then
you decide to pull this project, git will not proceed even if you didn't
modify those files.

t7615 tests this new behavior.

Signed-off-by: Jonathan Bressat <git.jonathan.bressat@gmail.com>
Signed-off-by: COGONI Guillaume <cogoni.guillaume@gmail.com>
---
 Documentation/git-merge.txt |  4 +++
 builtin/merge.c             |  7 ++++-
 builtin/pull.c              |  8 +++--
 cache.h                     |  3 +-
 merge-ort.c                 |  1 +
 merge-recursive.h           |  1 +
 merge.c                     |  4 ++-
 sequencer.c                 |  2 +-
 t/t7615-merge-untracked.sh  | 63 +++++++++++++++++++++++++++++++++++++
 unpack-trees.c              |  7 ++++-
 unpack-trees.h              |  1 +
 11 files changed, 94 insertions(+), 7 deletions(-)
 create mode 100755 t/t7615-merge-untracked.sh

diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index 3125473cc1..ceda0271c2 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -100,6 +100,10 @@ will be appended to the specified message.
 	Silently overwrite ignored files from the merge result. This
 	is the default behavior. Use `--no-overwrite-ignore` to abort.
 
+--overwrite-same-content::
+       Silently overwrite untracked files that have the same content 
+       and name than files in the merged commit from the merge result.
+
 --abort::
 	Abort the current conflict resolution process, and
 	try to reconstruct the pre-merge state. If an autostash entry is
diff --git a/builtin/merge.c b/builtin/merge.c
index 74e53cf20a..fffae81068 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -68,6 +68,7 @@ static int option_edit = -1;
 static int allow_trivial = 1, have_message, verify_signatures;
 static int check_trust_level = 1;
 static int overwrite_ignore = 1;
+static int overwrite_same_content;
 static struct strbuf merge_msg = STRBUF_INIT;
 static struct strategy **use_strategies;
 static size_t use_strategies_nr, use_strategies_alloc;
@@ -305,6 +306,7 @@ static struct option builtin_merge_options[] = {
 	OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
 	OPT_BOOL(0, "signoff", &signoff, N_("add a Signed-off-by trailer")),
 	OPT_BOOL(0, "no-verify", &no_verify, N_("bypass pre-merge-commit and commit-msg hooks")),
+	OPT_BOOL(0, "overwrite-same-content", &overwrite_same_content, N_("overwrite untracked file with the same content and name")),
 	OPT_END()
 };
 
@@ -684,6 +686,7 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
 	opts.trivial_merges_only = 1;
 	opts.merge = 1;
 	opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
+	opts.overwrite_same_content = overwrite_same_content;
 	trees[nr_trees] = parse_tree_indirect(common);
 	if (!trees[nr_trees++])
 		return -1;
@@ -746,6 +749,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
 
 		o.branch1 = head_arg;
 		o.branch2 = merge_remote_util(remoteheads->item)->name;
+		o.overwrite_same_content = overwrite_same_content;
 
 		for (j = common; j; j = j->next)
 			commit_list_insert(j->item, &reversed);
@@ -1573,7 +1577,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 		if (checkout_fast_forward(the_repository,
 					  &head_commit->object.oid,
 					  &commit->object.oid,
-					  overwrite_ignore)) {
+					  overwrite_ignore,
+					  overwrite_same_content)) {
 			apply_autostash(git_path_merge_autostash(the_repository));
 			ret = 1;
 			goto done;
diff --git a/builtin/pull.c b/builtin/pull.c
index 100cbf9fb8..46ef68e721 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -92,6 +92,7 @@ static struct strvec opt_strategies = STRVEC_INIT;
 static struct strvec opt_strategy_opts = STRVEC_INIT;
 static char *opt_gpg_sign;
 static int opt_allow_unrelated_histories;
+static int opt_overwrite_same_content;
 
 /* Options passed to git-fetch */
 static char *opt_all;
@@ -182,6 +183,7 @@ static struct option pull_options[] = {
 	OPT_SET_INT(0, "allow-unrelated-histories",
 		    &opt_allow_unrelated_histories,
 		    N_("allow merging unrelated histories"), 1),
+	OPT_BOOL(0, "overwrite-same-content", &opt_overwrite_same_content, N_("overwrite untracked file with the same content and name")),
 
 	/* Options passed to git-fetch */
 	OPT_GROUP(N_("Options related to fetching")),
@@ -612,7 +614,7 @@ static int pull_into_void(const struct object_id *merge_head,
 	 */
 	if (checkout_fast_forward(the_repository,
 				  the_hash_algo->empty_tree,
-				  merge_head, 0))
+				  merge_head, 0, opt_overwrite_same_content))
 		return 1;
 
 	if (update_ref("initial pull", "HEAD", merge_head, curr_head, 0, UPDATE_REFS_DIE_ON_ERR))
@@ -679,6 +681,8 @@ static int run_merge(void)
 		strvec_pushf(&args, "--cleanup=%s", cleanup_arg);
 	if (opt_ff)
 		strvec_push(&args, opt_ff);
+	if (opt_overwrite_same_content)
+		strvec_push(&args, "--overwrite-same-content");
 	if (opt_verify)
 		strvec_push(&args, opt_verify);
 	if (opt_verify_signatures)
@@ -1078,7 +1082,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 			"commit %s."), oid_to_hex(&orig_head));
 
 		if (checkout_fast_forward(the_repository, &orig_head,
-					  &curr_head, 0))
+					  &curr_head, 0, opt_overwrite_same_content))
 			die(_("Cannot fast-forward your working tree.\n"
 				"After making sure that you saved anything precious from\n"
 				"$ git diff %s\n"
diff --git a/cache.h b/cache.h
index 281f00ab1b..163367ab41 100644
--- a/cache.h
+++ b/cache.h
@@ -1858,7 +1858,8 @@ int try_merge_command(struct repository *r,
 int checkout_fast_forward(struct repository *r,
 			  const struct object_id *from,
 			  const struct object_id *to,
-			  int overwrite_ignore);
+			  int overwrite_ignore,
+			  int overwrite_same_content);
 
 
 int sane_execvp(const char *file, char *const argv[]);
diff --git a/merge-ort.c b/merge-ort.c
index c319797021..a8d1496b4a 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -4066,6 +4066,7 @@ static int checkout(struct merge_options *opt,
 	unpack_opts.verbose_update = (opt->verbosity > 2);
 	unpack_opts.fn = twoway_merge;
 	unpack_opts.preserve_ignored = 0; /* FIXME: !opts->overwrite_ignore */
+	unpack_opts.overwrite_same_content = opt->overwrite_same_content;
 	parse_tree(prev);
 	init_tree_desc(&trees[0], prev->buffer, prev->size);
 	parse_tree(next);
diff --git a/merge-recursive.h b/merge-recursive.h
index 0795a1d3ec..6f8c5678e0 100644
--- a/merge-recursive.h
+++ b/merge-recursive.h
@@ -46,6 +46,7 @@ struct merge_options {
 	/* miscellaneous control options */
 	const char *subtree_shift;
 	unsigned renormalize : 1;
+	int overwrite_same_content;
 
 	/* internal fields used by the implementation */
 	struct merge_options_internal *priv;
diff --git a/merge.c b/merge.c
index 2382ff66d3..410c92d235 100644
--- a/merge.c
+++ b/merge.c
@@ -47,7 +47,8 @@ int try_merge_command(struct repository *r,
 int checkout_fast_forward(struct repository *r,
 			  const struct object_id *head,
 			  const struct object_id *remote,
-			  int overwrite_ignore)
+			  int overwrite_ignore,
+			  int overwrite_same_content)
 {
 	struct tree *trees[MAX_UNPACK_TREES];
 	struct unpack_trees_options opts;
@@ -80,6 +81,7 @@ int checkout_fast_forward(struct repository *r,
 
 	memset(&opts, 0, sizeof(opts));
 	opts.preserve_ignored = !overwrite_ignore;
+	opts.overwrite_same_content = overwrite_same_content;
 
 	opts.head_idx = 1;
 	opts.src_index = r->index;
diff --git a/sequencer.c b/sequencer.c
index 5213d16e97..d11802c542 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -529,7 +529,7 @@ static int fast_forward_to(struct repository *r,
 	struct strbuf err = STRBUF_INIT;
 
 	repo_read_index(r);
-	if (checkout_fast_forward(r, from, to, 1))
+	if (checkout_fast_forward(r, from, to, 1, 0))
 		return -1; /* the callee should have complained already */
 
 	strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
diff --git a/t/t7615-merge-untracked.sh b/t/t7615-merge-untracked.sh
new file mode 100755
index 0000000000..05a34cf03f
--- /dev/null
+++ b/t/t7615-merge-untracked.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+test_description='test when merge with untracked files and the option --overwrite-same-content'
+
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	test_commit "init" README.md "content" &&
+	git checkout -b A
+'
+
+test_expect_success 'fastforward overwrite untracked file that has the same content' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" &&
+	git checkout A &&
+	echo content >file &&
+	git merge --overwrite-same-content B
+'
+
+test_expect_success 'fastforward fail when untracked file has different content' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" &&
+	git switch A &&
+	echo other >file &&
+	test_must_fail git merge --overwrite-same-content B
+'
+
+test_expect_success 'normal merge overwrite untracked file that has the same content' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" fileB "content" &&
+	git switch A &&
+	test_commit --no-tag "exA" fileA "content" &&
+	echo content >file &&
+	git merge --overwrite-same-content B
+'
+
+test_expect_success 'normal merge fail when untracked file has different content' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" fileB "content" &&
+	git switch A &&
+	test_commit --no-tag "exA" fileA "content" &&
+	echo dif >file &&
+	test_must_fail git merge --overwrite-same-content B
+'
+
+test_expect_success 'merge fail when tracked file modification is unstaged' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	test_commit --no-tag "unstaged" file "other" &&
+	git checkout -b B &&
+	test_commit --no-tag "staged" file "content" &&
+	git switch A &&
+	echo content >file &&
+	test_must_fail git merge --overwrite-same-content B
+'
+
+test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index 360844bda3..1a52be723e 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -2257,6 +2257,10 @@ static int check_ok_to_remove(const char *name, int len, int dtype,
 	if (result) {
 		if (result->ce_flags & CE_REMOVE)
 			return 0;
+	} else if (ce && !ie_modified(o->src_index, ce, st, 0)) {
+		if(o->overwrite_same_content) {
+			return 0;
+		}
 	}
 
 	return add_rejected_path(o, error_type, name);
@@ -2264,7 +2268,8 @@ static int check_ok_to_remove(const char *name, int len, int dtype,
 
 /*
  * We do not want to remove or overwrite a working tree file that
- * is not tracked, unless it is ignored.
+ * is not tracked, unless it is ignored or it has the same content
+ * than the merged file with the option --overwrite_same_content.
  */
 static int verify_absent_1(const struct cache_entry *ce,
 			   enum unpack_trees_error_types error_type,
diff --git a/unpack-trees.h b/unpack-trees.h
index efb9edfbb2..ebe4be0b35 100644
--- a/unpack-trees.h
+++ b/unpack-trees.h
@@ -71,6 +71,7 @@ struct unpack_trees_options {
 		     quiet,
 		     exiting_early,
 		     show_all_errors,
+		     overwrite_same_content,
 		     dry_run;
 	enum unpack_trees_reset_type reset;
 	const char *prefix;
-- 
2.35.1.10.g88248585b1.dirty


^ permalink raw reply related	[relevance 2%]

* [PATCH v2 0/4] Be nicer to the user on tracked/untracked merge conflicts
  @ 2022-05-27 19:55  2% ` Jonathan Bressat
  2022-05-27 19:55  2%   ` [PATCH v2 2/4] merge with untracked file that are the same without failure Jonathan Bressat
  0 siblings, 1 reply; 200+ results
From: Jonathan Bressat @ 2022-05-27 19:55 UTC (permalink / raw)
  To: git.jonathan.bressat
  Cc: Matthieu.Moy, cogoni.guillaume, git, gitster, guillaume.cogoni,
	jonathan.bressat

We improve our last patch with adding an option to merge and pull command and a
configuration variable.
This make the user able to modify the behavior of merge when it meet untracked files
that have the same content than files in merged branch.

We kept the old behavior as default.

thanks

Jonathan Bressat and 
Guillaume Cogoni

Jonathan Bressat (4):
  t6436: tests how merge behave when there is untracked file with the
    same content
  merge with untracked file that are the same without failure
  add configuration variable corresponding to --overwrite-same-content
  error message now advice to use the new option

 Documentation/config/merge.txt |  5 ++
 Documentation/git-merge.txt    |  4 ++
 builtin/checkout.c             |  1 +
 builtin/merge.c                |  9 +++-
 builtin/pull.c                 |  8 +++-
 cache.h                        |  3 +-
 merge-ort.c                    |  1 +
 merge-recursive.h              |  1 +
 merge.c                        |  4 +-
 sequencer.c                    |  2 +-
 t/t6436-merge-overwrite.sh     | 34 ++++++++++++++
 t/t7615-merge-untracked.sh     | 84 ++++++++++++++++++++++++++++++++++
 unpack-trees.c                 | 27 +++++++++--
 unpack-trees.h                 |  2 +
 14 files changed, 174 insertions(+), 11 deletions(-)
 create mode 100755 t/t7615-merge-untracked.sh

Interdiff contre v1 :
diff --git a/Documentation/config/merge.txt b/Documentation/config/merge.txt
index 99e83dd36e..2824dd19c7 100644
--- a/Documentation/config/merge.txt
+++ b/Documentation/config/merge.txt
@@ -89,6 +89,11 @@ merge.autoStash::
 	`--autostash` options of linkgit:git-merge[1].
 	Defaults to false.
 
+merge.overwritesamecontent::
+    When set to true, it will modify the behavior of git merge 
+    to overwrite untracked files that have the same name and 
+    content than files in the merged commit.	
+
 merge.tool::
 	Controls which merge tool is used by linkgit:git-mergetool[1].
 	The list below shows the valid built-in values.
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index 3125473cc1..ceda0271c2 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -100,6 +100,10 @@ will be appended to the specified message.
 	Silently overwrite ignored files from the merge result. This
 	is the default behavior. Use `--no-overwrite-ignore` to abort.
 
+--overwrite-same-content::
+       Silently overwrite untracked files that have the same content 
+       and name than files in the merged commit from the merge result.
+
 --abort::
 	Abort the current conflict resolution process, and
 	try to reconstruct the pre-merge state. If an autostash entry is
diff --git a/builtin/checkout.c b/builtin/checkout.c
index cc804ba8e1..1b1d1813c7 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -760,6 +760,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
 				       &new_branch_info->commit->object.oid :
 				       &new_branch_info->oid, NULL);
 		topts.preserve_ignored = !opts->overwrite_ignore;
+		topts.overwrite_same_content = 0;/* FIXME: opts->overwrite_same_content */
 		tree = parse_tree_indirect(old_branch_info->commit ?
 					   &old_branch_info->commit->object.oid :
 					   the_hash_algo->empty_tree);
diff --git a/builtin/merge.c b/builtin/merge.c
index 74e53cf20a..936cb8480d 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -68,6 +68,7 @@ static int option_edit = -1;
 static int allow_trivial = 1, have_message, verify_signatures;
 static int check_trust_level = 1;
 static int overwrite_ignore = 1;
+static int overwrite_same_content;
 static struct strbuf merge_msg = STRBUF_INIT;
 static struct strategy **use_strategies;
 static size_t use_strategies_nr, use_strategies_alloc;
@@ -305,6 +306,7 @@ static struct option builtin_merge_options[] = {
 	OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
 	OPT_BOOL(0, "signoff", &signoff, N_("add a Signed-off-by trailer")),
 	OPT_BOOL(0, "no-verify", &no_verify, N_("bypass pre-merge-commit and commit-msg hooks")),
+	OPT_BOOL(0, "overwrite-same-content", &overwrite_same_content, N_("overwrite untracked file with the same content and name")),
 	OPT_END()
 };
 
@@ -656,6 +658,8 @@ static int git_merge_config(const char *k, const char *v, void *cb)
 	} else if (!strcmp(k, "merge.autostash")) {
 		autostash = git_config_bool(k, v);
 		return 0;
+	} else if (!strcmp(k,"merge.overwritesamecontent")) {
+		overwrite_same_content = git_config_bool(k, v);
 	}
 
 	status = fmt_merge_msg_config(k, v, cb);
@@ -684,6 +688,7 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
 	opts.trivial_merges_only = 1;
 	opts.merge = 1;
 	opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
+	opts.overwrite_same_content = overwrite_same_content;
 	trees[nr_trees] = parse_tree_indirect(common);
 	if (!trees[nr_trees++])
 		return -1;
@@ -746,6 +751,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
 
 		o.branch1 = head_arg;
 		o.branch2 = merge_remote_util(remoteheads->item)->name;
+		o.overwrite_same_content = overwrite_same_content;
 
 		for (j = common; j; j = j->next)
 			commit_list_insert(j->item, &reversed);
@@ -1573,7 +1579,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 		if (checkout_fast_forward(the_repository,
 					  &head_commit->object.oid,
 					  &commit->object.oid,
-					  overwrite_ignore)) {
+					  overwrite_ignore,
+					  overwrite_same_content)) {
 			apply_autostash(git_path_merge_autostash(the_repository));
 			ret = 1;
 			goto done;
diff --git a/builtin/pull.c b/builtin/pull.c
index 100cbf9fb8..46ef68e721 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -92,6 +92,7 @@ static struct strvec opt_strategies = STRVEC_INIT;
 static struct strvec opt_strategy_opts = STRVEC_INIT;
 static char *opt_gpg_sign;
 static int opt_allow_unrelated_histories;
+static int opt_overwrite_same_content;
 
 /* Options passed to git-fetch */
 static char *opt_all;
@@ -182,6 +183,7 @@ static struct option pull_options[] = {
 	OPT_SET_INT(0, "allow-unrelated-histories",
 		    &opt_allow_unrelated_histories,
 		    N_("allow merging unrelated histories"), 1),
+	OPT_BOOL(0, "overwrite-same-content", &opt_overwrite_same_content, N_("overwrite untracked file with the same content and name")),
 
 	/* Options passed to git-fetch */
 	OPT_GROUP(N_("Options related to fetching")),
@@ -612,7 +614,7 @@ static int pull_into_void(const struct object_id *merge_head,
 	 */
 	if (checkout_fast_forward(the_repository,
 				  the_hash_algo->empty_tree,
-				  merge_head, 0))
+				  merge_head, 0, opt_overwrite_same_content))
 		return 1;
 
 	if (update_ref("initial pull", "HEAD", merge_head, curr_head, 0, UPDATE_REFS_DIE_ON_ERR))
@@ -679,6 +681,8 @@ static int run_merge(void)
 		strvec_pushf(&args, "--cleanup=%s", cleanup_arg);
 	if (opt_ff)
 		strvec_push(&args, opt_ff);
+	if (opt_overwrite_same_content)
+		strvec_push(&args, "--overwrite-same-content");
 	if (opt_verify)
 		strvec_push(&args, opt_verify);
 	if (opt_verify_signatures)
@@ -1078,7 +1082,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 			"commit %s."), oid_to_hex(&orig_head));
 
 		if (checkout_fast_forward(the_repository, &orig_head,
-					  &curr_head, 0))
+					  &curr_head, 0, opt_overwrite_same_content))
 			die(_("Cannot fast-forward your working tree.\n"
 				"After making sure that you saved anything precious from\n"
 				"$ git diff %s\n"
diff --git a/cache.h b/cache.h
index 281f00ab1b..163367ab41 100644
--- a/cache.h
+++ b/cache.h
@@ -1858,7 +1858,8 @@ int try_merge_command(struct repository *r,
 int checkout_fast_forward(struct repository *r,
 			  const struct object_id *from,
 			  const struct object_id *to,
-			  int overwrite_ignore);
+			  int overwrite_ignore,
+			  int overwrite_same_content);
 
 
 int sane_execvp(const char *file, char *const argv[]);
diff --git a/merge-ort.c b/merge-ort.c
index c319797021..a8d1496b4a 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -4066,6 +4066,7 @@ static int checkout(struct merge_options *opt,
 	unpack_opts.verbose_update = (opt->verbosity > 2);
 	unpack_opts.fn = twoway_merge;
 	unpack_opts.preserve_ignored = 0; /* FIXME: !opts->overwrite_ignore */
+	unpack_opts.overwrite_same_content = opt->overwrite_same_content;
 	parse_tree(prev);
 	init_tree_desc(&trees[0], prev->buffer, prev->size);
 	parse_tree(next);
diff --git a/merge-recursive.h b/merge-recursive.h
index 0795a1d3ec..6f8c5678e0 100644
--- a/merge-recursive.h
+++ b/merge-recursive.h
@@ -46,6 +46,7 @@ struct merge_options {
 	/* miscellaneous control options */
 	const char *subtree_shift;
 	unsigned renormalize : 1;
+	int overwrite_same_content;
 
 	/* internal fields used by the implementation */
 	struct merge_options_internal *priv;
diff --git a/merge.c b/merge.c
index 2382ff66d3..410c92d235 100644
--- a/merge.c
+++ b/merge.c
@@ -47,7 +47,8 @@ int try_merge_command(struct repository *r,
 int checkout_fast_forward(struct repository *r,
 			  const struct object_id *head,
 			  const struct object_id *remote,
-			  int overwrite_ignore)
+			  int overwrite_ignore,
+			  int overwrite_same_content)
 {
 	struct tree *trees[MAX_UNPACK_TREES];
 	struct unpack_trees_options opts;
@@ -80,6 +81,7 @@ int checkout_fast_forward(struct repository *r,
 
 	memset(&opts, 0, sizeof(opts));
 	opts.preserve_ignored = !overwrite_ignore;
+	opts.overwrite_same_content = overwrite_same_content;
 
 	opts.head_idx = 1;
 	opts.src_index = r->index;
diff --git a/sequencer.c b/sequencer.c
index 5213d16e97..d11802c542 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -529,7 +529,7 @@ static int fast_forward_to(struct repository *r,
 	struct strbuf err = STRBUF_INIT;
 
 	repo_read_index(r);
-	if (checkout_fast_forward(r, from, to, 1))
+	if (checkout_fast_forward(r, from, to, 1, 0))
 		return -1; /* the callee should have complained already */
 
 	strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
diff --git a/t/t6436-merge-overwrite.sh b/t/t6436-merge-overwrite.sh
index c0b7bd7c3f..bb323b1ee3 100755
--- a/t/t6436-merge-overwrite.sh
+++ b/t/t6436-merge-overwrite.sh
@@ -204,4 +204,38 @@ test_expect_success 'will not clobber WT/index when merging into unborn' '
 	grep bar untracked-file
 '
 
+test_expect_success 'create branch A' '
+	git reset --hard c0 &&
+	git checkout -b A
+'
+
+test_expect_success 'fastforward will not overwrite untracked file with the same content' '
+	test_when_finished "git branch -D B && git reset --hard c0 && git clean --force" &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" &&
+	git checkout A &&
+	echo content >file &&
+	test_must_fail git merge B
+'
+
+test_expect_success 'will not overwrite untracked file with the same content' '
+	test_when_finished "git branch -D B && git reset --hard c0 && git clean --force" &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" fileB "content" &&
+	git checkout A &&
+	test_commit --no-tag "exA" fileA "content" &&
+	echo content >file &&
+	test_must_fail git merge B
+'
+
+test_expect_success 'will not overwrite unstaged file with the same content' '
+	test_when_finished "git branch -D B && git reset --hard c0 && git clean --force" &&
+	test_commit --no-tag "unstaged" file "other" &&
+	git checkout -b B &&
+	test_commit --no-tag "staged" file "content" &&
+	git checkout A &&
+	echo content >file &&
+	test_must_fail git merge B
+'
+
 test_done
diff --git a/t/t7615-merge-untracked.sh b/t/t7615-merge-untracked.sh
index 99f8bae4c0..cfefd8f473 100755
--- a/t/t7615-merge-untracked.sh
+++ b/t/t7615-merge-untracked.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-test_description='test when merge with untracked file'
+test_description='test when merge with untracked files and the option --overwrite-same-content'
 
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
@@ -18,7 +18,7 @@ test_expect_success 'fastforward overwrite untracked file that has the same cont
 	test_commit --no-tag "tracked" file "content" &&
 	git checkout A &&
 	echo content >file &&
-	git merge B
+	git merge --overwrite-same-content B
 '
 
 test_expect_success 'fastforward fail when untracked file has different content' '
@@ -27,7 +27,7 @@ test_expect_success 'fastforward fail when untracked file has different content'
 	test_commit --no-tag "tracked" file "content" &&
 	git switch A &&
 	echo other >file &&
-	test_must_fail git merge B
+	test_must_fail git merge --overwrite-same-content B
 '
 
 test_expect_success 'normal merge overwrite untracked file that has the same content' '
@@ -37,7 +37,7 @@ test_expect_success 'normal merge overwrite untracked file that has the same con
 	git switch A &&
 	test_commit --no-tag "exA" fileA "content" &&
 	echo content >file &&
-	git merge B
+	git merge --overwrite-same-content B
 '
 
 test_expect_success 'normal merge fail when untracked file has different content' '
@@ -47,7 +47,7 @@ test_expect_success 'normal merge fail when untracked file has different content
 	git switch A &&
 	test_commit --no-tag "exA" fileA "content" &&
 	echo dif >file &&
-	test_must_fail git merge B
+	test_must_fail git merge --overwrite-same-content B
 '
 
 test_expect_success 'merge fail when tracked file modification is unstaged' '
@@ -57,7 +57,28 @@ test_expect_success 'merge fail when tracked file modification is unstaged' '
 	test_commit --no-tag "staged" file "content" &&
 	git switch A &&
 	echo content >file &&
-	test_must_fail git merge B
+	test_must_fail git merge --overwrite-same-content B
+'
+
+test_expect_success 'fastforward overwrite untracked file that has the same content with the configuration variable' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	test_config merge.overwritesamecontent true &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" &&
+	git checkout A &&
+	echo content >file &&
+	git merge B
+'
+
+test_expect_success 'normal merge overwrite untracked file that has the same content with the configuration variable' '
+	test_when_finished "git branch -D B && git reset --hard init && git clean --force" &&
+	test_config merge.overwritesamecontent true &&
+	git checkout -b B &&
+	test_commit --no-tag "tracked" file "content" fileB "content" &&
+	git switch A &&
+	test_commit --no-tag "exA" fileA "content" &&
+	echo content >file &&
+	git merge B
 '
 
 test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index 61e06c04be..6c660b084b 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -158,17 +158,17 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
 	if (!strcmp(cmd, "checkout"))
 		msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE)
 		      ? _("The following untracked working tree files would be overwritten by checkout:\n%%s"
-			  "Please move or remove them before you switch branches.")
+			  "Please move or remove them before you switch branches.%%s")
 		      : _("The following untracked working tree files would be overwritten by checkout:\n%%s");
 	else if (!strcmp(cmd, "merge"))
 		msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE)
 		      ? _("The following untracked working tree files would be overwritten by merge:\n%%s"
-			  "Please move or remove them before you merge.")
+			  "Please move or remove them before you merge.%%s")
 		      : _("The following untracked working tree files would be overwritten by merge:\n%%s");
 	else
 		msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE)
 		      ? _("The following untracked working tree files would be overwritten by %s:\n%%s"
-			  "Please move or remove them before you %s.")
+			  "Please move or remove them before you %s.%%s")
 		      : _("The following untracked working tree files would be overwritten by %s:\n%%s");
 	msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] =
 		strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd);
@@ -251,6 +251,14 @@ static void display_error_msgs(struct unpack_trees_options *o)
 {
 	int e;
 	unsigned error_displayed = 0;
+	const char *can_overwrite_msg;
+
+	if (o->can_overwrite) {
+		can_overwrite_msg = _("\nYou can also rerun the command with --overwrite-same-content to overwrite files with same content.");
+	} else {
+		can_overwrite_msg = "";
+	}
+
 	for (e = 0; e < NB_UNPACK_TREES_ERROR_TYPES; e++) {
 		struct string_list *rejects = &o->unpack_rejects[e];
 
@@ -261,7 +269,8 @@ static void display_error_msgs(struct unpack_trees_options *o)
 			error_displayed = 1;
 			for (i = 0; i < rejects->nr; i++)
 				strbuf_addf(&path, "\t%s\n", rejects->items[i].string);
-			error(ERRORMSG(o, e), super_prefixed(path.buf));
+
+			error(ERRORMSG(o, e), super_prefixed(path.buf), can_overwrite_msg);
 			strbuf_release(&path);
 		}
 		string_list_clear(rejects, 0);
@@ -1711,6 +1720,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 	struct pattern_list pl;
 	int free_pattern_list = 0;
 	struct dir_struct dir = DIR_INIT;
+	o->can_overwrite = 1;
 
 	if (o->reset == UNPACK_RESET_INVALID)
 		BUG("o->reset had a value of 1; should be UNPACK_TREES_*_UNTRACKED");
@@ -2257,8 +2267,12 @@ static int check_ok_to_remove(const char *name, int len, int dtype,
 	if (result) {
 		if (result->ce_flags & CE_REMOVE)
 			return 0;
-	} else if (!ie_modified(&o->result, ce, st, 0)) {
-		return 0;
+	} else if (ce && !ie_modified(o->src_index, ce, st, 0)) {
+		if(o->overwrite_same_content) {
+			return 0;
+		}
+	} else {
+		o->can_overwrite = 0;
 	}
 
 	return add_rejected_path(o, error_type, name);
@@ -2266,8 +2280,8 @@ static int check_ok_to_remove(const char *name, int len, int dtype,
 
 /*
  * We do not want to remove or overwrite a working tree file that
- * is not tracked, unless it is ignored and unless it has the same
- * content than the merged file.
+ * is not tracked, unless it is ignored or it has the same content
+ * than the merged file with the option --overwrite_same_content.
  */
 static int verify_absent_1(const struct cache_entry *ce,
 			   enum unpack_trees_error_types error_type,
diff --git a/unpack-trees.h b/unpack-trees.h
index efb9edfbb2..2be74ce5bf 100644
--- a/unpack-trees.h
+++ b/unpack-trees.h
@@ -71,6 +71,8 @@ struct unpack_trees_options {
 		     quiet,
 		     exiting_early,
 		     show_all_errors,
+		     overwrite_same_content,
+		     can_overwrite,
 		     dry_run;
 	enum unpack_trees_reset_type reset;
 	const char *prefix;
-- 
2.35.1.10.g88248585b1.dirty


^ permalink raw reply related	[relevance 2%]

* [PATCH v4 5/9] po/git.pot: this is now a generated file
  @ 2022-05-23 15:21  1% ` Jiang Xin
  0 siblings, 0 replies; 200+ results
From: Jiang Xin @ 2022-05-23 15:21 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason, Junio C Hamano, Git List
  Cc: Jiang Xin, Alexander Shopov, Jordi Mas, Matthias Rüster,
	Jimmy Angelakos, Christopher Díaz, Jean-Noël Avila,
	Bagas Sanjaya, Alessandro Menti, Gwan-gyeong Mun, Arusekk,
	Daniel Santos, Dimitriy Ryazantcev, Peter Krefting, Emir SARI,
	Trần Ngọc Quân, Fangyi Zhou, Yi-Jyun Pan,
	Jiang Xin

We no longer keep track of the contents of this file.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot

diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-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 ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, 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] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-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 ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#, c-format
-msgid ""
-"\n"
-"It took %.2f seconds to compute the branch ahead/behind values.\n"
-"You can use '--no-ahead-behind' to avoid this.\n"
-msgstr ""
-
-#: wt-status.c:1210
-msgid "You have unmerged paths."
-msgstr ""
-
-#: wt-status.c:1213
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr ""
-
-#: wt-status.c:1215
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr ""
-
-#: wt-status.c:1219
-msgid "All conflicts fixed but you are still merging."
-msgstr ""
-
-#: wt-status.c:1222
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr ""
-
-#: wt-status.c:1233
-msgid "You are in the middle of an am session."
-msgstr ""
-
-#: wt-status.c:1236
-msgid "The current patch is empty."
-msgstr ""
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-
-#: wt-status.c:1243
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1246
-msgid ""
-"  (use \"git am --allow-empty\" to record this patch as an empty commit)"
-msgstr ""
-
-#: wt-status.c:1248
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-
-#: wt-status.c:1381
-msgid "git-rebase-todo is missing."
-msgstr ""
-
-#: wt-status.c:1383
-msgid "No commands done."
-msgstr ""
-
-#: wt-status.c:1386
-#, c-format
-msgid "Last command done (%<PRIuMAX> command done):"
-msgid_plural "Last commands done (%<PRIuMAX> commands done):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1397
-#, c-format
-msgid "  (see more in file %s)"
-msgstr ""
-
-#: wt-status.c:1402
-msgid "No commands remaining."
-msgstr ""
-
-#: wt-status.c:1405
-#, c-format
-msgid "Next command to do (%<PRIuMAX> remaining command):"
-msgid_plural "Next commands to do (%<PRIuMAX> remaining commands):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1413
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr ""
-
-#: wt-status.c:1425
-#, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1430
-msgid "You are currently rebasing."
-msgstr ""
-
-#: wt-status.c:1443
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1445
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1447
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-
-#: wt-status.c:1454
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1458
-#, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1463
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1466
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1470
-#, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1475
-msgid "You are currently editing a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1478
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-
-#: wt-status.c:1480
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-
-#: wt-status.c:1491
-msgid "Cherry-pick currently in progress."
-msgstr ""
-
-#: wt-status.c:1494
-#, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr ""
-
-#: wt-status.c:1501
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1504
-msgid "  (run \"git cherry-pick --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1507
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1509
-msgid "  (use \"git cherry-pick --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1511
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-
-#: wt-status.c:1521
-msgid "Revert currently in progress."
-msgstr ""
-
-#: wt-status.c:1524
-#, c-format
-msgid "You are currently reverting commit %s."
-msgstr ""
-
-#: wt-status.c:1530
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1533
-msgid "  (run \"git revert --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1536
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1538
-msgid "  (use \"git revert --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1540
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-
-#: wt-status.c:1550
-#, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
-
-#: wt-status.c:1554
-msgid "You are currently bisecting."
-msgstr ""
-
-#: wt-status.c:1557
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr ""
-
-#: wt-status.c:1568
-msgid "You are in a sparse checkout."
-msgstr ""
-
-#: wt-status.c:1571
-#, c-format
-msgid "You are in a sparse checkout with %d%% of tracked files present."
-msgstr ""
-
-#: wt-status.c:1815
-msgid "On branch "
-msgstr ""
-
-#: wt-status.c:1822
-msgid "interactive rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1824
-msgid "rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1829
-msgid "HEAD detached at "
-msgstr ""
-
-#: wt-status.c:1831
-msgid "HEAD detached from "
-msgstr ""
-
-#: wt-status.c:1834
-msgid "Not currently on any branch."
-msgstr ""
-
-#: wt-status.c:1851
-msgid "Initial commit"
-msgstr ""
-
-#: wt-status.c:1852
-msgid "No commits yet"
-msgstr ""
-
-#: wt-status.c:1866
-msgid "Untracked files"
-msgstr ""
-
-#: wt-status.c:1868
-msgid "Ignored files"
-msgstr ""
-
-#: wt-status.c:1872
-#, c-format
-msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-
-#: wt-status.c:1878
-#, c-format
-msgid "Untracked files not listed%s"
-msgstr ""
-
-#: wt-status.c:1880
-msgid " (use -u option to show untracked files)"
-msgstr ""
-
-#: wt-status.c:1886
-msgid "No changes"
-msgstr ""
-
-#: wt-status.c:1891
-#, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-
-#: wt-status.c:1895
-#, c-format
-msgid "no changes added to commit\n"
-msgstr ""
-
-#: wt-status.c:1899
-#, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-
-#: wt-status.c:1903
-#, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr ""
-
-#: wt-status.c:1907
-#, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-
-#: wt-status.c:1911 wt-status.c:1917
-#, c-format
-msgid "nothing to commit\n"
-msgstr ""
-
-#: wt-status.c:1914
-#, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-
-#: wt-status.c:1919
-#, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr ""
-
-#: wt-status.c:2024
-msgid "No commits yet on "
-msgstr ""
-
-#: wt-status.c:2028
-msgid "HEAD (no branch)"
-msgstr ""
-
-#: wt-status.c:2059
-msgid "different"
-msgstr ""
-
-#: wt-status.c:2061 wt-status.c:2069
-msgid "behind "
-msgstr ""
-
-#: wt-status.c:2064 wt-status.c:2067
-msgid "ahead "
-msgstr ""
-
-#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2605
-#, c-format
-msgid "cannot %s: You have unstaged changes."
-msgstr ""
-
-#: wt-status.c:2611
-msgid "additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: wt-status.c:2613
-#, c-format
-msgid "cannot %s: Your index contains uncommitted changes."
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:205
-msgid "could not send IPC command"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:212
-msgid "could not read IPC response"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:892
-#, c-format
-msgid "could not start accept_thread '%s'"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:904
-#, c-format
-msgid "could not start worker[0] for '%s'"
-msgstr ""
-
-#: compat/precompose_utf8.c:58 builtin/clone.c:353
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:355
-msgid "Unable to create FSEventStream."
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:403
-msgid "Failed to start the FSEventStream"
-msgstr ""
-
-#: builtin/add.c:26
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/add.c:63
-#, c-format
-msgid "cannot chmod %cx '%s'"
-msgstr ""
-
-#: builtin/add.c:105
-#, c-format
-msgid "unexpected diff status %c"
-msgstr ""
-
-#: builtin/add.c:110 builtin/commit.c:299
-msgid "updating files failed"
-msgstr ""
-
-#: builtin/add.c:120
-#, c-format
-msgid "remove '%s'\n"
-msgstr ""
-
-#: builtin/add.c:204
-msgid "Unstaged changes after refreshing the index:"
-msgstr ""
-
-#: builtin/add.c:312 builtin/rev-parse.c:993
-msgid "Could not read the index"
-msgstr ""
-
-#: builtin/add.c:325
-msgid "Could not write patch"
-msgstr ""
-
-#: builtin/add.c:328
-msgid "editing patch failed"
-msgstr ""
-
-#: builtin/add.c:331
-#, c-format
-msgid "Could not stat '%s'"
-msgstr ""
-
-#: builtin/add.c:333
-msgid "Empty patch. Aborted."
-msgstr ""
-
-#: builtin/add.c:339
-#, c-format
-msgid "Could not apply '%s'"
-msgstr ""
-
-#: builtin/add.c:347
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-
-#: builtin/add.c:367 builtin/clean.c:927 builtin/fetch.c:175 builtin/mv.c:124
-#: builtin/prune-packed.c:14 builtin/pull.c:208 builtin/push.c:550
-#: builtin/remote.c:1454 builtin/rm.c:244 builtin/send-pack.c:194
-msgid "dry run"
-msgstr ""
-
-#: builtin/add.c:368 builtin/check-ignore.c:22 builtin/commit.c:1483
-#: builtin/count-objects.c:98 builtin/fsck.c:789 builtin/log.c:2338
-#: builtin/mv.c:123 builtin/read-tree.c:120
-msgid "be verbose"
-msgstr ""
-
-#: builtin/add.c:370
-msgid "interactive picking"
-msgstr ""
-
-#: builtin/add.c:371 builtin/checkout.c:1599 builtin/reset.c:417
-msgid "select hunks interactively"
-msgstr ""
-
-#: builtin/add.c:372
-msgid "edit current diff and apply"
-msgstr ""
-
-#: builtin/add.c:373
-msgid "allow adding otherwise ignored files"
-msgstr ""
-
-#: builtin/add.c:374
-msgid "update tracked files"
-msgstr ""
-
-#: builtin/add.c:375
-msgid "renormalize EOL of tracked files (implies -u)"
-msgstr ""
-
-#: builtin/add.c:376
-msgid "record only the fact that the path will be added later"
-msgstr ""
-
-#: builtin/add.c:377
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-
-#: builtin/add.c:380
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-
-#: builtin/add.c:382
-msgid "don't add, only refresh the index"
-msgstr ""
-
-#: builtin/add.c:383
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-
-#: builtin/add.c:384
-msgid "check if - even missing - files are ignored in dry run"
-msgstr ""
-
-#: builtin/add.c:385 builtin/mv.c:128 builtin/rm.c:251
-msgid "allow updating entries outside of the sparse-checkout cone"
-msgstr ""
-
-#: builtin/add.c:387 builtin/update-index.c:1023
-msgid "override the executable bit of the listed files"
-msgstr ""
-
-#: builtin/add.c:389
-msgid "warn when adding an embedded repository"
-msgstr ""
-
-#: builtin/add.c:407
-#, c-format
-msgid ""
-"You've added another git repository inside your current repository.\n"
-"Clones of the outer repository will not contain the contents of\n"
-"the embedded repository and will not know how to obtain it.\n"
-"If you meant to add a submodule, use:\n"
-"\n"
-"\tgit submodule add <url> %s\n"
-"\n"
-"If you added this path by mistake, you can remove it from the\n"
-"index with:\n"
-"\n"
-"\tgit rm --cached %s\n"
-"\n"
-"See \"git help submodule\" for more information."
-msgstr ""
-
-#: builtin/add.c:436
-#, c-format
-msgid "adding embedded git repository: %s"
-msgstr ""
-
-#: builtin/add.c:456
-msgid ""
-"Use -f if you really want to add them.\n"
-"Turn this message off by running\n"
-"\"git config advice.addIgnoredFile false\""
-msgstr ""
-
-#: builtin/add.c:471
-msgid "adding files failed"
-msgstr ""
-
-#: builtin/add.c:534
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr ""
-
-#: builtin/add.c:555 builtin/checkout.c:1770 builtin/commit.c:365
-#: builtin/reset.c:436 builtin/rm.c:275 builtin/stash.c:1702
-#, c-format
-msgid "'%s' and pathspec arguments cannot be used together"
-msgstr ""
-
-#: builtin/add.c:566
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr ""
-
-#: builtin/add.c:568
-msgid ""
-"Maybe you wanted to say 'git add .'?\n"
-"Turn this message off by running\n"
-"\"git config advice.addEmptyPathspec false\""
-msgstr ""
-
-#: builtin/am.c:393
-msgid "could not parse author script"
-msgstr ""
-
-#: builtin/am.c:483
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr ""
-
-#: builtin/am.c:525
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr ""
-
-#: builtin/am.c:563
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#: builtin/am.c:589
-msgid "fseek failed"
-msgstr ""
-
-#: builtin/am.c:777
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr ""
-
-#: builtin/am.c:842
-msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
-
-#: builtin/am.c:890
-msgid "invalid timestamp"
-msgstr ""
-
-#: builtin/am.c:895 builtin/am.c:907
-msgid "invalid Date line"
-msgstr ""
-
-#: builtin/am.c:902
-msgid "invalid timezone offset"
-msgstr ""
-
-#: builtin/am.c:995
-msgid "Patch format detection failed."
-msgstr ""
-
-#: builtin/am.c:1000 builtin/clone.c:306
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr ""
-
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr ""
-
-#: builtin/am.c:1154
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr ""
-
-#: builtin/am.c:1155
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-
-#: builtin/am.c:1160
-#, c-format
-msgid "To record the empty patch as an empty commit, run \"%s --allow-empty\"."
-msgstr ""
-
-#: builtin/am.c:1162
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-
-#: builtin/am.c:1257
-msgid "Patch sent with format=flowed; space at the end of lines might be lost."
-msgstr ""
-
-#: builtin/am.c:1345
-#, c-format
-msgid "missing author line in commit %s"
-msgstr ""
-
-#: builtin/am.c:1348
-#, c-format
-msgid "invalid ident line: %.*s"
-msgstr ""
-
-#: builtin/am.c:1567
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-
-#: builtin/am.c:1569
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-
-#: builtin/am.c:1588
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-
-#: builtin/am.c:1594
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-
-#: builtin/am.c:1620
-msgid "Failed to merge in the changes."
-msgstr ""
-
-#: builtin/am.c:1652
-msgid "applying to an empty history"
-msgstr ""
-
-#: builtin/am.c:1704 builtin/am.c:1708
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr ""
-
-#: builtin/am.c:1726
-msgid "Commit Body is:"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1736
-#, c-format
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-
-#: builtin/am.c:1782 builtin/commit.c:410
-msgid "unable to write index file"
-msgstr ""
-
-#: builtin/am.c:1786
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr ""
-
-#: builtin/am.c:1828
-#, c-format
-msgid "Skipping: %.*s"
-msgstr ""
-
-#: builtin/am.c:1833
-#, c-format
-msgid "Creating an empty commit: %.*s"
-msgstr ""
-
-#: builtin/am.c:1837
-msgid "Patch is empty."
-msgstr ""
-
-#: builtin/am.c:1848 builtin/am.c:1917
-#, c-format
-msgid "Applying: %.*s"
-msgstr ""
-
-#: builtin/am.c:1865
-msgid "No changes -- Patch already applied."
-msgstr ""
-
-#: builtin/am.c:1871
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr ""
-
-#: builtin/am.c:1875
-msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
-msgstr ""
-
-#: builtin/am.c:1921
-msgid "No changes - recorded it as an empty commit."
-msgstr ""
-
-#: builtin/am.c:1923
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"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 ""
-
-#: builtin/am.c:1931
-msgid ""
-"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."
-msgstr ""
-
-#: builtin/am.c:2039 builtin/am.c:2043 builtin/am.c:2055 builtin/reset.c:455
-#: builtin/reset.c:463
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr ""
-
-#: builtin/am.c:2091 builtin/am.c:2167
-msgid "failed to clean index"
-msgstr ""
-
-#: builtin/am.c:2135
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-
-#: builtin/am.c:2292
-#, c-format
-msgid "options '%s=%s' and '%s=%s' cannot be used together"
-msgstr ""
-
-#: builtin/am.c:2323
-msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
-msgstr ""
-
-#: builtin/am.c:2324
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr ""
-
-#: builtin/am.c:2330
-msgid "run interactively"
-msgstr ""
-
-#: builtin/am.c:2332
-msgid "historical option -- no-op"
-msgstr ""
-
-#: builtin/am.c:2334
-msgid "allow fall back on 3way merging if needed"
-msgstr ""
-
-#: builtin/am.c:2335 builtin/init-db.c:547 builtin/prune-packed.c:16
-#: builtin/repack.c:646 builtin/stash.c:946
-msgid "be quiet"
-msgstr ""
-
-#: builtin/am.c:2337
-msgid "add a Signed-off-by trailer to the commit message"
-msgstr ""
-
-#: builtin/am.c:2340
-msgid "recode into utf8 (default)"
-msgstr ""
-
-#: builtin/am.c:2342
-msgid "pass -k flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2344
-msgid "pass -b flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2346
-msgid "pass -m flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2348
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr ""
-
-#: builtin/am.c:2351
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-
-#: builtin/am.c:2354
-msgid "strip everything before a scissors line"
-msgstr ""
-
-#: builtin/am.c:2356
-msgid "pass it through git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2359 builtin/am.c:2362 builtin/am.c:2365 builtin/am.c:2368
-#: builtin/am.c:2371 builtin/am.c:2374 builtin/am.c:2377 builtin/am.c:2380
-#: builtin/am.c:2386
-msgid "pass it through git-apply"
-msgstr ""
-
-#: builtin/am.c:2376 builtin/commit.c:1514 builtin/fmt-merge-msg.c:18
-#: builtin/fmt-merge-msg.c:21 builtin/grep.c:920 builtin/merge.c:263
-#: builtin/pull.c:142 builtin/pull.c:204 builtin/pull.c:221
-#: builtin/rebase.c:1074 builtin/repack.c:657 builtin/repack.c:661
-#: builtin/repack.c:663 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:446 parse-options.h:159 parse-options.h:180
-#: parse-options.h:348
-msgid "n"
-msgstr ""
-
-#: builtin/am.c:2382 builtin/branch.c:695 builtin/bugreport.c:109
-#: builtin/cat-file.c:848 builtin/cat-file.c:852 builtin/cat-file.c:856
-#: builtin/for-each-ref.c:41 builtin/ls-tree.c:357 builtin/replace.c:555
-#: builtin/tag.c:480 builtin/verify-tag.c:38
-msgid "format"
-msgstr ""
-
-#: builtin/am.c:2383
-msgid "format the patch(es) are in"
-msgstr ""
-
-#: builtin/am.c:2389
-msgid "override error message when patch failure occurs"
-msgstr ""
-
-#: builtin/am.c:2391
-msgid "continue applying patches after resolving a conflict"
-msgstr ""
-
-#: builtin/am.c:2394
-msgid "synonyms for --continue"
-msgstr ""
-
-#: builtin/am.c:2397
-msgid "skip the current patch"
-msgstr ""
-
-#: builtin/am.c:2400
-msgid "restore the original branch and abort the patching operation"
-msgstr ""
-
-#: builtin/am.c:2403
-msgid "abort the patching operation but keep HEAD where it is"
-msgstr ""
-
-#: builtin/am.c:2407
-msgid "show the patch being applied"
-msgstr ""
-
-#: builtin/am.c:2411
-msgid "record the empty patch as an empty commit"
-msgstr ""
-
-#: builtin/am.c:2415
-msgid "lie about committer date"
-msgstr ""
-
-#: builtin/am.c:2417
-msgid "use current timestamp for author date"
-msgstr ""
-
-#: builtin/am.c:2419 builtin/commit-tree.c:118 builtin/commit.c:1642
-#: builtin/merge.c:302 builtin/pull.c:179 builtin/rebase.c:1127
-#: builtin/revert.c:117 builtin/tag.c:461
-msgid "key-id"
-msgstr ""
-
-#: builtin/am.c:2420 builtin/rebase.c:1128
-msgid "GPG-sign commits"
-msgstr ""
-
-#: builtin/am.c:2423
-msgid "how to handle empty patches"
-msgstr ""
-
-#: builtin/am.c:2426
-msgid "(internal use for git-rebase)"
-msgstr ""
-
-#: builtin/am.c:2444
-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 ""
-
-#: builtin/am.c:2451
-msgid "failed to read the index"
-msgstr ""
-
-#: builtin/am.c:2466
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-
-#: builtin/am.c:2490
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-
-#: builtin/am.c:2496
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
-
-#: builtin/am.c:2506
-msgid "interactive mode requires patches on the command line"
-msgstr ""
-
-#: builtin/apply.c:8
-msgid "git apply [<options>] [<patch>...]"
-msgstr ""
-
-#: builtin/archive.c:18
-msgid "could not redirect output"
-msgstr ""
-
-#: builtin/archive.c:35
-msgid "git archive: Remote with no URL"
-msgstr ""
-
-#: builtin/archive.c:59
-msgid "git archive: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: builtin/archive.c:62
-#, c-format
-msgid "git archive: NACK %s"
-msgstr ""
-
-#: builtin/archive.c:63
-msgid "git archive: protocol error"
-msgstr ""
-
-#: builtin/archive.c:67
-msgid "git archive: expected a flush"
-msgstr ""
-
-#: builtin/bisect--helper.c:24
-msgid "git bisect--helper --bisect-reset [<commit>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:26
-msgid ""
-"git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
-"=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
-"[<paths>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:29
-msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:30
-msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:31
-msgid "git bisect--helper --bisect-replay <filename>"
-msgstr ""
-
-#: builtin/bisect--helper.c:32
-msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:34
-msgid "git bisect--helper --bisect-run <cmd>..."
-msgstr ""
-
-#: builtin/bisect--helper.c:109
-#, c-format
-msgid "cannot open file '%s' in mode '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:116
-#, c-format
-msgid "could not write to file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:154
-#, c-format
-msgid "cannot open file '%s' for reading"
-msgstr ""
-
-#: builtin/bisect--helper.c:170
-#, c-format
-msgid "'%s' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:174
-#, c-format
-msgid "can't use the builtin command '%s' as a term"
-msgstr ""
-
-#: builtin/bisect--helper.c:184
-#, c-format
-msgid "can't change the meaning of the term '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:194
-msgid "please use two different terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:210
-#, c-format
-msgid "We are not bisecting.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:218
-#, c-format
-msgid "'%s' is not a valid commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:227
-#, c-format
-msgid ""
-"could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:271
-#, c-format
-msgid "Bad bisect_write argument: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:276
-#, c-format
-msgid "couldn't get the oid of the rev '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:288
-#, c-format
-msgid "couldn't open the file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:314
-#, c-format
-msgid "Invalid command: you're currently in a %s/%s bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:341
-#, c-format
-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 ""
-
-#: builtin/bisect--helper.c:345
-#, c-format
-msgid ""
-"You need to start by \"git bisect start\".\n"
-"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 ""
-
-#: builtin/bisect--helper.c:365
-#, c-format
-msgid "bisecting only with a %s commit"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:373
-msgid "Are you sure [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:434
-msgid "no terms defined"
-msgstr ""
-
-#: builtin/bisect--helper.c:437
-#, c-format
-msgid ""
-"Your current terms are %s for the old state\n"
-"and %s for the new state.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:447
-#, c-format
-msgid ""
-"invalid argument %s for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
-msgstr ""
-
-#: builtin/bisect--helper.c:514 builtin/bisect--helper.c:1038
-msgid "revision walk setup failed\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:536
-#, c-format
-msgid "could not open '%s' for appending"
-msgstr ""
-
-#: builtin/bisect--helper.c:655 builtin/bisect--helper.c:668
-msgid "'' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:678
-#, c-format
-msgid "unrecognized option: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:682
-#, c-format
-msgid "'%s' does not appear to be a valid revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:713
-msgid "bad HEAD - I need a HEAD"
-msgstr ""
-
-#: builtin/bisect--helper.c:728
-#, c-format
-msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:749
-msgid "won't bisect on cg-seek'ed tree"
-msgstr ""
-
-#: builtin/bisect--helper.c:752
-msgid "bad HEAD - strange symbolic ref"
-msgstr ""
-
-#: builtin/bisect--helper.c:772
-#, c-format
-msgid "invalid ref: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:830
-msgid "You need to start by \"git bisect start\"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:841
-msgid "Do you want me to do it for you [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:859
-msgid "Please call `--bisect-state` with at least one argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:872
-#, c-format
-msgid "'git bisect %s' can take only one argument."
-msgstr ""
-
-#: builtin/bisect--helper.c:884 builtin/bisect--helper.c:897
-#, c-format
-msgid "Bad rev input: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:904
-#, c-format
-msgid "Bad rev input (not a commit): %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:936
-msgid "We are not bisecting."
-msgstr ""
-
-#: builtin/bisect--helper.c:986
-#, c-format
-msgid "'%s'?? what are you talking about?"
-msgstr ""
-
-#: builtin/bisect--helper.c:998
-#, c-format
-msgid "cannot read file '%s' for replaying"
-msgstr ""
-
-#: builtin/bisect--helper.c:1120 builtin/bisect--helper.c:1152
-#, c-format
-msgid "running %s\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:1145 builtin/bisect--helper.c:1335
-msgid "bisect run failed: no command provided."
-msgstr ""
-
-#: builtin/bisect--helper.c:1166
-#, c-format
-msgid "unable to verify '%s' on good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1172
-#, c-format
-msgid "bogus exit code %d for good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1180
-#, c-format
-msgid "bisect run failed: exit code %d from '%s' is < 0 or >= 128"
-msgstr ""
-
-#: builtin/bisect--helper.c:1195
-#, c-format
-msgid "cannot open file '%s' for writing"
-msgstr ""
-
-#: builtin/bisect--helper.c:1213
-msgid "bisect run cannot continue any more"
-msgstr ""
-
-#: builtin/bisect--helper.c:1215
-#, c-format
-msgid "bisect run success"
-msgstr ""
-
-#: builtin/bisect--helper.c:1218
-#, c-format
-msgid "bisect found first bad commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1221
-#, c-format
-msgid ""
-"bisect run failed: 'git bisect--helper --bisect-state %s' exited with error "
-"code %d"
-msgstr ""
-
-#: builtin/bisect--helper.c:1253
-msgid "reset the bisection state"
-msgstr ""
-
-#: builtin/bisect--helper.c:1255
-msgid "check whether bad or good terms exist"
-msgstr ""
-
-#: builtin/bisect--helper.c:1257
-msgid "print out the bisect terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:1259
-msgid "start the bisect session"
-msgstr ""
-
-#: builtin/bisect--helper.c:1261
-msgid "find the next bisection commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1263
-msgid "mark the state of ref (or refs)"
-msgstr ""
-
-#: builtin/bisect--helper.c:1265
-msgid "list the bisection steps so far"
-msgstr ""
-
-#: builtin/bisect--helper.c:1267
-msgid "replay the bisection process from the given file"
-msgstr ""
-
-#: builtin/bisect--helper.c:1269
-msgid "skip some commits for checkout"
-msgstr ""
-
-#: builtin/bisect--helper.c:1271
-msgid "visualize the bisection"
-msgstr ""
-
-#: builtin/bisect--helper.c:1273
-msgid "use <cmd>... to automatically bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:1275
-msgid "no log for BISECT_WRITE"
-msgstr ""
-
-#: builtin/bisect--helper.c:1290
-msgid "--bisect-reset requires either no argument or a commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1295
-msgid "--bisect-terms requires 0 or 1 argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:1304
-msgid "--bisect-next requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1315
-msgid "--bisect-log requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1320
-msgid "no logfile given"
-msgstr ""
-
-#: builtin/blame.c:32
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr ""
-
-#: builtin/blame.c:37
-msgid "<rev-opts> are documented in git-rev-list(1)"
-msgstr ""
-
-#: builtin/blame.c:406
-#, c-format
-msgid "expecting a color: %s"
-msgstr ""
-
-#: builtin/blame.c:413
-msgid "must end with a color"
-msgstr ""
-
-#: builtin/blame.c:842
-#, c-format
-msgid "cannot find revision %s to ignore"
-msgstr ""
-
-#: builtin/blame.c:864
-msgid "show blame entries as we find them, incrementally"
-msgstr ""
-
-#: builtin/blame.c:865
-msgid "do not show object names of boundary commits (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:866
-msgid "do not treat root commits as boundaries (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:867
-msgid "show work cost statistics"
-msgstr ""
-
-#: builtin/blame.c:868 builtin/checkout.c:1554 builtin/clone.c:98
-#: builtin/commit-graph.c:75 builtin/commit-graph.c:228 builtin/fetch.c:181
-#: builtin/merge.c:301 builtin/multi-pack-index.c:103
-#: builtin/multi-pack-index.c:154 builtin/multi-pack-index.c:180
-#: builtin/multi-pack-index.c:208 builtin/pull.c:120 builtin/push.c:566
-#: builtin/remote.c:683 builtin/send-pack.c:202
-msgid "force progress reporting"
-msgstr ""
-
-#: builtin/blame.c:869
-msgid "show output score for blame entries"
-msgstr ""
-
-#: builtin/blame.c:870
-msgid "show original filename (Default: auto)"
-msgstr ""
-
-#: builtin/blame.c:871
-msgid "show original linenumber (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:872
-msgid "show in a format designed for machine consumption"
-msgstr ""
-
-#: builtin/blame.c:873
-msgid "show porcelain format with per-line commit information"
-msgstr ""
-
-#: builtin/blame.c:874
-msgid "use the same output mode as git-annotate (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:875
-msgid "show raw timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:876
-msgid "show long commit SHA1 (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:877
-msgid "suppress author name and timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:878
-msgid "show author email instead of name (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:879
-msgid "ignore whitespace differences"
-msgstr ""
-
-#: builtin/blame.c:880 builtin/log.c:1857
-msgid "rev"
-msgstr ""
-
-#: builtin/blame.c:880
-msgid "ignore <rev> when blaming"
-msgstr ""
-
-#: builtin/blame.c:881
-msgid "ignore revisions from <file>"
-msgstr ""
-
-#: builtin/blame.c:882
-msgid "color redundant metadata from previous line differently"
-msgstr ""
-
-#: builtin/blame.c:883
-msgid "color lines by age"
-msgstr ""
-
-#: builtin/blame.c:884
-msgid "spend extra cycles to find better match"
-msgstr ""
-
-#: builtin/blame.c:885
-msgid "use revisions from <file> instead of calling git-rev-list"
-msgstr ""
-
-#: builtin/blame.c:886
-msgid "use <file>'s contents as the final image"
-msgstr ""
-
-#: builtin/blame.c:887 builtin/blame.c:888
-msgid "score"
-msgstr ""
-
-#: builtin/blame.c:887
-msgid "find line copies within and across files"
-msgstr ""
-
-#: builtin/blame.c:888
-msgid "find line movements within and across files"
-msgstr ""
-
-#: builtin/blame.c:889
-msgid "range"
-msgstr ""
-
-#: builtin/blame.c:890
-msgid "process only line range <start>,<end> or function :<funcname>"
-msgstr ""
-
-#: builtin/blame.c:949
-msgid "--progress can't be used with --incremental or porcelain formats"
-msgstr ""
-
-#. TRANSLATORS: This string is used to tell us the
-#. maximum display width for a relative timestamp in
-#. "git blame" output.  For C locale, "4 years, 11
-#. months ago", which takes 22 places, is the longest
-#. among various forms of relative timestamps, but
-#. your language may need more or fewer display
-#. columns.
-#.
-#: builtin/blame.c:1000
-msgid "4 years, 11 months ago"
-msgstr ""
-
-#: builtin/blame.c:1116
-#, c-format
-msgid "file %s has only %lu line"
-msgid_plural "file %s has only %lu lines"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/blame.c:1161
-msgid "Blaming lines"
-msgstr ""
-
-#: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--merged] [--no-merged]"
-msgstr ""
-
-#: builtin/branch.c:30
-msgid ""
-"git branch [<options>] [-f] [--recurse-submodules] <branch-name> [<start-"
-"point>]"
-msgstr ""
-
-#: builtin/branch.c:31
-msgid "git branch [<options>] [-l] [<pattern>...]"
-msgstr ""
-
-#: builtin/branch.c:32
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr ""
-
-#: builtin/branch.c:33
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:34
-msgid "git branch [<options>] (-c | -C) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:35
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr ""
-
-#: builtin/branch.c:36
-msgid "git branch [<options>] [-r | -a] [--format]"
-msgstr ""
-
-#: builtin/branch.c:165
-#, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:169
-#, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:183
-#, c-format
-msgid "Couldn't look up commit object for '%s'"
-msgstr ""
-
-#: builtin/branch.c:187
-#, c-format
-msgid ""
-"The branch '%s' is not fully merged.\n"
-"If you are sure you want to delete it, run 'git branch -D %s'."
-msgstr ""
-
-#: builtin/branch.c:200
-msgid "Update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:235
-msgid "cannot use -a with -d"
-msgstr ""
-
-#: builtin/branch.c:242
-msgid "Couldn't look up commit object for HEAD"
-msgstr ""
-
-#: builtin/branch.c:259
-#, c-format
-msgid "Cannot delete branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/branch.c:274
-#, c-format
-msgid "remote-tracking branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:275
-#, c-format
-msgid "branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:306
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:307
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:457 builtin/tag.c:64
-msgid "unable to parse format string"
-msgstr ""
-
-#: builtin/branch.c:488
-msgid "could not resolve HEAD"
-msgstr ""
-
-#: builtin/branch.c:494
-#, c-format
-msgid "HEAD (%s) points outside of refs/heads/"
-msgstr ""
-
-#: builtin/branch.c:509
-#, c-format
-msgid "Branch %s is being rebased at %s"
-msgstr ""
-
-#: builtin/branch.c:513
-#, c-format
-msgid "Branch %s is being bisected at %s"
-msgstr ""
-
-#: builtin/branch.c:530
-msgid "cannot copy the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:532
-msgid "cannot rename the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:543
-#, c-format
-msgid "Invalid branch name: '%s'"
-msgstr ""
-
-#: builtin/branch.c:572
-msgid "Branch rename failed"
-msgstr ""
-
-#: builtin/branch.c:574
-msgid "Branch copy failed"
-msgstr ""
-
-#: builtin/branch.c:578
-#, c-format
-msgid "Created a copy of a misnamed branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:581
-#, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
-
-#: builtin/branch.c:587
-#, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
-
-#: builtin/branch.c:596
-msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:598
-msgid "Branch is copied, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:614
-#, c-format
-msgid ""
-"Please edit the description for the branch\n"
-"  %s\n"
-"Lines starting with '%c' will be stripped.\n"
-msgstr ""
-
-#: builtin/branch.c:651
-msgid "Generic options"
-msgstr ""
-
-#: builtin/branch.c:653
-msgid "show hash and subject, give twice for upstream branch"
-msgstr ""
-
-#: builtin/branch.c:654
-msgid "suppress informational messages"
-msgstr ""
-
-#: builtin/branch.c:656 builtin/checkout.c:1571
-#: builtin/submodule--helper.c:3077
-msgid "set branch tracking configuration"
-msgstr ""
-
-#: builtin/branch.c:659
-msgid "do not use"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "upstream"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "change the upstream info"
-msgstr ""
-
-#: builtin/branch.c:662
-msgid "unset the upstream info"
-msgstr ""
-
-#: builtin/branch.c:663
-msgid "use colored output"
-msgstr ""
-
-#: builtin/branch.c:664
-msgid "act on remote-tracking branches"
-msgstr ""
-
-#: builtin/branch.c:666 builtin/branch.c:668
-msgid "print only branches that contain the commit"
-msgstr ""
-
-#: builtin/branch.c:667 builtin/branch.c:669
-msgid "print only branches that don't contain the commit"
-msgstr ""
-
-#: builtin/branch.c:672
-msgid "Specific git-branch actions:"
-msgstr ""
-
-#: builtin/branch.c:673
-msgid "list both remote-tracking and local branches"
-msgstr ""
-
-#: builtin/branch.c:675
-msgid "delete fully merged branch"
-msgstr ""
-
-#: builtin/branch.c:676
-msgid "delete branch (even if not merged)"
-msgstr ""
-
-#: builtin/branch.c:677
-msgid "move/rename a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:678
-msgid "move/rename a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:679
-msgid "copy a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:680
-msgid "copy a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:681
-msgid "list branch names"
-msgstr ""
-
-#: builtin/branch.c:682
-msgid "show current branch name"
-msgstr ""
-
-#: builtin/branch.c:683 builtin/submodule--helper.c:3075
-msgid "create the branch's reflog"
-msgstr ""
-
-#: builtin/branch.c:685
-msgid "edit the description for the branch"
-msgstr ""
-
-#: builtin/branch.c:686
-msgid "force creation, move/rename, deletion"
-msgstr ""
-
-#: builtin/branch.c:687
-msgid "print only branches that are merged"
-msgstr ""
-
-#: builtin/branch.c:688
-msgid "print only branches that are not merged"
-msgstr ""
-
-#: builtin/branch.c:689
-msgid "list branches in columns"
-msgstr ""
-
-#: builtin/branch.c:691 builtin/for-each-ref.c:45 builtin/notes.c:413
-#: builtin/notes.c:416 builtin/notes.c:579 builtin/notes.c:582
-#: builtin/tag.c:476
-msgid "object"
-msgstr ""
-
-#: builtin/branch.c:692
-msgid "print only branches of the object"
-msgstr ""
-
-#: builtin/branch.c:693 builtin/for-each-ref.c:51 builtin/tag.c:483
-msgid "sorting and filtering are case insensitive"
-msgstr ""
-
-#: builtin/branch.c:694 builtin/ls-files.c:667
-msgid "recurse through submodules"
-msgstr ""
-
-#: builtin/branch.c:695 builtin/for-each-ref.c:41 builtin/ls-tree.c:358
-#: builtin/tag.c:481 builtin/verify-tag.c:38
-msgid "format to use for the output"
-msgstr ""
-
-#: builtin/branch.c:718 builtin/clone.c:684
-msgid "HEAD not found below refs/heads!"
-msgstr ""
-
-#: builtin/branch.c:739
-msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
-msgstr ""
-
-#: builtin/branch.c:741
-msgid "--recurse-submodules can only be used to create branches"
-msgstr ""
-
-#: builtin/branch.c:770 builtin/branch.c:826 builtin/branch.c:835
-msgid "branch name required"
-msgstr ""
-
-#: builtin/branch.c:802
-msgid "Cannot give description to detached HEAD"
-msgstr ""
-
-#: builtin/branch.c:807
-msgid "cannot edit description of more than one branch"
-msgstr ""
-
-#: builtin/branch.c:814
-#, c-format
-msgid "No commit on branch '%s' yet."
-msgstr ""
-
-#: builtin/branch.c:817
-#, c-format
-msgid "No branch named '%s'."
-msgstr ""
-
-#: builtin/branch.c:832
-msgid "too many branches for a copy operation"
-msgstr ""
-
-#: builtin/branch.c:841
-msgid "too many arguments for a rename operation"
-msgstr ""
-
-#: builtin/branch.c:846
-msgid "too many arguments to set new upstream"
-msgstr ""
-
-#: builtin/branch.c:850
-#, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:853 builtin/branch.c:873
-#, c-format
-msgid "no such branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:857
-#, c-format
-msgid "branch '%s' does not exist"
-msgstr ""
-
-#: builtin/branch.c:867
-msgid "too many arguments to unset upstream"
-msgstr ""
-
-#: builtin/branch.c:871
-msgid "could not unset upstream of HEAD when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:877
-#, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr ""
-
-#: builtin/branch.c:890
-msgid ""
-"The -a, and -r, options to 'git branch' do not take a branch name.\n"
-"Did you mean to use: -a|-r --list <pattern>?"
-msgstr ""
-
-#: builtin/branch.c:894
-msgid ""
-"the '--set-upstream' option is no longer supported. Please use '--track' or "
-"'--set-upstream-to' instead."
-msgstr ""
-
-#: builtin/bugreport.c:16
-msgid "git version:\n"
-msgstr ""
-
-#: builtin/bugreport.c:22
-#, c-format
-msgid "uname() failed with error '%s' (%d)\n"
-msgstr ""
-
-#: builtin/bugreport.c:32
-msgid "compiler info: "
-msgstr ""
-
-#: builtin/bugreport.c:35
-msgid "libc info: "
-msgstr ""
-
-#: builtin/bugreport.c:49
-msgid "not run from a git repository - no hooks to show\n"
-msgstr ""
-
-#: builtin/bugreport.c:62
-msgid "git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"
-msgstr ""
-
-#: builtin/bugreport.c:69
-msgid ""
-"Thank you for filling out a Git bug report!\n"
-"Please answer the following questions to help us understand your issue.\n"
-"\n"
-"What did you do before the bug happened? (Steps to reproduce your issue)\n"
-"\n"
-"What did you expect to happen? (Expected behavior)\n"
-"\n"
-"What happened instead? (Actual behavior)\n"
-"\n"
-"What's different between what you expected and what actually happened?\n"
-"\n"
-"Anything else you want to add:\n"
-"\n"
-"Please review the rest of the bug report below.\n"
-"You can delete any lines you don't wish to share.\n"
-msgstr ""
-
-#: builtin/bugreport.c:108
-msgid "specify a destination for the bugreport file"
-msgstr ""
-
-#: builtin/bugreport.c:110
-msgid "specify a strftime format suffix for the filename"
-msgstr ""
-
-#: builtin/bugreport.c:132
-#, c-format
-msgid "could not create leading directories for '%s'"
-msgstr ""
-
-#: builtin/bugreport.c:139
-msgid "System Info"
-msgstr ""
-
-#: builtin/bugreport.c:142
-msgid "Enabled Hooks"
-msgstr ""
-
-#: builtin/bugreport.c:149
-#, c-format
-msgid "unable to write to %s"
-msgstr ""
-
-#: builtin/bugreport.c:159
-#, c-format
-msgid "Created new report at '%s'.\n"
-msgstr ""
-
-#: builtin/bundle.c:15 builtin/bundle.c:23
-msgid "git bundle create [<options>] <file> <git-rev-list args>"
-msgstr ""
-
-#: builtin/bundle.c:16 builtin/bundle.c:28
-msgid "git bundle verify [<options>] <file>"
-msgstr ""
-
-#: builtin/bundle.c:17 builtin/bundle.c:33
-msgid "git bundle list-heads <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:18 builtin/bundle.c:38
-msgid "git bundle unbundle <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:65 builtin/pack-objects.c:3899
-msgid "do not show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:67 builtin/bundle.c:168 builtin/pack-objects.c:3901
-msgid "show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:69 builtin/pack-objects.c:3903
-msgid "show progress meter during object writing phase"
-msgstr ""
-
-#: builtin/bundle.c:72 builtin/pack-objects.c:3906
-msgid "similar to --all-progress when progress meter is shown"
-msgstr ""
-
-#: builtin/bundle.c:74
-msgid "specify bundle format version"
-msgstr ""
-
-#: builtin/bundle.c:94
-msgid "Need a repository to create a bundle."
-msgstr ""
-
-#: builtin/bundle.c:108
-msgid "do not show bundle details"
-msgstr ""
-
-#: builtin/bundle.c:127
-#, c-format
-msgid "%s is okay\n"
-msgstr ""
-
-#: builtin/bundle.c:183
-msgid "Need a repository to unbundle."
-msgstr ""
-
-#: builtin/bundle.c:186
-msgid "Unbundling objects"
-msgstr ""
-
-#: builtin/bundle.c:220 builtin/remote.c:1758
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr ""
-
-#: builtin/cat-file.c:568
-msgid "flush is only for --buffer mode"
-msgstr ""
-
-#: builtin/cat-file.c:612
-msgid "empty command in input"
-msgstr ""
-
-#: builtin/cat-file.c:614
-#, c-format
-msgid "whitespace before command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:623
-#, c-format
-msgid "%s requires arguments"
-msgstr ""
-
-#: builtin/cat-file.c:628
-#, c-format
-msgid "%s takes no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:636
-#, c-format
-msgid "unknown command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:795
-msgid "only one batch option may be specified"
-msgstr ""
-
-#: builtin/cat-file.c:824
-msgid "git cat-file <type> <object>"
-msgstr ""
-
-#: builtin/cat-file.c:825
-msgid "git cat-file (-e | -p) <object>"
-msgstr ""
-
-#: builtin/cat-file.c:826
-msgid "git cat-file (-t | -s) [--allow-unknown-type] <object>"
-msgstr ""
-
-#: builtin/cat-file.c:827
-msgid ""
-"git cat-file (--batch | --batch-check | --batch-command) [--batch-all-"
-"objects]\n"
-"             [--buffer] [--follow-symlinks] [--unordered]\n"
-"             [--textconv | --filters]"
-msgstr ""
-
-#: builtin/cat-file.c:830
-msgid ""
-"git cat-file (--textconv | --filters)\n"
-"             [<rev>:<path|tree-ish> | --path=<path|tree-ish> <rev>]"
-msgstr ""
-
-#: builtin/cat-file.c:836
-msgid "Check object existence or emit object contents"
-msgstr ""
-
-#: builtin/cat-file.c:838
-msgid "check if <object> exists"
-msgstr ""
-
-#: builtin/cat-file.c:839
-msgid "pretty-print <object> content"
-msgstr ""
-
-#: builtin/cat-file.c:841
-msgid "Emit [broken] object attributes"
-msgstr ""
-
-#: builtin/cat-file.c:842
-msgid "show object type (one of 'blob', 'tree', 'commit', 'tag', ...)"
-msgstr ""
-
-#: builtin/cat-file.c:843
-msgid "show object size"
-msgstr ""
-
-#: builtin/cat-file.c:845
-msgid "allow -s and -t to work with broken/corrupt objects"
-msgstr ""
-
-#: builtin/cat-file.c:847
-msgid "Batch objects requested on stdin (or --batch-all-objects)"
-msgstr ""
-
-#: builtin/cat-file.c:849
-msgid "show full <object> or <rev> contents"
-msgstr ""
-
-#: builtin/cat-file.c:853
-msgid "like --batch, but don't emit <contents>"
-msgstr ""
-
-#: builtin/cat-file.c:857
-msgid "read commands from stdin"
-msgstr ""
-
-#: builtin/cat-file.c:861
-msgid "with --batch[-check]: ignores stdin, batches all known objects"
-msgstr ""
-
-#: builtin/cat-file.c:863
-msgid "Change or optimize batch output"
-msgstr ""
-
-#: builtin/cat-file.c:864
-msgid "buffer --batch output"
-msgstr ""
-
-#: builtin/cat-file.c:866
-msgid "follow in-tree symlinks"
-msgstr ""
-
-#: builtin/cat-file.c:868
-msgid "do not order objects before emitting them"
-msgstr ""
-
-#: builtin/cat-file.c:870
-msgid ""
-"Emit object (blob or tree) with conversion or filter (stand-alone, or with "
-"batch)"
-msgstr ""
-
-#: builtin/cat-file.c:872
-msgid "run textconv on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:874
-msgid "run filters on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:875
-msgid "blob|tree"
-msgstr ""
-
-#: builtin/cat-file.c:876
-msgid "use a <path> for (--textconv | --filters); Not with 'batch'"
-msgstr ""
-
-#: builtin/cat-file.c:894
-#, c-format
-msgid "'%s=<%s>' needs '%s' or '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:896
-msgid "path|tree-ish"
-msgstr ""
-
-#: builtin/cat-file.c:903 builtin/cat-file.c:906 builtin/cat-file.c:909
-#, c-format
-msgid "'%s' requires a batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:921
-#, c-format
-msgid "'-%c' is incompatible with batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:924
-msgid "batch modes take no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:932 builtin/cat-file.c:935
-#, c-format
-msgid "<rev> required with '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:938
-#, c-format
-msgid "<object> required with '-%c'"
-msgstr ""
-
-#: builtin/cat-file.c:943 builtin/notes.c:374 builtin/notes.c:429
-#: builtin/notes.c:507 builtin/notes.c:519 builtin/notes.c:596
-#: builtin/notes.c:663 builtin/notes.c:813 builtin/notes.c:965
-#: builtin/notes.c:987 builtin/prune-packed.c:25 builtin/receive-pack.c:2489
-#: builtin/tag.c:592
-msgid "too many arguments"
-msgstr ""
-
-#: builtin/cat-file.c:947
-#, c-format
-msgid "only two arguments allowed in <type> <object> mode, not %d"
-msgstr ""
-
-#: builtin/check-attr.c:13
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr ""
-
-#: builtin/check-attr.c:14
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr ""
-
-#: builtin/check-attr.c:21
-msgid "report all attributes set on file"
-msgstr ""
-
-#: builtin/check-attr.c:22
-msgid "use .gitattributes only from the index"
-msgstr ""
-
-#: builtin/check-attr.c:23 builtin/check-ignore.c:25 builtin/hash-object.c:101
-msgid "read file names from stdin"
-msgstr ""
-
-#: builtin/check-attr.c:25 builtin/check-ignore.c:27
-msgid "terminate input and output records by a NUL character"
-msgstr ""
-
-#: builtin/check-ignore.c:21 builtin/checkout.c:1550 builtin/gc.c:550
-#: builtin/worktree.c:565
-msgid "suppress progress reporting"
-msgstr ""
-
-#: builtin/check-ignore.c:29
-msgid "show non-matching input paths"
-msgstr ""
-
-#: builtin/check-ignore.c:31
-msgid "ignore index when checking"
-msgstr ""
-
-#: builtin/check-ignore.c:165
-msgid "cannot specify pathnames with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:168
-msgid "-z only makes sense with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:170
-msgid "no path specified"
-msgstr ""
-
-#: builtin/check-ignore.c:174
-msgid "--quiet is only valid with a single pathname"
-msgstr ""
-
-#: builtin/check-ignore.c:176
-msgid "cannot have both --quiet and --verbose"
-msgstr ""
-
-#: builtin/check-ignore.c:179
-msgid "--non-matching is only valid with --verbose"
-msgstr ""
-
-#: builtin/check-mailmap.c:9
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr ""
-
-#: builtin/check-mailmap.c:14
-msgid "also read contacts from stdin"
-msgstr ""
-
-#: builtin/check-mailmap.c:25
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr ""
-
-#: builtin/check-mailmap.c:48
-msgid "no contacts specified"
-msgstr ""
-
-#: builtin/checkout--worker.c:110
-msgid "git checkout--worker [<options>]"
-msgstr ""
-
-#: builtin/checkout--worker.c:118 builtin/checkout-index.c:235
-#: builtin/column.c:31 builtin/column.c:32 builtin/submodule--helper.c:1878
-#: builtin/submodule--helper.c:1881 builtin/submodule--helper.c:1889
-#: builtin/submodule--helper.c:2716 builtin/worktree.c:563
-#: builtin/worktree.c:808
-msgid "string"
-msgstr ""
-
-#: builtin/checkout--worker.c:119 builtin/checkout-index.c:236
-msgid "when creating files, prepend <string>"
-msgstr ""
-
-#: builtin/checkout-index.c:184
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/checkout-index.c:201
-msgid "stage should be between 1 and 3 or all"
-msgstr ""
-
-#: builtin/checkout-index.c:219
-msgid "check out all files in the index"
-msgstr ""
-
-#: builtin/checkout-index.c:221
-msgid "do not skip files with skip-worktree set"
-msgstr ""
-
-#: builtin/checkout-index.c:222
-msgid "force overwrite of existing files"
-msgstr ""
-
-#: builtin/checkout-index.c:224
-msgid "no warning for existing files and files not in index"
-msgstr ""
-
-#: builtin/checkout-index.c:226
-msgid "don't checkout new files"
-msgstr ""
-
-#: builtin/checkout-index.c:228
-msgid "update stat information in the index file"
-msgstr ""
-
-#: builtin/checkout-index.c:232
-msgid "read list of paths from the standard input"
-msgstr ""
-
-#: builtin/checkout-index.c:234
-msgid "write the content to temporary files"
-msgstr ""
-
-#: builtin/checkout-index.c:238
-msgid "copy out the files from named stage"
-msgstr ""
-
-#: builtin/checkout.c:34
-msgid "git checkout [<options>] <branch>"
-msgstr ""
-
-#: builtin/checkout.c:35
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr ""
-
-#: builtin/checkout.c:40
-msgid "git switch [<options>] [<branch>]"
-msgstr ""
-
-#: builtin/checkout.c:45
-msgid "git restore [<options>] [--source=<branch>] <file>..."
-msgstr ""
-
-#: builtin/checkout.c:199 builtin/checkout.c:238
-#, c-format
-msgid "path '%s' does not have our version"
-msgstr ""
-
-#: builtin/checkout.c:201 builtin/checkout.c:240
-#, c-format
-msgid "path '%s' does not have their version"
-msgstr ""
-
-#: builtin/checkout.c:217
-#, c-format
-msgid "path '%s' does not have all necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:271
-#, c-format
-msgid "path '%s' does not have necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:291
-#, c-format
-msgid "path '%s': cannot merge"
-msgstr ""
-
-#: builtin/checkout.c:307
-#, c-format
-msgid "Unable to add merge result for '%s'"
-msgstr ""
-
-#: builtin/checkout.c:424
-#, c-format
-msgid "Recreated %d merge conflict"
-msgid_plural "Recreated %d merge conflicts"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:429
-#, c-format
-msgid "Updated %d path from %s"
-msgid_plural "Updated %d paths from %s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:436
-#, c-format
-msgid "Updated %d path from the index"
-msgid_plural "Updated %d paths from the index"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:459 builtin/checkout.c:462 builtin/checkout.c:465
-#: builtin/checkout.c:469
-#, c-format
-msgid "'%s' cannot be used with updating paths"
-msgstr ""
-
-#: builtin/checkout.c:479
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
-msgstr ""
-
-#: builtin/checkout.c:483
-#, c-format
-msgid "neither '%s' or '%s' is specified"
-msgstr ""
-
-#: builtin/checkout.c:487
-#, c-format
-msgid "'%s' must be used when '%s' is not specified"
-msgstr ""
-
-#: builtin/checkout.c:492 builtin/checkout.c:497
-#, c-format
-msgid "'%s' or '%s' cannot be used with %s"
-msgstr ""
-
-#: builtin/checkout.c:571 builtin/checkout.c:578
-#, c-format
-msgid "path '%s' is unmerged"
-msgstr ""
-
-#: builtin/checkout.c:753
-msgid "you need to resolve your current index first"
-msgstr ""
-
-#: builtin/checkout.c:809
-#, c-format
-msgid ""
-"cannot continue with staged changes in the following files:\n"
-"%s"
-msgstr ""
-
-#: builtin/checkout.c:902
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
-msgstr ""
-
-#: builtin/checkout.c:947
-msgid "HEAD is now at"
-msgstr ""
-
-#: builtin/checkout.c:951 builtin/clone.c:615 t/helper/test-fast-rebase.c:203
-msgid "unable to update HEAD"
-msgstr ""
-
-#: builtin/checkout.c:955
-#, c-format
-msgid "Reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:958
-#, c-format
-msgid "Already on '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:962
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:964 builtin/checkout.c:1398
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:966
-#, c-format
-msgid "Switched to branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:1017
-#, c-format
-msgid " ... and %d more.\n"
-msgstr ""
-
-#: builtin/checkout.c:1023
-#, c-format
-msgid ""
-"Warning: you are leaving %d commit behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgid_plural ""
-"Warning: you are leaving %d commits behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1042
-#, c-format
-msgid ""
-"If you want to keep it by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgid_plural ""
-"If you want to keep them by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1077
-msgid "internal error in revision walk"
-msgstr ""
-
-#: builtin/checkout.c:1081
-msgid "Previous HEAD position was"
-msgstr ""
-
-#: builtin/checkout.c:1124 builtin/checkout.c:1393
-msgid "You are on a branch yet to be born"
-msgstr ""
-
-#: builtin/checkout.c:1206
-#, c-format
-msgid ""
-"'%s' could be both a local file and a tracking branch.\n"
-"Please use -- (and optionally --no-guess) to disambiguate"
-msgstr ""
-
-#: builtin/checkout.c:1213
-msgid ""
-"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
-"you can do so by fully qualifying the name with the --track option:\n"
-"\n"
-"    git checkout --track origin/<name>\n"
-"\n"
-"If you'd like to always have checkouts of an ambiguous <name> prefer\n"
-"one remote, e.g. the 'origin' remote, consider setting\n"
-"checkout.defaultRemote=origin in your config."
-msgstr ""
-
-#: builtin/checkout.c:1223
-#, c-format
-msgid "'%s' matched multiple (%d) remote tracking branches"
-msgstr ""
-
-#: builtin/checkout.c:1289
-msgid "only one reference expected"
-msgstr ""
-
-#: builtin/checkout.c:1306
-#, c-format
-msgid "only one reference expected, %d given."
-msgstr ""
-
-#: builtin/checkout.c:1352 builtin/worktree.c:338 builtin/worktree.c:508
-#, c-format
-msgid "invalid reference: %s"
-msgstr ""
-
-#: builtin/checkout.c:1365 builtin/checkout.c:1744
-#, c-format
-msgid "reference is not a tree: %s"
-msgstr ""
-
-#: builtin/checkout.c:1413
-#, c-format
-msgid "a branch is expected, got tag '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1415
-#, c-format
-msgid "a branch is expected, got remote branch '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1417 builtin/checkout.c:1426
-#, c-format
-msgid "a branch is expected, got '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1420
-#, c-format
-msgid "a branch is expected, got commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1429
-msgid ""
-"If you want to detach HEAD at the commit, try again with the --detach option."
-msgstr ""
-
-#: builtin/checkout.c:1442
-msgid ""
-"cannot switch branch while merging\n"
-"Consider \"git merge --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1446
-msgid ""
-"cannot switch branch in the middle of an am session\n"
-"Consider \"git am --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1450
-msgid ""
-"cannot switch branch while rebasing\n"
-"Consider \"git rebase --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1454
-msgid ""
-"cannot switch branch while cherry-picking\n"
-"Consider \"git cherry-pick --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1458
-msgid ""
-"cannot switch branch while reverting\n"
-"Consider \"git revert --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1462
-msgid "you are switching branch while bisecting"
-msgstr ""
-
-#: builtin/checkout.c:1469
-msgid "paths cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1472 builtin/checkout.c:1476 builtin/checkout.c:1480
-#, c-format
-msgid "'%s' cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1484 builtin/checkout.c:1487 builtin/checkout.c:1490
-#: builtin/checkout.c:1495 builtin/checkout.c:1500
-#, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1497
-#, c-format
-msgid "'%s' cannot take <start-point>"
-msgstr ""
-
-#: builtin/checkout.c:1505
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1512
-msgid "missing branch or commit argument"
-msgstr ""
-
-#: builtin/checkout.c:1555
-msgid "perform a 3-way merge with the new branch"
-msgstr ""
-
-#: builtin/checkout.c:1556 builtin/log.c:1844 parse-options.h:354
-msgid "style"
-msgstr ""
-
-#: builtin/checkout.c:1557
-msgid "conflict style (merge, diff3, or zdiff3)"
-msgstr ""
-
-#: builtin/checkout.c:1569 builtin/worktree.c:560
-msgid "detach HEAD at named commit"
-msgstr ""
-
-#: builtin/checkout.c:1574
-msgid "force checkout (throw away local modifications)"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new-branch"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new unparented branch"
-msgstr ""
-
-#: builtin/checkout.c:1578 builtin/merge.c:305
-msgid "update ignored files (default)"
-msgstr ""
-
-#: builtin/checkout.c:1581
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-
-#: builtin/checkout.c:1594
-msgid "checkout our version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1597
-msgid "checkout their version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1601
-msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
-
-#: builtin/checkout.c:1659
-#, c-format
-msgid "options '-%c', '-%c', and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/checkout.c:1700
-msgid "--track needs a branch name"
-msgstr ""
-
-#: builtin/checkout.c:1705
-#, c-format
-msgid "missing branch name; try -%c"
-msgstr ""
-
-#: builtin/checkout.c:1737
-#, c-format
-msgid "could not resolve %s"
-msgstr ""
-
-#: builtin/checkout.c:1753
-msgid "invalid path specification"
-msgstr ""
-
-#: builtin/checkout.c:1760
-#, c-format
-msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
-msgstr ""
-
-#: builtin/checkout.c:1764
-#, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1789
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
-msgstr ""
-
-#: builtin/checkout.c:1794
-msgid "you must specify path(s) to restore"
-msgstr ""
-
-#: builtin/checkout.c:1819 builtin/checkout.c:1821 builtin/checkout.c:1873
-#: builtin/checkout.c:1875 builtin/clone.c:130 builtin/remote.c:171
-#: builtin/remote.c:173 builtin/submodule--helper.c:3038
-#: builtin/submodule--helper.c:3371 builtin/worktree.c:556
-#: builtin/worktree.c:558
-msgid "branch"
-msgstr ""
-
-#: builtin/checkout.c:1820
-msgid "create and checkout a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1822
-msgid "create/reset and checkout a branch"
-msgstr ""
-
-#: builtin/checkout.c:1823
-msgid "create reflog for new branch"
-msgstr ""
-
-#: builtin/checkout.c:1825
-msgid "second guess 'git checkout <no-such-branch>' (default)"
-msgstr ""
-
-#: builtin/checkout.c:1826
-msgid "use overlay mode (default)"
-msgstr ""
-
-#: builtin/checkout.c:1874
-msgid "create and switch to a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1876
-msgid "create/reset and switch to a branch"
-msgstr ""
-
-#: builtin/checkout.c:1878
-msgid "second guess 'git switch <no-such-branch>'"
-msgstr ""
-
-#: builtin/checkout.c:1880
-msgid "throw away local modifications"
-msgstr ""
-
-#: builtin/checkout.c:1916
-msgid "which tree-ish to checkout from"
-msgstr ""
-
-#: builtin/checkout.c:1918
-msgid "restore the index"
-msgstr ""
-
-#: builtin/checkout.c:1920
-msgid "restore the working tree (default)"
-msgstr ""
-
-#: builtin/checkout.c:1922
-msgid "ignore unmerged entries"
-msgstr ""
-
-#: builtin/checkout.c:1923
-msgid "use overlay mode"
-msgstr ""
-
-#: builtin/clean.c:29
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr ""
-
-#: builtin/clean.c:33
-#, c-format
-msgid "Removing %s\n"
-msgstr ""
-
-#: builtin/clean.c:34
-#, c-format
-msgid "Would remove %s\n"
-msgstr ""
-
-#: builtin/clean.c:35
-#, c-format
-msgid "Skipping repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:36
-#, c-format
-msgid "Would skip repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:38
-#, c-format
-msgid "could not lstat %s\n"
-msgstr ""
-
-#: builtin/clean.c:39
-msgid "Refusing to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:40
-msgid "Would refuse to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:326 git-add--interactive.perl:593
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing\n"
-msgstr ""
-
-#: builtin/clean.c:330 git-add--interactive.perl:602
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a single item\n"
-"3-5        - select a range of items\n"
-"2-3,6-9    - select multiple ranges\n"
-"foo        - select item based on unique prefix\n"
-"-...       - unselect specified items\n"
-"*          - choose all items\n"
-"           - (empty) finish selecting\n"
-msgstr ""
-
-#: builtin/clean.c:545 git-add--interactive.perl:568
-#: git-add--interactive.perl:573
-#, c-format, perl-format
-msgid "Huh (%s)?\n"
-msgstr ""
-
-#: builtin/clean.c:685
-#, c-format
-msgid "Input ignore patterns>> "
-msgstr ""
-
-#: builtin/clean.c:719
-#, c-format
-msgid "WARNING: Cannot find items matched by: %s"
-msgstr ""
-
-#: builtin/clean.c:740
-msgid "Select items to delete"
-msgstr ""
-
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:781
-#, c-format
-msgid "Remove %s [y/N]? "
-msgstr ""
-
-#: builtin/clean.c:812
-msgid ""
-"clean               - start cleaning\n"
-"filter by pattern   - exclude items from deletion\n"
-"select by numbers   - select items to be deleted by numbers\n"
-"ask each            - confirm each deletion (like \"rm -i\")\n"
-"quit                - stop cleaning\n"
-"help                - this screen\n"
-"?                   - help for prompt selection"
-msgstr ""
-
-#: builtin/clean.c:848
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/clean.c:864
-msgid "No more files to clean, exiting."
-msgstr ""
-
-#: builtin/clean.c:926
-msgid "do not print names of files removed"
-msgstr ""
-
-#: builtin/clean.c:928
-msgid "force"
-msgstr ""
-
-#: builtin/clean.c:929
-msgid "interactive cleaning"
-msgstr ""
-
-#: builtin/clean.c:931
-msgid "remove whole directories"
-msgstr ""
-
-#: builtin/clean.c:932 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:938 builtin/log.c:185 builtin/log.c:187
-#: builtin/ls-files.c:651 builtin/name-rev.c:585 builtin/name-rev.c:587
-#: builtin/show-ref.c:179
-msgid "pattern"
-msgstr ""
-
-#: builtin/clean.c:933
-msgid "add <pattern> to ignore rules"
-msgstr ""
-
-#: builtin/clean.c:934
-msgid "remove ignored files, too"
-msgstr ""
-
-#: builtin/clean.c:936
-msgid "remove only ignored files"
-msgstr ""
-
-#: builtin/clean.c:951
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
-msgstr ""
-
-#: builtin/clean.c:954
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
-msgstr ""
-
-#: builtin/clean.c:966
-msgid "-x and -X cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:47
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: builtin/clone.c:100
-msgid "don't clone shallow repository"
-msgstr ""
-
-#: builtin/clone.c:102
-msgid "don't create a checkout"
-msgstr ""
-
-#: builtin/clone.c:103 builtin/clone.c:105 builtin/init-db.c:542
-msgid "create a bare repository"
-msgstr ""
-
-#: builtin/clone.c:107
-msgid "create a mirror repository (implies bare)"
-msgstr ""
-
-#: builtin/clone.c:109
-msgid "to clone from a local repository"
-msgstr ""
-
-#: builtin/clone.c:111
-msgid "don't use local hardlinks, always copy"
-msgstr ""
-
-#: builtin/clone.c:113
-msgid "setup as shared repository"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "pathspec"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "initialize submodules in the clone"
-msgstr ""
-
-#: builtin/clone.c:119
-msgid "number of submodules cloned in parallel"
-msgstr ""
-
-#: builtin/clone.c:120 builtin/init-db.c:539
-msgid "template-directory"
-msgstr ""
-
-#: builtin/clone.c:121 builtin/init-db.c:540
-msgid "directory from which templates will be used"
-msgstr ""
-
-#: builtin/clone.c:123 builtin/clone.c:125 builtin/submodule--helper.c:1885
-#: builtin/submodule--helper.c:2719 builtin/submodule--helper.c:3378
-msgid "reference repository"
-msgstr ""
-
-#: builtin/clone.c:127 builtin/submodule--helper.c:1887
-#: builtin/submodule--helper.c:2721
-msgid "use --reference only while cloning"
-msgstr ""
-
-#: builtin/clone.c:128 builtin/column.c:27 builtin/fmt-merge-msg.c:27
-#: builtin/init-db.c:550 builtin/merge-file.c:48 builtin/merge.c:290
-#: builtin/pack-objects.c:3967 builtin/repack.c:669
-#: builtin/submodule--helper.c:3380 t/helper/test-simple-ipc.c:595
-#: t/helper/test-simple-ipc.c:597
-msgid "name"
-msgstr ""
-
-#: builtin/clone.c:129
-msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
-
-#: builtin/clone.c:131
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
-
-#: builtin/clone.c:133
-msgid "path to git-upload-pack on the remote"
-msgstr ""
-
-#: builtin/clone.c:134 builtin/fetch.c:182 builtin/grep.c:877
-#: builtin/pull.c:212
-msgid "depth"
-msgstr ""
-
-#: builtin/clone.c:135
-msgid "create a shallow clone of that depth"
-msgstr ""
-
-#: builtin/clone.c:136 builtin/fetch.c:184 builtin/pack-objects.c:3956
-#: builtin/pull.c:215
-msgid "time"
-msgstr ""
-
-#: builtin/clone.c:137
-msgid "create a shallow clone since a specific time"
-msgstr ""
-
-#: builtin/clone.c:138 builtin/fetch.c:186 builtin/fetch.c:212
-#: builtin/pull.c:218 builtin/pull.c:243 builtin/rebase.c:1050
-msgid "revision"
-msgstr ""
-
-#: builtin/clone.c:139 builtin/fetch.c:187 builtin/pull.c:219
-msgid "deepen history of shallow clone, excluding rev"
-msgstr ""
-
-#: builtin/clone.c:141 builtin/submodule--helper.c:1897
-#: builtin/submodule--helper.c:2735
-msgid "clone only one branch, HEAD or --branch"
-msgstr ""
-
-#: builtin/clone.c:143
-msgid "don't clone any tags, and make later fetches not to follow them"
-msgstr ""
-
-#: builtin/clone.c:145
-msgid "any cloned submodules will be shallow"
-msgstr ""
-
-#: builtin/clone.c:146 builtin/init-db.c:548
-msgid "gitdir"
-msgstr ""
-
-#: builtin/clone.c:147 builtin/init-db.c:549
-msgid "separate git dir from working tree"
-msgstr ""
-
-#: builtin/clone.c:148
-msgid "key=value"
-msgstr ""
-
-#: builtin/clone.c:149
-msgid "set config inside the new repository"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:234 builtin/push.c:575 builtin/send-pack.c:200
-msgid "server-specific"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:235 builtin/push.c:575 builtin/send-pack.c:201
-msgid "option to transmit"
-msgstr ""
-
-#: builtin/clone.c:152 builtin/fetch.c:208 builtin/pull.c:238
-#: builtin/push.c:576
-msgid "use IPv4 addresses only"
-msgstr ""
-
-#: builtin/clone.c:154 builtin/fetch.c:210 builtin/pull.c:241
-#: builtin/push.c:578
-msgid "use IPv6 addresses only"
-msgstr ""
-
-#: builtin/clone.c:158
-msgid "apply partial clone filters to submodules"
-msgstr ""
-
-#: builtin/clone.c:160
-msgid "any cloned submodules will use their remote-tracking branch"
-msgstr ""
-
-#: builtin/clone.c:162
-msgid "initialize sparse-checkout file to include only files at root"
-msgstr ""
-
-#: builtin/clone.c:237
-#, c-format
-msgid "info: Could not add alternate for '%s': %s\n"
-msgstr ""
-
-#: builtin/clone.c:310
-#, c-format
-msgid "%s exists and is not a directory"
-msgstr ""
-
-#: builtin/clone.c:328
-#, c-format
-msgid "failed to start iterator over '%s'"
-msgstr ""
-
-#: builtin/clone.c:359
-#, c-format
-msgid "failed to create link '%s'"
-msgstr ""
-
-#: builtin/clone.c:363
-#, c-format
-msgid "failed to copy file to '%s'"
-msgstr ""
-
-#: builtin/clone.c:368
-#, c-format
-msgid "failed to iterate over '%s'"
-msgstr ""
-
-#: builtin/clone.c:395
-#, c-format
-msgid "done.\n"
-msgstr ""
-
-#: builtin/clone.c:409
-msgid ""
-"Clone succeeded, but checkout failed.\n"
-"You can inspect what was checked out with 'git status'\n"
-"and retry with 'git restore --source=HEAD :/'\n"
-msgstr ""
-
-#: builtin/clone.c:486
-#, c-format
-msgid "Could not find remote branch %s to clone."
-msgstr ""
-
-#: builtin/clone.c:603
-#, c-format
-msgid "unable to update %s"
-msgstr ""
-
-#: builtin/clone.c:651
-msgid "failed to initialize sparse-checkout"
-msgstr ""
-
-#: builtin/clone.c:674
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr ""
-
-#: builtin/clone.c:709
-msgid "unable to checkout working tree"
-msgstr ""
-
-#: builtin/clone.c:793
-msgid "unable to write parameters to config file"
-msgstr ""
-
-#: builtin/clone.c:856
-msgid "cannot repack to clean up"
-msgstr ""
-
-#: builtin/clone.c:858
-msgid "cannot unlink temporary alternates file"
-msgstr ""
-
-#: builtin/clone.c:901
-msgid "Too many arguments."
-msgstr ""
-
-#: builtin/clone.c:905 contrib/scalar/scalar.c:413
-msgid "You must specify a repository to clone."
-msgstr ""
-
-#: builtin/clone.c:918
-#, c-format
-msgid "options '%s' and '%s %s' cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:935
-#, c-format
-msgid "repository '%s' does not exist"
-msgstr ""
-
-#: builtin/clone.c:939 builtin/fetch.c:2176
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr ""
-
-#: builtin/clone.c:949
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:955
-#, c-format
-msgid "repository path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:969
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr ""
-
-#: builtin/clone.c:984 builtin/clone.c:1005 builtin/difftool.c:256
-#: builtin/log.c:2037 builtin/worktree.c:350 builtin/worktree.c:382
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr ""
-
-#: builtin/clone.c:989
-#, c-format
-msgid "could not create work tree dir '%s'"
-msgstr ""
-
-#: builtin/clone.c:1009
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1011
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1040
-msgid ""
-"clone --recursive is not compatible with both --reference and --reference-if-"
-"able"
-msgstr ""
-
-#: builtin/clone.c:1116 builtin/remote.c:201 builtin/remote.c:721
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr ""
-
-#: builtin/clone.c:1157
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1159
-msgid "--shallow-since is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1161
-msgid "--shallow-exclude is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1163
-msgid "--filter is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1168
-msgid "source repository is shallow, ignoring --local"
-msgstr ""
-
-#: builtin/clone.c:1173
-msgid "--local is ignored"
-msgstr ""
-
-#: builtin/clone.c:1185
-msgid "cannot clone from filtered bundle"
-msgstr ""
-
-#: builtin/clone.c:1265 builtin/clone.c:1324
-msgid "remote transport reported error"
-msgstr ""
-
-#: builtin/clone.c:1277 builtin/clone.c:1289
-#, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr ""
-
-#: builtin/clone.c:1292
-msgid "You appear to have cloned an empty repository."
-msgstr ""
-
-#: builtin/column.c:10
-msgid "git column [<options>]"
-msgstr ""
-
-#: builtin/column.c:27
-msgid "lookup config vars"
-msgstr ""
-
-#: builtin/column.c:28 builtin/column.c:29
-msgid "layout to use"
-msgstr ""
-
-#: builtin/column.c:30
-msgid "maximum width"
-msgstr ""
-
-#: builtin/column.c:31
-msgid "padding space on left border"
-msgstr ""
-
-#: builtin/column.c:32
-msgid "padding space on right border"
-msgstr ""
-
-#: builtin/column.c:33
-msgid "padding space between columns"
-msgstr ""
-
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr ""
-
-#: builtin/commit-graph.c:13
-msgid ""
-"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
-msgstr ""
-
-#: builtin/commit-graph.c:16
-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 ""
-
-#: builtin/commit-graph.c:51 builtin/fetch.c:196 builtin/log.c:1813
-msgid "dir"
-msgstr ""
-
-#: builtin/commit-graph.c:52
-msgid "the object directory to store the graph"
-msgstr ""
-
-#: builtin/commit-graph.c:73
-msgid "if the commit-graph is split, only verify the tip file"
-msgstr ""
-
-#: builtin/commit-graph.c:100
-#, c-format
-msgid "Could not open commit-graph '%s'"
-msgstr ""
-
-#: builtin/commit-graph.c:137
-#, c-format
-msgid "unrecognized --split argument, %s"
-msgstr ""
-
-#: builtin/commit-graph.c:150
-#, c-format
-msgid "unexpected non-hex object ID: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:155
-#, c-format
-msgid "invalid object: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:205
-msgid "start walk at all refs"
-msgstr ""
-
-#: builtin/commit-graph.c:207
-msgid "scan pack-indexes listed by stdin for commits"
-msgstr ""
-
-#: builtin/commit-graph.c:209
-msgid "start walk at commits listed by stdin"
-msgstr ""
-
-#: builtin/commit-graph.c:211
-msgid "include all commits already in the commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:213
-msgid "enable computation for changed paths"
-msgstr ""
-
-#: builtin/commit-graph.c:215
-msgid "allow writing an incremental commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:219
-msgid "maximum number of commits in a non-base split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:221
-msgid "maximum ratio between two levels of a split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:223
-msgid "only expire files older than a given date-time"
-msgstr ""
-
-#: builtin/commit-graph.c:225
-msgid "maximum number of changed-path Bloom filters to compute"
-msgstr ""
-
-#: builtin/commit-graph.c:251
-msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
-msgstr ""
-
-#: builtin/commit-graph.c:282
-msgid "Collecting commits from input"
-msgstr ""
-
-#: builtin/commit-graph.c:328 builtin/multi-pack-index.c:259
-#, c-format
-msgid "unrecognized subcommand: %s"
-msgstr ""
-
-#: builtin/commit-tree.c:18
-msgid ""
-"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F "
-"<file>)...] <tree>"
-msgstr ""
-
-#: builtin/commit-tree.c:31
-#, c-format
-msgid "duplicate parent %s ignored"
-msgstr ""
-
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:134 builtin/log.c:590
-#, c-format
-msgid "not a valid object name %s"
-msgstr ""
-
-#: builtin/commit-tree.c:94
-#, c-format
-msgid "git commit-tree: failed to read '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:96
-#, c-format
-msgid "git commit-tree: failed to close '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:109
-msgid "parent"
-msgstr ""
-
-#: builtin/commit-tree.c:110
-msgid "id of a parent commit object"
-msgstr ""
-
-#: builtin/commit-tree.c:112 builtin/commit.c:1626 builtin/merge.c:284
-#: builtin/notes.c:407 builtin/notes.c:573 builtin/stash.c:1666
-#: builtin/tag.c:455
-msgid "message"
-msgstr ""
-
-#: builtin/commit-tree.c:113 builtin/commit.c:1626
-msgid "commit message"
-msgstr ""
-
-#: builtin/commit-tree.c:116
-msgid "read commit log message from file"
-msgstr ""
-
-#: builtin/commit-tree.c:119 builtin/commit.c:1643 builtin/merge.c:303
-#: builtin/pull.c:180 builtin/revert.c:118
-msgid "GPG sign commit"
-msgstr ""
-
-#: builtin/commit-tree.c:131
-msgid "must give exactly one tree"
-msgstr ""
-
-#: builtin/commit-tree.c:138
-msgid "git commit-tree: failed to read"
-msgstr ""
-
-#: builtin/commit.c:43
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:48
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:53
-msgid ""
-"You asked to amend the most recent commit, but doing so would make\n"
-"it empty. You can repeat your command with --allow-empty, or you can\n"
-"remove the commit entirely with \"git reset HEAD^\".\n"
-msgstr ""
-
-#: builtin/commit.c:58
-msgid ""
-"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
-"If you wish to commit it anyway, use:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:65
-msgid "Otherwise, please use 'git rebase --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:68
-msgid "Otherwise, please use 'git cherry-pick --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:71
-msgid ""
-"and then use:\n"
-"\n"
-"    git cherry-pick --continue\n"
-"\n"
-"to resume cherry-picking the remaining commits.\n"
-"If you wish to skip this commit, use:\n"
-"\n"
-"    git cherry-pick --skip\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:326
-msgid "failed to unpack HEAD tree object"
-msgstr ""
-
-#: builtin/commit.c:376
-msgid "No paths with --include/--only does not make sense."
-msgstr ""
-
-#: builtin/commit.c:388
-msgid "unable to create temporary index"
-msgstr ""
-
-#: builtin/commit.c:397
-msgid "interactive add failed"
-msgstr ""
-
-#: builtin/commit.c:412
-msgid "unable to update temporary index"
-msgstr ""
-
-#: builtin/commit.c:414
-msgid "Failed to update main cache tree"
-msgstr ""
-
-#: builtin/commit.c:439 builtin/commit.c:462 builtin/commit.c:510
-msgid "unable to write new_index file"
-msgstr ""
-
-#: builtin/commit.c:491
-msgid "cannot do a partial commit during a merge."
-msgstr ""
-
-#: builtin/commit.c:493
-msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
-
-#: builtin/commit.c:495
-msgid "cannot do a partial commit during a rebase."
-msgstr ""
-
-#: builtin/commit.c:503
-msgid "cannot read the index"
-msgstr ""
-
-#: builtin/commit.c:522
-msgid "unable to write temporary index file"
-msgstr ""
-
-#: builtin/commit.c:620
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr ""
-
-#: builtin/commit.c:622
-#, c-format
-msgid "commit '%s' has malformed author line"
-msgstr ""
-
-#: builtin/commit.c:641
-msgid "malformed --author parameter"
-msgstr ""
-
-#: builtin/commit.c:694
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-msgstr ""
-
-#: builtin/commit.c:750 builtin/commit.c:784 builtin/commit.c:1170
-#, c-format
-msgid "could not lookup commit %s"
-msgstr ""
-
-#: builtin/commit.c:762 builtin/shortlog.c:417
-#, c-format
-msgid "(reading log message from standard input)\n"
-msgstr ""
-
-#: builtin/commit.c:764
-msgid "could not read log from standard input"
-msgstr ""
-
-#: builtin/commit.c:768
-#, c-format
-msgid "could not read log file '%s'"
-msgstr ""
-
-#: builtin/commit.c:805
-#, c-format
-msgid "options '%s' and '%s:%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:817 builtin/commit.c:833
-msgid "could not read SQUASH_MSG"
-msgstr ""
-
-#: builtin/commit.c:824
-msgid "could not read MERGE_MSG"
-msgstr ""
-
-#: builtin/commit.c:884
-msgid "could not write commit template"
-msgstr ""
-
-#: builtin/commit.c:897
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/commit.c:899
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored, and an empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:903
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-msgstr ""
-
-#: builtin/commit.c:907
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-"An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:919
-msgid ""
-"\n"
-"It looks like you may be committing a merge.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d MERGE_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:924
-msgid ""
-"\n"
-"It looks like you may be committing a cherry-pick.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d CHERRY_PICK_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:951
-#, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:959
-#, c-format
-msgid "%sDate:      %s"
-msgstr ""
-
-#: builtin/commit.c:966
-#, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:984
-msgid "Cannot read index"
-msgstr ""
-
-#: builtin/commit.c:1029
-msgid "unable to pass trailers to --trailers"
-msgstr ""
-
-#: builtin/commit.c:1069
-msgid "Error building trees"
-msgstr ""
-
-#: builtin/commit.c:1083 builtin/tag.c:317
-#, c-format
-msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
-
-#: builtin/commit.c:1128
-#, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
-msgstr ""
-
-#: builtin/commit.c:1142
-#, c-format
-msgid "Invalid ignored mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1160 builtin/commit.c:1450
-#, c-format
-msgid "Invalid untracked files mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1231
-msgid "You are in the middle of a merge -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1233
-msgid "You are in the middle of a cherry-pick -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1236
-#, c-format
-msgid "reword option of '%s' and path '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1238
-#, c-format
-msgid "reword option of '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1263
-msgid "You have nothing to amend."
-msgstr ""
-
-#: builtin/commit.c:1266
-msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1268
-msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1270
-msgid "You are in the middle of a rebase -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1290
-msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr ""
-
-#: builtin/commit.c:1337
-#, c-format
-msgid "unknown option: --fixup=%s:%s"
-msgstr ""
-
-#: builtin/commit.c:1354
-#, c-format
-msgid "paths '%s ...' with -a does not make sense"
-msgstr ""
-
-#: builtin/commit.c:1485 builtin/commit.c:1654
-msgid "show status concisely"
-msgstr ""
-
-#: builtin/commit.c:1487 builtin/commit.c:1656
-msgid "show branch information"
-msgstr ""
-
-#: builtin/commit.c:1489
-msgid "show stash information"
-msgstr ""
-
-#: builtin/commit.c:1491 builtin/commit.c:1658
-msgid "compute full ahead/behind values"
-msgstr ""
-
-#: builtin/commit.c:1493
-msgid "version"
-msgstr ""
-
-#: builtin/commit.c:1493 builtin/commit.c:1660 builtin/push.c:551
-#: builtin/worktree.c:765
-msgid "machine-readable output"
-msgstr ""
-
-#: builtin/commit.c:1496 builtin/commit.c:1662
-msgid "show status in long format (default)"
-msgstr ""
-
-#: builtin/commit.c:1499 builtin/commit.c:1665
-msgid "terminate entries with NUL"
-msgstr ""
-
-#: builtin/commit.c:1501 builtin/commit.c:1505 builtin/commit.c:1668
-#: builtin/fast-export.c:1172 builtin/fast-export.c:1175
-#: builtin/fast-export.c:1178 builtin/rebase.c:1139 parse-options.h:368
-msgid "mode"
-msgstr ""
-
-#: builtin/commit.c:1502 builtin/commit.c:1668
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1506
-msgid ""
-"show ignored files, optional modes: traditional, matching, no. (Default: "
-"traditional)"
-msgstr ""
-
-#: builtin/commit.c:1508 parse-options.h:197
-msgid "when"
-msgstr ""
-
-#: builtin/commit.c:1509
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1511
-msgid "list untracked files in columns"
-msgstr ""
-
-#: builtin/commit.c:1512
-msgid "do not detect renames"
-msgstr ""
-
-#: builtin/commit.c:1514
-msgid "detect renames, optionally set similarity index"
-msgstr ""
-
-#: builtin/commit.c:1537
-msgid "Unsupported combination of ignored and untracked-files arguments"
-msgstr ""
-
-#: builtin/commit.c:1619
-msgid "suppress summary after successful commit"
-msgstr ""
-
-#: builtin/commit.c:1620
-msgid "show diff in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1622
-msgid "Commit message options"
-msgstr ""
-
-#: builtin/commit.c:1623 builtin/merge.c:288 builtin/tag.c:457
-msgid "read message from file"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "author"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "override author for commit"
-msgstr ""
-
-#: builtin/commit.c:1625 builtin/gc.c:551
-msgid "date"
-msgstr ""
-
-#: builtin/commit.c:1625
-msgid "override date for commit"
-msgstr ""
-
-#: builtin/commit.c:1627 builtin/commit.c:1628 builtin/commit.c:1634
-#: parse-options.h:360 ref-filter.h:89
-msgid "commit"
-msgstr ""
-
-#: builtin/commit.c:1627
-msgid "reuse and edit message from specified commit"
-msgstr ""
-
-#: builtin/commit.c:1628
-msgid "reuse message from specified commit"
-msgstr ""
-
-#. TRANSLATORS: Leave "[(amend|reword):]" as-is,
-#. and only translate <commit>.
-#.
-#: builtin/commit.c:1633
-msgid "[(amend|reword):]commit"
-msgstr ""
-
-#: builtin/commit.c:1633
-msgid ""
-"use autosquash formatted message to fixup or amend/reword specified commit"
-msgstr ""
-
-#: builtin/commit.c:1634
-msgid "use autosquash formatted message to squash specified commit"
-msgstr ""
-
-#: builtin/commit.c:1635
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
-msgstr ""
-
-#: builtin/commit.c:1636 builtin/interpret-trailers.c:111
-msgid "trailer"
-msgstr ""
-
-#: builtin/commit.c:1636
-msgid "add custom trailer(s)"
-msgstr ""
-
-#: builtin/commit.c:1637 builtin/log.c:1788 builtin/merge.c:306
-#: builtin/pull.c:146 builtin/revert.c:110
-msgid "add a Signed-off-by trailer"
-msgstr ""
-
-#: builtin/commit.c:1638
-msgid "use specified template file"
-msgstr ""
-
-#: builtin/commit.c:1639
-msgid "force edit of commit"
-msgstr ""
-
-#: builtin/commit.c:1641
-msgid "include status in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1646
-msgid "Commit contents options"
-msgstr ""
-
-#: builtin/commit.c:1647
-msgid "commit all changed files"
-msgstr ""
-
-#: builtin/commit.c:1648
-msgid "add specified files to index for commit"
-msgstr ""
-
-#: builtin/commit.c:1649
-msgid "interactively add files"
-msgstr ""
-
-#: builtin/commit.c:1650
-msgid "interactively add changes"
-msgstr ""
-
-#: builtin/commit.c:1651
-msgid "commit only specified files"
-msgstr ""
-
-#: builtin/commit.c:1652
-msgid "bypass pre-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/commit.c:1653
-msgid "show what would be committed"
-msgstr ""
-
-#: builtin/commit.c:1666
-msgid "amend previous commit"
-msgstr ""
-
-#: builtin/commit.c:1667
-msgid "bypass post-rewrite hook"
-msgstr ""
-
-#: builtin/commit.c:1674
-msgid "ok to record an empty change"
-msgstr ""
-
-#: builtin/commit.c:1676
-msgid "ok to record a change with an empty message"
-msgstr ""
-
-#: builtin/commit.c:1752
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
-
-#: builtin/commit.c:1759
-msgid "could not read MERGE_MODE"
-msgstr ""
-
-#: builtin/commit.c:1780
-#, c-format
-msgid "could not read commit message: %s"
-msgstr ""
-
-#: builtin/commit.c:1787
-#, c-format
-msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
-
-#: builtin/commit.c:1792
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
-
-#: builtin/commit.c:1803
-#, c-format
-msgid "Aborting commit due to empty commit message body.\n"
-msgstr ""
-
-#: builtin/commit.c:1839
-msgid ""
-"repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full and quota is\n"
-"not exceeded, and then \"git restore --staged :/\" to recover."
-msgstr ""
-
-#: builtin/config.c:11
-msgid "git config [<options>]"
-msgstr ""
-
-#: builtin/config.c:109 builtin/env--helper.c:27
-#, c-format
-msgid "unrecognized --type argument, %s"
-msgstr ""
-
-#: builtin/config.c:121
-msgid "only one type at a time"
-msgstr ""
-
-#: builtin/config.c:130
-msgid "Config file location"
-msgstr ""
-
-#: builtin/config.c:131
-msgid "use global config file"
-msgstr ""
-
-#: builtin/config.c:132
-msgid "use system config file"
-msgstr ""
-
-#: builtin/config.c:133
-msgid "use repository config file"
-msgstr ""
-
-#: builtin/config.c:134
-msgid "use per-worktree config file"
-msgstr ""
-
-#: builtin/config.c:135
-msgid "use given config file"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "blob-id"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "read config from given blob object"
-msgstr ""
-
-#: builtin/config.c:137
-msgid "Action"
-msgstr ""
-
-#: builtin/config.c:138
-msgid "get value: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:139
-msgid "get all values: key [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:140
-msgid "get values for regexp: name-regex [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:141
-msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
-
-#: builtin/config.c:142
-msgid "replace all matching variables: name value [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:143
-msgid "add a new variable: name value"
-msgstr ""
-
-#: builtin/config.c:144
-msgid "remove a variable: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:145
-msgid "remove all matches: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:146
-msgid "rename section: old-name new-name"
-msgstr ""
-
-#: builtin/config.c:147
-msgid "remove a section: name"
-msgstr ""
-
-#: builtin/config.c:148
-msgid "list all"
-msgstr ""
-
-#: builtin/config.c:149
-msgid "use string equality when comparing values to 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:150
-msgid "open an editor"
-msgstr ""
-
-#: builtin/config.c:151
-msgid "find the color configured: slot [default]"
-msgstr ""
-
-#: builtin/config.c:152
-msgid "find the color setting: slot [stdout-is-tty]"
-msgstr ""
-
-#: builtin/config.c:153
-msgid "Type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:42 builtin/hash-object.c:97
-msgid "type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:43
-msgid "value is given this type"
-msgstr ""
-
-#: builtin/config.c:155
-msgid "value is \"true\" or \"false\""
-msgstr ""
-
-#: builtin/config.c:156
-msgid "value is decimal number"
-msgstr ""
-
-#: builtin/config.c:157
-msgid "value is --bool or --int"
-msgstr ""
-
-#: builtin/config.c:158
-msgid "value is --bool or string"
-msgstr ""
-
-#: builtin/config.c:159
-msgid "value is a path (file or directory name)"
-msgstr ""
-
-#: builtin/config.c:160
-msgid "value is an expiry date"
-msgstr ""
-
-#: builtin/config.c:161
-msgid "Other"
-msgstr ""
-
-#: builtin/config.c:162
-msgid "terminate values with NUL byte"
-msgstr ""
-
-#: builtin/config.c:163
-msgid "show variable names only"
-msgstr ""
-
-#: builtin/config.c:164
-msgid "respect include directives on lookup"
-msgstr ""
-
-#: builtin/config.c:165
-msgid "show origin of config (file, standard input, blob, command line)"
-msgstr ""
-
-#: builtin/config.c:166
-msgid "show scope of config (worktree, local, global, system, command)"
-msgstr ""
-
-#: builtin/config.c:167 builtin/env--helper.c:45
-msgid "value"
-msgstr ""
-
-#: builtin/config.c:167
-msgid "with --get, use default value when missing entry"
-msgstr ""
-
-#: builtin/config.c:181
-#, c-format
-msgid "wrong number of arguments, should be %d"
-msgstr ""
-
-#: builtin/config.c:183
-#, c-format
-msgid "wrong number of arguments, should be from %d to %d"
-msgstr ""
-
-#: builtin/config.c:339
-#, c-format
-msgid "invalid key pattern: %s"
-msgstr ""
-
-#: builtin/config.c:377
-#, c-format
-msgid "failed to format default config value: %s"
-msgstr ""
-
-#: builtin/config.c:441
-#, c-format
-msgid "cannot parse color '%s'"
-msgstr ""
-
-#: builtin/config.c:483
-msgid "unable to parse default color value"
-msgstr ""
-
-#: builtin/config.c:536 builtin/config.c:833
-msgid "not in a git directory"
-msgstr ""
-
-#: builtin/config.c:539
-msgid "writing to stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:542
-msgid "writing config blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:627
-#, c-format
-msgid ""
-"# This is Git's per-user configuration file.\n"
-"[user]\n"
-"# Please adapt and uncomment the following lines:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
-msgstr ""
-
-#: builtin/config.c:652
-msgid "only one config file at a time"
-msgstr ""
-
-#: builtin/config.c:658
-msgid "--local can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:660
-msgid "--blob can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:662
-msgid "--worktree can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:684
-msgid "$HOME not set"
-msgstr ""
-
-#: builtin/config.c:708
-msgid ""
-"--worktree cannot be used with multiple working trees unless the config\n"
-"extension worktreeConfig is enabled. Please read \"CONFIGURATION FILE\"\n"
-"section in \"git help worktree\" for details"
-msgstr ""
-
-#: builtin/config.c:743
-msgid "--get-color and variable type are incoherent"
-msgstr ""
-
-#: builtin/config.c:748
-msgid "only one action at a time"
-msgstr ""
-
-#: builtin/config.c:761
-msgid "--name-only is only applicable to --list or --get-regexp"
-msgstr ""
-
-#: builtin/config.c:767
-msgid ""
-"--show-origin is only applicable to --get, --get-all, --get-regexp, and --"
-"list"
-msgstr ""
-
-#: builtin/config.c:773
-msgid "--default is only applicable to --get"
-msgstr ""
-
-#: builtin/config.c:806
-msgid "--fixed-value only applies with 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:822
-#, c-format
-msgid "unable to read config file '%s'"
-msgstr ""
-
-#: builtin/config.c:825
-msgid "error processing config file(s)"
-msgstr ""
-
-#: builtin/config.c:835
-msgid "editing stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:837
-msgid "editing blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:851
-#, c-format
-msgid "cannot create configuration file %s"
-msgstr ""
-
-#: builtin/config.c:864
-#, c-format
-msgid ""
-"cannot overwrite multiple values with a single value\n"
-"       Use a regexp, --add or --replace-all to change %s."
-msgstr ""
-
-#: builtin/config.c:943 builtin/config.c:954
-#, c-format
-msgid "no such section: %s"
-msgstr ""
-
-#: builtin/count-objects.c:100
-msgid "print sizes in human readable format"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:227
-#, c-format
-msgid ""
-"The permissions on your socket directory are too loose; other\n"
-"users may be able to read your cached credentials. Consider running:\n"
-"\n"
-"\tchmod 0700 %s"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:276
-msgid "print debugging messages to stderr"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:316
-msgid "credential-cache--daemon unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-cache.c:180
-msgid "credential-cache unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-store.c:66
-#, c-format
-msgid "unable to get credential storage lock in %d ms"
-msgstr ""
-
-#: builtin/describe.c:26
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr ""
-
-#: builtin/describe.c:27
-msgid "git describe [<options>] --dirty"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "head"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "lightweight"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "annotated"
-msgstr ""
-
-#: builtin/describe.c:277
-#, c-format
-msgid "annotated tag %s not available"
-msgstr ""
-
-#: builtin/describe.c:281
-#, c-format
-msgid "tag '%s' is externally known as '%s'"
-msgstr ""
-
-#: builtin/describe.c:328
-#, c-format
-msgid "no tag exactly matches '%s'"
-msgstr ""
-
-#: builtin/describe.c:330
-#, c-format
-msgid "No exact match on refs or tags, searching to describe\n"
-msgstr ""
-
-#: builtin/describe.c:397
-#, c-format
-msgid "finished search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:424
-#, c-format
-msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
-msgstr ""
-
-#: builtin/describe.c:428
-#, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
-msgstr ""
-
-#: builtin/describe.c:458
-#, c-format
-msgid "traversed %lu commits\n"
-msgstr ""
-
-#: builtin/describe.c:461
-#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:529
-#, c-format
-msgid "describe %s\n"
-msgstr ""
-
-#: builtin/describe.c:532
-#, c-format
-msgid "Not a valid object name %s"
-msgstr ""
-
-#: builtin/describe.c:540
-#, c-format
-msgid "%s is neither a commit nor blob"
-msgstr ""
-
-#: builtin/describe.c:554
-msgid "find the tag that comes after the commit"
-msgstr ""
-
-#: builtin/describe.c:555
-msgid "debug search strategy on stderr"
-msgstr ""
-
-#: builtin/describe.c:556
-msgid "use any ref"
-msgstr ""
-
-#: builtin/describe.c:557
-msgid "use any tag, even unannotated"
-msgstr ""
-
-#: builtin/describe.c:558
-msgid "always use long format"
-msgstr ""
-
-#: builtin/describe.c:559
-msgid "only follow first parent"
-msgstr ""
-
-#: builtin/describe.c:562
-msgid "only output exact matches"
-msgstr ""
-
-#: builtin/describe.c:564
-msgid "consider <n> most recent tags (default: 10)"
-msgstr ""
-
-#: builtin/describe.c:566
-msgid "only consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:568
-msgid "do not consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:570 builtin/name-rev.c:595
-msgid "show abbreviated commit object as fallback"
-msgstr ""
-
-#: builtin/describe.c:571 builtin/describe.c:574
-msgid "mark"
-msgstr ""
-
-#: builtin/describe.c:572
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr ""
-
-#: builtin/describe.c:575
-msgid "append <mark> on broken working tree (default: \"-broken\")"
-msgstr ""
-
-#: builtin/describe.c:622
-msgid "No names found, cannot describe anything."
-msgstr ""
-
-#: builtin/describe.c:673 builtin/describe.c:675
-#, c-format
-msgid "option '%s' and commit-ishes cannot be used together"
-msgstr ""
-
-#: builtin/diff-tree.c:157
-msgid "--merge-base only works with two commits"
-msgstr ""
-
-#: builtin/diff.c:92
-#, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr ""
-
-#: builtin/diff.c:259
-#, c-format
-msgid "invalid option: %s"
-msgstr ""
-
-#: builtin/diff.c:376
-#, c-format
-msgid "%s...%s: no merge base"
-msgstr ""
-
-#: builtin/diff.c:491
-msgid "Not a git repository"
-msgstr ""
-
-#: builtin/diff.c:537 builtin/grep.c:700
-#, c-format
-msgid "invalid object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:548
-#, c-format
-msgid "more than two blobs given: '%s'"
-msgstr ""
-
-#: builtin/diff.c:553
-#, c-format
-msgid "unhandled object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:587
-#, c-format
-msgid "%s...%s: multiple merge bases, using %s"
-msgstr ""
-
-#: builtin/difftool.c:31
-msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
-msgstr ""
-
-#: builtin/difftool.c:287
-#, c-format
-msgid "could not read symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:289
-#, c-format
-msgid "could not read symlink file %s"
-msgstr ""
-
-#: builtin/difftool.c:297
-#, c-format
-msgid "could not read object %s for symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:421
-msgid ""
-"combined diff formats ('-c' and '--cc') are not supported in\n"
-"directory diff mode ('-d' and '--dir-diff')."
-msgstr ""
-
-#: builtin/difftool.c:626
-#, c-format
-msgid "both files modified: '%s' and '%s'."
-msgstr ""
-
-#: builtin/difftool.c:628
-msgid "working tree file has been left."
-msgstr ""
-
-#: builtin/difftool.c:639
-#, c-format
-msgid "temporary files exist in '%s'."
-msgstr ""
-
-#: builtin/difftool.c:640
-msgid "you may want to cleanup or recover these."
-msgstr ""
-
-#: builtin/difftool.c:645
-#, c-format
-msgid "failed: %d"
-msgstr ""
-
-#: builtin/difftool.c:690
-msgid "use `diff.guitool` instead of `diff.tool`"
-msgstr ""
-
-#: builtin/difftool.c:692
-msgid "perform a full-directory diff"
-msgstr ""
-
-#: builtin/difftool.c:694
-msgid "do not prompt before launching a diff tool"
-msgstr ""
-
-#: builtin/difftool.c:699
-msgid "use symlinks in dir-diff mode"
-msgstr ""
-
-#: builtin/difftool.c:700
-msgid "tool"
-msgstr ""
-
-#: builtin/difftool.c:701
-msgid "use the specified diff tool"
-msgstr ""
-
-#: builtin/difftool.c:703
-msgid "print a list of diff tools that may be used with `--tool`"
-msgstr ""
-
-#: builtin/difftool.c:706
-msgid ""
-"make 'git-difftool' exit when an invoked diff tool returns a non-zero exit "
-"code"
-msgstr ""
-
-#: builtin/difftool.c:709
-msgid "specify a custom command for viewing diffs"
-msgstr ""
-
-#: builtin/difftool.c:710
-msgid "passed to `diff`"
-msgstr ""
-
-#: builtin/difftool.c:726
-msgid "difftool requires worktree or --no-index"
-msgstr ""
-
-#: builtin/difftool.c:745
-msgid "no <tool> given for --tool=<tool>"
-msgstr ""
-
-#: builtin/difftool.c:752
-msgid "no <cmd> given for --extcmd=<cmd>"
-msgstr ""
-
-#: builtin/env--helper.c:6
-msgid "git env--helper --type=[bool|ulong] <options> <env-var>"
-msgstr ""
-
-#: builtin/env--helper.c:46
-msgid "default for git_env_*(...) to fall back on"
-msgstr ""
-
-#: builtin/env--helper.c:48
-msgid "be quiet only use git_env_*() value as exit code"
-msgstr ""
-
-#: builtin/env--helper.c:67
-#, c-format
-msgid "option `--default' expects a boolean value with `--type=bool`, not `%s`"
-msgstr ""
-
-#: builtin/env--helper.c:82
-#, c-format
-msgid ""
-"option `--default' expects an unsigned long value with `--type=ulong`, not `"
-"%s`"
-msgstr ""
-
-#: builtin/fast-export.c:29
-msgid "git fast-export [<rev-list-opts>]"
-msgstr ""
-
-#: builtin/fast-export.c:843
-msgid "Error: Cannot export nested tags unless --mark-tags is specified."
-msgstr ""
-
-#: builtin/fast-export.c:1152
-msgid "--anonymize-map token cannot be empty"
-msgstr ""
-
-#: builtin/fast-export.c:1171
-msgid "show progress after <n> objects"
-msgstr ""
-
-#: builtin/fast-export.c:1173
-msgid "select handling of signed tags"
-msgstr ""
-
-#: builtin/fast-export.c:1176
-msgid "select handling of tags that tag filtered objects"
-msgstr ""
-
-#: builtin/fast-export.c:1179
-msgid "select handling of commit messages in an alternate encoding"
-msgstr ""
-
-#: builtin/fast-export.c:1182
-msgid "dump marks to this file"
-msgstr ""
-
-#: builtin/fast-export.c:1184
-msgid "import marks from this file"
-msgstr ""
-
-#: builtin/fast-export.c:1188
-msgid "import marks from this file if it exists"
-msgstr ""
-
-#: builtin/fast-export.c:1190
-msgid "fake a tagger when tags lack one"
-msgstr ""
-
-#: builtin/fast-export.c:1192
-msgid "output full tree for each commit"
-msgstr ""
-
-#: builtin/fast-export.c:1194
-msgid "use the done feature to terminate the stream"
-msgstr ""
-
-#: builtin/fast-export.c:1195
-msgid "skip output of blob data"
-msgstr ""
-
-#: builtin/fast-export.c:1196 builtin/log.c:1860
-msgid "refspec"
-msgstr ""
-
-#: builtin/fast-export.c:1197
-msgid "apply refspec to exported refs"
-msgstr ""
-
-#: builtin/fast-export.c:1198
-msgid "anonymize output"
-msgstr ""
-
-#: builtin/fast-export.c:1199
-msgid "from:to"
-msgstr ""
-
-#: builtin/fast-export.c:1200
-msgid "convert <from> to <to> in anonymized output"
-msgstr ""
-
-#: builtin/fast-export.c:1203
-msgid "reference parents which are not in fast-export stream by object id"
-msgstr ""
-
-#: builtin/fast-export.c:1205
-msgid "show original object ids of blobs/commits"
-msgstr ""
-
-#: builtin/fast-export.c:1207
-msgid "label tags with mark ids"
-msgstr ""
-
-#: builtin/fast-import.c:3097
-#, c-format
-msgid "Missing from marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3099
-#, c-format
-msgid "Missing to marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3234
-#, c-format
-msgid "Expected 'mark' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3239
-#, c-format
-msgid "Expected 'to' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3331
-msgid "Expected format name:filename for submodule rewrite option"
-msgstr ""
-
-#: builtin/fast-import.c:3386
-#, c-format
-msgid "feature '%s' forbidden in input without --allow-unsafe-features"
-msgstr ""
-
-#: builtin/fetch-pack.c:246
-#, c-format
-msgid "Lockfile created but not reported: %s"
-msgstr ""
-
-#: builtin/fetch.c:36
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/fetch.c:37
-msgid "git fetch [<options>] <group>"
-msgstr ""
-
-#: builtin/fetch.c:38
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
-
-#: builtin/fetch.c:39
-msgid "git fetch --all [<options>]"
-msgstr ""
-
-#: builtin/fetch.c:124
-msgid "fetch.parallel cannot be negative"
-msgstr ""
-
-#: builtin/fetch.c:147 builtin/pull.c:189
-msgid "fetch from all remotes"
-msgstr ""
-
-#: builtin/fetch.c:149 builtin/pull.c:249
-msgid "set upstream for git pull/fetch"
-msgstr ""
-
-#: builtin/fetch.c:151 builtin/pull.c:192
-msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
-
-#: builtin/fetch.c:153
-msgid "use atomic transaction to update references"
-msgstr ""
-
-#: builtin/fetch.c:155 builtin/pull.c:195
-msgid "path to upload pack on remote end"
-msgstr ""
-
-#: builtin/fetch.c:156
-msgid "force overwrite of local reference"
-msgstr ""
-
-#: builtin/fetch.c:158
-msgid "fetch from multiple remotes"
-msgstr ""
-
-#: builtin/fetch.c:160 builtin/pull.c:199
-msgid "fetch all tags and associated objects"
-msgstr ""
-
-#: builtin/fetch.c:162
-msgid "do not fetch all tags (--no-tags)"
-msgstr ""
-
-#: builtin/fetch.c:164
-msgid "number of submodules fetched in parallel"
-msgstr ""
-
-#: builtin/fetch.c:166
-msgid "modify the refspec to place all refs within refs/prefetch/"
-msgstr ""
-
-#: builtin/fetch.c:168 builtin/pull.c:202
-msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
-
-#: builtin/fetch.c:170
-msgid "prune local tags no longer on remote and clobber changed tags"
-msgstr ""
-
-#: builtin/fetch.c:171 builtin/fetch.c:199 builtin/pull.c:123
-msgid "on-demand"
-msgstr ""
-
-#: builtin/fetch.c:172
-msgid "control recursive fetching of submodules"
-msgstr ""
-
-#: builtin/fetch.c:177
-msgid "write fetched references to the FETCH_HEAD file"
-msgstr ""
-
-#: builtin/fetch.c:178 builtin/pull.c:210
-msgid "keep downloaded pack"
-msgstr ""
-
-#: builtin/fetch.c:180
-msgid "allow updating of HEAD ref"
-msgstr ""
-
-#: builtin/fetch.c:183 builtin/fetch.c:189 builtin/pull.c:213
-#: builtin/pull.c:222
-msgid "deepen history of shallow clone"
-msgstr ""
-
-#: builtin/fetch.c:185 builtin/pull.c:216
-msgid "deepen history of shallow repository based on time"
-msgstr ""
-
-#: builtin/fetch.c:191 builtin/pull.c:225
-msgid "convert to a complete repository"
-msgstr ""
-
-#: builtin/fetch.c:194
-msgid "re-fetch without negotiating common commits"
-msgstr ""
-
-#: builtin/fetch.c:197
-msgid "prepend this to submodule path output"
-msgstr ""
-
-#: builtin/fetch.c:200
-msgid ""
-"default for recursive fetching of submodules (lower priority than config "
-"files)"
-msgstr ""
-
-#: builtin/fetch.c:204 builtin/pull.c:228
-msgid "accept refs that update .git/shallow"
-msgstr ""
-
-#: builtin/fetch.c:205 builtin/pull.c:230
-msgid "refmap"
-msgstr ""
-
-#: builtin/fetch.c:206 builtin/pull.c:231
-msgid "specify fetch refmap"
-msgstr ""
-
-#: builtin/fetch.c:213 builtin/pull.c:244
-msgid "report that we have only objects reachable from this object"
-msgstr ""
-
-#: builtin/fetch.c:215
-msgid "do not fetch a packfile; instead, print ancestors of negotiation tips"
-msgstr ""
-
-#: builtin/fetch.c:218 builtin/fetch.c:220
-msgid "run 'maintenance --auto' after fetching"
-msgstr ""
-
-#: builtin/fetch.c:222 builtin/pull.c:247
-msgid "check for forced-updates on all updated branches"
-msgstr ""
-
-#: builtin/fetch.c:224
-msgid "write the commit-graph after fetching"
-msgstr ""
-
-#: builtin/fetch.c:226
-msgid "accept refspecs from stdin"
-msgstr ""
-
-#: builtin/fetch.c:618
-msgid "couldn't find remote ref HEAD"
-msgstr ""
-
-#: builtin/fetch.c:893
-#, c-format
-msgid "object %s not found"
-msgstr ""
-
-#: builtin/fetch.c:897
-msgid "[up to date]"
-msgstr ""
-
-#: builtin/fetch.c:909 builtin/fetch.c:927 builtin/fetch.c:999
-msgid "[rejected]"
-msgstr ""
-
-#: builtin/fetch.c:911
-msgid "can't fetch in current branch"
-msgstr ""
-
-#: builtin/fetch.c:912
-msgid "checked out in another worktree"
-msgstr ""
-
-#: builtin/fetch.c:922
-msgid "[tag update]"
-msgstr ""
-
-#: builtin/fetch.c:923 builtin/fetch.c:960 builtin/fetch.c:982
-#: builtin/fetch.c:994
-msgid "unable to update local ref"
-msgstr ""
-
-#: builtin/fetch.c:927
-msgid "would clobber existing tag"
-msgstr ""
-
-#: builtin/fetch.c:949
-msgid "[new tag]"
-msgstr ""
-
-#: builtin/fetch.c:952
-msgid "[new branch]"
-msgstr ""
-
-#: builtin/fetch.c:955
-msgid "[new ref]"
-msgstr ""
-
-#: builtin/fetch.c:994
-msgid "forced update"
-msgstr ""
-
-#: builtin/fetch.c:999
-msgid "non-fast-forward"
-msgstr ""
-
-#: builtin/fetch.c:1102
-msgid ""
-"fetch normally indicates which branches had a forced update,\n"
-"but that check has been disabled; to re-enable, use '--show-forced-updates'\n"
-"flag or run 'git config fetch.showForcedUpdates true'"
-msgstr ""
-
-#: builtin/fetch.c:1106
-#, c-format
-msgid ""
-"it took %.2f seconds to check forced updates; you can use\n"
-"'--no-show-forced-updates' or run 'git config fetch.showForcedUpdates "
-"false'\n"
-"to avoid this check\n"
-msgstr ""
-
-#: builtin/fetch.c:1136
-#, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr ""
-
-#: builtin/fetch.c:1156
-#, c-format
-msgid "rejected %s because shallow roots are not allowed to be updated"
-msgstr ""
-
-#: builtin/fetch.c:1259 builtin/fetch.c:1418
-#, c-format
-msgid "From %.*s\n"
-msgstr ""
-
-#: builtin/fetch.c:1269
-#, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
-msgstr ""
-
-#: builtin/fetch.c:1377
-#, c-format
-msgid "   (%s will become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1378
-#, c-format
-msgid "   (%s has become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1421
-msgid "[deleted]"
-msgstr ""
-
-#: builtin/fetch.c:1422 builtin/remote.c:1153
-msgid "(none)"
-msgstr ""
-
-#: builtin/fetch.c:1446
-#, c-format
-msgid "refusing to fetch into branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/fetch.c:1466
-#, c-format
-msgid "option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
-
-#: builtin/fetch.c:1469
-#, c-format
-msgid "option \"%s\" is ignored for %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1496
-#, c-format
-msgid "the object %s does not exist"
-msgstr ""
-
-#: builtin/fetch.c:1748
-msgid "multiple branches detected, incompatible with --set-upstream"
-msgstr ""
-
-#: builtin/fetch.c:1760
-#, c-format
-msgid ""
-"could not set upstream of HEAD to '%s' from '%s' when it does not point to "
-"any branch."
-msgstr ""
-
-#: builtin/fetch.c:1773
-msgid "not setting upstream for a remote remote-tracking branch"
-msgstr ""
-
-#: builtin/fetch.c:1775
-msgid "not setting upstream for a remote tag"
-msgstr ""
-
-#: builtin/fetch.c:1777
-msgid "unknown branch type"
-msgstr ""
-
-#: builtin/fetch.c:1779
-msgid ""
-"no source branch found;\n"
-"you need to specify exactly one branch with the --set-upstream option"
-msgstr ""
-
-#: builtin/fetch.c:1904 builtin/fetch.c:1967
-#, c-format
-msgid "Fetching %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1914 builtin/fetch.c:1969
-#, c-format
-msgid "could not fetch %s"
-msgstr ""
-
-#: builtin/fetch.c:1926
-#, c-format
-msgid "could not fetch '%s' (exit code: %d)\n"
-msgstr ""
-
-#: builtin/fetch.c:2030
-msgid ""
-"no remote repository specified; please specify either a URL or a\n"
-"remote name from which new revisions should be fetched"
-msgstr ""
-
-#: builtin/fetch.c:2066
-msgid "you need to specify a tag name"
-msgstr ""
-
-#: builtin/fetch.c:2156
-msgid "--negotiate-only needs one or more --negotiation-tip=*"
-msgstr ""
-
-#: builtin/fetch.c:2160
-msgid "negative depth in --deepen is not supported"
-msgstr ""
-
-#: builtin/fetch.c:2169
-msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2186
-msgid "fetch --all does not take a repository argument"
-msgstr ""
-
-#: builtin/fetch.c:2188
-msgid "fetch --all does not make sense with refspecs"
-msgstr ""
-
-#: builtin/fetch.c:2197
-#, c-format
-msgid "no such remote or remote group: %s"
-msgstr ""
-
-#: builtin/fetch.c:2205
-msgid "fetching a group and specifying refspecs does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2221
-msgid "must supply remote when using --negotiate-only"
-msgstr ""
-
-#: builtin/fetch.c:2226
-msgid "protocol does not support --negotiate-only, exiting"
-msgstr ""
-
-#: builtin/fetch.c:2246
-msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
-msgstr ""
-
-#: builtin/fetch.c:2250
-msgid "--atomic can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fetch.c:2254
-msgid "--stdin can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:7
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:19
-msgid "populate log with at most <n> entries from shortlog"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:22
-msgid "alias for --log (deprecated)"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:25
-msgid "text"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:26
-msgid "use <text> as start of message"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:28
-msgid "use <name> instead of the real target branch"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:29
-msgid "file to read from"
-msgstr ""
-
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [--points-at <object>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:13
-msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for shells"
-msgstr ""
-
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for perl"
-msgstr ""
-
-#: builtin/for-each-ref.c:35
-msgid "quote placeholders suitably for python"
-msgstr ""
-
-#: builtin/for-each-ref.c:37
-msgid "quote placeholders suitably for Tcl"
-msgstr ""
-
-#: builtin/for-each-ref.c:40
-msgid "show only <n> matched refs"
-msgstr ""
-
-#: builtin/for-each-ref.c:42 builtin/tag.c:482
-msgid "respect format colors"
-msgstr ""
-
-#: builtin/for-each-ref.c:45
-msgid "print only refs which points at the given object"
-msgstr ""
-
-#: builtin/for-each-ref.c:47
-msgid "print only refs that are merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:48
-msgid "print only refs that are not merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:49
-msgid "print only refs which contain the commit"
-msgstr ""
-
-#: builtin/for-each-ref.c:50
-msgid "print only refs which don't contain the commit"
-msgstr ""
-
-#: builtin/for-each-repo.c:9
-msgid "git for-each-repo --config=<config> <command-args>"
-msgstr ""
-
-#: builtin/for-each-repo.c:34
-msgid "config"
-msgstr ""
-
-#: builtin/for-each-repo.c:35
-msgid "config key storing a list of repository paths"
-msgstr ""
-
-#: builtin/for-each-repo.c:43
-msgid "missing --config=<config>"
-msgstr ""
-
-#: builtin/fsck.c:69 builtin/fsck.c:128 builtin/fsck.c:129
-msgid "unknown"
-msgstr ""
-
-#. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:78 builtin/fsck.c:100
-#, c-format
-msgid "error in %s %s: %s"
-msgstr ""
-
-#. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:94
-#, c-format
-msgid "warning in %s %s: %s"
-msgstr ""
-
-#: builtin/fsck.c:124 builtin/fsck.c:127
-#, c-format
-msgid "broken link from %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:136
-msgid "wrong object type in link"
-msgstr ""
-
-#: builtin/fsck.c:152
-#, c-format
-msgid ""
-"broken link from %7s %s\n"
-"              to %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:264
-#, c-format
-msgid "missing %s %s"
-msgstr ""
-
-#: builtin/fsck.c:291
-#, c-format
-msgid "unreachable %s %s"
-msgstr ""
-
-#: builtin/fsck.c:311
-#, c-format
-msgid "dangling %s %s"
-msgstr ""
-
-#: builtin/fsck.c:321
-msgid "could not create lost-found"
-msgstr ""
-
-#: builtin/fsck.c:332
-#, c-format
-msgid "could not finish '%s'"
-msgstr ""
-
-#: builtin/fsck.c:349
-#, c-format
-msgid "Checking %s"
-msgstr ""
-
-#: builtin/fsck.c:387
-#, c-format
-msgid "Checking connectivity (%d objects)"
-msgstr ""
-
-#: builtin/fsck.c:406
-#, c-format
-msgid "Checking %s %s"
-msgstr ""
-
-#: builtin/fsck.c:411
-msgid "broken links"
-msgstr ""
-
-#: builtin/fsck.c:420
-#, c-format
-msgid "root %s"
-msgstr ""
-
-#: builtin/fsck.c:428
-#, c-format
-msgid "tagged %s %s (%s) in %s"
-msgstr ""
-
-#: builtin/fsck.c:457
-#, c-format
-msgid "%s: object corrupt or missing"
-msgstr ""
-
-#: builtin/fsck.c:482
-#, c-format
-msgid "%s: invalid reflog entry %s"
-msgstr ""
-
-#: builtin/fsck.c:496
-#, c-format
-msgid "Checking reflog %s->%s"
-msgstr ""
-
-#: builtin/fsck.c:530
-#, c-format
-msgid "%s: invalid sha1 pointer %s"
-msgstr ""
-
-#: builtin/fsck.c:537
-#, c-format
-msgid "%s: not a commit"
-msgstr ""
-
-#: builtin/fsck.c:591
-msgid "notice: No default references"
-msgstr ""
-
-#: builtin/fsck.c:621
-#, c-format
-msgid "%s: hash-path mismatch, found at: %s"
-msgstr ""
-
-#: builtin/fsck.c:624
-#, c-format
-msgid "%s: object corrupt or missing: %s"
-msgstr ""
-
-#: builtin/fsck.c:628
-#, c-format
-msgid "%s: object is of unknown type '%s': %s"
-msgstr ""
-
-#: builtin/fsck.c:645
-#, c-format
-msgid "%s: object could not be parsed: %s"
-msgstr ""
-
-#: builtin/fsck.c:665
-#, c-format
-msgid "bad sha1 file: %s"
-msgstr ""
-
-#: builtin/fsck.c:686
-msgid "Checking object directory"
-msgstr ""
-
-#: builtin/fsck.c:689
-msgid "Checking object directories"
-msgstr ""
-
-#: builtin/fsck.c:705
-#, c-format
-msgid "Checking %s link"
-msgstr ""
-
-#: builtin/fsck.c:710 builtin/index-pack.c:862
-#, c-format
-msgid "invalid %s"
-msgstr ""
-
-#: builtin/fsck.c:717
-#, c-format
-msgid "%s points to something strange (%s)"
-msgstr ""
-
-#: builtin/fsck.c:723
-#, c-format
-msgid "%s: detached HEAD points at nothing"
-msgstr ""
-
-#: builtin/fsck.c:727
-#, c-format
-msgid "notice: %s points to an unborn branch (%s)"
-msgstr ""
-
-#: builtin/fsck.c:739
-msgid "Checking cache tree"
-msgstr ""
-
-#: builtin/fsck.c:744
-#, c-format
-msgid "%s: invalid sha1 pointer in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:753
-msgid "non-tree in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:784
-msgid "git fsck [<options>] [<object>...]"
-msgstr ""
-
-#: builtin/fsck.c:790
-msgid "show unreachable objects"
-msgstr ""
-
-#: builtin/fsck.c:791
-msgid "show dangling objects"
-msgstr ""
-
-#: builtin/fsck.c:792
-msgid "report tags"
-msgstr ""
-
-#: builtin/fsck.c:793
-msgid "report root nodes"
-msgstr ""
-
-#: builtin/fsck.c:794
-msgid "make index objects head nodes"
-msgstr ""
-
-#: builtin/fsck.c:795
-msgid "make reflogs head nodes (default)"
-msgstr ""
-
-#: builtin/fsck.c:796
-msgid "also consider packs and alternate objects"
-msgstr ""
-
-#: builtin/fsck.c:797
-msgid "check only connectivity"
-msgstr ""
-
-#: builtin/fsck.c:798 builtin/mktag.c:75
-msgid "enable more strict checking"
-msgstr ""
-
-#: builtin/fsck.c:800
-msgid "write dangling objects in .git/lost-found"
-msgstr ""
-
-#: builtin/fsck.c:801 builtin/prune.c:146
-msgid "show progress"
-msgstr ""
-
-#: builtin/fsck.c:802
-msgid "show verbose names for reachable objects"
-msgstr ""
-
-#: builtin/fsck.c:862 builtin/index-pack.c:261
-msgid "Checking objects"
-msgstr ""
-
-#: builtin/fsck.c:890
-#, c-format
-msgid "%s: object missing"
-msgstr ""
-
-#: builtin/fsck.c:901
-#, c-format
-msgid "invalid parameter: expected sha1, got '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:13
-msgid "git fsmonitor--daemon start [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:14
-msgid "git fsmonitor--daemon run [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:15
-msgid "git fsmonitor--daemon stop"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:16
-msgid "git fsmonitor--daemon status"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:38 builtin/fsmonitor--daemon.c:47
-#, c-format
-msgid "value of '%s' out of range: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:57
-#, c-format
-msgid "value of '%s' not bool or int: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:99
-#, c-format
-msgid "fsmonitor-daemon is watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:104
-#, c-format
-msgid "fsmonitor-daemon is not watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:170
-#, c-format
-msgid "could not create fsmonitor cookie '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:753
-#, c-format
-msgid "fsmonitor: cookie_result '%d' != SEEN"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1187
-#, c-format
-msgid "could not start IPC thread pool on '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1199
-msgid "could not start fsmonitor listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1297
-msgid "could not initialize listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1328 builtin/fsmonitor--daemon.c:1383
-#, c-format
-msgid "fsmonitor--daemon is already running '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1332
-#, c-format
-msgid "running fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1387
-#, c-format
-msgid "starting fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1413
-msgid "daemon failed to start"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1416
-msgid "daemon not online yet"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1419
-msgid "daemon terminated"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1429
-msgid "detach from console"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1432
-msgid "use <n> ipc worker threads"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1435
-msgid "max seconds to wait for background daemon startup"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1449
-#, c-format
-msgid "invalid 'ipc-threads' value (%d)"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1464
-#, c-format
-msgid "Unhandled subcommand '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1477
-msgid "fsmonitor--daemon not supported on this platform"
-msgstr ""
-
-#: builtin/gc.c:39
-msgid "git gc [<options>]"
-msgstr ""
-
-#: builtin/gc.c:93
-#, c-format
-msgid "Failed to fstat %s: %s"
-msgstr ""
-
-#: builtin/gc.c:129
-#, c-format
-msgid "failed to parse '%s' value '%s'"
-msgstr ""
-
-#: builtin/gc.c:488 builtin/init-db.c:57
-#, c-format
-msgid "cannot stat '%s'"
-msgstr ""
-
-#: builtin/gc.c:504
-#, c-format
-msgid ""
-"The last gc run reported the following. Please correct the root cause\n"
-"and remove %s\n"
-"Automatic cleanup will not be performed until the file is removed.\n"
-"\n"
-"%s"
-msgstr ""
-
-#: builtin/gc.c:552
-msgid "prune unreferenced objects"
-msgstr ""
-
-#: builtin/gc.c:554
-msgid "be more thorough (increased runtime)"
-msgstr ""
-
-#: builtin/gc.c:555
-msgid "enable auto-gc mode"
-msgstr ""
-
-#: builtin/gc.c:558
-msgid "force running gc even if there may be another gc running"
-msgstr ""
-
-#: builtin/gc.c:561
-msgid "repack all other packs except the largest pack"
-msgstr ""
-
-#: builtin/gc.c:577
-#, c-format
-msgid "failed to parse gc.logexpiry value %s"
-msgstr ""
-
-#: builtin/gc.c:588
-#, c-format
-msgid "failed to parse prune expiry value %s"
-msgstr ""
-
-#: builtin/gc.c:608
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:610
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:611
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
-msgstr ""
-
-#: builtin/gc.c:652
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
-msgstr ""
-
-#: builtin/gc.c:707
-msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
-msgstr ""
-
-#: builtin/gc.c:717
-msgid ""
-"git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
-msgstr ""
-
-#: builtin/gc.c:747
-msgid "--no-schedule is not allowed"
-msgstr ""
-
-#: builtin/gc.c:752
-#, c-format
-msgid "unrecognized --schedule argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:870
-msgid "failed to write commit-graph"
-msgstr ""
-
-#: builtin/gc.c:906
-msgid "failed to prefetch remotes"
-msgstr ""
-
-#: builtin/gc.c:1022
-msgid "failed to start 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1039
-msgid "failed to finish 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1090
-msgid "failed to write multi-pack-index"
-msgstr ""
-
-#: builtin/gc.c:1106
-msgid "'git multi-pack-index expire' failed"
-msgstr ""
-
-#: builtin/gc.c:1165
-msgid "'git multi-pack-index repack' failed"
-msgstr ""
-
-#: builtin/gc.c:1174
-msgid ""
-"skipping incremental-repack task because core.multiPackIndex is disabled"
-msgstr ""
-
-#: builtin/gc.c:1278
-#, c-format
-msgid "lock file '%s' exists, skipping maintenance"
-msgstr ""
-
-#: builtin/gc.c:1308
-#, c-format
-msgid "task '%s' failed"
-msgstr ""
-
-#: builtin/gc.c:1390
-#, c-format
-msgid "'%s' is not a valid task"
-msgstr ""
-
-#: builtin/gc.c:1395
-#, c-format
-msgid "task '%s' cannot be selected multiple times"
-msgstr ""
-
-#: builtin/gc.c:1410
-msgid "run tasks based on the state of the repository"
-msgstr ""
-
-#: builtin/gc.c:1411
-msgid "frequency"
-msgstr ""
-
-#: builtin/gc.c:1412
-msgid "run tasks based on frequency"
-msgstr ""
-
-#: builtin/gc.c:1415
-msgid "do not report progress or other information over stderr"
-msgstr ""
-
-#: builtin/gc.c:1416
-msgid "task"
-msgstr ""
-
-#: builtin/gc.c:1417
-msgid "run a specific task"
-msgstr ""
-
-#: builtin/gc.c:1434
-msgid "use at most one of --auto and --schedule=<frequency>"
-msgstr ""
-
-#: builtin/gc.c:1477
-msgid "failed to run 'git config'"
-msgstr ""
-
-#: builtin/gc.c:1629
-#, c-format
-msgid "failed to expand path '%s'"
-msgstr ""
-
-#: builtin/gc.c:1656 builtin/gc.c:1694
-msgid "failed to start launchctl"
-msgstr ""
-
-#: builtin/gc.c:1769 builtin/gc.c:2237
-#, c-format
-msgid "failed to create directories for '%s'"
-msgstr ""
-
-#: builtin/gc.c:1796
-#, c-format
-msgid "failed to bootstrap service %s"
-msgstr ""
-
-#: builtin/gc.c:1889
-msgid "failed to create temp xml file"
-msgstr ""
-
-#: builtin/gc.c:1979
-msgid "failed to start schtasks"
-msgstr ""
-
-#: builtin/gc.c:2063
-msgid "failed to run 'crontab -l'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2080
-msgid "failed to run 'crontab'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2084
-msgid "failed to open stdin of 'crontab'"
-msgstr ""
-
-#: builtin/gc.c:2126
-msgid "'crontab' died"
-msgstr ""
-
-#: builtin/gc.c:2191
-msgid "failed to start systemctl"
-msgstr ""
-
-#: builtin/gc.c:2201
-msgid "failed to run systemctl"
-msgstr ""
-
-#: builtin/gc.c:2210 builtin/gc.c:2215 builtin/worktree.c:63
-#: builtin/worktree.c:1024
-#, c-format
-msgid "failed to delete '%s'"
-msgstr ""
-
-#: builtin/gc.c:2395
-#, c-format
-msgid "unrecognized --scheduler argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:2420
-msgid "neither systemd timers nor crontab are available"
-msgstr ""
-
-#: builtin/gc.c:2435
-#, c-format
-msgid "%s scheduler is not available"
-msgstr ""
-
-#: builtin/gc.c:2449
-msgid "another process is scheduling background maintenance"
-msgstr ""
-
-#: builtin/gc.c:2471
-msgid "git maintenance start [--scheduler=<scheduler>]"
-msgstr ""
-
-#: builtin/gc.c:2480
-msgid "scheduler"
-msgstr ""
-
-#: builtin/gc.c:2481
-msgid "scheduler to trigger git maintenance run"
-msgstr ""
-
-#: builtin/gc.c:2495
-msgid "failed to add repo to global config"
-msgstr ""
-
-#: builtin/gc.c:2504
-msgid "git maintenance <subcommand> [<options>]"
-msgstr ""
-
-#: builtin/gc.c:2523
-#, c-format
-msgid "invalid subcommand: %s"
-msgstr ""
-
-#: builtin/grep.c:32
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
-
-#: builtin/grep.c:241
-#, c-format
-msgid "grep: failed to create thread: %s"
-msgstr ""
-
-#: builtin/grep.c:295
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
-msgstr ""
-
-#. TRANSLATORS: %s is the configuration
-#. variable for tweaking threads, currently
-#. grep.threads
-#.
-#: builtin/grep.c:303 builtin/index-pack.c:1587 builtin/index-pack.c:1791
-#: builtin/pack-objects.c:3150
-#, c-format
-msgid "no threads support, ignoring %s"
-msgstr ""
-
-#: builtin/grep.c:490 builtin/grep.c:619 builtin/grep.c:659
-#, c-format
-msgid "unable to read tree (%s)"
-msgstr ""
-
-#: builtin/grep.c:674
-#, c-format
-msgid "unable to grep from object of type %s"
-msgstr ""
-
-#: builtin/grep.c:754
-#, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr ""
-
-#: builtin/grep.c:852
-msgid "search in index instead of in the work tree"
-msgstr ""
-
-#: builtin/grep.c:854
-msgid "find in contents not managed by git"
-msgstr ""
-
-#: builtin/grep.c:856
-msgid "search in both tracked and untracked files"
-msgstr ""
-
-#: builtin/grep.c:858
-msgid "ignore files specified via '.gitignore'"
-msgstr ""
-
-#: builtin/grep.c:860
-msgid "recursively search in each submodule"
-msgstr ""
-
-#: builtin/grep.c:863
-msgid "show non-matching lines"
-msgstr ""
-
-#: builtin/grep.c:865
-msgid "case insensitive matching"
-msgstr ""
-
-#: builtin/grep.c:867
-msgid "match patterns only at word boundaries"
-msgstr ""
-
-#: builtin/grep.c:869
-msgid "process binary files as text"
-msgstr ""
-
-#: builtin/grep.c:871
-msgid "don't match patterns in binary files"
-msgstr ""
-
-#: builtin/grep.c:874
-msgid "process binary files with textconv filters"
-msgstr ""
-
-#: builtin/grep.c:876
-msgid "search in subdirectories (default)"
-msgstr ""
-
-#: builtin/grep.c:878
-msgid "descend at most <depth> levels"
-msgstr ""
-
-#: builtin/grep.c:882
-msgid "use extended POSIX regular expressions"
-msgstr ""
-
-#: builtin/grep.c:885
-msgid "use basic POSIX regular expressions (default)"
-msgstr ""
-
-#: builtin/grep.c:888
-msgid "interpret patterns as fixed strings"
-msgstr ""
-
-#: builtin/grep.c:891
-msgid "use Perl-compatible regular expressions"
-msgstr ""
-
-#: builtin/grep.c:894
-msgid "show line numbers"
-msgstr ""
-
-#: builtin/grep.c:895
-msgid "show column number of first match"
-msgstr ""
-
-#: builtin/grep.c:896
-msgid "don't show filenames"
-msgstr ""
-
-#: builtin/grep.c:897
-msgid "show filenames"
-msgstr ""
-
-#: builtin/grep.c:899
-msgid "show filenames relative to top directory"
-msgstr ""
-
-#: builtin/grep.c:901
-msgid "show only filenames instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:903
-msgid "synonym for --files-with-matches"
-msgstr ""
-
-#: builtin/grep.c:906
-msgid "show only the names of files without match"
-msgstr ""
-
-#: builtin/grep.c:908
-msgid "print NUL after filenames"
-msgstr ""
-
-#: builtin/grep.c:911
-msgid "show only matching parts of a line"
-msgstr ""
-
-#: builtin/grep.c:913
-msgid "show the number of matches instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:914
-msgid "highlight matches"
-msgstr ""
-
-#: builtin/grep.c:916
-msgid "print empty line between matches from different files"
-msgstr ""
-
-#: builtin/grep.c:918
-msgid "show filename only once above matches from same file"
-msgstr ""
-
-#: builtin/grep.c:921
-msgid "show <n> context lines before and after matches"
-msgstr ""
-
-#: builtin/grep.c:924
-msgid "show <n> context lines before matches"
-msgstr ""
-
-#: builtin/grep.c:926
-msgid "show <n> context lines after matches"
-msgstr ""
-
-#: builtin/grep.c:928
-msgid "use <n> worker threads"
-msgstr ""
-
-#: builtin/grep.c:929
-msgid "shortcut for -C NUM"
-msgstr ""
-
-#: builtin/grep.c:932
-msgid "show a line with the function name before matches"
-msgstr ""
-
-#: builtin/grep.c:934
-msgid "show the surrounding function"
-msgstr ""
-
-#: builtin/grep.c:937
-msgid "read patterns from file"
-msgstr ""
-
-#: builtin/grep.c:939
-msgid "match <pattern>"
-msgstr ""
-
-#: builtin/grep.c:941
-msgid "combine patterns specified with -e"
-msgstr ""
-
-#: builtin/grep.c:953
-msgid "indicate hit with exit status without output"
-msgstr ""
-
-#: builtin/grep.c:955
-msgid "show only matches from files that match all patterns"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "pager"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "show matching files in the pager"
-msgstr ""
-
-#: builtin/grep.c:962
-msgid "allow calling of grep(1) (ignored by this build)"
-msgstr ""
-
-#: builtin/grep.c:1028
-msgid "no pattern given"
-msgstr ""
-
-#: builtin/grep.c:1064
-msgid "--no-index or --untracked cannot be used with revs"
-msgstr ""
-
-#: builtin/grep.c:1072
-#, c-format
-msgid "unable to resolve revision: %s"
-msgstr ""
-
-#: builtin/grep.c:1102
-msgid "--untracked not supported with --recurse-submodules"
-msgstr ""
-
-#: builtin/grep.c:1106
-msgid "invalid option combination, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1109 builtin/pack-objects.c:4084
-msgid "no threads support, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1112 builtin/index-pack.c:1584 builtin/pack-objects.c:3147
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr ""
-
-#: builtin/grep.c:1146
-msgid "--open-files-in-pager only works on the worktree"
-msgstr ""
-
-#: builtin/grep.c:1179
-msgid "--[no-]exclude-standard cannot be used for tracked contents"
-msgstr ""
-
-#: builtin/grep.c:1187
-msgid "both --cached and trees are given"
-msgstr ""
-
-#: builtin/hash-object.c:83
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
-msgstr ""
-
-#: builtin/hash-object.c:97
-msgid "object type"
-msgstr ""
-
-#: builtin/hash-object.c:98
-msgid "write the object into the object database"
-msgstr ""
-
-#: builtin/hash-object.c:100
-msgid "read the object from stdin"
-msgstr ""
-
-#: builtin/hash-object.c:102
-msgid "store file as is without filters"
-msgstr ""
-
-#: builtin/hash-object.c:103
-msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
-msgstr ""
-
-#: builtin/hash-object.c:104
-msgid "process file as it were from this path"
-msgstr ""
-
-#: builtin/help.c:57
-msgid "print all available commands"
-msgstr ""
-
-#: builtin/help.c:60
-msgid "show external commands in --all"
-msgstr ""
-
-#: builtin/help.c:61
-msgid "show aliases in --all"
-msgstr ""
-
-#: builtin/help.c:62
-msgid "exclude guides"
-msgstr ""
-
-#: builtin/help.c:63
-msgid "show man page"
-msgstr ""
-
-#: builtin/help.c:64
-msgid "show manual in web browser"
-msgstr ""
-
-#: builtin/help.c:66
-msgid "show info page"
-msgstr ""
-
-#: builtin/help.c:68
-msgid "print command description"
-msgstr ""
-
-#: builtin/help.c:70
-msgid "print list of useful guides"
-msgstr ""
-
-#: builtin/help.c:72
-msgid "print all configuration variable names"
-msgstr ""
-
-#: builtin/help.c:84
-msgid "git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"
-msgstr ""
-
-#: builtin/help.c:201
-#, c-format
-msgid "unrecognized help format '%s'"
-msgstr ""
-
-#: builtin/help.c:227
-msgid "Failed to start emacsclient."
-msgstr ""
-
-#: builtin/help.c:240
-msgid "Failed to parse emacsclient version."
-msgstr ""
-
-#: builtin/help.c:248
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr ""
-
-#: builtin/help.c:266 builtin/help.c:288 builtin/help.c:298 builtin/help.c:306
-#, c-format
-msgid "failed to exec '%s'"
-msgstr ""
-
-#: builtin/help.c:344
-#, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
-msgstr ""
-
-#: builtin/help.c:356
-#, c-format
-msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
-msgstr ""
-
-#: builtin/help.c:471
-#, c-format
-msgid "'%s': unknown man viewer."
-msgstr ""
-
-#: builtin/help.c:487
-msgid "no man viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:494
-msgid "no info viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:555 builtin/help.c:566 git.c:348
-#, c-format
-msgid "'%s' is aliased to '%s'"
-msgstr ""
-
-#: builtin/help.c:569 git.c:380
-#, c-format
-msgid "bad alias.%s string: %s"
-msgstr ""
-
-#: builtin/help.c:611
-#, c-format
-msgid "the '%s' option doesn't take any non-option arguments"
-msgstr ""
-
-#: builtin/help.c:631
-msgid ""
-"the '--no-[external-commands|aliases]' options can only be used with '--all'"
-msgstr ""
-
-#: builtin/help.c:643 builtin/help.c:671
-#, c-format
-msgid "usage: %s%s"
-msgstr ""
-
-#: builtin/help.c:666
-msgid "'git help config' for more information"
-msgstr ""
-
-#: builtin/hook.c:10
-msgid "git hook run [--ignore-missing] <hook-name> [-- <hook-args>]"
-msgstr ""
-
-#: builtin/hook.c:30
-msgid "silently ignore missing requested <hook-name>"
-msgstr ""
-
-#: builtin/index-pack.c:221
-#, c-format
-msgid "object type mismatch at %s"
-msgstr ""
-
-#: builtin/index-pack.c:241
-#, c-format
-msgid "did not receive expected object %s"
-msgstr ""
-
-#: builtin/index-pack.c:244
-#, c-format
-msgid "object %s: expected type %s, found %s"
-msgstr ""
-
-#: builtin/index-pack.c:294
-#, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:304
-msgid "early EOF"
-msgstr ""
-
-#: builtin/index-pack.c:305
-msgid "read error on input"
-msgstr ""
-
-#: builtin/index-pack.c:317
-msgid "used more bytes than were available"
-msgstr ""
-
-#: builtin/index-pack.c:324 builtin/pack-objects.c:754
-msgid "pack too large for current definition of off_t"
-msgstr ""
-
-#: builtin/index-pack.c:329
-#, c-format
-msgid "pack exceeds maximum allowed size (%s)"
-msgstr ""
-
-#: builtin/index-pack.c:362
-msgid "pack signature mismatch"
-msgstr ""
-
-#: builtin/index-pack.c:364
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr ""
-
-#: builtin/index-pack.c:380
-#, c-format
-msgid "pack has bad object at offset %<PRIuMAX>: %s"
-msgstr ""
-
-#: builtin/index-pack.c:485
-#, c-format
-msgid "inflate returned %d"
-msgstr ""
-
-#: builtin/index-pack.c:534
-msgid "offset value overflow for delta base object"
-msgstr ""
-
-#: builtin/index-pack.c:542
-msgid "delta base offset is out of bound"
-msgstr ""
-
-#: builtin/index-pack.c:550
-#, c-format
-msgid "unknown object type %d"
-msgstr ""
-
-#: builtin/index-pack.c:581
-msgid "cannot pread pack file"
-msgstr ""
-
-#: builtin/index-pack.c:583
-#, c-format
-msgid "premature end of pack file, %<PRIuMAX> byte missing"
-msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:609
-msgid "serious inflate inconsistency"
-msgstr ""
-
-#: builtin/index-pack.c:754 builtin/index-pack.c:760 builtin/index-pack.c:784
-#: builtin/index-pack.c:823 builtin/index-pack.c:832
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
-msgstr ""
-
-#: builtin/index-pack.c:757 builtin/pack-objects.c:290
-#: builtin/pack-objects.c:350 builtin/pack-objects.c:456
-#, c-format
-msgid "unable to read %s"
-msgstr ""
-
-#: builtin/index-pack.c:821
-#, c-format
-msgid "cannot read existing object info %s"
-msgstr ""
-
-#: builtin/index-pack.c:829
-#, c-format
-msgid "cannot read existing object %s"
-msgstr ""
-
-#: builtin/index-pack.c:843
-#, c-format
-msgid "invalid blob object %s"
-msgstr ""
-
-#: builtin/index-pack.c:846 builtin/index-pack.c:865
-msgid "fsck error in packed object"
-msgstr ""
-
-#: builtin/index-pack.c:867
-#, c-format
-msgid "Not all child objects of %s are reachable"
-msgstr ""
-
-#: builtin/index-pack.c:928 builtin/index-pack.c:975
-msgid "failed to apply delta"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Receiving objects"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Indexing objects"
-msgstr ""
-
-#: builtin/index-pack.c:1195
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr ""
-
-#: builtin/index-pack.c:1200
-msgid "cannot fstat packfile"
-msgstr ""
-
-#: builtin/index-pack.c:1203
-msgid "pack has junk at the end"
-msgstr ""
-
-#: builtin/index-pack.c:1215
-msgid "confusion beyond insanity in parse_pack_objects()"
-msgstr ""
-
-#: builtin/index-pack.c:1238
-msgid "Resolving deltas"
-msgstr ""
-
-#: builtin/index-pack.c:1249 builtin/pack-objects.c:2913
-#, c-format
-msgid "unable to create thread: %s"
-msgstr ""
-
-#: builtin/index-pack.c:1282
-msgid "confusion beyond insanity"
-msgstr ""
-
-#: builtin/index-pack.c:1288
-#, c-format
-msgid "completed with %d local object"
-msgid_plural "completed with %d local objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1300
-#, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr ""
-
-#: builtin/index-pack.c:1304
-#, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1328
-#, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr ""
-
-#: builtin/index-pack.c:1423
-#, c-format
-msgid "local object %s is corrupt"
-msgstr ""
-
-#: builtin/index-pack.c:1445
-#, c-format
-msgid "packfile name '%s' does not end with '.%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1469
-#, c-format
-msgid "cannot write %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1477
-#, c-format
-msgid "cannot close written %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1494
-#, c-format
-msgid "unable to rename temporary '*.%s' file to '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1519
-msgid "error while closing pack file"
-msgstr ""
-
-#: builtin/index-pack.c:1578 builtin/pack-objects.c:3158
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr ""
-
-#: builtin/index-pack.c:1648
-#, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1650
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1698
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1705
-#, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1748
-msgid "Cannot come back to cwd"
-msgstr ""
-
-#: builtin/index-pack.c:1802 builtin/index-pack.c:1805
-#: builtin/index-pack.c:1825 builtin/index-pack.c:1829
-#, c-format
-msgid "bad %s"
-msgstr ""
-
-#: builtin/index-pack.c:1835 builtin/init-db.c:379 builtin/init-db.c:614
-#, c-format
-msgid "unknown hash algorithm '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1856
-msgid "--stdin requires a git repository"
-msgstr ""
-
-#: builtin/index-pack.c:1873
-msgid "--verify with no packfile name given"
-msgstr ""
-
-#: builtin/index-pack.c:1939 builtin/unpack-objects.c:584
-msgid "fsck error in pack objects"
-msgstr ""
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr ""
-
-#: builtin/init-db.c:68
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr ""
-
-#: builtin/init-db.c:80
-#, c-format
-msgid "cannot readlink '%s'"
-msgstr ""
-
-#: builtin/init-db.c:82
-#, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr ""
-
-#: builtin/init-db.c:88
-#, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr ""
-
-#: builtin/init-db.c:92
-#, c-format
-msgid "ignoring template %s"
-msgstr ""
-
-#: builtin/init-db.c:123
-#, c-format
-msgid "templates not found in %s"
-msgstr ""
-
-#: builtin/init-db.c:138
-#, c-format
-msgid "not copying templates from '%s': %s"
-msgstr ""
-
-#: builtin/init-db.c:263
-#, c-format
-msgid "invalid initial branch name: '%s'"
-msgstr ""
-
-#: builtin/init-db.c:354
-#, c-format
-msgid "unable to handle file type %d"
-msgstr ""
-
-#: builtin/init-db.c:357
-#, c-format
-msgid "unable to move %s to %s"
-msgstr ""
-
-#: builtin/init-db.c:373
-msgid "attempt to reinitialize repository with different hash"
-msgstr ""
-
-#: builtin/init-db.c:397 builtin/init-db.c:400
-#, c-format
-msgid "%s already exists"
-msgstr ""
-
-#: builtin/init-db.c:432
-#, c-format
-msgid "re-init: ignored --initial-branch=%s"
-msgstr ""
-
-#: builtin/init-db.c:463
-#, c-format
-msgid "Reinitialized existing shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:464
-#, c-format
-msgid "Reinitialized existing Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:468
-#, c-format
-msgid "Initialized empty shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:469
-#, c-format
-msgid "Initialized empty Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:518
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-
-#: builtin/init-db.c:544
-msgid "permissions"
-msgstr ""
-
-#: builtin/init-db.c:545
-msgid "specify that the git repository is to be shared amongst several users"
-msgstr ""
-
-#: builtin/init-db.c:551
-msgid "override the name of the initial branch"
-msgstr ""
-
-#: builtin/init-db.c:552 builtin/verify-pack.c:74
-msgid "hash"
-msgstr ""
-
-#: builtin/init-db.c:553 builtin/show-index.c:22 builtin/verify-pack.c:75
-msgid "specify the hash algorithm to use"
-msgstr ""
-
-#: builtin/init-db.c:591 builtin/init-db.c:596
-#, c-format
-msgid "cannot mkdir %s"
-msgstr ""
-
-#: builtin/init-db.c:600 builtin/init-db.c:655
-#, c-format
-msgid "cannot chdir to %s"
-msgstr ""
-
-#: builtin/init-db.c:627
-#, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-msgstr ""
-
-#: builtin/init-db.c:679
-#, c-format
-msgid "Cannot access work tree '%s'"
-msgstr ""
-
-#: builtin/init-db.c:684
-msgid "--separate-git-dir incompatible with bare repository"
-msgstr ""
-
-#: builtin/interpret-trailers.c:16
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
-msgstr ""
-
-#: builtin/interpret-trailers.c:95
-msgid "edit files in place"
-msgstr ""
-
-#: builtin/interpret-trailers.c:96
-msgid "trim empty trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:99
-msgid "where to place the new trailer"
-msgstr ""
-
-#: builtin/interpret-trailers.c:101
-msgid "action if trailer already exists"
-msgstr ""
-
-#: builtin/interpret-trailers.c:103
-msgid "action if trailer is missing"
-msgstr ""
-
-#: builtin/interpret-trailers.c:105
-msgid "output only the trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:106
-msgid "do not apply config rules"
-msgstr ""
-
-#: builtin/interpret-trailers.c:107
-msgid "join whitespace-continued values"
-msgstr ""
-
-#: builtin/interpret-trailers.c:108
-msgid "set parsing options"
-msgstr ""
-
-#: builtin/interpret-trailers.c:110
-msgid "do not treat --- specially"
-msgstr ""
-
-#: builtin/interpret-trailers.c:112
-msgid "trailer(s) to add"
-msgstr ""
-
-#: builtin/interpret-trailers.c:123
-msgid "--trailer with --only-input does not make sense"
-msgstr ""
-
-#: builtin/interpret-trailers.c:133
-msgid "no input file given for in-place editing"
-msgstr ""
-
-#: builtin/log.c:60
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/log.c:61
-msgid "git show [<options>] <object>..."
-msgstr ""
-
-#: builtin/log.c:114
-#, c-format
-msgid "invalid --decorate option: %s"
-msgstr ""
-
-#: builtin/log.c:181
-msgid "show source"
-msgstr ""
-
-#: builtin/log.c:182
-msgid "use mail map file"
-msgstr ""
-
-#: builtin/log.c:185
-msgid "only decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:187
-msgid "do not decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:188
-msgid "decorate options"
-msgstr ""
-
-#: builtin/log.c:191
-msgid ""
-"trace the evolution of line range <start>,<end> or function :<funcname> in "
-"<file>"
-msgstr ""
-
-#: builtin/log.c:214
-msgid "-L<range>:<file> cannot be used with pathspec"
-msgstr ""
-
-#: builtin/log.c:322
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr ""
-
-#: builtin/log.c:429
-msgid "unable to create temporary object directory"
-msgstr ""
-
-#: builtin/log.c:599
-#, c-format
-msgid "git show %s: bad file"
-msgstr ""
-
-#: builtin/log.c:614 builtin/log.c:706
-#, c-format
-msgid "could not read object %s"
-msgstr ""
-
-#: builtin/log.c:731
-#, c-format
-msgid "unknown type: %d"
-msgstr ""
-
-#: builtin/log.c:880
-#, c-format
-msgid "%s: invalid cover from description mode"
-msgstr ""
-
-#: builtin/log.c:887
-msgid "format.headers without value"
-msgstr ""
-
-#: builtin/log.c:1016
-#, c-format
-msgid "cannot open patch file %s"
-msgstr ""
-
-#: builtin/log.c:1033
-msgid "need exactly one range"
-msgstr ""
-
-#: builtin/log.c:1043
-msgid "not a range"
-msgstr ""
-
-#: builtin/log.c:1207
-msgid "cover letter needs email format"
-msgstr ""
-
-#: builtin/log.c:1213
-msgid "failed to create cover-letter file"
-msgstr ""
-
-#: builtin/log.c:1300
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr ""
-
-#: builtin/log.c:1327
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
-msgstr ""
-
-#: builtin/log.c:1385
-msgid "two output directories?"
-msgstr ""
-
-#: builtin/log.c:1536 builtin/log.c:2369 builtin/log.c:2371 builtin/log.c:2383
-#, c-format
-msgid "unknown commit %s"
-msgstr ""
-
-#: builtin/log.c:1547 builtin/replace.c:58 builtin/replace.c:207
-#: builtin/replace.c:210
-#, c-format
-msgid "failed to resolve '%s' as a valid ref"
-msgstr ""
-
-#: builtin/log.c:1556
-msgid "could not find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1566
-msgid ""
-"failed to get upstream, if you want to record base commit automatically,\n"
-"please use git branch --set-upstream-to to track a remote branch.\n"
-"Or you could specify base commit by --base=<base-commit-id> manually"
-msgstr ""
-
-#: builtin/log.c:1589
-msgid "failed to find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1606
-msgid "base commit should be the ancestor of revision list"
-msgstr ""
-
-#: builtin/log.c:1616
-msgid "base commit shouldn't be in revision list"
-msgstr ""
-
-#: builtin/log.c:1674
-msgid "cannot get patch id"
-msgstr ""
-
-#: builtin/log.c:1737
-msgid "failed to infer range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1739
-#, c-format
-msgid "using '%s' as range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1783
-msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
-
-#: builtin/log.c:1786
-msgid "use [PATCH] even with multiple patches"
-msgstr ""
-
-#: builtin/log.c:1790
-msgid "print patches to standard out"
-msgstr ""
-
-#: builtin/log.c:1792
-msgid "generate a cover letter"
-msgstr ""
-
-#: builtin/log.c:1794
-msgid "use simple number sequence for output file names"
-msgstr ""
-
-#: builtin/log.c:1795
-msgid "sfx"
-msgstr ""
-
-#: builtin/log.c:1796
-msgid "use <sfx> instead of '.patch'"
-msgstr ""
-
-#: builtin/log.c:1798
-msgid "start numbering patches at <n> instead of 1"
-msgstr ""
-
-#: builtin/log.c:1799
-msgid "reroll-count"
-msgstr ""
-
-#: builtin/log.c:1800
-msgid "mark the series as Nth re-roll"
-msgstr ""
-
-#: builtin/log.c:1802
-msgid "max length of output filename"
-msgstr ""
-
-#: builtin/log.c:1804
-msgid "use [RFC PATCH] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1807
-msgid "cover-from-description-mode"
-msgstr ""
-
-#: builtin/log.c:1808
-msgid "generate parts of a cover letter based on a branch's description"
-msgstr ""
-
-#: builtin/log.c:1810
-msgid "use [<prefix>] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1813
-msgid "store resulting files in <dir>"
-msgstr ""
-
-#: builtin/log.c:1816
-msgid "don't strip/add [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1819
-msgid "don't output binary diffs"
-msgstr ""
-
-#: builtin/log.c:1821
-msgid "output all-zero hash in From header"
-msgstr ""
-
-#: builtin/log.c:1823
-msgid "don't include a patch matching a commit upstream"
-msgstr ""
-
-#: builtin/log.c:1825
-msgid "show patch format instead of default (patch + stat)"
-msgstr ""
-
-#: builtin/log.c:1827
-msgid "Messaging"
-msgstr ""
-
-#: builtin/log.c:1828
-msgid "header"
-msgstr ""
-
-#: builtin/log.c:1829
-msgid "add email header"
-msgstr ""
-
-#: builtin/log.c:1830 builtin/log.c:1831
-msgid "email"
-msgstr ""
-
-#: builtin/log.c:1830
-msgid "add To: header"
-msgstr ""
-
-#: builtin/log.c:1831
-msgid "add Cc: header"
-msgstr ""
-
-#: builtin/log.c:1832
-msgid "ident"
-msgstr ""
-
-#: builtin/log.c:1833
-msgid "set From address to <ident> (or committer ident if absent)"
-msgstr ""
-
-#: builtin/log.c:1835
-msgid "message-id"
-msgstr ""
-
-#: builtin/log.c:1836
-msgid "make first mail a reply to <message-id>"
-msgstr ""
-
-#: builtin/log.c:1837 builtin/log.c:1840
-msgid "boundary"
-msgstr ""
-
-#: builtin/log.c:1838
-msgid "attach the patch"
-msgstr ""
-
-#: builtin/log.c:1841
-msgid "inline the patch"
-msgstr ""
-
-#: builtin/log.c:1845
-msgid "enable message threading, styles: shallow, deep"
-msgstr ""
-
-#: builtin/log.c:1847
-msgid "signature"
-msgstr ""
-
-#: builtin/log.c:1848
-msgid "add a signature"
-msgstr ""
-
-#: builtin/log.c:1849
-msgid "base-commit"
-msgstr ""
-
-#: builtin/log.c:1850
-msgid "add prerequisite tree info to the patch series"
-msgstr ""
-
-#: builtin/log.c:1853
-msgid "add a signature from a file"
-msgstr ""
-
-#: builtin/log.c:1854
-msgid "don't print the patch filenames"
-msgstr ""
-
-#: builtin/log.c:1856
-msgid "show progress while generating patches"
-msgstr ""
-
-#: builtin/log.c:1858
-msgid "show changes against <rev> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1861
-msgid "show changes against <refspec> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1863 builtin/range-diff.c:28
-msgid "percentage by which creation is weighted"
-msgstr ""
-
-#: builtin/log.c:1953
-#, c-format
-msgid "invalid ident line: %s"
-msgstr ""
-
-#: builtin/log.c:1978
-msgid "--name-only does not make sense"
-msgstr ""
-
-#: builtin/log.c:1980
-msgid "--name-status does not make sense"
-msgstr ""
-
-#: builtin/log.c:1982
-msgid "--check does not make sense"
-msgstr ""
-
-#: builtin/log.c:1984
-msgid "--remerge-diff does not make sense"
-msgstr ""
-
-#: builtin/log.c:2129
-msgid "--interdiff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2133
-msgid "Interdiff:"
-msgstr ""
-
-#: builtin/log.c:2134
-#, c-format
-msgid "Interdiff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2144
-msgid "--range-diff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2152
-msgid "Range-diff:"
-msgstr ""
-
-#: builtin/log.c:2153
-#, c-format
-msgid "Range-diff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2164
-#, c-format
-msgid "unable to read signature file '%s'"
-msgstr ""
-
-#: builtin/log.c:2200
-msgid "Generating patches"
-msgstr ""
-
-#: builtin/log.c:2244
-msgid "failed to create output files"
-msgstr ""
-
-#: builtin/log.c:2304
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
-
-#: builtin/log.c:2358
-#, c-format
-msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
-msgstr ""
-
-#: builtin/ls-files.c:564
-msgid "git ls-files [<options>] [<file>...]"
-msgstr ""
-
-#: builtin/ls-files.c:618
-msgid "separate paths with the NUL character"
-msgstr ""
-
-#: builtin/ls-files.c:620
-msgid "identify the file status with tags"
-msgstr ""
-
-#: builtin/ls-files.c:622
-msgid "use lowercase letters for 'assume unchanged' files"
-msgstr ""
-
-#: builtin/ls-files.c:624
-msgid "use lowercase letters for 'fsmonitor clean' files"
-msgstr ""
-
-#: builtin/ls-files.c:626
-msgid "show cached files in the output (default)"
-msgstr ""
-
-#: builtin/ls-files.c:628
-msgid "show deleted files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:630
-msgid "show modified files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:632
-msgid "show other files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:634
-msgid "show ignored files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:637
-msgid "show staged contents' object name in the output"
-msgstr ""
-
-#: builtin/ls-files.c:639
-msgid "show files on the filesystem that need to be removed"
-msgstr ""
-
-#: builtin/ls-files.c:641
-msgid "show 'other' directories' names only"
-msgstr ""
-
-#: builtin/ls-files.c:643
-msgid "show line endings of files"
-msgstr ""
-
-#: builtin/ls-files.c:645
-msgid "don't show empty directories"
-msgstr ""
-
-#: builtin/ls-files.c:648
-msgid "show unmerged files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:650
-msgid "show resolve-undo information"
-msgstr ""
-
-#: builtin/ls-files.c:652
-msgid "skip files matching pattern"
-msgstr ""
-
-#: builtin/ls-files.c:655
-msgid "read exclude patterns from <file>"
-msgstr ""
-
-#: builtin/ls-files.c:658
-msgid "read additional per-directory exclude patterns in <file>"
-msgstr ""
-
-#: builtin/ls-files.c:660
-msgid "add the standard git exclusions"
-msgstr ""
-
-#: builtin/ls-files.c:664
-msgid "make the output relative to the project top directory"
-msgstr ""
-
-#: builtin/ls-files.c:669
-msgid "if any <file> is not in the index, treat this as an error"
-msgstr ""
-
-#: builtin/ls-files.c:670
-msgid "tree-ish"
-msgstr ""
-
-#: builtin/ls-files.c:671
-msgid "pretend that paths removed since <tree-ish> are still present"
-msgstr ""
-
-#: builtin/ls-files.c:673
-msgid "show debugging data"
-msgstr ""
-
-#: builtin/ls-files.c:675
-msgid "suppress duplicate entries"
-msgstr ""
-
-#: builtin/ls-files.c:677
-msgid "show sparse directories in the presence of a sparse index"
-msgstr ""
-
-#: builtin/ls-remote.c:9
-msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"              [-q | --quiet] [--exit-code] [--get-url]\n"
-"              [--symref] [<repository> [<refs>...]]"
-msgstr ""
-
-#: builtin/ls-remote.c:60
-msgid "do not print remote URL"
-msgstr ""
-
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1131
-msgid "exec"
-msgstr ""
-
-#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
-msgid "path of git-upload-pack on the remote host"
-msgstr ""
-
-#: builtin/ls-remote.c:66
-msgid "limit to tags"
-msgstr ""
-
-#: builtin/ls-remote.c:67
-msgid "limit to heads"
-msgstr ""
-
-#: builtin/ls-remote.c:68
-msgid "do not show peeled tags"
-msgstr ""
-
-#: builtin/ls-remote.c:70
-msgid "take url.<base>.insteadOf into account"
-msgstr ""
-
-#: builtin/ls-remote.c:73
-msgid "exit with exit code 2 if no matching refs are found"
-msgstr ""
-
-#: builtin/ls-remote.c:76
-msgid "show underlying ref in addition to the object pointed by it"
-msgstr ""
-
-#: builtin/ls-tree.c:36
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: builtin/ls-tree.c:54
-#, c-format
-msgid "could not get object info about '%s'"
-msgstr ""
-
-#: builtin/ls-tree.c:79
-#, c-format
-msgid "bad ls-tree format: element '%s' does not start with '('"
-msgstr ""
-
-#: builtin/ls-tree.c:83
-#, c-format
-msgid "bad ls-tree format: element '%s' does not end in ')'"
-msgstr ""
-
-#: builtin/ls-tree.c:109
-#, c-format
-msgid "bad ls-tree format: %%%.*s"
-msgstr ""
-
-#: builtin/ls-tree.c:336
-msgid "only show trees"
-msgstr ""
-
-#: builtin/ls-tree.c:338
-msgid "recurse into subtrees"
-msgstr ""
-
-#: builtin/ls-tree.c:340
-msgid "show trees when recursing"
-msgstr ""
-
-#: builtin/ls-tree.c:343
-msgid "terminate entries with NUL byte"
-msgstr ""
-
-#: builtin/ls-tree.c:344
-msgid "include object size"
-msgstr ""
-
-#: builtin/ls-tree.c:346 builtin/ls-tree.c:348
-msgid "list only filenames"
-msgstr ""
-
-#: builtin/ls-tree.c:350
-msgid "list only objects"
-msgstr ""
-
-#: builtin/ls-tree.c:353
-msgid "use full path names"
-msgstr ""
-
-#: builtin/ls-tree.c:355
-msgid "list entire tree; not just current directory (implies --full-name)"
-msgstr ""
-
-#: builtin/ls-tree.c:391
-msgid "--format can't be combined with other format-altering options"
-msgstr ""
-
-#. TRANSLATORS: keep <> in "<" mail ">" info.
-#: builtin/mailinfo.c:14
-msgid "git mailinfo [<options>] <msg> <patch> < mail >info"
-msgstr ""
-
-#: builtin/mailinfo.c:58
-msgid "keep subject"
-msgstr ""
-
-#: builtin/mailinfo.c:60
-msgid "keep non patch brackets in subject"
-msgstr ""
-
-#: builtin/mailinfo.c:62
-msgid "copy Message-ID to the end of commit message"
-msgstr ""
-
-#: builtin/mailinfo.c:64
-msgid "re-code metadata to i18n.commitEncoding"
-msgstr ""
-
-#: builtin/mailinfo.c:67
-msgid "disable charset re-coding of metadata"
-msgstr ""
-
-#: builtin/mailinfo.c:69
-msgid "encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:70
-msgid "re-code metadata to this encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:72
-msgid "use scissors"
-msgstr ""
-
-#: builtin/mailinfo.c:73
-msgid "<action>"
-msgstr ""
-
-#: builtin/mailinfo.c:74
-msgid "action when quoted CR is found"
-msgstr ""
-
-#: builtin/mailinfo.c:77
-msgid "use headers in message's body"
-msgstr ""
-
-#: builtin/mailsplit.c:227
-msgid "reading patches from stdin/tty..."
-msgstr ""
-
-#: builtin/mailsplit.c:242
-#, c-format
-msgid "empty mbox: '%s'"
-msgstr ""
-
-#: builtin/merge-base.c:32
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:33
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:34
-msgid "git merge-base --independent <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:35
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr ""
-
-#: builtin/merge-base.c:36
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr ""
-
-#: builtin/merge-base.c:144
-msgid "output all common ancestors"
-msgstr ""
-
-#: builtin/merge-base.c:146
-msgid "find ancestors for a single n-way merge"
-msgstr ""
-
-#: builtin/merge-base.c:148
-msgid "list revs not reachable from others"
-msgstr ""
-
-#: builtin/merge-base.c:150
-msgid "is the first one ancestor of the other?"
-msgstr ""
-
-#: builtin/merge-base.c:152
-msgid "find where <commit> forked from reflog of <ref>"
-msgstr ""
-
-#: builtin/merge-file.c:9
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
-msgstr ""
-
-#: builtin/merge-file.c:35
-msgid "send results to standard output"
-msgstr ""
-
-#: builtin/merge-file.c:36
-msgid "use a diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:37
-msgid "use a zealous diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:39
-msgid "for conflicts, use our version"
-msgstr ""
-
-#: builtin/merge-file.c:41
-msgid "for conflicts, use their version"
-msgstr ""
-
-#: builtin/merge-file.c:43
-msgid "for conflicts, use a union version"
-msgstr ""
-
-#: builtin/merge-file.c:46
-msgid "for conflicts, use this marker size"
-msgstr ""
-
-#: builtin/merge-file.c:47
-msgid "do not warn about conflicts"
-msgstr ""
-
-#: builtin/merge-file.c:49
-msgid "set labels for file1/orig-file/file2"
-msgstr ""
-
-#: builtin/merge-recursive.c:47
-#, c-format
-msgid "unknown option %s"
-msgstr ""
-
-#: builtin/merge-recursive.c:53
-#, c-format
-msgid "could not parse object '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:57
-#, c-format
-msgid "cannot handle more than %d base. Ignoring %s."
-msgid_plural "cannot handle more than %d bases. Ignoring %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/merge-recursive.c:65
-msgid "not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge-recursive.c:74 builtin/merge-recursive.c:76
-#, c-format
-msgid "could not resolve ref '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:82
-#, c-format
-msgid "Merging %s with %s\n"
-msgstr ""
-
-#: builtin/merge.c:59
-msgid "git merge [<options>] [<commit>...]"
-msgstr ""
-
-#: builtin/merge.c:125
-msgid "switch `m' requires a value"
-msgstr ""
-
-#: builtin/merge.c:148
-#, c-format
-msgid "option `%s' requires a value"
-msgstr ""
-
-#: builtin/merge.c:201
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr ""
-
-#: builtin/merge.c:202
-#, c-format
-msgid "Available strategies are:"
-msgstr ""
-
-#: builtin/merge.c:207
-#, c-format
-msgid "Available custom strategies are:"
-msgstr ""
-
-#: builtin/merge.c:258 builtin/pull.c:134
-msgid "do not show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:261 builtin/pull.c:137
-msgid "show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:262 builtin/pull.c:140
-msgid "(synonym to --stat)"
-msgstr ""
-
-#: builtin/merge.c:264 builtin/pull.c:143
-msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr ""
-
-#: builtin/merge.c:267 builtin/pull.c:149
-msgid "create a single commit instead of doing a merge"
-msgstr ""
-
-#: builtin/merge.c:269 builtin/pull.c:152
-msgid "perform a commit if the merge succeeds (default)"
-msgstr ""
-
-#: builtin/merge.c:271 builtin/pull.c:155
-msgid "edit message before committing"
-msgstr ""
-
-#: builtin/merge.c:273
-msgid "allow fast-forward (default)"
-msgstr ""
-
-#: builtin/merge.c:275 builtin/pull.c:162
-msgid "abort if fast-forward is not possible"
-msgstr ""
-
-#: builtin/merge.c:279 builtin/pull.c:168
-msgid "verify that the named commit has a valid GPG signature"
-msgstr ""
-
-#: builtin/merge.c:280 builtin/notes.c:785 builtin/pull.c:172
-#: builtin/rebase.c:1145 builtin/revert.c:114
-msgid "strategy"
-msgstr ""
-
-#: builtin/merge.c:281 builtin/pull.c:173
-msgid "merge strategy to use"
-msgstr ""
-
-#: builtin/merge.c:282 builtin/pull.c:176
-msgid "option=value"
-msgstr ""
-
-#: builtin/merge.c:283 builtin/pull.c:177
-msgid "option for selected merge strategy"
-msgstr ""
-
-#: builtin/merge.c:285
-msgid "merge commit message (for a non-fast-forward merge)"
-msgstr ""
-
-#: builtin/merge.c:291
-msgid "use <name> instead of the real target"
-msgstr ""
-
-#: builtin/merge.c:294
-msgid "abort the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:296
-msgid "--abort but leave index and working tree alone"
-msgstr ""
-
-#: builtin/merge.c:298
-msgid "continue the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:300 builtin/pull.c:184
-msgid "allow merging unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:307
-msgid "bypass pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/merge.c:323
-msgid "could not run stash."
-msgstr ""
-
-#: builtin/merge.c:328
-msgid "stash failed"
-msgstr ""
-
-#: builtin/merge.c:333
-#, c-format
-msgid "not a valid object: %s"
-msgstr ""
-
-#: builtin/merge.c:355 builtin/merge.c:372
-msgid "read-tree failed"
-msgstr ""
-
-#: builtin/merge.c:403
-msgid "Already up to date. (nothing to squash)"
-msgstr ""
-
-#: builtin/merge.c:417
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:467
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:517
-#, c-format
-msgid "'%s' does not point to a commit"
-msgstr ""
-
-#: builtin/merge.c:605
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr ""
-
-#: builtin/merge.c:732
-msgid "Not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge.c:745
-#, c-format
-msgid "unknown strategy option: -X%s"
-msgstr ""
-
-#: builtin/merge.c:764 t/helper/test-fast-rebase.c:223
-#, c-format
-msgid "unable to write %s"
-msgstr ""
-
-#: builtin/merge.c:816
-#, c-format
-msgid "Could not read from '%s'"
-msgstr ""
-
-#: builtin/merge.c:825
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:831
-msgid ""
-"Please enter a commit message to explain why this merge is necessary,\n"
-"especially if it merges an updated upstream into a topic branch.\n"
-"\n"
-msgstr ""
-
-#: builtin/merge.c:836
-msgid "An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:839
-#, c-format
-msgid ""
-"Lines starting with '%c' will be ignored, and an empty message aborts\n"
-"the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:900
-msgid "Empty commit message."
-msgstr ""
-
-#: builtin/merge.c:915
-#, c-format
-msgid "Wonderful.\n"
-msgstr ""
-
-#: builtin/merge.c:976
-#, c-format
-msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr ""
-
-#: builtin/merge.c:1015
-msgid "No current branch."
-msgstr ""
-
-#: builtin/merge.c:1017
-msgid "No remote for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1019
-msgid "No default upstream defined for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1024
-#, c-format
-msgid "No remote-tracking branch for %s from %s"
-msgstr ""
-
-#: builtin/merge.c:1081
-#, c-format
-msgid "Bad value '%s' in environment '%s'"
-msgstr ""
-
-#: builtin/merge.c:1183
-#, c-format
-msgid "not something we can merge in %s: %s"
-msgstr ""
-
-#: builtin/merge.c:1217
-msgid "not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1330
-msgid "--abort expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1334
-msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1352
-msgid "--quit expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1365
-msgid "--continue expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1369
-msgid "There is no merge in progress (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1385
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1392
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1395
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr ""
-
-#: builtin/merge.c:1427
-msgid "No commit specified and merge.defaultToUpstream not set."
-msgstr ""
-
-#: builtin/merge.c:1444
-msgid "Squash commit into empty head not supported yet"
-msgstr ""
-
-#: builtin/merge.c:1446
-msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr ""
-
-#: builtin/merge.c:1451
-#, c-format
-msgid "%s - not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1453
-msgid "Can merge only exactly one commit into empty head"
-msgstr ""
-
-#: builtin/merge.c:1540
-msgid "refusing to merge unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:1559
-#, c-format
-msgid "Updating %s..%s\n"
-msgstr ""
-
-#: builtin/merge.c:1606
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr ""
-
-#: builtin/merge.c:1613
-#, c-format
-msgid "Nope.\n"
-msgstr ""
-
-#: builtin/merge.c:1671 builtin/merge.c:1737
-#, c-format
-msgid "Rewinding the tree to pristine...\n"
-msgstr ""
-
-#: builtin/merge.c:1675
-#, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr ""
-
-#: builtin/merge.c:1727
-#, c-format
-msgid "No merge strategy handled the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:1729
-#, c-format
-msgid "Merge with strategy %s failed.\n"
-msgstr ""
-
-#: builtin/merge.c:1739
-#, c-format
-msgid "Using the %s strategy to prepare resolving by hand.\n"
-msgstr ""
-
-#: builtin/merge.c:1753
-#, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-
-#: builtin/mktag.c:27
-#, c-format
-msgid "warning: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:38
-#, c-format
-msgid "error: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:41
-#, c-format
-msgid "%d (FSCK_IGNORE?) should never trigger this callback"
-msgstr ""
-
-#: builtin/mktag.c:56
-#, c-format
-msgid "could not read tagged object '%s'"
-msgstr ""
-
-#: builtin/mktag.c:59
-#, c-format
-msgid "object '%s' tagged as '%s', but is a '%s' type"
-msgstr ""
-
-#: builtin/mktag.c:97
-msgid "tag on stdin did not pass our strict fsck check"
-msgstr ""
-
-#: builtin/mktag.c:100
-msgid "tag on stdin did not refer to a valid object"
-msgstr ""
-
-#: builtin/mktag.c:103 builtin/tag.c:243
-msgid "unable to write tag file"
-msgstr ""
-
-#: builtin/mktree.c:154
-msgid "input is NUL terminated"
-msgstr ""
-
-#: builtin/mktree.c:155 builtin/write-tree.c:26
-msgid "allow missing objects"
-msgstr ""
-
-#: builtin/mktree.c:156
-msgid "allow creation of more than one tree"
-msgstr ""
-
-#: builtin/multi-pack-index.c:10
-msgid ""
-"git multi-pack-index [<options>] write [--preferred-pack=<pack>][--refs-"
-"snapshot=<path>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:14
-msgid "git multi-pack-index [<options>] verify"
-msgstr ""
-
-#: builtin/multi-pack-index.c:17
-msgid "git multi-pack-index [<options>] expire"
-msgstr ""
-
-#: builtin/multi-pack-index.c:20
-msgid "git multi-pack-index [<options>] repack [--batch-size=<size>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:57
-msgid "object directory containing set of packfile and pack-index pairs"
-msgstr ""
-
-#: builtin/multi-pack-index.c:98
-msgid "preferred-pack"
-msgstr ""
-
-#: builtin/multi-pack-index.c:99
-msgid "pack for reuse when computing a multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:100
-msgid "write multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:105
-msgid "write multi-pack index containing only given indexes"
-msgstr ""
-
-#: builtin/multi-pack-index.c:107
-msgid "refs snapshot for selecting bitmap commits"
-msgstr ""
-
-#: builtin/multi-pack-index.c:206
-msgid ""
-"during repack, collect pack-files of smaller size into a batch that is "
-"larger than this size"
-msgstr ""
-
-#: builtin/mv.c:18
-msgid "git mv [<options>] <source>... <destination>"
-msgstr ""
-
-#: builtin/mv.c:83
-#, c-format
-msgid "Directory %s is in index and no submodule?"
-msgstr ""
-
-#: builtin/mv.c:85
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/mv.c:103
-#, c-format
-msgid "%.*s is in index"
-msgstr ""
-
-#: builtin/mv.c:125
-msgid "force move/rename even if target exists"
-msgstr ""
-
-#: builtin/mv.c:127
-msgid "skip move/rename errors"
-msgstr ""
-
-#: builtin/mv.c:172
-#, c-format
-msgid "destination '%s' is not a directory"
-msgstr ""
-
-#: builtin/mv.c:184
-#, c-format
-msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
-
-#: builtin/mv.c:190
-msgid "bad source"
-msgstr ""
-
-#: builtin/mv.c:193
-msgid "can not move directory into itself"
-msgstr ""
-
-#: builtin/mv.c:196
-msgid "cannot move directory over file"
-msgstr ""
-
-#: builtin/mv.c:205
-msgid "source directory is empty"
-msgstr ""
-
-#: builtin/mv.c:231
-msgid "not under version control"
-msgstr ""
-
-#: builtin/mv.c:233
-msgid "conflicted"
-msgstr ""
-
-#: builtin/mv.c:236
-msgid "destination exists"
-msgstr ""
-
-#: builtin/mv.c:244
-#, c-format
-msgid "overwriting '%s'"
-msgstr ""
-
-#: builtin/mv.c:247
-msgid "Cannot overwrite"
-msgstr ""
-
-#: builtin/mv.c:250
-msgid "multiple sources for the same target"
-msgstr ""
-
-#: builtin/mv.c:252
-msgid "destination directory does not exist"
-msgstr ""
-
-#: builtin/mv.c:280
-#, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr ""
-
-#: builtin/mv.c:308
-#, c-format
-msgid "Renaming %s to %s\n"
-msgstr ""
-
-#: builtin/mv.c:314 builtin/remote.c:812 builtin/repack.c:861
-#, c-format
-msgid "renaming '%s' failed"
-msgstr ""
-
-#: builtin/name-rev.c:524
-msgid "git name-rev [<options>] <commit>..."
-msgstr ""
-
-#: builtin/name-rev.c:525
-msgid "git name-rev [<options>] --all"
-msgstr ""
-
-#: builtin/name-rev.c:526
-msgid "git name-rev [<options>] --annotate-stdin"
-msgstr ""
-
-#: builtin/name-rev.c:583
-msgid "print only ref-based names (no object names)"
-msgstr ""
-
-#: builtin/name-rev.c:584
-msgid "only use tags to name the commits"
-msgstr ""
-
-#: builtin/name-rev.c:586
-msgid "only use refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:588
-msgid "ignore refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:590
-msgid "list all commits reachable from all refs"
-msgstr ""
-
-#: builtin/name-rev.c:591
-msgid "deprecated: use annotate-stdin instead"
-msgstr ""
-
-#: builtin/name-rev.c:592
-msgid "annotate text from stdin"
-msgstr ""
-
-#: builtin/name-rev.c:593
-msgid "allow to print `undefined` names (default)"
-msgstr ""
-
-#: builtin/name-rev.c:599
-msgid "dereference tags in the input (internal use)"
-msgstr ""
-
-#: builtin/notes.c:28
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:29
-msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:32
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:33
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:34
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:37
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr ""
-
-#: builtin/notes.c:38
-msgid "git notes [--ref <notes-ref>] prune [-n] [-v]"
-msgstr ""
-
-#: builtin/notes.c:39
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr ""
-
-#: builtin/notes.c:44
-msgid "git notes [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:49
-msgid "git notes add [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:54
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:55
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr ""
-
-#: builtin/notes.c:60
-msgid "git notes append [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:65
-msgid "git notes edit [<object>]"
-msgstr ""
-
-#: builtin/notes.c:70
-msgid "git notes show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:75
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:76
-msgid "git notes merge --commit [<options>]"
-msgstr ""
-
-#: builtin/notes.c:77
-msgid "git notes merge --abort [<options>]"
-msgstr ""
-
-#: builtin/notes.c:82
-msgid "git notes remove [<object>]"
-msgstr ""
-
-#: builtin/notes.c:87
-msgid "git notes prune [<options>]"
-msgstr ""
-
-#: builtin/notes.c:97
-msgid "Write/edit the notes for the following object:"
-msgstr ""
-
-#: builtin/notes.c:149
-#, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:153
-msgid "could not read 'show' output"
-msgstr ""
-
-#: builtin/notes.c:161
-#, c-format
-msgid "failed to finish 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:194
-msgid "please supply the note contents using either -m or -F option"
-msgstr ""
-
-#: builtin/notes.c:203
-msgid "unable to write note object"
-msgstr ""
-
-#: builtin/notes.c:206
-#, c-format
-msgid "the note contents have been left in %s"
-msgstr ""
-
-#: builtin/notes.c:240 builtin/tag.c:582
-#, c-format
-msgid "could not open or read '%s'"
-msgstr ""
-
-#: builtin/notes.c:261 builtin/notes.c:311 builtin/notes.c:313
-#: builtin/notes.c:381 builtin/notes.c:436 builtin/notes.c:524
-#: builtin/notes.c:529 builtin/notes.c:608 builtin/notes.c:670
-#, c-format
-msgid "failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:263
-#, c-format
-msgid "failed to read object '%s'."
-msgstr ""
-
-#: builtin/notes.c:266
-#, c-format
-msgid "cannot read note data from non-blob object '%s'."
-msgstr ""
-
-#: builtin/notes.c:307
-#, c-format
-msgid "malformed input line: '%s'."
-msgstr ""
-
-#: builtin/notes.c:322
-#, c-format
-msgid "failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#. TRANSLATORS: the first %s will be replaced by a git
-#. notes command: 'add', 'merge', 'remove', etc.
-#.
-#: builtin/notes.c:354
-#, c-format
-msgid "refusing to %s notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#: builtin/notes.c:387 builtin/notes.c:676
-#, c-format
-msgid "no note found for object %s."
-msgstr ""
-
-#: builtin/notes.c:408 builtin/notes.c:574
-msgid "note contents as a string"
-msgstr ""
-
-#: builtin/notes.c:411 builtin/notes.c:577
-msgid "note contents in a file"
-msgstr ""
-
-#: builtin/notes.c:414 builtin/notes.c:580
-msgid "reuse and edit specified note object"
-msgstr ""
-
-#: builtin/notes.c:417 builtin/notes.c:583
-msgid "reuse specified note object"
-msgstr ""
-
-#: builtin/notes.c:420 builtin/notes.c:586
-msgid "allow storing empty note"
-msgstr ""
-
-#: builtin/notes.c:421 builtin/notes.c:494
-msgid "replace existing notes"
-msgstr ""
-
-#: builtin/notes.c:446
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:461 builtin/notes.c:542
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:473 builtin/notes.c:635 builtin/notes.c:904
-#, c-format
-msgid "Removing note for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:495
-msgid "read objects from stdin"
-msgstr ""
-
-#: builtin/notes.c:497
-msgid "load rewriting config for <command> (implies --stdin)"
-msgstr ""
-
-#: builtin/notes.c:515
-msgid "too few arguments"
-msgstr ""
-
-#: builtin/notes.c:536
-#, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:548
-#, c-format
-msgid "missing notes on source object %s. Cannot copy."
-msgstr ""
-
-#: builtin/notes.c:601
-#, c-format
-msgid ""
-"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
-"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
-msgstr ""
-
-#: builtin/notes.c:696
-msgid "failed to delete ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:698
-msgid "failed to delete ref NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:700
-msgid "failed to remove 'git notes merge' worktree"
-msgstr ""
-
-#: builtin/notes.c:720
-msgid "failed to read ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:722
-msgid "could not find commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:724
-msgid "could not parse commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:737
-msgid "failed to resolve NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:740
-msgid "failed to finalize notes merge"
-msgstr ""
-
-#: builtin/notes.c:766
-#, c-format
-msgid "unknown notes merge strategy %s"
-msgstr ""
-
-#: builtin/notes.c:782
-msgid "General options"
-msgstr ""
-
-#: builtin/notes.c:784
-msgid "Merge options"
-msgstr ""
-
-#: builtin/notes.c:786
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
-msgstr ""
-
-#: builtin/notes.c:788
-msgid "Committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:790
-msgid "finalize notes merge by committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:792
-msgid "Aborting notes merge resolution"
-msgstr ""
-
-#: builtin/notes.c:794
-msgid "abort notes merge"
-msgstr ""
-
-#: builtin/notes.c:805
-msgid "cannot mix --commit, --abort or -s/--strategy"
-msgstr ""
-
-#: builtin/notes.c:810
-msgid "must specify a notes ref to merge"
-msgstr ""
-
-#: builtin/notes.c:834
-#, c-format
-msgid "unknown -s/--strategy: %s"
-msgstr ""
-
-#: builtin/notes.c:874
-#, c-format
-msgid "a notes merge into %s is already in-progress at %s"
-msgstr ""
-
-#: builtin/notes.c:878
-#, c-format
-msgid "failed to store link to current notes ref (%s)"
-msgstr ""
-
-#: builtin/notes.c:880
-#, c-format
-msgid ""
-"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
-"'git notes merge --commit', or abort the merge with 'git notes merge --"
-"abort'.\n"
-msgstr ""
-
-#: builtin/notes.c:899 builtin/tag.c:595
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:902
-#, c-format
-msgid "Object %s has no note\n"
-msgstr ""
-
-#: builtin/notes.c:914
-msgid "attempt to remove non-existent note is not an error"
-msgstr ""
-
-#: builtin/notes.c:917
-msgid "read object names from the standard input"
-msgstr ""
-
-#: builtin/notes.c:956 builtin/prune.c:144 builtin/worktree.c:148
-msgid "do not remove, show only"
-msgstr ""
-
-#: builtin/notes.c:957
-msgid "report pruned notes"
-msgstr ""
-
-#: builtin/notes.c:1000
-msgid "notes-ref"
-msgstr ""
-
-#: builtin/notes.c:1001
-msgid "use notes from <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:1036 builtin/stash.c:1802
-#, c-format
-msgid "unknown subcommand: %s"
-msgstr ""
-
-#: builtin/pack-objects.c:182
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:183
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:570
-#, c-format
-msgid ""
-"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
-"pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:578
-#, c-format
-msgid "bad packed object CRC for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:589
-#, c-format
-msgid "corrupt packed object for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:720
-#, c-format
-msgid "recursive delta detected for object %s"
-msgstr ""
-
-#: builtin/pack-objects.c:939
-#, c-format
-msgid "ordered %u objects, expected %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1034
-#, c-format
-msgid "expected object at offset %<PRIuMAX> in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1158
-msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
-msgstr ""
-
-#: builtin/pack-objects.c:1171
-msgid "Writing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:1243 builtin/update-index.c:90
-#, c-format
-msgid "failed to stat %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1276
-msgid "failed to write bitmap index"
-msgstr ""
-
-#: builtin/pack-objects.c:1302
-#, c-format
-msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1544
-msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr ""
-
-#: builtin/pack-objects.c:1992
-#, c-format
-msgid "delta base offset overflow in pack for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2001
-#, c-format
-msgid "delta base offset out of bound for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2282
-msgid "Counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2447
-#, c-format
-msgid "unable to parse object header of %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2517 builtin/pack-objects.c:2533
-#: builtin/pack-objects.c:2543
-#, c-format
-msgid "object %s cannot be read"
-msgstr ""
-
-#: builtin/pack-objects.c:2520 builtin/pack-objects.c:2547
-#, c-format
-msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
-msgstr ""
-
-#: builtin/pack-objects.c:2557
-msgid "suboptimal pack - out of memory"
-msgstr ""
-
-#: builtin/pack-objects.c:2872
-#, c-format
-msgid "Delta compression using up to %d threads"
-msgstr ""
-
-#: builtin/pack-objects.c:3011
-#, c-format
-msgid "unable to pack objects reachable from tag %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3097
-msgid "Compressing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3103
-msgid "inconsistency with delta count"
-msgstr ""
-
-#: builtin/pack-objects.c:3182
-#, c-format
-msgid ""
-"value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
-"hash> <uri>' (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3185
-#, c-format
-msgid ""
-"object already configured in another uploadpack.blobpackfileuri (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3220
-#, c-format
-msgid "could not get type of object %s in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3348 builtin/pack-objects.c:3359
-#: builtin/pack-objects.c:3373
-#, c-format
-msgid "could not find pack '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3416
-#, c-format
-msgid ""
-"expected edge object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3422
-#, c-format
-msgid ""
-"expected object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3540 builtin/pack-objects.c:3627
-msgid "cannot open pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3549
-#, c-format
-msgid "loose object at %s could not be examined"
-msgstr ""
-
-#: builtin/pack-objects.c:3635
-msgid "unable to force loose object"
-msgstr ""
-
-#: builtin/pack-objects.c:3763
-#, c-format
-msgid "not a rev '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3766 builtin/rev-parse.c:1061
-#, c-format
-msgid "bad revision '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3794
-msgid "unable to add recent objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3847
-#, c-format
-msgid "unsupported index version %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3851
-#, c-format
-msgid "bad index version '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3907
-msgid "<version>[,<offset>]"
-msgstr ""
-
-#: builtin/pack-objects.c:3908
-msgid "write the pack index file in the specified idx format version"
-msgstr ""
-
-#: builtin/pack-objects.c:3911
-msgid "maximum size of each output pack file"
-msgstr ""
-
-#: builtin/pack-objects.c:3913
-msgid "ignore borrowed objects from alternate object store"
-msgstr ""
-
-#: builtin/pack-objects.c:3915
-msgid "ignore packed objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3917
-msgid "limit pack window by objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3919
-msgid "limit pack window by memory in addition to object limit"
-msgstr ""
-
-#: builtin/pack-objects.c:3921
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3923
-msgid "reuse existing deltas"
-msgstr ""
-
-#: builtin/pack-objects.c:3925
-msgid "reuse existing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3927
-msgid "use OFS_DELTA objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3929
-msgid "use threads when searching for best delta matches"
-msgstr ""
-
-#: builtin/pack-objects.c:3931
-msgid "do not create an empty pack output"
-msgstr ""
-
-#: builtin/pack-objects.c:3933
-msgid "read revision arguments from standard input"
-msgstr ""
-
-#: builtin/pack-objects.c:3935
-msgid "limit the objects to those that are not yet packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3938
-msgid "include objects reachable from any reference"
-msgstr ""
-
-#: builtin/pack-objects.c:3941
-msgid "include objects referred by reflog entries"
-msgstr ""
-
-#: builtin/pack-objects.c:3944
-msgid "include objects referred to by the index"
-msgstr ""
-
-#: builtin/pack-objects.c:3947
-msgid "read packs from stdin"
-msgstr ""
-
-#: builtin/pack-objects.c:3949
-msgid "output pack to stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:3951
-msgid "include tag objects that refer to objects to be packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3953
-msgid "keep unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3955
-msgid "pack loose unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3957
-msgid "unpack unreachable objects newer than <time>"
-msgstr ""
-
-#: builtin/pack-objects.c:3960
-msgid "use the sparse reachability algorithm"
-msgstr ""
-
-#: builtin/pack-objects.c:3962
-msgid "create thin packs"
-msgstr ""
-
-#: builtin/pack-objects.c:3964
-msgid "create packs suitable for shallow fetches"
-msgstr ""
-
-#: builtin/pack-objects.c:3966
-msgid "ignore packs that have companion .keep file"
-msgstr ""
-
-#: builtin/pack-objects.c:3968
-msgid "ignore this pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3970
-msgid "pack compression level"
-msgstr ""
-
-#: builtin/pack-objects.c:3972
-msgid "do not hide commits by grafts"
-msgstr ""
-
-#: builtin/pack-objects.c:3974
-msgid "use a bitmap index if available to speed up counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3976
-msgid "write a bitmap index together with the pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3980
-msgid "write a bitmap index if possible"
-msgstr ""
-
-#: builtin/pack-objects.c:3984
-msgid "handling for missing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3987
-msgid "do not pack objects in promisor packfiles"
-msgstr ""
-
-#: builtin/pack-objects.c:3989
-msgid "respect islands during delta compression"
-msgstr ""
-
-#: builtin/pack-objects.c:3991
-msgid "protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:3992
-msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:4027
-#, c-format
-msgid "delta chain depth %d is too deep, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4032
-#, c-format
-msgid "pack.deltaCacheLimit is too high, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4088
-msgid "--max-pack-size cannot be used to build a pack for transfer"
-msgstr ""
-
-#: builtin/pack-objects.c:4090
-msgid "minimum pack size limit is 1 MiB"
-msgstr ""
-
-#: builtin/pack-objects.c:4095
-msgid "--thin cannot be used to build an indexable pack"
-msgstr ""
-
-#: builtin/pack-objects.c:4104
-msgid "cannot use --filter without --stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:4106
-msgid "cannot use --filter with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4110
-msgid "cannot use internal rev list with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4169
-msgid "Enumerating objects"
-msgstr ""
-
-#: builtin/pack-objects.c:4210
-#, c-format
-msgid ""
-"Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
-"reused %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-redundant.c:601
-msgid ""
-"'git pack-redundant' is nominated for removal.\n"
-"If you still use this command, please add an extra\n"
-"option, '--i-still-use-this', on the command line\n"
-"and let us know you still use it by sending an e-mail\n"
-"to <git@vger.kernel.org>.  Thanks.\n"
-msgstr ""
-
-#: builtin/pack-refs.c:8
-msgid "git pack-refs [<options>]"
-msgstr ""
-
-#: builtin/pack-refs.c:16
-msgid "pack everything"
-msgstr ""
-
-#: builtin/pack-refs.c:17
-msgid "prune loose refs (default)"
-msgstr ""
-
-#: builtin/prune.c:14
-msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]"
-msgstr ""
-
-#: builtin/prune.c:145
-msgid "report pruned objects"
-msgstr ""
-
-#: builtin/prune.c:148
-msgid "expire objects older than <time>"
-msgstr ""
-
-#: builtin/prune.c:150
-msgid "limit traversal to objects outside promisor packfiles"
-msgstr ""
-
-#: builtin/prune.c:163
-msgid "cannot prune in a precious-objects repo"
-msgstr ""
-
-#: builtin/pull.c:67
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/pull.c:124
-msgid "control for recursive fetching of submodules"
-msgstr ""
-
-#: builtin/pull.c:128
-msgid "Options related to merging"
-msgstr ""
-
-#: builtin/pull.c:131
-msgid "incorporate changes by rebasing rather than merging"
-msgstr ""
-
-#: builtin/pull.c:159 builtin/revert.c:126
-msgid "allow fast-forward"
-msgstr ""
-
-#: builtin/pull.c:165
-msgid "control use of pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/pull.c:171 parse-options.h:371
-msgid "automatically stash/stash pop before and after"
-msgstr ""
-
-#: builtin/pull.c:187
-msgid "Options related to fetching"
-msgstr ""
-
-#: builtin/pull.c:197
-msgid "force overwrite of local branch"
-msgstr ""
-
-#: builtin/pull.c:205
-msgid "number of submodules pulled in parallel"
-msgstr ""
-
-#: builtin/pull.c:449
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-
-#: builtin/pull.c:451
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-
-#: builtin/pull.c:452
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-
-#: builtin/pull.c:455
-#, c-format
-msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
-msgstr ""
-
-#: builtin/pull.c:460 builtin/rebase.c:978
-msgid "You are not currently on a branch."
-msgstr ""
-
-#: builtin/pull.c:462 builtin/pull.c:477
-msgid "Please specify which branch you want to rebase against."
-msgstr ""
-
-#: builtin/pull.c:464 builtin/pull.c:479
-msgid "Please specify which branch you want to merge with."
-msgstr ""
-
-#: builtin/pull.c:465 builtin/pull.c:480
-msgid "See git-pull(1) for details."
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:473 builtin/pull.c:482
-#: builtin/rebase.c:984
-msgid "<remote>"
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:482 builtin/pull.c:487
-#: contrib/scalar/scalar.c:374
-msgid "<branch>"
-msgstr ""
-
-#: builtin/pull.c:475 builtin/rebase.c:976
-msgid "There is no tracking information for the current branch."
-msgstr ""
-
-#: builtin/pull.c:484
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-
-#: builtin/pull.c:489
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-
-#: builtin/pull.c:600
-#, c-format
-msgid "unable to access commit %s"
-msgstr ""
-
-#: builtin/pull.c:908
-msgid "ignoring --verify-signatures for rebase"
-msgstr ""
-
-#: builtin/pull.c:969
-msgid ""
-"You have divergent branches and need to specify how to reconcile them.\n"
-"You can do so by running one of the following commands sometime before\n"
-"your next pull:\n"
-"\n"
-"  git config pull.rebase false  # merge\n"
-"  git config pull.rebase true   # rebase\n"
-"  git config pull.ff only       # fast-forward only\n"
-"\n"
-"You can replace \"git config\" with \"git config --global\" to set a "
-"default\n"
-"preference for all repositories. You can also pass --rebase, --no-rebase,\n"
-"or --ff-only on the command line to override the configured default per\n"
-"invocation.\n"
-msgstr ""
-
-#: builtin/pull.c:1047
-msgid "Updating an unborn branch with changes added to the index."
-msgstr ""
-
-#: builtin/pull.c:1051
-msgid "pull with rebase"
-msgstr ""
-
-#: builtin/pull.c:1052
-msgid "please commit or stash them."
-msgstr ""
-
-#: builtin/pull.c:1077
-#, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
-msgstr ""
-
-#: builtin/pull.c:1083
-#, c-format
-msgid ""
-"Cannot fast-forward your working tree.\n"
-"After making sure that you saved anything precious from\n"
-"$ git diff %s\n"
-"output, run\n"
-"$ git reset --hard\n"
-"to recover."
-msgstr ""
-
-#: builtin/pull.c:1098
-msgid "Cannot merge multiple branches into empty head."
-msgstr ""
-
-#: builtin/pull.c:1103
-msgid "Cannot rebase onto multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1105
-msgid "Cannot fast-forward to multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1120
-msgid "Need to specify how to reconcile divergent branches."
-msgstr ""
-
-#: builtin/pull.c:1134
-msgid "cannot rebase with locally recorded submodule modifications"
-msgstr ""
-
-#: builtin/push.c:19
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/push.c:111
-msgid "tag shorthand without <tag>"
-msgstr ""
-
-#: builtin/push.c:119
-msgid "--delete only accepts plain target ref names"
-msgstr ""
-
-#: builtin/push.c:164
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
-msgstr ""
-
-#: builtin/push.c:167
-#, c-format
-msgid ""
-"The upstream branch of your current branch does not match\n"
-"the name of your current branch.  To push to the upstream branch\n"
-"on the remote, use\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"To push to the branch of the same name on the remote, use\n"
-"\n"
-"    git push %s HEAD\n"
-"%s"
-msgstr ""
-
-#: builtin/push.c:182
-#, c-format
-msgid ""
-"You are not currently on a branch.\n"
-"To push the history leading to the current (detached HEAD)\n"
-"state now, use\n"
-"\n"
-"    git push %s HEAD:<name-of-remote-branch>\n"
-msgstr ""
-
-#: builtin/push.c:191
-#, c-format
-msgid ""
-"The current branch %s has no upstream branch.\n"
-"To push the current branch and set the remote as upstream, use\n"
-"\n"
-"    git push --set-upstream %s %s\n"
-msgstr ""
-
-#: builtin/push.c:199
-#, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr ""
-
-#: builtin/push.c:217
-msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr ""
-
-#: builtin/push.c:243
-#, c-format
-msgid ""
-"You are pushing to remote '%s', which is not the upstream of\n"
-"your current branch '%s', without telling me what to push\n"
-"to update which remote branch."
-msgstr ""
-
-#: builtin/push.c:258
-msgid ""
-"Updates were rejected because the tip of your current branch is behind\n"
-"its remote counterpart. Integrate the remote changes (e.g.\n"
-"'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:264
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. Check out this branch and integrate the remote changes\n"
-"(e.g. 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:270
-msgid ""
-"Updates were rejected because the remote contains work that you do\n"
-"not have locally. This is usually caused by another repository pushing\n"
-"to the same ref. You may want to first integrate the remote changes\n"
-"(e.g., 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:277
-msgid "Updates were rejected because the tag already exists in the remote."
-msgstr ""
-
-#: builtin/push.c:280
-msgid ""
-"You cannot update a remote ref that points at a non-commit object,\n"
-"or update a remote ref to make it point at a non-commit object,\n"
-"without using the '--force' option.\n"
-msgstr ""
-
-#: builtin/push.c:285
-msgid ""
-"Updates were rejected because the tip of the remote-tracking\n"
-"branch has been updated since the last checkout. You may want\n"
-"to integrate those changes locally (e.g., 'git pull ...')\n"
-"before forcing an update.\n"
-msgstr ""
-
-#: builtin/push.c:355
-#, c-format
-msgid "Pushing to %s\n"
-msgstr ""
-
-#: builtin/push.c:362
-#, c-format
-msgid "failed to push some refs to '%s'"
-msgstr ""
-
-#: builtin/push.c:544 builtin/submodule--helper.c:3377
-msgid "repository"
-msgstr ""
-
-#: builtin/push.c:545 builtin/send-pack.c:193
-msgid "push all refs"
-msgstr ""
-
-#: builtin/push.c:546 builtin/send-pack.c:195
-msgid "mirror all refs"
-msgstr ""
-
-#: builtin/push.c:548
-msgid "delete refs"
-msgstr ""
-
-#: builtin/push.c:549
-msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
-
-#: builtin/push.c:552 builtin/send-pack.c:196
-msgid "force updates"
-msgstr ""
-
-#: builtin/push.c:553 builtin/send-pack.c:208
-msgid "<refname>:<expect>"
-msgstr ""
-
-#: builtin/push.c:554 builtin/send-pack.c:209
-msgid "require old value of ref to be at this value"
-msgstr ""
-
-#: builtin/push.c:557 builtin/send-pack.c:212
-msgid "require remote updates to be integrated locally"
-msgstr ""
-
-#: builtin/push.c:560
-msgid "control recursive pushing of submodules"
-msgstr ""
-
-#: builtin/push.c:561 builtin/send-pack.c:203
-msgid "use thin pack"
-msgstr ""
-
-#: builtin/push.c:562 builtin/push.c:563 builtin/send-pack.c:190
-#: builtin/send-pack.c:191
-msgid "receive pack program"
-msgstr ""
-
-#: builtin/push.c:564
-msgid "set upstream for git pull/status"
-msgstr ""
-
-#: builtin/push.c:567
-msgid "prune locally removed refs"
-msgstr ""
-
-#: builtin/push.c:569
-msgid "bypass pre-push hook"
-msgstr ""
-
-#: builtin/push.c:570
-msgid "push missing but relevant tags"
-msgstr ""
-
-#: builtin/push.c:572 builtin/send-pack.c:197
-msgid "GPG sign the push"
-msgstr ""
-
-#: builtin/push.c:574 builtin/send-pack.c:204
-msgid "request atomic transaction on remote side"
-msgstr ""
-
-#: builtin/push.c:594
-msgid "--delete doesn't make sense without any refs"
-msgstr ""
-
-#: builtin/push.c:614
-#, c-format
-msgid "bad repository '%s'"
-msgstr ""
-
-#: builtin/push.c:615
-msgid ""
-"No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote "
-"repository using\n"
-"\n"
-"    git remote add <name> <url>\n"
-"\n"
-"and then push using the remote name\n"
-"\n"
-"    git push <name>\n"
-msgstr ""
-
-#: builtin/push.c:632
-msgid "--all can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:638
-msgid "--mirror can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:648
-msgid "push options must not have new line characters"
-msgstr ""
-
-#: builtin/range-diff.c:9
-msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:10
-msgid "git range-diff [<options>] <old-tip>...<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:11
-msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:30
-msgid "use simple diff colors"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "notes"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "passed to 'git log'"
-msgstr ""
-
-#: builtin/range-diff.c:35
-msgid "only emit output related to the first range"
-msgstr ""
-
-#: builtin/range-diff.c:37
-msgid "only emit output related to the second range"
-msgstr ""
-
-#: builtin/range-diff.c:60 builtin/range-diff.c:64
-#, c-format
-msgid "not a commit range: '%s'"
-msgstr ""
-
-#: builtin/range-diff.c:74
-msgid "single arg format must be symmetric range"
-msgstr ""
-
-#: builtin/range-diff.c:89
-msgid "need two commit ranges"
-msgstr ""
-
-#: builtin/read-tree.c:41
-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>]])"
-msgstr ""
-
-#: builtin/read-tree.c:116
-msgid "write resulting index to <file>"
-msgstr ""
-
-#: builtin/read-tree.c:119
-msgid "only empty the index"
-msgstr ""
-
-#: builtin/read-tree.c:121
-msgid "Merging"
-msgstr ""
-
-#: builtin/read-tree.c:123
-msgid "perform a merge in addition to a read"
-msgstr ""
-
-#: builtin/read-tree.c:125
-msgid "3-way merge if no file level merging required"
-msgstr ""
-
-#: builtin/read-tree.c:127
-msgid "3-way merge in presence of adds and removes"
-msgstr ""
-
-#: builtin/read-tree.c:129
-msgid "same as -m, but discard unmerged entries"
-msgstr ""
-
-#: builtin/read-tree.c:130
-msgid "<subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:131
-msgid "read the tree into the index under <subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:134
-msgid "update working tree with merge result"
-msgstr ""
-
-#: builtin/read-tree.c:136
-msgid "gitignore"
-msgstr ""
-
-#: builtin/read-tree.c:137
-msgid "allow explicitly ignored files to be overwritten"
-msgstr ""
-
-#: builtin/read-tree.c:140
-msgid "don't check the working tree after merging"
-msgstr ""
-
-#: builtin/read-tree.c:141
-msgid "don't update the index or the work tree"
-msgstr ""
-
-#: builtin/read-tree.c:143
-msgid "skip applying sparse checkout filter"
-msgstr ""
-
-#: builtin/read-tree.c:145
-msgid "debug unpack-trees"
-msgstr ""
-
-#: builtin/read-tree.c:149
-msgid "suppress feedback messages"
-msgstr ""
-
-#: builtin/read-tree.c:190
-msgid "You need to resolve your current index first"
-msgstr ""
-
-#: builtin/rebase.c:36
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] "
-"[<upstream> [<branch>]]"
-msgstr ""
-
-#: builtin/rebase.c:38
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]"
-msgstr ""
-
-#: builtin/rebase.c:231
-#, c-format
-msgid "could not create temporary %s"
-msgstr ""
-
-#: builtin/rebase.c:237
-msgid "could not mark as interactive"
-msgstr ""
-
-#: builtin/rebase.c:290
-msgid "could not generate todo list"
-msgstr ""
-
-#: builtin/rebase.c:332
-msgid "a base commit must be provided with --upstream or --onto"
-msgstr ""
-
-#: builtin/rebase.c:391
-#, c-format
-msgid "%s requires the merge backend"
-msgstr ""
-
-#: builtin/rebase.c:433
-#, c-format
-msgid "could not get 'onto': '%s'"
-msgstr ""
-
-#: builtin/rebase.c:450
-#, c-format
-msgid "invalid orig-head: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:475
-#, c-format
-msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:600
-msgid ""
-"Resolve all conflicts manually, mark them as resolved with\n"
-"\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
-"You can instead skip this commit: run \"git rebase --skip\".\n"
-"To abort and get back to the state before \"git rebase\", run \"git rebase --"
-"abort\"."
-msgstr ""
-
-#: builtin/rebase.c:685
-#, c-format
-msgid ""
-"\n"
-"git encountered an error while preparing the patches to replay\n"
-"these revisions:\n"
-"\n"
-"    %s\n"
-"\n"
-"As a result, git cannot rebase them."
-msgstr ""
-
-#: builtin/rebase.c:836
-#, c-format
-msgid "could not switch to %s"
-msgstr ""
-
-#: builtin/rebase.c:952
-#, c-format
-msgid ""
-"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
-"\"."
-msgstr ""
-
-#: builtin/rebase.c:970
-#, c-format
-msgid ""
-"%s\n"
-"Please specify which branch you want to rebase against.\n"
-"See git-rebase(1) for details.\n"
-"\n"
-"    git rebase '<branch>'\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:986
-#, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:1016
-msgid "exec commands cannot contain newlines"
-msgstr ""
-
-#: builtin/rebase.c:1020
-msgid "empty exec command"
-msgstr ""
-
-#: builtin/rebase.c:1051
-msgid "rebase onto given branch instead of upstream"
-msgstr ""
-
-#: builtin/rebase.c:1053
-msgid "use the merge-base of upstream and branch as the current base"
-msgstr ""
-
-#: builtin/rebase.c:1055
-msgid "allow pre-rebase hook to run"
-msgstr ""
-
-#: builtin/rebase.c:1057
-msgid "be quiet. implies --no-stat"
-msgstr ""
-
-#: builtin/rebase.c:1060
-msgid "display a diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1063
-msgid "do not show diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1066
-msgid "add a Signed-off-by trailer to each commit"
-msgstr ""
-
-#: builtin/rebase.c:1069
-msgid "make committer date match author date"
-msgstr ""
-
-#: builtin/rebase.c:1071
-msgid "ignore author date and use current date"
-msgstr ""
-
-#: builtin/rebase.c:1073
-msgid "synonym of --reset-author-date"
-msgstr ""
-
-#: builtin/rebase.c:1075 builtin/rebase.c:1079
-msgid "passed to 'git apply'"
-msgstr ""
-
-#: builtin/rebase.c:1077
-msgid "ignore changes in whitespace"
-msgstr ""
-
-#: builtin/rebase.c:1081 builtin/rebase.c:1084
-msgid "cherry-pick all commits, even if unchanged"
-msgstr ""
-
-#: builtin/rebase.c:1086
-msgid "continue"
-msgstr ""
-
-#: builtin/rebase.c:1089
-msgid "skip current patch and continue"
-msgstr ""
-
-#: builtin/rebase.c:1091
-msgid "abort and check out the original branch"
-msgstr ""
-
-#: builtin/rebase.c:1094
-msgid "abort but keep HEAD where it is"
-msgstr ""
-
-#: builtin/rebase.c:1095
-msgid "edit the todo list during an interactive rebase"
-msgstr ""
-
-#: builtin/rebase.c:1098
-msgid "show the patch file being applied or merged"
-msgstr ""
-
-#: builtin/rebase.c:1101
-msgid "use apply strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1105
-msgid "use merging strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1109
-msgid "let the user edit the list of commits to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1113
-msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
-msgstr ""
-
-#: builtin/rebase.c:1118
-msgid "how to handle commits that become empty"
-msgstr ""
-
-#: builtin/rebase.c:1121
-msgid "keep commits which start empty"
-msgstr ""
-
-#: builtin/rebase.c:1125
-msgid "move commits that begin with squash!/fixup! under -i"
-msgstr ""
-
-#: builtin/rebase.c:1132
-msgid "add exec lines after each commit of the editable list"
-msgstr ""
-
-#: builtin/rebase.c:1136
-msgid "allow rebasing commits with empty messages"
-msgstr ""
-
-#: builtin/rebase.c:1140
-msgid "try to rebase merges instead of skipping them"
-msgstr ""
-
-#: builtin/rebase.c:1143
-msgid "use 'merge-base --fork-point' to refine upstream"
-msgstr ""
-
-#: builtin/rebase.c:1145
-msgid "use the given merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1147 builtin/revert.c:115
-msgid "option"
-msgstr ""
-
-#: builtin/rebase.c:1148
-msgid "pass the argument through to the merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1151
-msgid "rebase all reachable commits up to the root(s)"
-msgstr ""
-
-#: builtin/rebase.c:1154
-msgid "automatically re-schedule any `exec` that fails"
-msgstr ""
-
-#: builtin/rebase.c:1156
-msgid "apply all changes, even those already present upstream"
-msgstr ""
-
-#: builtin/rebase.c:1177
-msgid "It looks like 'git am' is in progress. Cannot rebase."
-msgstr ""
-
-#: builtin/rebase.c:1208
-msgid "--preserve-merges was replaced by --rebase-merges"
-msgstr ""
-
-#: builtin/rebase.c:1230
-msgid "No rebase in progress?"
-msgstr ""
-
-#: builtin/rebase.c:1234
-msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
-
-#: builtin/rebase.c:1257 t/helper/test-fast-rebase.c:122
-msgid "Cannot read HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1269
-msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
-msgstr ""
-
-#: builtin/rebase.c:1287
-msgid "could not discard worktree changes"
-msgstr ""
-
-#: builtin/rebase.c:1308
-#, c-format
-msgid "could not move back to %s"
-msgstr ""
-
-#: builtin/rebase.c:1354
-#, c-format
-msgid ""
-"It seems that there is already a %s directory, and\n"
-"I wonder if you are in the middle of another rebase.  If that is the\n"
-"case, please try\n"
-"\t%s\n"
-"If that is not the case, please\n"
-"\t%s\n"
-"and run me again.  I am stopping in case you still have something\n"
-"valuable there.\n"
-msgstr ""
-
-#: builtin/rebase.c:1382
-msgid "switch `C' expects a numerical value"
-msgstr ""
-
-#: builtin/rebase.c:1424
-#, c-format
-msgid "Unknown mode: %s"
-msgstr ""
-
-#: builtin/rebase.c:1463
-msgid "--strategy requires --merge or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1492
-msgid "apply options and merge options cannot be used together"
-msgstr ""
-
-#: builtin/rebase.c:1505
-#, c-format
-msgid "Unknown rebase backend: %s"
-msgstr ""
-
-#: builtin/rebase.c:1534
-msgid "--reschedule-failed-exec requires --exec or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1565
-#, c-format
-msgid "invalid upstream '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1571
-msgid "Could not create new root commit"
-msgstr ""
-
-#: builtin/rebase.c:1597
-#, c-format
-msgid "'%s': need exactly one merge base with branch"
-msgstr ""
-
-#: builtin/rebase.c:1600
-#, c-format
-msgid "'%s': need exactly one merge base"
-msgstr ""
-
-#: builtin/rebase.c:1609
-#, c-format
-msgid "Does not point to a valid commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1636
-#, c-format
-msgid "no such branch/commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1647 builtin/submodule--helper.c:43
-#: builtin/submodule--helper.c:2477
-#, c-format
-msgid "No such ref: %s"
-msgstr ""
-
-#: builtin/rebase.c:1658
-msgid "Could not resolve HEAD to a revision"
-msgstr ""
-
-#: builtin/rebase.c:1679
-msgid "Please commit or stash them."
-msgstr ""
-
-#: builtin/rebase.c:1714
-msgid "HEAD is up to date."
-msgstr ""
-
-#: builtin/rebase.c:1716
-#, c-format
-msgid "Current branch %s is up to date.\n"
-msgstr ""
-
-#: builtin/rebase.c:1724
-msgid "HEAD is up to date, rebase forced."
-msgstr ""
-
-#: builtin/rebase.c:1726
-#, c-format
-msgid "Current branch %s is up to date, rebase forced.\n"
-msgstr ""
-
-#: builtin/rebase.c:1734
-msgid "The pre-rebase hook refused to rebase."
-msgstr ""
-
-#: builtin/rebase.c:1741
-#, c-format
-msgid "Changes to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1744
-#, c-format
-msgid "Changes from %s to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1769
-#, c-format
-msgid "First, rewinding head to replay your work on top of it...\n"
-msgstr ""
-
-#: builtin/rebase.c:1781
-msgid "Could not detach HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1790
-#, c-format
-msgid "Fast-forwarded %s to %s.\n"
-msgstr ""
-
-#: builtin/receive-pack.c:35
-msgid "git receive-pack <git-dir>"
-msgstr ""
-
-#: builtin/receive-pack.c:1263
-msgid ""
-"By default, updating the current branch in a non-bare repository\n"
-"is denied, because it will make the index and work tree inconsistent\n"
-"with what you pushed, and will require 'git reset --hard' to match\n"
-"the work tree to HEAD.\n"
-"\n"
-"You can set the 'receive.denyCurrentBranch' configuration variable\n"
-"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
-"its current branch; however, this is not recommended unless you\n"
-"arranged to update its work tree to match what you pushed in some\n"
-"other way.\n"
-"\n"
-"To squelch this message and still keep the default behaviour, set\n"
-"'receive.denyCurrentBranch' configuration variable to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:1283
-msgid ""
-"By default, deleting the current branch is denied, because the next\n"
-"'git clone' won't result in any file checked out, causing confusion.\n"
-"\n"
-"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
-"'warn' or 'ignore' in the remote repository to allow deleting the\n"
-"current branch, with or without a warning message.\n"
-"\n"
-"To squelch this message, you can set it to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:2476
-msgid "quiet"
-msgstr ""
-
-#: builtin/receive-pack.c:2491
-msgid "you must specify a directory"
-msgstr ""
-
-#: builtin/reflog.c:9
-msgid "git reflog [show] [<log-options>] [<ref>]"
-msgstr ""
-
-#: builtin/reflog.c:12
-msgid ""
-"git reflog expire [--expire=<time>] [--expire-unreachable=<time>]\n"
-"                  [--rewrite] [--updateref] [--stale-fix]\n"
-"                  [--dry-run | -n] [--verbose] [--all [--single-worktree] | "
-"<refs>...]"
-msgstr ""
-
-#: builtin/reflog.c:17
-msgid ""
-"git reflog delete [--rewrite] [--updateref]\n"
-"                  [--dry-run | -n] [--verbose] <ref>@{<specifier>}..."
-msgstr ""
-
-#: builtin/reflog.c:21
-msgid "git reflog exists <ref>"
-msgstr ""
-
-#: builtin/reflog.c:197 builtin/reflog.c:211
-#, c-format
-msgid "invalid timestamp '%s' given to '--%s'"
-msgstr ""
-
-#: builtin/reflog.c:240 builtin/reflog.c:359
-msgid "do not actually prune any entries"
-msgstr ""
-
-#: builtin/reflog.c:243 builtin/reflog.c:362
-msgid ""
-"rewrite the old SHA1 with the new SHA1 of the entry that now precedes it"
-msgstr ""
-
-#: builtin/reflog.c:246 builtin/reflog.c:365
-msgid "update the reference to the value of the top reflog entry"
-msgstr ""
-
-#: builtin/reflog.c:248 builtin/reflog.c:367
-msgid "print extra information on screen"
-msgstr ""
-
-#: builtin/reflog.c:249 builtin/reflog.c:253
-msgid "timestamp"
-msgstr ""
-
-#: builtin/reflog.c:250
-msgid "prune entries older than the specified time"
-msgstr ""
-
-#: builtin/reflog.c:254
-msgid ""
-"prune entries older than <time> that are not reachable from the current tip "
-"of the branch"
-msgstr ""
-
-#: builtin/reflog.c:258
-msgid "prune any reflog entries that point to broken commits"
-msgstr ""
-
-#: builtin/reflog.c:259
-msgid "process the reflogs of all references"
-msgstr ""
-
-#: builtin/reflog.c:261
-msgid "limits processing to reflogs from the current worktree only"
-msgstr ""
-
-#: builtin/reflog.c:294
-#, c-format
-msgid "Marking reachable objects..."
-msgstr ""
-
-#: builtin/reflog.c:338
-#, c-format
-msgid "%s points nowhere!"
-msgstr ""
-
-#: builtin/reflog.c:374
-msgid "no reflog specified to delete"
-msgstr ""
-
-#: builtin/reflog.c:396
-#, c-format
-msgid "invalid ref format: %s"
-msgstr ""
-
-#: builtin/remote.c:19
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:20 builtin/remote.c:40
-msgid "git remote rename [--[no-]progress] <old> <new>"
-msgstr ""
-
-#: builtin/remote.c:21 builtin/remote.c:45
-msgid "git remote remove <name>"
-msgstr ""
-
-#: builtin/remote.c:22 builtin/remote.c:50
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr ""
-
-#: builtin/remote.c:23
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr ""
-
-#: builtin/remote.c:24
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr ""
-
-#: builtin/remote.c:25
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
-
-#: builtin/remote.c:26
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:27 builtin/remote.c:76
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr ""
-
-#: builtin/remote.c:28 builtin/remote.c:81
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr ""
-
-#: builtin/remote.c:29 builtin/remote.c:82
-msgid "git remote set-url --add <name> <newurl>"
-msgstr ""
-
-#: builtin/remote.c:30 builtin/remote.c:83
-msgid "git remote set-url --delete <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:35
-msgid "git remote add [<options>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:55
-msgid "git remote set-branches <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:56
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:61
-msgid "git remote show [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:66
-msgid "git remote prune [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:71
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr ""
-
-#: builtin/remote.c:100
-#, c-format
-msgid "Updating %s"
-msgstr ""
-
-#: builtin/remote.c:102
-#, c-format
-msgid "Could not fetch %s"
-msgstr ""
-
-#: builtin/remote.c:132
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
-msgstr ""
-
-#: builtin/remote.c:149
-#, c-format
-msgid "unknown mirror argument: %s"
-msgstr ""
-
-#: builtin/remote.c:165
-msgid "fetch the remote branches"
-msgstr ""
-
-#: builtin/remote.c:167
-msgid "import all tags and associated objects when fetching"
-msgstr ""
-
-#: builtin/remote.c:170
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr ""
-
-#: builtin/remote.c:172
-msgid "branch(es) to track"
-msgstr ""
-
-#: builtin/remote.c:173
-msgid "master branch"
-msgstr ""
-
-#: builtin/remote.c:175
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr ""
-
-#: builtin/remote.c:187
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr ""
-
-#: builtin/remote.c:189
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr ""
-
-#: builtin/remote.c:196 builtin/remote.c:716
-#, c-format
-msgid "remote %s already exists."
-msgstr ""
-
-#: builtin/remote.c:241
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr ""
-
-#: builtin/remote.c:323
-#, c-format
-msgid "unhandled branch.%s.rebase=%s; assuming 'true'"
-msgstr ""
-
-#: builtin/remote.c:367
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr ""
-
-#: builtin/remote.c:461 builtin/remote.c:469
-msgid "(matching)"
-msgstr ""
-
-#: builtin/remote.c:473
-msgid "(delete)"
-msgstr ""
-
-#: builtin/remote.c:664
-#, c-format
-msgid "could not set '%s'"
-msgstr ""
-
-#: builtin/remote.c:669
-#, c-format
-msgid ""
-"The %s configuration remote.pushDefault in:\n"
-"\t%s:%d\n"
-"now names the non-existent remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:707 builtin/remote.c:866 builtin/remote.c:973
-#, c-format
-msgid "No such remote: '%s'"
-msgstr ""
-
-#: builtin/remote.c:726
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr ""
-
-#: builtin/remote.c:746
-#, c-format
-msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
-msgstr ""
-
-#: builtin/remote.c:783
-msgid "Renaming remote references"
-msgstr ""
-
-#: builtin/remote.c:794
-#, c-format
-msgid "deleting '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:832
-#, c-format
-msgid "creating '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:912
-msgid ""
-"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
-"to delete it, use:"
-msgid_plural ""
-"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
-"to delete them, use:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:926
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr ""
-
-#: builtin/remote.c:1034
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
-msgstr ""
-
-#: builtin/remote.c:1037
-msgid " tracked"
-msgstr ""
-
-#: builtin/remote.c:1039
-msgid " stale (use 'git remote prune' to remove)"
-msgstr ""
-
-#: builtin/remote.c:1041
-msgid " ???"
-msgstr ""
-
-#: builtin/remote.c:1082
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr ""
-
-#: builtin/remote.c:1091
-#, c-format
-msgid "rebases interactively onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1093
-#, c-format
-msgid "rebases interactively (with merges) onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1096
-#, c-format
-msgid "rebases onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1100
-#, c-format
-msgid " merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1103
-#, c-format
-msgid "merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1106
-#, c-format
-msgid "%-*s    and with remote %s\n"
-msgstr ""
-
-#: builtin/remote.c:1149
-msgid "create"
-msgstr ""
-
-#: builtin/remote.c:1152
-msgid "delete"
-msgstr ""
-
-#: builtin/remote.c:1156
-msgid "up to date"
-msgstr ""
-
-#: builtin/remote.c:1159
-msgid "fast-forwardable"
-msgstr ""
-
-#: builtin/remote.c:1162
-msgid "local out of date"
-msgstr ""
-
-#: builtin/remote.c:1169
-#, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1172
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1176
-#, c-format
-msgid "    %-*s forces to %s"
-msgstr ""
-
-#: builtin/remote.c:1179
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr ""
-
-#: builtin/remote.c:1247
-msgid "do not query remotes"
-msgstr ""
-
-#: builtin/remote.c:1268
-#, c-format
-msgid "* remote %s"
-msgstr ""
-
-#: builtin/remote.c:1269
-#, c-format
-msgid "  Fetch URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1270 builtin/remote.c:1286 builtin/remote.c:1423
-msgid "(no URL)"
-msgstr ""
-
-#. TRANSLATORS: the colon ':' should align
-#. with the one in " Fetch URL: %s"
-#. translation.
-#.
-#: builtin/remote.c:1284 builtin/remote.c:1286
-#, c-format
-msgid "  Push  URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1288 builtin/remote.c:1290 builtin/remote.c:1292
-#, c-format
-msgid "  HEAD branch: %s"
-msgstr ""
-
-#: builtin/remote.c:1288
-msgid "(not queried)"
-msgstr ""
-
-#: builtin/remote.c:1290
-msgid "(unknown)"
-msgstr ""
-
-#: builtin/remote.c:1294
-#, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr ""
-
-#: builtin/remote.c:1306
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1309 builtin/remote.c:1335
-msgid " (status not queried)"
-msgstr ""
-
-#: builtin/remote.c:1318
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1326
-msgid "  Local refs will be mirrored by 'git push'"
-msgstr ""
-
-#: builtin/remote.c:1332
-#, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1353
-msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr ""
-
-#: builtin/remote.c:1355
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr ""
-
-#: builtin/remote.c:1369
-msgid "Cannot determine remote HEAD"
-msgstr ""
-
-#: builtin/remote.c:1371
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
-msgstr ""
-
-#: builtin/remote.c:1381
-#, c-format
-msgid "Could not delete %s"
-msgstr ""
-
-#: builtin/remote.c:1389
-#, c-format
-msgid "Not a valid ref: %s"
-msgstr ""
-
-#: builtin/remote.c:1391
-#, c-format
-msgid "Could not setup %s"
-msgstr ""
-
-#: builtin/remote.c:1409
-#, c-format
-msgid " %s will become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1410
-#, c-format
-msgid " %s has become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1419
-#, c-format
-msgid "Pruning %s"
-msgstr ""
-
-#: builtin/remote.c:1420
-#, c-format
-msgid "URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1436
-#, c-format
-msgid " * [would prune] %s"
-msgstr ""
-
-#: builtin/remote.c:1439
-#, c-format
-msgid " * [pruned] %s"
-msgstr ""
-
-#: builtin/remote.c:1484
-msgid "prune remotes after fetching"
-msgstr ""
-
-#: builtin/remote.c:1548 builtin/remote.c:1604 builtin/remote.c:1674
-#, c-format
-msgid "No such remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1566
-msgid "add branch"
-msgstr ""
-
-#: builtin/remote.c:1573
-msgid "no remote specified"
-msgstr ""
-
-#: builtin/remote.c:1590
-msgid "query push URLs rather than fetch URLs"
-msgstr ""
-
-#: builtin/remote.c:1592
-msgid "return all URLs"
-msgstr ""
-
-#: builtin/remote.c:1622
-#, c-format
-msgid "no URLs configured for remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1648
-msgid "manipulate push URLs"
-msgstr ""
-
-#: builtin/remote.c:1650
-msgid "add URL"
-msgstr ""
-
-#: builtin/remote.c:1652
-msgid "delete URLs"
-msgstr ""
-
-#: builtin/remote.c:1659
-msgid "--add --delete doesn't make sense"
-msgstr ""
-
-#: builtin/remote.c:1700
-#, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr ""
-
-#: builtin/remote.c:1708
-#, c-format
-msgid "No such URL found: %s"
-msgstr ""
-
-#: builtin/remote.c:1710
-msgid "Will not delete all non-push URLs"
-msgstr ""
-
-#: builtin/remote.c:1727
-msgid "be verbose; must be placed before a subcommand"
-msgstr ""
-
-#: builtin/repack.c:29
-msgid "git repack [<options>]"
-msgstr ""
-
-#: builtin/repack.c:34
-msgid ""
-"Incremental repacks are incompatible with bitmap indexes.  Use\n"
-"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
-msgstr ""
-
-#: builtin/repack.c:206
-msgid "could not start pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:280 builtin/repack.c:824
-msgid "repack: Expecting full hex object ID lines only from pack-objects."
-msgstr ""
-
-#: builtin/repack.c:304
-msgid "could not finish pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:319
-#, c-format
-msgid "cannot open index for %s"
-msgstr ""
-
-#: builtin/repack.c:378
-#, c-format
-msgid "pack %s too large to consider in geometric progression"
-msgstr ""
-
-#: builtin/repack.c:411 builtin/repack.c:418 builtin/repack.c:423
-#, c-format
-msgid "pack %s too large to roll up"
-msgstr ""
-
-#: builtin/repack.c:503
-#, c-format
-msgid "could not open tempfile %s for writing"
-msgstr ""
-
-#: builtin/repack.c:521
-msgid "could not close refs snapshot tempfile"
-msgstr ""
-
-#: builtin/repack.c:634
-msgid "pack everything in a single pack"
-msgstr ""
-
-#: builtin/repack.c:636
-msgid "same as -a, and turn unreachable objects loose"
-msgstr ""
-
-#: builtin/repack.c:639
-msgid "remove redundant packs, and run git-prune-packed"
-msgstr ""
-
-#: builtin/repack.c:641
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:643
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:645
-msgid "do not run git-update-server-info"
-msgstr ""
-
-#: builtin/repack.c:648
-msgid "pass --local to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:650
-msgid "write bitmap index"
-msgstr ""
-
-#: builtin/repack.c:652
-msgid "pass --delta-islands to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:653
-msgid "approxidate"
-msgstr ""
-
-#: builtin/repack.c:654
-msgid "with -A, do not loosen objects older than this"
-msgstr ""
-
-#: builtin/repack.c:656
-msgid "with -a, repack unreachable objects"
-msgstr ""
-
-#: builtin/repack.c:658
-msgid "size of the window used for delta compression"
-msgstr ""
-
-#: builtin/repack.c:659 builtin/repack.c:665
-msgid "bytes"
-msgstr ""
-
-#: builtin/repack.c:660
-msgid "same as the above, but limit memory size instead of entries count"
-msgstr ""
-
-#: builtin/repack.c:662
-msgid "limits the maximum delta depth"
-msgstr ""
-
-#: builtin/repack.c:664
-msgid "limits the maximum number of threads"
-msgstr ""
-
-#: builtin/repack.c:666
-msgid "maximum size of each packfile"
-msgstr ""
-
-#: builtin/repack.c:668
-msgid "repack objects in packs marked with .keep"
-msgstr ""
-
-#: builtin/repack.c:670
-msgid "do not repack this pack"
-msgstr ""
-
-#: builtin/repack.c:672
-msgid "find a geometric progression with factor <N>"
-msgstr ""
-
-#: builtin/repack.c:674
-msgid "write a multi-pack index of the resulting packs"
-msgstr ""
-
-#: builtin/repack.c:684
-msgid "cannot delete packs in a precious-objects repo"
-msgstr ""
-
-#: builtin/repack.c:833
-msgid "Nothing new to pack."
-msgstr ""
-
-#: builtin/repack.c:863
-#, c-format
-msgid "missing required file: %s"
-msgstr ""
-
-#: builtin/repack.c:865
-#, c-format
-msgid "could not unlink: %s"
-msgstr ""
-
-#: builtin/replace.c:22
-msgid "git replace [-f] <object> <replacement>"
-msgstr ""
-
-#: builtin/replace.c:23
-msgid "git replace [-f] --edit <object>"
-msgstr ""
-
-#: builtin/replace.c:24
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr ""
-
-#: builtin/replace.c:26
-msgid "git replace -d <object>..."
-msgstr ""
-
-#: builtin/replace.c:27
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr ""
-
-#: builtin/replace.c:90
-#, c-format
-msgid ""
-"invalid replace format '%s'\n"
-"valid formats are 'short', 'medium' and 'long'"
-msgstr ""
-
-#: builtin/replace.c:125
-#, c-format
-msgid "replace ref '%s' not found"
-msgstr ""
-
-#: builtin/replace.c:141
-#, c-format
-msgid "Deleted replace ref '%s'"
-msgstr ""
-
-#: builtin/replace.c:153
-#, c-format
-msgid "'%s' is not a valid ref name"
-msgstr ""
-
-#: builtin/replace.c:158
-#, c-format
-msgid "replace ref '%s' already exists"
-msgstr ""
-
-#: builtin/replace.c:178
-#, c-format
-msgid ""
-"Objects must be of the same type.\n"
-"'%s' points to a replaced object of type '%s'\n"
-"while '%s' points to a replacement object of type '%s'."
-msgstr ""
-
-#: builtin/replace.c:229
-#, c-format
-msgid "unable to open %s for writing"
-msgstr ""
-
-#: builtin/replace.c:242
-msgid "cat-file reported failure"
-msgstr ""
-
-#: builtin/replace.c:258
-#, c-format
-msgid "unable to open %s for reading"
-msgstr ""
-
-#: builtin/replace.c:271
-msgid "unable to spawn mktree"
-msgstr ""
-
-#: builtin/replace.c:275
-msgid "unable to read from mktree"
-msgstr ""
-
-#: builtin/replace.c:284
-msgid "mktree reported failure"
-msgstr ""
-
-#: builtin/replace.c:288
-msgid "mktree did not return an object name"
-msgstr ""
-
-#: builtin/replace.c:297
-#, c-format
-msgid "unable to fstat %s"
-msgstr ""
-
-#: builtin/replace.c:302
-msgid "unable to write object to database"
-msgstr ""
-
-#: builtin/replace.c:325
-#, c-format
-msgid "unable to get object type for %s"
-msgstr ""
-
-#: builtin/replace.c:341
-msgid "editing object file failed"
-msgstr ""
-
-#: builtin/replace.c:350
-#, c-format
-msgid "new object is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:383
-#, c-format
-msgid "could not parse %s as a commit"
-msgstr ""
-
-#: builtin/replace.c:415
-#, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:417
-#, c-format
-msgid "malformed mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:429
-#, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
-msgstr ""
-
-#: builtin/replace.c:468
-#, c-format
-msgid "the original commit '%s' has a gpg signature"
-msgstr ""
-
-#: builtin/replace.c:469
-msgid "the signature will be removed in the replacement commit!"
-msgstr ""
-
-#: builtin/replace.c:479
-#, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr ""
-
-#: builtin/replace.c:487
-#, c-format
-msgid "graft for '%s' unnecessary"
-msgstr ""
-
-#: builtin/replace.c:491
-#, c-format
-msgid "new commit is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:526
-#, c-format
-msgid ""
-"could not convert the following graft(s):\n"
-"%s"
-msgstr ""
-
-#: builtin/replace.c:547
-msgid "list replace refs"
-msgstr ""
-
-#: builtin/replace.c:548
-msgid "delete replace refs"
-msgstr ""
-
-#: builtin/replace.c:549
-msgid "edit existing object"
-msgstr ""
-
-#: builtin/replace.c:550
-msgid "change a commit's parents"
-msgstr ""
-
-#: builtin/replace.c:551
-msgid "convert existing graft file"
-msgstr ""
-
-#: builtin/replace.c:552
-msgid "replace the ref if it exists"
-msgstr ""
-
-#: builtin/replace.c:554
-msgid "do not pretty-print contents for --edit"
-msgstr ""
-
-#: builtin/replace.c:555
-msgid "use this format"
-msgstr ""
-
-#: builtin/replace.c:568
-msgid "--format cannot be used when not listing"
-msgstr ""
-
-#: builtin/replace.c:576
-msgid "-f only makes sense when writing a replacement"
-msgstr ""
-
-#: builtin/replace.c:580
-msgid "--raw only makes sense with --edit"
-msgstr ""
-
-#: builtin/replace.c:586
-msgid "-d needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:592
-msgid "bad number of arguments"
-msgstr ""
-
-#: builtin/replace.c:598
-msgid "-e needs exactly one argument"
-msgstr ""
-
-#: builtin/replace.c:604
-msgid "-g needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:610
-msgid "--convert-graft-file takes no argument"
-msgstr ""
-
-#: builtin/replace.c:616
-msgid "only one pattern can be given with -l"
-msgstr ""
-
-#: builtin/rerere.c:13
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr ""
-
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr ""
-
-#: builtin/rerere.c:77
-msgid "'git rerere forget' without paths is deprecated"
-msgstr ""
-
-#: builtin/rerere.c:111
-#, c-format
-msgid "unable to generate diff for '%s'"
-msgstr ""
-
-#: builtin/reset.c:33
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
-msgstr ""
-
-#: builtin/reset.c:34
-msgid "git reset [-q] [<tree-ish>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/reset.c:35
-msgid ""
-"git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]"
-msgstr ""
-
-#: builtin/reset.c:36
-msgid "git reset --patch [<tree-ish>] [--] [<pathspec>...]"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "mixed"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "soft"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "hard"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "merge"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "keep"
-msgstr ""
-
-#: builtin/reset.c:90
-msgid "You do not have a valid HEAD."
-msgstr ""
-
-#: builtin/reset.c:92
-msgid "Failed to find tree of HEAD."
-msgstr ""
-
-#: builtin/reset.c:98
-#, c-format
-msgid "Failed to find tree of %s."
-msgstr ""
-
-#: builtin/reset.c:123
-#, c-format
-msgid "HEAD is now at %s"
-msgstr ""
-
-#: builtin/reset.c:304
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
-
-#: builtin/reset.c:402 builtin/stash.c:606 builtin/stash.c:669
-#: builtin/stash.c:693
-msgid "be quiet, only report errors"
-msgstr ""
-
-#: builtin/reset.c:404
-msgid "skip refreshing the index after reset"
-msgstr ""
-
-#: builtin/reset.c:406
-msgid "reset HEAD and index"
-msgstr ""
-
-#: builtin/reset.c:407
-msgid "reset only HEAD"
-msgstr ""
-
-#: builtin/reset.c:409 builtin/reset.c:411
-msgid "reset HEAD, index and working tree"
-msgstr ""
-
-#: builtin/reset.c:413
-msgid "reset HEAD but keep local changes"
-msgstr ""
-
-#: builtin/reset.c:419
-msgid "record only the fact that removed paths will be added later"
-msgstr ""
-
-#: builtin/reset.c:452
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
-
-#: builtin/reset.c:460
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
-
-#: builtin/reset.c:479
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-
-#: builtin/reset.c:481
-#, c-format
-msgid "Cannot do %s reset with paths."
-msgstr ""
-
-#: builtin/reset.c:496
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr ""
-
-#: builtin/reset.c:527
-msgid "Unstaged changes after reset:"
-msgstr ""
-
-#: builtin/reset.c:530
-#, c-format
-msgid ""
-"It took %.2f seconds to refresh the index after reset.  You can use\n"
-"'--no-refresh' to avoid this."
-msgstr ""
-
-#: builtin/reset.c:547
-#, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr ""
-
-#: builtin/reset.c:552
-msgid "Could not write new index file."
-msgstr ""
-
-#: builtin/rev-list.c:659
-msgid "rev-list does not support display of notes"
-msgstr ""
-
-#: builtin/rev-list.c:664
-#, c-format
-msgid "marked counting and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/rev-parse.c:409
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr ""
-
-#: builtin/rev-parse.c:414
-msgid "keep the `--` passed as an arg"
-msgstr ""
-
-#: builtin/rev-parse.c:416
-msgid "stop parsing after the first non-option argument"
-msgstr ""
-
-#: builtin/rev-parse.c:419
-msgid "output in stuck long form"
-msgstr ""
-
-#: builtin/rev-parse.c:438
-msgid "premature end of input"
-msgstr ""
-
-#: builtin/rev-parse.c:442
-msgid "no usage string given before the `--' separator"
-msgstr ""
-
-#: builtin/rev-parse.c:548
-msgid "Needed a single revision"
-msgstr ""
-
-#: builtin/rev-parse.c:552
-msgid ""
-"git rev-parse --parseopt [<options>] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [<options>] [<arg>...]\n"
-"\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
-msgstr ""
-
-#: builtin/rev-parse.c:712
-msgid "--resolve-git-dir requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:715
-#, c-format
-msgid "not a gitdir '%s'"
-msgstr ""
-
-#: builtin/rev-parse.c:739
-msgid "--git-path requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:749
-msgid "-n requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:763
-msgid "--path-format requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:769
-#, c-format
-msgid "unknown argument to --path-format: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:776
-msgid "--default requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:782
-msgid "--prefix requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:851
-#, c-format
-msgid "unknown mode for --abbrev-ref: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:1023
-#, c-format
-msgid "unknown mode for --show-object-format: %s"
-msgstr ""
-
-#: builtin/revert.c:24
-msgid "git revert [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:25
-msgid "git revert <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:30
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:31
-msgid "git cherry-pick <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:72
-#, c-format
-msgid "option `%s' expects a number greater than zero"
-msgstr ""
-
-#: builtin/revert.c:92
-#, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr ""
-
-#: builtin/revert.c:102
-msgid "end revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:103
-msgid "resume revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:104
-msgid "cancel revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:105
-msgid "skip current commit and continue"
-msgstr ""
-
-#: builtin/revert.c:107
-msgid "don't automatically commit"
-msgstr ""
-
-#: builtin/revert.c:108
-msgid "edit the commit message"
-msgstr ""
-
-#: builtin/revert.c:111
-msgid "parent-number"
-msgstr ""
-
-#: builtin/revert.c:112
-msgid "select mainline parent"
-msgstr ""
-
-#: builtin/revert.c:114
-msgid "merge strategy"
-msgstr ""
-
-#: builtin/revert.c:116
-msgid "option for merge strategy"
-msgstr ""
-
-#: builtin/revert.c:125
-msgid "append commit name"
-msgstr ""
-
-#: builtin/revert.c:127
-msgid "preserve initially empty commits"
-msgstr ""
-
-#: builtin/revert.c:128
-msgid "allow commits with empty messages"
-msgstr ""
-
-#: builtin/revert.c:129
-msgid "keep redundant, empty commits"
-msgstr ""
-
-#: builtin/revert.c:241
-msgid "revert failed"
-msgstr ""
-
-#: builtin/revert.c:254
-msgid "cherry-pick failed"
-msgstr ""
-
-#: builtin/rm.c:20
-msgid "git rm [<options>] [--] <file>..."
-msgstr ""
-
-#: builtin/rm.c:208
-msgid ""
-"the following file has staged content different from both the\n"
-"file and the HEAD:"
-msgid_plural ""
-"the following files have staged content different from both the\n"
-"file and the HEAD:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:213
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:217
-msgid "the following file has changes staged in the index:"
-msgid_plural "the following files have changes staged in the index:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:221 builtin/rm.c:230
-msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:227
-msgid "the following file has local modifications:"
-msgid_plural "the following files have local modifications:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:245
-msgid "do not list removed files"
-msgstr ""
-
-#: builtin/rm.c:246
-msgid "only remove from the index"
-msgstr ""
-
-#: builtin/rm.c:247
-msgid "override the up-to-date check"
-msgstr ""
-
-#: builtin/rm.c:248
-msgid "allow recursive removal"
-msgstr ""
-
-#: builtin/rm.c:250
-msgid "exit with a zero status even if nothing matched"
-msgstr ""
-
-#: builtin/rm.c:285
-msgid "No pathspec was given. Which files should I remove?"
-msgstr ""
-
-#: builtin/rm.c:315
-msgid "please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/rm.c:337
-#, c-format
-msgid "not removing '%s' recursively without -r"
-msgstr ""
-
-#: builtin/rm.c:385
-#, c-format
-msgid "git rm: unable to remove %s"
-msgstr ""
-
-#: builtin/send-pack.c:20
-msgid ""
-"git send-pack [--mirror] [--dry-run] [--force]\n"
-"              [--receive-pack=<git-receive-pack>]\n"
-"              [--verbose] [--thin] [--atomic]\n"
-"              [<host>:]<directory> (--all | <ref>...)"
-msgstr ""
-
-#: builtin/send-pack.c:192
-msgid "remote name"
-msgstr ""
-
-#: builtin/send-pack.c:205
-msgid "use stateless RPC protocol"
-msgstr ""
-
-#: builtin/send-pack.c:206
-msgid "read refs from stdin"
-msgstr ""
-
-#: builtin/send-pack.c:207
-msgid "print status from remote helper"
-msgstr ""
-
-#: builtin/shortlog.c:16
-msgid "git shortlog [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/shortlog.c:17
-msgid "git log --pretty=short | git shortlog [<options>]"
-msgstr ""
-
-#: builtin/shortlog.c:123
-msgid "using multiple --group options with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:133
-msgid "using --group=trailer with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:323
-#, c-format
-msgid "unknown group type: %s"
-msgstr ""
-
-#: builtin/shortlog.c:351
-msgid "group by committer rather than author"
-msgstr ""
-
-#: builtin/shortlog.c:354
-msgid "sort output according to the number of commits per author"
-msgstr ""
-
-#: builtin/shortlog.c:356
-msgid "suppress commit descriptions, only provides commit count"
-msgstr ""
-
-#: builtin/shortlog.c:358
-msgid "show the email address of each author"
-msgstr ""
-
-#: builtin/shortlog.c:359
-msgid "<w>[,<i1>[,<i2>]]"
-msgstr ""
-
-#: builtin/shortlog.c:360
-msgid "linewrap output"
-msgstr ""
-
-#: builtin/shortlog.c:362
-msgid "field"
-msgstr ""
-
-#: builtin/shortlog.c:363
-msgid "group by field"
-msgstr ""
-
-#: builtin/shortlog.c:395
-msgid "too many arguments given outside repository"
-msgstr ""
-
-#: builtin/show-branch.c: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>)...]"
-msgstr ""
-
-#: builtin/show-branch.c:18
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr ""
-
-#: builtin/show-branch.c:396
-#, c-format
-msgid "ignoring %s; cannot handle more than %d ref"
-msgid_plural "ignoring %s; cannot handle more than %d refs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:548
-#, c-format
-msgid "no matching refs with %s"
-msgstr ""
-
-#: builtin/show-branch.c:645
-msgid "show remote-tracking and local branches"
-msgstr ""
-
-#: builtin/show-branch.c:647
-msgid "show remote-tracking branches"
-msgstr ""
-
-#: builtin/show-branch.c:649
-msgid "color '*!+-' corresponding to the branch"
-msgstr ""
-
-#: builtin/show-branch.c:651
-msgid "show <n> more commits after the common ancestor"
-msgstr ""
-
-#: builtin/show-branch.c:653
-msgid "synonym to more=-1"
-msgstr ""
-
-#: builtin/show-branch.c:654
-msgid "suppress naming strings"
-msgstr ""
-
-#: builtin/show-branch.c:656
-msgid "include the current branch"
-msgstr ""
-
-#: builtin/show-branch.c:658
-msgid "name commits with their object names"
-msgstr ""
-
-#: builtin/show-branch.c:660
-msgid "show possible merge bases"
-msgstr ""
-
-#: builtin/show-branch.c:662
-msgid "show refs unreachable from any other ref"
-msgstr ""
-
-#: builtin/show-branch.c:664
-msgid "show commits in topological order"
-msgstr ""
-
-#: builtin/show-branch.c:667
-msgid "show only commits not on the first branch"
-msgstr ""
-
-#: builtin/show-branch.c:669
-msgid "show merges reachable from only one tip"
-msgstr ""
-
-#: builtin/show-branch.c:671
-msgid "topologically sort, maintaining date order where possible"
-msgstr ""
-
-#: builtin/show-branch.c:674
-msgid "<n>[,<base>]"
-msgstr ""
-
-#: builtin/show-branch.c:675
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr ""
-
-#: builtin/show-branch.c:735
-msgid "no branches given, and HEAD is not valid"
-msgstr ""
-
-#: builtin/show-branch.c:738
-msgid "--reflog option needs one branch name"
-msgstr ""
-
-#: builtin/show-branch.c:741
-#, c-format
-msgid "only %d entry can be shown at one time."
-msgid_plural "only %d entries can be shown at one time."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:745
-#, c-format
-msgid "no such ref %s"
-msgstr ""
-
-#: builtin/show-branch.c:831
-#, c-format
-msgid "cannot handle more than %d rev."
-msgid_plural "cannot handle more than %d revs."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:835
-#, c-format
-msgid "'%s' is not a valid ref."
-msgstr ""
-
-#: builtin/show-branch.c:838
-#, c-format
-msgid "cannot find commit %s (%s)"
-msgstr ""
-
-#: builtin/show-index.c:21
-msgid "hash-algorithm"
-msgstr ""
-
-#: builtin/show-index.c:31
-msgid "Unknown hash algorithm"
-msgstr ""
-
-#: builtin/show-ref.c:12
-msgid ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
-msgstr ""
-
-#: builtin/show-ref.c:13
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr ""
-
-#: builtin/show-ref.c:162
-msgid "only show tags (can be combined with heads)"
-msgstr ""
-
-#: builtin/show-ref.c:163
-msgid "only show heads (can be combined with tags)"
-msgstr ""
-
-#: builtin/show-ref.c:164
-msgid "stricter reference checking, requires exact ref path"
-msgstr ""
-
-#: builtin/show-ref.c:167 builtin/show-ref.c:169
-msgid "show the HEAD reference, even if it would be filtered out"
-msgstr ""
-
-#: builtin/show-ref.c:171
-msgid "dereference tags into object IDs"
-msgstr ""
-
-#: builtin/show-ref.c:173
-msgid "only show SHA1 hash using <n> digits"
-msgstr ""
-
-#: builtin/show-ref.c:177
-msgid "do not print results to stdout (useful with --verify)"
-msgstr ""
-
-#: builtin/show-ref.c:179
-msgid "show refs from stdin that aren't in local repository"
-msgstr ""
-
-#: builtin/sparse-checkout.c:23
-msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
-msgstr ""
-
-#: builtin/sparse-checkout.c:61
-msgid "this worktree is not sparse"
-msgstr ""
-
-#: builtin/sparse-checkout.c:76
-msgid "this worktree is not sparse (sparse-checkout file may not exist)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:177
-#, c-format
-msgid ""
-"directory '%s' contains untracked files, but is not in the sparse-checkout "
-"cone"
-msgstr ""
-
-#: builtin/sparse-checkout.c:185
-#, c-format
-msgid "failed to remove directory '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:327
-msgid "failed to create directory for sparse-checkout file"
-msgstr ""
-
-#: builtin/sparse-checkout.c:366
-msgid "failed to initialize worktree config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:411
-msgid "failed to modify sparse-index config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:441 builtin/sparse-checkout.c:793
-#: builtin/sparse-checkout.c:847
-msgid "initialize the sparse-checkout in cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:443 builtin/sparse-checkout.c:795
-#: builtin/sparse-checkout.c:849
-msgid "toggle the use of a sparse index"
-msgstr ""
-
-#: builtin/sparse-checkout.c:479
-#, c-format
-msgid "failed to open '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:531
-#, c-format
-msgid "could not normalize path %s"
-msgstr ""
-
-#: builtin/sparse-checkout.c:560
-#, c-format
-msgid "unable to unquote C-style string '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:615 builtin/sparse-checkout.c:643
-msgid "unable to load existing sparse-checkout patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:619
-msgid "existing sparse-checkout patterns do not use cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:707
-msgid "please run from the toplevel directory in non-cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:712
-msgid "specify directories rather than patterns (no leading slash)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:714
-msgid ""
-"specify directories rather than patterns.  If your directory starts with a "
-"'!', pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:716
-msgid ""
-"specify directories rather than patterns.  If your directory really has any "
-"of '*?[]\\' in it, pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:732
-#, c-format
-msgid ""
-"'%s' is not a directory; to treat it as a directory anyway, rerun with --"
-"skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:734
-#, c-format
-msgid ""
-"pass a leading slash before paths such as '%s' if you want a single file "
-"(see NON-CONE PROBLEMS in the git-sparse-checkout manual)."
-msgstr ""
-
-#: builtin/sparse-checkout.c:739
-msgid "git sparse-checkout add [--skip-checks] (--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:752 builtin/sparse-checkout.c:797
-msgid ""
-"skip some sanity checks on the given paths that might give false positives"
-msgstr ""
-
-#: builtin/sparse-checkout.c:755 builtin/sparse-checkout.c:800
-msgid "read patterns from standard in"
-msgstr ""
-
-#: builtin/sparse-checkout.c:760
-msgid "no sparse-checkout to add to"
-msgstr ""
-
-#: builtin/sparse-checkout.c:775
-msgid ""
-"git sparse-checkout set [--[no-]cone] [--[no-]sparse-index] [--skip-checks] "
-"(--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:854
-msgid "must be in a sparse-checkout to reapply sparsity patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:914
-msgid "error while refreshing working directory"
-msgstr ""
-
-#: builtin/stash.c:24 builtin/stash.c:40
-msgid "git stash list [<options>]"
-msgstr ""
-
-#: builtin/stash.c:25 builtin/stash.c:45
-msgid "git stash show [<options>] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:26 builtin/stash.c:50
-msgid "git stash drop [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:27
-msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:28 builtin/stash.c:65
-msgid "git stash branch <branchname> [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:30
-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 ""
-
-#: builtin/stash.c:34
-msgid ""
-"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--"
-"quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:55
-msgid "git stash pop [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:60
-msgid "git stash apply [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:75
-msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>"
-msgstr ""
-
-#: builtin/stash.c:80
-msgid ""
-"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
-"          [--] [<pathspec>...]]"
-msgstr ""
-
-#: builtin/stash.c:87
-msgid ""
-"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"               [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:130
-#, c-format
-msgid "'%s' is not a stash-like commit"
-msgstr ""
-
-#: builtin/stash.c:150
-#, c-format
-msgid "Too many revisions specified:%s"
-msgstr ""
-
-#: builtin/stash.c:164
-msgid "No stash entries found."
-msgstr ""
-
-#: builtin/stash.c:178
-#, c-format
-msgid "%s is not a valid reference"
-msgstr ""
-
-#: builtin/stash.c:227
-msgid "git stash clear with arguments is unimplemented"
-msgstr ""
-
-#: builtin/stash.c:447
-#, c-format
-msgid ""
-"WARNING: Untracked file in way of tracked file!  Renaming\n"
-"            %s -> %s\n"
-"         to make room.\n"
-msgstr ""
-
-#: builtin/stash.c:508
-msgid "cannot apply a stash in the middle of a merge"
-msgstr ""
-
-#: builtin/stash.c:519
-#, c-format
-msgid "could not generate diff %s^!."
-msgstr ""
-
-#: builtin/stash.c:526
-msgid "conflicts in index. Try without --index."
-msgstr ""
-
-#: builtin/stash.c:532
-msgid "could not save index tree"
-msgstr ""
-
-#: builtin/stash.c:552
-#, c-format
-msgid "Merging %s with %s"
-msgstr ""
-
-#: builtin/stash.c:562
-msgid "Index was not unstashed."
-msgstr ""
-
-#: builtin/stash.c:576
-msgid "could not restore untracked files from stash"
-msgstr ""
-
-#: builtin/stash.c:608 builtin/stash.c:695
-msgid "attempt to recreate the index"
-msgstr ""
-
-#: builtin/stash.c:641
-#, c-format
-msgid "Dropped %s (%s)"
-msgstr ""
-
-#: builtin/stash.c:644
-#, c-format
-msgid "%s: Could not drop stash entry"
-msgstr ""
-
-#: builtin/stash.c:657
-#, c-format
-msgid "'%s' is not a stash reference"
-msgstr ""
-
-#: builtin/stash.c:707
-msgid "The stash entry is kept in case you need it again."
-msgstr ""
-
-#: builtin/stash.c:730
-msgid "No branch name specified"
-msgstr ""
-
-#: builtin/stash.c:809
-msgid "failed to parse tree"
-msgstr ""
-
-#: builtin/stash.c:820
-msgid "failed to unpack trees"
-msgstr ""
-
-#: builtin/stash.c:840
-msgid "include untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:843
-msgid "only show untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:930 builtin/stash.c:967
-#, c-format
-msgid "Cannot update %s with %s"
-msgstr ""
-
-#: builtin/stash.c:948 builtin/stash.c:1667 builtin/stash.c:1739
-msgid "stash message"
-msgstr ""
-
-#: builtin/stash.c:958
-msgid "\"git stash store\" requires one <commit> argument"
-msgstr ""
-
-#: builtin/stash.c:1143
-msgid "No staged changes"
-msgstr ""
-
-#: builtin/stash.c:1204
-msgid "No changes selected"
-msgstr ""
-
-#: builtin/stash.c:1304
-msgid "You do not have the initial commit yet"
-msgstr ""
-
-#: builtin/stash.c:1331
-msgid "Cannot save the current index state"
-msgstr ""
-
-#: builtin/stash.c:1340
-msgid "Cannot save the untracked files"
-msgstr ""
-
-#: builtin/stash.c:1351 builtin/stash.c:1370
-msgid "Cannot save the current worktree state"
-msgstr ""
-
-#: builtin/stash.c:1361
-msgid "Cannot save the current staged state"
-msgstr ""
-
-#: builtin/stash.c:1398
-msgid "Cannot record working tree state"
-msgstr ""
-
-#: builtin/stash.c:1447
-msgid "Can't use --patch and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1458
-msgid "Can't use --staged and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1476
-msgid "Did you forget to 'git add'?"
-msgstr ""
-
-#: builtin/stash.c:1491
-msgid "No local changes to save"
-msgstr ""
-
-#: builtin/stash.c:1498
-msgid "Cannot initialize stash"
-msgstr ""
-
-#: builtin/stash.c:1513
-msgid "Cannot save the current status"
-msgstr ""
-
-#: builtin/stash.c:1518
-#, c-format
-msgid "Saved working directory and index state %s"
-msgstr ""
-
-#: builtin/stash.c:1615
-msgid "Cannot remove worktree changes"
-msgstr ""
-
-#: builtin/stash.c:1656 builtin/stash.c:1728
-msgid "keep index"
-msgstr ""
-
-#: builtin/stash.c:1658 builtin/stash.c:1730
-msgid "stash staged changes only"
-msgstr ""
-
-#: builtin/stash.c:1660 builtin/stash.c:1732
-msgid "stash in patch mode"
-msgstr ""
-
-#: builtin/stash.c:1661 builtin/stash.c:1733
-msgid "quiet mode"
-msgstr ""
-
-#: builtin/stash.c:1663 builtin/stash.c:1735
-msgid "include untracked files in stash"
-msgstr ""
-
-#: builtin/stash.c:1665 builtin/stash.c:1737
-msgid "include ignore files"
-msgstr ""
-
-#: builtin/stripspace.c:37
-msgid "skip and remove all lines starting with comment character"
-msgstr ""
-
-#: builtin/stripspace.c:40
-msgid "prepend comment character and space to each line"
-msgstr ""
-
-#: builtin/submodule--helper.c:50 builtin/submodule--helper.c:2486
-#, c-format
-msgid "Expecting a full ref name, got %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:103
-#, c-format
-msgid "cannot strip one component off url '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:213
-#, c-format
-msgid ""
-"could not look up configuration '%s'. Assuming this repository is its own "
-"authoritative upstream."
-msgstr ""
-
-#: builtin/submodule--helper.c:413 builtin/submodule--helper.c:1873
-msgid "alternative anchor for relative paths"
-msgstr ""
-
-#: builtin/submodule--helper.c:418
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:476 builtin/submodule--helper.c:617
-#: builtin/submodule--helper.c:640
-#, c-format
-msgid "No url found for submodule path '%s' in .gitmodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:528
-#, c-format
-msgid "Entering '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:531
-#, c-format
-msgid ""
-"run_command returned non-zero status for %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:553
-#, c-format
-msgid ""
-"run_command returned non-zero status while recursing in the nested "
-"submodules of %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:569
-msgid "suppress output of entering each submodule command"
-msgstr ""
-
-#: builtin/submodule--helper.c:571 builtin/submodule--helper.c:876
-#: builtin/submodule--helper.c:1458
-msgid "recurse into nested submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:576
-msgid "git submodule--helper foreach [--quiet] [--recursive] [--] <command>"
-msgstr ""
-
-#: builtin/submodule--helper.c:654
-#, c-format
-msgid "Failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:658
-#, c-format
-msgid "Submodule '%s' (%s) registered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:668
-#, c-format
-msgid "warning: command update mode suggested for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:675
-#, c-format
-msgid "Failed to register update mode for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:697
-msgid "suppress output for initializing a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:702
-msgid "git submodule--helper init [<options>] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:775 builtin/submodule--helper.c:910
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:823
-#, c-format
-msgid "could not resolve HEAD ref inside the submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:850 builtin/submodule--helper.c:1428
-#, c-format
-msgid "failed to recurse into submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:874 builtin/submodule--helper.c:1595
-msgid "suppress submodule status output"
-msgstr ""
-
-#: builtin/submodule--helper.c:875
-msgid ""
-"use commit stored in the index instead of the one stored in the submodule "
-"HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:881
-msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:905
-msgid "git submodule--helper name <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:977
-#, c-format
-msgid "* %s %s(blob)->%s(submodule)"
-msgstr ""
-
-#: builtin/submodule--helper.c:980
-#, c-format
-msgid "* %s %s(submodule)->%s(blob)"
-msgstr ""
-
-#: builtin/submodule--helper.c:993
-#, c-format
-msgid "%s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1043
-#, c-format
-msgid "couldn't hash object from '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1047
-#, c-format
-msgid "unexpected mode %o\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1288
-msgid "use the commit stored in the index instead of the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1290
-msgid "compare the commit in the index with that in the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1292
-msgid "skip submodules with 'ignore_config' value set to 'all'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1294
-msgid "limit the summary size"
-msgstr ""
-
-#: builtin/submodule--helper.c:1299
-msgid "git submodule--helper summary [<options>] [<commit>] [--] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1323
-msgid "could not fetch a revision for HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1384
-#, c-format
-msgid "Synchronizing submodule url for '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1390
-#, c-format
-msgid "failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1399
-#, c-format
-msgid "failed to get the default remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1409
-#, c-format
-msgid "failed to update remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1456
-msgid "suppress output of synchronizing submodule url"
-msgstr ""
-
-#: builtin/submodule--helper.c:1463
-msgid "git submodule--helper sync [--quiet] [--recursive] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1513
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains a .git directory. This will be replaced "
-"with a .git file by using absorbgitdirs."
-msgstr ""
-
-#: builtin/submodule--helper.c:1530
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains local modifications; use '-f' to discard "
-"them"
-msgstr ""
-
-#: builtin/submodule--helper.c:1538
-#, c-format
-msgid "Cleared directory '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1540
-#, c-format
-msgid "Could not remove submodule work tree '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1551
-#, c-format
-msgid "could not create empty submodule directory %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1567
-#, c-format
-msgid "Submodule '%s' (%s) unregistered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1596
-msgid "remove submodule working trees even if they contain local changes"
-msgstr ""
-
-#: builtin/submodule--helper.c:1597
-msgid "unregister all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1602
-msgid ""
-"git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1616
-msgid "Use '--all' if you really want to deinitialize all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1665
-msgid ""
-"An alternate computed from a superproject's alternate is invalid.\n"
-"To allow Git to clone without an alternate in such a case, set\n"
-"submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"
-"'--reference-if-able' instead of '--reference'."
-msgstr ""
-
-#: builtin/submodule--helper.c:1710 builtin/submodule--helper.c:1713
-#, c-format
-msgid "submodule '%s' cannot add alternate: %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1749
-#, c-format
-msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1756
-#, c-format
-msgid "Value '%s' for submodule.alternateLocation is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1781
-#, c-format
-msgid "refusing to create/use '%s' in another submodule's git dir"
-msgstr ""
-
-#: builtin/submodule--helper.c:1826
-#, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
-msgstr ""
-
-#: builtin/submodule--helper.c:1831
-#, c-format
-msgid "directory not empty: '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1843
-#, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1876
-msgid "where the new submodule will be cloned to"
-msgstr ""
-
-#: builtin/submodule--helper.c:1879
-msgid "name of the new submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:1882
-msgid "url where to clone the submodule from"
-msgstr ""
-
-#: builtin/submodule--helper.c:1890 builtin/submodule--helper.c:3383
-msgid "depth for shallow clones"
-msgstr ""
-
-#: builtin/submodule--helper.c:1893 builtin/submodule--helper.c:2731
-#: builtin/submodule--helper.c:3376
-msgid "force cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:1895 builtin/submodule--helper.c:2733
-msgid "disallow cloning into non-empty directory"
-msgstr ""
-
-#: builtin/submodule--helper.c:1903
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--depth <depth>] [--single-branch] [--filter "
-"<filter-spec>] --url <url> --path <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:1943
-#, c-format
-msgid "Invalid update mode '%s' for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1947
-#, c-format
-msgid "Invalid update mode '%s' configured for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2041
-#, c-format
-msgid "Submodule path '%s' not initialized"
-msgstr ""
-
-#: builtin/submodule--helper.c:2045
-msgid "Maybe you want to use 'update --init'?"
-msgstr ""
-
-#: builtin/submodule--helper.c:2075
-#, c-format
-msgid "Skipping unmerged submodule %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:2104
-#, c-format
-msgid "Skipping submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2257
-#, c-format
-msgid "Failed to clone '%s'. Retry scheduled"
-msgstr ""
-
-#: builtin/submodule--helper.c:2268
-#, c-format
-msgid "Failed to clone '%s' a second time, aborting"
-msgstr ""
-
-#: builtin/submodule--helper.c:2371
-#, c-format
-msgid "Unable to checkout '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2375
-#, c-format
-msgid "Unable to rebase '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2379
-#, c-format
-msgid "Unable to merge '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2383
-#, c-format
-msgid "Execution of '%s %s' failed in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2402
-#, c-format
-msgid "Submodule path '%s': checked out '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2406
-#, c-format
-msgid "Submodule path '%s': rebased into '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2410
-#, c-format
-msgid "Submodule path '%s': merged in '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2414
-#, c-format
-msgid "Submodule path '%s': '%s %s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2438
-#, c-format
-msgid "Unable to fetch in submodule path '%s'; trying to directly fetch %s:"
-msgstr ""
-
-#: builtin/submodule--helper.c:2447
-#, c-format
-msgid ""
-"Fetched in submodule path '%s', but it did not contain %s. Direct fetching "
-"of that commit failed."
-msgstr ""
-
-#: builtin/submodule--helper.c:2481
-#, c-format
-msgid ""
-"Submodule (%s) branch configured to inherit branch from superproject, but "
-"the superproject is not on any branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2499
-#, c-format
-msgid "could not get a repository handle for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2588
-#, c-format
-msgid "Unable to find current revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2599
-#, c-format
-msgid "Unable to fetch in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2604
-#, c-format
-msgid "Unable to find %s revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2640
-#, c-format
-msgid "Failed to recurse into submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2699
-msgid "force checkout updates"
-msgstr ""
-
-#: builtin/submodule--helper.c:2701
-msgid "initialize uninitialized submodules before update"
-msgstr ""
-
-#: builtin/submodule--helper.c:2703
-msgid "use SHA-1 of submodule's remote tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2705
-msgid "traverse submodules recursively"
-msgstr ""
-
-#: builtin/submodule--helper.c:2707
-msgid "don't fetch new objects from the remote site"
-msgstr ""
-
-#: builtin/submodule--helper.c:2710 builtin/submodule--helper.c:2892
-msgid "path into the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:2713
-msgid "path into the working tree, across nested submodule boundaries"
-msgstr ""
-
-#: builtin/submodule--helper.c:2717
-msgid "rebase, merge, checkout or none"
-msgstr ""
-
-#: builtin/submodule--helper.c:2723
-msgid "create a shallow clone truncated to the specified number of revisions"
-msgstr ""
-
-#: builtin/submodule--helper.c:2726
-msgid "parallel jobs"
-msgstr ""
-
-#: builtin/submodule--helper.c:2728
-msgid "whether the initial clone should follow the shallow recommendation"
-msgstr ""
-
-#: builtin/submodule--helper.c:2729
-msgid "don't print cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:2741
-msgid ""
-"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>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2767
-msgid "bad value for update parameter"
-msgstr ""
-
-#: builtin/submodule--helper.c:2893
-msgid "recurse into submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:2899
-msgid "git submodule--helper absorb-git-dirs [<options>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2955
-msgid "check if it is safe to write to the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2958
-msgid "unset the config in the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2963
-msgid "git submodule--helper config <name> [<value>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2964
-msgid "git submodule--helper config --unset <name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:2984 builtin/submodule--helper.c:3238
-#: builtin/submodule--helper.c:3395
-msgid "please make sure that the .gitmodules file is in the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3000
-msgid "suppress output for setting url of a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3004
-msgid "git submodule--helper set-url [--quiet] <path> <newurl>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3037
-msgid "set the default tracking branch to master"
-msgstr ""
-
-#: builtin/submodule--helper.c:3039
-msgid "set the default tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:3043
-msgid "git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3044
-msgid ""
-"git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3051
-msgid "--branch or --default required"
-msgstr ""
-
-#: builtin/submodule--helper.c:3072 builtin/submodule--helper.c:3375
-msgid "print only error messages"
-msgstr ""
-
-#: builtin/submodule--helper.c:3073
-msgid "force creation"
-msgstr ""
-
-#: builtin/submodule--helper.c:3081
-msgid "show whether the branch would be created"
-msgstr ""
-
-#: builtin/submodule--helper.c:3085
-msgid ""
-"git submodule--helper create-branch [-f|--force] [--create-reflog] [-q|--"
-"quiet] [-t|--track] [-n|--dry-run] <name> <start-oid> <start-name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3097
-#, c-format
-msgid "creating branch '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3155
-#, c-format
-msgid "Adding existing repo at '%s' to the index\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3158
-#, c-format
-msgid "'%s' already exists and is not a valid git repo"
-msgstr ""
-
-#: builtin/submodule--helper.c:3171
-#, c-format
-msgid "A git directory for '%s' is found locally with remote(s):\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3178
-#, c-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from\n"
-"  %s\n"
-"use the '--force' option. If the local git directory is not the correct "
-"repo\n"
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-
-#: builtin/submodule--helper.c:3190
-#, c-format
-msgid "Reactivating local git directory for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3227
-#, c-format
-msgid "unable to checkout submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3266
-#, c-format
-msgid "Failed to add submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3270 builtin/submodule--helper.c:3275
-#: builtin/submodule--helper.c:3283
-#, c-format
-msgid "Failed to register submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3339
-#, c-format
-msgid "'%s' already exists in the index"
-msgstr ""
-
-#: builtin/submodule--helper.c:3342
-#, c-format
-msgid "'%s' already exists in the index and is not a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3372
-msgid "branch of repository to add as submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3373
-msgid "allow adding an otherwise ignored submodule path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3379
-msgid "borrow the objects from reference repositories"
-msgstr ""
-
-#: builtin/submodule--helper.c:3381
-msgid ""
-"sets the submodule’s name to the given string instead of defaulting to its "
-"path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3388
-msgid "git submodule--helper add [<options>] [--] <repository> [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:3416
-msgid "Relative path can only be used from the toplevel of the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3425
-#, c-format
-msgid "repo URL: '%s' must be absolute or begin with ./|../"
-msgstr ""
-
-#: builtin/submodule--helper.c:3460
-#, c-format
-msgid "'%s' is not a valid submodule name"
-msgstr ""
-
-#: builtin/submodule--helper.c:3520 git.c:453 git.c:729
-#, c-format
-msgid "%s doesn't support --super-prefix"
-msgstr ""
-
-#: builtin/submodule--helper.c:3526
-#, c-format
-msgid "'%s' is not a valid submodule--helper subcommand"
-msgstr ""
-
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr ""
-
-#: builtin/symbolic-ref.c:9
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr ""
-
-#: builtin/symbolic-ref.c:42
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
-
-#: builtin/symbolic-ref.c:43
-msgid "delete symbolic ref"
-msgstr ""
-
-#: builtin/symbolic-ref.c:44
-msgid "shorten ref output"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason of the update"
-msgstr ""
-
-#: builtin/tag.c:26
-msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n"
-"        <tagname> [<head>]"
-msgstr ""
-
-#: builtin/tag.c:28
-msgid "git tag -d <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:29
-msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
-"points-at <object>]\n"
-"        [--format=<format>] [--merged <commit>] [--no-merged <commit>] "
-"[<pattern>...]"
-msgstr ""
-
-#: builtin/tag.c:31
-msgid "git tag -v [--format=<format>] <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:101
-#, c-format
-msgid "tag '%s' not found."
-msgstr ""
-
-#: builtin/tag.c:136
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/tag.c:171
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/tag.c:175
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be kept; you may remove them yourself if you "
-"want to.\n"
-msgstr ""
-
-#: builtin/tag.c:241
-msgid "unable to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:259
-#, c-format
-msgid ""
-"You have created a nested tag. The object referred to by your new tag is\n"
-"already a tag. If you meant to tag the object that it points to, use:\n"
-"\n"
-"\tgit tag -f %s %s^{}"
-msgstr ""
-
-#: builtin/tag.c:275
-msgid "bad object type."
-msgstr ""
-
-#: builtin/tag.c:326
-msgid "no tag message?"
-msgstr ""
-
-#: builtin/tag.c:333
-#, c-format
-msgid "The tag message has been left in %s\n"
-msgstr ""
-
-#: builtin/tag.c:445
-msgid "list tag names"
-msgstr ""
-
-#: builtin/tag.c:447
-msgid "print <n> lines of each tag message"
-msgstr ""
-
-#: builtin/tag.c:449
-msgid "delete tags"
-msgstr ""
-
-#: builtin/tag.c:450
-msgid "verify tags"
-msgstr ""
-
-#: builtin/tag.c:452
-msgid "Tag creation options"
-msgstr ""
-
-#: builtin/tag.c:454
-msgid "annotated tag, needs a message"
-msgstr ""
-
-#: builtin/tag.c:456
-msgid "tag message"
-msgstr ""
-
-#: builtin/tag.c:458
-msgid "force edit of tag message"
-msgstr ""
-
-#: builtin/tag.c:459
-msgid "annotated and GPG-signed tag"
-msgstr ""
-
-#: builtin/tag.c:462
-msgid "use another key to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:463
-msgid "replace the tag if exists"
-msgstr ""
-
-#: builtin/tag.c:464 builtin/update-ref.c:511
-msgid "create a reflog"
-msgstr ""
-
-#: builtin/tag.c:466
-msgid "Tag listing options"
-msgstr ""
-
-#: builtin/tag.c:467
-msgid "show tag list in columns"
-msgstr ""
-
-#: builtin/tag.c:468 builtin/tag.c:470
-msgid "print only tags that contain the commit"
-msgstr ""
-
-#: builtin/tag.c:469 builtin/tag.c:471
-msgid "print only tags that don't contain the commit"
-msgstr ""
-
-#: builtin/tag.c:472
-msgid "print only tags that are merged"
-msgstr ""
-
-#: builtin/tag.c:473
-msgid "print only tags that are not merged"
-msgstr ""
-
-#: builtin/tag.c:477
-msgid "print only tags of the object"
-msgstr ""
-
-#: builtin/tag.c:559
-#, c-format
-msgid "the '%s' option is only allowed in list mode"
-msgstr ""
-
-#: builtin/tag.c:598
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr ""
-
-#: builtin/tag.c:603
-#, c-format
-msgid "tag '%s' already exists"
-msgstr ""
-
-#: builtin/tag.c:634
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/unpack-objects.c:95
-msgid "pack exceeds maximum allowed size"
-msgstr ""
-
-#: builtin/unpack-objects.c:504
-msgid "Unpacking objects"
-msgstr ""
-
-#: builtin/update-index.c:84
-#, c-format
-msgid "failed to create directory %s"
-msgstr ""
-
-#: builtin/update-index.c:106
-#, c-format
-msgid "failed to delete file %s"
-msgstr ""
-
-#: builtin/update-index.c:113 builtin/update-index.c:219
-#, c-format
-msgid "failed to delete directory %s"
-msgstr ""
-
-#: builtin/update-index.c:138
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr ""
-
-#: builtin/update-index.c:152
-msgid "directory stat info does not change after adding a new file"
-msgstr ""
-
-#: builtin/update-index.c:165
-msgid "directory stat info does not change after adding a new directory"
-msgstr ""
-
-#: builtin/update-index.c:178
-msgid "directory stat info changes after updating a file"
-msgstr ""
-
-#: builtin/update-index.c:189
-msgid "directory stat info changes after adding a file inside subdirectory"
-msgstr ""
-
-#: builtin/update-index.c:200
-msgid "directory stat info does not change after deleting a file"
-msgstr ""
-
-#: builtin/update-index.c:213
-msgid "directory stat info does not change after deleting a directory"
-msgstr ""
-
-#: builtin/update-index.c:220
-msgid " OK"
-msgstr ""
-
-#: builtin/update-index.c:589
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/update-index.c:993
-msgid "continue refresh even when index needs update"
-msgstr ""
-
-#: builtin/update-index.c:996
-msgid "refresh: ignore submodules"
-msgstr ""
-
-#: builtin/update-index.c:999
-msgid "do not ignore new files"
-msgstr ""
-
-#: builtin/update-index.c:1001
-msgid "let files replace directories and vice-versa"
-msgstr ""
-
-#: builtin/update-index.c:1003
-msgid "notice files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1005
-msgid "refresh even if index contains unmerged entries"
-msgstr ""
-
-#: builtin/update-index.c:1008
-msgid "refresh stat information"
-msgstr ""
-
-#: builtin/update-index.c:1012
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr ""
-
-#: builtin/update-index.c:1016
-msgid "<mode>,<object>,<path>"
-msgstr ""
-
-#: builtin/update-index.c:1017
-msgid "add the specified entry to the index"
-msgstr ""
-
-#: builtin/update-index.c:1027
-msgid "mark files as \"not changing\""
-msgstr ""
-
-#: builtin/update-index.c:1030
-msgid "clear assumed-unchanged bit"
-msgstr ""
-
-#: builtin/update-index.c:1033
-msgid "mark files as \"index-only\""
-msgstr ""
-
-#: builtin/update-index.c:1036
-msgid "clear skip-worktree bit"
-msgstr ""
-
-#: builtin/update-index.c:1039
-msgid "do not touch index-only entries"
-msgstr ""
-
-#: builtin/update-index.c:1041
-msgid "add to index only; do not add content to object database"
-msgstr ""
-
-#: builtin/update-index.c:1043
-msgid "remove named paths even if present in worktree"
-msgstr ""
-
-#: builtin/update-index.c:1045
-msgid "with --stdin: input lines are terminated by null bytes"
-msgstr ""
-
-#: builtin/update-index.c:1047
-msgid "read list of paths to be updated from standard input"
-msgstr ""
-
-#: builtin/update-index.c:1051
-msgid "add entries from standard input to the index"
-msgstr ""
-
-#: builtin/update-index.c:1055
-msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr ""
-
-#: builtin/update-index.c:1059
-msgid "only update entries that differ from HEAD"
-msgstr ""
-
-#: builtin/update-index.c:1063
-msgid "ignore files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1066
-msgid "report actions to standard output"
-msgstr ""
-
-#: builtin/update-index.c:1068
-msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr ""
-
-#: builtin/update-index.c:1072
-msgid "write index in this format"
-msgstr ""
-
-#: builtin/update-index.c:1074
-msgid "enable or disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1076
-msgid "enable/disable untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1078
-msgid "test if the filesystem supports untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1080
-msgid "enable untracked cache without testing the filesystem"
-msgstr ""
-
-#: builtin/update-index.c:1082
-msgid "write out the index even if is not flagged as changed"
-msgstr ""
-
-#: builtin/update-index.c:1084
-msgid "enable or disable file system monitor"
-msgstr ""
-
-#: builtin/update-index.c:1086
-msgid "mark files as fsmonitor valid"
-msgstr ""
-
-#: builtin/update-index.c:1089
-msgid "clear fsmonitor valid bit"
-msgstr ""
-
-#: builtin/update-index.c:1195
-msgid ""
-"core.splitIndex is set to false; remove or change it, if you really want to "
-"enable split index"
-msgstr ""
-
-#: builtin/update-index.c:1204
-msgid ""
-"core.splitIndex is set to true; remove or change it, if you really want to "
-"disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1216
-msgid ""
-"core.untrackedCache is set to true; remove or change it, if you really want "
-"to disable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1220
-msgid "Untracked cache disabled"
-msgstr ""
-
-#: builtin/update-index.c:1228
-msgid ""
-"core.untrackedCache is set to false; remove or change it, if you really want "
-"to enable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1232
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr ""
-
-#: builtin/update-index.c:1241
-msgid "core.fsmonitor is unset; set it if you really want to enable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1246
-msgid "fsmonitor enabled"
-msgstr ""
-
-#: builtin/update-index.c:1250
-msgid ""
-"core.fsmonitor is set; remove it if you really want to disable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1254
-msgid "fsmonitor disabled"
-msgstr ""
-
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:12
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr ""
-
-#: builtin/update-ref.c:506
-msgid "delete the reference"
-msgstr ""
-
-#: builtin/update-ref.c:508
-msgid "update <refname> not the one it points to"
-msgstr ""
-
-#: builtin/update-ref.c:509
-msgid "stdin has NUL-terminated arguments"
-msgstr ""
-
-#: builtin/update-ref.c:510
-msgid "read updates from stdin"
-msgstr ""
-
-#: builtin/update-server-info.c:15
-msgid "update the info files from scratch"
-msgstr ""
-
-#: builtin/upload-pack.c:11
-msgid "git upload-pack [<options>] <dir>"
-msgstr ""
-
-#: builtin/upload-pack.c:24 t/helper/test-serve-v2.c:17
-msgid "quit after a single request/response exchange"
-msgstr ""
-
-#: builtin/upload-pack.c:26
-msgid "serve up the info/refs for git-http-backend"
-msgstr ""
-
-#: builtin/upload-pack.c:29
-msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr ""
-
-#: builtin/upload-pack.c:31
-msgid "interrupt transfer after <n> seconds of inactivity"
-msgstr ""
-
-#: builtin/verify-commit.c:19
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr ""
-
-#: builtin/verify-commit.c:68
-msgid "print commit contents"
-msgstr ""
-
-#: builtin/verify-commit.c:69 builtin/verify-tag.c:37
-msgid "print raw gpg status output"
-msgstr ""
-
-#: builtin/verify-pack.c:59
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr ""
-
-#: builtin/verify-pack.c:70
-msgid "verbose"
-msgstr ""
-
-#: builtin/verify-pack.c:72
-msgid "show statistics only"
-msgstr ""
-
-#: builtin/verify-tag.c:18
-msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
-msgstr ""
-
-#: builtin/verify-tag.c:36
-msgid "print tag contents"
-msgstr ""
-
-#: builtin/worktree.c:19
-msgid "git worktree add [<options>] <path> [<commit-ish>]"
-msgstr ""
-
-#: builtin/worktree.c:20
-msgid "git worktree list [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:21
-msgid "git worktree lock [<options>] <path>"
-msgstr ""
-
-#: builtin/worktree.c:22
-msgid "git worktree move <worktree> <new-path>"
-msgstr ""
-
-#: builtin/worktree.c:23
-msgid "git worktree prune [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:24
-msgid "git worktree remove [<options>] <worktree>"
-msgstr ""
-
-#: builtin/worktree.c:25
-msgid "git worktree repair [<path>...]"
-msgstr ""
-
-#: builtin/worktree.c:26
-msgid "git worktree unlock <path>"
-msgstr ""
-
-#: builtin/worktree.c:76
-#, c-format
-msgid "Removing %s/%s: %s"
-msgstr ""
-
-#: builtin/worktree.c:149
-msgid "report pruned working trees"
-msgstr ""
-
-#: builtin/worktree.c:151
-msgid "expire working trees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:221
-#, c-format
-msgid "'%s' already exists"
-msgstr ""
-
-#: builtin/worktree.c:230
-#, c-format
-msgid "unusable worktree destination '%s'"
-msgstr ""
-
-#: builtin/worktree.c:235
-#, c-format
-msgid ""
-"'%s' is a missing but locked worktree;\n"
-"use '%s -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:237
-#, c-format
-msgid ""
-"'%s' is a missing but already registered worktree;\n"
-"use '%s -f' to override, or 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:248
-#, c-format
-msgid "failed to copy '%s' to '%s'; sparse-checkout may not work correctly"
-msgstr ""
-
-#: builtin/worktree.c:268
-#, c-format
-msgid "failed to copy worktree config from '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:280 builtin/worktree.c:285
-#, c-format
-msgid "failed to unset '%s' in '%s'"
-msgstr ""
-
-#: builtin/worktree.c:356
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr ""
-
-#: builtin/worktree.c:378
-msgid "initializing"
-msgstr ""
-
-#: builtin/worktree.c:492 builtin/worktree.c:498
-#, c-format
-msgid "Preparing worktree (new branch '%s')"
-msgstr ""
-
-#: builtin/worktree.c:494
-#, c-format
-msgid "Preparing worktree (resetting branch '%s'; was at %s)"
-msgstr ""
-
-#: builtin/worktree.c:503
-#, c-format
-msgid "Preparing worktree (checking out '%s')"
-msgstr ""
-
-#: builtin/worktree.c:509
-#, c-format
-msgid "Preparing worktree (detached HEAD %s)"
-msgstr ""
-
-#: builtin/worktree.c:554
-msgid "checkout <branch> even if already checked out in other worktree"
-msgstr ""
-
-#: builtin/worktree.c:557
-msgid "create a new branch"
-msgstr ""
-
-#: builtin/worktree.c:559
-msgid "create or reset a branch"
-msgstr ""
-
-#: builtin/worktree.c:561
-msgid "populate the new working tree"
-msgstr ""
-
-#: builtin/worktree.c:562
-msgid "keep the new working tree locked"
-msgstr ""
-
-#: builtin/worktree.c:564 builtin/worktree.c:809
-msgid "reason for locking"
-msgstr ""
-
-#: builtin/worktree.c:567
-msgid "set up tracking mode (see git-branch(1))"
-msgstr ""
-
-#: builtin/worktree.c:570
-msgid "try to match the new branch name with a remote-tracking branch"
-msgstr ""
-
-#: builtin/worktree.c:584
-msgid "added with --lock"
-msgstr ""
-
-#: builtin/worktree.c:646
-msgid "--[no-]track can only be used if a new branch is created"
-msgstr ""
-
-#: builtin/worktree.c:766
-msgid "show extended annotations and reasons, if available"
-msgstr ""
-
-#: builtin/worktree.c:768
-msgid "add 'prunable' annotation to worktrees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:770
-msgid "terminate records with a NUL character"
-msgstr ""
-
-#: builtin/worktree.c:821 builtin/worktree.c:854 builtin/worktree.c:928
-#: builtin/worktree.c:1052
-#, c-format
-msgid "'%s' is not a working tree"
-msgstr ""
-
-#: builtin/worktree.c:823 builtin/worktree.c:856
-msgid "The main working tree cannot be locked or unlocked"
-msgstr ""
-
-#: builtin/worktree.c:828
-#, c-format
-msgid "'%s' is already locked, reason: %s"
-msgstr ""
-
-#: builtin/worktree.c:830
-#, c-format
-msgid "'%s' is already locked"
-msgstr ""
-
-#: builtin/worktree.c:858
-#, c-format
-msgid "'%s' is not locked"
-msgstr ""
-
-#: builtin/worktree.c:899
-msgid "working trees containing submodules cannot be moved or removed"
-msgstr ""
-
-#: builtin/worktree.c:907
-msgid "force move even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:930 builtin/worktree.c:1054
-#, c-format
-msgid "'%s' is a main working tree"
-msgstr ""
-
-#: builtin/worktree.c:935
-#, c-format
-msgid "could not figure out destination name from '%s'"
-msgstr ""
-
-#: builtin/worktree.c:948
-#, c-format
-msgid ""
-"cannot move a locked working tree, lock reason: %s\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:950
-msgid ""
-"cannot move a locked working tree;\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:953
-#, c-format
-msgid "validation failed, cannot move working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:958
-#, c-format
-msgid "failed to move '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1004
-#, c-format
-msgid "failed to run 'git status' on '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1008
-#, c-format
-msgid "'%s' contains modified or untracked files, use --force to delete it"
-msgstr ""
-
-#: builtin/worktree.c:1013
-#, c-format
-msgid "failed to run 'git status' on '%s', code %d"
-msgstr ""
-
-#: builtin/worktree.c:1036
-msgid "force removal even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:1059
-#, c-format
-msgid ""
-"cannot remove a locked working tree, lock reason: %s\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1061
-msgid ""
-"cannot remove a locked working tree;\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1064
-#, c-format
-msgid "validation failed, cannot remove working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:1088
-#, c-format
-msgid "repair: %s: %s"
-msgstr ""
-
-#: builtin/worktree.c:1091
-#, c-format
-msgid "error: %s: %s"
-msgstr ""
-
-#: builtin/write-tree.c:15
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
-
-#: builtin/write-tree.c:28
-msgid "<prefix>/"
-msgstr ""
-
-#: builtin/write-tree.c:29
-msgid "write tree object for a subdirectory <prefix>"
-msgstr ""
-
-#: builtin/write-tree.c:31
-msgid "only useful for debugging"
-msgstr ""
-
-#: git.c:28
-msgid ""
-"git [--version] [--help] [-C <path>] [-c <name>=<value>]\n"
-"           [--exec-path[=<path>]] [--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"
-"           <command> [<args>]"
-msgstr ""
-
-#: git.c:36
-msgid ""
-"'git help -a' and 'git help -g' list available subcommands and some\n"
-"concept guides. See 'git help <command>' or 'git help <concept>'\n"
-"to read about a specific subcommand or concept.\n"
-"See 'git help git' for an overview of the system."
-msgstr ""
-
-#: git.c:188 git.c:216 git.c:300
-#, c-format
-msgid "no directory given for '%s' option\n"
-msgstr ""
-
-#: git.c:202
-#, c-format
-msgid "no namespace given for --namespace\n"
-msgstr ""
-
-#: git.c:230
-#, c-format
-msgid "no prefix given for --super-prefix\n"
-msgstr ""
-
-#: git.c:252
-#, c-format
-msgid "-c expects a configuration string\n"
-msgstr ""
-
-#: git.c:260
-#, c-format
-msgid "no config key given for --config-env\n"
-msgstr ""
-
-#: git.c:326
-#, c-format
-msgid "unknown option: %s\n"
-msgstr ""
-
-#: git.c:375
-#, c-format
-msgid "while expanding alias '%s': '%s'"
-msgstr ""
-
-#: git.c:384
-#, c-format
-msgid ""
-"alias '%s' changes environment variables.\n"
-"You can use '!git' in the alias to do this"
-msgstr ""
-
-#: git.c:391
-#, c-format
-msgid "empty alias for %s"
-msgstr ""
-
-#: git.c:394
-#, c-format
-msgid "recursive alias: %s"
-msgstr ""
-
-#: git.c:480
-msgid "write failure on standard output"
-msgstr ""
-
-#: git.c:482
-msgid "unknown write failure on standard output"
-msgstr ""
-
-#: git.c:484
-msgid "close failed on standard output"
-msgstr ""
-
-#: git.c:838
-#, c-format
-msgid "alias loop detected: expansion of '%s' does not terminate:%s"
-msgstr ""
-
-#: git.c:888
-#, c-format
-msgid "cannot handle %s as a builtin"
-msgstr ""
-
-#: git.c:901
-#, c-format
-msgid ""
-"usage: %s\n"
-"\n"
-msgstr ""
-
-#: git.c:921
-#, c-format
-msgid "expansion of alias '%s' failed; '%s' is not a git command\n"
-msgstr ""
-
-#: git.c:933
-#, c-format
-msgid "failed to run command '%s': %s\n"
-msgstr ""
-
-#: http-fetch.c:128
-#, c-format
-msgid "argument to --packfile must be a valid hash (got '%s')"
-msgstr ""
-
-#: http-fetch.c:138
-msgid "not a git repository"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:141
-msgid "unhandled options"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:146
-msgid "error preparing revisions"
-msgstr ""
-
-#: t/helper/test-reach.c:154
-#, c-format
-msgid "commit %s is not marked reachable"
-msgstr ""
-
-#: t/helper/test-reach.c:164
-msgid "too many commits marked reachable"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:7
-msgid "test-tool serve-v2 [<options>]"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:19
-msgid "exit immediately after advertising capabilities"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:581
-msgid "test-helper simple-ipc is-active    [<name>] [<options>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:582
-msgid "test-helper simple-ipc run-daemon   [<name>] [<threads>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:583
-msgid "test-helper simple-ipc start-daemon [<name>] [<threads>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:584
-msgid "test-helper simple-ipc stop-daemon  [<name>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:585
-msgid "test-helper simple-ipc send         [<name>] [<token>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:586
-msgid "test-helper simple-ipc sendbytes    [<name>] [<bytecount>] [<byte>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:587
-msgid ""
-"test-helper simple-ipc multiple     [<name>] [<threads>] [<bytecount>] "
-"[<batchsize>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:595
-msgid "name or pathname of unix domain socket"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:597
-msgid "named-pipe name"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:599
-msgid "number of threads in server thread pool"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:600
-msgid "seconds to wait for daemon to start or stop"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:602
-msgid "number of bytes"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:603
-msgid "number of requests per thread"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "byte"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "ballast character"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "token"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "command token to send to the server"
-msgstr ""
-
-#: http.c:350
-#, c-format
-msgid "negative value for http.postbuffer; defaulting to %d"
-msgstr ""
-
-#: http.c:371
-msgid "Delegation control is not supported with cURL < 7.22.0"
-msgstr ""
-
-#: http.c:380
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr ""
-
-#: http.c:812
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr ""
-
-#: http.c:1016
-#, c-format
-msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
-msgstr ""
-
-#: http.c:1023
-#, c-format
-msgid "Could not set SSL backend to '%s': cURL was built without SSL backends"
-msgstr ""
-
-#: http.c:1027
-#, c-format
-msgid "Could not set SSL backend to '%s': already set"
-msgstr ""
-
-#: http.c:1876
-#, c-format
-msgid ""
-"unable to update url base from redirection:\n"
-"  asked for: %s\n"
-"   redirect: %s"
-msgstr ""
-
-#: remote-curl.c:184
-#, c-format
-msgid "invalid quoting in push-option value: '%s'"
-msgstr ""
-
-#: remote-curl.c:308
-#, c-format
-msgid "%sinfo/refs not valid: is this a git repository?"
-msgstr ""
-
-#: remote-curl.c:409
-msgid "invalid server response; expected service, got flush packet"
-msgstr ""
-
-#: remote-curl.c:440
-#, c-format
-msgid "invalid server response; got '%s'"
-msgstr ""
-
-#: remote-curl.c:500
-#, c-format
-msgid "repository '%s' not found"
-msgstr ""
-
-#: remote-curl.c:504
-#, c-format
-msgid "Authentication failed for '%s'"
-msgstr ""
-
-#: remote-curl.c:508
-#, c-format
-msgid "unable to access '%s' with http.pinnedPubkey configuration: %s"
-msgstr ""
-
-#: remote-curl.c:512
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr ""
-
-#: remote-curl.c:518
-#, c-format
-msgid "redirecting to %s"
-msgstr ""
-
-#: remote-curl.c:649
-msgid "shouldn't have EOF when not gentle on EOF"
-msgstr ""
-
-#: remote-curl.c:661
-msgid "remote server sent unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:730
-msgid "unable to rewind rpc post data - try increasing http.postBuffer"
-msgstr ""
-
-#: remote-curl.c:759
-#, c-format
-msgid "remote-curl: bad line length character: %.4s"
-msgstr ""
-
-#: remote-curl.c:761
-msgid "remote-curl: unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:837
-#, c-format
-msgid "RPC failed; %s"
-msgstr ""
-
-#: remote-curl.c:877
-msgid "cannot handle pushes this big"
-msgstr ""
-
-#: remote-curl.c:990
-#, c-format
-msgid "cannot deflate request; zlib deflate error %d"
-msgstr ""
-
-#: remote-curl.c:994
-#, c-format
-msgid "cannot deflate request; zlib end error %d"
-msgstr ""
-
-#: remote-curl.c:1044
-#, c-format
-msgid "%d bytes of length header were received"
-msgstr ""
-
-#: remote-curl.c:1046
-#, c-format
-msgid "%d bytes of body are still expected"
-msgstr ""
-
-#: remote-curl.c:1135
-msgid "dumb http transport does not support shallow capabilities"
-msgstr ""
-
-#: remote-curl.c:1150
-msgid "fetch failed."
-msgstr ""
-
-#: remote-curl.c:1198
-msgid "cannot fetch by sha1 over smart http"
-msgstr ""
-
-#: remote-curl.c:1242 remote-curl.c:1248
-#, c-format
-msgid "protocol error: expected sha/ref, got '%s'"
-msgstr ""
-
-#: remote-curl.c:1260 remote-curl.c:1378
-#, c-format
-msgid "http transport does not support %s"
-msgstr ""
-
-#: remote-curl.c:1296
-msgid "git-http-push failed"
-msgstr ""
-
-#: remote-curl.c:1485
-msgid "remote-curl: usage: git remote-curl <remote> [<url>]"
-msgstr ""
-
-#: remote-curl.c:1517
-msgid "remote-curl: error reading command stream from git"
-msgstr ""
-
-#: remote-curl.c:1524
-msgid "remote-curl: fetch attempted without a local repo"
-msgstr ""
-
-#: remote-curl.c:1565
-#, c-format
-msgid "remote-curl: unknown command '%s' from git"
-msgstr ""
-
-#: contrib/scalar/scalar.c:49
-msgid "need a working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:86
-msgid "could not find enlistment root"
-msgstr ""
-
-#: contrib/scalar/scalar.c:89 contrib/scalar/scalar.c:350
-#: contrib/scalar/scalar.c:435 contrib/scalar/scalar.c:578
-#, c-format
-msgid "could not switch to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:179
-#, c-format
-msgid "could not configure %s=%s"
-msgstr ""
-
-#: contrib/scalar/scalar.c:197
-msgid "could not configure log.excludeDecoration"
-msgstr ""
-
-#: contrib/scalar/scalar.c:218
-msgid "Scalar enlistments require a worktree"
-msgstr ""
-
-#: contrib/scalar/scalar.c:310
-#, c-format
-msgid "remote HEAD is not a branch: '%.*s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:316
-msgid "failed to get default branch name from remote; using local default"
-msgstr ""
-
-#: contrib/scalar/scalar.c:329
-msgid "failed to get default branch name"
-msgstr ""
-
-#: contrib/scalar/scalar.c:340
-msgid "failed to unregister repository"
-msgstr ""
-
-#: contrib/scalar/scalar.c:355
-msgid "failed to delete enlistment directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:375
-msgid "branch to checkout after clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:377
-msgid "when cloning, create full working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:379
-msgid "only download metadata for the branch that will be checked out"
-msgstr ""
-
-#: contrib/scalar/scalar.c:384
-msgid "scalar clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:409
-#, c-format
-msgid "cannot deduce worktree name from '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:418
-#, c-format
-msgid "directory '%s' exists already"
-msgstr ""
-
-#: contrib/scalar/scalar.c:445
-#, c-format
-msgid "failed to get default branch for '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:456
-#, c-format
-msgid "could not configure remote in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:465
-#, c-format
-msgid "could not configure '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:468
-msgid "partial clone failed; attempting full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:472
-msgid "could not configure for full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:504
-msgid "`scalar list` does not take arguments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:517
-msgid "scalar register [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:544
-msgid "reconfigure all registered enlistments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:548
-msgid "scalar reconfigure [--all | <enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:566
-msgid "--all or <enlistment>, but not both"
-msgstr ""
-
-#: contrib/scalar/scalar.c:581
-#, c-format
-msgid "git repository gone in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:621
-msgid ""
-"scalar run <task> [<enlistment>]\n"
-"Tasks:\n"
-msgstr ""
-
-#: contrib/scalar/scalar.c:639
-#, c-format
-msgid "no such task: '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:689
-msgid "scalar unregister [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:736
-msgid "scalar delete <enlistment>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:751
-msgid "refusing to delete current working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:766
-msgid "include Git version"
-msgstr ""
-
-#: contrib/scalar/scalar.c:768
-msgid "include Git's build options"
-msgstr ""
-
-#: contrib/scalar/scalar.c:772
-msgid "scalar verbose [-v | --verbose] [--build-options]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:813
-msgid "-C requires a <directory>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:815
-#, c-format
-msgid "could not change to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:821
-msgid "-c requires a <key>=<value> argument"
-msgstr ""
-
-#: contrib/scalar/scalar.c:839
-msgid ""
-"scalar [-C <directory>] [-c <key>=<value>] <command> [<options>]\n"
-"\n"
-"Commands:\n"
-msgstr ""
-
-#: compat/compiler.h:26
-msgid "no compiler information available\n"
-msgstr ""
-
-#: compat/compiler.h:38
-msgid "no libc information available\n"
-msgstr ""
-
-#: list-objects-filter-options.h:126
-msgid "args"
-msgstr ""
-
-#: list-objects-filter-options.h:127
-msgid "object filtering"
-msgstr ""
-
-#: parse-options.h:188
-msgid "expiry-date"
-msgstr ""
-
-#: parse-options.h:202
-msgid "no-op (backward compatibility)"
-msgstr ""
-
-#: parse-options.h:341
-msgid "be more verbose"
-msgstr ""
-
-#: parse-options.h:343
-msgid "be more quiet"
-msgstr ""
-
-#: parse-options.h:349
-msgid "use <n> digits to display object names"
-msgstr ""
-
-#: parse-options.h:368
-msgid "how to strip spaces and #comments from message"
-msgstr ""
-
-#: parse-options.h:369
-msgid "read pathspec from file"
-msgstr ""
-
-#: parse-options.h:370
-msgid ""
-"with --pathspec-from-file, pathspec elements are separated with NUL character"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "key"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "field name to sort on"
-msgstr ""
-
-#: rerere.h:44
-msgid "update the index with reused conflict resolution if possible"
-msgstr ""
-
-#: command-list.h:50
-msgid "Add file contents to the index"
-msgstr ""
-
-#: command-list.h:51
-msgid "Apply a series of patches from a mailbox"
-msgstr ""
-
-#: command-list.h:52
-msgid "Annotate file lines with commit information"
-msgstr ""
-
-#: command-list.h:53
-msgid "Apply a patch to files and/or to the index"
-msgstr ""
-
-#: command-list.h:54
-msgid "Import a GNU Arch repository into Git"
-msgstr ""
-
-#: command-list.h:55
-msgid "Create an archive of files from a named tree"
-msgstr ""
-
-#: command-list.h:56
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr ""
-
-#: command-list.h:57
-msgid "Show what revision and author last modified each line of a file"
-msgstr ""
-
-#: command-list.h:58
-msgid "List, create, or delete branches"
-msgstr ""
-
-#: command-list.h:59
-msgid "Collect information for user to file a bug report"
-msgstr ""
-
-#: command-list.h:60
-msgid "Move objects and refs by archive"
-msgstr ""
-
-#: command-list.h:61
-msgid "Provide content or type and size information for repository objects"
-msgstr ""
-
-#: command-list.h:62
-msgid "Display gitattributes information"
-msgstr ""
-
-#: command-list.h:63
-msgid "Debug gitignore / exclude files"
-msgstr ""
-
-#: command-list.h:64
-msgid "Show canonical names and email addresses of contacts"
-msgstr ""
-
-#: command-list.h:65
-msgid "Ensures that a reference name is well formed"
-msgstr ""
-
-#: command-list.h:66
-msgid "Switch branches or restore working tree files"
-msgstr ""
-
-#: command-list.h:67
-msgid "Copy files from the index to the working tree"
-msgstr ""
-
-#: command-list.h:68
-msgid "Find commits yet to be applied to upstream"
-msgstr ""
-
-#: command-list.h:69
-msgid "Apply the changes introduced by some existing commits"
-msgstr ""
-
-#: command-list.h:70
-msgid "Graphical alternative to git-commit"
-msgstr ""
-
-#: command-list.h:71
-msgid "Remove untracked files from the working tree"
-msgstr ""
-
-#: command-list.h:72
-msgid "Clone a repository into a new directory"
-msgstr ""
-
-#: command-list.h:73
-msgid "Display data in columns"
-msgstr ""
-
-#: command-list.h:74
-msgid "Record changes to the repository"
-msgstr ""
-
-#: command-list.h:75
-msgid "Write and verify Git commit-graph files"
-msgstr ""
-
-#: command-list.h:76
-msgid "Create a new commit object"
-msgstr ""
-
-#: command-list.h:77
-msgid "Get and set repository or global options"
-msgstr ""
-
-#: command-list.h:78
-msgid "Count unpacked number of objects and their disk consumption"
-msgstr ""
-
-#: command-list.h:79
-msgid "Retrieve and store user credentials"
-msgstr ""
-
-#: command-list.h:80
-msgid "Helper to temporarily store passwords in memory"
-msgstr ""
-
-#: command-list.h:81
-msgid "Helper to store credentials on disk"
-msgstr ""
-
-#: command-list.h:82
-msgid "Export a single commit to a CVS checkout"
-msgstr ""
-
-#: command-list.h:83
-msgid "Salvage your data out of another SCM people love to hate"
-msgstr ""
-
-#: command-list.h:84
-msgid "A CVS server emulator for Git"
-msgstr ""
-
-#: command-list.h:85
-msgid "A really simple server for Git repositories"
-msgstr ""
-
-#: command-list.h:86
-msgid "Give an object a human readable name based on an available ref"
-msgstr ""
-
-#: command-list.h:87
-msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
-
-#: command-list.h:88
-msgid "Compares files in the working tree and the index"
-msgstr ""
-
-#: command-list.h:89
-msgid "Compare a tree to the working tree or index"
-msgstr ""
-
-#: command-list.h:90
-msgid "Compares the content and mode of blobs found via two tree objects"
-msgstr ""
-
-#: command-list.h:91
-msgid "Show changes using common diff tools"
-msgstr ""
-
-#: command-list.h:92
-msgid "Git data exporter"
-msgstr ""
-
-#: command-list.h:93
-msgid "Backend for fast Git data importers"
-msgstr ""
-
-#: command-list.h:94
-msgid "Download objects and refs from another repository"
-msgstr ""
-
-#: command-list.h:95
-msgid "Receive missing objects from another repository"
-msgstr ""
-
-#: command-list.h:96
-msgid "Rewrite branches"
-msgstr ""
-
-#: command-list.h:97
-msgid "Produce a merge commit message"
-msgstr ""
-
-#: command-list.h:98
-msgid "Output information on each ref"
-msgstr ""
-
-#: command-list.h:99
-msgid "Run a Git command on a list of repositories"
-msgstr ""
-
-#: command-list.h:100
-msgid "Prepare patches for e-mail submission"
-msgstr ""
-
-#: command-list.h:101
-msgid "Verifies the connectivity and validity of the objects in the database"
-msgstr ""
-
-#: command-list.h:102
-msgid "Cleanup unnecessary files and optimize the local repository"
-msgstr ""
-
-#: command-list.h:103
-msgid "Extract commit ID from an archive created using git-archive"
-msgstr ""
-
-#: command-list.h:104
-msgid "Print lines matching a pattern"
-msgstr ""
-
-#: command-list.h:105
-msgid "A portable graphical interface to Git"
-msgstr ""
-
-#: command-list.h:106
-msgid "Compute object ID and optionally creates a blob from a file"
-msgstr ""
-
-#: command-list.h:107
-msgid "Display help information about Git"
-msgstr ""
-
-#: command-list.h:108
-msgid "Run git hooks"
-msgstr ""
-
-#: command-list.h:109
-msgid "Server side implementation of Git over HTTP"
-msgstr ""
-
-#: command-list.h:110
-msgid "Download from a remote Git repository via HTTP"
-msgstr ""
-
-#: command-list.h:111
-msgid "Push objects over HTTP/DAV to another repository"
-msgstr ""
-
-#: command-list.h:112
-msgid "Send a collection of patches from stdin to an IMAP folder"
-msgstr ""
-
-#: command-list.h:113
-msgid "Build pack index file for an existing packed archive"
-msgstr ""
-
-#: command-list.h:114
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
-
-#: command-list.h:115
-msgid "Instantly browse your working repository in gitweb"
-msgstr ""
-
-#: command-list.h:116
-msgid "Add or parse structured information in commit messages"
-msgstr ""
-
-#: command-list.h:117
-msgid "Show commit logs"
-msgstr ""
-
-#: command-list.h:118
-msgid "Show information about files in the index and the working tree"
-msgstr ""
-
-#: command-list.h:119
-msgid "List references in a remote repository"
-msgstr ""
-
-#: command-list.h:120
-msgid "List the contents of a tree object"
-msgstr ""
-
-#: command-list.h:121
-msgid "Extracts patch and authorship from a single e-mail message"
-msgstr ""
-
-#: command-list.h:122
-msgid "Simple UNIX mbox splitter program"
-msgstr ""
-
-#: command-list.h:123
-msgid "Run tasks to optimize Git repository data"
-msgstr ""
-
-#: command-list.h:124
-msgid "Join two or more development histories together"
-msgstr ""
-
-#: command-list.h:125
-msgid "Find as good common ancestors as possible for a merge"
-msgstr ""
-
-#: command-list.h:126
-msgid "Run a three-way file merge"
-msgstr ""
-
-#: command-list.h:127
-msgid "Run a merge for files needing merging"
-msgstr ""
-
-#: command-list.h:128
-msgid "The standard helper program to use with git-merge-index"
-msgstr ""
-
-#: command-list.h:129
-msgid "Show three-way merge without touching index"
-msgstr ""
-
-#: command-list.h:130
-msgid "Run merge conflict resolution tools to resolve merge conflicts"
-msgstr ""
-
-#: command-list.h:131
-msgid "Creates a tag object with extra validation"
-msgstr ""
-
-#: command-list.h:132
-msgid "Build a tree-object from ls-tree formatted text"
-msgstr ""
-
-#: command-list.h:133
-msgid "Write and verify multi-pack-indexes"
-msgstr ""
-
-#: command-list.h:134
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
-
-#: command-list.h:135
-msgid "Find symbolic names for given revs"
-msgstr ""
-
-#: command-list.h:136
-msgid "Add or inspect object notes"
-msgstr ""
-
-#: command-list.h:137
-msgid "Import from and submit to Perforce repositories"
-msgstr ""
-
-#: command-list.h:138
-msgid "Create a packed archive of objects"
-msgstr ""
-
-#: command-list.h:139
-msgid "Find redundant pack files"
-msgstr ""
-
-#: command-list.h:140
-msgid "Pack heads and tags for efficient repository access"
-msgstr ""
-
-#: command-list.h:141
-msgid "Compute unique ID for a patch"
-msgstr ""
-
-#: command-list.h:142
-msgid "Prune all unreachable objects from the object database"
-msgstr ""
-
-#: command-list.h:143
-msgid "Remove extra objects that are already in pack files"
-msgstr ""
-
-#: command-list.h:144
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr ""
-
-#: command-list.h:145
-msgid "Update remote refs along with associated objects"
-msgstr ""
-
-#: command-list.h:146
-msgid "Applies a quilt patchset onto the current branch"
-msgstr ""
-
-#: command-list.h:147
-msgid "Compare two commit ranges (e.g. two versions of a branch)"
-msgstr ""
-
-#: command-list.h:148
-msgid "Reads tree information into the index"
-msgstr ""
-
-#: command-list.h:149
-msgid "Reapply commits on top of another base tip"
-msgstr ""
-
-#: command-list.h:150
-msgid "Receive what is pushed into the repository"
-msgstr ""
-
-#: command-list.h:151
-msgid "Manage reflog information"
-msgstr ""
-
-#: command-list.h:152
-msgid "Manage set of tracked repositories"
-msgstr ""
-
-#: command-list.h:153
-msgid "Pack unpacked objects in a repository"
-msgstr ""
-
-#: command-list.h:154
-msgid "Create, list, delete refs to replace objects"
-msgstr ""
-
-#: command-list.h:155
-msgid "Generates a summary of pending changes"
-msgstr ""
-
-#: command-list.h:156
-msgid "Reuse recorded resolution of conflicted merges"
-msgstr ""
-
-#: command-list.h:157
-msgid "Reset current HEAD to the specified state"
-msgstr ""
-
-#: command-list.h:158
-msgid "Restore working tree files"
-msgstr ""
-
-#: command-list.h:159
-msgid "Lists commit objects in reverse chronological order"
-msgstr ""
-
-#: command-list.h:160
-msgid "Pick out and massage parameters"
-msgstr ""
-
-#: command-list.h:161
-msgid "Revert some existing commits"
-msgstr ""
-
-#: command-list.h:162
-msgid "Remove files from the working tree and from the index"
-msgstr ""
-
-#: command-list.h:163
-msgid "Send a collection of patches as emails"
-msgstr ""
-
-#: command-list.h:164
-msgid "Push objects over Git protocol to another repository"
-msgstr ""
-
-#: command-list.h:165
-msgid "Git's i18n setup code for shell scripts"
-msgstr ""
-
-#: command-list.h:166
-msgid "Common Git shell script setup code"
-msgstr ""
-
-#: command-list.h:167
-msgid "Restricted login shell for Git-only SSH access"
-msgstr ""
-
-#: command-list.h:168
-msgid "Summarize 'git log' output"
-msgstr ""
-
-#: command-list.h:169
-msgid "Show various types of objects"
-msgstr ""
-
-#: command-list.h:170
-msgid "Show branches and their commits"
-msgstr ""
-
-#: command-list.h:171
-msgid "Show packed archive index"
-msgstr ""
-
-#: command-list.h:172
-msgid "List references in a local repository"
-msgstr ""
-
-#: command-list.h:173
-msgid "Reduce your working tree to a subset of tracked files"
-msgstr ""
-
-#: command-list.h:174
-msgid "Add file contents to the staging area"
-msgstr ""
-
-#: command-list.h:175
-msgid "Stash the changes in a dirty working directory away"
-msgstr ""
-
-#: command-list.h:176
-msgid "Show the working tree status"
-msgstr ""
-
-#: command-list.h:177
-msgid "Remove unnecessary whitespace"
-msgstr ""
-
-#: command-list.h:178
-msgid "Initialize, update or inspect submodules"
-msgstr ""
-
-#: command-list.h:179
-msgid "Bidirectional operation between a Subversion repository and Git"
-msgstr ""
-
-#: command-list.h:180
-msgid "Switch branches"
-msgstr ""
-
-#: command-list.h:181
-msgid "Read, modify and delete symbolic refs"
-msgstr ""
-
-#: command-list.h:182
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
-
-#: command-list.h:183
-msgid "Creates a temporary file with a blob's contents"
-msgstr ""
-
-#: command-list.h:184
-msgid "Unpack objects from a packed archive"
-msgstr ""
-
-#: command-list.h:185
-msgid "Register file contents in the working tree to the index"
-msgstr ""
-
-#: command-list.h:186
-msgid "Update the object name stored in a ref safely"
-msgstr ""
-
-#: command-list.h:187
-msgid "Update auxiliary info file to help dumb servers"
-msgstr ""
-
-#: command-list.h:188
-msgid "Send archive back to git-archive"
-msgstr ""
-
-#: command-list.h:189
-msgid "Send objects packed back to git-fetch-pack"
-msgstr ""
-
-#: command-list.h:190
-msgid "Show a Git logical variable"
-msgstr ""
-
-#: command-list.h:191
-msgid "Check the GPG signature of commits"
-msgstr ""
-
-#: command-list.h:192
-msgid "Validate packed Git archive files"
-msgstr ""
-
-#: command-list.h:193
-msgid "Check the GPG signature of tags"
-msgstr ""
-
-#: command-list.h:194
-msgid "Show logs with difference each commit introduces"
-msgstr ""
-
-#: command-list.h:195
-msgid "Manage multiple working trees"
-msgstr ""
-
-#: command-list.h:196
-msgid "Create a tree object from the current index"
-msgstr ""
-
-#: command-list.h:197
-msgid "Defining attributes per path"
-msgstr ""
-
-#: command-list.h:198
-msgid "Git command-line interface and conventions"
-msgstr ""
-
-#: command-list.h:199
-msgid "A Git core tutorial for developers"
-msgstr ""
-
-#: command-list.h:200
-msgid "Providing usernames and passwords to Git"
-msgstr ""
-
-#: command-list.h:201
-msgid "Git for CVS users"
-msgstr ""
-
-#: command-list.h:202
-msgid "Tweaking diff output"
-msgstr ""
-
-#: command-list.h:203
-msgid "A useful minimum set of commands for Everyday Git"
-msgstr ""
-
-#: command-list.h:204
-msgid "Frequently asked questions about using Git"
-msgstr ""
-
-#: command-list.h:205
-msgid "A Git Glossary"
-msgstr ""
-
-#: command-list.h:206
-msgid "Hooks used by Git"
-msgstr ""
-
-#: command-list.h:207
-msgid "Specifies intentionally untracked files to ignore"
-msgstr ""
-
-#: command-list.h:208
-msgid "The Git repository browser"
-msgstr ""
-
-#: command-list.h:209
-msgid "Map author/committer names and/or E-Mail addresses"
-msgstr ""
-
-#: command-list.h:210
-msgid "Defining submodule properties"
-msgstr ""
-
-#: command-list.h:211
-msgid "Git namespaces"
-msgstr ""
-
-#: command-list.h:212
-msgid "Helper programs to interact with remote repositories"
-msgstr ""
-
-#: command-list.h:213
-msgid "Git Repository Layout"
-msgstr ""
-
-#: command-list.h:214
-msgid "Specifying revisions and ranges for Git"
-msgstr ""
-
-#: command-list.h:215
-msgid "Mounting one repository inside another"
-msgstr ""
-
-#: command-list.h:216
-msgid "A tutorial introduction to Git"
-msgstr ""
-
-#: command-list.h:217
-msgid "A tutorial introduction to Git: part two"
-msgstr ""
-
-#: command-list.h:218
-msgid "Git web interface (web frontend to Git repositories)"
-msgstr ""
-
-#: command-list.h:219
-msgid "An overview of recommended workflows with Git"
-msgstr ""
-
-#: git-merge-octopus.sh:46
-msgid ""
-"Error: Your local changes to the following files would be overwritten by "
-"merge"
-msgstr ""
-
-#: git-merge-octopus.sh:61
-msgid "Automated merge did not work."
-msgstr ""
-
-#: git-merge-octopus.sh:62
-msgid "Should not be doing an octopus."
-msgstr ""
-
-#: git-merge-octopus.sh:73
-#, sh-format
-msgid "Unable to find common commit with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:77
-#, sh-format
-msgid "Already up to date with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:89
-#, sh-format
-msgid "Fast-forwarding to: $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:97
-#, sh-format
-msgid "Trying simple merge with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:102
-msgid "Simple merge did not work, trying automatic merge."
-msgstr ""
-
-#: git-sh-setup.sh:89 git-sh-setup.sh:94
-#, sh-format
-msgid "usage: $dashless $USAGE"
-msgstr ""
-
-#: git-sh-setup.sh:182
-#, sh-format
-msgid "Cannot chdir to $cdup, the toplevel of the working tree"
-msgstr ""
-
-#: git-sh-setup.sh:191 git-sh-setup.sh:198
-#, sh-format
-msgid "fatal: $program_name cannot be used without a working tree."
-msgstr ""
-
-#: git-sh-setup.sh:212
-msgid "Cannot rewrite branches: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:215
-#, sh-format
-msgid "Cannot $action: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:226
-#, sh-format
-msgid "Cannot $action: Your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:228
-msgid "Additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:348
-msgid "You need to run this command from the toplevel of the working tree."
-msgstr ""
-
-#: git-sh-setup.sh:353
-msgid "Unable to determine absolute path of git directory"
-msgstr ""
-
-#. TRANSLATORS: you can adjust this to align "git add -i" status menu
-#: git-add--interactive.perl:212
-#, perl-format
-msgid "%12s %12s %s"
-msgstr ""
-
-#: git-add--interactive.perl:632
-#, perl-format
-msgid "touched %d path\n"
-msgid_plural "touched %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1056
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for staging."
-msgstr ""
-
-#: git-add--interactive.perl:1059
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for stashing."
-msgstr ""
-
-#: git-add--interactive.perl:1062
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for unstaging."
-msgstr ""
-
-#: git-add--interactive.perl:1065 git-add--interactive.perl:1074
-#: git-add--interactive.perl:1080
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for applying."
-msgstr ""
-
-#: git-add--interactive.perl:1068 git-add--interactive.perl:1071
-#: git-add--interactive.perl:1077
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for discarding."
-msgstr ""
-
-#: git-add--interactive.perl:1114
-#, perl-format
-msgid "failed to open hunk edit file for writing: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1121
-#, perl-format
-msgid ""
-"---\n"
-"To remove '%s' lines, make them ' ' lines (context).\n"
-"To remove '%s' lines, delete them.\n"
-"Lines starting with %s will be removed.\n"
-msgstr ""
-
-#: git-add--interactive.perl:1143
-#, perl-format
-msgid "failed to open hunk edit file for reading: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1253
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1259
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: git-add--interactive.perl:1265
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1271
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1277 git-add--interactive.perl:1295
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1283
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1289
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1301
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1316
-msgid ""
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: git-add--interactive.perl:1347
-msgid "The selected hunks do not apply to the index!\n"
-msgstr ""
-
-#: git-add--interactive.perl:1362
-#, perl-format
-msgid "ignoring unmerged: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1481
-#, perl-format
-msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1482
-#, perl-format
-msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1483
-#, perl-format
-msgid "Apply addition to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1484
-#, perl-format
-msgid "Apply this hunk to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1601
-msgid "No other hunks to goto\n"
-msgstr ""
-
-#: git-add--interactive.perl:1619
-#, perl-format
-msgid "Invalid number: '%s'\n"
-msgstr ""
-
-#: git-add--interactive.perl:1624
-#, perl-format
-msgid "Sorry, only %d hunk available.\n"
-msgid_plural "Sorry, only %d hunks available.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1659
-msgid "No other hunks to search\n"
-msgstr ""
-
-#: git-add--interactive.perl:1676
-#, perl-format
-msgid "Malformed search regexp %s: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1686
-msgid "No hunk matches the given pattern\n"
-msgstr ""
-
-#: git-add--interactive.perl:1698 git-add--interactive.perl:1720
-msgid "No previous hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1707 git-add--interactive.perl:1726
-msgid "No next hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1732
-msgid "Sorry, cannot split this hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1738
-#, perl-format
-msgid "Split into %d hunk.\n"
-msgid_plural "Split into %d hunks.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1748
-msgid "Sorry, cannot edit this hunk\n"
-msgstr ""
-
-#. TRANSLATORS: please do not translate the command names
-#. 'status', 'update', 'revert', etc.
-#: git-add--interactive.perl:1813
-msgid ""
-"status        - show paths with changes\n"
-"update        - add working tree state to the staged set of changes\n"
-"revert        - revert staged set of changes back to the HEAD version\n"
-"patch         - pick hunks and update selectively\n"
-"diff          - view diff between HEAD and index\n"
-"add untracked - add contents of untracked files to the staged set of "
-"changes\n"
-msgstr ""
-
-#: git-add--interactive.perl:1830 git-add--interactive.perl:1842
-#: git-add--interactive.perl:1845 git-add--interactive.perl:1852
-#: git-add--interactive.perl:1855 git-add--interactive.perl:1862
-#: git-add--interactive.perl:1866 git-add--interactive.perl:1872
-msgid "missing --"
-msgstr ""
-
-#: git-add--interactive.perl:1868
-#, perl-format
-msgid "unknown --patch mode: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1874 git-add--interactive.perl:1880
-#, perl-format
-msgid "invalid argument %s, expecting --"
-msgstr ""
-
-#: git-send-email.perl:159
-msgid "local zone differs from GMT by a non-minute interval\n"
-msgstr ""
-
-#: git-send-email.perl:166 git-send-email.perl:172
-msgid "local time offset greater than or equal to 24 hours\n"
-msgstr ""
-
-#: git-send-email.perl:244
-#, perl-format
-msgid "fatal: command '%s' died with exit code %d"
-msgstr ""
-
-#: git-send-email.perl:257
-msgid "the editor exited uncleanly, aborting everything"
-msgstr ""
-
-#: git-send-email.perl:346
-#, perl-format
-msgid ""
-"'%s' contains an intermediate version of the email you were composing.\n"
-msgstr ""
-
-#: git-send-email.perl:351
-#, perl-format
-msgid "'%s.final' contains the composed email.\n"
-msgstr ""
-
-#: git-send-email.perl:484
-msgid "--dump-aliases incompatible with other options\n"
-msgstr ""
-
-#: git-send-email.perl:561
-msgid ""
-"fatal: found configuration options for 'sendmail'\n"
-"git-send-email is configured with the sendemail.* options - note the 'e'.\n"
-"Set sendemail.forbidSendmailVariables to false to disable this check.\n"
-msgstr ""
-
-#: git-send-email.perl:566 git-send-email.perl:782
-msgid "Cannot run git format-patch from outside a repository\n"
-msgstr ""
-
-#: git-send-email.perl:569
-msgid ""
-"`batch-size` and `relogin` must be specified together (via command-line or "
-"configuration option)\n"
-msgstr ""
-
-#: git-send-email.perl:582
-#, perl-format
-msgid "Unknown --suppress-cc field: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:613
-#, perl-format
-msgid "Unknown --confirm setting: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:653
-#, perl-format
-msgid "warning: sendmail alias with quotes is not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:655
-#, perl-format
-msgid "warning: `:include:` not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:657
-#, perl-format
-msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:662
-#, perl-format
-msgid "warning: sendmail line is not recognized: %s\n"
-msgstr ""
-
-#: git-send-email.perl:747
-#, perl-format
-msgid ""
-"File '%s' exists but it could also be the range of commits\n"
-"to produce patches for.  Please disambiguate by...\n"
-"\n"
-"    * Saying \"./%s\" if you mean a file; or\n"
-"    * Giving --format-patch option if you mean a range.\n"
-msgstr ""
-
-#: git-send-email.perl:768
-#, perl-format
-msgid "Failed to opendir %s: %s"
-msgstr ""
-
-#: git-send-email.perl:803
-msgid ""
-"\n"
-"No patch files specified!\n"
-"\n"
-msgstr ""
-
-#: git-send-email.perl:816
-#, perl-format
-msgid "No subject line in %s?"
-msgstr ""
-
-#: git-send-email.perl:827
-#, perl-format
-msgid "Failed to open for writing %s: %s"
-msgstr ""
-
-#: git-send-email.perl:838
-msgid ""
-"Lines beginning in \"GIT:\" will be removed.\n"
-"Consider including an overall diffstat or table of contents\n"
-"for the patch you are writing.\n"
-"\n"
-"Clear the body content if you don't wish to send a summary.\n"
-msgstr ""
-
-#: git-send-email.perl:862
-#, perl-format
-msgid "Failed to open %s: %s"
-msgstr ""
-
-#: git-send-email.perl:879
-#, perl-format
-msgid "Failed to open %s.final: %s"
-msgstr ""
-
-#: git-send-email.perl:922
-msgid "Summary email is empty, skipping it\n"
-msgstr ""
-
-#. TRANSLATORS: please keep [y/N] as is.
-#: git-send-email.perl:971
-#, perl-format
-msgid "Are you sure you want to use <%s> [y/N]? "
-msgstr ""
-
-#: git-send-email.perl:1026
-msgid ""
-"The following files are 8bit, but do not declare a Content-Transfer-"
-"Encoding.\n"
-msgstr ""
-
-#: git-send-email.perl:1031
-msgid "Which 8bit encoding should I declare [UTF-8]? "
-msgstr ""
-
-#: git-send-email.perl:1039
-#, perl-format
-msgid ""
-"Refusing to send because the patch\n"
-"\t%s\n"
-"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
-"want to send.\n"
-msgstr ""
-
-#: git-send-email.perl:1058
-msgid "To whom should the emails be sent (if anyone)?"
-msgstr ""
-
-#: git-send-email.perl:1076
-#, perl-format
-msgid "fatal: alias '%s' expands to itself\n"
-msgstr ""
-
-#: git-send-email.perl:1088
-msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
-msgstr ""
-
-#: git-send-email.perl:1150 git-send-email.perl:1158
-#, perl-format
-msgid "error: unable to extract a valid address from: %s\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [q] [d] [e] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1162
-msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
-msgstr ""
-
-#: git-send-email.perl:1482
-#, perl-format
-msgid "CA path \"%s\" does not exist"
-msgstr ""
-
-#: git-send-email.perl:1565
-msgid ""
-"    The Cc list above has been expanded by additional\n"
-"    addresses found in the patch commit message. By default\n"
-"    send-email prompts before sending whenever this occurs.\n"
-"    This behavior is controlled by the sendemail.confirm\n"
-"    configuration setting.\n"
-"\n"
-"    For additional information, run 'git send-email --help'.\n"
-"    To retain the current behavior, but squelch this message,\n"
-"    run 'git config --global sendemail.confirm auto'.\n"
-"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y] [n] [e] [q] [a] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1580
-msgid "Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): "
-msgstr ""
-
-#: git-send-email.perl:1583
-msgid "Send this email reply required"
-msgstr ""
-
-#: git-send-email.perl:1617
-msgid "The required SMTP server is not properly defined."
-msgstr ""
-
-#: git-send-email.perl:1664
-#, perl-format
-msgid "Server does not support STARTTLS! %s"
-msgstr ""
-
-#: git-send-email.perl:1669 git-send-email.perl:1673
-#, perl-format
-msgid "STARTTLS failed! %s"
-msgstr ""
-
-#: git-send-email.perl:1682
-msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
-msgstr ""
-
-#: git-send-email.perl:1700
-#, perl-format
-msgid "Failed to send %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Dry-Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "Dry-OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1724
-msgid "Result: "
-msgstr ""
-
-#: git-send-email.perl:1727
-msgid "Result: OK\n"
-msgstr ""
-
-#: git-send-email.perl:1744
-#, perl-format
-msgid "can't open file %s"
-msgstr ""
-
-#: git-send-email.perl:1792 git-send-email.perl:1812
-#, perl-format
-msgid "(mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1798
-#, perl-format
-msgid "(mbox) Adding to: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1855
-#, perl-format
-msgid "(non-mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1890
-#, perl-format
-msgid "(body) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2009
-#, perl-format
-msgid "(%s) Could not execute '%s'"
-msgstr ""
-
-#: git-send-email.perl:2016
-#, perl-format
-msgid "(%s) Adding %s: %s from: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2020
-#, perl-format
-msgid "(%s) failed to close pipe to '%s'"
-msgstr ""
-
-#: git-send-email.perl:2050
-msgid "cannot send message as 7bit"
-msgstr ""
-
-#: git-send-email.perl:2058
-msgid "invalid transfer encoding"
-msgstr ""
-
-#: git-send-email.perl:2100
-#, perl-format
-msgid ""
-"fatal: %s: rejected by %s hook\n"
-"%s\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2110 git-send-email.perl:2163 git-send-email.perl:2173
-#, perl-format
-msgid "unable to open %s: %s\n"
-msgstr ""
-
-#: git-send-email.perl:2113
-#, perl-format
-msgid ""
-"fatal: %s:%d is longer than 998 characters\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2131
-#, perl-format
-msgid "Skipping %s with backup suffix '%s'.\n"
-msgstr ""
-
-#. TRANSLATORS: please keep "[y|N]" as is.
-#: git-send-email.perl:2135
-#, perl-format
-msgid "Do you really want to send %s? [y|N]: "
-msgstr ""
-- 
2.36.0.1.g15c4090757


^ permalink raw reply related	[relevance 1%]

* [PATCH v3 5/9] po/git.pot: this is now a generated file
  @ 2022-05-23  1:25  1% ` Jiang Xin
  0 siblings, 0 replies; 200+ results
From: Jiang Xin @ 2022-05-23  1:25 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason, Junio C Hamano, Git List
  Cc: Jiang Xin, Alexander Shopov, Jordi Mas, Matthias Rüster,
	Jimmy Angelakos, Christopher Díaz, Jean-Noël Avila,
	Bagas Sanjaya, Alessandro Menti, Gwan-gyeong Mun, Arusekk,
	Daniel Santos, Dimitriy Ryazantcev, Peter Krefting, Emir SARI,
	Trần Ngọc Quân, Fangyi Zhou, Yi-Jyun Pan,
	Jiang Xin

We no longer keep track of the contents of this file.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot

diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-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 ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, 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] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-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 ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#, c-format
-msgid ""
-"\n"
-"It took %.2f seconds to compute the branch ahead/behind values.\n"
-"You can use '--no-ahead-behind' to avoid this.\n"
-msgstr ""
-
-#: wt-status.c:1210
-msgid "You have unmerged paths."
-msgstr ""
-
-#: wt-status.c:1213
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr ""
-
-#: wt-status.c:1215
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr ""
-
-#: wt-status.c:1219
-msgid "All conflicts fixed but you are still merging."
-msgstr ""
-
-#: wt-status.c:1222
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr ""
-
-#: wt-status.c:1233
-msgid "You are in the middle of an am session."
-msgstr ""
-
-#: wt-status.c:1236
-msgid "The current patch is empty."
-msgstr ""
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-
-#: wt-status.c:1243
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1246
-msgid ""
-"  (use \"git am --allow-empty\" to record this patch as an empty commit)"
-msgstr ""
-
-#: wt-status.c:1248
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-
-#: wt-status.c:1381
-msgid "git-rebase-todo is missing."
-msgstr ""
-
-#: wt-status.c:1383
-msgid "No commands done."
-msgstr ""
-
-#: wt-status.c:1386
-#, c-format
-msgid "Last command done (%<PRIuMAX> command done):"
-msgid_plural "Last commands done (%<PRIuMAX> commands done):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1397
-#, c-format
-msgid "  (see more in file %s)"
-msgstr ""
-
-#: wt-status.c:1402
-msgid "No commands remaining."
-msgstr ""
-
-#: wt-status.c:1405
-#, c-format
-msgid "Next command to do (%<PRIuMAX> remaining command):"
-msgid_plural "Next commands to do (%<PRIuMAX> remaining commands):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1413
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr ""
-
-#: wt-status.c:1425
-#, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1430
-msgid "You are currently rebasing."
-msgstr ""
-
-#: wt-status.c:1443
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1445
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1447
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-
-#: wt-status.c:1454
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1458
-#, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1463
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1466
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1470
-#, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1475
-msgid "You are currently editing a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1478
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-
-#: wt-status.c:1480
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-
-#: wt-status.c:1491
-msgid "Cherry-pick currently in progress."
-msgstr ""
-
-#: wt-status.c:1494
-#, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr ""
-
-#: wt-status.c:1501
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1504
-msgid "  (run \"git cherry-pick --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1507
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1509
-msgid "  (use \"git cherry-pick --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1511
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-
-#: wt-status.c:1521
-msgid "Revert currently in progress."
-msgstr ""
-
-#: wt-status.c:1524
-#, c-format
-msgid "You are currently reverting commit %s."
-msgstr ""
-
-#: wt-status.c:1530
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1533
-msgid "  (run \"git revert --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1536
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1538
-msgid "  (use \"git revert --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1540
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-
-#: wt-status.c:1550
-#, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
-
-#: wt-status.c:1554
-msgid "You are currently bisecting."
-msgstr ""
-
-#: wt-status.c:1557
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr ""
-
-#: wt-status.c:1568
-msgid "You are in a sparse checkout."
-msgstr ""
-
-#: wt-status.c:1571
-#, c-format
-msgid "You are in a sparse checkout with %d%% of tracked files present."
-msgstr ""
-
-#: wt-status.c:1815
-msgid "On branch "
-msgstr ""
-
-#: wt-status.c:1822
-msgid "interactive rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1824
-msgid "rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1829
-msgid "HEAD detached at "
-msgstr ""
-
-#: wt-status.c:1831
-msgid "HEAD detached from "
-msgstr ""
-
-#: wt-status.c:1834
-msgid "Not currently on any branch."
-msgstr ""
-
-#: wt-status.c:1851
-msgid "Initial commit"
-msgstr ""
-
-#: wt-status.c:1852
-msgid "No commits yet"
-msgstr ""
-
-#: wt-status.c:1866
-msgid "Untracked files"
-msgstr ""
-
-#: wt-status.c:1868
-msgid "Ignored files"
-msgstr ""
-
-#: wt-status.c:1872
-#, c-format
-msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-
-#: wt-status.c:1878
-#, c-format
-msgid "Untracked files not listed%s"
-msgstr ""
-
-#: wt-status.c:1880
-msgid " (use -u option to show untracked files)"
-msgstr ""
-
-#: wt-status.c:1886
-msgid "No changes"
-msgstr ""
-
-#: wt-status.c:1891
-#, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-
-#: wt-status.c:1895
-#, c-format
-msgid "no changes added to commit\n"
-msgstr ""
-
-#: wt-status.c:1899
-#, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-
-#: wt-status.c:1903
-#, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr ""
-
-#: wt-status.c:1907
-#, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-
-#: wt-status.c:1911 wt-status.c:1917
-#, c-format
-msgid "nothing to commit\n"
-msgstr ""
-
-#: wt-status.c:1914
-#, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-
-#: wt-status.c:1919
-#, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr ""
-
-#: wt-status.c:2024
-msgid "No commits yet on "
-msgstr ""
-
-#: wt-status.c:2028
-msgid "HEAD (no branch)"
-msgstr ""
-
-#: wt-status.c:2059
-msgid "different"
-msgstr ""
-
-#: wt-status.c:2061 wt-status.c:2069
-msgid "behind "
-msgstr ""
-
-#: wt-status.c:2064 wt-status.c:2067
-msgid "ahead "
-msgstr ""
-
-#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2605
-#, c-format
-msgid "cannot %s: You have unstaged changes."
-msgstr ""
-
-#: wt-status.c:2611
-msgid "additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: wt-status.c:2613
-#, c-format
-msgid "cannot %s: Your index contains uncommitted changes."
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:205
-msgid "could not send IPC command"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:212
-msgid "could not read IPC response"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:892
-#, c-format
-msgid "could not start accept_thread '%s'"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:904
-#, c-format
-msgid "could not start worker[0] for '%s'"
-msgstr ""
-
-#: compat/precompose_utf8.c:58 builtin/clone.c:353
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:355
-msgid "Unable to create FSEventStream."
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:403
-msgid "Failed to start the FSEventStream"
-msgstr ""
-
-#: builtin/add.c:26
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/add.c:63
-#, c-format
-msgid "cannot chmod %cx '%s'"
-msgstr ""
-
-#: builtin/add.c:105
-#, c-format
-msgid "unexpected diff status %c"
-msgstr ""
-
-#: builtin/add.c:110 builtin/commit.c:299
-msgid "updating files failed"
-msgstr ""
-
-#: builtin/add.c:120
-#, c-format
-msgid "remove '%s'\n"
-msgstr ""
-
-#: builtin/add.c:204
-msgid "Unstaged changes after refreshing the index:"
-msgstr ""
-
-#: builtin/add.c:312 builtin/rev-parse.c:993
-msgid "Could not read the index"
-msgstr ""
-
-#: builtin/add.c:325
-msgid "Could not write patch"
-msgstr ""
-
-#: builtin/add.c:328
-msgid "editing patch failed"
-msgstr ""
-
-#: builtin/add.c:331
-#, c-format
-msgid "Could not stat '%s'"
-msgstr ""
-
-#: builtin/add.c:333
-msgid "Empty patch. Aborted."
-msgstr ""
-
-#: builtin/add.c:339
-#, c-format
-msgid "Could not apply '%s'"
-msgstr ""
-
-#: builtin/add.c:347
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-
-#: builtin/add.c:367 builtin/clean.c:927 builtin/fetch.c:175 builtin/mv.c:124
-#: builtin/prune-packed.c:14 builtin/pull.c:208 builtin/push.c:550
-#: builtin/remote.c:1454 builtin/rm.c:244 builtin/send-pack.c:194
-msgid "dry run"
-msgstr ""
-
-#: builtin/add.c:368 builtin/check-ignore.c:22 builtin/commit.c:1483
-#: builtin/count-objects.c:98 builtin/fsck.c:789 builtin/log.c:2338
-#: builtin/mv.c:123 builtin/read-tree.c:120
-msgid "be verbose"
-msgstr ""
-
-#: builtin/add.c:370
-msgid "interactive picking"
-msgstr ""
-
-#: builtin/add.c:371 builtin/checkout.c:1599 builtin/reset.c:417
-msgid "select hunks interactively"
-msgstr ""
-
-#: builtin/add.c:372
-msgid "edit current diff and apply"
-msgstr ""
-
-#: builtin/add.c:373
-msgid "allow adding otherwise ignored files"
-msgstr ""
-
-#: builtin/add.c:374
-msgid "update tracked files"
-msgstr ""
-
-#: builtin/add.c:375
-msgid "renormalize EOL of tracked files (implies -u)"
-msgstr ""
-
-#: builtin/add.c:376
-msgid "record only the fact that the path will be added later"
-msgstr ""
-
-#: builtin/add.c:377
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-
-#: builtin/add.c:380
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-
-#: builtin/add.c:382
-msgid "don't add, only refresh the index"
-msgstr ""
-
-#: builtin/add.c:383
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-
-#: builtin/add.c:384
-msgid "check if - even missing - files are ignored in dry run"
-msgstr ""
-
-#: builtin/add.c:385 builtin/mv.c:128 builtin/rm.c:251
-msgid "allow updating entries outside of the sparse-checkout cone"
-msgstr ""
-
-#: builtin/add.c:387 builtin/update-index.c:1023
-msgid "override the executable bit of the listed files"
-msgstr ""
-
-#: builtin/add.c:389
-msgid "warn when adding an embedded repository"
-msgstr ""
-
-#: builtin/add.c:407
-#, c-format
-msgid ""
-"You've added another git repository inside your current repository.\n"
-"Clones of the outer repository will not contain the contents of\n"
-"the embedded repository and will not know how to obtain it.\n"
-"If you meant to add a submodule, use:\n"
-"\n"
-"\tgit submodule add <url> %s\n"
-"\n"
-"If you added this path by mistake, you can remove it from the\n"
-"index with:\n"
-"\n"
-"\tgit rm --cached %s\n"
-"\n"
-"See \"git help submodule\" for more information."
-msgstr ""
-
-#: builtin/add.c:436
-#, c-format
-msgid "adding embedded git repository: %s"
-msgstr ""
-
-#: builtin/add.c:456
-msgid ""
-"Use -f if you really want to add them.\n"
-"Turn this message off by running\n"
-"\"git config advice.addIgnoredFile false\""
-msgstr ""
-
-#: builtin/add.c:471
-msgid "adding files failed"
-msgstr ""
-
-#: builtin/add.c:534
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr ""
-
-#: builtin/add.c:555 builtin/checkout.c:1770 builtin/commit.c:365
-#: builtin/reset.c:436 builtin/rm.c:275 builtin/stash.c:1702
-#, c-format
-msgid "'%s' and pathspec arguments cannot be used together"
-msgstr ""
-
-#: builtin/add.c:566
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr ""
-
-#: builtin/add.c:568
-msgid ""
-"Maybe you wanted to say 'git add .'?\n"
-"Turn this message off by running\n"
-"\"git config advice.addEmptyPathspec false\""
-msgstr ""
-
-#: builtin/am.c:393
-msgid "could not parse author script"
-msgstr ""
-
-#: builtin/am.c:483
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr ""
-
-#: builtin/am.c:525
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr ""
-
-#: builtin/am.c:563
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#: builtin/am.c:589
-msgid "fseek failed"
-msgstr ""
-
-#: builtin/am.c:777
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr ""
-
-#: builtin/am.c:842
-msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
-
-#: builtin/am.c:890
-msgid "invalid timestamp"
-msgstr ""
-
-#: builtin/am.c:895 builtin/am.c:907
-msgid "invalid Date line"
-msgstr ""
-
-#: builtin/am.c:902
-msgid "invalid timezone offset"
-msgstr ""
-
-#: builtin/am.c:995
-msgid "Patch format detection failed."
-msgstr ""
-
-#: builtin/am.c:1000 builtin/clone.c:306
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr ""
-
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr ""
-
-#: builtin/am.c:1154
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr ""
-
-#: builtin/am.c:1155
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-
-#: builtin/am.c:1160
-#, c-format
-msgid "To record the empty patch as an empty commit, run \"%s --allow-empty\"."
-msgstr ""
-
-#: builtin/am.c:1162
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-
-#: builtin/am.c:1257
-msgid "Patch sent with format=flowed; space at the end of lines might be lost."
-msgstr ""
-
-#: builtin/am.c:1345
-#, c-format
-msgid "missing author line in commit %s"
-msgstr ""
-
-#: builtin/am.c:1348
-#, c-format
-msgid "invalid ident line: %.*s"
-msgstr ""
-
-#: builtin/am.c:1567
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-
-#: builtin/am.c:1569
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-
-#: builtin/am.c:1588
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-
-#: builtin/am.c:1594
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-
-#: builtin/am.c:1620
-msgid "Failed to merge in the changes."
-msgstr ""
-
-#: builtin/am.c:1652
-msgid "applying to an empty history"
-msgstr ""
-
-#: builtin/am.c:1704 builtin/am.c:1708
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr ""
-
-#: builtin/am.c:1726
-msgid "Commit Body is:"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1736
-#, c-format
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-
-#: builtin/am.c:1782 builtin/commit.c:410
-msgid "unable to write index file"
-msgstr ""
-
-#: builtin/am.c:1786
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr ""
-
-#: builtin/am.c:1828
-#, c-format
-msgid "Skipping: %.*s"
-msgstr ""
-
-#: builtin/am.c:1833
-#, c-format
-msgid "Creating an empty commit: %.*s"
-msgstr ""
-
-#: builtin/am.c:1837
-msgid "Patch is empty."
-msgstr ""
-
-#: builtin/am.c:1848 builtin/am.c:1917
-#, c-format
-msgid "Applying: %.*s"
-msgstr ""
-
-#: builtin/am.c:1865
-msgid "No changes -- Patch already applied."
-msgstr ""
-
-#: builtin/am.c:1871
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr ""
-
-#: builtin/am.c:1875
-msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
-msgstr ""
-
-#: builtin/am.c:1921
-msgid "No changes - recorded it as an empty commit."
-msgstr ""
-
-#: builtin/am.c:1923
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"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 ""
-
-#: builtin/am.c:1931
-msgid ""
-"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."
-msgstr ""
-
-#: builtin/am.c:2039 builtin/am.c:2043 builtin/am.c:2055 builtin/reset.c:455
-#: builtin/reset.c:463
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr ""
-
-#: builtin/am.c:2091 builtin/am.c:2167
-msgid "failed to clean index"
-msgstr ""
-
-#: builtin/am.c:2135
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-
-#: builtin/am.c:2292
-#, c-format
-msgid "options '%s=%s' and '%s=%s' cannot be used together"
-msgstr ""
-
-#: builtin/am.c:2323
-msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
-msgstr ""
-
-#: builtin/am.c:2324
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr ""
-
-#: builtin/am.c:2330
-msgid "run interactively"
-msgstr ""
-
-#: builtin/am.c:2332
-msgid "historical option -- no-op"
-msgstr ""
-
-#: builtin/am.c:2334
-msgid "allow fall back on 3way merging if needed"
-msgstr ""
-
-#: builtin/am.c:2335 builtin/init-db.c:547 builtin/prune-packed.c:16
-#: builtin/repack.c:646 builtin/stash.c:946
-msgid "be quiet"
-msgstr ""
-
-#: builtin/am.c:2337
-msgid "add a Signed-off-by trailer to the commit message"
-msgstr ""
-
-#: builtin/am.c:2340
-msgid "recode into utf8 (default)"
-msgstr ""
-
-#: builtin/am.c:2342
-msgid "pass -k flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2344
-msgid "pass -b flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2346
-msgid "pass -m flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2348
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr ""
-
-#: builtin/am.c:2351
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-
-#: builtin/am.c:2354
-msgid "strip everything before a scissors line"
-msgstr ""
-
-#: builtin/am.c:2356
-msgid "pass it through git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2359 builtin/am.c:2362 builtin/am.c:2365 builtin/am.c:2368
-#: builtin/am.c:2371 builtin/am.c:2374 builtin/am.c:2377 builtin/am.c:2380
-#: builtin/am.c:2386
-msgid "pass it through git-apply"
-msgstr ""
-
-#: builtin/am.c:2376 builtin/commit.c:1514 builtin/fmt-merge-msg.c:18
-#: builtin/fmt-merge-msg.c:21 builtin/grep.c:920 builtin/merge.c:263
-#: builtin/pull.c:142 builtin/pull.c:204 builtin/pull.c:221
-#: builtin/rebase.c:1074 builtin/repack.c:657 builtin/repack.c:661
-#: builtin/repack.c:663 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:446 parse-options.h:159 parse-options.h:180
-#: parse-options.h:348
-msgid "n"
-msgstr ""
-
-#: builtin/am.c:2382 builtin/branch.c:695 builtin/bugreport.c:109
-#: builtin/cat-file.c:848 builtin/cat-file.c:852 builtin/cat-file.c:856
-#: builtin/for-each-ref.c:41 builtin/ls-tree.c:357 builtin/replace.c:555
-#: builtin/tag.c:480 builtin/verify-tag.c:38
-msgid "format"
-msgstr ""
-
-#: builtin/am.c:2383
-msgid "format the patch(es) are in"
-msgstr ""
-
-#: builtin/am.c:2389
-msgid "override error message when patch failure occurs"
-msgstr ""
-
-#: builtin/am.c:2391
-msgid "continue applying patches after resolving a conflict"
-msgstr ""
-
-#: builtin/am.c:2394
-msgid "synonyms for --continue"
-msgstr ""
-
-#: builtin/am.c:2397
-msgid "skip the current patch"
-msgstr ""
-
-#: builtin/am.c:2400
-msgid "restore the original branch and abort the patching operation"
-msgstr ""
-
-#: builtin/am.c:2403
-msgid "abort the patching operation but keep HEAD where it is"
-msgstr ""
-
-#: builtin/am.c:2407
-msgid "show the patch being applied"
-msgstr ""
-
-#: builtin/am.c:2411
-msgid "record the empty patch as an empty commit"
-msgstr ""
-
-#: builtin/am.c:2415
-msgid "lie about committer date"
-msgstr ""
-
-#: builtin/am.c:2417
-msgid "use current timestamp for author date"
-msgstr ""
-
-#: builtin/am.c:2419 builtin/commit-tree.c:118 builtin/commit.c:1642
-#: builtin/merge.c:302 builtin/pull.c:179 builtin/rebase.c:1127
-#: builtin/revert.c:117 builtin/tag.c:461
-msgid "key-id"
-msgstr ""
-
-#: builtin/am.c:2420 builtin/rebase.c:1128
-msgid "GPG-sign commits"
-msgstr ""
-
-#: builtin/am.c:2423
-msgid "how to handle empty patches"
-msgstr ""
-
-#: builtin/am.c:2426
-msgid "(internal use for git-rebase)"
-msgstr ""
-
-#: builtin/am.c:2444
-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 ""
-
-#: builtin/am.c:2451
-msgid "failed to read the index"
-msgstr ""
-
-#: builtin/am.c:2466
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-
-#: builtin/am.c:2490
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-
-#: builtin/am.c:2496
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
-
-#: builtin/am.c:2506
-msgid "interactive mode requires patches on the command line"
-msgstr ""
-
-#: builtin/apply.c:8
-msgid "git apply [<options>] [<patch>...]"
-msgstr ""
-
-#: builtin/archive.c:18
-msgid "could not redirect output"
-msgstr ""
-
-#: builtin/archive.c:35
-msgid "git archive: Remote with no URL"
-msgstr ""
-
-#: builtin/archive.c:59
-msgid "git archive: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: builtin/archive.c:62
-#, c-format
-msgid "git archive: NACK %s"
-msgstr ""
-
-#: builtin/archive.c:63
-msgid "git archive: protocol error"
-msgstr ""
-
-#: builtin/archive.c:67
-msgid "git archive: expected a flush"
-msgstr ""
-
-#: builtin/bisect--helper.c:24
-msgid "git bisect--helper --bisect-reset [<commit>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:26
-msgid ""
-"git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
-"=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
-"[<paths>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:29
-msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:30
-msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:31
-msgid "git bisect--helper --bisect-replay <filename>"
-msgstr ""
-
-#: builtin/bisect--helper.c:32
-msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:34
-msgid "git bisect--helper --bisect-run <cmd>..."
-msgstr ""
-
-#: builtin/bisect--helper.c:109
-#, c-format
-msgid "cannot open file '%s' in mode '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:116
-#, c-format
-msgid "could not write to file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:154
-#, c-format
-msgid "cannot open file '%s' for reading"
-msgstr ""
-
-#: builtin/bisect--helper.c:170
-#, c-format
-msgid "'%s' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:174
-#, c-format
-msgid "can't use the builtin command '%s' as a term"
-msgstr ""
-
-#: builtin/bisect--helper.c:184
-#, c-format
-msgid "can't change the meaning of the term '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:194
-msgid "please use two different terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:210
-#, c-format
-msgid "We are not bisecting.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:218
-#, c-format
-msgid "'%s' is not a valid commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:227
-#, c-format
-msgid ""
-"could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:271
-#, c-format
-msgid "Bad bisect_write argument: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:276
-#, c-format
-msgid "couldn't get the oid of the rev '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:288
-#, c-format
-msgid "couldn't open the file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:314
-#, c-format
-msgid "Invalid command: you're currently in a %s/%s bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:341
-#, c-format
-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 ""
-
-#: builtin/bisect--helper.c:345
-#, c-format
-msgid ""
-"You need to start by \"git bisect start\".\n"
-"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 ""
-
-#: builtin/bisect--helper.c:365
-#, c-format
-msgid "bisecting only with a %s commit"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:373
-msgid "Are you sure [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:434
-msgid "no terms defined"
-msgstr ""
-
-#: builtin/bisect--helper.c:437
-#, c-format
-msgid ""
-"Your current terms are %s for the old state\n"
-"and %s for the new state.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:447
-#, c-format
-msgid ""
-"invalid argument %s for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
-msgstr ""
-
-#: builtin/bisect--helper.c:514 builtin/bisect--helper.c:1038
-msgid "revision walk setup failed\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:536
-#, c-format
-msgid "could not open '%s' for appending"
-msgstr ""
-
-#: builtin/bisect--helper.c:655 builtin/bisect--helper.c:668
-msgid "'' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:678
-#, c-format
-msgid "unrecognized option: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:682
-#, c-format
-msgid "'%s' does not appear to be a valid revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:713
-msgid "bad HEAD - I need a HEAD"
-msgstr ""
-
-#: builtin/bisect--helper.c:728
-#, c-format
-msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:749
-msgid "won't bisect on cg-seek'ed tree"
-msgstr ""
-
-#: builtin/bisect--helper.c:752
-msgid "bad HEAD - strange symbolic ref"
-msgstr ""
-
-#: builtin/bisect--helper.c:772
-#, c-format
-msgid "invalid ref: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:830
-msgid "You need to start by \"git bisect start\"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:841
-msgid "Do you want me to do it for you [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:859
-msgid "Please call `--bisect-state` with at least one argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:872
-#, c-format
-msgid "'git bisect %s' can take only one argument."
-msgstr ""
-
-#: builtin/bisect--helper.c:884 builtin/bisect--helper.c:897
-#, c-format
-msgid "Bad rev input: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:904
-#, c-format
-msgid "Bad rev input (not a commit): %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:936
-msgid "We are not bisecting."
-msgstr ""
-
-#: builtin/bisect--helper.c:986
-#, c-format
-msgid "'%s'?? what are you talking about?"
-msgstr ""
-
-#: builtin/bisect--helper.c:998
-#, c-format
-msgid "cannot read file '%s' for replaying"
-msgstr ""
-
-#: builtin/bisect--helper.c:1120 builtin/bisect--helper.c:1152
-#, c-format
-msgid "running %s\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:1145 builtin/bisect--helper.c:1335
-msgid "bisect run failed: no command provided."
-msgstr ""
-
-#: builtin/bisect--helper.c:1166
-#, c-format
-msgid "unable to verify '%s' on good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1172
-#, c-format
-msgid "bogus exit code %d for good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1180
-#, c-format
-msgid "bisect run failed: exit code %d from '%s' is < 0 or >= 128"
-msgstr ""
-
-#: builtin/bisect--helper.c:1195
-#, c-format
-msgid "cannot open file '%s' for writing"
-msgstr ""
-
-#: builtin/bisect--helper.c:1213
-msgid "bisect run cannot continue any more"
-msgstr ""
-
-#: builtin/bisect--helper.c:1215
-#, c-format
-msgid "bisect run success"
-msgstr ""
-
-#: builtin/bisect--helper.c:1218
-#, c-format
-msgid "bisect found first bad commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1221
-#, c-format
-msgid ""
-"bisect run failed: 'git bisect--helper --bisect-state %s' exited with error "
-"code %d"
-msgstr ""
-
-#: builtin/bisect--helper.c:1253
-msgid "reset the bisection state"
-msgstr ""
-
-#: builtin/bisect--helper.c:1255
-msgid "check whether bad or good terms exist"
-msgstr ""
-
-#: builtin/bisect--helper.c:1257
-msgid "print out the bisect terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:1259
-msgid "start the bisect session"
-msgstr ""
-
-#: builtin/bisect--helper.c:1261
-msgid "find the next bisection commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1263
-msgid "mark the state of ref (or refs)"
-msgstr ""
-
-#: builtin/bisect--helper.c:1265
-msgid "list the bisection steps so far"
-msgstr ""
-
-#: builtin/bisect--helper.c:1267
-msgid "replay the bisection process from the given file"
-msgstr ""
-
-#: builtin/bisect--helper.c:1269
-msgid "skip some commits for checkout"
-msgstr ""
-
-#: builtin/bisect--helper.c:1271
-msgid "visualize the bisection"
-msgstr ""
-
-#: builtin/bisect--helper.c:1273
-msgid "use <cmd>... to automatically bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:1275
-msgid "no log for BISECT_WRITE"
-msgstr ""
-
-#: builtin/bisect--helper.c:1290
-msgid "--bisect-reset requires either no argument or a commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1295
-msgid "--bisect-terms requires 0 or 1 argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:1304
-msgid "--bisect-next requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1315
-msgid "--bisect-log requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1320
-msgid "no logfile given"
-msgstr ""
-
-#: builtin/blame.c:32
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr ""
-
-#: builtin/blame.c:37
-msgid "<rev-opts> are documented in git-rev-list(1)"
-msgstr ""
-
-#: builtin/blame.c:406
-#, c-format
-msgid "expecting a color: %s"
-msgstr ""
-
-#: builtin/blame.c:413
-msgid "must end with a color"
-msgstr ""
-
-#: builtin/blame.c:842
-#, c-format
-msgid "cannot find revision %s to ignore"
-msgstr ""
-
-#: builtin/blame.c:864
-msgid "show blame entries as we find them, incrementally"
-msgstr ""
-
-#: builtin/blame.c:865
-msgid "do not show object names of boundary commits (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:866
-msgid "do not treat root commits as boundaries (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:867
-msgid "show work cost statistics"
-msgstr ""
-
-#: builtin/blame.c:868 builtin/checkout.c:1554 builtin/clone.c:98
-#: builtin/commit-graph.c:75 builtin/commit-graph.c:228 builtin/fetch.c:181
-#: builtin/merge.c:301 builtin/multi-pack-index.c:103
-#: builtin/multi-pack-index.c:154 builtin/multi-pack-index.c:180
-#: builtin/multi-pack-index.c:208 builtin/pull.c:120 builtin/push.c:566
-#: builtin/remote.c:683 builtin/send-pack.c:202
-msgid "force progress reporting"
-msgstr ""
-
-#: builtin/blame.c:869
-msgid "show output score for blame entries"
-msgstr ""
-
-#: builtin/blame.c:870
-msgid "show original filename (Default: auto)"
-msgstr ""
-
-#: builtin/blame.c:871
-msgid "show original linenumber (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:872
-msgid "show in a format designed for machine consumption"
-msgstr ""
-
-#: builtin/blame.c:873
-msgid "show porcelain format with per-line commit information"
-msgstr ""
-
-#: builtin/blame.c:874
-msgid "use the same output mode as git-annotate (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:875
-msgid "show raw timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:876
-msgid "show long commit SHA1 (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:877
-msgid "suppress author name and timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:878
-msgid "show author email instead of name (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:879
-msgid "ignore whitespace differences"
-msgstr ""
-
-#: builtin/blame.c:880 builtin/log.c:1857
-msgid "rev"
-msgstr ""
-
-#: builtin/blame.c:880
-msgid "ignore <rev> when blaming"
-msgstr ""
-
-#: builtin/blame.c:881
-msgid "ignore revisions from <file>"
-msgstr ""
-
-#: builtin/blame.c:882
-msgid "color redundant metadata from previous line differently"
-msgstr ""
-
-#: builtin/blame.c:883
-msgid "color lines by age"
-msgstr ""
-
-#: builtin/blame.c:884
-msgid "spend extra cycles to find better match"
-msgstr ""
-
-#: builtin/blame.c:885
-msgid "use revisions from <file> instead of calling git-rev-list"
-msgstr ""
-
-#: builtin/blame.c:886
-msgid "use <file>'s contents as the final image"
-msgstr ""
-
-#: builtin/blame.c:887 builtin/blame.c:888
-msgid "score"
-msgstr ""
-
-#: builtin/blame.c:887
-msgid "find line copies within and across files"
-msgstr ""
-
-#: builtin/blame.c:888
-msgid "find line movements within and across files"
-msgstr ""
-
-#: builtin/blame.c:889
-msgid "range"
-msgstr ""
-
-#: builtin/blame.c:890
-msgid "process only line range <start>,<end> or function :<funcname>"
-msgstr ""
-
-#: builtin/blame.c:949
-msgid "--progress can't be used with --incremental or porcelain formats"
-msgstr ""
-
-#. TRANSLATORS: This string is used to tell us the
-#. maximum display width for a relative timestamp in
-#. "git blame" output.  For C locale, "4 years, 11
-#. months ago", which takes 22 places, is the longest
-#. among various forms of relative timestamps, but
-#. your language may need more or fewer display
-#. columns.
-#.
-#: builtin/blame.c:1000
-msgid "4 years, 11 months ago"
-msgstr ""
-
-#: builtin/blame.c:1116
-#, c-format
-msgid "file %s has only %lu line"
-msgid_plural "file %s has only %lu lines"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/blame.c:1161
-msgid "Blaming lines"
-msgstr ""
-
-#: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--merged] [--no-merged]"
-msgstr ""
-
-#: builtin/branch.c:30
-msgid ""
-"git branch [<options>] [-f] [--recurse-submodules] <branch-name> [<start-"
-"point>]"
-msgstr ""
-
-#: builtin/branch.c:31
-msgid "git branch [<options>] [-l] [<pattern>...]"
-msgstr ""
-
-#: builtin/branch.c:32
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr ""
-
-#: builtin/branch.c:33
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:34
-msgid "git branch [<options>] (-c | -C) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:35
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr ""
-
-#: builtin/branch.c:36
-msgid "git branch [<options>] [-r | -a] [--format]"
-msgstr ""
-
-#: builtin/branch.c:165
-#, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:169
-#, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:183
-#, c-format
-msgid "Couldn't look up commit object for '%s'"
-msgstr ""
-
-#: builtin/branch.c:187
-#, c-format
-msgid ""
-"The branch '%s' is not fully merged.\n"
-"If you are sure you want to delete it, run 'git branch -D %s'."
-msgstr ""
-
-#: builtin/branch.c:200
-msgid "Update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:235
-msgid "cannot use -a with -d"
-msgstr ""
-
-#: builtin/branch.c:242
-msgid "Couldn't look up commit object for HEAD"
-msgstr ""
-
-#: builtin/branch.c:259
-#, c-format
-msgid "Cannot delete branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/branch.c:274
-#, c-format
-msgid "remote-tracking branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:275
-#, c-format
-msgid "branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:306
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:307
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:457 builtin/tag.c:64
-msgid "unable to parse format string"
-msgstr ""
-
-#: builtin/branch.c:488
-msgid "could not resolve HEAD"
-msgstr ""
-
-#: builtin/branch.c:494
-#, c-format
-msgid "HEAD (%s) points outside of refs/heads/"
-msgstr ""
-
-#: builtin/branch.c:509
-#, c-format
-msgid "Branch %s is being rebased at %s"
-msgstr ""
-
-#: builtin/branch.c:513
-#, c-format
-msgid "Branch %s is being bisected at %s"
-msgstr ""
-
-#: builtin/branch.c:530
-msgid "cannot copy the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:532
-msgid "cannot rename the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:543
-#, c-format
-msgid "Invalid branch name: '%s'"
-msgstr ""
-
-#: builtin/branch.c:572
-msgid "Branch rename failed"
-msgstr ""
-
-#: builtin/branch.c:574
-msgid "Branch copy failed"
-msgstr ""
-
-#: builtin/branch.c:578
-#, c-format
-msgid "Created a copy of a misnamed branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:581
-#, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
-
-#: builtin/branch.c:587
-#, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
-
-#: builtin/branch.c:596
-msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:598
-msgid "Branch is copied, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:614
-#, c-format
-msgid ""
-"Please edit the description for the branch\n"
-"  %s\n"
-"Lines starting with '%c' will be stripped.\n"
-msgstr ""
-
-#: builtin/branch.c:651
-msgid "Generic options"
-msgstr ""
-
-#: builtin/branch.c:653
-msgid "show hash and subject, give twice for upstream branch"
-msgstr ""
-
-#: builtin/branch.c:654
-msgid "suppress informational messages"
-msgstr ""
-
-#: builtin/branch.c:656 builtin/checkout.c:1571
-#: builtin/submodule--helper.c:3077
-msgid "set branch tracking configuration"
-msgstr ""
-
-#: builtin/branch.c:659
-msgid "do not use"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "upstream"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "change the upstream info"
-msgstr ""
-
-#: builtin/branch.c:662
-msgid "unset the upstream info"
-msgstr ""
-
-#: builtin/branch.c:663
-msgid "use colored output"
-msgstr ""
-
-#: builtin/branch.c:664
-msgid "act on remote-tracking branches"
-msgstr ""
-
-#: builtin/branch.c:666 builtin/branch.c:668
-msgid "print only branches that contain the commit"
-msgstr ""
-
-#: builtin/branch.c:667 builtin/branch.c:669
-msgid "print only branches that don't contain the commit"
-msgstr ""
-
-#: builtin/branch.c:672
-msgid "Specific git-branch actions:"
-msgstr ""
-
-#: builtin/branch.c:673
-msgid "list both remote-tracking and local branches"
-msgstr ""
-
-#: builtin/branch.c:675
-msgid "delete fully merged branch"
-msgstr ""
-
-#: builtin/branch.c:676
-msgid "delete branch (even if not merged)"
-msgstr ""
-
-#: builtin/branch.c:677
-msgid "move/rename a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:678
-msgid "move/rename a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:679
-msgid "copy a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:680
-msgid "copy a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:681
-msgid "list branch names"
-msgstr ""
-
-#: builtin/branch.c:682
-msgid "show current branch name"
-msgstr ""
-
-#: builtin/branch.c:683 builtin/submodule--helper.c:3075
-msgid "create the branch's reflog"
-msgstr ""
-
-#: builtin/branch.c:685
-msgid "edit the description for the branch"
-msgstr ""
-
-#: builtin/branch.c:686
-msgid "force creation, move/rename, deletion"
-msgstr ""
-
-#: builtin/branch.c:687
-msgid "print only branches that are merged"
-msgstr ""
-
-#: builtin/branch.c:688
-msgid "print only branches that are not merged"
-msgstr ""
-
-#: builtin/branch.c:689
-msgid "list branches in columns"
-msgstr ""
-
-#: builtin/branch.c:691 builtin/for-each-ref.c:45 builtin/notes.c:413
-#: builtin/notes.c:416 builtin/notes.c:579 builtin/notes.c:582
-#: builtin/tag.c:476
-msgid "object"
-msgstr ""
-
-#: builtin/branch.c:692
-msgid "print only branches of the object"
-msgstr ""
-
-#: builtin/branch.c:693 builtin/for-each-ref.c:51 builtin/tag.c:483
-msgid "sorting and filtering are case insensitive"
-msgstr ""
-
-#: builtin/branch.c:694 builtin/ls-files.c:667
-msgid "recurse through submodules"
-msgstr ""
-
-#: builtin/branch.c:695 builtin/for-each-ref.c:41 builtin/ls-tree.c:358
-#: builtin/tag.c:481 builtin/verify-tag.c:38
-msgid "format to use for the output"
-msgstr ""
-
-#: builtin/branch.c:718 builtin/clone.c:684
-msgid "HEAD not found below refs/heads!"
-msgstr ""
-
-#: builtin/branch.c:739
-msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
-msgstr ""
-
-#: builtin/branch.c:741
-msgid "--recurse-submodules can only be used to create branches"
-msgstr ""
-
-#: builtin/branch.c:770 builtin/branch.c:826 builtin/branch.c:835
-msgid "branch name required"
-msgstr ""
-
-#: builtin/branch.c:802
-msgid "Cannot give description to detached HEAD"
-msgstr ""
-
-#: builtin/branch.c:807
-msgid "cannot edit description of more than one branch"
-msgstr ""
-
-#: builtin/branch.c:814
-#, c-format
-msgid "No commit on branch '%s' yet."
-msgstr ""
-
-#: builtin/branch.c:817
-#, c-format
-msgid "No branch named '%s'."
-msgstr ""
-
-#: builtin/branch.c:832
-msgid "too many branches for a copy operation"
-msgstr ""
-
-#: builtin/branch.c:841
-msgid "too many arguments for a rename operation"
-msgstr ""
-
-#: builtin/branch.c:846
-msgid "too many arguments to set new upstream"
-msgstr ""
-
-#: builtin/branch.c:850
-#, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:853 builtin/branch.c:873
-#, c-format
-msgid "no such branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:857
-#, c-format
-msgid "branch '%s' does not exist"
-msgstr ""
-
-#: builtin/branch.c:867
-msgid "too many arguments to unset upstream"
-msgstr ""
-
-#: builtin/branch.c:871
-msgid "could not unset upstream of HEAD when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:877
-#, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr ""
-
-#: builtin/branch.c:890
-msgid ""
-"The -a, and -r, options to 'git branch' do not take a branch name.\n"
-"Did you mean to use: -a|-r --list <pattern>?"
-msgstr ""
-
-#: builtin/branch.c:894
-msgid ""
-"the '--set-upstream' option is no longer supported. Please use '--track' or "
-"'--set-upstream-to' instead."
-msgstr ""
-
-#: builtin/bugreport.c:16
-msgid "git version:\n"
-msgstr ""
-
-#: builtin/bugreport.c:22
-#, c-format
-msgid "uname() failed with error '%s' (%d)\n"
-msgstr ""
-
-#: builtin/bugreport.c:32
-msgid "compiler info: "
-msgstr ""
-
-#: builtin/bugreport.c:35
-msgid "libc info: "
-msgstr ""
-
-#: builtin/bugreport.c:49
-msgid "not run from a git repository - no hooks to show\n"
-msgstr ""
-
-#: builtin/bugreport.c:62
-msgid "git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"
-msgstr ""
-
-#: builtin/bugreport.c:69
-msgid ""
-"Thank you for filling out a Git bug report!\n"
-"Please answer the following questions to help us understand your issue.\n"
-"\n"
-"What did you do before the bug happened? (Steps to reproduce your issue)\n"
-"\n"
-"What did you expect to happen? (Expected behavior)\n"
-"\n"
-"What happened instead? (Actual behavior)\n"
-"\n"
-"What's different between what you expected and what actually happened?\n"
-"\n"
-"Anything else you want to add:\n"
-"\n"
-"Please review the rest of the bug report below.\n"
-"You can delete any lines you don't wish to share.\n"
-msgstr ""
-
-#: builtin/bugreport.c:108
-msgid "specify a destination for the bugreport file"
-msgstr ""
-
-#: builtin/bugreport.c:110
-msgid "specify a strftime format suffix for the filename"
-msgstr ""
-
-#: builtin/bugreport.c:132
-#, c-format
-msgid "could not create leading directories for '%s'"
-msgstr ""
-
-#: builtin/bugreport.c:139
-msgid "System Info"
-msgstr ""
-
-#: builtin/bugreport.c:142
-msgid "Enabled Hooks"
-msgstr ""
-
-#: builtin/bugreport.c:149
-#, c-format
-msgid "unable to write to %s"
-msgstr ""
-
-#: builtin/bugreport.c:159
-#, c-format
-msgid "Created new report at '%s'.\n"
-msgstr ""
-
-#: builtin/bundle.c:15 builtin/bundle.c:23
-msgid "git bundle create [<options>] <file> <git-rev-list args>"
-msgstr ""
-
-#: builtin/bundle.c:16 builtin/bundle.c:28
-msgid "git bundle verify [<options>] <file>"
-msgstr ""
-
-#: builtin/bundle.c:17 builtin/bundle.c:33
-msgid "git bundle list-heads <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:18 builtin/bundle.c:38
-msgid "git bundle unbundle <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:65 builtin/pack-objects.c:3899
-msgid "do not show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:67 builtin/bundle.c:168 builtin/pack-objects.c:3901
-msgid "show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:69 builtin/pack-objects.c:3903
-msgid "show progress meter during object writing phase"
-msgstr ""
-
-#: builtin/bundle.c:72 builtin/pack-objects.c:3906
-msgid "similar to --all-progress when progress meter is shown"
-msgstr ""
-
-#: builtin/bundle.c:74
-msgid "specify bundle format version"
-msgstr ""
-
-#: builtin/bundle.c:94
-msgid "Need a repository to create a bundle."
-msgstr ""
-
-#: builtin/bundle.c:108
-msgid "do not show bundle details"
-msgstr ""
-
-#: builtin/bundle.c:127
-#, c-format
-msgid "%s is okay\n"
-msgstr ""
-
-#: builtin/bundle.c:183
-msgid "Need a repository to unbundle."
-msgstr ""
-
-#: builtin/bundle.c:186
-msgid "Unbundling objects"
-msgstr ""
-
-#: builtin/bundle.c:220 builtin/remote.c:1758
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr ""
-
-#: builtin/cat-file.c:568
-msgid "flush is only for --buffer mode"
-msgstr ""
-
-#: builtin/cat-file.c:612
-msgid "empty command in input"
-msgstr ""
-
-#: builtin/cat-file.c:614
-#, c-format
-msgid "whitespace before command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:623
-#, c-format
-msgid "%s requires arguments"
-msgstr ""
-
-#: builtin/cat-file.c:628
-#, c-format
-msgid "%s takes no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:636
-#, c-format
-msgid "unknown command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:795
-msgid "only one batch option may be specified"
-msgstr ""
-
-#: builtin/cat-file.c:824
-msgid "git cat-file <type> <object>"
-msgstr ""
-
-#: builtin/cat-file.c:825
-msgid "git cat-file (-e | -p) <object>"
-msgstr ""
-
-#: builtin/cat-file.c:826
-msgid "git cat-file (-t | -s) [--allow-unknown-type] <object>"
-msgstr ""
-
-#: builtin/cat-file.c:827
-msgid ""
-"git cat-file (--batch | --batch-check | --batch-command) [--batch-all-"
-"objects]\n"
-"             [--buffer] [--follow-symlinks] [--unordered]\n"
-"             [--textconv | --filters]"
-msgstr ""
-
-#: builtin/cat-file.c:830
-msgid ""
-"git cat-file (--textconv | --filters)\n"
-"             [<rev>:<path|tree-ish> | --path=<path|tree-ish> <rev>]"
-msgstr ""
-
-#: builtin/cat-file.c:836
-msgid "Check object existence or emit object contents"
-msgstr ""
-
-#: builtin/cat-file.c:838
-msgid "check if <object> exists"
-msgstr ""
-
-#: builtin/cat-file.c:839
-msgid "pretty-print <object> content"
-msgstr ""
-
-#: builtin/cat-file.c:841
-msgid "Emit [broken] object attributes"
-msgstr ""
-
-#: builtin/cat-file.c:842
-msgid "show object type (one of 'blob', 'tree', 'commit', 'tag', ...)"
-msgstr ""
-
-#: builtin/cat-file.c:843
-msgid "show object size"
-msgstr ""
-
-#: builtin/cat-file.c:845
-msgid "allow -s and -t to work with broken/corrupt objects"
-msgstr ""
-
-#: builtin/cat-file.c:847
-msgid "Batch objects requested on stdin (or --batch-all-objects)"
-msgstr ""
-
-#: builtin/cat-file.c:849
-msgid "show full <object> or <rev> contents"
-msgstr ""
-
-#: builtin/cat-file.c:853
-msgid "like --batch, but don't emit <contents>"
-msgstr ""
-
-#: builtin/cat-file.c:857
-msgid "read commands from stdin"
-msgstr ""
-
-#: builtin/cat-file.c:861
-msgid "with --batch[-check]: ignores stdin, batches all known objects"
-msgstr ""
-
-#: builtin/cat-file.c:863
-msgid "Change or optimize batch output"
-msgstr ""
-
-#: builtin/cat-file.c:864
-msgid "buffer --batch output"
-msgstr ""
-
-#: builtin/cat-file.c:866
-msgid "follow in-tree symlinks"
-msgstr ""
-
-#: builtin/cat-file.c:868
-msgid "do not order objects before emitting them"
-msgstr ""
-
-#: builtin/cat-file.c:870
-msgid ""
-"Emit object (blob or tree) with conversion or filter (stand-alone, or with "
-"batch)"
-msgstr ""
-
-#: builtin/cat-file.c:872
-msgid "run textconv on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:874
-msgid "run filters on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:875
-msgid "blob|tree"
-msgstr ""
-
-#: builtin/cat-file.c:876
-msgid "use a <path> for (--textconv | --filters); Not with 'batch'"
-msgstr ""
-
-#: builtin/cat-file.c:894
-#, c-format
-msgid "'%s=<%s>' needs '%s' or '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:896
-msgid "path|tree-ish"
-msgstr ""
-
-#: builtin/cat-file.c:903 builtin/cat-file.c:906 builtin/cat-file.c:909
-#, c-format
-msgid "'%s' requires a batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:921
-#, c-format
-msgid "'-%c' is incompatible with batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:924
-msgid "batch modes take no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:932 builtin/cat-file.c:935
-#, c-format
-msgid "<rev> required with '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:938
-#, c-format
-msgid "<object> required with '-%c'"
-msgstr ""
-
-#: builtin/cat-file.c:943 builtin/notes.c:374 builtin/notes.c:429
-#: builtin/notes.c:507 builtin/notes.c:519 builtin/notes.c:596
-#: builtin/notes.c:663 builtin/notes.c:813 builtin/notes.c:965
-#: builtin/notes.c:987 builtin/prune-packed.c:25 builtin/receive-pack.c:2489
-#: builtin/tag.c:592
-msgid "too many arguments"
-msgstr ""
-
-#: builtin/cat-file.c:947
-#, c-format
-msgid "only two arguments allowed in <type> <object> mode, not %d"
-msgstr ""
-
-#: builtin/check-attr.c:13
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr ""
-
-#: builtin/check-attr.c:14
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr ""
-
-#: builtin/check-attr.c:21
-msgid "report all attributes set on file"
-msgstr ""
-
-#: builtin/check-attr.c:22
-msgid "use .gitattributes only from the index"
-msgstr ""
-
-#: builtin/check-attr.c:23 builtin/check-ignore.c:25 builtin/hash-object.c:101
-msgid "read file names from stdin"
-msgstr ""
-
-#: builtin/check-attr.c:25 builtin/check-ignore.c:27
-msgid "terminate input and output records by a NUL character"
-msgstr ""
-
-#: builtin/check-ignore.c:21 builtin/checkout.c:1550 builtin/gc.c:550
-#: builtin/worktree.c:565
-msgid "suppress progress reporting"
-msgstr ""
-
-#: builtin/check-ignore.c:29
-msgid "show non-matching input paths"
-msgstr ""
-
-#: builtin/check-ignore.c:31
-msgid "ignore index when checking"
-msgstr ""
-
-#: builtin/check-ignore.c:165
-msgid "cannot specify pathnames with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:168
-msgid "-z only makes sense with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:170
-msgid "no path specified"
-msgstr ""
-
-#: builtin/check-ignore.c:174
-msgid "--quiet is only valid with a single pathname"
-msgstr ""
-
-#: builtin/check-ignore.c:176
-msgid "cannot have both --quiet and --verbose"
-msgstr ""
-
-#: builtin/check-ignore.c:179
-msgid "--non-matching is only valid with --verbose"
-msgstr ""
-
-#: builtin/check-mailmap.c:9
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr ""
-
-#: builtin/check-mailmap.c:14
-msgid "also read contacts from stdin"
-msgstr ""
-
-#: builtin/check-mailmap.c:25
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr ""
-
-#: builtin/check-mailmap.c:48
-msgid "no contacts specified"
-msgstr ""
-
-#: builtin/checkout--worker.c:110
-msgid "git checkout--worker [<options>]"
-msgstr ""
-
-#: builtin/checkout--worker.c:118 builtin/checkout-index.c:235
-#: builtin/column.c:31 builtin/column.c:32 builtin/submodule--helper.c:1878
-#: builtin/submodule--helper.c:1881 builtin/submodule--helper.c:1889
-#: builtin/submodule--helper.c:2716 builtin/worktree.c:563
-#: builtin/worktree.c:808
-msgid "string"
-msgstr ""
-
-#: builtin/checkout--worker.c:119 builtin/checkout-index.c:236
-msgid "when creating files, prepend <string>"
-msgstr ""
-
-#: builtin/checkout-index.c:184
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/checkout-index.c:201
-msgid "stage should be between 1 and 3 or all"
-msgstr ""
-
-#: builtin/checkout-index.c:219
-msgid "check out all files in the index"
-msgstr ""
-
-#: builtin/checkout-index.c:221
-msgid "do not skip files with skip-worktree set"
-msgstr ""
-
-#: builtin/checkout-index.c:222
-msgid "force overwrite of existing files"
-msgstr ""
-
-#: builtin/checkout-index.c:224
-msgid "no warning for existing files and files not in index"
-msgstr ""
-
-#: builtin/checkout-index.c:226
-msgid "don't checkout new files"
-msgstr ""
-
-#: builtin/checkout-index.c:228
-msgid "update stat information in the index file"
-msgstr ""
-
-#: builtin/checkout-index.c:232
-msgid "read list of paths from the standard input"
-msgstr ""
-
-#: builtin/checkout-index.c:234
-msgid "write the content to temporary files"
-msgstr ""
-
-#: builtin/checkout-index.c:238
-msgid "copy out the files from named stage"
-msgstr ""
-
-#: builtin/checkout.c:34
-msgid "git checkout [<options>] <branch>"
-msgstr ""
-
-#: builtin/checkout.c:35
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr ""
-
-#: builtin/checkout.c:40
-msgid "git switch [<options>] [<branch>]"
-msgstr ""
-
-#: builtin/checkout.c:45
-msgid "git restore [<options>] [--source=<branch>] <file>..."
-msgstr ""
-
-#: builtin/checkout.c:199 builtin/checkout.c:238
-#, c-format
-msgid "path '%s' does not have our version"
-msgstr ""
-
-#: builtin/checkout.c:201 builtin/checkout.c:240
-#, c-format
-msgid "path '%s' does not have their version"
-msgstr ""
-
-#: builtin/checkout.c:217
-#, c-format
-msgid "path '%s' does not have all necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:271
-#, c-format
-msgid "path '%s' does not have necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:291
-#, c-format
-msgid "path '%s': cannot merge"
-msgstr ""
-
-#: builtin/checkout.c:307
-#, c-format
-msgid "Unable to add merge result for '%s'"
-msgstr ""
-
-#: builtin/checkout.c:424
-#, c-format
-msgid "Recreated %d merge conflict"
-msgid_plural "Recreated %d merge conflicts"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:429
-#, c-format
-msgid "Updated %d path from %s"
-msgid_plural "Updated %d paths from %s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:436
-#, c-format
-msgid "Updated %d path from the index"
-msgid_plural "Updated %d paths from the index"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:459 builtin/checkout.c:462 builtin/checkout.c:465
-#: builtin/checkout.c:469
-#, c-format
-msgid "'%s' cannot be used with updating paths"
-msgstr ""
-
-#: builtin/checkout.c:479
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
-msgstr ""
-
-#: builtin/checkout.c:483
-#, c-format
-msgid "neither '%s' or '%s' is specified"
-msgstr ""
-
-#: builtin/checkout.c:487
-#, c-format
-msgid "'%s' must be used when '%s' is not specified"
-msgstr ""
-
-#: builtin/checkout.c:492 builtin/checkout.c:497
-#, c-format
-msgid "'%s' or '%s' cannot be used with %s"
-msgstr ""
-
-#: builtin/checkout.c:571 builtin/checkout.c:578
-#, c-format
-msgid "path '%s' is unmerged"
-msgstr ""
-
-#: builtin/checkout.c:753
-msgid "you need to resolve your current index first"
-msgstr ""
-
-#: builtin/checkout.c:809
-#, c-format
-msgid ""
-"cannot continue with staged changes in the following files:\n"
-"%s"
-msgstr ""
-
-#: builtin/checkout.c:902
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
-msgstr ""
-
-#: builtin/checkout.c:947
-msgid "HEAD is now at"
-msgstr ""
-
-#: builtin/checkout.c:951 builtin/clone.c:615 t/helper/test-fast-rebase.c:203
-msgid "unable to update HEAD"
-msgstr ""
-
-#: builtin/checkout.c:955
-#, c-format
-msgid "Reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:958
-#, c-format
-msgid "Already on '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:962
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:964 builtin/checkout.c:1398
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:966
-#, c-format
-msgid "Switched to branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:1017
-#, c-format
-msgid " ... and %d more.\n"
-msgstr ""
-
-#: builtin/checkout.c:1023
-#, c-format
-msgid ""
-"Warning: you are leaving %d commit behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgid_plural ""
-"Warning: you are leaving %d commits behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1042
-#, c-format
-msgid ""
-"If you want to keep it by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgid_plural ""
-"If you want to keep them by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1077
-msgid "internal error in revision walk"
-msgstr ""
-
-#: builtin/checkout.c:1081
-msgid "Previous HEAD position was"
-msgstr ""
-
-#: builtin/checkout.c:1124 builtin/checkout.c:1393
-msgid "You are on a branch yet to be born"
-msgstr ""
-
-#: builtin/checkout.c:1206
-#, c-format
-msgid ""
-"'%s' could be both a local file and a tracking branch.\n"
-"Please use -- (and optionally --no-guess) to disambiguate"
-msgstr ""
-
-#: builtin/checkout.c:1213
-msgid ""
-"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
-"you can do so by fully qualifying the name with the --track option:\n"
-"\n"
-"    git checkout --track origin/<name>\n"
-"\n"
-"If you'd like to always have checkouts of an ambiguous <name> prefer\n"
-"one remote, e.g. the 'origin' remote, consider setting\n"
-"checkout.defaultRemote=origin in your config."
-msgstr ""
-
-#: builtin/checkout.c:1223
-#, c-format
-msgid "'%s' matched multiple (%d) remote tracking branches"
-msgstr ""
-
-#: builtin/checkout.c:1289
-msgid "only one reference expected"
-msgstr ""
-
-#: builtin/checkout.c:1306
-#, c-format
-msgid "only one reference expected, %d given."
-msgstr ""
-
-#: builtin/checkout.c:1352 builtin/worktree.c:338 builtin/worktree.c:508
-#, c-format
-msgid "invalid reference: %s"
-msgstr ""
-
-#: builtin/checkout.c:1365 builtin/checkout.c:1744
-#, c-format
-msgid "reference is not a tree: %s"
-msgstr ""
-
-#: builtin/checkout.c:1413
-#, c-format
-msgid "a branch is expected, got tag '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1415
-#, c-format
-msgid "a branch is expected, got remote branch '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1417 builtin/checkout.c:1426
-#, c-format
-msgid "a branch is expected, got '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1420
-#, c-format
-msgid "a branch is expected, got commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1429
-msgid ""
-"If you want to detach HEAD at the commit, try again with the --detach option."
-msgstr ""
-
-#: builtin/checkout.c:1442
-msgid ""
-"cannot switch branch while merging\n"
-"Consider \"git merge --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1446
-msgid ""
-"cannot switch branch in the middle of an am session\n"
-"Consider \"git am --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1450
-msgid ""
-"cannot switch branch while rebasing\n"
-"Consider \"git rebase --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1454
-msgid ""
-"cannot switch branch while cherry-picking\n"
-"Consider \"git cherry-pick --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1458
-msgid ""
-"cannot switch branch while reverting\n"
-"Consider \"git revert --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1462
-msgid "you are switching branch while bisecting"
-msgstr ""
-
-#: builtin/checkout.c:1469
-msgid "paths cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1472 builtin/checkout.c:1476 builtin/checkout.c:1480
-#, c-format
-msgid "'%s' cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1484 builtin/checkout.c:1487 builtin/checkout.c:1490
-#: builtin/checkout.c:1495 builtin/checkout.c:1500
-#, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1497
-#, c-format
-msgid "'%s' cannot take <start-point>"
-msgstr ""
-
-#: builtin/checkout.c:1505
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1512
-msgid "missing branch or commit argument"
-msgstr ""
-
-#: builtin/checkout.c:1555
-msgid "perform a 3-way merge with the new branch"
-msgstr ""
-
-#: builtin/checkout.c:1556 builtin/log.c:1844 parse-options.h:354
-msgid "style"
-msgstr ""
-
-#: builtin/checkout.c:1557
-msgid "conflict style (merge, diff3, or zdiff3)"
-msgstr ""
-
-#: builtin/checkout.c:1569 builtin/worktree.c:560
-msgid "detach HEAD at named commit"
-msgstr ""
-
-#: builtin/checkout.c:1574
-msgid "force checkout (throw away local modifications)"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new-branch"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new unparented branch"
-msgstr ""
-
-#: builtin/checkout.c:1578 builtin/merge.c:305
-msgid "update ignored files (default)"
-msgstr ""
-
-#: builtin/checkout.c:1581
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-
-#: builtin/checkout.c:1594
-msgid "checkout our version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1597
-msgid "checkout their version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1601
-msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
-
-#: builtin/checkout.c:1659
-#, c-format
-msgid "options '-%c', '-%c', and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/checkout.c:1700
-msgid "--track needs a branch name"
-msgstr ""
-
-#: builtin/checkout.c:1705
-#, c-format
-msgid "missing branch name; try -%c"
-msgstr ""
-
-#: builtin/checkout.c:1737
-#, c-format
-msgid "could not resolve %s"
-msgstr ""
-
-#: builtin/checkout.c:1753
-msgid "invalid path specification"
-msgstr ""
-
-#: builtin/checkout.c:1760
-#, c-format
-msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
-msgstr ""
-
-#: builtin/checkout.c:1764
-#, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1789
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
-msgstr ""
-
-#: builtin/checkout.c:1794
-msgid "you must specify path(s) to restore"
-msgstr ""
-
-#: builtin/checkout.c:1819 builtin/checkout.c:1821 builtin/checkout.c:1873
-#: builtin/checkout.c:1875 builtin/clone.c:130 builtin/remote.c:171
-#: builtin/remote.c:173 builtin/submodule--helper.c:3038
-#: builtin/submodule--helper.c:3371 builtin/worktree.c:556
-#: builtin/worktree.c:558
-msgid "branch"
-msgstr ""
-
-#: builtin/checkout.c:1820
-msgid "create and checkout a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1822
-msgid "create/reset and checkout a branch"
-msgstr ""
-
-#: builtin/checkout.c:1823
-msgid "create reflog for new branch"
-msgstr ""
-
-#: builtin/checkout.c:1825
-msgid "second guess 'git checkout <no-such-branch>' (default)"
-msgstr ""
-
-#: builtin/checkout.c:1826
-msgid "use overlay mode (default)"
-msgstr ""
-
-#: builtin/checkout.c:1874
-msgid "create and switch to a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1876
-msgid "create/reset and switch to a branch"
-msgstr ""
-
-#: builtin/checkout.c:1878
-msgid "second guess 'git switch <no-such-branch>'"
-msgstr ""
-
-#: builtin/checkout.c:1880
-msgid "throw away local modifications"
-msgstr ""
-
-#: builtin/checkout.c:1916
-msgid "which tree-ish to checkout from"
-msgstr ""
-
-#: builtin/checkout.c:1918
-msgid "restore the index"
-msgstr ""
-
-#: builtin/checkout.c:1920
-msgid "restore the working tree (default)"
-msgstr ""
-
-#: builtin/checkout.c:1922
-msgid "ignore unmerged entries"
-msgstr ""
-
-#: builtin/checkout.c:1923
-msgid "use overlay mode"
-msgstr ""
-
-#: builtin/clean.c:29
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr ""
-
-#: builtin/clean.c:33
-#, c-format
-msgid "Removing %s\n"
-msgstr ""
-
-#: builtin/clean.c:34
-#, c-format
-msgid "Would remove %s\n"
-msgstr ""
-
-#: builtin/clean.c:35
-#, c-format
-msgid "Skipping repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:36
-#, c-format
-msgid "Would skip repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:38
-#, c-format
-msgid "could not lstat %s\n"
-msgstr ""
-
-#: builtin/clean.c:39
-msgid "Refusing to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:40
-msgid "Would refuse to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:326 git-add--interactive.perl:593
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing\n"
-msgstr ""
-
-#: builtin/clean.c:330 git-add--interactive.perl:602
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a single item\n"
-"3-5        - select a range of items\n"
-"2-3,6-9    - select multiple ranges\n"
-"foo        - select item based on unique prefix\n"
-"-...       - unselect specified items\n"
-"*          - choose all items\n"
-"           - (empty) finish selecting\n"
-msgstr ""
-
-#: builtin/clean.c:545 git-add--interactive.perl:568
-#: git-add--interactive.perl:573
-#, c-format, perl-format
-msgid "Huh (%s)?\n"
-msgstr ""
-
-#: builtin/clean.c:685
-#, c-format
-msgid "Input ignore patterns>> "
-msgstr ""
-
-#: builtin/clean.c:719
-#, c-format
-msgid "WARNING: Cannot find items matched by: %s"
-msgstr ""
-
-#: builtin/clean.c:740
-msgid "Select items to delete"
-msgstr ""
-
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:781
-#, c-format
-msgid "Remove %s [y/N]? "
-msgstr ""
-
-#: builtin/clean.c:812
-msgid ""
-"clean               - start cleaning\n"
-"filter by pattern   - exclude items from deletion\n"
-"select by numbers   - select items to be deleted by numbers\n"
-"ask each            - confirm each deletion (like \"rm -i\")\n"
-"quit                - stop cleaning\n"
-"help                - this screen\n"
-"?                   - help for prompt selection"
-msgstr ""
-
-#: builtin/clean.c:848
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/clean.c:864
-msgid "No more files to clean, exiting."
-msgstr ""
-
-#: builtin/clean.c:926
-msgid "do not print names of files removed"
-msgstr ""
-
-#: builtin/clean.c:928
-msgid "force"
-msgstr ""
-
-#: builtin/clean.c:929
-msgid "interactive cleaning"
-msgstr ""
-
-#: builtin/clean.c:931
-msgid "remove whole directories"
-msgstr ""
-
-#: builtin/clean.c:932 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:938 builtin/log.c:185 builtin/log.c:187
-#: builtin/ls-files.c:651 builtin/name-rev.c:585 builtin/name-rev.c:587
-#: builtin/show-ref.c:179
-msgid "pattern"
-msgstr ""
-
-#: builtin/clean.c:933
-msgid "add <pattern> to ignore rules"
-msgstr ""
-
-#: builtin/clean.c:934
-msgid "remove ignored files, too"
-msgstr ""
-
-#: builtin/clean.c:936
-msgid "remove only ignored files"
-msgstr ""
-
-#: builtin/clean.c:951
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
-msgstr ""
-
-#: builtin/clean.c:954
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
-msgstr ""
-
-#: builtin/clean.c:966
-msgid "-x and -X cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:47
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: builtin/clone.c:100
-msgid "don't clone shallow repository"
-msgstr ""
-
-#: builtin/clone.c:102
-msgid "don't create a checkout"
-msgstr ""
-
-#: builtin/clone.c:103 builtin/clone.c:105 builtin/init-db.c:542
-msgid "create a bare repository"
-msgstr ""
-
-#: builtin/clone.c:107
-msgid "create a mirror repository (implies bare)"
-msgstr ""
-
-#: builtin/clone.c:109
-msgid "to clone from a local repository"
-msgstr ""
-
-#: builtin/clone.c:111
-msgid "don't use local hardlinks, always copy"
-msgstr ""
-
-#: builtin/clone.c:113
-msgid "setup as shared repository"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "pathspec"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "initialize submodules in the clone"
-msgstr ""
-
-#: builtin/clone.c:119
-msgid "number of submodules cloned in parallel"
-msgstr ""
-
-#: builtin/clone.c:120 builtin/init-db.c:539
-msgid "template-directory"
-msgstr ""
-
-#: builtin/clone.c:121 builtin/init-db.c:540
-msgid "directory from which templates will be used"
-msgstr ""
-
-#: builtin/clone.c:123 builtin/clone.c:125 builtin/submodule--helper.c:1885
-#: builtin/submodule--helper.c:2719 builtin/submodule--helper.c:3378
-msgid "reference repository"
-msgstr ""
-
-#: builtin/clone.c:127 builtin/submodule--helper.c:1887
-#: builtin/submodule--helper.c:2721
-msgid "use --reference only while cloning"
-msgstr ""
-
-#: builtin/clone.c:128 builtin/column.c:27 builtin/fmt-merge-msg.c:27
-#: builtin/init-db.c:550 builtin/merge-file.c:48 builtin/merge.c:290
-#: builtin/pack-objects.c:3967 builtin/repack.c:669
-#: builtin/submodule--helper.c:3380 t/helper/test-simple-ipc.c:595
-#: t/helper/test-simple-ipc.c:597
-msgid "name"
-msgstr ""
-
-#: builtin/clone.c:129
-msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
-
-#: builtin/clone.c:131
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
-
-#: builtin/clone.c:133
-msgid "path to git-upload-pack on the remote"
-msgstr ""
-
-#: builtin/clone.c:134 builtin/fetch.c:182 builtin/grep.c:877
-#: builtin/pull.c:212
-msgid "depth"
-msgstr ""
-
-#: builtin/clone.c:135
-msgid "create a shallow clone of that depth"
-msgstr ""
-
-#: builtin/clone.c:136 builtin/fetch.c:184 builtin/pack-objects.c:3956
-#: builtin/pull.c:215
-msgid "time"
-msgstr ""
-
-#: builtin/clone.c:137
-msgid "create a shallow clone since a specific time"
-msgstr ""
-
-#: builtin/clone.c:138 builtin/fetch.c:186 builtin/fetch.c:212
-#: builtin/pull.c:218 builtin/pull.c:243 builtin/rebase.c:1050
-msgid "revision"
-msgstr ""
-
-#: builtin/clone.c:139 builtin/fetch.c:187 builtin/pull.c:219
-msgid "deepen history of shallow clone, excluding rev"
-msgstr ""
-
-#: builtin/clone.c:141 builtin/submodule--helper.c:1897
-#: builtin/submodule--helper.c:2735
-msgid "clone only one branch, HEAD or --branch"
-msgstr ""
-
-#: builtin/clone.c:143
-msgid "don't clone any tags, and make later fetches not to follow them"
-msgstr ""
-
-#: builtin/clone.c:145
-msgid "any cloned submodules will be shallow"
-msgstr ""
-
-#: builtin/clone.c:146 builtin/init-db.c:548
-msgid "gitdir"
-msgstr ""
-
-#: builtin/clone.c:147 builtin/init-db.c:549
-msgid "separate git dir from working tree"
-msgstr ""
-
-#: builtin/clone.c:148
-msgid "key=value"
-msgstr ""
-
-#: builtin/clone.c:149
-msgid "set config inside the new repository"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:234 builtin/push.c:575 builtin/send-pack.c:200
-msgid "server-specific"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:235 builtin/push.c:575 builtin/send-pack.c:201
-msgid "option to transmit"
-msgstr ""
-
-#: builtin/clone.c:152 builtin/fetch.c:208 builtin/pull.c:238
-#: builtin/push.c:576
-msgid "use IPv4 addresses only"
-msgstr ""
-
-#: builtin/clone.c:154 builtin/fetch.c:210 builtin/pull.c:241
-#: builtin/push.c:578
-msgid "use IPv6 addresses only"
-msgstr ""
-
-#: builtin/clone.c:158
-msgid "apply partial clone filters to submodules"
-msgstr ""
-
-#: builtin/clone.c:160
-msgid "any cloned submodules will use their remote-tracking branch"
-msgstr ""
-
-#: builtin/clone.c:162
-msgid "initialize sparse-checkout file to include only files at root"
-msgstr ""
-
-#: builtin/clone.c:237
-#, c-format
-msgid "info: Could not add alternate for '%s': %s\n"
-msgstr ""
-
-#: builtin/clone.c:310
-#, c-format
-msgid "%s exists and is not a directory"
-msgstr ""
-
-#: builtin/clone.c:328
-#, c-format
-msgid "failed to start iterator over '%s'"
-msgstr ""
-
-#: builtin/clone.c:359
-#, c-format
-msgid "failed to create link '%s'"
-msgstr ""
-
-#: builtin/clone.c:363
-#, c-format
-msgid "failed to copy file to '%s'"
-msgstr ""
-
-#: builtin/clone.c:368
-#, c-format
-msgid "failed to iterate over '%s'"
-msgstr ""
-
-#: builtin/clone.c:395
-#, c-format
-msgid "done.\n"
-msgstr ""
-
-#: builtin/clone.c:409
-msgid ""
-"Clone succeeded, but checkout failed.\n"
-"You can inspect what was checked out with 'git status'\n"
-"and retry with 'git restore --source=HEAD :/'\n"
-msgstr ""
-
-#: builtin/clone.c:486
-#, c-format
-msgid "Could not find remote branch %s to clone."
-msgstr ""
-
-#: builtin/clone.c:603
-#, c-format
-msgid "unable to update %s"
-msgstr ""
-
-#: builtin/clone.c:651
-msgid "failed to initialize sparse-checkout"
-msgstr ""
-
-#: builtin/clone.c:674
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr ""
-
-#: builtin/clone.c:709
-msgid "unable to checkout working tree"
-msgstr ""
-
-#: builtin/clone.c:793
-msgid "unable to write parameters to config file"
-msgstr ""
-
-#: builtin/clone.c:856
-msgid "cannot repack to clean up"
-msgstr ""
-
-#: builtin/clone.c:858
-msgid "cannot unlink temporary alternates file"
-msgstr ""
-
-#: builtin/clone.c:901
-msgid "Too many arguments."
-msgstr ""
-
-#: builtin/clone.c:905 contrib/scalar/scalar.c:413
-msgid "You must specify a repository to clone."
-msgstr ""
-
-#: builtin/clone.c:918
-#, c-format
-msgid "options '%s' and '%s %s' cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:935
-#, c-format
-msgid "repository '%s' does not exist"
-msgstr ""
-
-#: builtin/clone.c:939 builtin/fetch.c:2176
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr ""
-
-#: builtin/clone.c:949
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:955
-#, c-format
-msgid "repository path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:969
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr ""
-
-#: builtin/clone.c:984 builtin/clone.c:1005 builtin/difftool.c:256
-#: builtin/log.c:2037 builtin/worktree.c:350 builtin/worktree.c:382
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr ""
-
-#: builtin/clone.c:989
-#, c-format
-msgid "could not create work tree dir '%s'"
-msgstr ""
-
-#: builtin/clone.c:1009
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1011
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1040
-msgid ""
-"clone --recursive is not compatible with both --reference and --reference-if-"
-"able"
-msgstr ""
-
-#: builtin/clone.c:1116 builtin/remote.c:201 builtin/remote.c:721
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr ""
-
-#: builtin/clone.c:1157
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1159
-msgid "--shallow-since is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1161
-msgid "--shallow-exclude is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1163
-msgid "--filter is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1168
-msgid "source repository is shallow, ignoring --local"
-msgstr ""
-
-#: builtin/clone.c:1173
-msgid "--local is ignored"
-msgstr ""
-
-#: builtin/clone.c:1185
-msgid "cannot clone from filtered bundle"
-msgstr ""
-
-#: builtin/clone.c:1265 builtin/clone.c:1324
-msgid "remote transport reported error"
-msgstr ""
-
-#: builtin/clone.c:1277 builtin/clone.c:1289
-#, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr ""
-
-#: builtin/clone.c:1292
-msgid "You appear to have cloned an empty repository."
-msgstr ""
-
-#: builtin/column.c:10
-msgid "git column [<options>]"
-msgstr ""
-
-#: builtin/column.c:27
-msgid "lookup config vars"
-msgstr ""
-
-#: builtin/column.c:28 builtin/column.c:29
-msgid "layout to use"
-msgstr ""
-
-#: builtin/column.c:30
-msgid "maximum width"
-msgstr ""
-
-#: builtin/column.c:31
-msgid "padding space on left border"
-msgstr ""
-
-#: builtin/column.c:32
-msgid "padding space on right border"
-msgstr ""
-
-#: builtin/column.c:33
-msgid "padding space between columns"
-msgstr ""
-
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr ""
-
-#: builtin/commit-graph.c:13
-msgid ""
-"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
-msgstr ""
-
-#: builtin/commit-graph.c:16
-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 ""
-
-#: builtin/commit-graph.c:51 builtin/fetch.c:196 builtin/log.c:1813
-msgid "dir"
-msgstr ""
-
-#: builtin/commit-graph.c:52
-msgid "the object directory to store the graph"
-msgstr ""
-
-#: builtin/commit-graph.c:73
-msgid "if the commit-graph is split, only verify the tip file"
-msgstr ""
-
-#: builtin/commit-graph.c:100
-#, c-format
-msgid "Could not open commit-graph '%s'"
-msgstr ""
-
-#: builtin/commit-graph.c:137
-#, c-format
-msgid "unrecognized --split argument, %s"
-msgstr ""
-
-#: builtin/commit-graph.c:150
-#, c-format
-msgid "unexpected non-hex object ID: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:155
-#, c-format
-msgid "invalid object: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:205
-msgid "start walk at all refs"
-msgstr ""
-
-#: builtin/commit-graph.c:207
-msgid "scan pack-indexes listed by stdin for commits"
-msgstr ""
-
-#: builtin/commit-graph.c:209
-msgid "start walk at commits listed by stdin"
-msgstr ""
-
-#: builtin/commit-graph.c:211
-msgid "include all commits already in the commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:213
-msgid "enable computation for changed paths"
-msgstr ""
-
-#: builtin/commit-graph.c:215
-msgid "allow writing an incremental commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:219
-msgid "maximum number of commits in a non-base split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:221
-msgid "maximum ratio between two levels of a split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:223
-msgid "only expire files older than a given date-time"
-msgstr ""
-
-#: builtin/commit-graph.c:225
-msgid "maximum number of changed-path Bloom filters to compute"
-msgstr ""
-
-#: builtin/commit-graph.c:251
-msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
-msgstr ""
-
-#: builtin/commit-graph.c:282
-msgid "Collecting commits from input"
-msgstr ""
-
-#: builtin/commit-graph.c:328 builtin/multi-pack-index.c:259
-#, c-format
-msgid "unrecognized subcommand: %s"
-msgstr ""
-
-#: builtin/commit-tree.c:18
-msgid ""
-"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F "
-"<file>)...] <tree>"
-msgstr ""
-
-#: builtin/commit-tree.c:31
-#, c-format
-msgid "duplicate parent %s ignored"
-msgstr ""
-
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:134 builtin/log.c:590
-#, c-format
-msgid "not a valid object name %s"
-msgstr ""
-
-#: builtin/commit-tree.c:94
-#, c-format
-msgid "git commit-tree: failed to read '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:96
-#, c-format
-msgid "git commit-tree: failed to close '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:109
-msgid "parent"
-msgstr ""
-
-#: builtin/commit-tree.c:110
-msgid "id of a parent commit object"
-msgstr ""
-
-#: builtin/commit-tree.c:112 builtin/commit.c:1626 builtin/merge.c:284
-#: builtin/notes.c:407 builtin/notes.c:573 builtin/stash.c:1666
-#: builtin/tag.c:455
-msgid "message"
-msgstr ""
-
-#: builtin/commit-tree.c:113 builtin/commit.c:1626
-msgid "commit message"
-msgstr ""
-
-#: builtin/commit-tree.c:116
-msgid "read commit log message from file"
-msgstr ""
-
-#: builtin/commit-tree.c:119 builtin/commit.c:1643 builtin/merge.c:303
-#: builtin/pull.c:180 builtin/revert.c:118
-msgid "GPG sign commit"
-msgstr ""
-
-#: builtin/commit-tree.c:131
-msgid "must give exactly one tree"
-msgstr ""
-
-#: builtin/commit-tree.c:138
-msgid "git commit-tree: failed to read"
-msgstr ""
-
-#: builtin/commit.c:43
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:48
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:53
-msgid ""
-"You asked to amend the most recent commit, but doing so would make\n"
-"it empty. You can repeat your command with --allow-empty, or you can\n"
-"remove the commit entirely with \"git reset HEAD^\".\n"
-msgstr ""
-
-#: builtin/commit.c:58
-msgid ""
-"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
-"If you wish to commit it anyway, use:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:65
-msgid "Otherwise, please use 'git rebase --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:68
-msgid "Otherwise, please use 'git cherry-pick --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:71
-msgid ""
-"and then use:\n"
-"\n"
-"    git cherry-pick --continue\n"
-"\n"
-"to resume cherry-picking the remaining commits.\n"
-"If you wish to skip this commit, use:\n"
-"\n"
-"    git cherry-pick --skip\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:326
-msgid "failed to unpack HEAD tree object"
-msgstr ""
-
-#: builtin/commit.c:376
-msgid "No paths with --include/--only does not make sense."
-msgstr ""
-
-#: builtin/commit.c:388
-msgid "unable to create temporary index"
-msgstr ""
-
-#: builtin/commit.c:397
-msgid "interactive add failed"
-msgstr ""
-
-#: builtin/commit.c:412
-msgid "unable to update temporary index"
-msgstr ""
-
-#: builtin/commit.c:414
-msgid "Failed to update main cache tree"
-msgstr ""
-
-#: builtin/commit.c:439 builtin/commit.c:462 builtin/commit.c:510
-msgid "unable to write new_index file"
-msgstr ""
-
-#: builtin/commit.c:491
-msgid "cannot do a partial commit during a merge."
-msgstr ""
-
-#: builtin/commit.c:493
-msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
-
-#: builtin/commit.c:495
-msgid "cannot do a partial commit during a rebase."
-msgstr ""
-
-#: builtin/commit.c:503
-msgid "cannot read the index"
-msgstr ""
-
-#: builtin/commit.c:522
-msgid "unable to write temporary index file"
-msgstr ""
-
-#: builtin/commit.c:620
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr ""
-
-#: builtin/commit.c:622
-#, c-format
-msgid "commit '%s' has malformed author line"
-msgstr ""
-
-#: builtin/commit.c:641
-msgid "malformed --author parameter"
-msgstr ""
-
-#: builtin/commit.c:694
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-msgstr ""
-
-#: builtin/commit.c:750 builtin/commit.c:784 builtin/commit.c:1170
-#, c-format
-msgid "could not lookup commit %s"
-msgstr ""
-
-#: builtin/commit.c:762 builtin/shortlog.c:417
-#, c-format
-msgid "(reading log message from standard input)\n"
-msgstr ""
-
-#: builtin/commit.c:764
-msgid "could not read log from standard input"
-msgstr ""
-
-#: builtin/commit.c:768
-#, c-format
-msgid "could not read log file '%s'"
-msgstr ""
-
-#: builtin/commit.c:805
-#, c-format
-msgid "options '%s' and '%s:%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:817 builtin/commit.c:833
-msgid "could not read SQUASH_MSG"
-msgstr ""
-
-#: builtin/commit.c:824
-msgid "could not read MERGE_MSG"
-msgstr ""
-
-#: builtin/commit.c:884
-msgid "could not write commit template"
-msgstr ""
-
-#: builtin/commit.c:897
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/commit.c:899
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored, and an empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:903
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-msgstr ""
-
-#: builtin/commit.c:907
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-"An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:919
-msgid ""
-"\n"
-"It looks like you may be committing a merge.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d MERGE_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:924
-msgid ""
-"\n"
-"It looks like you may be committing a cherry-pick.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d CHERRY_PICK_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:951
-#, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:959
-#, c-format
-msgid "%sDate:      %s"
-msgstr ""
-
-#: builtin/commit.c:966
-#, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:984
-msgid "Cannot read index"
-msgstr ""
-
-#: builtin/commit.c:1029
-msgid "unable to pass trailers to --trailers"
-msgstr ""
-
-#: builtin/commit.c:1069
-msgid "Error building trees"
-msgstr ""
-
-#: builtin/commit.c:1083 builtin/tag.c:317
-#, c-format
-msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
-
-#: builtin/commit.c:1128
-#, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
-msgstr ""
-
-#: builtin/commit.c:1142
-#, c-format
-msgid "Invalid ignored mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1160 builtin/commit.c:1450
-#, c-format
-msgid "Invalid untracked files mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1231
-msgid "You are in the middle of a merge -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1233
-msgid "You are in the middle of a cherry-pick -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1236
-#, c-format
-msgid "reword option of '%s' and path '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1238
-#, c-format
-msgid "reword option of '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1263
-msgid "You have nothing to amend."
-msgstr ""
-
-#: builtin/commit.c:1266
-msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1268
-msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1270
-msgid "You are in the middle of a rebase -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1290
-msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr ""
-
-#: builtin/commit.c:1337
-#, c-format
-msgid "unknown option: --fixup=%s:%s"
-msgstr ""
-
-#: builtin/commit.c:1354
-#, c-format
-msgid "paths '%s ...' with -a does not make sense"
-msgstr ""
-
-#: builtin/commit.c:1485 builtin/commit.c:1654
-msgid "show status concisely"
-msgstr ""
-
-#: builtin/commit.c:1487 builtin/commit.c:1656
-msgid "show branch information"
-msgstr ""
-
-#: builtin/commit.c:1489
-msgid "show stash information"
-msgstr ""
-
-#: builtin/commit.c:1491 builtin/commit.c:1658
-msgid "compute full ahead/behind values"
-msgstr ""
-
-#: builtin/commit.c:1493
-msgid "version"
-msgstr ""
-
-#: builtin/commit.c:1493 builtin/commit.c:1660 builtin/push.c:551
-#: builtin/worktree.c:765
-msgid "machine-readable output"
-msgstr ""
-
-#: builtin/commit.c:1496 builtin/commit.c:1662
-msgid "show status in long format (default)"
-msgstr ""
-
-#: builtin/commit.c:1499 builtin/commit.c:1665
-msgid "terminate entries with NUL"
-msgstr ""
-
-#: builtin/commit.c:1501 builtin/commit.c:1505 builtin/commit.c:1668
-#: builtin/fast-export.c:1172 builtin/fast-export.c:1175
-#: builtin/fast-export.c:1178 builtin/rebase.c:1139 parse-options.h:368
-msgid "mode"
-msgstr ""
-
-#: builtin/commit.c:1502 builtin/commit.c:1668
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1506
-msgid ""
-"show ignored files, optional modes: traditional, matching, no. (Default: "
-"traditional)"
-msgstr ""
-
-#: builtin/commit.c:1508 parse-options.h:197
-msgid "when"
-msgstr ""
-
-#: builtin/commit.c:1509
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1511
-msgid "list untracked files in columns"
-msgstr ""
-
-#: builtin/commit.c:1512
-msgid "do not detect renames"
-msgstr ""
-
-#: builtin/commit.c:1514
-msgid "detect renames, optionally set similarity index"
-msgstr ""
-
-#: builtin/commit.c:1537
-msgid "Unsupported combination of ignored and untracked-files arguments"
-msgstr ""
-
-#: builtin/commit.c:1619
-msgid "suppress summary after successful commit"
-msgstr ""
-
-#: builtin/commit.c:1620
-msgid "show diff in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1622
-msgid "Commit message options"
-msgstr ""
-
-#: builtin/commit.c:1623 builtin/merge.c:288 builtin/tag.c:457
-msgid "read message from file"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "author"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "override author for commit"
-msgstr ""
-
-#: builtin/commit.c:1625 builtin/gc.c:551
-msgid "date"
-msgstr ""
-
-#: builtin/commit.c:1625
-msgid "override date for commit"
-msgstr ""
-
-#: builtin/commit.c:1627 builtin/commit.c:1628 builtin/commit.c:1634
-#: parse-options.h:360 ref-filter.h:89
-msgid "commit"
-msgstr ""
-
-#: builtin/commit.c:1627
-msgid "reuse and edit message from specified commit"
-msgstr ""
-
-#: builtin/commit.c:1628
-msgid "reuse message from specified commit"
-msgstr ""
-
-#. TRANSLATORS: Leave "[(amend|reword):]" as-is,
-#. and only translate <commit>.
-#.
-#: builtin/commit.c:1633
-msgid "[(amend|reword):]commit"
-msgstr ""
-
-#: builtin/commit.c:1633
-msgid ""
-"use autosquash formatted message to fixup or amend/reword specified commit"
-msgstr ""
-
-#: builtin/commit.c:1634
-msgid "use autosquash formatted message to squash specified commit"
-msgstr ""
-
-#: builtin/commit.c:1635
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
-msgstr ""
-
-#: builtin/commit.c:1636 builtin/interpret-trailers.c:111
-msgid "trailer"
-msgstr ""
-
-#: builtin/commit.c:1636
-msgid "add custom trailer(s)"
-msgstr ""
-
-#: builtin/commit.c:1637 builtin/log.c:1788 builtin/merge.c:306
-#: builtin/pull.c:146 builtin/revert.c:110
-msgid "add a Signed-off-by trailer"
-msgstr ""
-
-#: builtin/commit.c:1638
-msgid "use specified template file"
-msgstr ""
-
-#: builtin/commit.c:1639
-msgid "force edit of commit"
-msgstr ""
-
-#: builtin/commit.c:1641
-msgid "include status in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1646
-msgid "Commit contents options"
-msgstr ""
-
-#: builtin/commit.c:1647
-msgid "commit all changed files"
-msgstr ""
-
-#: builtin/commit.c:1648
-msgid "add specified files to index for commit"
-msgstr ""
-
-#: builtin/commit.c:1649
-msgid "interactively add files"
-msgstr ""
-
-#: builtin/commit.c:1650
-msgid "interactively add changes"
-msgstr ""
-
-#: builtin/commit.c:1651
-msgid "commit only specified files"
-msgstr ""
-
-#: builtin/commit.c:1652
-msgid "bypass pre-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/commit.c:1653
-msgid "show what would be committed"
-msgstr ""
-
-#: builtin/commit.c:1666
-msgid "amend previous commit"
-msgstr ""
-
-#: builtin/commit.c:1667
-msgid "bypass post-rewrite hook"
-msgstr ""
-
-#: builtin/commit.c:1674
-msgid "ok to record an empty change"
-msgstr ""
-
-#: builtin/commit.c:1676
-msgid "ok to record a change with an empty message"
-msgstr ""
-
-#: builtin/commit.c:1752
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
-
-#: builtin/commit.c:1759
-msgid "could not read MERGE_MODE"
-msgstr ""
-
-#: builtin/commit.c:1780
-#, c-format
-msgid "could not read commit message: %s"
-msgstr ""
-
-#: builtin/commit.c:1787
-#, c-format
-msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
-
-#: builtin/commit.c:1792
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
-
-#: builtin/commit.c:1803
-#, c-format
-msgid "Aborting commit due to empty commit message body.\n"
-msgstr ""
-
-#: builtin/commit.c:1839
-msgid ""
-"repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full and quota is\n"
-"not exceeded, and then \"git restore --staged :/\" to recover."
-msgstr ""
-
-#: builtin/config.c:11
-msgid "git config [<options>]"
-msgstr ""
-
-#: builtin/config.c:109 builtin/env--helper.c:27
-#, c-format
-msgid "unrecognized --type argument, %s"
-msgstr ""
-
-#: builtin/config.c:121
-msgid "only one type at a time"
-msgstr ""
-
-#: builtin/config.c:130
-msgid "Config file location"
-msgstr ""
-
-#: builtin/config.c:131
-msgid "use global config file"
-msgstr ""
-
-#: builtin/config.c:132
-msgid "use system config file"
-msgstr ""
-
-#: builtin/config.c:133
-msgid "use repository config file"
-msgstr ""
-
-#: builtin/config.c:134
-msgid "use per-worktree config file"
-msgstr ""
-
-#: builtin/config.c:135
-msgid "use given config file"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "blob-id"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "read config from given blob object"
-msgstr ""
-
-#: builtin/config.c:137
-msgid "Action"
-msgstr ""
-
-#: builtin/config.c:138
-msgid "get value: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:139
-msgid "get all values: key [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:140
-msgid "get values for regexp: name-regex [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:141
-msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
-
-#: builtin/config.c:142
-msgid "replace all matching variables: name value [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:143
-msgid "add a new variable: name value"
-msgstr ""
-
-#: builtin/config.c:144
-msgid "remove a variable: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:145
-msgid "remove all matches: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:146
-msgid "rename section: old-name new-name"
-msgstr ""
-
-#: builtin/config.c:147
-msgid "remove a section: name"
-msgstr ""
-
-#: builtin/config.c:148
-msgid "list all"
-msgstr ""
-
-#: builtin/config.c:149
-msgid "use string equality when comparing values to 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:150
-msgid "open an editor"
-msgstr ""
-
-#: builtin/config.c:151
-msgid "find the color configured: slot [default]"
-msgstr ""
-
-#: builtin/config.c:152
-msgid "find the color setting: slot [stdout-is-tty]"
-msgstr ""
-
-#: builtin/config.c:153
-msgid "Type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:42 builtin/hash-object.c:97
-msgid "type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:43
-msgid "value is given this type"
-msgstr ""
-
-#: builtin/config.c:155
-msgid "value is \"true\" or \"false\""
-msgstr ""
-
-#: builtin/config.c:156
-msgid "value is decimal number"
-msgstr ""
-
-#: builtin/config.c:157
-msgid "value is --bool or --int"
-msgstr ""
-
-#: builtin/config.c:158
-msgid "value is --bool or string"
-msgstr ""
-
-#: builtin/config.c:159
-msgid "value is a path (file or directory name)"
-msgstr ""
-
-#: builtin/config.c:160
-msgid "value is an expiry date"
-msgstr ""
-
-#: builtin/config.c:161
-msgid "Other"
-msgstr ""
-
-#: builtin/config.c:162
-msgid "terminate values with NUL byte"
-msgstr ""
-
-#: builtin/config.c:163
-msgid "show variable names only"
-msgstr ""
-
-#: builtin/config.c:164
-msgid "respect include directives on lookup"
-msgstr ""
-
-#: builtin/config.c:165
-msgid "show origin of config (file, standard input, blob, command line)"
-msgstr ""
-
-#: builtin/config.c:166
-msgid "show scope of config (worktree, local, global, system, command)"
-msgstr ""
-
-#: builtin/config.c:167 builtin/env--helper.c:45
-msgid "value"
-msgstr ""
-
-#: builtin/config.c:167
-msgid "with --get, use default value when missing entry"
-msgstr ""
-
-#: builtin/config.c:181
-#, c-format
-msgid "wrong number of arguments, should be %d"
-msgstr ""
-
-#: builtin/config.c:183
-#, c-format
-msgid "wrong number of arguments, should be from %d to %d"
-msgstr ""
-
-#: builtin/config.c:339
-#, c-format
-msgid "invalid key pattern: %s"
-msgstr ""
-
-#: builtin/config.c:377
-#, c-format
-msgid "failed to format default config value: %s"
-msgstr ""
-
-#: builtin/config.c:441
-#, c-format
-msgid "cannot parse color '%s'"
-msgstr ""
-
-#: builtin/config.c:483
-msgid "unable to parse default color value"
-msgstr ""
-
-#: builtin/config.c:536 builtin/config.c:833
-msgid "not in a git directory"
-msgstr ""
-
-#: builtin/config.c:539
-msgid "writing to stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:542
-msgid "writing config blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:627
-#, c-format
-msgid ""
-"# This is Git's per-user configuration file.\n"
-"[user]\n"
-"# Please adapt and uncomment the following lines:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
-msgstr ""
-
-#: builtin/config.c:652
-msgid "only one config file at a time"
-msgstr ""
-
-#: builtin/config.c:658
-msgid "--local can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:660
-msgid "--blob can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:662
-msgid "--worktree can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:684
-msgid "$HOME not set"
-msgstr ""
-
-#: builtin/config.c:708
-msgid ""
-"--worktree cannot be used with multiple working trees unless the config\n"
-"extension worktreeConfig is enabled. Please read \"CONFIGURATION FILE\"\n"
-"section in \"git help worktree\" for details"
-msgstr ""
-
-#: builtin/config.c:743
-msgid "--get-color and variable type are incoherent"
-msgstr ""
-
-#: builtin/config.c:748
-msgid "only one action at a time"
-msgstr ""
-
-#: builtin/config.c:761
-msgid "--name-only is only applicable to --list or --get-regexp"
-msgstr ""
-
-#: builtin/config.c:767
-msgid ""
-"--show-origin is only applicable to --get, --get-all, --get-regexp, and --"
-"list"
-msgstr ""
-
-#: builtin/config.c:773
-msgid "--default is only applicable to --get"
-msgstr ""
-
-#: builtin/config.c:806
-msgid "--fixed-value only applies with 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:822
-#, c-format
-msgid "unable to read config file '%s'"
-msgstr ""
-
-#: builtin/config.c:825
-msgid "error processing config file(s)"
-msgstr ""
-
-#: builtin/config.c:835
-msgid "editing stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:837
-msgid "editing blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:851
-#, c-format
-msgid "cannot create configuration file %s"
-msgstr ""
-
-#: builtin/config.c:864
-#, c-format
-msgid ""
-"cannot overwrite multiple values with a single value\n"
-"       Use a regexp, --add or --replace-all to change %s."
-msgstr ""
-
-#: builtin/config.c:943 builtin/config.c:954
-#, c-format
-msgid "no such section: %s"
-msgstr ""
-
-#: builtin/count-objects.c:100
-msgid "print sizes in human readable format"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:227
-#, c-format
-msgid ""
-"The permissions on your socket directory are too loose; other\n"
-"users may be able to read your cached credentials. Consider running:\n"
-"\n"
-"\tchmod 0700 %s"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:276
-msgid "print debugging messages to stderr"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:316
-msgid "credential-cache--daemon unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-cache.c:180
-msgid "credential-cache unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-store.c:66
-#, c-format
-msgid "unable to get credential storage lock in %d ms"
-msgstr ""
-
-#: builtin/describe.c:26
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr ""
-
-#: builtin/describe.c:27
-msgid "git describe [<options>] --dirty"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "head"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "lightweight"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "annotated"
-msgstr ""
-
-#: builtin/describe.c:277
-#, c-format
-msgid "annotated tag %s not available"
-msgstr ""
-
-#: builtin/describe.c:281
-#, c-format
-msgid "tag '%s' is externally known as '%s'"
-msgstr ""
-
-#: builtin/describe.c:328
-#, c-format
-msgid "no tag exactly matches '%s'"
-msgstr ""
-
-#: builtin/describe.c:330
-#, c-format
-msgid "No exact match on refs or tags, searching to describe\n"
-msgstr ""
-
-#: builtin/describe.c:397
-#, c-format
-msgid "finished search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:424
-#, c-format
-msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
-msgstr ""
-
-#: builtin/describe.c:428
-#, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
-msgstr ""
-
-#: builtin/describe.c:458
-#, c-format
-msgid "traversed %lu commits\n"
-msgstr ""
-
-#: builtin/describe.c:461
-#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:529
-#, c-format
-msgid "describe %s\n"
-msgstr ""
-
-#: builtin/describe.c:532
-#, c-format
-msgid "Not a valid object name %s"
-msgstr ""
-
-#: builtin/describe.c:540
-#, c-format
-msgid "%s is neither a commit nor blob"
-msgstr ""
-
-#: builtin/describe.c:554
-msgid "find the tag that comes after the commit"
-msgstr ""
-
-#: builtin/describe.c:555
-msgid "debug search strategy on stderr"
-msgstr ""
-
-#: builtin/describe.c:556
-msgid "use any ref"
-msgstr ""
-
-#: builtin/describe.c:557
-msgid "use any tag, even unannotated"
-msgstr ""
-
-#: builtin/describe.c:558
-msgid "always use long format"
-msgstr ""
-
-#: builtin/describe.c:559
-msgid "only follow first parent"
-msgstr ""
-
-#: builtin/describe.c:562
-msgid "only output exact matches"
-msgstr ""
-
-#: builtin/describe.c:564
-msgid "consider <n> most recent tags (default: 10)"
-msgstr ""
-
-#: builtin/describe.c:566
-msgid "only consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:568
-msgid "do not consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:570 builtin/name-rev.c:595
-msgid "show abbreviated commit object as fallback"
-msgstr ""
-
-#: builtin/describe.c:571 builtin/describe.c:574
-msgid "mark"
-msgstr ""
-
-#: builtin/describe.c:572
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr ""
-
-#: builtin/describe.c:575
-msgid "append <mark> on broken working tree (default: \"-broken\")"
-msgstr ""
-
-#: builtin/describe.c:622
-msgid "No names found, cannot describe anything."
-msgstr ""
-
-#: builtin/describe.c:673 builtin/describe.c:675
-#, c-format
-msgid "option '%s' and commit-ishes cannot be used together"
-msgstr ""
-
-#: builtin/diff-tree.c:157
-msgid "--merge-base only works with two commits"
-msgstr ""
-
-#: builtin/diff.c:92
-#, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr ""
-
-#: builtin/diff.c:259
-#, c-format
-msgid "invalid option: %s"
-msgstr ""
-
-#: builtin/diff.c:376
-#, c-format
-msgid "%s...%s: no merge base"
-msgstr ""
-
-#: builtin/diff.c:491
-msgid "Not a git repository"
-msgstr ""
-
-#: builtin/diff.c:537 builtin/grep.c:700
-#, c-format
-msgid "invalid object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:548
-#, c-format
-msgid "more than two blobs given: '%s'"
-msgstr ""
-
-#: builtin/diff.c:553
-#, c-format
-msgid "unhandled object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:587
-#, c-format
-msgid "%s...%s: multiple merge bases, using %s"
-msgstr ""
-
-#: builtin/difftool.c:31
-msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
-msgstr ""
-
-#: builtin/difftool.c:287
-#, c-format
-msgid "could not read symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:289
-#, c-format
-msgid "could not read symlink file %s"
-msgstr ""
-
-#: builtin/difftool.c:297
-#, c-format
-msgid "could not read object %s for symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:421
-msgid ""
-"combined diff formats ('-c' and '--cc') are not supported in\n"
-"directory diff mode ('-d' and '--dir-diff')."
-msgstr ""
-
-#: builtin/difftool.c:626
-#, c-format
-msgid "both files modified: '%s' and '%s'."
-msgstr ""
-
-#: builtin/difftool.c:628
-msgid "working tree file has been left."
-msgstr ""
-
-#: builtin/difftool.c:639
-#, c-format
-msgid "temporary files exist in '%s'."
-msgstr ""
-
-#: builtin/difftool.c:640
-msgid "you may want to cleanup or recover these."
-msgstr ""
-
-#: builtin/difftool.c:645
-#, c-format
-msgid "failed: %d"
-msgstr ""
-
-#: builtin/difftool.c:690
-msgid "use `diff.guitool` instead of `diff.tool`"
-msgstr ""
-
-#: builtin/difftool.c:692
-msgid "perform a full-directory diff"
-msgstr ""
-
-#: builtin/difftool.c:694
-msgid "do not prompt before launching a diff tool"
-msgstr ""
-
-#: builtin/difftool.c:699
-msgid "use symlinks in dir-diff mode"
-msgstr ""
-
-#: builtin/difftool.c:700
-msgid "tool"
-msgstr ""
-
-#: builtin/difftool.c:701
-msgid "use the specified diff tool"
-msgstr ""
-
-#: builtin/difftool.c:703
-msgid "print a list of diff tools that may be used with `--tool`"
-msgstr ""
-
-#: builtin/difftool.c:706
-msgid ""
-"make 'git-difftool' exit when an invoked diff tool returns a non-zero exit "
-"code"
-msgstr ""
-
-#: builtin/difftool.c:709
-msgid "specify a custom command for viewing diffs"
-msgstr ""
-
-#: builtin/difftool.c:710
-msgid "passed to `diff`"
-msgstr ""
-
-#: builtin/difftool.c:726
-msgid "difftool requires worktree or --no-index"
-msgstr ""
-
-#: builtin/difftool.c:745
-msgid "no <tool> given for --tool=<tool>"
-msgstr ""
-
-#: builtin/difftool.c:752
-msgid "no <cmd> given for --extcmd=<cmd>"
-msgstr ""
-
-#: builtin/env--helper.c:6
-msgid "git env--helper --type=[bool|ulong] <options> <env-var>"
-msgstr ""
-
-#: builtin/env--helper.c:46
-msgid "default for git_env_*(...) to fall back on"
-msgstr ""
-
-#: builtin/env--helper.c:48
-msgid "be quiet only use git_env_*() value as exit code"
-msgstr ""
-
-#: builtin/env--helper.c:67
-#, c-format
-msgid "option `--default' expects a boolean value with `--type=bool`, not `%s`"
-msgstr ""
-
-#: builtin/env--helper.c:82
-#, c-format
-msgid ""
-"option `--default' expects an unsigned long value with `--type=ulong`, not `"
-"%s`"
-msgstr ""
-
-#: builtin/fast-export.c:29
-msgid "git fast-export [<rev-list-opts>]"
-msgstr ""
-
-#: builtin/fast-export.c:843
-msgid "Error: Cannot export nested tags unless --mark-tags is specified."
-msgstr ""
-
-#: builtin/fast-export.c:1152
-msgid "--anonymize-map token cannot be empty"
-msgstr ""
-
-#: builtin/fast-export.c:1171
-msgid "show progress after <n> objects"
-msgstr ""
-
-#: builtin/fast-export.c:1173
-msgid "select handling of signed tags"
-msgstr ""
-
-#: builtin/fast-export.c:1176
-msgid "select handling of tags that tag filtered objects"
-msgstr ""
-
-#: builtin/fast-export.c:1179
-msgid "select handling of commit messages in an alternate encoding"
-msgstr ""
-
-#: builtin/fast-export.c:1182
-msgid "dump marks to this file"
-msgstr ""
-
-#: builtin/fast-export.c:1184
-msgid "import marks from this file"
-msgstr ""
-
-#: builtin/fast-export.c:1188
-msgid "import marks from this file if it exists"
-msgstr ""
-
-#: builtin/fast-export.c:1190
-msgid "fake a tagger when tags lack one"
-msgstr ""
-
-#: builtin/fast-export.c:1192
-msgid "output full tree for each commit"
-msgstr ""
-
-#: builtin/fast-export.c:1194
-msgid "use the done feature to terminate the stream"
-msgstr ""
-
-#: builtin/fast-export.c:1195
-msgid "skip output of blob data"
-msgstr ""
-
-#: builtin/fast-export.c:1196 builtin/log.c:1860
-msgid "refspec"
-msgstr ""
-
-#: builtin/fast-export.c:1197
-msgid "apply refspec to exported refs"
-msgstr ""
-
-#: builtin/fast-export.c:1198
-msgid "anonymize output"
-msgstr ""
-
-#: builtin/fast-export.c:1199
-msgid "from:to"
-msgstr ""
-
-#: builtin/fast-export.c:1200
-msgid "convert <from> to <to> in anonymized output"
-msgstr ""
-
-#: builtin/fast-export.c:1203
-msgid "reference parents which are not in fast-export stream by object id"
-msgstr ""
-
-#: builtin/fast-export.c:1205
-msgid "show original object ids of blobs/commits"
-msgstr ""
-
-#: builtin/fast-export.c:1207
-msgid "label tags with mark ids"
-msgstr ""
-
-#: builtin/fast-import.c:3097
-#, c-format
-msgid "Missing from marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3099
-#, c-format
-msgid "Missing to marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3234
-#, c-format
-msgid "Expected 'mark' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3239
-#, c-format
-msgid "Expected 'to' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3331
-msgid "Expected format name:filename for submodule rewrite option"
-msgstr ""
-
-#: builtin/fast-import.c:3386
-#, c-format
-msgid "feature '%s' forbidden in input without --allow-unsafe-features"
-msgstr ""
-
-#: builtin/fetch-pack.c:246
-#, c-format
-msgid "Lockfile created but not reported: %s"
-msgstr ""
-
-#: builtin/fetch.c:36
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/fetch.c:37
-msgid "git fetch [<options>] <group>"
-msgstr ""
-
-#: builtin/fetch.c:38
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
-
-#: builtin/fetch.c:39
-msgid "git fetch --all [<options>]"
-msgstr ""
-
-#: builtin/fetch.c:124
-msgid "fetch.parallel cannot be negative"
-msgstr ""
-
-#: builtin/fetch.c:147 builtin/pull.c:189
-msgid "fetch from all remotes"
-msgstr ""
-
-#: builtin/fetch.c:149 builtin/pull.c:249
-msgid "set upstream for git pull/fetch"
-msgstr ""
-
-#: builtin/fetch.c:151 builtin/pull.c:192
-msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
-
-#: builtin/fetch.c:153
-msgid "use atomic transaction to update references"
-msgstr ""
-
-#: builtin/fetch.c:155 builtin/pull.c:195
-msgid "path to upload pack on remote end"
-msgstr ""
-
-#: builtin/fetch.c:156
-msgid "force overwrite of local reference"
-msgstr ""
-
-#: builtin/fetch.c:158
-msgid "fetch from multiple remotes"
-msgstr ""
-
-#: builtin/fetch.c:160 builtin/pull.c:199
-msgid "fetch all tags and associated objects"
-msgstr ""
-
-#: builtin/fetch.c:162
-msgid "do not fetch all tags (--no-tags)"
-msgstr ""
-
-#: builtin/fetch.c:164
-msgid "number of submodules fetched in parallel"
-msgstr ""
-
-#: builtin/fetch.c:166
-msgid "modify the refspec to place all refs within refs/prefetch/"
-msgstr ""
-
-#: builtin/fetch.c:168 builtin/pull.c:202
-msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
-
-#: builtin/fetch.c:170
-msgid "prune local tags no longer on remote and clobber changed tags"
-msgstr ""
-
-#: builtin/fetch.c:171 builtin/fetch.c:199 builtin/pull.c:123
-msgid "on-demand"
-msgstr ""
-
-#: builtin/fetch.c:172
-msgid "control recursive fetching of submodules"
-msgstr ""
-
-#: builtin/fetch.c:177
-msgid "write fetched references to the FETCH_HEAD file"
-msgstr ""
-
-#: builtin/fetch.c:178 builtin/pull.c:210
-msgid "keep downloaded pack"
-msgstr ""
-
-#: builtin/fetch.c:180
-msgid "allow updating of HEAD ref"
-msgstr ""
-
-#: builtin/fetch.c:183 builtin/fetch.c:189 builtin/pull.c:213
-#: builtin/pull.c:222
-msgid "deepen history of shallow clone"
-msgstr ""
-
-#: builtin/fetch.c:185 builtin/pull.c:216
-msgid "deepen history of shallow repository based on time"
-msgstr ""
-
-#: builtin/fetch.c:191 builtin/pull.c:225
-msgid "convert to a complete repository"
-msgstr ""
-
-#: builtin/fetch.c:194
-msgid "re-fetch without negotiating common commits"
-msgstr ""
-
-#: builtin/fetch.c:197
-msgid "prepend this to submodule path output"
-msgstr ""
-
-#: builtin/fetch.c:200
-msgid ""
-"default for recursive fetching of submodules (lower priority than config "
-"files)"
-msgstr ""
-
-#: builtin/fetch.c:204 builtin/pull.c:228
-msgid "accept refs that update .git/shallow"
-msgstr ""
-
-#: builtin/fetch.c:205 builtin/pull.c:230
-msgid "refmap"
-msgstr ""
-
-#: builtin/fetch.c:206 builtin/pull.c:231
-msgid "specify fetch refmap"
-msgstr ""
-
-#: builtin/fetch.c:213 builtin/pull.c:244
-msgid "report that we have only objects reachable from this object"
-msgstr ""
-
-#: builtin/fetch.c:215
-msgid "do not fetch a packfile; instead, print ancestors of negotiation tips"
-msgstr ""
-
-#: builtin/fetch.c:218 builtin/fetch.c:220
-msgid "run 'maintenance --auto' after fetching"
-msgstr ""
-
-#: builtin/fetch.c:222 builtin/pull.c:247
-msgid "check for forced-updates on all updated branches"
-msgstr ""
-
-#: builtin/fetch.c:224
-msgid "write the commit-graph after fetching"
-msgstr ""
-
-#: builtin/fetch.c:226
-msgid "accept refspecs from stdin"
-msgstr ""
-
-#: builtin/fetch.c:618
-msgid "couldn't find remote ref HEAD"
-msgstr ""
-
-#: builtin/fetch.c:893
-#, c-format
-msgid "object %s not found"
-msgstr ""
-
-#: builtin/fetch.c:897
-msgid "[up to date]"
-msgstr ""
-
-#: builtin/fetch.c:909 builtin/fetch.c:927 builtin/fetch.c:999
-msgid "[rejected]"
-msgstr ""
-
-#: builtin/fetch.c:911
-msgid "can't fetch in current branch"
-msgstr ""
-
-#: builtin/fetch.c:912
-msgid "checked out in another worktree"
-msgstr ""
-
-#: builtin/fetch.c:922
-msgid "[tag update]"
-msgstr ""
-
-#: builtin/fetch.c:923 builtin/fetch.c:960 builtin/fetch.c:982
-#: builtin/fetch.c:994
-msgid "unable to update local ref"
-msgstr ""
-
-#: builtin/fetch.c:927
-msgid "would clobber existing tag"
-msgstr ""
-
-#: builtin/fetch.c:949
-msgid "[new tag]"
-msgstr ""
-
-#: builtin/fetch.c:952
-msgid "[new branch]"
-msgstr ""
-
-#: builtin/fetch.c:955
-msgid "[new ref]"
-msgstr ""
-
-#: builtin/fetch.c:994
-msgid "forced update"
-msgstr ""
-
-#: builtin/fetch.c:999
-msgid "non-fast-forward"
-msgstr ""
-
-#: builtin/fetch.c:1102
-msgid ""
-"fetch normally indicates which branches had a forced update,\n"
-"but that check has been disabled; to re-enable, use '--show-forced-updates'\n"
-"flag or run 'git config fetch.showForcedUpdates true'"
-msgstr ""
-
-#: builtin/fetch.c:1106
-#, c-format
-msgid ""
-"it took %.2f seconds to check forced updates; you can use\n"
-"'--no-show-forced-updates' or run 'git config fetch.showForcedUpdates "
-"false'\n"
-"to avoid this check\n"
-msgstr ""
-
-#: builtin/fetch.c:1136
-#, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr ""
-
-#: builtin/fetch.c:1156
-#, c-format
-msgid "rejected %s because shallow roots are not allowed to be updated"
-msgstr ""
-
-#: builtin/fetch.c:1259 builtin/fetch.c:1418
-#, c-format
-msgid "From %.*s\n"
-msgstr ""
-
-#: builtin/fetch.c:1269
-#, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
-msgstr ""
-
-#: builtin/fetch.c:1377
-#, c-format
-msgid "   (%s will become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1378
-#, c-format
-msgid "   (%s has become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1421
-msgid "[deleted]"
-msgstr ""
-
-#: builtin/fetch.c:1422 builtin/remote.c:1153
-msgid "(none)"
-msgstr ""
-
-#: builtin/fetch.c:1446
-#, c-format
-msgid "refusing to fetch into branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/fetch.c:1466
-#, c-format
-msgid "option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
-
-#: builtin/fetch.c:1469
-#, c-format
-msgid "option \"%s\" is ignored for %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1496
-#, c-format
-msgid "the object %s does not exist"
-msgstr ""
-
-#: builtin/fetch.c:1748
-msgid "multiple branches detected, incompatible with --set-upstream"
-msgstr ""
-
-#: builtin/fetch.c:1760
-#, c-format
-msgid ""
-"could not set upstream of HEAD to '%s' from '%s' when it does not point to "
-"any branch."
-msgstr ""
-
-#: builtin/fetch.c:1773
-msgid "not setting upstream for a remote remote-tracking branch"
-msgstr ""
-
-#: builtin/fetch.c:1775
-msgid "not setting upstream for a remote tag"
-msgstr ""
-
-#: builtin/fetch.c:1777
-msgid "unknown branch type"
-msgstr ""
-
-#: builtin/fetch.c:1779
-msgid ""
-"no source branch found;\n"
-"you need to specify exactly one branch with the --set-upstream option"
-msgstr ""
-
-#: builtin/fetch.c:1904 builtin/fetch.c:1967
-#, c-format
-msgid "Fetching %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1914 builtin/fetch.c:1969
-#, c-format
-msgid "could not fetch %s"
-msgstr ""
-
-#: builtin/fetch.c:1926
-#, c-format
-msgid "could not fetch '%s' (exit code: %d)\n"
-msgstr ""
-
-#: builtin/fetch.c:2030
-msgid ""
-"no remote repository specified; please specify either a URL or a\n"
-"remote name from which new revisions should be fetched"
-msgstr ""
-
-#: builtin/fetch.c:2066
-msgid "you need to specify a tag name"
-msgstr ""
-
-#: builtin/fetch.c:2156
-msgid "--negotiate-only needs one or more --negotiation-tip=*"
-msgstr ""
-
-#: builtin/fetch.c:2160
-msgid "negative depth in --deepen is not supported"
-msgstr ""
-
-#: builtin/fetch.c:2169
-msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2186
-msgid "fetch --all does not take a repository argument"
-msgstr ""
-
-#: builtin/fetch.c:2188
-msgid "fetch --all does not make sense with refspecs"
-msgstr ""
-
-#: builtin/fetch.c:2197
-#, c-format
-msgid "no such remote or remote group: %s"
-msgstr ""
-
-#: builtin/fetch.c:2205
-msgid "fetching a group and specifying refspecs does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2221
-msgid "must supply remote when using --negotiate-only"
-msgstr ""
-
-#: builtin/fetch.c:2226
-msgid "protocol does not support --negotiate-only, exiting"
-msgstr ""
-
-#: builtin/fetch.c:2246
-msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
-msgstr ""
-
-#: builtin/fetch.c:2250
-msgid "--atomic can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fetch.c:2254
-msgid "--stdin can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:7
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:19
-msgid "populate log with at most <n> entries from shortlog"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:22
-msgid "alias for --log (deprecated)"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:25
-msgid "text"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:26
-msgid "use <text> as start of message"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:28
-msgid "use <name> instead of the real target branch"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:29
-msgid "file to read from"
-msgstr ""
-
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [--points-at <object>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:13
-msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for shells"
-msgstr ""
-
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for perl"
-msgstr ""
-
-#: builtin/for-each-ref.c:35
-msgid "quote placeholders suitably for python"
-msgstr ""
-
-#: builtin/for-each-ref.c:37
-msgid "quote placeholders suitably for Tcl"
-msgstr ""
-
-#: builtin/for-each-ref.c:40
-msgid "show only <n> matched refs"
-msgstr ""
-
-#: builtin/for-each-ref.c:42 builtin/tag.c:482
-msgid "respect format colors"
-msgstr ""
-
-#: builtin/for-each-ref.c:45
-msgid "print only refs which points at the given object"
-msgstr ""
-
-#: builtin/for-each-ref.c:47
-msgid "print only refs that are merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:48
-msgid "print only refs that are not merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:49
-msgid "print only refs which contain the commit"
-msgstr ""
-
-#: builtin/for-each-ref.c:50
-msgid "print only refs which don't contain the commit"
-msgstr ""
-
-#: builtin/for-each-repo.c:9
-msgid "git for-each-repo --config=<config> <command-args>"
-msgstr ""
-
-#: builtin/for-each-repo.c:34
-msgid "config"
-msgstr ""
-
-#: builtin/for-each-repo.c:35
-msgid "config key storing a list of repository paths"
-msgstr ""
-
-#: builtin/for-each-repo.c:43
-msgid "missing --config=<config>"
-msgstr ""
-
-#: builtin/fsck.c:69 builtin/fsck.c:128 builtin/fsck.c:129
-msgid "unknown"
-msgstr ""
-
-#. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:78 builtin/fsck.c:100
-#, c-format
-msgid "error in %s %s: %s"
-msgstr ""
-
-#. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:94
-#, c-format
-msgid "warning in %s %s: %s"
-msgstr ""
-
-#: builtin/fsck.c:124 builtin/fsck.c:127
-#, c-format
-msgid "broken link from %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:136
-msgid "wrong object type in link"
-msgstr ""
-
-#: builtin/fsck.c:152
-#, c-format
-msgid ""
-"broken link from %7s %s\n"
-"              to %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:264
-#, c-format
-msgid "missing %s %s"
-msgstr ""
-
-#: builtin/fsck.c:291
-#, c-format
-msgid "unreachable %s %s"
-msgstr ""
-
-#: builtin/fsck.c:311
-#, c-format
-msgid "dangling %s %s"
-msgstr ""
-
-#: builtin/fsck.c:321
-msgid "could not create lost-found"
-msgstr ""
-
-#: builtin/fsck.c:332
-#, c-format
-msgid "could not finish '%s'"
-msgstr ""
-
-#: builtin/fsck.c:349
-#, c-format
-msgid "Checking %s"
-msgstr ""
-
-#: builtin/fsck.c:387
-#, c-format
-msgid "Checking connectivity (%d objects)"
-msgstr ""
-
-#: builtin/fsck.c:406
-#, c-format
-msgid "Checking %s %s"
-msgstr ""
-
-#: builtin/fsck.c:411
-msgid "broken links"
-msgstr ""
-
-#: builtin/fsck.c:420
-#, c-format
-msgid "root %s"
-msgstr ""
-
-#: builtin/fsck.c:428
-#, c-format
-msgid "tagged %s %s (%s) in %s"
-msgstr ""
-
-#: builtin/fsck.c:457
-#, c-format
-msgid "%s: object corrupt or missing"
-msgstr ""
-
-#: builtin/fsck.c:482
-#, c-format
-msgid "%s: invalid reflog entry %s"
-msgstr ""
-
-#: builtin/fsck.c:496
-#, c-format
-msgid "Checking reflog %s->%s"
-msgstr ""
-
-#: builtin/fsck.c:530
-#, c-format
-msgid "%s: invalid sha1 pointer %s"
-msgstr ""
-
-#: builtin/fsck.c:537
-#, c-format
-msgid "%s: not a commit"
-msgstr ""
-
-#: builtin/fsck.c:591
-msgid "notice: No default references"
-msgstr ""
-
-#: builtin/fsck.c:621
-#, c-format
-msgid "%s: hash-path mismatch, found at: %s"
-msgstr ""
-
-#: builtin/fsck.c:624
-#, c-format
-msgid "%s: object corrupt or missing: %s"
-msgstr ""
-
-#: builtin/fsck.c:628
-#, c-format
-msgid "%s: object is of unknown type '%s': %s"
-msgstr ""
-
-#: builtin/fsck.c:645
-#, c-format
-msgid "%s: object could not be parsed: %s"
-msgstr ""
-
-#: builtin/fsck.c:665
-#, c-format
-msgid "bad sha1 file: %s"
-msgstr ""
-
-#: builtin/fsck.c:686
-msgid "Checking object directory"
-msgstr ""
-
-#: builtin/fsck.c:689
-msgid "Checking object directories"
-msgstr ""
-
-#: builtin/fsck.c:705
-#, c-format
-msgid "Checking %s link"
-msgstr ""
-
-#: builtin/fsck.c:710 builtin/index-pack.c:862
-#, c-format
-msgid "invalid %s"
-msgstr ""
-
-#: builtin/fsck.c:717
-#, c-format
-msgid "%s points to something strange (%s)"
-msgstr ""
-
-#: builtin/fsck.c:723
-#, c-format
-msgid "%s: detached HEAD points at nothing"
-msgstr ""
-
-#: builtin/fsck.c:727
-#, c-format
-msgid "notice: %s points to an unborn branch (%s)"
-msgstr ""
-
-#: builtin/fsck.c:739
-msgid "Checking cache tree"
-msgstr ""
-
-#: builtin/fsck.c:744
-#, c-format
-msgid "%s: invalid sha1 pointer in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:753
-msgid "non-tree in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:784
-msgid "git fsck [<options>] [<object>...]"
-msgstr ""
-
-#: builtin/fsck.c:790
-msgid "show unreachable objects"
-msgstr ""
-
-#: builtin/fsck.c:791
-msgid "show dangling objects"
-msgstr ""
-
-#: builtin/fsck.c:792
-msgid "report tags"
-msgstr ""
-
-#: builtin/fsck.c:793
-msgid "report root nodes"
-msgstr ""
-
-#: builtin/fsck.c:794
-msgid "make index objects head nodes"
-msgstr ""
-
-#: builtin/fsck.c:795
-msgid "make reflogs head nodes (default)"
-msgstr ""
-
-#: builtin/fsck.c:796
-msgid "also consider packs and alternate objects"
-msgstr ""
-
-#: builtin/fsck.c:797
-msgid "check only connectivity"
-msgstr ""
-
-#: builtin/fsck.c:798 builtin/mktag.c:75
-msgid "enable more strict checking"
-msgstr ""
-
-#: builtin/fsck.c:800
-msgid "write dangling objects in .git/lost-found"
-msgstr ""
-
-#: builtin/fsck.c:801 builtin/prune.c:146
-msgid "show progress"
-msgstr ""
-
-#: builtin/fsck.c:802
-msgid "show verbose names for reachable objects"
-msgstr ""
-
-#: builtin/fsck.c:862 builtin/index-pack.c:261
-msgid "Checking objects"
-msgstr ""
-
-#: builtin/fsck.c:890
-#, c-format
-msgid "%s: object missing"
-msgstr ""
-
-#: builtin/fsck.c:901
-#, c-format
-msgid "invalid parameter: expected sha1, got '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:13
-msgid "git fsmonitor--daemon start [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:14
-msgid "git fsmonitor--daemon run [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:15
-msgid "git fsmonitor--daemon stop"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:16
-msgid "git fsmonitor--daemon status"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:38 builtin/fsmonitor--daemon.c:47
-#, c-format
-msgid "value of '%s' out of range: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:57
-#, c-format
-msgid "value of '%s' not bool or int: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:99
-#, c-format
-msgid "fsmonitor-daemon is watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:104
-#, c-format
-msgid "fsmonitor-daemon is not watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:170
-#, c-format
-msgid "could not create fsmonitor cookie '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:753
-#, c-format
-msgid "fsmonitor: cookie_result '%d' != SEEN"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1187
-#, c-format
-msgid "could not start IPC thread pool on '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1199
-msgid "could not start fsmonitor listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1297
-msgid "could not initialize listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1328 builtin/fsmonitor--daemon.c:1383
-#, c-format
-msgid "fsmonitor--daemon is already running '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1332
-#, c-format
-msgid "running fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1387
-#, c-format
-msgid "starting fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1413
-msgid "daemon failed to start"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1416
-msgid "daemon not online yet"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1419
-msgid "daemon terminated"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1429
-msgid "detach from console"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1432
-msgid "use <n> ipc worker threads"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1435
-msgid "max seconds to wait for background daemon startup"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1449
-#, c-format
-msgid "invalid 'ipc-threads' value (%d)"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1464
-#, c-format
-msgid "Unhandled subcommand '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1477
-msgid "fsmonitor--daemon not supported on this platform"
-msgstr ""
-
-#: builtin/gc.c:39
-msgid "git gc [<options>]"
-msgstr ""
-
-#: builtin/gc.c:93
-#, c-format
-msgid "Failed to fstat %s: %s"
-msgstr ""
-
-#: builtin/gc.c:129
-#, c-format
-msgid "failed to parse '%s' value '%s'"
-msgstr ""
-
-#: builtin/gc.c:488 builtin/init-db.c:57
-#, c-format
-msgid "cannot stat '%s'"
-msgstr ""
-
-#: builtin/gc.c:504
-#, c-format
-msgid ""
-"The last gc run reported the following. Please correct the root cause\n"
-"and remove %s\n"
-"Automatic cleanup will not be performed until the file is removed.\n"
-"\n"
-"%s"
-msgstr ""
-
-#: builtin/gc.c:552
-msgid "prune unreferenced objects"
-msgstr ""
-
-#: builtin/gc.c:554
-msgid "be more thorough (increased runtime)"
-msgstr ""
-
-#: builtin/gc.c:555
-msgid "enable auto-gc mode"
-msgstr ""
-
-#: builtin/gc.c:558
-msgid "force running gc even if there may be another gc running"
-msgstr ""
-
-#: builtin/gc.c:561
-msgid "repack all other packs except the largest pack"
-msgstr ""
-
-#: builtin/gc.c:577
-#, c-format
-msgid "failed to parse gc.logexpiry value %s"
-msgstr ""
-
-#: builtin/gc.c:588
-#, c-format
-msgid "failed to parse prune expiry value %s"
-msgstr ""
-
-#: builtin/gc.c:608
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:610
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:611
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
-msgstr ""
-
-#: builtin/gc.c:652
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
-msgstr ""
-
-#: builtin/gc.c:707
-msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
-msgstr ""
-
-#: builtin/gc.c:717
-msgid ""
-"git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
-msgstr ""
-
-#: builtin/gc.c:747
-msgid "--no-schedule is not allowed"
-msgstr ""
-
-#: builtin/gc.c:752
-#, c-format
-msgid "unrecognized --schedule argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:870
-msgid "failed to write commit-graph"
-msgstr ""
-
-#: builtin/gc.c:906
-msgid "failed to prefetch remotes"
-msgstr ""
-
-#: builtin/gc.c:1022
-msgid "failed to start 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1039
-msgid "failed to finish 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1090
-msgid "failed to write multi-pack-index"
-msgstr ""
-
-#: builtin/gc.c:1106
-msgid "'git multi-pack-index expire' failed"
-msgstr ""
-
-#: builtin/gc.c:1165
-msgid "'git multi-pack-index repack' failed"
-msgstr ""
-
-#: builtin/gc.c:1174
-msgid ""
-"skipping incremental-repack task because core.multiPackIndex is disabled"
-msgstr ""
-
-#: builtin/gc.c:1278
-#, c-format
-msgid "lock file '%s' exists, skipping maintenance"
-msgstr ""
-
-#: builtin/gc.c:1308
-#, c-format
-msgid "task '%s' failed"
-msgstr ""
-
-#: builtin/gc.c:1390
-#, c-format
-msgid "'%s' is not a valid task"
-msgstr ""
-
-#: builtin/gc.c:1395
-#, c-format
-msgid "task '%s' cannot be selected multiple times"
-msgstr ""
-
-#: builtin/gc.c:1410
-msgid "run tasks based on the state of the repository"
-msgstr ""
-
-#: builtin/gc.c:1411
-msgid "frequency"
-msgstr ""
-
-#: builtin/gc.c:1412
-msgid "run tasks based on frequency"
-msgstr ""
-
-#: builtin/gc.c:1415
-msgid "do not report progress or other information over stderr"
-msgstr ""
-
-#: builtin/gc.c:1416
-msgid "task"
-msgstr ""
-
-#: builtin/gc.c:1417
-msgid "run a specific task"
-msgstr ""
-
-#: builtin/gc.c:1434
-msgid "use at most one of --auto and --schedule=<frequency>"
-msgstr ""
-
-#: builtin/gc.c:1477
-msgid "failed to run 'git config'"
-msgstr ""
-
-#: builtin/gc.c:1629
-#, c-format
-msgid "failed to expand path '%s'"
-msgstr ""
-
-#: builtin/gc.c:1656 builtin/gc.c:1694
-msgid "failed to start launchctl"
-msgstr ""
-
-#: builtin/gc.c:1769 builtin/gc.c:2237
-#, c-format
-msgid "failed to create directories for '%s'"
-msgstr ""
-
-#: builtin/gc.c:1796
-#, c-format
-msgid "failed to bootstrap service %s"
-msgstr ""
-
-#: builtin/gc.c:1889
-msgid "failed to create temp xml file"
-msgstr ""
-
-#: builtin/gc.c:1979
-msgid "failed to start schtasks"
-msgstr ""
-
-#: builtin/gc.c:2063
-msgid "failed to run 'crontab -l'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2080
-msgid "failed to run 'crontab'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2084
-msgid "failed to open stdin of 'crontab'"
-msgstr ""
-
-#: builtin/gc.c:2126
-msgid "'crontab' died"
-msgstr ""
-
-#: builtin/gc.c:2191
-msgid "failed to start systemctl"
-msgstr ""
-
-#: builtin/gc.c:2201
-msgid "failed to run systemctl"
-msgstr ""
-
-#: builtin/gc.c:2210 builtin/gc.c:2215 builtin/worktree.c:63
-#: builtin/worktree.c:1024
-#, c-format
-msgid "failed to delete '%s'"
-msgstr ""
-
-#: builtin/gc.c:2395
-#, c-format
-msgid "unrecognized --scheduler argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:2420
-msgid "neither systemd timers nor crontab are available"
-msgstr ""
-
-#: builtin/gc.c:2435
-#, c-format
-msgid "%s scheduler is not available"
-msgstr ""
-
-#: builtin/gc.c:2449
-msgid "another process is scheduling background maintenance"
-msgstr ""
-
-#: builtin/gc.c:2471
-msgid "git maintenance start [--scheduler=<scheduler>]"
-msgstr ""
-
-#: builtin/gc.c:2480
-msgid "scheduler"
-msgstr ""
-
-#: builtin/gc.c:2481
-msgid "scheduler to trigger git maintenance run"
-msgstr ""
-
-#: builtin/gc.c:2495
-msgid "failed to add repo to global config"
-msgstr ""
-
-#: builtin/gc.c:2504
-msgid "git maintenance <subcommand> [<options>]"
-msgstr ""
-
-#: builtin/gc.c:2523
-#, c-format
-msgid "invalid subcommand: %s"
-msgstr ""
-
-#: builtin/grep.c:32
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
-
-#: builtin/grep.c:241
-#, c-format
-msgid "grep: failed to create thread: %s"
-msgstr ""
-
-#: builtin/grep.c:295
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
-msgstr ""
-
-#. TRANSLATORS: %s is the configuration
-#. variable for tweaking threads, currently
-#. grep.threads
-#.
-#: builtin/grep.c:303 builtin/index-pack.c:1587 builtin/index-pack.c:1791
-#: builtin/pack-objects.c:3150
-#, c-format
-msgid "no threads support, ignoring %s"
-msgstr ""
-
-#: builtin/grep.c:490 builtin/grep.c:619 builtin/grep.c:659
-#, c-format
-msgid "unable to read tree (%s)"
-msgstr ""
-
-#: builtin/grep.c:674
-#, c-format
-msgid "unable to grep from object of type %s"
-msgstr ""
-
-#: builtin/grep.c:754
-#, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr ""
-
-#: builtin/grep.c:852
-msgid "search in index instead of in the work tree"
-msgstr ""
-
-#: builtin/grep.c:854
-msgid "find in contents not managed by git"
-msgstr ""
-
-#: builtin/grep.c:856
-msgid "search in both tracked and untracked files"
-msgstr ""
-
-#: builtin/grep.c:858
-msgid "ignore files specified via '.gitignore'"
-msgstr ""
-
-#: builtin/grep.c:860
-msgid "recursively search in each submodule"
-msgstr ""
-
-#: builtin/grep.c:863
-msgid "show non-matching lines"
-msgstr ""
-
-#: builtin/grep.c:865
-msgid "case insensitive matching"
-msgstr ""
-
-#: builtin/grep.c:867
-msgid "match patterns only at word boundaries"
-msgstr ""
-
-#: builtin/grep.c:869
-msgid "process binary files as text"
-msgstr ""
-
-#: builtin/grep.c:871
-msgid "don't match patterns in binary files"
-msgstr ""
-
-#: builtin/grep.c:874
-msgid "process binary files with textconv filters"
-msgstr ""
-
-#: builtin/grep.c:876
-msgid "search in subdirectories (default)"
-msgstr ""
-
-#: builtin/grep.c:878
-msgid "descend at most <depth> levels"
-msgstr ""
-
-#: builtin/grep.c:882
-msgid "use extended POSIX regular expressions"
-msgstr ""
-
-#: builtin/grep.c:885
-msgid "use basic POSIX regular expressions (default)"
-msgstr ""
-
-#: builtin/grep.c:888
-msgid "interpret patterns as fixed strings"
-msgstr ""
-
-#: builtin/grep.c:891
-msgid "use Perl-compatible regular expressions"
-msgstr ""
-
-#: builtin/grep.c:894
-msgid "show line numbers"
-msgstr ""
-
-#: builtin/grep.c:895
-msgid "show column number of first match"
-msgstr ""
-
-#: builtin/grep.c:896
-msgid "don't show filenames"
-msgstr ""
-
-#: builtin/grep.c:897
-msgid "show filenames"
-msgstr ""
-
-#: builtin/grep.c:899
-msgid "show filenames relative to top directory"
-msgstr ""
-
-#: builtin/grep.c:901
-msgid "show only filenames instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:903
-msgid "synonym for --files-with-matches"
-msgstr ""
-
-#: builtin/grep.c:906
-msgid "show only the names of files without match"
-msgstr ""
-
-#: builtin/grep.c:908
-msgid "print NUL after filenames"
-msgstr ""
-
-#: builtin/grep.c:911
-msgid "show only matching parts of a line"
-msgstr ""
-
-#: builtin/grep.c:913
-msgid "show the number of matches instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:914
-msgid "highlight matches"
-msgstr ""
-
-#: builtin/grep.c:916
-msgid "print empty line between matches from different files"
-msgstr ""
-
-#: builtin/grep.c:918
-msgid "show filename only once above matches from same file"
-msgstr ""
-
-#: builtin/grep.c:921
-msgid "show <n> context lines before and after matches"
-msgstr ""
-
-#: builtin/grep.c:924
-msgid "show <n> context lines before matches"
-msgstr ""
-
-#: builtin/grep.c:926
-msgid "show <n> context lines after matches"
-msgstr ""
-
-#: builtin/grep.c:928
-msgid "use <n> worker threads"
-msgstr ""
-
-#: builtin/grep.c:929
-msgid "shortcut for -C NUM"
-msgstr ""
-
-#: builtin/grep.c:932
-msgid "show a line with the function name before matches"
-msgstr ""
-
-#: builtin/grep.c:934
-msgid "show the surrounding function"
-msgstr ""
-
-#: builtin/grep.c:937
-msgid "read patterns from file"
-msgstr ""
-
-#: builtin/grep.c:939
-msgid "match <pattern>"
-msgstr ""
-
-#: builtin/grep.c:941
-msgid "combine patterns specified with -e"
-msgstr ""
-
-#: builtin/grep.c:953
-msgid "indicate hit with exit status without output"
-msgstr ""
-
-#: builtin/grep.c:955
-msgid "show only matches from files that match all patterns"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "pager"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "show matching files in the pager"
-msgstr ""
-
-#: builtin/grep.c:962
-msgid "allow calling of grep(1) (ignored by this build)"
-msgstr ""
-
-#: builtin/grep.c:1028
-msgid "no pattern given"
-msgstr ""
-
-#: builtin/grep.c:1064
-msgid "--no-index or --untracked cannot be used with revs"
-msgstr ""
-
-#: builtin/grep.c:1072
-#, c-format
-msgid "unable to resolve revision: %s"
-msgstr ""
-
-#: builtin/grep.c:1102
-msgid "--untracked not supported with --recurse-submodules"
-msgstr ""
-
-#: builtin/grep.c:1106
-msgid "invalid option combination, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1109 builtin/pack-objects.c:4084
-msgid "no threads support, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1112 builtin/index-pack.c:1584 builtin/pack-objects.c:3147
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr ""
-
-#: builtin/grep.c:1146
-msgid "--open-files-in-pager only works on the worktree"
-msgstr ""
-
-#: builtin/grep.c:1179
-msgid "--[no-]exclude-standard cannot be used for tracked contents"
-msgstr ""
-
-#: builtin/grep.c:1187
-msgid "both --cached and trees are given"
-msgstr ""
-
-#: builtin/hash-object.c:83
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
-msgstr ""
-
-#: builtin/hash-object.c:97
-msgid "object type"
-msgstr ""
-
-#: builtin/hash-object.c:98
-msgid "write the object into the object database"
-msgstr ""
-
-#: builtin/hash-object.c:100
-msgid "read the object from stdin"
-msgstr ""
-
-#: builtin/hash-object.c:102
-msgid "store file as is without filters"
-msgstr ""
-
-#: builtin/hash-object.c:103
-msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
-msgstr ""
-
-#: builtin/hash-object.c:104
-msgid "process file as it were from this path"
-msgstr ""
-
-#: builtin/help.c:57
-msgid "print all available commands"
-msgstr ""
-
-#: builtin/help.c:60
-msgid "show external commands in --all"
-msgstr ""
-
-#: builtin/help.c:61
-msgid "show aliases in --all"
-msgstr ""
-
-#: builtin/help.c:62
-msgid "exclude guides"
-msgstr ""
-
-#: builtin/help.c:63
-msgid "show man page"
-msgstr ""
-
-#: builtin/help.c:64
-msgid "show manual in web browser"
-msgstr ""
-
-#: builtin/help.c:66
-msgid "show info page"
-msgstr ""
-
-#: builtin/help.c:68
-msgid "print command description"
-msgstr ""
-
-#: builtin/help.c:70
-msgid "print list of useful guides"
-msgstr ""
-
-#: builtin/help.c:72
-msgid "print all configuration variable names"
-msgstr ""
-
-#: builtin/help.c:84
-msgid "git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"
-msgstr ""
-
-#: builtin/help.c:201
-#, c-format
-msgid "unrecognized help format '%s'"
-msgstr ""
-
-#: builtin/help.c:227
-msgid "Failed to start emacsclient."
-msgstr ""
-
-#: builtin/help.c:240
-msgid "Failed to parse emacsclient version."
-msgstr ""
-
-#: builtin/help.c:248
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr ""
-
-#: builtin/help.c:266 builtin/help.c:288 builtin/help.c:298 builtin/help.c:306
-#, c-format
-msgid "failed to exec '%s'"
-msgstr ""
-
-#: builtin/help.c:344
-#, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
-msgstr ""
-
-#: builtin/help.c:356
-#, c-format
-msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
-msgstr ""
-
-#: builtin/help.c:471
-#, c-format
-msgid "'%s': unknown man viewer."
-msgstr ""
-
-#: builtin/help.c:487
-msgid "no man viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:494
-msgid "no info viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:555 builtin/help.c:566 git.c:348
-#, c-format
-msgid "'%s' is aliased to '%s'"
-msgstr ""
-
-#: builtin/help.c:569 git.c:380
-#, c-format
-msgid "bad alias.%s string: %s"
-msgstr ""
-
-#: builtin/help.c:611
-#, c-format
-msgid "the '%s' option doesn't take any non-option arguments"
-msgstr ""
-
-#: builtin/help.c:631
-msgid ""
-"the '--no-[external-commands|aliases]' options can only be used with '--all'"
-msgstr ""
-
-#: builtin/help.c:643 builtin/help.c:671
-#, c-format
-msgid "usage: %s%s"
-msgstr ""
-
-#: builtin/help.c:666
-msgid "'git help config' for more information"
-msgstr ""
-
-#: builtin/hook.c:10
-msgid "git hook run [--ignore-missing] <hook-name> [-- <hook-args>]"
-msgstr ""
-
-#: builtin/hook.c:30
-msgid "silently ignore missing requested <hook-name>"
-msgstr ""
-
-#: builtin/index-pack.c:221
-#, c-format
-msgid "object type mismatch at %s"
-msgstr ""
-
-#: builtin/index-pack.c:241
-#, c-format
-msgid "did not receive expected object %s"
-msgstr ""
-
-#: builtin/index-pack.c:244
-#, c-format
-msgid "object %s: expected type %s, found %s"
-msgstr ""
-
-#: builtin/index-pack.c:294
-#, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:304
-msgid "early EOF"
-msgstr ""
-
-#: builtin/index-pack.c:305
-msgid "read error on input"
-msgstr ""
-
-#: builtin/index-pack.c:317
-msgid "used more bytes than were available"
-msgstr ""
-
-#: builtin/index-pack.c:324 builtin/pack-objects.c:754
-msgid "pack too large for current definition of off_t"
-msgstr ""
-
-#: builtin/index-pack.c:329
-#, c-format
-msgid "pack exceeds maximum allowed size (%s)"
-msgstr ""
-
-#: builtin/index-pack.c:362
-msgid "pack signature mismatch"
-msgstr ""
-
-#: builtin/index-pack.c:364
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr ""
-
-#: builtin/index-pack.c:380
-#, c-format
-msgid "pack has bad object at offset %<PRIuMAX>: %s"
-msgstr ""
-
-#: builtin/index-pack.c:485
-#, c-format
-msgid "inflate returned %d"
-msgstr ""
-
-#: builtin/index-pack.c:534
-msgid "offset value overflow for delta base object"
-msgstr ""
-
-#: builtin/index-pack.c:542
-msgid "delta base offset is out of bound"
-msgstr ""
-
-#: builtin/index-pack.c:550
-#, c-format
-msgid "unknown object type %d"
-msgstr ""
-
-#: builtin/index-pack.c:581
-msgid "cannot pread pack file"
-msgstr ""
-
-#: builtin/index-pack.c:583
-#, c-format
-msgid "premature end of pack file, %<PRIuMAX> byte missing"
-msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:609
-msgid "serious inflate inconsistency"
-msgstr ""
-
-#: builtin/index-pack.c:754 builtin/index-pack.c:760 builtin/index-pack.c:784
-#: builtin/index-pack.c:823 builtin/index-pack.c:832
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
-msgstr ""
-
-#: builtin/index-pack.c:757 builtin/pack-objects.c:290
-#: builtin/pack-objects.c:350 builtin/pack-objects.c:456
-#, c-format
-msgid "unable to read %s"
-msgstr ""
-
-#: builtin/index-pack.c:821
-#, c-format
-msgid "cannot read existing object info %s"
-msgstr ""
-
-#: builtin/index-pack.c:829
-#, c-format
-msgid "cannot read existing object %s"
-msgstr ""
-
-#: builtin/index-pack.c:843
-#, c-format
-msgid "invalid blob object %s"
-msgstr ""
-
-#: builtin/index-pack.c:846 builtin/index-pack.c:865
-msgid "fsck error in packed object"
-msgstr ""
-
-#: builtin/index-pack.c:867
-#, c-format
-msgid "Not all child objects of %s are reachable"
-msgstr ""
-
-#: builtin/index-pack.c:928 builtin/index-pack.c:975
-msgid "failed to apply delta"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Receiving objects"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Indexing objects"
-msgstr ""
-
-#: builtin/index-pack.c:1195
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr ""
-
-#: builtin/index-pack.c:1200
-msgid "cannot fstat packfile"
-msgstr ""
-
-#: builtin/index-pack.c:1203
-msgid "pack has junk at the end"
-msgstr ""
-
-#: builtin/index-pack.c:1215
-msgid "confusion beyond insanity in parse_pack_objects()"
-msgstr ""
-
-#: builtin/index-pack.c:1238
-msgid "Resolving deltas"
-msgstr ""
-
-#: builtin/index-pack.c:1249 builtin/pack-objects.c:2913
-#, c-format
-msgid "unable to create thread: %s"
-msgstr ""
-
-#: builtin/index-pack.c:1282
-msgid "confusion beyond insanity"
-msgstr ""
-
-#: builtin/index-pack.c:1288
-#, c-format
-msgid "completed with %d local object"
-msgid_plural "completed with %d local objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1300
-#, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr ""
-
-#: builtin/index-pack.c:1304
-#, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1328
-#, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr ""
-
-#: builtin/index-pack.c:1423
-#, c-format
-msgid "local object %s is corrupt"
-msgstr ""
-
-#: builtin/index-pack.c:1445
-#, c-format
-msgid "packfile name '%s' does not end with '.%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1469
-#, c-format
-msgid "cannot write %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1477
-#, c-format
-msgid "cannot close written %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1494
-#, c-format
-msgid "unable to rename temporary '*.%s' file to '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1519
-msgid "error while closing pack file"
-msgstr ""
-
-#: builtin/index-pack.c:1578 builtin/pack-objects.c:3158
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr ""
-
-#: builtin/index-pack.c:1648
-#, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1650
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1698
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1705
-#, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1748
-msgid "Cannot come back to cwd"
-msgstr ""
-
-#: builtin/index-pack.c:1802 builtin/index-pack.c:1805
-#: builtin/index-pack.c:1825 builtin/index-pack.c:1829
-#, c-format
-msgid "bad %s"
-msgstr ""
-
-#: builtin/index-pack.c:1835 builtin/init-db.c:379 builtin/init-db.c:614
-#, c-format
-msgid "unknown hash algorithm '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1856
-msgid "--stdin requires a git repository"
-msgstr ""
-
-#: builtin/index-pack.c:1873
-msgid "--verify with no packfile name given"
-msgstr ""
-
-#: builtin/index-pack.c:1939 builtin/unpack-objects.c:584
-msgid "fsck error in pack objects"
-msgstr ""
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr ""
-
-#: builtin/init-db.c:68
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr ""
-
-#: builtin/init-db.c:80
-#, c-format
-msgid "cannot readlink '%s'"
-msgstr ""
-
-#: builtin/init-db.c:82
-#, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr ""
-
-#: builtin/init-db.c:88
-#, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr ""
-
-#: builtin/init-db.c:92
-#, c-format
-msgid "ignoring template %s"
-msgstr ""
-
-#: builtin/init-db.c:123
-#, c-format
-msgid "templates not found in %s"
-msgstr ""
-
-#: builtin/init-db.c:138
-#, c-format
-msgid "not copying templates from '%s': %s"
-msgstr ""
-
-#: builtin/init-db.c:263
-#, c-format
-msgid "invalid initial branch name: '%s'"
-msgstr ""
-
-#: builtin/init-db.c:354
-#, c-format
-msgid "unable to handle file type %d"
-msgstr ""
-
-#: builtin/init-db.c:357
-#, c-format
-msgid "unable to move %s to %s"
-msgstr ""
-
-#: builtin/init-db.c:373
-msgid "attempt to reinitialize repository with different hash"
-msgstr ""
-
-#: builtin/init-db.c:397 builtin/init-db.c:400
-#, c-format
-msgid "%s already exists"
-msgstr ""
-
-#: builtin/init-db.c:432
-#, c-format
-msgid "re-init: ignored --initial-branch=%s"
-msgstr ""
-
-#: builtin/init-db.c:463
-#, c-format
-msgid "Reinitialized existing shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:464
-#, c-format
-msgid "Reinitialized existing Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:468
-#, c-format
-msgid "Initialized empty shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:469
-#, c-format
-msgid "Initialized empty Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:518
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-
-#: builtin/init-db.c:544
-msgid "permissions"
-msgstr ""
-
-#: builtin/init-db.c:545
-msgid "specify that the git repository is to be shared amongst several users"
-msgstr ""
-
-#: builtin/init-db.c:551
-msgid "override the name of the initial branch"
-msgstr ""
-
-#: builtin/init-db.c:552 builtin/verify-pack.c:74
-msgid "hash"
-msgstr ""
-
-#: builtin/init-db.c:553 builtin/show-index.c:22 builtin/verify-pack.c:75
-msgid "specify the hash algorithm to use"
-msgstr ""
-
-#: builtin/init-db.c:591 builtin/init-db.c:596
-#, c-format
-msgid "cannot mkdir %s"
-msgstr ""
-
-#: builtin/init-db.c:600 builtin/init-db.c:655
-#, c-format
-msgid "cannot chdir to %s"
-msgstr ""
-
-#: builtin/init-db.c:627
-#, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-msgstr ""
-
-#: builtin/init-db.c:679
-#, c-format
-msgid "Cannot access work tree '%s'"
-msgstr ""
-
-#: builtin/init-db.c:684
-msgid "--separate-git-dir incompatible with bare repository"
-msgstr ""
-
-#: builtin/interpret-trailers.c:16
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
-msgstr ""
-
-#: builtin/interpret-trailers.c:95
-msgid "edit files in place"
-msgstr ""
-
-#: builtin/interpret-trailers.c:96
-msgid "trim empty trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:99
-msgid "where to place the new trailer"
-msgstr ""
-
-#: builtin/interpret-trailers.c:101
-msgid "action if trailer already exists"
-msgstr ""
-
-#: builtin/interpret-trailers.c:103
-msgid "action if trailer is missing"
-msgstr ""
-
-#: builtin/interpret-trailers.c:105
-msgid "output only the trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:106
-msgid "do not apply config rules"
-msgstr ""
-
-#: builtin/interpret-trailers.c:107
-msgid "join whitespace-continued values"
-msgstr ""
-
-#: builtin/interpret-trailers.c:108
-msgid "set parsing options"
-msgstr ""
-
-#: builtin/interpret-trailers.c:110
-msgid "do not treat --- specially"
-msgstr ""
-
-#: builtin/interpret-trailers.c:112
-msgid "trailer(s) to add"
-msgstr ""
-
-#: builtin/interpret-trailers.c:123
-msgid "--trailer with --only-input does not make sense"
-msgstr ""
-
-#: builtin/interpret-trailers.c:133
-msgid "no input file given for in-place editing"
-msgstr ""
-
-#: builtin/log.c:60
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/log.c:61
-msgid "git show [<options>] <object>..."
-msgstr ""
-
-#: builtin/log.c:114
-#, c-format
-msgid "invalid --decorate option: %s"
-msgstr ""
-
-#: builtin/log.c:181
-msgid "show source"
-msgstr ""
-
-#: builtin/log.c:182
-msgid "use mail map file"
-msgstr ""
-
-#: builtin/log.c:185
-msgid "only decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:187
-msgid "do not decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:188
-msgid "decorate options"
-msgstr ""
-
-#: builtin/log.c:191
-msgid ""
-"trace the evolution of line range <start>,<end> or function :<funcname> in "
-"<file>"
-msgstr ""
-
-#: builtin/log.c:214
-msgid "-L<range>:<file> cannot be used with pathspec"
-msgstr ""
-
-#: builtin/log.c:322
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr ""
-
-#: builtin/log.c:429
-msgid "unable to create temporary object directory"
-msgstr ""
-
-#: builtin/log.c:599
-#, c-format
-msgid "git show %s: bad file"
-msgstr ""
-
-#: builtin/log.c:614 builtin/log.c:706
-#, c-format
-msgid "could not read object %s"
-msgstr ""
-
-#: builtin/log.c:731
-#, c-format
-msgid "unknown type: %d"
-msgstr ""
-
-#: builtin/log.c:880
-#, c-format
-msgid "%s: invalid cover from description mode"
-msgstr ""
-
-#: builtin/log.c:887
-msgid "format.headers without value"
-msgstr ""
-
-#: builtin/log.c:1016
-#, c-format
-msgid "cannot open patch file %s"
-msgstr ""
-
-#: builtin/log.c:1033
-msgid "need exactly one range"
-msgstr ""
-
-#: builtin/log.c:1043
-msgid "not a range"
-msgstr ""
-
-#: builtin/log.c:1207
-msgid "cover letter needs email format"
-msgstr ""
-
-#: builtin/log.c:1213
-msgid "failed to create cover-letter file"
-msgstr ""
-
-#: builtin/log.c:1300
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr ""
-
-#: builtin/log.c:1327
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
-msgstr ""
-
-#: builtin/log.c:1385
-msgid "two output directories?"
-msgstr ""
-
-#: builtin/log.c:1536 builtin/log.c:2369 builtin/log.c:2371 builtin/log.c:2383
-#, c-format
-msgid "unknown commit %s"
-msgstr ""
-
-#: builtin/log.c:1547 builtin/replace.c:58 builtin/replace.c:207
-#: builtin/replace.c:210
-#, c-format
-msgid "failed to resolve '%s' as a valid ref"
-msgstr ""
-
-#: builtin/log.c:1556
-msgid "could not find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1566
-msgid ""
-"failed to get upstream, if you want to record base commit automatically,\n"
-"please use git branch --set-upstream-to to track a remote branch.\n"
-"Or you could specify base commit by --base=<base-commit-id> manually"
-msgstr ""
-
-#: builtin/log.c:1589
-msgid "failed to find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1606
-msgid "base commit should be the ancestor of revision list"
-msgstr ""
-
-#: builtin/log.c:1616
-msgid "base commit shouldn't be in revision list"
-msgstr ""
-
-#: builtin/log.c:1674
-msgid "cannot get patch id"
-msgstr ""
-
-#: builtin/log.c:1737
-msgid "failed to infer range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1739
-#, c-format
-msgid "using '%s' as range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1783
-msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
-
-#: builtin/log.c:1786
-msgid "use [PATCH] even with multiple patches"
-msgstr ""
-
-#: builtin/log.c:1790
-msgid "print patches to standard out"
-msgstr ""
-
-#: builtin/log.c:1792
-msgid "generate a cover letter"
-msgstr ""
-
-#: builtin/log.c:1794
-msgid "use simple number sequence for output file names"
-msgstr ""
-
-#: builtin/log.c:1795
-msgid "sfx"
-msgstr ""
-
-#: builtin/log.c:1796
-msgid "use <sfx> instead of '.patch'"
-msgstr ""
-
-#: builtin/log.c:1798
-msgid "start numbering patches at <n> instead of 1"
-msgstr ""
-
-#: builtin/log.c:1799
-msgid "reroll-count"
-msgstr ""
-
-#: builtin/log.c:1800
-msgid "mark the series as Nth re-roll"
-msgstr ""
-
-#: builtin/log.c:1802
-msgid "max length of output filename"
-msgstr ""
-
-#: builtin/log.c:1804
-msgid "use [RFC PATCH] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1807
-msgid "cover-from-description-mode"
-msgstr ""
-
-#: builtin/log.c:1808
-msgid "generate parts of a cover letter based on a branch's description"
-msgstr ""
-
-#: builtin/log.c:1810
-msgid "use [<prefix>] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1813
-msgid "store resulting files in <dir>"
-msgstr ""
-
-#: builtin/log.c:1816
-msgid "don't strip/add [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1819
-msgid "don't output binary diffs"
-msgstr ""
-
-#: builtin/log.c:1821
-msgid "output all-zero hash in From header"
-msgstr ""
-
-#: builtin/log.c:1823
-msgid "don't include a patch matching a commit upstream"
-msgstr ""
-
-#: builtin/log.c:1825
-msgid "show patch format instead of default (patch + stat)"
-msgstr ""
-
-#: builtin/log.c:1827
-msgid "Messaging"
-msgstr ""
-
-#: builtin/log.c:1828
-msgid "header"
-msgstr ""
-
-#: builtin/log.c:1829
-msgid "add email header"
-msgstr ""
-
-#: builtin/log.c:1830 builtin/log.c:1831
-msgid "email"
-msgstr ""
-
-#: builtin/log.c:1830
-msgid "add To: header"
-msgstr ""
-
-#: builtin/log.c:1831
-msgid "add Cc: header"
-msgstr ""
-
-#: builtin/log.c:1832
-msgid "ident"
-msgstr ""
-
-#: builtin/log.c:1833
-msgid "set From address to <ident> (or committer ident if absent)"
-msgstr ""
-
-#: builtin/log.c:1835
-msgid "message-id"
-msgstr ""
-
-#: builtin/log.c:1836
-msgid "make first mail a reply to <message-id>"
-msgstr ""
-
-#: builtin/log.c:1837 builtin/log.c:1840
-msgid "boundary"
-msgstr ""
-
-#: builtin/log.c:1838
-msgid "attach the patch"
-msgstr ""
-
-#: builtin/log.c:1841
-msgid "inline the patch"
-msgstr ""
-
-#: builtin/log.c:1845
-msgid "enable message threading, styles: shallow, deep"
-msgstr ""
-
-#: builtin/log.c:1847
-msgid "signature"
-msgstr ""
-
-#: builtin/log.c:1848
-msgid "add a signature"
-msgstr ""
-
-#: builtin/log.c:1849
-msgid "base-commit"
-msgstr ""
-
-#: builtin/log.c:1850
-msgid "add prerequisite tree info to the patch series"
-msgstr ""
-
-#: builtin/log.c:1853
-msgid "add a signature from a file"
-msgstr ""
-
-#: builtin/log.c:1854
-msgid "don't print the patch filenames"
-msgstr ""
-
-#: builtin/log.c:1856
-msgid "show progress while generating patches"
-msgstr ""
-
-#: builtin/log.c:1858
-msgid "show changes against <rev> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1861
-msgid "show changes against <refspec> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1863 builtin/range-diff.c:28
-msgid "percentage by which creation is weighted"
-msgstr ""
-
-#: builtin/log.c:1953
-#, c-format
-msgid "invalid ident line: %s"
-msgstr ""
-
-#: builtin/log.c:1978
-msgid "--name-only does not make sense"
-msgstr ""
-
-#: builtin/log.c:1980
-msgid "--name-status does not make sense"
-msgstr ""
-
-#: builtin/log.c:1982
-msgid "--check does not make sense"
-msgstr ""
-
-#: builtin/log.c:1984
-msgid "--remerge-diff does not make sense"
-msgstr ""
-
-#: builtin/log.c:2129
-msgid "--interdiff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2133
-msgid "Interdiff:"
-msgstr ""
-
-#: builtin/log.c:2134
-#, c-format
-msgid "Interdiff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2144
-msgid "--range-diff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2152
-msgid "Range-diff:"
-msgstr ""
-
-#: builtin/log.c:2153
-#, c-format
-msgid "Range-diff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2164
-#, c-format
-msgid "unable to read signature file '%s'"
-msgstr ""
-
-#: builtin/log.c:2200
-msgid "Generating patches"
-msgstr ""
-
-#: builtin/log.c:2244
-msgid "failed to create output files"
-msgstr ""
-
-#: builtin/log.c:2304
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
-
-#: builtin/log.c:2358
-#, c-format
-msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
-msgstr ""
-
-#: builtin/ls-files.c:564
-msgid "git ls-files [<options>] [<file>...]"
-msgstr ""
-
-#: builtin/ls-files.c:618
-msgid "separate paths with the NUL character"
-msgstr ""
-
-#: builtin/ls-files.c:620
-msgid "identify the file status with tags"
-msgstr ""
-
-#: builtin/ls-files.c:622
-msgid "use lowercase letters for 'assume unchanged' files"
-msgstr ""
-
-#: builtin/ls-files.c:624
-msgid "use lowercase letters for 'fsmonitor clean' files"
-msgstr ""
-
-#: builtin/ls-files.c:626
-msgid "show cached files in the output (default)"
-msgstr ""
-
-#: builtin/ls-files.c:628
-msgid "show deleted files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:630
-msgid "show modified files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:632
-msgid "show other files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:634
-msgid "show ignored files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:637
-msgid "show staged contents' object name in the output"
-msgstr ""
-
-#: builtin/ls-files.c:639
-msgid "show files on the filesystem that need to be removed"
-msgstr ""
-
-#: builtin/ls-files.c:641
-msgid "show 'other' directories' names only"
-msgstr ""
-
-#: builtin/ls-files.c:643
-msgid "show line endings of files"
-msgstr ""
-
-#: builtin/ls-files.c:645
-msgid "don't show empty directories"
-msgstr ""
-
-#: builtin/ls-files.c:648
-msgid "show unmerged files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:650
-msgid "show resolve-undo information"
-msgstr ""
-
-#: builtin/ls-files.c:652
-msgid "skip files matching pattern"
-msgstr ""
-
-#: builtin/ls-files.c:655
-msgid "read exclude patterns from <file>"
-msgstr ""
-
-#: builtin/ls-files.c:658
-msgid "read additional per-directory exclude patterns in <file>"
-msgstr ""
-
-#: builtin/ls-files.c:660
-msgid "add the standard git exclusions"
-msgstr ""
-
-#: builtin/ls-files.c:664
-msgid "make the output relative to the project top directory"
-msgstr ""
-
-#: builtin/ls-files.c:669
-msgid "if any <file> is not in the index, treat this as an error"
-msgstr ""
-
-#: builtin/ls-files.c:670
-msgid "tree-ish"
-msgstr ""
-
-#: builtin/ls-files.c:671
-msgid "pretend that paths removed since <tree-ish> are still present"
-msgstr ""
-
-#: builtin/ls-files.c:673
-msgid "show debugging data"
-msgstr ""
-
-#: builtin/ls-files.c:675
-msgid "suppress duplicate entries"
-msgstr ""
-
-#: builtin/ls-files.c:677
-msgid "show sparse directories in the presence of a sparse index"
-msgstr ""
-
-#: builtin/ls-remote.c:9
-msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"              [-q | --quiet] [--exit-code] [--get-url]\n"
-"              [--symref] [<repository> [<refs>...]]"
-msgstr ""
-
-#: builtin/ls-remote.c:60
-msgid "do not print remote URL"
-msgstr ""
-
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1131
-msgid "exec"
-msgstr ""
-
-#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
-msgid "path of git-upload-pack on the remote host"
-msgstr ""
-
-#: builtin/ls-remote.c:66
-msgid "limit to tags"
-msgstr ""
-
-#: builtin/ls-remote.c:67
-msgid "limit to heads"
-msgstr ""
-
-#: builtin/ls-remote.c:68
-msgid "do not show peeled tags"
-msgstr ""
-
-#: builtin/ls-remote.c:70
-msgid "take url.<base>.insteadOf into account"
-msgstr ""
-
-#: builtin/ls-remote.c:73
-msgid "exit with exit code 2 if no matching refs are found"
-msgstr ""
-
-#: builtin/ls-remote.c:76
-msgid "show underlying ref in addition to the object pointed by it"
-msgstr ""
-
-#: builtin/ls-tree.c:36
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: builtin/ls-tree.c:54
-#, c-format
-msgid "could not get object info about '%s'"
-msgstr ""
-
-#: builtin/ls-tree.c:79
-#, c-format
-msgid "bad ls-tree format: element '%s' does not start with '('"
-msgstr ""
-
-#: builtin/ls-tree.c:83
-#, c-format
-msgid "bad ls-tree format: element '%s' does not end in ')'"
-msgstr ""
-
-#: builtin/ls-tree.c:109
-#, c-format
-msgid "bad ls-tree format: %%%.*s"
-msgstr ""
-
-#: builtin/ls-tree.c:336
-msgid "only show trees"
-msgstr ""
-
-#: builtin/ls-tree.c:338
-msgid "recurse into subtrees"
-msgstr ""
-
-#: builtin/ls-tree.c:340
-msgid "show trees when recursing"
-msgstr ""
-
-#: builtin/ls-tree.c:343
-msgid "terminate entries with NUL byte"
-msgstr ""
-
-#: builtin/ls-tree.c:344
-msgid "include object size"
-msgstr ""
-
-#: builtin/ls-tree.c:346 builtin/ls-tree.c:348
-msgid "list only filenames"
-msgstr ""
-
-#: builtin/ls-tree.c:350
-msgid "list only objects"
-msgstr ""
-
-#: builtin/ls-tree.c:353
-msgid "use full path names"
-msgstr ""
-
-#: builtin/ls-tree.c:355
-msgid "list entire tree; not just current directory (implies --full-name)"
-msgstr ""
-
-#: builtin/ls-tree.c:391
-msgid "--format can't be combined with other format-altering options"
-msgstr ""
-
-#. TRANSLATORS: keep <> in "<" mail ">" info.
-#: builtin/mailinfo.c:14
-msgid "git mailinfo [<options>] <msg> <patch> < mail >info"
-msgstr ""
-
-#: builtin/mailinfo.c:58
-msgid "keep subject"
-msgstr ""
-
-#: builtin/mailinfo.c:60
-msgid "keep non patch brackets in subject"
-msgstr ""
-
-#: builtin/mailinfo.c:62
-msgid "copy Message-ID to the end of commit message"
-msgstr ""
-
-#: builtin/mailinfo.c:64
-msgid "re-code metadata to i18n.commitEncoding"
-msgstr ""
-
-#: builtin/mailinfo.c:67
-msgid "disable charset re-coding of metadata"
-msgstr ""
-
-#: builtin/mailinfo.c:69
-msgid "encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:70
-msgid "re-code metadata to this encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:72
-msgid "use scissors"
-msgstr ""
-
-#: builtin/mailinfo.c:73
-msgid "<action>"
-msgstr ""
-
-#: builtin/mailinfo.c:74
-msgid "action when quoted CR is found"
-msgstr ""
-
-#: builtin/mailinfo.c:77
-msgid "use headers in message's body"
-msgstr ""
-
-#: builtin/mailsplit.c:227
-msgid "reading patches from stdin/tty..."
-msgstr ""
-
-#: builtin/mailsplit.c:242
-#, c-format
-msgid "empty mbox: '%s'"
-msgstr ""
-
-#: builtin/merge-base.c:32
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:33
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:34
-msgid "git merge-base --independent <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:35
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr ""
-
-#: builtin/merge-base.c:36
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr ""
-
-#: builtin/merge-base.c:144
-msgid "output all common ancestors"
-msgstr ""
-
-#: builtin/merge-base.c:146
-msgid "find ancestors for a single n-way merge"
-msgstr ""
-
-#: builtin/merge-base.c:148
-msgid "list revs not reachable from others"
-msgstr ""
-
-#: builtin/merge-base.c:150
-msgid "is the first one ancestor of the other?"
-msgstr ""
-
-#: builtin/merge-base.c:152
-msgid "find where <commit> forked from reflog of <ref>"
-msgstr ""
-
-#: builtin/merge-file.c:9
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
-msgstr ""
-
-#: builtin/merge-file.c:35
-msgid "send results to standard output"
-msgstr ""
-
-#: builtin/merge-file.c:36
-msgid "use a diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:37
-msgid "use a zealous diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:39
-msgid "for conflicts, use our version"
-msgstr ""
-
-#: builtin/merge-file.c:41
-msgid "for conflicts, use their version"
-msgstr ""
-
-#: builtin/merge-file.c:43
-msgid "for conflicts, use a union version"
-msgstr ""
-
-#: builtin/merge-file.c:46
-msgid "for conflicts, use this marker size"
-msgstr ""
-
-#: builtin/merge-file.c:47
-msgid "do not warn about conflicts"
-msgstr ""
-
-#: builtin/merge-file.c:49
-msgid "set labels for file1/orig-file/file2"
-msgstr ""
-
-#: builtin/merge-recursive.c:47
-#, c-format
-msgid "unknown option %s"
-msgstr ""
-
-#: builtin/merge-recursive.c:53
-#, c-format
-msgid "could not parse object '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:57
-#, c-format
-msgid "cannot handle more than %d base. Ignoring %s."
-msgid_plural "cannot handle more than %d bases. Ignoring %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/merge-recursive.c:65
-msgid "not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge-recursive.c:74 builtin/merge-recursive.c:76
-#, c-format
-msgid "could not resolve ref '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:82
-#, c-format
-msgid "Merging %s with %s\n"
-msgstr ""
-
-#: builtin/merge.c:59
-msgid "git merge [<options>] [<commit>...]"
-msgstr ""
-
-#: builtin/merge.c:125
-msgid "switch `m' requires a value"
-msgstr ""
-
-#: builtin/merge.c:148
-#, c-format
-msgid "option `%s' requires a value"
-msgstr ""
-
-#: builtin/merge.c:201
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr ""
-
-#: builtin/merge.c:202
-#, c-format
-msgid "Available strategies are:"
-msgstr ""
-
-#: builtin/merge.c:207
-#, c-format
-msgid "Available custom strategies are:"
-msgstr ""
-
-#: builtin/merge.c:258 builtin/pull.c:134
-msgid "do not show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:261 builtin/pull.c:137
-msgid "show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:262 builtin/pull.c:140
-msgid "(synonym to --stat)"
-msgstr ""
-
-#: builtin/merge.c:264 builtin/pull.c:143
-msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr ""
-
-#: builtin/merge.c:267 builtin/pull.c:149
-msgid "create a single commit instead of doing a merge"
-msgstr ""
-
-#: builtin/merge.c:269 builtin/pull.c:152
-msgid "perform a commit if the merge succeeds (default)"
-msgstr ""
-
-#: builtin/merge.c:271 builtin/pull.c:155
-msgid "edit message before committing"
-msgstr ""
-
-#: builtin/merge.c:273
-msgid "allow fast-forward (default)"
-msgstr ""
-
-#: builtin/merge.c:275 builtin/pull.c:162
-msgid "abort if fast-forward is not possible"
-msgstr ""
-
-#: builtin/merge.c:279 builtin/pull.c:168
-msgid "verify that the named commit has a valid GPG signature"
-msgstr ""
-
-#: builtin/merge.c:280 builtin/notes.c:785 builtin/pull.c:172
-#: builtin/rebase.c:1145 builtin/revert.c:114
-msgid "strategy"
-msgstr ""
-
-#: builtin/merge.c:281 builtin/pull.c:173
-msgid "merge strategy to use"
-msgstr ""
-
-#: builtin/merge.c:282 builtin/pull.c:176
-msgid "option=value"
-msgstr ""
-
-#: builtin/merge.c:283 builtin/pull.c:177
-msgid "option for selected merge strategy"
-msgstr ""
-
-#: builtin/merge.c:285
-msgid "merge commit message (for a non-fast-forward merge)"
-msgstr ""
-
-#: builtin/merge.c:291
-msgid "use <name> instead of the real target"
-msgstr ""
-
-#: builtin/merge.c:294
-msgid "abort the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:296
-msgid "--abort but leave index and working tree alone"
-msgstr ""
-
-#: builtin/merge.c:298
-msgid "continue the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:300 builtin/pull.c:184
-msgid "allow merging unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:307
-msgid "bypass pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/merge.c:323
-msgid "could not run stash."
-msgstr ""
-
-#: builtin/merge.c:328
-msgid "stash failed"
-msgstr ""
-
-#: builtin/merge.c:333
-#, c-format
-msgid "not a valid object: %s"
-msgstr ""
-
-#: builtin/merge.c:355 builtin/merge.c:372
-msgid "read-tree failed"
-msgstr ""
-
-#: builtin/merge.c:403
-msgid "Already up to date. (nothing to squash)"
-msgstr ""
-
-#: builtin/merge.c:417
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:467
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:517
-#, c-format
-msgid "'%s' does not point to a commit"
-msgstr ""
-
-#: builtin/merge.c:605
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr ""
-
-#: builtin/merge.c:732
-msgid "Not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge.c:745
-#, c-format
-msgid "unknown strategy option: -X%s"
-msgstr ""
-
-#: builtin/merge.c:764 t/helper/test-fast-rebase.c:223
-#, c-format
-msgid "unable to write %s"
-msgstr ""
-
-#: builtin/merge.c:816
-#, c-format
-msgid "Could not read from '%s'"
-msgstr ""
-
-#: builtin/merge.c:825
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:831
-msgid ""
-"Please enter a commit message to explain why this merge is necessary,\n"
-"especially if it merges an updated upstream into a topic branch.\n"
-"\n"
-msgstr ""
-
-#: builtin/merge.c:836
-msgid "An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:839
-#, c-format
-msgid ""
-"Lines starting with '%c' will be ignored, and an empty message aborts\n"
-"the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:900
-msgid "Empty commit message."
-msgstr ""
-
-#: builtin/merge.c:915
-#, c-format
-msgid "Wonderful.\n"
-msgstr ""
-
-#: builtin/merge.c:976
-#, c-format
-msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr ""
-
-#: builtin/merge.c:1015
-msgid "No current branch."
-msgstr ""
-
-#: builtin/merge.c:1017
-msgid "No remote for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1019
-msgid "No default upstream defined for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1024
-#, c-format
-msgid "No remote-tracking branch for %s from %s"
-msgstr ""
-
-#: builtin/merge.c:1081
-#, c-format
-msgid "Bad value '%s' in environment '%s'"
-msgstr ""
-
-#: builtin/merge.c:1183
-#, c-format
-msgid "not something we can merge in %s: %s"
-msgstr ""
-
-#: builtin/merge.c:1217
-msgid "not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1330
-msgid "--abort expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1334
-msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1352
-msgid "--quit expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1365
-msgid "--continue expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1369
-msgid "There is no merge in progress (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1385
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1392
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1395
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr ""
-
-#: builtin/merge.c:1427
-msgid "No commit specified and merge.defaultToUpstream not set."
-msgstr ""
-
-#: builtin/merge.c:1444
-msgid "Squash commit into empty head not supported yet"
-msgstr ""
-
-#: builtin/merge.c:1446
-msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr ""
-
-#: builtin/merge.c:1451
-#, c-format
-msgid "%s - not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1453
-msgid "Can merge only exactly one commit into empty head"
-msgstr ""
-
-#: builtin/merge.c:1540
-msgid "refusing to merge unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:1559
-#, c-format
-msgid "Updating %s..%s\n"
-msgstr ""
-
-#: builtin/merge.c:1606
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr ""
-
-#: builtin/merge.c:1613
-#, c-format
-msgid "Nope.\n"
-msgstr ""
-
-#: builtin/merge.c:1671 builtin/merge.c:1737
-#, c-format
-msgid "Rewinding the tree to pristine...\n"
-msgstr ""
-
-#: builtin/merge.c:1675
-#, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr ""
-
-#: builtin/merge.c:1727
-#, c-format
-msgid "No merge strategy handled the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:1729
-#, c-format
-msgid "Merge with strategy %s failed.\n"
-msgstr ""
-
-#: builtin/merge.c:1739
-#, c-format
-msgid "Using the %s strategy to prepare resolving by hand.\n"
-msgstr ""
-
-#: builtin/merge.c:1753
-#, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-
-#: builtin/mktag.c:27
-#, c-format
-msgid "warning: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:38
-#, c-format
-msgid "error: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:41
-#, c-format
-msgid "%d (FSCK_IGNORE?) should never trigger this callback"
-msgstr ""
-
-#: builtin/mktag.c:56
-#, c-format
-msgid "could not read tagged object '%s'"
-msgstr ""
-
-#: builtin/mktag.c:59
-#, c-format
-msgid "object '%s' tagged as '%s', but is a '%s' type"
-msgstr ""
-
-#: builtin/mktag.c:97
-msgid "tag on stdin did not pass our strict fsck check"
-msgstr ""
-
-#: builtin/mktag.c:100
-msgid "tag on stdin did not refer to a valid object"
-msgstr ""
-
-#: builtin/mktag.c:103 builtin/tag.c:243
-msgid "unable to write tag file"
-msgstr ""
-
-#: builtin/mktree.c:154
-msgid "input is NUL terminated"
-msgstr ""
-
-#: builtin/mktree.c:155 builtin/write-tree.c:26
-msgid "allow missing objects"
-msgstr ""
-
-#: builtin/mktree.c:156
-msgid "allow creation of more than one tree"
-msgstr ""
-
-#: builtin/multi-pack-index.c:10
-msgid ""
-"git multi-pack-index [<options>] write [--preferred-pack=<pack>][--refs-"
-"snapshot=<path>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:14
-msgid "git multi-pack-index [<options>] verify"
-msgstr ""
-
-#: builtin/multi-pack-index.c:17
-msgid "git multi-pack-index [<options>] expire"
-msgstr ""
-
-#: builtin/multi-pack-index.c:20
-msgid "git multi-pack-index [<options>] repack [--batch-size=<size>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:57
-msgid "object directory containing set of packfile and pack-index pairs"
-msgstr ""
-
-#: builtin/multi-pack-index.c:98
-msgid "preferred-pack"
-msgstr ""
-
-#: builtin/multi-pack-index.c:99
-msgid "pack for reuse when computing a multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:100
-msgid "write multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:105
-msgid "write multi-pack index containing only given indexes"
-msgstr ""
-
-#: builtin/multi-pack-index.c:107
-msgid "refs snapshot for selecting bitmap commits"
-msgstr ""
-
-#: builtin/multi-pack-index.c:206
-msgid ""
-"during repack, collect pack-files of smaller size into a batch that is "
-"larger than this size"
-msgstr ""
-
-#: builtin/mv.c:18
-msgid "git mv [<options>] <source>... <destination>"
-msgstr ""
-
-#: builtin/mv.c:83
-#, c-format
-msgid "Directory %s is in index and no submodule?"
-msgstr ""
-
-#: builtin/mv.c:85
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/mv.c:103
-#, c-format
-msgid "%.*s is in index"
-msgstr ""
-
-#: builtin/mv.c:125
-msgid "force move/rename even if target exists"
-msgstr ""
-
-#: builtin/mv.c:127
-msgid "skip move/rename errors"
-msgstr ""
-
-#: builtin/mv.c:172
-#, c-format
-msgid "destination '%s' is not a directory"
-msgstr ""
-
-#: builtin/mv.c:184
-#, c-format
-msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
-
-#: builtin/mv.c:190
-msgid "bad source"
-msgstr ""
-
-#: builtin/mv.c:193
-msgid "can not move directory into itself"
-msgstr ""
-
-#: builtin/mv.c:196
-msgid "cannot move directory over file"
-msgstr ""
-
-#: builtin/mv.c:205
-msgid "source directory is empty"
-msgstr ""
-
-#: builtin/mv.c:231
-msgid "not under version control"
-msgstr ""
-
-#: builtin/mv.c:233
-msgid "conflicted"
-msgstr ""
-
-#: builtin/mv.c:236
-msgid "destination exists"
-msgstr ""
-
-#: builtin/mv.c:244
-#, c-format
-msgid "overwriting '%s'"
-msgstr ""
-
-#: builtin/mv.c:247
-msgid "Cannot overwrite"
-msgstr ""
-
-#: builtin/mv.c:250
-msgid "multiple sources for the same target"
-msgstr ""
-
-#: builtin/mv.c:252
-msgid "destination directory does not exist"
-msgstr ""
-
-#: builtin/mv.c:280
-#, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr ""
-
-#: builtin/mv.c:308
-#, c-format
-msgid "Renaming %s to %s\n"
-msgstr ""
-
-#: builtin/mv.c:314 builtin/remote.c:812 builtin/repack.c:861
-#, c-format
-msgid "renaming '%s' failed"
-msgstr ""
-
-#: builtin/name-rev.c:524
-msgid "git name-rev [<options>] <commit>..."
-msgstr ""
-
-#: builtin/name-rev.c:525
-msgid "git name-rev [<options>] --all"
-msgstr ""
-
-#: builtin/name-rev.c:526
-msgid "git name-rev [<options>] --annotate-stdin"
-msgstr ""
-
-#: builtin/name-rev.c:583
-msgid "print only ref-based names (no object names)"
-msgstr ""
-
-#: builtin/name-rev.c:584
-msgid "only use tags to name the commits"
-msgstr ""
-
-#: builtin/name-rev.c:586
-msgid "only use refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:588
-msgid "ignore refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:590
-msgid "list all commits reachable from all refs"
-msgstr ""
-
-#: builtin/name-rev.c:591
-msgid "deprecated: use annotate-stdin instead"
-msgstr ""
-
-#: builtin/name-rev.c:592
-msgid "annotate text from stdin"
-msgstr ""
-
-#: builtin/name-rev.c:593
-msgid "allow to print `undefined` names (default)"
-msgstr ""
-
-#: builtin/name-rev.c:599
-msgid "dereference tags in the input (internal use)"
-msgstr ""
-
-#: builtin/notes.c:28
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:29
-msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:32
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:33
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:34
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:37
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr ""
-
-#: builtin/notes.c:38
-msgid "git notes [--ref <notes-ref>] prune [-n] [-v]"
-msgstr ""
-
-#: builtin/notes.c:39
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr ""
-
-#: builtin/notes.c:44
-msgid "git notes [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:49
-msgid "git notes add [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:54
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:55
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr ""
-
-#: builtin/notes.c:60
-msgid "git notes append [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:65
-msgid "git notes edit [<object>]"
-msgstr ""
-
-#: builtin/notes.c:70
-msgid "git notes show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:75
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:76
-msgid "git notes merge --commit [<options>]"
-msgstr ""
-
-#: builtin/notes.c:77
-msgid "git notes merge --abort [<options>]"
-msgstr ""
-
-#: builtin/notes.c:82
-msgid "git notes remove [<object>]"
-msgstr ""
-
-#: builtin/notes.c:87
-msgid "git notes prune [<options>]"
-msgstr ""
-
-#: builtin/notes.c:97
-msgid "Write/edit the notes for the following object:"
-msgstr ""
-
-#: builtin/notes.c:149
-#, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:153
-msgid "could not read 'show' output"
-msgstr ""
-
-#: builtin/notes.c:161
-#, c-format
-msgid "failed to finish 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:194
-msgid "please supply the note contents using either -m or -F option"
-msgstr ""
-
-#: builtin/notes.c:203
-msgid "unable to write note object"
-msgstr ""
-
-#: builtin/notes.c:206
-#, c-format
-msgid "the note contents have been left in %s"
-msgstr ""
-
-#: builtin/notes.c:240 builtin/tag.c:582
-#, c-format
-msgid "could not open or read '%s'"
-msgstr ""
-
-#: builtin/notes.c:261 builtin/notes.c:311 builtin/notes.c:313
-#: builtin/notes.c:381 builtin/notes.c:436 builtin/notes.c:524
-#: builtin/notes.c:529 builtin/notes.c:608 builtin/notes.c:670
-#, c-format
-msgid "failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:263
-#, c-format
-msgid "failed to read object '%s'."
-msgstr ""
-
-#: builtin/notes.c:266
-#, c-format
-msgid "cannot read note data from non-blob object '%s'."
-msgstr ""
-
-#: builtin/notes.c:307
-#, c-format
-msgid "malformed input line: '%s'."
-msgstr ""
-
-#: builtin/notes.c:322
-#, c-format
-msgid "failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#. TRANSLATORS: the first %s will be replaced by a git
-#. notes command: 'add', 'merge', 'remove', etc.
-#.
-#: builtin/notes.c:354
-#, c-format
-msgid "refusing to %s notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#: builtin/notes.c:387 builtin/notes.c:676
-#, c-format
-msgid "no note found for object %s."
-msgstr ""
-
-#: builtin/notes.c:408 builtin/notes.c:574
-msgid "note contents as a string"
-msgstr ""
-
-#: builtin/notes.c:411 builtin/notes.c:577
-msgid "note contents in a file"
-msgstr ""
-
-#: builtin/notes.c:414 builtin/notes.c:580
-msgid "reuse and edit specified note object"
-msgstr ""
-
-#: builtin/notes.c:417 builtin/notes.c:583
-msgid "reuse specified note object"
-msgstr ""
-
-#: builtin/notes.c:420 builtin/notes.c:586
-msgid "allow storing empty note"
-msgstr ""
-
-#: builtin/notes.c:421 builtin/notes.c:494
-msgid "replace existing notes"
-msgstr ""
-
-#: builtin/notes.c:446
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:461 builtin/notes.c:542
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:473 builtin/notes.c:635 builtin/notes.c:904
-#, c-format
-msgid "Removing note for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:495
-msgid "read objects from stdin"
-msgstr ""
-
-#: builtin/notes.c:497
-msgid "load rewriting config for <command> (implies --stdin)"
-msgstr ""
-
-#: builtin/notes.c:515
-msgid "too few arguments"
-msgstr ""
-
-#: builtin/notes.c:536
-#, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:548
-#, c-format
-msgid "missing notes on source object %s. Cannot copy."
-msgstr ""
-
-#: builtin/notes.c:601
-#, c-format
-msgid ""
-"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
-"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
-msgstr ""
-
-#: builtin/notes.c:696
-msgid "failed to delete ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:698
-msgid "failed to delete ref NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:700
-msgid "failed to remove 'git notes merge' worktree"
-msgstr ""
-
-#: builtin/notes.c:720
-msgid "failed to read ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:722
-msgid "could not find commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:724
-msgid "could not parse commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:737
-msgid "failed to resolve NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:740
-msgid "failed to finalize notes merge"
-msgstr ""
-
-#: builtin/notes.c:766
-#, c-format
-msgid "unknown notes merge strategy %s"
-msgstr ""
-
-#: builtin/notes.c:782
-msgid "General options"
-msgstr ""
-
-#: builtin/notes.c:784
-msgid "Merge options"
-msgstr ""
-
-#: builtin/notes.c:786
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
-msgstr ""
-
-#: builtin/notes.c:788
-msgid "Committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:790
-msgid "finalize notes merge by committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:792
-msgid "Aborting notes merge resolution"
-msgstr ""
-
-#: builtin/notes.c:794
-msgid "abort notes merge"
-msgstr ""
-
-#: builtin/notes.c:805
-msgid "cannot mix --commit, --abort or -s/--strategy"
-msgstr ""
-
-#: builtin/notes.c:810
-msgid "must specify a notes ref to merge"
-msgstr ""
-
-#: builtin/notes.c:834
-#, c-format
-msgid "unknown -s/--strategy: %s"
-msgstr ""
-
-#: builtin/notes.c:874
-#, c-format
-msgid "a notes merge into %s is already in-progress at %s"
-msgstr ""
-
-#: builtin/notes.c:878
-#, c-format
-msgid "failed to store link to current notes ref (%s)"
-msgstr ""
-
-#: builtin/notes.c:880
-#, c-format
-msgid ""
-"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
-"'git notes merge --commit', or abort the merge with 'git notes merge --"
-"abort'.\n"
-msgstr ""
-
-#: builtin/notes.c:899 builtin/tag.c:595
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:902
-#, c-format
-msgid "Object %s has no note\n"
-msgstr ""
-
-#: builtin/notes.c:914
-msgid "attempt to remove non-existent note is not an error"
-msgstr ""
-
-#: builtin/notes.c:917
-msgid "read object names from the standard input"
-msgstr ""
-
-#: builtin/notes.c:956 builtin/prune.c:144 builtin/worktree.c:148
-msgid "do not remove, show only"
-msgstr ""
-
-#: builtin/notes.c:957
-msgid "report pruned notes"
-msgstr ""
-
-#: builtin/notes.c:1000
-msgid "notes-ref"
-msgstr ""
-
-#: builtin/notes.c:1001
-msgid "use notes from <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:1036 builtin/stash.c:1802
-#, c-format
-msgid "unknown subcommand: %s"
-msgstr ""
-
-#: builtin/pack-objects.c:182
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:183
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:570
-#, c-format
-msgid ""
-"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
-"pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:578
-#, c-format
-msgid "bad packed object CRC for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:589
-#, c-format
-msgid "corrupt packed object for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:720
-#, c-format
-msgid "recursive delta detected for object %s"
-msgstr ""
-
-#: builtin/pack-objects.c:939
-#, c-format
-msgid "ordered %u objects, expected %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1034
-#, c-format
-msgid "expected object at offset %<PRIuMAX> in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1158
-msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
-msgstr ""
-
-#: builtin/pack-objects.c:1171
-msgid "Writing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:1243 builtin/update-index.c:90
-#, c-format
-msgid "failed to stat %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1276
-msgid "failed to write bitmap index"
-msgstr ""
-
-#: builtin/pack-objects.c:1302
-#, c-format
-msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1544
-msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr ""
-
-#: builtin/pack-objects.c:1992
-#, c-format
-msgid "delta base offset overflow in pack for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2001
-#, c-format
-msgid "delta base offset out of bound for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2282
-msgid "Counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2447
-#, c-format
-msgid "unable to parse object header of %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2517 builtin/pack-objects.c:2533
-#: builtin/pack-objects.c:2543
-#, c-format
-msgid "object %s cannot be read"
-msgstr ""
-
-#: builtin/pack-objects.c:2520 builtin/pack-objects.c:2547
-#, c-format
-msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
-msgstr ""
-
-#: builtin/pack-objects.c:2557
-msgid "suboptimal pack - out of memory"
-msgstr ""
-
-#: builtin/pack-objects.c:2872
-#, c-format
-msgid "Delta compression using up to %d threads"
-msgstr ""
-
-#: builtin/pack-objects.c:3011
-#, c-format
-msgid "unable to pack objects reachable from tag %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3097
-msgid "Compressing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3103
-msgid "inconsistency with delta count"
-msgstr ""
-
-#: builtin/pack-objects.c:3182
-#, c-format
-msgid ""
-"value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
-"hash> <uri>' (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3185
-#, c-format
-msgid ""
-"object already configured in another uploadpack.blobpackfileuri (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3220
-#, c-format
-msgid "could not get type of object %s in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3348 builtin/pack-objects.c:3359
-#: builtin/pack-objects.c:3373
-#, c-format
-msgid "could not find pack '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3416
-#, c-format
-msgid ""
-"expected edge object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3422
-#, c-format
-msgid ""
-"expected object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3540 builtin/pack-objects.c:3627
-msgid "cannot open pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3549
-#, c-format
-msgid "loose object at %s could not be examined"
-msgstr ""
-
-#: builtin/pack-objects.c:3635
-msgid "unable to force loose object"
-msgstr ""
-
-#: builtin/pack-objects.c:3763
-#, c-format
-msgid "not a rev '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3766 builtin/rev-parse.c:1061
-#, c-format
-msgid "bad revision '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3794
-msgid "unable to add recent objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3847
-#, c-format
-msgid "unsupported index version %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3851
-#, c-format
-msgid "bad index version '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3907
-msgid "<version>[,<offset>]"
-msgstr ""
-
-#: builtin/pack-objects.c:3908
-msgid "write the pack index file in the specified idx format version"
-msgstr ""
-
-#: builtin/pack-objects.c:3911
-msgid "maximum size of each output pack file"
-msgstr ""
-
-#: builtin/pack-objects.c:3913
-msgid "ignore borrowed objects from alternate object store"
-msgstr ""
-
-#: builtin/pack-objects.c:3915
-msgid "ignore packed objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3917
-msgid "limit pack window by objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3919
-msgid "limit pack window by memory in addition to object limit"
-msgstr ""
-
-#: builtin/pack-objects.c:3921
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3923
-msgid "reuse existing deltas"
-msgstr ""
-
-#: builtin/pack-objects.c:3925
-msgid "reuse existing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3927
-msgid "use OFS_DELTA objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3929
-msgid "use threads when searching for best delta matches"
-msgstr ""
-
-#: builtin/pack-objects.c:3931
-msgid "do not create an empty pack output"
-msgstr ""
-
-#: builtin/pack-objects.c:3933
-msgid "read revision arguments from standard input"
-msgstr ""
-
-#: builtin/pack-objects.c:3935
-msgid "limit the objects to those that are not yet packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3938
-msgid "include objects reachable from any reference"
-msgstr ""
-
-#: builtin/pack-objects.c:3941
-msgid "include objects referred by reflog entries"
-msgstr ""
-
-#: builtin/pack-objects.c:3944
-msgid "include objects referred to by the index"
-msgstr ""
-
-#: builtin/pack-objects.c:3947
-msgid "read packs from stdin"
-msgstr ""
-
-#: builtin/pack-objects.c:3949
-msgid "output pack to stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:3951
-msgid "include tag objects that refer to objects to be packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3953
-msgid "keep unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3955
-msgid "pack loose unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3957
-msgid "unpack unreachable objects newer than <time>"
-msgstr ""
-
-#: builtin/pack-objects.c:3960
-msgid "use the sparse reachability algorithm"
-msgstr ""
-
-#: builtin/pack-objects.c:3962
-msgid "create thin packs"
-msgstr ""
-
-#: builtin/pack-objects.c:3964
-msgid "create packs suitable for shallow fetches"
-msgstr ""
-
-#: builtin/pack-objects.c:3966
-msgid "ignore packs that have companion .keep file"
-msgstr ""
-
-#: builtin/pack-objects.c:3968
-msgid "ignore this pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3970
-msgid "pack compression level"
-msgstr ""
-
-#: builtin/pack-objects.c:3972
-msgid "do not hide commits by grafts"
-msgstr ""
-
-#: builtin/pack-objects.c:3974
-msgid "use a bitmap index if available to speed up counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3976
-msgid "write a bitmap index together with the pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3980
-msgid "write a bitmap index if possible"
-msgstr ""
-
-#: builtin/pack-objects.c:3984
-msgid "handling for missing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3987
-msgid "do not pack objects in promisor packfiles"
-msgstr ""
-
-#: builtin/pack-objects.c:3989
-msgid "respect islands during delta compression"
-msgstr ""
-
-#: builtin/pack-objects.c:3991
-msgid "protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:3992
-msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:4027
-#, c-format
-msgid "delta chain depth %d is too deep, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4032
-#, c-format
-msgid "pack.deltaCacheLimit is too high, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4088
-msgid "--max-pack-size cannot be used to build a pack for transfer"
-msgstr ""
-
-#: builtin/pack-objects.c:4090
-msgid "minimum pack size limit is 1 MiB"
-msgstr ""
-
-#: builtin/pack-objects.c:4095
-msgid "--thin cannot be used to build an indexable pack"
-msgstr ""
-
-#: builtin/pack-objects.c:4104
-msgid "cannot use --filter without --stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:4106
-msgid "cannot use --filter with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4110
-msgid "cannot use internal rev list with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4169
-msgid "Enumerating objects"
-msgstr ""
-
-#: builtin/pack-objects.c:4210
-#, c-format
-msgid ""
-"Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
-"reused %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-redundant.c:601
-msgid ""
-"'git pack-redundant' is nominated for removal.\n"
-"If you still use this command, please add an extra\n"
-"option, '--i-still-use-this', on the command line\n"
-"and let us know you still use it by sending an e-mail\n"
-"to <git@vger.kernel.org>.  Thanks.\n"
-msgstr ""
-
-#: builtin/pack-refs.c:8
-msgid "git pack-refs [<options>]"
-msgstr ""
-
-#: builtin/pack-refs.c:16
-msgid "pack everything"
-msgstr ""
-
-#: builtin/pack-refs.c:17
-msgid "prune loose refs (default)"
-msgstr ""
-
-#: builtin/prune.c:14
-msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]"
-msgstr ""
-
-#: builtin/prune.c:145
-msgid "report pruned objects"
-msgstr ""
-
-#: builtin/prune.c:148
-msgid "expire objects older than <time>"
-msgstr ""
-
-#: builtin/prune.c:150
-msgid "limit traversal to objects outside promisor packfiles"
-msgstr ""
-
-#: builtin/prune.c:163
-msgid "cannot prune in a precious-objects repo"
-msgstr ""
-
-#: builtin/pull.c:67
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/pull.c:124
-msgid "control for recursive fetching of submodules"
-msgstr ""
-
-#: builtin/pull.c:128
-msgid "Options related to merging"
-msgstr ""
-
-#: builtin/pull.c:131
-msgid "incorporate changes by rebasing rather than merging"
-msgstr ""
-
-#: builtin/pull.c:159 builtin/revert.c:126
-msgid "allow fast-forward"
-msgstr ""
-
-#: builtin/pull.c:165
-msgid "control use of pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/pull.c:171 parse-options.h:371
-msgid "automatically stash/stash pop before and after"
-msgstr ""
-
-#: builtin/pull.c:187
-msgid "Options related to fetching"
-msgstr ""
-
-#: builtin/pull.c:197
-msgid "force overwrite of local branch"
-msgstr ""
-
-#: builtin/pull.c:205
-msgid "number of submodules pulled in parallel"
-msgstr ""
-
-#: builtin/pull.c:449
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-
-#: builtin/pull.c:451
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-
-#: builtin/pull.c:452
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-
-#: builtin/pull.c:455
-#, c-format
-msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
-msgstr ""
-
-#: builtin/pull.c:460 builtin/rebase.c:978
-msgid "You are not currently on a branch."
-msgstr ""
-
-#: builtin/pull.c:462 builtin/pull.c:477
-msgid "Please specify which branch you want to rebase against."
-msgstr ""
-
-#: builtin/pull.c:464 builtin/pull.c:479
-msgid "Please specify which branch you want to merge with."
-msgstr ""
-
-#: builtin/pull.c:465 builtin/pull.c:480
-msgid "See git-pull(1) for details."
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:473 builtin/pull.c:482
-#: builtin/rebase.c:984
-msgid "<remote>"
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:482 builtin/pull.c:487
-#: contrib/scalar/scalar.c:374
-msgid "<branch>"
-msgstr ""
-
-#: builtin/pull.c:475 builtin/rebase.c:976
-msgid "There is no tracking information for the current branch."
-msgstr ""
-
-#: builtin/pull.c:484
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-
-#: builtin/pull.c:489
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-
-#: builtin/pull.c:600
-#, c-format
-msgid "unable to access commit %s"
-msgstr ""
-
-#: builtin/pull.c:908
-msgid "ignoring --verify-signatures for rebase"
-msgstr ""
-
-#: builtin/pull.c:969
-msgid ""
-"You have divergent branches and need to specify how to reconcile them.\n"
-"You can do so by running one of the following commands sometime before\n"
-"your next pull:\n"
-"\n"
-"  git config pull.rebase false  # merge\n"
-"  git config pull.rebase true   # rebase\n"
-"  git config pull.ff only       # fast-forward only\n"
-"\n"
-"You can replace \"git config\" with \"git config --global\" to set a "
-"default\n"
-"preference for all repositories. You can also pass --rebase, --no-rebase,\n"
-"or --ff-only on the command line to override the configured default per\n"
-"invocation.\n"
-msgstr ""
-
-#: builtin/pull.c:1047
-msgid "Updating an unborn branch with changes added to the index."
-msgstr ""
-
-#: builtin/pull.c:1051
-msgid "pull with rebase"
-msgstr ""
-
-#: builtin/pull.c:1052
-msgid "please commit or stash them."
-msgstr ""
-
-#: builtin/pull.c:1077
-#, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
-msgstr ""
-
-#: builtin/pull.c:1083
-#, c-format
-msgid ""
-"Cannot fast-forward your working tree.\n"
-"After making sure that you saved anything precious from\n"
-"$ git diff %s\n"
-"output, run\n"
-"$ git reset --hard\n"
-"to recover."
-msgstr ""
-
-#: builtin/pull.c:1098
-msgid "Cannot merge multiple branches into empty head."
-msgstr ""
-
-#: builtin/pull.c:1103
-msgid "Cannot rebase onto multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1105
-msgid "Cannot fast-forward to multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1120
-msgid "Need to specify how to reconcile divergent branches."
-msgstr ""
-
-#: builtin/pull.c:1134
-msgid "cannot rebase with locally recorded submodule modifications"
-msgstr ""
-
-#: builtin/push.c:19
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/push.c:111
-msgid "tag shorthand without <tag>"
-msgstr ""
-
-#: builtin/push.c:119
-msgid "--delete only accepts plain target ref names"
-msgstr ""
-
-#: builtin/push.c:164
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
-msgstr ""
-
-#: builtin/push.c:167
-#, c-format
-msgid ""
-"The upstream branch of your current branch does not match\n"
-"the name of your current branch.  To push to the upstream branch\n"
-"on the remote, use\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"To push to the branch of the same name on the remote, use\n"
-"\n"
-"    git push %s HEAD\n"
-"%s"
-msgstr ""
-
-#: builtin/push.c:182
-#, c-format
-msgid ""
-"You are not currently on a branch.\n"
-"To push the history leading to the current (detached HEAD)\n"
-"state now, use\n"
-"\n"
-"    git push %s HEAD:<name-of-remote-branch>\n"
-msgstr ""
-
-#: builtin/push.c:191
-#, c-format
-msgid ""
-"The current branch %s has no upstream branch.\n"
-"To push the current branch and set the remote as upstream, use\n"
-"\n"
-"    git push --set-upstream %s %s\n"
-msgstr ""
-
-#: builtin/push.c:199
-#, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr ""
-
-#: builtin/push.c:217
-msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr ""
-
-#: builtin/push.c:243
-#, c-format
-msgid ""
-"You are pushing to remote '%s', which is not the upstream of\n"
-"your current branch '%s', without telling me what to push\n"
-"to update which remote branch."
-msgstr ""
-
-#: builtin/push.c:258
-msgid ""
-"Updates were rejected because the tip of your current branch is behind\n"
-"its remote counterpart. Integrate the remote changes (e.g.\n"
-"'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:264
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. Check out this branch and integrate the remote changes\n"
-"(e.g. 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:270
-msgid ""
-"Updates were rejected because the remote contains work that you do\n"
-"not have locally. This is usually caused by another repository pushing\n"
-"to the same ref. You may want to first integrate the remote changes\n"
-"(e.g., 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:277
-msgid "Updates were rejected because the tag already exists in the remote."
-msgstr ""
-
-#: builtin/push.c:280
-msgid ""
-"You cannot update a remote ref that points at a non-commit object,\n"
-"or update a remote ref to make it point at a non-commit object,\n"
-"without using the '--force' option.\n"
-msgstr ""
-
-#: builtin/push.c:285
-msgid ""
-"Updates were rejected because the tip of the remote-tracking\n"
-"branch has been updated since the last checkout. You may want\n"
-"to integrate those changes locally (e.g., 'git pull ...')\n"
-"before forcing an update.\n"
-msgstr ""
-
-#: builtin/push.c:355
-#, c-format
-msgid "Pushing to %s\n"
-msgstr ""
-
-#: builtin/push.c:362
-#, c-format
-msgid "failed to push some refs to '%s'"
-msgstr ""
-
-#: builtin/push.c:544 builtin/submodule--helper.c:3377
-msgid "repository"
-msgstr ""
-
-#: builtin/push.c:545 builtin/send-pack.c:193
-msgid "push all refs"
-msgstr ""
-
-#: builtin/push.c:546 builtin/send-pack.c:195
-msgid "mirror all refs"
-msgstr ""
-
-#: builtin/push.c:548
-msgid "delete refs"
-msgstr ""
-
-#: builtin/push.c:549
-msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
-
-#: builtin/push.c:552 builtin/send-pack.c:196
-msgid "force updates"
-msgstr ""
-
-#: builtin/push.c:553 builtin/send-pack.c:208
-msgid "<refname>:<expect>"
-msgstr ""
-
-#: builtin/push.c:554 builtin/send-pack.c:209
-msgid "require old value of ref to be at this value"
-msgstr ""
-
-#: builtin/push.c:557 builtin/send-pack.c:212
-msgid "require remote updates to be integrated locally"
-msgstr ""
-
-#: builtin/push.c:560
-msgid "control recursive pushing of submodules"
-msgstr ""
-
-#: builtin/push.c:561 builtin/send-pack.c:203
-msgid "use thin pack"
-msgstr ""
-
-#: builtin/push.c:562 builtin/push.c:563 builtin/send-pack.c:190
-#: builtin/send-pack.c:191
-msgid "receive pack program"
-msgstr ""
-
-#: builtin/push.c:564
-msgid "set upstream for git pull/status"
-msgstr ""
-
-#: builtin/push.c:567
-msgid "prune locally removed refs"
-msgstr ""
-
-#: builtin/push.c:569
-msgid "bypass pre-push hook"
-msgstr ""
-
-#: builtin/push.c:570
-msgid "push missing but relevant tags"
-msgstr ""
-
-#: builtin/push.c:572 builtin/send-pack.c:197
-msgid "GPG sign the push"
-msgstr ""
-
-#: builtin/push.c:574 builtin/send-pack.c:204
-msgid "request atomic transaction on remote side"
-msgstr ""
-
-#: builtin/push.c:594
-msgid "--delete doesn't make sense without any refs"
-msgstr ""
-
-#: builtin/push.c:614
-#, c-format
-msgid "bad repository '%s'"
-msgstr ""
-
-#: builtin/push.c:615
-msgid ""
-"No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote "
-"repository using\n"
-"\n"
-"    git remote add <name> <url>\n"
-"\n"
-"and then push using the remote name\n"
-"\n"
-"    git push <name>\n"
-msgstr ""
-
-#: builtin/push.c:632
-msgid "--all can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:638
-msgid "--mirror can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:648
-msgid "push options must not have new line characters"
-msgstr ""
-
-#: builtin/range-diff.c:9
-msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:10
-msgid "git range-diff [<options>] <old-tip>...<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:11
-msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:30
-msgid "use simple diff colors"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "notes"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "passed to 'git log'"
-msgstr ""
-
-#: builtin/range-diff.c:35
-msgid "only emit output related to the first range"
-msgstr ""
-
-#: builtin/range-diff.c:37
-msgid "only emit output related to the second range"
-msgstr ""
-
-#: builtin/range-diff.c:60 builtin/range-diff.c:64
-#, c-format
-msgid "not a commit range: '%s'"
-msgstr ""
-
-#: builtin/range-diff.c:74
-msgid "single arg format must be symmetric range"
-msgstr ""
-
-#: builtin/range-diff.c:89
-msgid "need two commit ranges"
-msgstr ""
-
-#: builtin/read-tree.c:41
-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>]])"
-msgstr ""
-
-#: builtin/read-tree.c:116
-msgid "write resulting index to <file>"
-msgstr ""
-
-#: builtin/read-tree.c:119
-msgid "only empty the index"
-msgstr ""
-
-#: builtin/read-tree.c:121
-msgid "Merging"
-msgstr ""
-
-#: builtin/read-tree.c:123
-msgid "perform a merge in addition to a read"
-msgstr ""
-
-#: builtin/read-tree.c:125
-msgid "3-way merge if no file level merging required"
-msgstr ""
-
-#: builtin/read-tree.c:127
-msgid "3-way merge in presence of adds and removes"
-msgstr ""
-
-#: builtin/read-tree.c:129
-msgid "same as -m, but discard unmerged entries"
-msgstr ""
-
-#: builtin/read-tree.c:130
-msgid "<subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:131
-msgid "read the tree into the index under <subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:134
-msgid "update working tree with merge result"
-msgstr ""
-
-#: builtin/read-tree.c:136
-msgid "gitignore"
-msgstr ""
-
-#: builtin/read-tree.c:137
-msgid "allow explicitly ignored files to be overwritten"
-msgstr ""
-
-#: builtin/read-tree.c:140
-msgid "don't check the working tree after merging"
-msgstr ""
-
-#: builtin/read-tree.c:141
-msgid "don't update the index or the work tree"
-msgstr ""
-
-#: builtin/read-tree.c:143
-msgid "skip applying sparse checkout filter"
-msgstr ""
-
-#: builtin/read-tree.c:145
-msgid "debug unpack-trees"
-msgstr ""
-
-#: builtin/read-tree.c:149
-msgid "suppress feedback messages"
-msgstr ""
-
-#: builtin/read-tree.c:190
-msgid "You need to resolve your current index first"
-msgstr ""
-
-#: builtin/rebase.c:36
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] "
-"[<upstream> [<branch>]]"
-msgstr ""
-
-#: builtin/rebase.c:38
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]"
-msgstr ""
-
-#: builtin/rebase.c:231
-#, c-format
-msgid "could not create temporary %s"
-msgstr ""
-
-#: builtin/rebase.c:237
-msgid "could not mark as interactive"
-msgstr ""
-
-#: builtin/rebase.c:290
-msgid "could not generate todo list"
-msgstr ""
-
-#: builtin/rebase.c:332
-msgid "a base commit must be provided with --upstream or --onto"
-msgstr ""
-
-#: builtin/rebase.c:391
-#, c-format
-msgid "%s requires the merge backend"
-msgstr ""
-
-#: builtin/rebase.c:433
-#, c-format
-msgid "could not get 'onto': '%s'"
-msgstr ""
-
-#: builtin/rebase.c:450
-#, c-format
-msgid "invalid orig-head: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:475
-#, c-format
-msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:600
-msgid ""
-"Resolve all conflicts manually, mark them as resolved with\n"
-"\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
-"You can instead skip this commit: run \"git rebase --skip\".\n"
-"To abort and get back to the state before \"git rebase\", run \"git rebase --"
-"abort\"."
-msgstr ""
-
-#: builtin/rebase.c:685
-#, c-format
-msgid ""
-"\n"
-"git encountered an error while preparing the patches to replay\n"
-"these revisions:\n"
-"\n"
-"    %s\n"
-"\n"
-"As a result, git cannot rebase them."
-msgstr ""
-
-#: builtin/rebase.c:836
-#, c-format
-msgid "could not switch to %s"
-msgstr ""
-
-#: builtin/rebase.c:952
-#, c-format
-msgid ""
-"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
-"\"."
-msgstr ""
-
-#: builtin/rebase.c:970
-#, c-format
-msgid ""
-"%s\n"
-"Please specify which branch you want to rebase against.\n"
-"See git-rebase(1) for details.\n"
-"\n"
-"    git rebase '<branch>'\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:986
-#, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:1016
-msgid "exec commands cannot contain newlines"
-msgstr ""
-
-#: builtin/rebase.c:1020
-msgid "empty exec command"
-msgstr ""
-
-#: builtin/rebase.c:1051
-msgid "rebase onto given branch instead of upstream"
-msgstr ""
-
-#: builtin/rebase.c:1053
-msgid "use the merge-base of upstream and branch as the current base"
-msgstr ""
-
-#: builtin/rebase.c:1055
-msgid "allow pre-rebase hook to run"
-msgstr ""
-
-#: builtin/rebase.c:1057
-msgid "be quiet. implies --no-stat"
-msgstr ""
-
-#: builtin/rebase.c:1060
-msgid "display a diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1063
-msgid "do not show diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1066
-msgid "add a Signed-off-by trailer to each commit"
-msgstr ""
-
-#: builtin/rebase.c:1069
-msgid "make committer date match author date"
-msgstr ""
-
-#: builtin/rebase.c:1071
-msgid "ignore author date and use current date"
-msgstr ""
-
-#: builtin/rebase.c:1073
-msgid "synonym of --reset-author-date"
-msgstr ""
-
-#: builtin/rebase.c:1075 builtin/rebase.c:1079
-msgid "passed to 'git apply'"
-msgstr ""
-
-#: builtin/rebase.c:1077
-msgid "ignore changes in whitespace"
-msgstr ""
-
-#: builtin/rebase.c:1081 builtin/rebase.c:1084
-msgid "cherry-pick all commits, even if unchanged"
-msgstr ""
-
-#: builtin/rebase.c:1086
-msgid "continue"
-msgstr ""
-
-#: builtin/rebase.c:1089
-msgid "skip current patch and continue"
-msgstr ""
-
-#: builtin/rebase.c:1091
-msgid "abort and check out the original branch"
-msgstr ""
-
-#: builtin/rebase.c:1094
-msgid "abort but keep HEAD where it is"
-msgstr ""
-
-#: builtin/rebase.c:1095
-msgid "edit the todo list during an interactive rebase"
-msgstr ""
-
-#: builtin/rebase.c:1098
-msgid "show the patch file being applied or merged"
-msgstr ""
-
-#: builtin/rebase.c:1101
-msgid "use apply strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1105
-msgid "use merging strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1109
-msgid "let the user edit the list of commits to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1113
-msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
-msgstr ""
-
-#: builtin/rebase.c:1118
-msgid "how to handle commits that become empty"
-msgstr ""
-
-#: builtin/rebase.c:1121
-msgid "keep commits which start empty"
-msgstr ""
-
-#: builtin/rebase.c:1125
-msgid "move commits that begin with squash!/fixup! under -i"
-msgstr ""
-
-#: builtin/rebase.c:1132
-msgid "add exec lines after each commit of the editable list"
-msgstr ""
-
-#: builtin/rebase.c:1136
-msgid "allow rebasing commits with empty messages"
-msgstr ""
-
-#: builtin/rebase.c:1140
-msgid "try to rebase merges instead of skipping them"
-msgstr ""
-
-#: builtin/rebase.c:1143
-msgid "use 'merge-base --fork-point' to refine upstream"
-msgstr ""
-
-#: builtin/rebase.c:1145
-msgid "use the given merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1147 builtin/revert.c:115
-msgid "option"
-msgstr ""
-
-#: builtin/rebase.c:1148
-msgid "pass the argument through to the merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1151
-msgid "rebase all reachable commits up to the root(s)"
-msgstr ""
-
-#: builtin/rebase.c:1154
-msgid "automatically re-schedule any `exec` that fails"
-msgstr ""
-
-#: builtin/rebase.c:1156
-msgid "apply all changes, even those already present upstream"
-msgstr ""
-
-#: builtin/rebase.c:1177
-msgid "It looks like 'git am' is in progress. Cannot rebase."
-msgstr ""
-
-#: builtin/rebase.c:1208
-msgid "--preserve-merges was replaced by --rebase-merges"
-msgstr ""
-
-#: builtin/rebase.c:1230
-msgid "No rebase in progress?"
-msgstr ""
-
-#: builtin/rebase.c:1234
-msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
-
-#: builtin/rebase.c:1257 t/helper/test-fast-rebase.c:122
-msgid "Cannot read HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1269
-msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
-msgstr ""
-
-#: builtin/rebase.c:1287
-msgid "could not discard worktree changes"
-msgstr ""
-
-#: builtin/rebase.c:1308
-#, c-format
-msgid "could not move back to %s"
-msgstr ""
-
-#: builtin/rebase.c:1354
-#, c-format
-msgid ""
-"It seems that there is already a %s directory, and\n"
-"I wonder if you are in the middle of another rebase.  If that is the\n"
-"case, please try\n"
-"\t%s\n"
-"If that is not the case, please\n"
-"\t%s\n"
-"and run me again.  I am stopping in case you still have something\n"
-"valuable there.\n"
-msgstr ""
-
-#: builtin/rebase.c:1382
-msgid "switch `C' expects a numerical value"
-msgstr ""
-
-#: builtin/rebase.c:1424
-#, c-format
-msgid "Unknown mode: %s"
-msgstr ""
-
-#: builtin/rebase.c:1463
-msgid "--strategy requires --merge or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1492
-msgid "apply options and merge options cannot be used together"
-msgstr ""
-
-#: builtin/rebase.c:1505
-#, c-format
-msgid "Unknown rebase backend: %s"
-msgstr ""
-
-#: builtin/rebase.c:1534
-msgid "--reschedule-failed-exec requires --exec or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1565
-#, c-format
-msgid "invalid upstream '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1571
-msgid "Could not create new root commit"
-msgstr ""
-
-#: builtin/rebase.c:1597
-#, c-format
-msgid "'%s': need exactly one merge base with branch"
-msgstr ""
-
-#: builtin/rebase.c:1600
-#, c-format
-msgid "'%s': need exactly one merge base"
-msgstr ""
-
-#: builtin/rebase.c:1609
-#, c-format
-msgid "Does not point to a valid commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1636
-#, c-format
-msgid "no such branch/commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1647 builtin/submodule--helper.c:43
-#: builtin/submodule--helper.c:2477
-#, c-format
-msgid "No such ref: %s"
-msgstr ""
-
-#: builtin/rebase.c:1658
-msgid "Could not resolve HEAD to a revision"
-msgstr ""
-
-#: builtin/rebase.c:1679
-msgid "Please commit or stash them."
-msgstr ""
-
-#: builtin/rebase.c:1714
-msgid "HEAD is up to date."
-msgstr ""
-
-#: builtin/rebase.c:1716
-#, c-format
-msgid "Current branch %s is up to date.\n"
-msgstr ""
-
-#: builtin/rebase.c:1724
-msgid "HEAD is up to date, rebase forced."
-msgstr ""
-
-#: builtin/rebase.c:1726
-#, c-format
-msgid "Current branch %s is up to date, rebase forced.\n"
-msgstr ""
-
-#: builtin/rebase.c:1734
-msgid "The pre-rebase hook refused to rebase."
-msgstr ""
-
-#: builtin/rebase.c:1741
-#, c-format
-msgid "Changes to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1744
-#, c-format
-msgid "Changes from %s to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1769
-#, c-format
-msgid "First, rewinding head to replay your work on top of it...\n"
-msgstr ""
-
-#: builtin/rebase.c:1781
-msgid "Could not detach HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1790
-#, c-format
-msgid "Fast-forwarded %s to %s.\n"
-msgstr ""
-
-#: builtin/receive-pack.c:35
-msgid "git receive-pack <git-dir>"
-msgstr ""
-
-#: builtin/receive-pack.c:1263
-msgid ""
-"By default, updating the current branch in a non-bare repository\n"
-"is denied, because it will make the index and work tree inconsistent\n"
-"with what you pushed, and will require 'git reset --hard' to match\n"
-"the work tree to HEAD.\n"
-"\n"
-"You can set the 'receive.denyCurrentBranch' configuration variable\n"
-"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
-"its current branch; however, this is not recommended unless you\n"
-"arranged to update its work tree to match what you pushed in some\n"
-"other way.\n"
-"\n"
-"To squelch this message and still keep the default behaviour, set\n"
-"'receive.denyCurrentBranch' configuration variable to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:1283
-msgid ""
-"By default, deleting the current branch is denied, because the next\n"
-"'git clone' won't result in any file checked out, causing confusion.\n"
-"\n"
-"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
-"'warn' or 'ignore' in the remote repository to allow deleting the\n"
-"current branch, with or without a warning message.\n"
-"\n"
-"To squelch this message, you can set it to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:2476
-msgid "quiet"
-msgstr ""
-
-#: builtin/receive-pack.c:2491
-msgid "you must specify a directory"
-msgstr ""
-
-#: builtin/reflog.c:9
-msgid "git reflog [show] [<log-options>] [<ref>]"
-msgstr ""
-
-#: builtin/reflog.c:12
-msgid ""
-"git reflog expire [--expire=<time>] [--expire-unreachable=<time>]\n"
-"                  [--rewrite] [--updateref] [--stale-fix]\n"
-"                  [--dry-run | -n] [--verbose] [--all [--single-worktree] | "
-"<refs>...]"
-msgstr ""
-
-#: builtin/reflog.c:17
-msgid ""
-"git reflog delete [--rewrite] [--updateref]\n"
-"                  [--dry-run | -n] [--verbose] <ref>@{<specifier>}..."
-msgstr ""
-
-#: builtin/reflog.c:21
-msgid "git reflog exists <ref>"
-msgstr ""
-
-#: builtin/reflog.c:197 builtin/reflog.c:211
-#, c-format
-msgid "invalid timestamp '%s' given to '--%s'"
-msgstr ""
-
-#: builtin/reflog.c:240 builtin/reflog.c:359
-msgid "do not actually prune any entries"
-msgstr ""
-
-#: builtin/reflog.c:243 builtin/reflog.c:362
-msgid ""
-"rewrite the old SHA1 with the new SHA1 of the entry that now precedes it"
-msgstr ""
-
-#: builtin/reflog.c:246 builtin/reflog.c:365
-msgid "update the reference to the value of the top reflog entry"
-msgstr ""
-
-#: builtin/reflog.c:248 builtin/reflog.c:367
-msgid "print extra information on screen"
-msgstr ""
-
-#: builtin/reflog.c:249 builtin/reflog.c:253
-msgid "timestamp"
-msgstr ""
-
-#: builtin/reflog.c:250
-msgid "prune entries older than the specified time"
-msgstr ""
-
-#: builtin/reflog.c:254
-msgid ""
-"prune entries older than <time> that are not reachable from the current tip "
-"of the branch"
-msgstr ""
-
-#: builtin/reflog.c:258
-msgid "prune any reflog entries that point to broken commits"
-msgstr ""
-
-#: builtin/reflog.c:259
-msgid "process the reflogs of all references"
-msgstr ""
-
-#: builtin/reflog.c:261
-msgid "limits processing to reflogs from the current worktree only"
-msgstr ""
-
-#: builtin/reflog.c:294
-#, c-format
-msgid "Marking reachable objects..."
-msgstr ""
-
-#: builtin/reflog.c:338
-#, c-format
-msgid "%s points nowhere!"
-msgstr ""
-
-#: builtin/reflog.c:374
-msgid "no reflog specified to delete"
-msgstr ""
-
-#: builtin/reflog.c:396
-#, c-format
-msgid "invalid ref format: %s"
-msgstr ""
-
-#: builtin/remote.c:19
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:20 builtin/remote.c:40
-msgid "git remote rename [--[no-]progress] <old> <new>"
-msgstr ""
-
-#: builtin/remote.c:21 builtin/remote.c:45
-msgid "git remote remove <name>"
-msgstr ""
-
-#: builtin/remote.c:22 builtin/remote.c:50
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr ""
-
-#: builtin/remote.c:23
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr ""
-
-#: builtin/remote.c:24
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr ""
-
-#: builtin/remote.c:25
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
-
-#: builtin/remote.c:26
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:27 builtin/remote.c:76
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr ""
-
-#: builtin/remote.c:28 builtin/remote.c:81
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr ""
-
-#: builtin/remote.c:29 builtin/remote.c:82
-msgid "git remote set-url --add <name> <newurl>"
-msgstr ""
-
-#: builtin/remote.c:30 builtin/remote.c:83
-msgid "git remote set-url --delete <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:35
-msgid "git remote add [<options>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:55
-msgid "git remote set-branches <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:56
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:61
-msgid "git remote show [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:66
-msgid "git remote prune [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:71
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr ""
-
-#: builtin/remote.c:100
-#, c-format
-msgid "Updating %s"
-msgstr ""
-
-#: builtin/remote.c:102
-#, c-format
-msgid "Could not fetch %s"
-msgstr ""
-
-#: builtin/remote.c:132
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
-msgstr ""
-
-#: builtin/remote.c:149
-#, c-format
-msgid "unknown mirror argument: %s"
-msgstr ""
-
-#: builtin/remote.c:165
-msgid "fetch the remote branches"
-msgstr ""
-
-#: builtin/remote.c:167
-msgid "import all tags and associated objects when fetching"
-msgstr ""
-
-#: builtin/remote.c:170
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr ""
-
-#: builtin/remote.c:172
-msgid "branch(es) to track"
-msgstr ""
-
-#: builtin/remote.c:173
-msgid "master branch"
-msgstr ""
-
-#: builtin/remote.c:175
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr ""
-
-#: builtin/remote.c:187
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr ""
-
-#: builtin/remote.c:189
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr ""
-
-#: builtin/remote.c:196 builtin/remote.c:716
-#, c-format
-msgid "remote %s already exists."
-msgstr ""
-
-#: builtin/remote.c:241
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr ""
-
-#: builtin/remote.c:323
-#, c-format
-msgid "unhandled branch.%s.rebase=%s; assuming 'true'"
-msgstr ""
-
-#: builtin/remote.c:367
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr ""
-
-#: builtin/remote.c:461 builtin/remote.c:469
-msgid "(matching)"
-msgstr ""
-
-#: builtin/remote.c:473
-msgid "(delete)"
-msgstr ""
-
-#: builtin/remote.c:664
-#, c-format
-msgid "could not set '%s'"
-msgstr ""
-
-#: builtin/remote.c:669
-#, c-format
-msgid ""
-"The %s configuration remote.pushDefault in:\n"
-"\t%s:%d\n"
-"now names the non-existent remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:707 builtin/remote.c:866 builtin/remote.c:973
-#, c-format
-msgid "No such remote: '%s'"
-msgstr ""
-
-#: builtin/remote.c:726
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr ""
-
-#: builtin/remote.c:746
-#, c-format
-msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
-msgstr ""
-
-#: builtin/remote.c:783
-msgid "Renaming remote references"
-msgstr ""
-
-#: builtin/remote.c:794
-#, c-format
-msgid "deleting '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:832
-#, c-format
-msgid "creating '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:912
-msgid ""
-"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
-"to delete it, use:"
-msgid_plural ""
-"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
-"to delete them, use:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:926
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr ""
-
-#: builtin/remote.c:1034
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
-msgstr ""
-
-#: builtin/remote.c:1037
-msgid " tracked"
-msgstr ""
-
-#: builtin/remote.c:1039
-msgid " stale (use 'git remote prune' to remove)"
-msgstr ""
-
-#: builtin/remote.c:1041
-msgid " ???"
-msgstr ""
-
-#: builtin/remote.c:1082
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr ""
-
-#: builtin/remote.c:1091
-#, c-format
-msgid "rebases interactively onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1093
-#, c-format
-msgid "rebases interactively (with merges) onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1096
-#, c-format
-msgid "rebases onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1100
-#, c-format
-msgid " merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1103
-#, c-format
-msgid "merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1106
-#, c-format
-msgid "%-*s    and with remote %s\n"
-msgstr ""
-
-#: builtin/remote.c:1149
-msgid "create"
-msgstr ""
-
-#: builtin/remote.c:1152
-msgid "delete"
-msgstr ""
-
-#: builtin/remote.c:1156
-msgid "up to date"
-msgstr ""
-
-#: builtin/remote.c:1159
-msgid "fast-forwardable"
-msgstr ""
-
-#: builtin/remote.c:1162
-msgid "local out of date"
-msgstr ""
-
-#: builtin/remote.c:1169
-#, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1172
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1176
-#, c-format
-msgid "    %-*s forces to %s"
-msgstr ""
-
-#: builtin/remote.c:1179
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr ""
-
-#: builtin/remote.c:1247
-msgid "do not query remotes"
-msgstr ""
-
-#: builtin/remote.c:1268
-#, c-format
-msgid "* remote %s"
-msgstr ""
-
-#: builtin/remote.c:1269
-#, c-format
-msgid "  Fetch URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1270 builtin/remote.c:1286 builtin/remote.c:1423
-msgid "(no URL)"
-msgstr ""
-
-#. TRANSLATORS: the colon ':' should align
-#. with the one in " Fetch URL: %s"
-#. translation.
-#.
-#: builtin/remote.c:1284 builtin/remote.c:1286
-#, c-format
-msgid "  Push  URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1288 builtin/remote.c:1290 builtin/remote.c:1292
-#, c-format
-msgid "  HEAD branch: %s"
-msgstr ""
-
-#: builtin/remote.c:1288
-msgid "(not queried)"
-msgstr ""
-
-#: builtin/remote.c:1290
-msgid "(unknown)"
-msgstr ""
-
-#: builtin/remote.c:1294
-#, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr ""
-
-#: builtin/remote.c:1306
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1309 builtin/remote.c:1335
-msgid " (status not queried)"
-msgstr ""
-
-#: builtin/remote.c:1318
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1326
-msgid "  Local refs will be mirrored by 'git push'"
-msgstr ""
-
-#: builtin/remote.c:1332
-#, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1353
-msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr ""
-
-#: builtin/remote.c:1355
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr ""
-
-#: builtin/remote.c:1369
-msgid "Cannot determine remote HEAD"
-msgstr ""
-
-#: builtin/remote.c:1371
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
-msgstr ""
-
-#: builtin/remote.c:1381
-#, c-format
-msgid "Could not delete %s"
-msgstr ""
-
-#: builtin/remote.c:1389
-#, c-format
-msgid "Not a valid ref: %s"
-msgstr ""
-
-#: builtin/remote.c:1391
-#, c-format
-msgid "Could not setup %s"
-msgstr ""
-
-#: builtin/remote.c:1409
-#, c-format
-msgid " %s will become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1410
-#, c-format
-msgid " %s has become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1419
-#, c-format
-msgid "Pruning %s"
-msgstr ""
-
-#: builtin/remote.c:1420
-#, c-format
-msgid "URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1436
-#, c-format
-msgid " * [would prune] %s"
-msgstr ""
-
-#: builtin/remote.c:1439
-#, c-format
-msgid " * [pruned] %s"
-msgstr ""
-
-#: builtin/remote.c:1484
-msgid "prune remotes after fetching"
-msgstr ""
-
-#: builtin/remote.c:1548 builtin/remote.c:1604 builtin/remote.c:1674
-#, c-format
-msgid "No such remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1566
-msgid "add branch"
-msgstr ""
-
-#: builtin/remote.c:1573
-msgid "no remote specified"
-msgstr ""
-
-#: builtin/remote.c:1590
-msgid "query push URLs rather than fetch URLs"
-msgstr ""
-
-#: builtin/remote.c:1592
-msgid "return all URLs"
-msgstr ""
-
-#: builtin/remote.c:1622
-#, c-format
-msgid "no URLs configured for remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1648
-msgid "manipulate push URLs"
-msgstr ""
-
-#: builtin/remote.c:1650
-msgid "add URL"
-msgstr ""
-
-#: builtin/remote.c:1652
-msgid "delete URLs"
-msgstr ""
-
-#: builtin/remote.c:1659
-msgid "--add --delete doesn't make sense"
-msgstr ""
-
-#: builtin/remote.c:1700
-#, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr ""
-
-#: builtin/remote.c:1708
-#, c-format
-msgid "No such URL found: %s"
-msgstr ""
-
-#: builtin/remote.c:1710
-msgid "Will not delete all non-push URLs"
-msgstr ""
-
-#: builtin/remote.c:1727
-msgid "be verbose; must be placed before a subcommand"
-msgstr ""
-
-#: builtin/repack.c:29
-msgid "git repack [<options>]"
-msgstr ""
-
-#: builtin/repack.c:34
-msgid ""
-"Incremental repacks are incompatible with bitmap indexes.  Use\n"
-"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
-msgstr ""
-
-#: builtin/repack.c:206
-msgid "could not start pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:280 builtin/repack.c:824
-msgid "repack: Expecting full hex object ID lines only from pack-objects."
-msgstr ""
-
-#: builtin/repack.c:304
-msgid "could not finish pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:319
-#, c-format
-msgid "cannot open index for %s"
-msgstr ""
-
-#: builtin/repack.c:378
-#, c-format
-msgid "pack %s too large to consider in geometric progression"
-msgstr ""
-
-#: builtin/repack.c:411 builtin/repack.c:418 builtin/repack.c:423
-#, c-format
-msgid "pack %s too large to roll up"
-msgstr ""
-
-#: builtin/repack.c:503
-#, c-format
-msgid "could not open tempfile %s for writing"
-msgstr ""
-
-#: builtin/repack.c:521
-msgid "could not close refs snapshot tempfile"
-msgstr ""
-
-#: builtin/repack.c:634
-msgid "pack everything in a single pack"
-msgstr ""
-
-#: builtin/repack.c:636
-msgid "same as -a, and turn unreachable objects loose"
-msgstr ""
-
-#: builtin/repack.c:639
-msgid "remove redundant packs, and run git-prune-packed"
-msgstr ""
-
-#: builtin/repack.c:641
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:643
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:645
-msgid "do not run git-update-server-info"
-msgstr ""
-
-#: builtin/repack.c:648
-msgid "pass --local to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:650
-msgid "write bitmap index"
-msgstr ""
-
-#: builtin/repack.c:652
-msgid "pass --delta-islands to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:653
-msgid "approxidate"
-msgstr ""
-
-#: builtin/repack.c:654
-msgid "with -A, do not loosen objects older than this"
-msgstr ""
-
-#: builtin/repack.c:656
-msgid "with -a, repack unreachable objects"
-msgstr ""
-
-#: builtin/repack.c:658
-msgid "size of the window used for delta compression"
-msgstr ""
-
-#: builtin/repack.c:659 builtin/repack.c:665
-msgid "bytes"
-msgstr ""
-
-#: builtin/repack.c:660
-msgid "same as the above, but limit memory size instead of entries count"
-msgstr ""
-
-#: builtin/repack.c:662
-msgid "limits the maximum delta depth"
-msgstr ""
-
-#: builtin/repack.c:664
-msgid "limits the maximum number of threads"
-msgstr ""
-
-#: builtin/repack.c:666
-msgid "maximum size of each packfile"
-msgstr ""
-
-#: builtin/repack.c:668
-msgid "repack objects in packs marked with .keep"
-msgstr ""
-
-#: builtin/repack.c:670
-msgid "do not repack this pack"
-msgstr ""
-
-#: builtin/repack.c:672
-msgid "find a geometric progression with factor <N>"
-msgstr ""
-
-#: builtin/repack.c:674
-msgid "write a multi-pack index of the resulting packs"
-msgstr ""
-
-#: builtin/repack.c:684
-msgid "cannot delete packs in a precious-objects repo"
-msgstr ""
-
-#: builtin/repack.c:833
-msgid "Nothing new to pack."
-msgstr ""
-
-#: builtin/repack.c:863
-#, c-format
-msgid "missing required file: %s"
-msgstr ""
-
-#: builtin/repack.c:865
-#, c-format
-msgid "could not unlink: %s"
-msgstr ""
-
-#: builtin/replace.c:22
-msgid "git replace [-f] <object> <replacement>"
-msgstr ""
-
-#: builtin/replace.c:23
-msgid "git replace [-f] --edit <object>"
-msgstr ""
-
-#: builtin/replace.c:24
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr ""
-
-#: builtin/replace.c:26
-msgid "git replace -d <object>..."
-msgstr ""
-
-#: builtin/replace.c:27
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr ""
-
-#: builtin/replace.c:90
-#, c-format
-msgid ""
-"invalid replace format '%s'\n"
-"valid formats are 'short', 'medium' and 'long'"
-msgstr ""
-
-#: builtin/replace.c:125
-#, c-format
-msgid "replace ref '%s' not found"
-msgstr ""
-
-#: builtin/replace.c:141
-#, c-format
-msgid "Deleted replace ref '%s'"
-msgstr ""
-
-#: builtin/replace.c:153
-#, c-format
-msgid "'%s' is not a valid ref name"
-msgstr ""
-
-#: builtin/replace.c:158
-#, c-format
-msgid "replace ref '%s' already exists"
-msgstr ""
-
-#: builtin/replace.c:178
-#, c-format
-msgid ""
-"Objects must be of the same type.\n"
-"'%s' points to a replaced object of type '%s'\n"
-"while '%s' points to a replacement object of type '%s'."
-msgstr ""
-
-#: builtin/replace.c:229
-#, c-format
-msgid "unable to open %s for writing"
-msgstr ""
-
-#: builtin/replace.c:242
-msgid "cat-file reported failure"
-msgstr ""
-
-#: builtin/replace.c:258
-#, c-format
-msgid "unable to open %s for reading"
-msgstr ""
-
-#: builtin/replace.c:271
-msgid "unable to spawn mktree"
-msgstr ""
-
-#: builtin/replace.c:275
-msgid "unable to read from mktree"
-msgstr ""
-
-#: builtin/replace.c:284
-msgid "mktree reported failure"
-msgstr ""
-
-#: builtin/replace.c:288
-msgid "mktree did not return an object name"
-msgstr ""
-
-#: builtin/replace.c:297
-#, c-format
-msgid "unable to fstat %s"
-msgstr ""
-
-#: builtin/replace.c:302
-msgid "unable to write object to database"
-msgstr ""
-
-#: builtin/replace.c:325
-#, c-format
-msgid "unable to get object type for %s"
-msgstr ""
-
-#: builtin/replace.c:341
-msgid "editing object file failed"
-msgstr ""
-
-#: builtin/replace.c:350
-#, c-format
-msgid "new object is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:383
-#, c-format
-msgid "could not parse %s as a commit"
-msgstr ""
-
-#: builtin/replace.c:415
-#, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:417
-#, c-format
-msgid "malformed mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:429
-#, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
-msgstr ""
-
-#: builtin/replace.c:468
-#, c-format
-msgid "the original commit '%s' has a gpg signature"
-msgstr ""
-
-#: builtin/replace.c:469
-msgid "the signature will be removed in the replacement commit!"
-msgstr ""
-
-#: builtin/replace.c:479
-#, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr ""
-
-#: builtin/replace.c:487
-#, c-format
-msgid "graft for '%s' unnecessary"
-msgstr ""
-
-#: builtin/replace.c:491
-#, c-format
-msgid "new commit is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:526
-#, c-format
-msgid ""
-"could not convert the following graft(s):\n"
-"%s"
-msgstr ""
-
-#: builtin/replace.c:547
-msgid "list replace refs"
-msgstr ""
-
-#: builtin/replace.c:548
-msgid "delete replace refs"
-msgstr ""
-
-#: builtin/replace.c:549
-msgid "edit existing object"
-msgstr ""
-
-#: builtin/replace.c:550
-msgid "change a commit's parents"
-msgstr ""
-
-#: builtin/replace.c:551
-msgid "convert existing graft file"
-msgstr ""
-
-#: builtin/replace.c:552
-msgid "replace the ref if it exists"
-msgstr ""
-
-#: builtin/replace.c:554
-msgid "do not pretty-print contents for --edit"
-msgstr ""
-
-#: builtin/replace.c:555
-msgid "use this format"
-msgstr ""
-
-#: builtin/replace.c:568
-msgid "--format cannot be used when not listing"
-msgstr ""
-
-#: builtin/replace.c:576
-msgid "-f only makes sense when writing a replacement"
-msgstr ""
-
-#: builtin/replace.c:580
-msgid "--raw only makes sense with --edit"
-msgstr ""
-
-#: builtin/replace.c:586
-msgid "-d needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:592
-msgid "bad number of arguments"
-msgstr ""
-
-#: builtin/replace.c:598
-msgid "-e needs exactly one argument"
-msgstr ""
-
-#: builtin/replace.c:604
-msgid "-g needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:610
-msgid "--convert-graft-file takes no argument"
-msgstr ""
-
-#: builtin/replace.c:616
-msgid "only one pattern can be given with -l"
-msgstr ""
-
-#: builtin/rerere.c:13
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr ""
-
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr ""
-
-#: builtin/rerere.c:77
-msgid "'git rerere forget' without paths is deprecated"
-msgstr ""
-
-#: builtin/rerere.c:111
-#, c-format
-msgid "unable to generate diff for '%s'"
-msgstr ""
-
-#: builtin/reset.c:33
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
-msgstr ""
-
-#: builtin/reset.c:34
-msgid "git reset [-q] [<tree-ish>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/reset.c:35
-msgid ""
-"git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]"
-msgstr ""
-
-#: builtin/reset.c:36
-msgid "git reset --patch [<tree-ish>] [--] [<pathspec>...]"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "mixed"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "soft"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "hard"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "merge"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "keep"
-msgstr ""
-
-#: builtin/reset.c:90
-msgid "You do not have a valid HEAD."
-msgstr ""
-
-#: builtin/reset.c:92
-msgid "Failed to find tree of HEAD."
-msgstr ""
-
-#: builtin/reset.c:98
-#, c-format
-msgid "Failed to find tree of %s."
-msgstr ""
-
-#: builtin/reset.c:123
-#, c-format
-msgid "HEAD is now at %s"
-msgstr ""
-
-#: builtin/reset.c:304
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
-
-#: builtin/reset.c:402 builtin/stash.c:606 builtin/stash.c:669
-#: builtin/stash.c:693
-msgid "be quiet, only report errors"
-msgstr ""
-
-#: builtin/reset.c:404
-msgid "skip refreshing the index after reset"
-msgstr ""
-
-#: builtin/reset.c:406
-msgid "reset HEAD and index"
-msgstr ""
-
-#: builtin/reset.c:407
-msgid "reset only HEAD"
-msgstr ""
-
-#: builtin/reset.c:409 builtin/reset.c:411
-msgid "reset HEAD, index and working tree"
-msgstr ""
-
-#: builtin/reset.c:413
-msgid "reset HEAD but keep local changes"
-msgstr ""
-
-#: builtin/reset.c:419
-msgid "record only the fact that removed paths will be added later"
-msgstr ""
-
-#: builtin/reset.c:452
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
-
-#: builtin/reset.c:460
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
-
-#: builtin/reset.c:479
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-
-#: builtin/reset.c:481
-#, c-format
-msgid "Cannot do %s reset with paths."
-msgstr ""
-
-#: builtin/reset.c:496
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr ""
-
-#: builtin/reset.c:527
-msgid "Unstaged changes after reset:"
-msgstr ""
-
-#: builtin/reset.c:530
-#, c-format
-msgid ""
-"It took %.2f seconds to refresh the index after reset.  You can use\n"
-"'--no-refresh' to avoid this."
-msgstr ""
-
-#: builtin/reset.c:547
-#, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr ""
-
-#: builtin/reset.c:552
-msgid "Could not write new index file."
-msgstr ""
-
-#: builtin/rev-list.c:659
-msgid "rev-list does not support display of notes"
-msgstr ""
-
-#: builtin/rev-list.c:664
-#, c-format
-msgid "marked counting and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/rev-parse.c:409
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr ""
-
-#: builtin/rev-parse.c:414
-msgid "keep the `--` passed as an arg"
-msgstr ""
-
-#: builtin/rev-parse.c:416
-msgid "stop parsing after the first non-option argument"
-msgstr ""
-
-#: builtin/rev-parse.c:419
-msgid "output in stuck long form"
-msgstr ""
-
-#: builtin/rev-parse.c:438
-msgid "premature end of input"
-msgstr ""
-
-#: builtin/rev-parse.c:442
-msgid "no usage string given before the `--' separator"
-msgstr ""
-
-#: builtin/rev-parse.c:548
-msgid "Needed a single revision"
-msgstr ""
-
-#: builtin/rev-parse.c:552
-msgid ""
-"git rev-parse --parseopt [<options>] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [<options>] [<arg>...]\n"
-"\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
-msgstr ""
-
-#: builtin/rev-parse.c:712
-msgid "--resolve-git-dir requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:715
-#, c-format
-msgid "not a gitdir '%s'"
-msgstr ""
-
-#: builtin/rev-parse.c:739
-msgid "--git-path requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:749
-msgid "-n requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:763
-msgid "--path-format requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:769
-#, c-format
-msgid "unknown argument to --path-format: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:776
-msgid "--default requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:782
-msgid "--prefix requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:851
-#, c-format
-msgid "unknown mode for --abbrev-ref: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:1023
-#, c-format
-msgid "unknown mode for --show-object-format: %s"
-msgstr ""
-
-#: builtin/revert.c:24
-msgid "git revert [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:25
-msgid "git revert <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:30
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:31
-msgid "git cherry-pick <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:72
-#, c-format
-msgid "option `%s' expects a number greater than zero"
-msgstr ""
-
-#: builtin/revert.c:92
-#, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr ""
-
-#: builtin/revert.c:102
-msgid "end revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:103
-msgid "resume revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:104
-msgid "cancel revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:105
-msgid "skip current commit and continue"
-msgstr ""
-
-#: builtin/revert.c:107
-msgid "don't automatically commit"
-msgstr ""
-
-#: builtin/revert.c:108
-msgid "edit the commit message"
-msgstr ""
-
-#: builtin/revert.c:111
-msgid "parent-number"
-msgstr ""
-
-#: builtin/revert.c:112
-msgid "select mainline parent"
-msgstr ""
-
-#: builtin/revert.c:114
-msgid "merge strategy"
-msgstr ""
-
-#: builtin/revert.c:116
-msgid "option for merge strategy"
-msgstr ""
-
-#: builtin/revert.c:125
-msgid "append commit name"
-msgstr ""
-
-#: builtin/revert.c:127
-msgid "preserve initially empty commits"
-msgstr ""
-
-#: builtin/revert.c:128
-msgid "allow commits with empty messages"
-msgstr ""
-
-#: builtin/revert.c:129
-msgid "keep redundant, empty commits"
-msgstr ""
-
-#: builtin/revert.c:241
-msgid "revert failed"
-msgstr ""
-
-#: builtin/revert.c:254
-msgid "cherry-pick failed"
-msgstr ""
-
-#: builtin/rm.c:20
-msgid "git rm [<options>] [--] <file>..."
-msgstr ""
-
-#: builtin/rm.c:208
-msgid ""
-"the following file has staged content different from both the\n"
-"file and the HEAD:"
-msgid_plural ""
-"the following files have staged content different from both the\n"
-"file and the HEAD:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:213
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:217
-msgid "the following file has changes staged in the index:"
-msgid_plural "the following files have changes staged in the index:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:221 builtin/rm.c:230
-msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:227
-msgid "the following file has local modifications:"
-msgid_plural "the following files have local modifications:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:245
-msgid "do not list removed files"
-msgstr ""
-
-#: builtin/rm.c:246
-msgid "only remove from the index"
-msgstr ""
-
-#: builtin/rm.c:247
-msgid "override the up-to-date check"
-msgstr ""
-
-#: builtin/rm.c:248
-msgid "allow recursive removal"
-msgstr ""
-
-#: builtin/rm.c:250
-msgid "exit with a zero status even if nothing matched"
-msgstr ""
-
-#: builtin/rm.c:285
-msgid "No pathspec was given. Which files should I remove?"
-msgstr ""
-
-#: builtin/rm.c:315
-msgid "please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/rm.c:337
-#, c-format
-msgid "not removing '%s' recursively without -r"
-msgstr ""
-
-#: builtin/rm.c:385
-#, c-format
-msgid "git rm: unable to remove %s"
-msgstr ""
-
-#: builtin/send-pack.c:20
-msgid ""
-"git send-pack [--mirror] [--dry-run] [--force]\n"
-"              [--receive-pack=<git-receive-pack>]\n"
-"              [--verbose] [--thin] [--atomic]\n"
-"              [<host>:]<directory> (--all | <ref>...)"
-msgstr ""
-
-#: builtin/send-pack.c:192
-msgid "remote name"
-msgstr ""
-
-#: builtin/send-pack.c:205
-msgid "use stateless RPC protocol"
-msgstr ""
-
-#: builtin/send-pack.c:206
-msgid "read refs from stdin"
-msgstr ""
-
-#: builtin/send-pack.c:207
-msgid "print status from remote helper"
-msgstr ""
-
-#: builtin/shortlog.c:16
-msgid "git shortlog [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/shortlog.c:17
-msgid "git log --pretty=short | git shortlog [<options>]"
-msgstr ""
-
-#: builtin/shortlog.c:123
-msgid "using multiple --group options with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:133
-msgid "using --group=trailer with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:323
-#, c-format
-msgid "unknown group type: %s"
-msgstr ""
-
-#: builtin/shortlog.c:351
-msgid "group by committer rather than author"
-msgstr ""
-
-#: builtin/shortlog.c:354
-msgid "sort output according to the number of commits per author"
-msgstr ""
-
-#: builtin/shortlog.c:356
-msgid "suppress commit descriptions, only provides commit count"
-msgstr ""
-
-#: builtin/shortlog.c:358
-msgid "show the email address of each author"
-msgstr ""
-
-#: builtin/shortlog.c:359
-msgid "<w>[,<i1>[,<i2>]]"
-msgstr ""
-
-#: builtin/shortlog.c:360
-msgid "linewrap output"
-msgstr ""
-
-#: builtin/shortlog.c:362
-msgid "field"
-msgstr ""
-
-#: builtin/shortlog.c:363
-msgid "group by field"
-msgstr ""
-
-#: builtin/shortlog.c:395
-msgid "too many arguments given outside repository"
-msgstr ""
-
-#: builtin/show-branch.c: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>)...]"
-msgstr ""
-
-#: builtin/show-branch.c:18
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr ""
-
-#: builtin/show-branch.c:396
-#, c-format
-msgid "ignoring %s; cannot handle more than %d ref"
-msgid_plural "ignoring %s; cannot handle more than %d refs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:548
-#, c-format
-msgid "no matching refs with %s"
-msgstr ""
-
-#: builtin/show-branch.c:645
-msgid "show remote-tracking and local branches"
-msgstr ""
-
-#: builtin/show-branch.c:647
-msgid "show remote-tracking branches"
-msgstr ""
-
-#: builtin/show-branch.c:649
-msgid "color '*!+-' corresponding to the branch"
-msgstr ""
-
-#: builtin/show-branch.c:651
-msgid "show <n> more commits after the common ancestor"
-msgstr ""
-
-#: builtin/show-branch.c:653
-msgid "synonym to more=-1"
-msgstr ""
-
-#: builtin/show-branch.c:654
-msgid "suppress naming strings"
-msgstr ""
-
-#: builtin/show-branch.c:656
-msgid "include the current branch"
-msgstr ""
-
-#: builtin/show-branch.c:658
-msgid "name commits with their object names"
-msgstr ""
-
-#: builtin/show-branch.c:660
-msgid "show possible merge bases"
-msgstr ""
-
-#: builtin/show-branch.c:662
-msgid "show refs unreachable from any other ref"
-msgstr ""
-
-#: builtin/show-branch.c:664
-msgid "show commits in topological order"
-msgstr ""
-
-#: builtin/show-branch.c:667
-msgid "show only commits not on the first branch"
-msgstr ""
-
-#: builtin/show-branch.c:669
-msgid "show merges reachable from only one tip"
-msgstr ""
-
-#: builtin/show-branch.c:671
-msgid "topologically sort, maintaining date order where possible"
-msgstr ""
-
-#: builtin/show-branch.c:674
-msgid "<n>[,<base>]"
-msgstr ""
-
-#: builtin/show-branch.c:675
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr ""
-
-#: builtin/show-branch.c:735
-msgid "no branches given, and HEAD is not valid"
-msgstr ""
-
-#: builtin/show-branch.c:738
-msgid "--reflog option needs one branch name"
-msgstr ""
-
-#: builtin/show-branch.c:741
-#, c-format
-msgid "only %d entry can be shown at one time."
-msgid_plural "only %d entries can be shown at one time."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:745
-#, c-format
-msgid "no such ref %s"
-msgstr ""
-
-#: builtin/show-branch.c:831
-#, c-format
-msgid "cannot handle more than %d rev."
-msgid_plural "cannot handle more than %d revs."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:835
-#, c-format
-msgid "'%s' is not a valid ref."
-msgstr ""
-
-#: builtin/show-branch.c:838
-#, c-format
-msgid "cannot find commit %s (%s)"
-msgstr ""
-
-#: builtin/show-index.c:21
-msgid "hash-algorithm"
-msgstr ""
-
-#: builtin/show-index.c:31
-msgid "Unknown hash algorithm"
-msgstr ""
-
-#: builtin/show-ref.c:12
-msgid ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
-msgstr ""
-
-#: builtin/show-ref.c:13
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr ""
-
-#: builtin/show-ref.c:162
-msgid "only show tags (can be combined with heads)"
-msgstr ""
-
-#: builtin/show-ref.c:163
-msgid "only show heads (can be combined with tags)"
-msgstr ""
-
-#: builtin/show-ref.c:164
-msgid "stricter reference checking, requires exact ref path"
-msgstr ""
-
-#: builtin/show-ref.c:167 builtin/show-ref.c:169
-msgid "show the HEAD reference, even if it would be filtered out"
-msgstr ""
-
-#: builtin/show-ref.c:171
-msgid "dereference tags into object IDs"
-msgstr ""
-
-#: builtin/show-ref.c:173
-msgid "only show SHA1 hash using <n> digits"
-msgstr ""
-
-#: builtin/show-ref.c:177
-msgid "do not print results to stdout (useful with --verify)"
-msgstr ""
-
-#: builtin/show-ref.c:179
-msgid "show refs from stdin that aren't in local repository"
-msgstr ""
-
-#: builtin/sparse-checkout.c:23
-msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
-msgstr ""
-
-#: builtin/sparse-checkout.c:61
-msgid "this worktree is not sparse"
-msgstr ""
-
-#: builtin/sparse-checkout.c:76
-msgid "this worktree is not sparse (sparse-checkout file may not exist)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:177
-#, c-format
-msgid ""
-"directory '%s' contains untracked files, but is not in the sparse-checkout "
-"cone"
-msgstr ""
-
-#: builtin/sparse-checkout.c:185
-#, c-format
-msgid "failed to remove directory '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:327
-msgid "failed to create directory for sparse-checkout file"
-msgstr ""
-
-#: builtin/sparse-checkout.c:366
-msgid "failed to initialize worktree config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:411
-msgid "failed to modify sparse-index config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:441 builtin/sparse-checkout.c:793
-#: builtin/sparse-checkout.c:847
-msgid "initialize the sparse-checkout in cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:443 builtin/sparse-checkout.c:795
-#: builtin/sparse-checkout.c:849
-msgid "toggle the use of a sparse index"
-msgstr ""
-
-#: builtin/sparse-checkout.c:479
-#, c-format
-msgid "failed to open '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:531
-#, c-format
-msgid "could not normalize path %s"
-msgstr ""
-
-#: builtin/sparse-checkout.c:560
-#, c-format
-msgid "unable to unquote C-style string '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:615 builtin/sparse-checkout.c:643
-msgid "unable to load existing sparse-checkout patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:619
-msgid "existing sparse-checkout patterns do not use cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:707
-msgid "please run from the toplevel directory in non-cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:712
-msgid "specify directories rather than patterns (no leading slash)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:714
-msgid ""
-"specify directories rather than patterns.  If your directory starts with a "
-"'!', pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:716
-msgid ""
-"specify directories rather than patterns.  If your directory really has any "
-"of '*?[]\\' in it, pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:732
-#, c-format
-msgid ""
-"'%s' is not a directory; to treat it as a directory anyway, rerun with --"
-"skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:734
-#, c-format
-msgid ""
-"pass a leading slash before paths such as '%s' if you want a single file "
-"(see NON-CONE PROBLEMS in the git-sparse-checkout manual)."
-msgstr ""
-
-#: builtin/sparse-checkout.c:739
-msgid "git sparse-checkout add [--skip-checks] (--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:752 builtin/sparse-checkout.c:797
-msgid ""
-"skip some sanity checks on the given paths that might give false positives"
-msgstr ""
-
-#: builtin/sparse-checkout.c:755 builtin/sparse-checkout.c:800
-msgid "read patterns from standard in"
-msgstr ""
-
-#: builtin/sparse-checkout.c:760
-msgid "no sparse-checkout to add to"
-msgstr ""
-
-#: builtin/sparse-checkout.c:775
-msgid ""
-"git sparse-checkout set [--[no-]cone] [--[no-]sparse-index] [--skip-checks] "
-"(--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:854
-msgid "must be in a sparse-checkout to reapply sparsity patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:914
-msgid "error while refreshing working directory"
-msgstr ""
-
-#: builtin/stash.c:24 builtin/stash.c:40
-msgid "git stash list [<options>]"
-msgstr ""
-
-#: builtin/stash.c:25 builtin/stash.c:45
-msgid "git stash show [<options>] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:26 builtin/stash.c:50
-msgid "git stash drop [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:27
-msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:28 builtin/stash.c:65
-msgid "git stash branch <branchname> [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:30
-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 ""
-
-#: builtin/stash.c:34
-msgid ""
-"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--"
-"quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:55
-msgid "git stash pop [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:60
-msgid "git stash apply [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:75
-msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>"
-msgstr ""
-
-#: builtin/stash.c:80
-msgid ""
-"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
-"          [--] [<pathspec>...]]"
-msgstr ""
-
-#: builtin/stash.c:87
-msgid ""
-"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"               [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:130
-#, c-format
-msgid "'%s' is not a stash-like commit"
-msgstr ""
-
-#: builtin/stash.c:150
-#, c-format
-msgid "Too many revisions specified:%s"
-msgstr ""
-
-#: builtin/stash.c:164
-msgid "No stash entries found."
-msgstr ""
-
-#: builtin/stash.c:178
-#, c-format
-msgid "%s is not a valid reference"
-msgstr ""
-
-#: builtin/stash.c:227
-msgid "git stash clear with arguments is unimplemented"
-msgstr ""
-
-#: builtin/stash.c:447
-#, c-format
-msgid ""
-"WARNING: Untracked file in way of tracked file!  Renaming\n"
-"            %s -> %s\n"
-"         to make room.\n"
-msgstr ""
-
-#: builtin/stash.c:508
-msgid "cannot apply a stash in the middle of a merge"
-msgstr ""
-
-#: builtin/stash.c:519
-#, c-format
-msgid "could not generate diff %s^!."
-msgstr ""
-
-#: builtin/stash.c:526
-msgid "conflicts in index. Try without --index."
-msgstr ""
-
-#: builtin/stash.c:532
-msgid "could not save index tree"
-msgstr ""
-
-#: builtin/stash.c:552
-#, c-format
-msgid "Merging %s with %s"
-msgstr ""
-
-#: builtin/stash.c:562
-msgid "Index was not unstashed."
-msgstr ""
-
-#: builtin/stash.c:576
-msgid "could not restore untracked files from stash"
-msgstr ""
-
-#: builtin/stash.c:608 builtin/stash.c:695
-msgid "attempt to recreate the index"
-msgstr ""
-
-#: builtin/stash.c:641
-#, c-format
-msgid "Dropped %s (%s)"
-msgstr ""
-
-#: builtin/stash.c:644
-#, c-format
-msgid "%s: Could not drop stash entry"
-msgstr ""
-
-#: builtin/stash.c:657
-#, c-format
-msgid "'%s' is not a stash reference"
-msgstr ""
-
-#: builtin/stash.c:707
-msgid "The stash entry is kept in case you need it again."
-msgstr ""
-
-#: builtin/stash.c:730
-msgid "No branch name specified"
-msgstr ""
-
-#: builtin/stash.c:809
-msgid "failed to parse tree"
-msgstr ""
-
-#: builtin/stash.c:820
-msgid "failed to unpack trees"
-msgstr ""
-
-#: builtin/stash.c:840
-msgid "include untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:843
-msgid "only show untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:930 builtin/stash.c:967
-#, c-format
-msgid "Cannot update %s with %s"
-msgstr ""
-
-#: builtin/stash.c:948 builtin/stash.c:1667 builtin/stash.c:1739
-msgid "stash message"
-msgstr ""
-
-#: builtin/stash.c:958
-msgid "\"git stash store\" requires one <commit> argument"
-msgstr ""
-
-#: builtin/stash.c:1143
-msgid "No staged changes"
-msgstr ""
-
-#: builtin/stash.c:1204
-msgid "No changes selected"
-msgstr ""
-
-#: builtin/stash.c:1304
-msgid "You do not have the initial commit yet"
-msgstr ""
-
-#: builtin/stash.c:1331
-msgid "Cannot save the current index state"
-msgstr ""
-
-#: builtin/stash.c:1340
-msgid "Cannot save the untracked files"
-msgstr ""
-
-#: builtin/stash.c:1351 builtin/stash.c:1370
-msgid "Cannot save the current worktree state"
-msgstr ""
-
-#: builtin/stash.c:1361
-msgid "Cannot save the current staged state"
-msgstr ""
-
-#: builtin/stash.c:1398
-msgid "Cannot record working tree state"
-msgstr ""
-
-#: builtin/stash.c:1447
-msgid "Can't use --patch and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1458
-msgid "Can't use --staged and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1476
-msgid "Did you forget to 'git add'?"
-msgstr ""
-
-#: builtin/stash.c:1491
-msgid "No local changes to save"
-msgstr ""
-
-#: builtin/stash.c:1498
-msgid "Cannot initialize stash"
-msgstr ""
-
-#: builtin/stash.c:1513
-msgid "Cannot save the current status"
-msgstr ""
-
-#: builtin/stash.c:1518
-#, c-format
-msgid "Saved working directory and index state %s"
-msgstr ""
-
-#: builtin/stash.c:1615
-msgid "Cannot remove worktree changes"
-msgstr ""
-
-#: builtin/stash.c:1656 builtin/stash.c:1728
-msgid "keep index"
-msgstr ""
-
-#: builtin/stash.c:1658 builtin/stash.c:1730
-msgid "stash staged changes only"
-msgstr ""
-
-#: builtin/stash.c:1660 builtin/stash.c:1732
-msgid "stash in patch mode"
-msgstr ""
-
-#: builtin/stash.c:1661 builtin/stash.c:1733
-msgid "quiet mode"
-msgstr ""
-
-#: builtin/stash.c:1663 builtin/stash.c:1735
-msgid "include untracked files in stash"
-msgstr ""
-
-#: builtin/stash.c:1665 builtin/stash.c:1737
-msgid "include ignore files"
-msgstr ""
-
-#: builtin/stripspace.c:37
-msgid "skip and remove all lines starting with comment character"
-msgstr ""
-
-#: builtin/stripspace.c:40
-msgid "prepend comment character and space to each line"
-msgstr ""
-
-#: builtin/submodule--helper.c:50 builtin/submodule--helper.c:2486
-#, c-format
-msgid "Expecting a full ref name, got %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:103
-#, c-format
-msgid "cannot strip one component off url '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:213
-#, c-format
-msgid ""
-"could not look up configuration '%s'. Assuming this repository is its own "
-"authoritative upstream."
-msgstr ""
-
-#: builtin/submodule--helper.c:413 builtin/submodule--helper.c:1873
-msgid "alternative anchor for relative paths"
-msgstr ""
-
-#: builtin/submodule--helper.c:418
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:476 builtin/submodule--helper.c:617
-#: builtin/submodule--helper.c:640
-#, c-format
-msgid "No url found for submodule path '%s' in .gitmodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:528
-#, c-format
-msgid "Entering '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:531
-#, c-format
-msgid ""
-"run_command returned non-zero status for %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:553
-#, c-format
-msgid ""
-"run_command returned non-zero status while recursing in the nested "
-"submodules of %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:569
-msgid "suppress output of entering each submodule command"
-msgstr ""
-
-#: builtin/submodule--helper.c:571 builtin/submodule--helper.c:876
-#: builtin/submodule--helper.c:1458
-msgid "recurse into nested submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:576
-msgid "git submodule--helper foreach [--quiet] [--recursive] [--] <command>"
-msgstr ""
-
-#: builtin/submodule--helper.c:654
-#, c-format
-msgid "Failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:658
-#, c-format
-msgid "Submodule '%s' (%s) registered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:668
-#, c-format
-msgid "warning: command update mode suggested for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:675
-#, c-format
-msgid "Failed to register update mode for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:697
-msgid "suppress output for initializing a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:702
-msgid "git submodule--helper init [<options>] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:775 builtin/submodule--helper.c:910
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:823
-#, c-format
-msgid "could not resolve HEAD ref inside the submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:850 builtin/submodule--helper.c:1428
-#, c-format
-msgid "failed to recurse into submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:874 builtin/submodule--helper.c:1595
-msgid "suppress submodule status output"
-msgstr ""
-
-#: builtin/submodule--helper.c:875
-msgid ""
-"use commit stored in the index instead of the one stored in the submodule "
-"HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:881
-msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:905
-msgid "git submodule--helper name <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:977
-#, c-format
-msgid "* %s %s(blob)->%s(submodule)"
-msgstr ""
-
-#: builtin/submodule--helper.c:980
-#, c-format
-msgid "* %s %s(submodule)->%s(blob)"
-msgstr ""
-
-#: builtin/submodule--helper.c:993
-#, c-format
-msgid "%s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1043
-#, c-format
-msgid "couldn't hash object from '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1047
-#, c-format
-msgid "unexpected mode %o\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1288
-msgid "use the commit stored in the index instead of the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1290
-msgid "compare the commit in the index with that in the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1292
-msgid "skip submodules with 'ignore_config' value set to 'all'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1294
-msgid "limit the summary size"
-msgstr ""
-
-#: builtin/submodule--helper.c:1299
-msgid "git submodule--helper summary [<options>] [<commit>] [--] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1323
-msgid "could not fetch a revision for HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1384
-#, c-format
-msgid "Synchronizing submodule url for '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1390
-#, c-format
-msgid "failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1399
-#, c-format
-msgid "failed to get the default remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1409
-#, c-format
-msgid "failed to update remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1456
-msgid "suppress output of synchronizing submodule url"
-msgstr ""
-
-#: builtin/submodule--helper.c:1463
-msgid "git submodule--helper sync [--quiet] [--recursive] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1513
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains a .git directory. This will be replaced "
-"with a .git file by using absorbgitdirs."
-msgstr ""
-
-#: builtin/submodule--helper.c:1530
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains local modifications; use '-f' to discard "
-"them"
-msgstr ""
-
-#: builtin/submodule--helper.c:1538
-#, c-format
-msgid "Cleared directory '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1540
-#, c-format
-msgid "Could not remove submodule work tree '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1551
-#, c-format
-msgid "could not create empty submodule directory %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1567
-#, c-format
-msgid "Submodule '%s' (%s) unregistered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1596
-msgid "remove submodule working trees even if they contain local changes"
-msgstr ""
-
-#: builtin/submodule--helper.c:1597
-msgid "unregister all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1602
-msgid ""
-"git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1616
-msgid "Use '--all' if you really want to deinitialize all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1665
-msgid ""
-"An alternate computed from a superproject's alternate is invalid.\n"
-"To allow Git to clone without an alternate in such a case, set\n"
-"submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"
-"'--reference-if-able' instead of '--reference'."
-msgstr ""
-
-#: builtin/submodule--helper.c:1710 builtin/submodule--helper.c:1713
-#, c-format
-msgid "submodule '%s' cannot add alternate: %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1749
-#, c-format
-msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1756
-#, c-format
-msgid "Value '%s' for submodule.alternateLocation is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1781
-#, c-format
-msgid "refusing to create/use '%s' in another submodule's git dir"
-msgstr ""
-
-#: builtin/submodule--helper.c:1826
-#, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
-msgstr ""
-
-#: builtin/submodule--helper.c:1831
-#, c-format
-msgid "directory not empty: '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1843
-#, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1876
-msgid "where the new submodule will be cloned to"
-msgstr ""
-
-#: builtin/submodule--helper.c:1879
-msgid "name of the new submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:1882
-msgid "url where to clone the submodule from"
-msgstr ""
-
-#: builtin/submodule--helper.c:1890 builtin/submodule--helper.c:3383
-msgid "depth for shallow clones"
-msgstr ""
-
-#: builtin/submodule--helper.c:1893 builtin/submodule--helper.c:2731
-#: builtin/submodule--helper.c:3376
-msgid "force cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:1895 builtin/submodule--helper.c:2733
-msgid "disallow cloning into non-empty directory"
-msgstr ""
-
-#: builtin/submodule--helper.c:1903
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--depth <depth>] [--single-branch] [--filter "
-"<filter-spec>] --url <url> --path <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:1943
-#, c-format
-msgid "Invalid update mode '%s' for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1947
-#, c-format
-msgid "Invalid update mode '%s' configured for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2041
-#, c-format
-msgid "Submodule path '%s' not initialized"
-msgstr ""
-
-#: builtin/submodule--helper.c:2045
-msgid "Maybe you want to use 'update --init'?"
-msgstr ""
-
-#: builtin/submodule--helper.c:2075
-#, c-format
-msgid "Skipping unmerged submodule %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:2104
-#, c-format
-msgid "Skipping submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2257
-#, c-format
-msgid "Failed to clone '%s'. Retry scheduled"
-msgstr ""
-
-#: builtin/submodule--helper.c:2268
-#, c-format
-msgid "Failed to clone '%s' a second time, aborting"
-msgstr ""
-
-#: builtin/submodule--helper.c:2371
-#, c-format
-msgid "Unable to checkout '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2375
-#, c-format
-msgid "Unable to rebase '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2379
-#, c-format
-msgid "Unable to merge '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2383
-#, c-format
-msgid "Execution of '%s %s' failed in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2402
-#, c-format
-msgid "Submodule path '%s': checked out '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2406
-#, c-format
-msgid "Submodule path '%s': rebased into '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2410
-#, c-format
-msgid "Submodule path '%s': merged in '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2414
-#, c-format
-msgid "Submodule path '%s': '%s %s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2438
-#, c-format
-msgid "Unable to fetch in submodule path '%s'; trying to directly fetch %s:"
-msgstr ""
-
-#: builtin/submodule--helper.c:2447
-#, c-format
-msgid ""
-"Fetched in submodule path '%s', but it did not contain %s. Direct fetching "
-"of that commit failed."
-msgstr ""
-
-#: builtin/submodule--helper.c:2481
-#, c-format
-msgid ""
-"Submodule (%s) branch configured to inherit branch from superproject, but "
-"the superproject is not on any branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2499
-#, c-format
-msgid "could not get a repository handle for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2588
-#, c-format
-msgid "Unable to find current revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2599
-#, c-format
-msgid "Unable to fetch in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2604
-#, c-format
-msgid "Unable to find %s revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2640
-#, c-format
-msgid "Failed to recurse into submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2699
-msgid "force checkout updates"
-msgstr ""
-
-#: builtin/submodule--helper.c:2701
-msgid "initialize uninitialized submodules before update"
-msgstr ""
-
-#: builtin/submodule--helper.c:2703
-msgid "use SHA-1 of submodule's remote tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2705
-msgid "traverse submodules recursively"
-msgstr ""
-
-#: builtin/submodule--helper.c:2707
-msgid "don't fetch new objects from the remote site"
-msgstr ""
-
-#: builtin/submodule--helper.c:2710 builtin/submodule--helper.c:2892
-msgid "path into the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:2713
-msgid "path into the working tree, across nested submodule boundaries"
-msgstr ""
-
-#: builtin/submodule--helper.c:2717
-msgid "rebase, merge, checkout or none"
-msgstr ""
-
-#: builtin/submodule--helper.c:2723
-msgid "create a shallow clone truncated to the specified number of revisions"
-msgstr ""
-
-#: builtin/submodule--helper.c:2726
-msgid "parallel jobs"
-msgstr ""
-
-#: builtin/submodule--helper.c:2728
-msgid "whether the initial clone should follow the shallow recommendation"
-msgstr ""
-
-#: builtin/submodule--helper.c:2729
-msgid "don't print cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:2741
-msgid ""
-"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>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2767
-msgid "bad value for update parameter"
-msgstr ""
-
-#: builtin/submodule--helper.c:2893
-msgid "recurse into submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:2899
-msgid "git submodule--helper absorb-git-dirs [<options>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2955
-msgid "check if it is safe to write to the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2958
-msgid "unset the config in the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2963
-msgid "git submodule--helper config <name> [<value>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2964
-msgid "git submodule--helper config --unset <name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:2984 builtin/submodule--helper.c:3238
-#: builtin/submodule--helper.c:3395
-msgid "please make sure that the .gitmodules file is in the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3000
-msgid "suppress output for setting url of a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3004
-msgid "git submodule--helper set-url [--quiet] <path> <newurl>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3037
-msgid "set the default tracking branch to master"
-msgstr ""
-
-#: builtin/submodule--helper.c:3039
-msgid "set the default tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:3043
-msgid "git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3044
-msgid ""
-"git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3051
-msgid "--branch or --default required"
-msgstr ""
-
-#: builtin/submodule--helper.c:3072 builtin/submodule--helper.c:3375
-msgid "print only error messages"
-msgstr ""
-
-#: builtin/submodule--helper.c:3073
-msgid "force creation"
-msgstr ""
-
-#: builtin/submodule--helper.c:3081
-msgid "show whether the branch would be created"
-msgstr ""
-
-#: builtin/submodule--helper.c:3085
-msgid ""
-"git submodule--helper create-branch [-f|--force] [--create-reflog] [-q|--"
-"quiet] [-t|--track] [-n|--dry-run] <name> <start-oid> <start-name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3097
-#, c-format
-msgid "creating branch '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3155
-#, c-format
-msgid "Adding existing repo at '%s' to the index\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3158
-#, c-format
-msgid "'%s' already exists and is not a valid git repo"
-msgstr ""
-
-#: builtin/submodule--helper.c:3171
-#, c-format
-msgid "A git directory for '%s' is found locally with remote(s):\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3178
-#, c-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from\n"
-"  %s\n"
-"use the '--force' option. If the local git directory is not the correct "
-"repo\n"
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-
-#: builtin/submodule--helper.c:3190
-#, c-format
-msgid "Reactivating local git directory for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3227
-#, c-format
-msgid "unable to checkout submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3266
-#, c-format
-msgid "Failed to add submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3270 builtin/submodule--helper.c:3275
-#: builtin/submodule--helper.c:3283
-#, c-format
-msgid "Failed to register submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3339
-#, c-format
-msgid "'%s' already exists in the index"
-msgstr ""
-
-#: builtin/submodule--helper.c:3342
-#, c-format
-msgid "'%s' already exists in the index and is not a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3372
-msgid "branch of repository to add as submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3373
-msgid "allow adding an otherwise ignored submodule path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3379
-msgid "borrow the objects from reference repositories"
-msgstr ""
-
-#: builtin/submodule--helper.c:3381
-msgid ""
-"sets the submodule’s name to the given string instead of defaulting to its "
-"path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3388
-msgid "git submodule--helper add [<options>] [--] <repository> [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:3416
-msgid "Relative path can only be used from the toplevel of the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3425
-#, c-format
-msgid "repo URL: '%s' must be absolute or begin with ./|../"
-msgstr ""
-
-#: builtin/submodule--helper.c:3460
-#, c-format
-msgid "'%s' is not a valid submodule name"
-msgstr ""
-
-#: builtin/submodule--helper.c:3520 git.c:453 git.c:729
-#, c-format
-msgid "%s doesn't support --super-prefix"
-msgstr ""
-
-#: builtin/submodule--helper.c:3526
-#, c-format
-msgid "'%s' is not a valid submodule--helper subcommand"
-msgstr ""
-
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr ""
-
-#: builtin/symbolic-ref.c:9
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr ""
-
-#: builtin/symbolic-ref.c:42
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
-
-#: builtin/symbolic-ref.c:43
-msgid "delete symbolic ref"
-msgstr ""
-
-#: builtin/symbolic-ref.c:44
-msgid "shorten ref output"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason of the update"
-msgstr ""
-
-#: builtin/tag.c:26
-msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n"
-"        <tagname> [<head>]"
-msgstr ""
-
-#: builtin/tag.c:28
-msgid "git tag -d <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:29
-msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
-"points-at <object>]\n"
-"        [--format=<format>] [--merged <commit>] [--no-merged <commit>] "
-"[<pattern>...]"
-msgstr ""
-
-#: builtin/tag.c:31
-msgid "git tag -v [--format=<format>] <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:101
-#, c-format
-msgid "tag '%s' not found."
-msgstr ""
-
-#: builtin/tag.c:136
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/tag.c:171
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/tag.c:175
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be kept; you may remove them yourself if you "
-"want to.\n"
-msgstr ""
-
-#: builtin/tag.c:241
-msgid "unable to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:259
-#, c-format
-msgid ""
-"You have created a nested tag. The object referred to by your new tag is\n"
-"already a tag. If you meant to tag the object that it points to, use:\n"
-"\n"
-"\tgit tag -f %s %s^{}"
-msgstr ""
-
-#: builtin/tag.c:275
-msgid "bad object type."
-msgstr ""
-
-#: builtin/tag.c:326
-msgid "no tag message?"
-msgstr ""
-
-#: builtin/tag.c:333
-#, c-format
-msgid "The tag message has been left in %s\n"
-msgstr ""
-
-#: builtin/tag.c:445
-msgid "list tag names"
-msgstr ""
-
-#: builtin/tag.c:447
-msgid "print <n> lines of each tag message"
-msgstr ""
-
-#: builtin/tag.c:449
-msgid "delete tags"
-msgstr ""
-
-#: builtin/tag.c:450
-msgid "verify tags"
-msgstr ""
-
-#: builtin/tag.c:452
-msgid "Tag creation options"
-msgstr ""
-
-#: builtin/tag.c:454
-msgid "annotated tag, needs a message"
-msgstr ""
-
-#: builtin/tag.c:456
-msgid "tag message"
-msgstr ""
-
-#: builtin/tag.c:458
-msgid "force edit of tag message"
-msgstr ""
-
-#: builtin/tag.c:459
-msgid "annotated and GPG-signed tag"
-msgstr ""
-
-#: builtin/tag.c:462
-msgid "use another key to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:463
-msgid "replace the tag if exists"
-msgstr ""
-
-#: builtin/tag.c:464 builtin/update-ref.c:511
-msgid "create a reflog"
-msgstr ""
-
-#: builtin/tag.c:466
-msgid "Tag listing options"
-msgstr ""
-
-#: builtin/tag.c:467
-msgid "show tag list in columns"
-msgstr ""
-
-#: builtin/tag.c:468 builtin/tag.c:470
-msgid "print only tags that contain the commit"
-msgstr ""
-
-#: builtin/tag.c:469 builtin/tag.c:471
-msgid "print only tags that don't contain the commit"
-msgstr ""
-
-#: builtin/tag.c:472
-msgid "print only tags that are merged"
-msgstr ""
-
-#: builtin/tag.c:473
-msgid "print only tags that are not merged"
-msgstr ""
-
-#: builtin/tag.c:477
-msgid "print only tags of the object"
-msgstr ""
-
-#: builtin/tag.c:559
-#, c-format
-msgid "the '%s' option is only allowed in list mode"
-msgstr ""
-
-#: builtin/tag.c:598
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr ""
-
-#: builtin/tag.c:603
-#, c-format
-msgid "tag '%s' already exists"
-msgstr ""
-
-#: builtin/tag.c:634
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/unpack-objects.c:95
-msgid "pack exceeds maximum allowed size"
-msgstr ""
-
-#: builtin/unpack-objects.c:504
-msgid "Unpacking objects"
-msgstr ""
-
-#: builtin/update-index.c:84
-#, c-format
-msgid "failed to create directory %s"
-msgstr ""
-
-#: builtin/update-index.c:106
-#, c-format
-msgid "failed to delete file %s"
-msgstr ""
-
-#: builtin/update-index.c:113 builtin/update-index.c:219
-#, c-format
-msgid "failed to delete directory %s"
-msgstr ""
-
-#: builtin/update-index.c:138
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr ""
-
-#: builtin/update-index.c:152
-msgid "directory stat info does not change after adding a new file"
-msgstr ""
-
-#: builtin/update-index.c:165
-msgid "directory stat info does not change after adding a new directory"
-msgstr ""
-
-#: builtin/update-index.c:178
-msgid "directory stat info changes after updating a file"
-msgstr ""
-
-#: builtin/update-index.c:189
-msgid "directory stat info changes after adding a file inside subdirectory"
-msgstr ""
-
-#: builtin/update-index.c:200
-msgid "directory stat info does not change after deleting a file"
-msgstr ""
-
-#: builtin/update-index.c:213
-msgid "directory stat info does not change after deleting a directory"
-msgstr ""
-
-#: builtin/update-index.c:220
-msgid " OK"
-msgstr ""
-
-#: builtin/update-index.c:589
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/update-index.c:993
-msgid "continue refresh even when index needs update"
-msgstr ""
-
-#: builtin/update-index.c:996
-msgid "refresh: ignore submodules"
-msgstr ""
-
-#: builtin/update-index.c:999
-msgid "do not ignore new files"
-msgstr ""
-
-#: builtin/update-index.c:1001
-msgid "let files replace directories and vice-versa"
-msgstr ""
-
-#: builtin/update-index.c:1003
-msgid "notice files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1005
-msgid "refresh even if index contains unmerged entries"
-msgstr ""
-
-#: builtin/update-index.c:1008
-msgid "refresh stat information"
-msgstr ""
-
-#: builtin/update-index.c:1012
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr ""
-
-#: builtin/update-index.c:1016
-msgid "<mode>,<object>,<path>"
-msgstr ""
-
-#: builtin/update-index.c:1017
-msgid "add the specified entry to the index"
-msgstr ""
-
-#: builtin/update-index.c:1027
-msgid "mark files as \"not changing\""
-msgstr ""
-
-#: builtin/update-index.c:1030
-msgid "clear assumed-unchanged bit"
-msgstr ""
-
-#: builtin/update-index.c:1033
-msgid "mark files as \"index-only\""
-msgstr ""
-
-#: builtin/update-index.c:1036
-msgid "clear skip-worktree bit"
-msgstr ""
-
-#: builtin/update-index.c:1039
-msgid "do not touch index-only entries"
-msgstr ""
-
-#: builtin/update-index.c:1041
-msgid "add to index only; do not add content to object database"
-msgstr ""
-
-#: builtin/update-index.c:1043
-msgid "remove named paths even if present in worktree"
-msgstr ""
-
-#: builtin/update-index.c:1045
-msgid "with --stdin: input lines are terminated by null bytes"
-msgstr ""
-
-#: builtin/update-index.c:1047
-msgid "read list of paths to be updated from standard input"
-msgstr ""
-
-#: builtin/update-index.c:1051
-msgid "add entries from standard input to the index"
-msgstr ""
-
-#: builtin/update-index.c:1055
-msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr ""
-
-#: builtin/update-index.c:1059
-msgid "only update entries that differ from HEAD"
-msgstr ""
-
-#: builtin/update-index.c:1063
-msgid "ignore files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1066
-msgid "report actions to standard output"
-msgstr ""
-
-#: builtin/update-index.c:1068
-msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr ""
-
-#: builtin/update-index.c:1072
-msgid "write index in this format"
-msgstr ""
-
-#: builtin/update-index.c:1074
-msgid "enable or disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1076
-msgid "enable/disable untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1078
-msgid "test if the filesystem supports untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1080
-msgid "enable untracked cache without testing the filesystem"
-msgstr ""
-
-#: builtin/update-index.c:1082
-msgid "write out the index even if is not flagged as changed"
-msgstr ""
-
-#: builtin/update-index.c:1084
-msgid "enable or disable file system monitor"
-msgstr ""
-
-#: builtin/update-index.c:1086
-msgid "mark files as fsmonitor valid"
-msgstr ""
-
-#: builtin/update-index.c:1089
-msgid "clear fsmonitor valid bit"
-msgstr ""
-
-#: builtin/update-index.c:1195
-msgid ""
-"core.splitIndex is set to false; remove or change it, if you really want to "
-"enable split index"
-msgstr ""
-
-#: builtin/update-index.c:1204
-msgid ""
-"core.splitIndex is set to true; remove or change it, if you really want to "
-"disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1216
-msgid ""
-"core.untrackedCache is set to true; remove or change it, if you really want "
-"to disable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1220
-msgid "Untracked cache disabled"
-msgstr ""
-
-#: builtin/update-index.c:1228
-msgid ""
-"core.untrackedCache is set to false; remove or change it, if you really want "
-"to enable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1232
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr ""
-
-#: builtin/update-index.c:1241
-msgid "core.fsmonitor is unset; set it if you really want to enable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1246
-msgid "fsmonitor enabled"
-msgstr ""
-
-#: builtin/update-index.c:1250
-msgid ""
-"core.fsmonitor is set; remove it if you really want to disable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1254
-msgid "fsmonitor disabled"
-msgstr ""
-
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:12
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr ""
-
-#: builtin/update-ref.c:506
-msgid "delete the reference"
-msgstr ""
-
-#: builtin/update-ref.c:508
-msgid "update <refname> not the one it points to"
-msgstr ""
-
-#: builtin/update-ref.c:509
-msgid "stdin has NUL-terminated arguments"
-msgstr ""
-
-#: builtin/update-ref.c:510
-msgid "read updates from stdin"
-msgstr ""
-
-#: builtin/update-server-info.c:15
-msgid "update the info files from scratch"
-msgstr ""
-
-#: builtin/upload-pack.c:11
-msgid "git upload-pack [<options>] <dir>"
-msgstr ""
-
-#: builtin/upload-pack.c:24 t/helper/test-serve-v2.c:17
-msgid "quit after a single request/response exchange"
-msgstr ""
-
-#: builtin/upload-pack.c:26
-msgid "serve up the info/refs for git-http-backend"
-msgstr ""
-
-#: builtin/upload-pack.c:29
-msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr ""
-
-#: builtin/upload-pack.c:31
-msgid "interrupt transfer after <n> seconds of inactivity"
-msgstr ""
-
-#: builtin/verify-commit.c:19
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr ""
-
-#: builtin/verify-commit.c:68
-msgid "print commit contents"
-msgstr ""
-
-#: builtin/verify-commit.c:69 builtin/verify-tag.c:37
-msgid "print raw gpg status output"
-msgstr ""
-
-#: builtin/verify-pack.c:59
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr ""
-
-#: builtin/verify-pack.c:70
-msgid "verbose"
-msgstr ""
-
-#: builtin/verify-pack.c:72
-msgid "show statistics only"
-msgstr ""
-
-#: builtin/verify-tag.c:18
-msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
-msgstr ""
-
-#: builtin/verify-tag.c:36
-msgid "print tag contents"
-msgstr ""
-
-#: builtin/worktree.c:19
-msgid "git worktree add [<options>] <path> [<commit-ish>]"
-msgstr ""
-
-#: builtin/worktree.c:20
-msgid "git worktree list [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:21
-msgid "git worktree lock [<options>] <path>"
-msgstr ""
-
-#: builtin/worktree.c:22
-msgid "git worktree move <worktree> <new-path>"
-msgstr ""
-
-#: builtin/worktree.c:23
-msgid "git worktree prune [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:24
-msgid "git worktree remove [<options>] <worktree>"
-msgstr ""
-
-#: builtin/worktree.c:25
-msgid "git worktree repair [<path>...]"
-msgstr ""
-
-#: builtin/worktree.c:26
-msgid "git worktree unlock <path>"
-msgstr ""
-
-#: builtin/worktree.c:76
-#, c-format
-msgid "Removing %s/%s: %s"
-msgstr ""
-
-#: builtin/worktree.c:149
-msgid "report pruned working trees"
-msgstr ""
-
-#: builtin/worktree.c:151
-msgid "expire working trees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:221
-#, c-format
-msgid "'%s' already exists"
-msgstr ""
-
-#: builtin/worktree.c:230
-#, c-format
-msgid "unusable worktree destination '%s'"
-msgstr ""
-
-#: builtin/worktree.c:235
-#, c-format
-msgid ""
-"'%s' is a missing but locked worktree;\n"
-"use '%s -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:237
-#, c-format
-msgid ""
-"'%s' is a missing but already registered worktree;\n"
-"use '%s -f' to override, or 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:248
-#, c-format
-msgid "failed to copy '%s' to '%s'; sparse-checkout may not work correctly"
-msgstr ""
-
-#: builtin/worktree.c:268
-#, c-format
-msgid "failed to copy worktree config from '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:280 builtin/worktree.c:285
-#, c-format
-msgid "failed to unset '%s' in '%s'"
-msgstr ""
-
-#: builtin/worktree.c:356
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr ""
-
-#: builtin/worktree.c:378
-msgid "initializing"
-msgstr ""
-
-#: builtin/worktree.c:492 builtin/worktree.c:498
-#, c-format
-msgid "Preparing worktree (new branch '%s')"
-msgstr ""
-
-#: builtin/worktree.c:494
-#, c-format
-msgid "Preparing worktree (resetting branch '%s'; was at %s)"
-msgstr ""
-
-#: builtin/worktree.c:503
-#, c-format
-msgid "Preparing worktree (checking out '%s')"
-msgstr ""
-
-#: builtin/worktree.c:509
-#, c-format
-msgid "Preparing worktree (detached HEAD %s)"
-msgstr ""
-
-#: builtin/worktree.c:554
-msgid "checkout <branch> even if already checked out in other worktree"
-msgstr ""
-
-#: builtin/worktree.c:557
-msgid "create a new branch"
-msgstr ""
-
-#: builtin/worktree.c:559
-msgid "create or reset a branch"
-msgstr ""
-
-#: builtin/worktree.c:561
-msgid "populate the new working tree"
-msgstr ""
-
-#: builtin/worktree.c:562
-msgid "keep the new working tree locked"
-msgstr ""
-
-#: builtin/worktree.c:564 builtin/worktree.c:809
-msgid "reason for locking"
-msgstr ""
-
-#: builtin/worktree.c:567
-msgid "set up tracking mode (see git-branch(1))"
-msgstr ""
-
-#: builtin/worktree.c:570
-msgid "try to match the new branch name with a remote-tracking branch"
-msgstr ""
-
-#: builtin/worktree.c:584
-msgid "added with --lock"
-msgstr ""
-
-#: builtin/worktree.c:646
-msgid "--[no-]track can only be used if a new branch is created"
-msgstr ""
-
-#: builtin/worktree.c:766
-msgid "show extended annotations and reasons, if available"
-msgstr ""
-
-#: builtin/worktree.c:768
-msgid "add 'prunable' annotation to worktrees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:770
-msgid "terminate records with a NUL character"
-msgstr ""
-
-#: builtin/worktree.c:821 builtin/worktree.c:854 builtin/worktree.c:928
-#: builtin/worktree.c:1052
-#, c-format
-msgid "'%s' is not a working tree"
-msgstr ""
-
-#: builtin/worktree.c:823 builtin/worktree.c:856
-msgid "The main working tree cannot be locked or unlocked"
-msgstr ""
-
-#: builtin/worktree.c:828
-#, c-format
-msgid "'%s' is already locked, reason: %s"
-msgstr ""
-
-#: builtin/worktree.c:830
-#, c-format
-msgid "'%s' is already locked"
-msgstr ""
-
-#: builtin/worktree.c:858
-#, c-format
-msgid "'%s' is not locked"
-msgstr ""
-
-#: builtin/worktree.c:899
-msgid "working trees containing submodules cannot be moved or removed"
-msgstr ""
-
-#: builtin/worktree.c:907
-msgid "force move even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:930 builtin/worktree.c:1054
-#, c-format
-msgid "'%s' is a main working tree"
-msgstr ""
-
-#: builtin/worktree.c:935
-#, c-format
-msgid "could not figure out destination name from '%s'"
-msgstr ""
-
-#: builtin/worktree.c:948
-#, c-format
-msgid ""
-"cannot move a locked working tree, lock reason: %s\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:950
-msgid ""
-"cannot move a locked working tree;\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:953
-#, c-format
-msgid "validation failed, cannot move working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:958
-#, c-format
-msgid "failed to move '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1004
-#, c-format
-msgid "failed to run 'git status' on '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1008
-#, c-format
-msgid "'%s' contains modified or untracked files, use --force to delete it"
-msgstr ""
-
-#: builtin/worktree.c:1013
-#, c-format
-msgid "failed to run 'git status' on '%s', code %d"
-msgstr ""
-
-#: builtin/worktree.c:1036
-msgid "force removal even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:1059
-#, c-format
-msgid ""
-"cannot remove a locked working tree, lock reason: %s\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1061
-msgid ""
-"cannot remove a locked working tree;\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1064
-#, c-format
-msgid "validation failed, cannot remove working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:1088
-#, c-format
-msgid "repair: %s: %s"
-msgstr ""
-
-#: builtin/worktree.c:1091
-#, c-format
-msgid "error: %s: %s"
-msgstr ""
-
-#: builtin/write-tree.c:15
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
-
-#: builtin/write-tree.c:28
-msgid "<prefix>/"
-msgstr ""
-
-#: builtin/write-tree.c:29
-msgid "write tree object for a subdirectory <prefix>"
-msgstr ""
-
-#: builtin/write-tree.c:31
-msgid "only useful for debugging"
-msgstr ""
-
-#: git.c:28
-msgid ""
-"git [--version] [--help] [-C <path>] [-c <name>=<value>]\n"
-"           [--exec-path[=<path>]] [--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"
-"           <command> [<args>]"
-msgstr ""
-
-#: git.c:36
-msgid ""
-"'git help -a' and 'git help -g' list available subcommands and some\n"
-"concept guides. See 'git help <command>' or 'git help <concept>'\n"
-"to read about a specific subcommand or concept.\n"
-"See 'git help git' for an overview of the system."
-msgstr ""
-
-#: git.c:188 git.c:216 git.c:300
-#, c-format
-msgid "no directory given for '%s' option\n"
-msgstr ""
-
-#: git.c:202
-#, c-format
-msgid "no namespace given for --namespace\n"
-msgstr ""
-
-#: git.c:230
-#, c-format
-msgid "no prefix given for --super-prefix\n"
-msgstr ""
-
-#: git.c:252
-#, c-format
-msgid "-c expects a configuration string\n"
-msgstr ""
-
-#: git.c:260
-#, c-format
-msgid "no config key given for --config-env\n"
-msgstr ""
-
-#: git.c:326
-#, c-format
-msgid "unknown option: %s\n"
-msgstr ""
-
-#: git.c:375
-#, c-format
-msgid "while expanding alias '%s': '%s'"
-msgstr ""
-
-#: git.c:384
-#, c-format
-msgid ""
-"alias '%s' changes environment variables.\n"
-"You can use '!git' in the alias to do this"
-msgstr ""
-
-#: git.c:391
-#, c-format
-msgid "empty alias for %s"
-msgstr ""
-
-#: git.c:394
-#, c-format
-msgid "recursive alias: %s"
-msgstr ""
-
-#: git.c:480
-msgid "write failure on standard output"
-msgstr ""
-
-#: git.c:482
-msgid "unknown write failure on standard output"
-msgstr ""
-
-#: git.c:484
-msgid "close failed on standard output"
-msgstr ""
-
-#: git.c:838
-#, c-format
-msgid "alias loop detected: expansion of '%s' does not terminate:%s"
-msgstr ""
-
-#: git.c:888
-#, c-format
-msgid "cannot handle %s as a builtin"
-msgstr ""
-
-#: git.c:901
-#, c-format
-msgid ""
-"usage: %s\n"
-"\n"
-msgstr ""
-
-#: git.c:921
-#, c-format
-msgid "expansion of alias '%s' failed; '%s' is not a git command\n"
-msgstr ""
-
-#: git.c:933
-#, c-format
-msgid "failed to run command '%s': %s\n"
-msgstr ""
-
-#: http-fetch.c:128
-#, c-format
-msgid "argument to --packfile must be a valid hash (got '%s')"
-msgstr ""
-
-#: http-fetch.c:138
-msgid "not a git repository"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:141
-msgid "unhandled options"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:146
-msgid "error preparing revisions"
-msgstr ""
-
-#: t/helper/test-reach.c:154
-#, c-format
-msgid "commit %s is not marked reachable"
-msgstr ""
-
-#: t/helper/test-reach.c:164
-msgid "too many commits marked reachable"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:7
-msgid "test-tool serve-v2 [<options>]"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:19
-msgid "exit immediately after advertising capabilities"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:581
-msgid "test-helper simple-ipc is-active    [<name>] [<options>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:582
-msgid "test-helper simple-ipc run-daemon   [<name>] [<threads>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:583
-msgid "test-helper simple-ipc start-daemon [<name>] [<threads>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:584
-msgid "test-helper simple-ipc stop-daemon  [<name>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:585
-msgid "test-helper simple-ipc send         [<name>] [<token>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:586
-msgid "test-helper simple-ipc sendbytes    [<name>] [<bytecount>] [<byte>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:587
-msgid ""
-"test-helper simple-ipc multiple     [<name>] [<threads>] [<bytecount>] "
-"[<batchsize>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:595
-msgid "name or pathname of unix domain socket"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:597
-msgid "named-pipe name"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:599
-msgid "number of threads in server thread pool"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:600
-msgid "seconds to wait for daemon to start or stop"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:602
-msgid "number of bytes"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:603
-msgid "number of requests per thread"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "byte"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "ballast character"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "token"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "command token to send to the server"
-msgstr ""
-
-#: http.c:350
-#, c-format
-msgid "negative value for http.postbuffer; defaulting to %d"
-msgstr ""
-
-#: http.c:371
-msgid "Delegation control is not supported with cURL < 7.22.0"
-msgstr ""
-
-#: http.c:380
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr ""
-
-#: http.c:812
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr ""
-
-#: http.c:1016
-#, c-format
-msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
-msgstr ""
-
-#: http.c:1023
-#, c-format
-msgid "Could not set SSL backend to '%s': cURL was built without SSL backends"
-msgstr ""
-
-#: http.c:1027
-#, c-format
-msgid "Could not set SSL backend to '%s': already set"
-msgstr ""
-
-#: http.c:1876
-#, c-format
-msgid ""
-"unable to update url base from redirection:\n"
-"  asked for: %s\n"
-"   redirect: %s"
-msgstr ""
-
-#: remote-curl.c:184
-#, c-format
-msgid "invalid quoting in push-option value: '%s'"
-msgstr ""
-
-#: remote-curl.c:308
-#, c-format
-msgid "%sinfo/refs not valid: is this a git repository?"
-msgstr ""
-
-#: remote-curl.c:409
-msgid "invalid server response; expected service, got flush packet"
-msgstr ""
-
-#: remote-curl.c:440
-#, c-format
-msgid "invalid server response; got '%s'"
-msgstr ""
-
-#: remote-curl.c:500
-#, c-format
-msgid "repository '%s' not found"
-msgstr ""
-
-#: remote-curl.c:504
-#, c-format
-msgid "Authentication failed for '%s'"
-msgstr ""
-
-#: remote-curl.c:508
-#, c-format
-msgid "unable to access '%s' with http.pinnedPubkey configuration: %s"
-msgstr ""
-
-#: remote-curl.c:512
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr ""
-
-#: remote-curl.c:518
-#, c-format
-msgid "redirecting to %s"
-msgstr ""
-
-#: remote-curl.c:649
-msgid "shouldn't have EOF when not gentle on EOF"
-msgstr ""
-
-#: remote-curl.c:661
-msgid "remote server sent unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:730
-msgid "unable to rewind rpc post data - try increasing http.postBuffer"
-msgstr ""
-
-#: remote-curl.c:759
-#, c-format
-msgid "remote-curl: bad line length character: %.4s"
-msgstr ""
-
-#: remote-curl.c:761
-msgid "remote-curl: unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:837
-#, c-format
-msgid "RPC failed; %s"
-msgstr ""
-
-#: remote-curl.c:877
-msgid "cannot handle pushes this big"
-msgstr ""
-
-#: remote-curl.c:990
-#, c-format
-msgid "cannot deflate request; zlib deflate error %d"
-msgstr ""
-
-#: remote-curl.c:994
-#, c-format
-msgid "cannot deflate request; zlib end error %d"
-msgstr ""
-
-#: remote-curl.c:1044
-#, c-format
-msgid "%d bytes of length header were received"
-msgstr ""
-
-#: remote-curl.c:1046
-#, c-format
-msgid "%d bytes of body are still expected"
-msgstr ""
-
-#: remote-curl.c:1135
-msgid "dumb http transport does not support shallow capabilities"
-msgstr ""
-
-#: remote-curl.c:1150
-msgid "fetch failed."
-msgstr ""
-
-#: remote-curl.c:1198
-msgid "cannot fetch by sha1 over smart http"
-msgstr ""
-
-#: remote-curl.c:1242 remote-curl.c:1248
-#, c-format
-msgid "protocol error: expected sha/ref, got '%s'"
-msgstr ""
-
-#: remote-curl.c:1260 remote-curl.c:1378
-#, c-format
-msgid "http transport does not support %s"
-msgstr ""
-
-#: remote-curl.c:1296
-msgid "git-http-push failed"
-msgstr ""
-
-#: remote-curl.c:1485
-msgid "remote-curl: usage: git remote-curl <remote> [<url>]"
-msgstr ""
-
-#: remote-curl.c:1517
-msgid "remote-curl: error reading command stream from git"
-msgstr ""
-
-#: remote-curl.c:1524
-msgid "remote-curl: fetch attempted without a local repo"
-msgstr ""
-
-#: remote-curl.c:1565
-#, c-format
-msgid "remote-curl: unknown command '%s' from git"
-msgstr ""
-
-#: contrib/scalar/scalar.c:49
-msgid "need a working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:86
-msgid "could not find enlistment root"
-msgstr ""
-
-#: contrib/scalar/scalar.c:89 contrib/scalar/scalar.c:350
-#: contrib/scalar/scalar.c:435 contrib/scalar/scalar.c:578
-#, c-format
-msgid "could not switch to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:179
-#, c-format
-msgid "could not configure %s=%s"
-msgstr ""
-
-#: contrib/scalar/scalar.c:197
-msgid "could not configure log.excludeDecoration"
-msgstr ""
-
-#: contrib/scalar/scalar.c:218
-msgid "Scalar enlistments require a worktree"
-msgstr ""
-
-#: contrib/scalar/scalar.c:310
-#, c-format
-msgid "remote HEAD is not a branch: '%.*s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:316
-msgid "failed to get default branch name from remote; using local default"
-msgstr ""
-
-#: contrib/scalar/scalar.c:329
-msgid "failed to get default branch name"
-msgstr ""
-
-#: contrib/scalar/scalar.c:340
-msgid "failed to unregister repository"
-msgstr ""
-
-#: contrib/scalar/scalar.c:355
-msgid "failed to delete enlistment directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:375
-msgid "branch to checkout after clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:377
-msgid "when cloning, create full working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:379
-msgid "only download metadata for the branch that will be checked out"
-msgstr ""
-
-#: contrib/scalar/scalar.c:384
-msgid "scalar clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:409
-#, c-format
-msgid "cannot deduce worktree name from '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:418
-#, c-format
-msgid "directory '%s' exists already"
-msgstr ""
-
-#: contrib/scalar/scalar.c:445
-#, c-format
-msgid "failed to get default branch for '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:456
-#, c-format
-msgid "could not configure remote in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:465
-#, c-format
-msgid "could not configure '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:468
-msgid "partial clone failed; attempting full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:472
-msgid "could not configure for full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:504
-msgid "`scalar list` does not take arguments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:517
-msgid "scalar register [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:544
-msgid "reconfigure all registered enlistments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:548
-msgid "scalar reconfigure [--all | <enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:566
-msgid "--all or <enlistment>, but not both"
-msgstr ""
-
-#: contrib/scalar/scalar.c:581
-#, c-format
-msgid "git repository gone in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:621
-msgid ""
-"scalar run <task> [<enlistment>]\n"
-"Tasks:\n"
-msgstr ""
-
-#: contrib/scalar/scalar.c:639
-#, c-format
-msgid "no such task: '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:689
-msgid "scalar unregister [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:736
-msgid "scalar delete <enlistment>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:751
-msgid "refusing to delete current working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:766
-msgid "include Git version"
-msgstr ""
-
-#: contrib/scalar/scalar.c:768
-msgid "include Git's build options"
-msgstr ""
-
-#: contrib/scalar/scalar.c:772
-msgid "scalar verbose [-v | --verbose] [--build-options]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:813
-msgid "-C requires a <directory>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:815
-#, c-format
-msgid "could not change to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:821
-msgid "-c requires a <key>=<value> argument"
-msgstr ""
-
-#: contrib/scalar/scalar.c:839
-msgid ""
-"scalar [-C <directory>] [-c <key>=<value>] <command> [<options>]\n"
-"\n"
-"Commands:\n"
-msgstr ""
-
-#: compat/compiler.h:26
-msgid "no compiler information available\n"
-msgstr ""
-
-#: compat/compiler.h:38
-msgid "no libc information available\n"
-msgstr ""
-
-#: list-objects-filter-options.h:126
-msgid "args"
-msgstr ""
-
-#: list-objects-filter-options.h:127
-msgid "object filtering"
-msgstr ""
-
-#: parse-options.h:188
-msgid "expiry-date"
-msgstr ""
-
-#: parse-options.h:202
-msgid "no-op (backward compatibility)"
-msgstr ""
-
-#: parse-options.h:341
-msgid "be more verbose"
-msgstr ""
-
-#: parse-options.h:343
-msgid "be more quiet"
-msgstr ""
-
-#: parse-options.h:349
-msgid "use <n> digits to display object names"
-msgstr ""
-
-#: parse-options.h:368
-msgid "how to strip spaces and #comments from message"
-msgstr ""
-
-#: parse-options.h:369
-msgid "read pathspec from file"
-msgstr ""
-
-#: parse-options.h:370
-msgid ""
-"with --pathspec-from-file, pathspec elements are separated with NUL character"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "key"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "field name to sort on"
-msgstr ""
-
-#: rerere.h:44
-msgid "update the index with reused conflict resolution if possible"
-msgstr ""
-
-#: command-list.h:50
-msgid "Add file contents to the index"
-msgstr ""
-
-#: command-list.h:51
-msgid "Apply a series of patches from a mailbox"
-msgstr ""
-
-#: command-list.h:52
-msgid "Annotate file lines with commit information"
-msgstr ""
-
-#: command-list.h:53
-msgid "Apply a patch to files and/or to the index"
-msgstr ""
-
-#: command-list.h:54
-msgid "Import a GNU Arch repository into Git"
-msgstr ""
-
-#: command-list.h:55
-msgid "Create an archive of files from a named tree"
-msgstr ""
-
-#: command-list.h:56
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr ""
-
-#: command-list.h:57
-msgid "Show what revision and author last modified each line of a file"
-msgstr ""
-
-#: command-list.h:58
-msgid "List, create, or delete branches"
-msgstr ""
-
-#: command-list.h:59
-msgid "Collect information for user to file a bug report"
-msgstr ""
-
-#: command-list.h:60
-msgid "Move objects and refs by archive"
-msgstr ""
-
-#: command-list.h:61
-msgid "Provide content or type and size information for repository objects"
-msgstr ""
-
-#: command-list.h:62
-msgid "Display gitattributes information"
-msgstr ""
-
-#: command-list.h:63
-msgid "Debug gitignore / exclude files"
-msgstr ""
-
-#: command-list.h:64
-msgid "Show canonical names and email addresses of contacts"
-msgstr ""
-
-#: command-list.h:65
-msgid "Ensures that a reference name is well formed"
-msgstr ""
-
-#: command-list.h:66
-msgid "Switch branches or restore working tree files"
-msgstr ""
-
-#: command-list.h:67
-msgid "Copy files from the index to the working tree"
-msgstr ""
-
-#: command-list.h:68
-msgid "Find commits yet to be applied to upstream"
-msgstr ""
-
-#: command-list.h:69
-msgid "Apply the changes introduced by some existing commits"
-msgstr ""
-
-#: command-list.h:70
-msgid "Graphical alternative to git-commit"
-msgstr ""
-
-#: command-list.h:71
-msgid "Remove untracked files from the working tree"
-msgstr ""
-
-#: command-list.h:72
-msgid "Clone a repository into a new directory"
-msgstr ""
-
-#: command-list.h:73
-msgid "Display data in columns"
-msgstr ""
-
-#: command-list.h:74
-msgid "Record changes to the repository"
-msgstr ""
-
-#: command-list.h:75
-msgid "Write and verify Git commit-graph files"
-msgstr ""
-
-#: command-list.h:76
-msgid "Create a new commit object"
-msgstr ""
-
-#: command-list.h:77
-msgid "Get and set repository or global options"
-msgstr ""
-
-#: command-list.h:78
-msgid "Count unpacked number of objects and their disk consumption"
-msgstr ""
-
-#: command-list.h:79
-msgid "Retrieve and store user credentials"
-msgstr ""
-
-#: command-list.h:80
-msgid "Helper to temporarily store passwords in memory"
-msgstr ""
-
-#: command-list.h:81
-msgid "Helper to store credentials on disk"
-msgstr ""
-
-#: command-list.h:82
-msgid "Export a single commit to a CVS checkout"
-msgstr ""
-
-#: command-list.h:83
-msgid "Salvage your data out of another SCM people love to hate"
-msgstr ""
-
-#: command-list.h:84
-msgid "A CVS server emulator for Git"
-msgstr ""
-
-#: command-list.h:85
-msgid "A really simple server for Git repositories"
-msgstr ""
-
-#: command-list.h:86
-msgid "Give an object a human readable name based on an available ref"
-msgstr ""
-
-#: command-list.h:87
-msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
-
-#: command-list.h:88
-msgid "Compares files in the working tree and the index"
-msgstr ""
-
-#: command-list.h:89
-msgid "Compare a tree to the working tree or index"
-msgstr ""
-
-#: command-list.h:90
-msgid "Compares the content and mode of blobs found via two tree objects"
-msgstr ""
-
-#: command-list.h:91
-msgid "Show changes using common diff tools"
-msgstr ""
-
-#: command-list.h:92
-msgid "Git data exporter"
-msgstr ""
-
-#: command-list.h:93
-msgid "Backend for fast Git data importers"
-msgstr ""
-
-#: command-list.h:94
-msgid "Download objects and refs from another repository"
-msgstr ""
-
-#: command-list.h:95
-msgid "Receive missing objects from another repository"
-msgstr ""
-
-#: command-list.h:96
-msgid "Rewrite branches"
-msgstr ""
-
-#: command-list.h:97
-msgid "Produce a merge commit message"
-msgstr ""
-
-#: command-list.h:98
-msgid "Output information on each ref"
-msgstr ""
-
-#: command-list.h:99
-msgid "Run a Git command on a list of repositories"
-msgstr ""
-
-#: command-list.h:100
-msgid "Prepare patches for e-mail submission"
-msgstr ""
-
-#: command-list.h:101
-msgid "Verifies the connectivity and validity of the objects in the database"
-msgstr ""
-
-#: command-list.h:102
-msgid "Cleanup unnecessary files and optimize the local repository"
-msgstr ""
-
-#: command-list.h:103
-msgid "Extract commit ID from an archive created using git-archive"
-msgstr ""
-
-#: command-list.h:104
-msgid "Print lines matching a pattern"
-msgstr ""
-
-#: command-list.h:105
-msgid "A portable graphical interface to Git"
-msgstr ""
-
-#: command-list.h:106
-msgid "Compute object ID and optionally creates a blob from a file"
-msgstr ""
-
-#: command-list.h:107
-msgid "Display help information about Git"
-msgstr ""
-
-#: command-list.h:108
-msgid "Run git hooks"
-msgstr ""
-
-#: command-list.h:109
-msgid "Server side implementation of Git over HTTP"
-msgstr ""
-
-#: command-list.h:110
-msgid "Download from a remote Git repository via HTTP"
-msgstr ""
-
-#: command-list.h:111
-msgid "Push objects over HTTP/DAV to another repository"
-msgstr ""
-
-#: command-list.h:112
-msgid "Send a collection of patches from stdin to an IMAP folder"
-msgstr ""
-
-#: command-list.h:113
-msgid "Build pack index file for an existing packed archive"
-msgstr ""
-
-#: command-list.h:114
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
-
-#: command-list.h:115
-msgid "Instantly browse your working repository in gitweb"
-msgstr ""
-
-#: command-list.h:116
-msgid "Add or parse structured information in commit messages"
-msgstr ""
-
-#: command-list.h:117
-msgid "Show commit logs"
-msgstr ""
-
-#: command-list.h:118
-msgid "Show information about files in the index and the working tree"
-msgstr ""
-
-#: command-list.h:119
-msgid "List references in a remote repository"
-msgstr ""
-
-#: command-list.h:120
-msgid "List the contents of a tree object"
-msgstr ""
-
-#: command-list.h:121
-msgid "Extracts patch and authorship from a single e-mail message"
-msgstr ""
-
-#: command-list.h:122
-msgid "Simple UNIX mbox splitter program"
-msgstr ""
-
-#: command-list.h:123
-msgid "Run tasks to optimize Git repository data"
-msgstr ""
-
-#: command-list.h:124
-msgid "Join two or more development histories together"
-msgstr ""
-
-#: command-list.h:125
-msgid "Find as good common ancestors as possible for a merge"
-msgstr ""
-
-#: command-list.h:126
-msgid "Run a three-way file merge"
-msgstr ""
-
-#: command-list.h:127
-msgid "Run a merge for files needing merging"
-msgstr ""
-
-#: command-list.h:128
-msgid "The standard helper program to use with git-merge-index"
-msgstr ""
-
-#: command-list.h:129
-msgid "Show three-way merge without touching index"
-msgstr ""
-
-#: command-list.h:130
-msgid "Run merge conflict resolution tools to resolve merge conflicts"
-msgstr ""
-
-#: command-list.h:131
-msgid "Creates a tag object with extra validation"
-msgstr ""
-
-#: command-list.h:132
-msgid "Build a tree-object from ls-tree formatted text"
-msgstr ""
-
-#: command-list.h:133
-msgid "Write and verify multi-pack-indexes"
-msgstr ""
-
-#: command-list.h:134
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
-
-#: command-list.h:135
-msgid "Find symbolic names for given revs"
-msgstr ""
-
-#: command-list.h:136
-msgid "Add or inspect object notes"
-msgstr ""
-
-#: command-list.h:137
-msgid "Import from and submit to Perforce repositories"
-msgstr ""
-
-#: command-list.h:138
-msgid "Create a packed archive of objects"
-msgstr ""
-
-#: command-list.h:139
-msgid "Find redundant pack files"
-msgstr ""
-
-#: command-list.h:140
-msgid "Pack heads and tags for efficient repository access"
-msgstr ""
-
-#: command-list.h:141
-msgid "Compute unique ID for a patch"
-msgstr ""
-
-#: command-list.h:142
-msgid "Prune all unreachable objects from the object database"
-msgstr ""
-
-#: command-list.h:143
-msgid "Remove extra objects that are already in pack files"
-msgstr ""
-
-#: command-list.h:144
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr ""
-
-#: command-list.h:145
-msgid "Update remote refs along with associated objects"
-msgstr ""
-
-#: command-list.h:146
-msgid "Applies a quilt patchset onto the current branch"
-msgstr ""
-
-#: command-list.h:147
-msgid "Compare two commit ranges (e.g. two versions of a branch)"
-msgstr ""
-
-#: command-list.h:148
-msgid "Reads tree information into the index"
-msgstr ""
-
-#: command-list.h:149
-msgid "Reapply commits on top of another base tip"
-msgstr ""
-
-#: command-list.h:150
-msgid "Receive what is pushed into the repository"
-msgstr ""
-
-#: command-list.h:151
-msgid "Manage reflog information"
-msgstr ""
-
-#: command-list.h:152
-msgid "Manage set of tracked repositories"
-msgstr ""
-
-#: command-list.h:153
-msgid "Pack unpacked objects in a repository"
-msgstr ""
-
-#: command-list.h:154
-msgid "Create, list, delete refs to replace objects"
-msgstr ""
-
-#: command-list.h:155
-msgid "Generates a summary of pending changes"
-msgstr ""
-
-#: command-list.h:156
-msgid "Reuse recorded resolution of conflicted merges"
-msgstr ""
-
-#: command-list.h:157
-msgid "Reset current HEAD to the specified state"
-msgstr ""
-
-#: command-list.h:158
-msgid "Restore working tree files"
-msgstr ""
-
-#: command-list.h:159
-msgid "Lists commit objects in reverse chronological order"
-msgstr ""
-
-#: command-list.h:160
-msgid "Pick out and massage parameters"
-msgstr ""
-
-#: command-list.h:161
-msgid "Revert some existing commits"
-msgstr ""
-
-#: command-list.h:162
-msgid "Remove files from the working tree and from the index"
-msgstr ""
-
-#: command-list.h:163
-msgid "Send a collection of patches as emails"
-msgstr ""
-
-#: command-list.h:164
-msgid "Push objects over Git protocol to another repository"
-msgstr ""
-
-#: command-list.h:165
-msgid "Git's i18n setup code for shell scripts"
-msgstr ""
-
-#: command-list.h:166
-msgid "Common Git shell script setup code"
-msgstr ""
-
-#: command-list.h:167
-msgid "Restricted login shell for Git-only SSH access"
-msgstr ""
-
-#: command-list.h:168
-msgid "Summarize 'git log' output"
-msgstr ""
-
-#: command-list.h:169
-msgid "Show various types of objects"
-msgstr ""
-
-#: command-list.h:170
-msgid "Show branches and their commits"
-msgstr ""
-
-#: command-list.h:171
-msgid "Show packed archive index"
-msgstr ""
-
-#: command-list.h:172
-msgid "List references in a local repository"
-msgstr ""
-
-#: command-list.h:173
-msgid "Reduce your working tree to a subset of tracked files"
-msgstr ""
-
-#: command-list.h:174
-msgid "Add file contents to the staging area"
-msgstr ""
-
-#: command-list.h:175
-msgid "Stash the changes in a dirty working directory away"
-msgstr ""
-
-#: command-list.h:176
-msgid "Show the working tree status"
-msgstr ""
-
-#: command-list.h:177
-msgid "Remove unnecessary whitespace"
-msgstr ""
-
-#: command-list.h:178
-msgid "Initialize, update or inspect submodules"
-msgstr ""
-
-#: command-list.h:179
-msgid "Bidirectional operation between a Subversion repository and Git"
-msgstr ""
-
-#: command-list.h:180
-msgid "Switch branches"
-msgstr ""
-
-#: command-list.h:181
-msgid "Read, modify and delete symbolic refs"
-msgstr ""
-
-#: command-list.h:182
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
-
-#: command-list.h:183
-msgid "Creates a temporary file with a blob's contents"
-msgstr ""
-
-#: command-list.h:184
-msgid "Unpack objects from a packed archive"
-msgstr ""
-
-#: command-list.h:185
-msgid "Register file contents in the working tree to the index"
-msgstr ""
-
-#: command-list.h:186
-msgid "Update the object name stored in a ref safely"
-msgstr ""
-
-#: command-list.h:187
-msgid "Update auxiliary info file to help dumb servers"
-msgstr ""
-
-#: command-list.h:188
-msgid "Send archive back to git-archive"
-msgstr ""
-
-#: command-list.h:189
-msgid "Send objects packed back to git-fetch-pack"
-msgstr ""
-
-#: command-list.h:190
-msgid "Show a Git logical variable"
-msgstr ""
-
-#: command-list.h:191
-msgid "Check the GPG signature of commits"
-msgstr ""
-
-#: command-list.h:192
-msgid "Validate packed Git archive files"
-msgstr ""
-
-#: command-list.h:193
-msgid "Check the GPG signature of tags"
-msgstr ""
-
-#: command-list.h:194
-msgid "Show logs with difference each commit introduces"
-msgstr ""
-
-#: command-list.h:195
-msgid "Manage multiple working trees"
-msgstr ""
-
-#: command-list.h:196
-msgid "Create a tree object from the current index"
-msgstr ""
-
-#: command-list.h:197
-msgid "Defining attributes per path"
-msgstr ""
-
-#: command-list.h:198
-msgid "Git command-line interface and conventions"
-msgstr ""
-
-#: command-list.h:199
-msgid "A Git core tutorial for developers"
-msgstr ""
-
-#: command-list.h:200
-msgid "Providing usernames and passwords to Git"
-msgstr ""
-
-#: command-list.h:201
-msgid "Git for CVS users"
-msgstr ""
-
-#: command-list.h:202
-msgid "Tweaking diff output"
-msgstr ""
-
-#: command-list.h:203
-msgid "A useful minimum set of commands for Everyday Git"
-msgstr ""
-
-#: command-list.h:204
-msgid "Frequently asked questions about using Git"
-msgstr ""
-
-#: command-list.h:205
-msgid "A Git Glossary"
-msgstr ""
-
-#: command-list.h:206
-msgid "Hooks used by Git"
-msgstr ""
-
-#: command-list.h:207
-msgid "Specifies intentionally untracked files to ignore"
-msgstr ""
-
-#: command-list.h:208
-msgid "The Git repository browser"
-msgstr ""
-
-#: command-list.h:209
-msgid "Map author/committer names and/or E-Mail addresses"
-msgstr ""
-
-#: command-list.h:210
-msgid "Defining submodule properties"
-msgstr ""
-
-#: command-list.h:211
-msgid "Git namespaces"
-msgstr ""
-
-#: command-list.h:212
-msgid "Helper programs to interact with remote repositories"
-msgstr ""
-
-#: command-list.h:213
-msgid "Git Repository Layout"
-msgstr ""
-
-#: command-list.h:214
-msgid "Specifying revisions and ranges for Git"
-msgstr ""
-
-#: command-list.h:215
-msgid "Mounting one repository inside another"
-msgstr ""
-
-#: command-list.h:216
-msgid "A tutorial introduction to Git"
-msgstr ""
-
-#: command-list.h:217
-msgid "A tutorial introduction to Git: part two"
-msgstr ""
-
-#: command-list.h:218
-msgid "Git web interface (web frontend to Git repositories)"
-msgstr ""
-
-#: command-list.h:219
-msgid "An overview of recommended workflows with Git"
-msgstr ""
-
-#: git-merge-octopus.sh:46
-msgid ""
-"Error: Your local changes to the following files would be overwritten by "
-"merge"
-msgstr ""
-
-#: git-merge-octopus.sh:61
-msgid "Automated merge did not work."
-msgstr ""
-
-#: git-merge-octopus.sh:62
-msgid "Should not be doing an octopus."
-msgstr ""
-
-#: git-merge-octopus.sh:73
-#, sh-format
-msgid "Unable to find common commit with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:77
-#, sh-format
-msgid "Already up to date with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:89
-#, sh-format
-msgid "Fast-forwarding to: $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:97
-#, sh-format
-msgid "Trying simple merge with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:102
-msgid "Simple merge did not work, trying automatic merge."
-msgstr ""
-
-#: git-sh-setup.sh:89 git-sh-setup.sh:94
-#, sh-format
-msgid "usage: $dashless $USAGE"
-msgstr ""
-
-#: git-sh-setup.sh:182
-#, sh-format
-msgid "Cannot chdir to $cdup, the toplevel of the working tree"
-msgstr ""
-
-#: git-sh-setup.sh:191 git-sh-setup.sh:198
-#, sh-format
-msgid "fatal: $program_name cannot be used without a working tree."
-msgstr ""
-
-#: git-sh-setup.sh:212
-msgid "Cannot rewrite branches: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:215
-#, sh-format
-msgid "Cannot $action: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:226
-#, sh-format
-msgid "Cannot $action: Your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:228
-msgid "Additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:348
-msgid "You need to run this command from the toplevel of the working tree."
-msgstr ""
-
-#: git-sh-setup.sh:353
-msgid "Unable to determine absolute path of git directory"
-msgstr ""
-
-#. TRANSLATORS: you can adjust this to align "git add -i" status menu
-#: git-add--interactive.perl:212
-#, perl-format
-msgid "%12s %12s %s"
-msgstr ""
-
-#: git-add--interactive.perl:632
-#, perl-format
-msgid "touched %d path\n"
-msgid_plural "touched %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1056
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for staging."
-msgstr ""
-
-#: git-add--interactive.perl:1059
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for stashing."
-msgstr ""
-
-#: git-add--interactive.perl:1062
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for unstaging."
-msgstr ""
-
-#: git-add--interactive.perl:1065 git-add--interactive.perl:1074
-#: git-add--interactive.perl:1080
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for applying."
-msgstr ""
-
-#: git-add--interactive.perl:1068 git-add--interactive.perl:1071
-#: git-add--interactive.perl:1077
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for discarding."
-msgstr ""
-
-#: git-add--interactive.perl:1114
-#, perl-format
-msgid "failed to open hunk edit file for writing: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1121
-#, perl-format
-msgid ""
-"---\n"
-"To remove '%s' lines, make them ' ' lines (context).\n"
-"To remove '%s' lines, delete them.\n"
-"Lines starting with %s will be removed.\n"
-msgstr ""
-
-#: git-add--interactive.perl:1143
-#, perl-format
-msgid "failed to open hunk edit file for reading: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1253
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1259
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: git-add--interactive.perl:1265
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1271
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1277 git-add--interactive.perl:1295
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1283
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1289
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1301
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1316
-msgid ""
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: git-add--interactive.perl:1347
-msgid "The selected hunks do not apply to the index!\n"
-msgstr ""
-
-#: git-add--interactive.perl:1362
-#, perl-format
-msgid "ignoring unmerged: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1481
-#, perl-format
-msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1482
-#, perl-format
-msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1483
-#, perl-format
-msgid "Apply addition to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1484
-#, perl-format
-msgid "Apply this hunk to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1601
-msgid "No other hunks to goto\n"
-msgstr ""
-
-#: git-add--interactive.perl:1619
-#, perl-format
-msgid "Invalid number: '%s'\n"
-msgstr ""
-
-#: git-add--interactive.perl:1624
-#, perl-format
-msgid "Sorry, only %d hunk available.\n"
-msgid_plural "Sorry, only %d hunks available.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1659
-msgid "No other hunks to search\n"
-msgstr ""
-
-#: git-add--interactive.perl:1676
-#, perl-format
-msgid "Malformed search regexp %s: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1686
-msgid "No hunk matches the given pattern\n"
-msgstr ""
-
-#: git-add--interactive.perl:1698 git-add--interactive.perl:1720
-msgid "No previous hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1707 git-add--interactive.perl:1726
-msgid "No next hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1732
-msgid "Sorry, cannot split this hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1738
-#, perl-format
-msgid "Split into %d hunk.\n"
-msgid_plural "Split into %d hunks.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1748
-msgid "Sorry, cannot edit this hunk\n"
-msgstr ""
-
-#. TRANSLATORS: please do not translate the command names
-#. 'status', 'update', 'revert', etc.
-#: git-add--interactive.perl:1813
-msgid ""
-"status        - show paths with changes\n"
-"update        - add working tree state to the staged set of changes\n"
-"revert        - revert staged set of changes back to the HEAD version\n"
-"patch         - pick hunks and update selectively\n"
-"diff          - view diff between HEAD and index\n"
-"add untracked - add contents of untracked files to the staged set of "
-"changes\n"
-msgstr ""
-
-#: git-add--interactive.perl:1830 git-add--interactive.perl:1842
-#: git-add--interactive.perl:1845 git-add--interactive.perl:1852
-#: git-add--interactive.perl:1855 git-add--interactive.perl:1862
-#: git-add--interactive.perl:1866 git-add--interactive.perl:1872
-msgid "missing --"
-msgstr ""
-
-#: git-add--interactive.perl:1868
-#, perl-format
-msgid "unknown --patch mode: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1874 git-add--interactive.perl:1880
-#, perl-format
-msgid "invalid argument %s, expecting --"
-msgstr ""
-
-#: git-send-email.perl:159
-msgid "local zone differs from GMT by a non-minute interval\n"
-msgstr ""
-
-#: git-send-email.perl:166 git-send-email.perl:172
-msgid "local time offset greater than or equal to 24 hours\n"
-msgstr ""
-
-#: git-send-email.perl:244
-#, perl-format
-msgid "fatal: command '%s' died with exit code %d"
-msgstr ""
-
-#: git-send-email.perl:257
-msgid "the editor exited uncleanly, aborting everything"
-msgstr ""
-
-#: git-send-email.perl:346
-#, perl-format
-msgid ""
-"'%s' contains an intermediate version of the email you were composing.\n"
-msgstr ""
-
-#: git-send-email.perl:351
-#, perl-format
-msgid "'%s.final' contains the composed email.\n"
-msgstr ""
-
-#: git-send-email.perl:484
-msgid "--dump-aliases incompatible with other options\n"
-msgstr ""
-
-#: git-send-email.perl:561
-msgid ""
-"fatal: found configuration options for 'sendmail'\n"
-"git-send-email is configured with the sendemail.* options - note the 'e'.\n"
-"Set sendemail.forbidSendmailVariables to false to disable this check.\n"
-msgstr ""
-
-#: git-send-email.perl:566 git-send-email.perl:782
-msgid "Cannot run git format-patch from outside a repository\n"
-msgstr ""
-
-#: git-send-email.perl:569
-msgid ""
-"`batch-size` and `relogin` must be specified together (via command-line or "
-"configuration option)\n"
-msgstr ""
-
-#: git-send-email.perl:582
-#, perl-format
-msgid "Unknown --suppress-cc field: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:613
-#, perl-format
-msgid "Unknown --confirm setting: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:653
-#, perl-format
-msgid "warning: sendmail alias with quotes is not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:655
-#, perl-format
-msgid "warning: `:include:` not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:657
-#, perl-format
-msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:662
-#, perl-format
-msgid "warning: sendmail line is not recognized: %s\n"
-msgstr ""
-
-#: git-send-email.perl:747
-#, perl-format
-msgid ""
-"File '%s' exists but it could also be the range of commits\n"
-"to produce patches for.  Please disambiguate by...\n"
-"\n"
-"    * Saying \"./%s\" if you mean a file; or\n"
-"    * Giving --format-patch option if you mean a range.\n"
-msgstr ""
-
-#: git-send-email.perl:768
-#, perl-format
-msgid "Failed to opendir %s: %s"
-msgstr ""
-
-#: git-send-email.perl:803
-msgid ""
-"\n"
-"No patch files specified!\n"
-"\n"
-msgstr ""
-
-#: git-send-email.perl:816
-#, perl-format
-msgid "No subject line in %s?"
-msgstr ""
-
-#: git-send-email.perl:827
-#, perl-format
-msgid "Failed to open for writing %s: %s"
-msgstr ""
-
-#: git-send-email.perl:838
-msgid ""
-"Lines beginning in \"GIT:\" will be removed.\n"
-"Consider including an overall diffstat or table of contents\n"
-"for the patch you are writing.\n"
-"\n"
-"Clear the body content if you don't wish to send a summary.\n"
-msgstr ""
-
-#: git-send-email.perl:862
-#, perl-format
-msgid "Failed to open %s: %s"
-msgstr ""
-
-#: git-send-email.perl:879
-#, perl-format
-msgid "Failed to open %s.final: %s"
-msgstr ""
-
-#: git-send-email.perl:922
-msgid "Summary email is empty, skipping it\n"
-msgstr ""
-
-#. TRANSLATORS: please keep [y/N] as is.
-#: git-send-email.perl:971
-#, perl-format
-msgid "Are you sure you want to use <%s> [y/N]? "
-msgstr ""
-
-#: git-send-email.perl:1026
-msgid ""
-"The following files are 8bit, but do not declare a Content-Transfer-"
-"Encoding.\n"
-msgstr ""
-
-#: git-send-email.perl:1031
-msgid "Which 8bit encoding should I declare [UTF-8]? "
-msgstr ""
-
-#: git-send-email.perl:1039
-#, perl-format
-msgid ""
-"Refusing to send because the patch\n"
-"\t%s\n"
-"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
-"want to send.\n"
-msgstr ""
-
-#: git-send-email.perl:1058
-msgid "To whom should the emails be sent (if anyone)?"
-msgstr ""
-
-#: git-send-email.perl:1076
-#, perl-format
-msgid "fatal: alias '%s' expands to itself\n"
-msgstr ""
-
-#: git-send-email.perl:1088
-msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
-msgstr ""
-
-#: git-send-email.perl:1150 git-send-email.perl:1158
-#, perl-format
-msgid "error: unable to extract a valid address from: %s\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [q] [d] [e] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1162
-msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
-msgstr ""
-
-#: git-send-email.perl:1482
-#, perl-format
-msgid "CA path \"%s\" does not exist"
-msgstr ""
-
-#: git-send-email.perl:1565
-msgid ""
-"    The Cc list above has been expanded by additional\n"
-"    addresses found in the patch commit message. By default\n"
-"    send-email prompts before sending whenever this occurs.\n"
-"    This behavior is controlled by the sendemail.confirm\n"
-"    configuration setting.\n"
-"\n"
-"    For additional information, run 'git send-email --help'.\n"
-"    To retain the current behavior, but squelch this message,\n"
-"    run 'git config --global sendemail.confirm auto'.\n"
-"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y] [n] [e] [q] [a] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1580
-msgid "Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): "
-msgstr ""
-
-#: git-send-email.perl:1583
-msgid "Send this email reply required"
-msgstr ""
-
-#: git-send-email.perl:1617
-msgid "The required SMTP server is not properly defined."
-msgstr ""
-
-#: git-send-email.perl:1664
-#, perl-format
-msgid "Server does not support STARTTLS! %s"
-msgstr ""
-
-#: git-send-email.perl:1669 git-send-email.perl:1673
-#, perl-format
-msgid "STARTTLS failed! %s"
-msgstr ""
-
-#: git-send-email.perl:1682
-msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
-msgstr ""
-
-#: git-send-email.perl:1700
-#, perl-format
-msgid "Failed to send %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Dry-Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "Dry-OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1724
-msgid "Result: "
-msgstr ""
-
-#: git-send-email.perl:1727
-msgid "Result: OK\n"
-msgstr ""
-
-#: git-send-email.perl:1744
-#, perl-format
-msgid "can't open file %s"
-msgstr ""
-
-#: git-send-email.perl:1792 git-send-email.perl:1812
-#, perl-format
-msgid "(mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1798
-#, perl-format
-msgid "(mbox) Adding to: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1855
-#, perl-format
-msgid "(non-mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1890
-#, perl-format
-msgid "(body) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2009
-#, perl-format
-msgid "(%s) Could not execute '%s'"
-msgstr ""
-
-#: git-send-email.perl:2016
-#, perl-format
-msgid "(%s) Adding %s: %s from: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2020
-#, perl-format
-msgid "(%s) failed to close pipe to '%s'"
-msgstr ""
-
-#: git-send-email.perl:2050
-msgid "cannot send message as 7bit"
-msgstr ""
-
-#: git-send-email.perl:2058
-msgid "invalid transfer encoding"
-msgstr ""
-
-#: git-send-email.perl:2100
-#, perl-format
-msgid ""
-"fatal: %s: rejected by %s hook\n"
-"%s\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2110 git-send-email.perl:2163 git-send-email.perl:2173
-#, perl-format
-msgid "unable to open %s: %s\n"
-msgstr ""
-
-#: git-send-email.perl:2113
-#, perl-format
-msgid ""
-"fatal: %s:%d is longer than 998 characters\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2131
-#, perl-format
-msgid "Skipping %s with backup suffix '%s'.\n"
-msgstr ""
-
-#. TRANSLATORS: please keep "[y|N]" as is.
-#: git-send-email.perl:2135
-#, perl-format
-msgid "Do you really want to send %s? [y|N]: "
-msgstr ""
-- 
2.36.0.1.g15c4090757


^ permalink raw reply related	[relevance 1%]

* [PATCH] t6424: make sure a failed merge preserves local changes
@ 2022-05-19 18:59  3% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-05-19 18:59 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren

We do make sure that an attempt to merge with various forms of local
changes will "fail", but the point of stopping the merge is so that
we refrain from discarding uncommitted local changes that could be
precious.  Add a few more checks for each case to make sure the
local changes are left intact.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---

 * A recent "should failing 'git merge' clean the mess _it_
   created?" topic was over-eager to clean _all_ local changes, but
   we didn't seem to have any test to protect against such breakage.

 t/t6424-merge-unrelated-index-changes.sh | 32 ++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/t/t6424-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh
index 89dd544f38..b6e424a427 100755
--- a/t/t6424-merge-unrelated-index-changes.sh
+++ b/t/t6424-merge-unrelated-index-changes.sh
@@ -71,7 +71,9 @@ test_expect_success 'ff update' '
 	git merge E^0 &&
 
 	test_must_fail git rev-parse HEAD:random_file &&
-	test "$(git diff --name-only --cached E)" = "random_file"
+	test "$(git diff --name-only --cached E)" = "random_file" &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file
 '
 
 test_expect_success 'ff update, important file modified' '
@@ -83,6 +85,8 @@ test_expect_success 'ff update, important file modified' '
 	git add subdir/e &&
 
 	test_must_fail git merge E^0 &&
+	test_path_is_file subdir/e &&
+	git rev-parse --verify :subdir/e &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -93,6 +97,8 @@ test_expect_success 'resolve, trivial' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s resolve C^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -103,6 +109,8 @@ test_expect_success 'resolve, non-trivial' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s resolve D^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -113,6 +121,8 @@ test_expect_success 'recursive' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s recursive C^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -145,9 +155,12 @@ test_expect_success 'recursive, when file has staged changes not matching HEAD n
 	mkdir subdir &&
 	test_seq 1 10 >subdir/a &&
 	git add subdir/a &&
+	git rev-parse --verify :subdir/a >expect &&
 
 	# We have staged changes; merge should error out
 	test_must_fail git merge -s recursive E^0 2>err &&
+	git rev-parse --verify :subdir/a >actual &&
+	test_cmp expect actual &&
 	test_i18ngrep "changes to the following files would be overwritten" err
 '
 
@@ -158,9 +171,12 @@ test_expect_success 'recursive, when file has staged changes matching what a mer
 	mkdir subdir &&
 	test_seq 1 11 >subdir/a &&
 	git add subdir/a &&
+	git rev-parse --verify :subdir/a >expect &&
 
 	# We have staged changes; merge should error out
 	test_must_fail git merge -s recursive E^0 2>err &&
+	git rev-parse --verify :subdir/a >actual &&
+	test_cmp expect actual &&
 	test_i18ngrep "changes to the following files would be overwritten" err
 '
 
@@ -171,7 +187,9 @@ test_expect_success 'octopus, unrelated file touched' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge C^0 D^0 &&
-	test_path_is_missing .git/MERGE_HEAD
+	test_path_is_missing .git/MERGE_HEAD &&
+	git rev-parse --verify :random_file &&
+	test_path_exists random_file
 '
 
 test_expect_success 'octopus, related file removed' '
@@ -181,6 +199,8 @@ test_expect_success 'octopus, related file removed' '
 	git rm b &&
 
 	test_must_fail git merge C^0 D^0 &&
+	test_path_is_missing b &&
+	test_must_fail git rev-parse --verify :b &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -189,8 +209,12 @@ test_expect_success 'octopus, related file modified' '
 	git checkout B^0 &&
 
 	echo 12 >>a && git add a &&
+	git rev-parse --verify :a >expect &&
 
 	test_must_fail git merge C^0 D^0 &&
+	test_path_is_file a &&
+	git rev-parse --verify :a >actual &&
+	test_cmp expect actual &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -201,6 +225,8 @@ test_expect_success 'ours' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s ours C^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
@@ -211,6 +237,8 @@ test_expect_success 'subtree' '
 	touch random_file && git add random_file &&
 
 	test_must_fail git merge -s subtree E^0 &&
+	test_path_is_file random_file &&
+	git rev-parse --verify :random_file &&
 	test_path_is_missing .git/MERGE_HEAD
 '
 
-- 
2.36.1-387-g2cf831bf19


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH v2 3/9] Makefile: have "make pot" not "reset --hard"
  @ 2022-05-19 14:06  3%       ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-05-19 14:06 UTC (permalink / raw)
  To: Jiang Xin
  Cc: Junio C Hamano, Git List, Alexander Shopov, Jordi Mas,
	Matthias Rüster, Jimmy Angelakos, Christopher Díaz,
	Jean-Noël Avila, Bagas Sanjaya, Alessandro Menti,
	Gwan-gyeong Mun, Arusekk, Daniel Santos, Dimitriy Ryazantcev,
	Peter Krefting, Emir SARI, Trần Ngọc Quân,
	Fangyi Zhou, Yi-Jyun Pan, Jiang Xin


On Thu, May 19 2022, Jiang Xin wrote:

> On Thu, May 19, 2022 at 5:53 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>> In the previous discussion of kicking things around I lost track of what
>> version of mine this is picked up from, but I range-diff'd it to my
>> 6cf9c1f7022 (Makefile: have "make pot" not "reset --hard", 2022-04-02),
>> which is the latest I had in avar/Makefile-incremental-po-git-pot-rule
>> on my branch.
>>
>> A range-diff of the two follows below (yours being the RHS). Some
>> comments:
>>
>>  * There's a bug here where you're creating .build/pot/po/pretty.c.po
>>    files, not .build/pot/po/pretty.c, i.e. you add a *.po extension.
>
> In the original version of your commit, each source file has a
> duplicate version in the ".build/" directory, and this will confuse
> IDE (E.g.: VS Code) when I jump to a function declaration.
>
> Name the "pot" snippets with the ".po" extension only have the
> following side effect, nothing else:
>
>             +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
>              #. TRANSLATORS: do not translate [y/n]
>             [...]
>             +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#

I don't think we should sacrifice correctness for such an IDE
workaround, which surely will just bite someone else in a different
way. I.e. now if I'm auto-completing .po<TAB> in a hypothetical naïve
IDE that's looking in .build/ I'll get these built files instead.

The right solution in both cases being that the IDE in question should
be ignoring things covered by .gitignore, or perhaps we could ship
something in contrib/ for specific IDEs?

There's also an easy workaround we can do on the GNU make side. Unless
you mark files as PRECIOUS it'll delete files that are only used for
intermediate targets.

We could thus make the chain e.g.:

    git.c -> .build/pot/po/git.c -> .build/pot/po/git.c.done 

Instead of:

    git.c -> .build/pot/po/git.c -> .build/pot/po/git.c.done

Where the only point of the ".build/pot/po/git.c.done" is to have make
delete the intermediate file as soon as it's done with it.

Or, since the comments all start with #. or #: we could post-munge them
with "sed" I guess.

> I add some notes in commit message:
>
>     While we could rename the "pot" snippets without the ".po" extension
>     to use more intuitive filenames in the comments, but that will
>     confuse the IDE with lots of invalid C or perl source files in
>     ".build/pot/po" directory.

Ah, I see that after you pointed out. I'd skimmed entirely over the
commit message thinking it must have been something I wrote, and didn't
notice that edit. Sorry.

>>  * We went a bit back & forth on the "if grep -q PRItime" part on the GH
>>    ticket. FWIW I still think just skipping that work is a better
>>    choice. Yes we'll have ~10MB of redundant files in .build, and it's
>
> Redundant source files (*.c, *.h, *.perl) in .build will make IDE mad.

Hopefully we can have our cake & eat it too here, per the above. 

>>    marginally slower, but "make pot" isn't a hot target, better to
>>    optimize for simplicity.
>>
>>    But if you're really set on having it I don't mind...
>>
>>  * You add a "MSGCAT_FLAGS = --sort-by-file" here, maybe worth having
>>    some "common" flags variable in the earlier commit we can use here?
>>    I.e. share --sort-by-file with xgettext.
>>
>>  * Your version is missing FORCE on po/git.pot, which is a bug. We can't
>>    omit it on any file that's checked in. We're about to "git rm" it
>>    anyway, so maybe we shouldn't worry about it though...
>
> I'm confused. Since the "po/git.pot" target has a full set of
> prerequisites, it is fine to remove FORCE from dependence.

At this point in the series po/git.pot is still a file tracked by git.

Thus:

    make pot
    git reset --hard HEAD^
    make pot

Or whatever will report that there's nothing to do, since the timestamp
of the "generated" file will be newer than that of what it depends on.

That's why my version pulled that dance with having the
.build/pot/git.pot be non-FORCE and the po/git.pot be FORCE until it was
git rm'd.

^ permalink raw reply	[relevance 3%]

* [PATCH v2 5/9] po/git.pot: this is now a generated file
    2022-05-03 13:23  1% ` [PATCH 6/9] po/git.pot: remove this now generated file, see preceding commit Jiang Xin
  @ 2022-05-19  8:15  1% ` Jiang Xin
  2 siblings, 0 replies; 200+ results
From: Jiang Xin @ 2022-05-19  8:15 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason, Junio C Hamano, Git List
  Cc: Jiang Xin, Alexander Shopov, Jordi Mas, Matthias Rüster,
	Jimmy Angelakos, Christopher Díaz, Jean-Noël Avila,
	Bagas Sanjaya, Alessandro Menti, Gwan-gyeong Mun, Arusekk,
	Daniel Santos, Dimitriy Ryazantcev, Peter Krefting, Emir SARI,
	Trần Ngọc Quân, Fangyi Zhou, Yi-Jyun Pan

From: Junio C Hamano <gitster@pobox.com>

---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot

diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-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 ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, 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] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-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 ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#, c-format
-msgid ""
-"\n"
-"It took %.2f seconds to compute the branch ahead/behind values.\n"
-"You can use '--no-ahead-behind' to avoid this.\n"
-msgstr ""
-
-#: wt-status.c:1210
-msgid "You have unmerged paths."
-msgstr ""
-
-#: wt-status.c:1213
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr ""
-
-#: wt-status.c:1215
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr ""
-
-#: wt-status.c:1219
-msgid "All conflicts fixed but you are still merging."
-msgstr ""
-
-#: wt-status.c:1222
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr ""
-
-#: wt-status.c:1233
-msgid "You are in the middle of an am session."
-msgstr ""
-
-#: wt-status.c:1236
-msgid "The current patch is empty."
-msgstr ""
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-
-#: wt-status.c:1243
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1246
-msgid ""
-"  (use \"git am --allow-empty\" to record this patch as an empty commit)"
-msgstr ""
-
-#: wt-status.c:1248
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-
-#: wt-status.c:1381
-msgid "git-rebase-todo is missing."
-msgstr ""
-
-#: wt-status.c:1383
-msgid "No commands done."
-msgstr ""
-
-#: wt-status.c:1386
-#, c-format
-msgid "Last command done (%<PRIuMAX> command done):"
-msgid_plural "Last commands done (%<PRIuMAX> commands done):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1397
-#, c-format
-msgid "  (see more in file %s)"
-msgstr ""
-
-#: wt-status.c:1402
-msgid "No commands remaining."
-msgstr ""
-
-#: wt-status.c:1405
-#, c-format
-msgid "Next command to do (%<PRIuMAX> remaining command):"
-msgid_plural "Next commands to do (%<PRIuMAX> remaining commands):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1413
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr ""
-
-#: wt-status.c:1425
-#, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1430
-msgid "You are currently rebasing."
-msgstr ""
-
-#: wt-status.c:1443
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1445
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1447
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-
-#: wt-status.c:1454
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1458
-#, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1463
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1466
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1470
-#, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1475
-msgid "You are currently editing a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1478
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-
-#: wt-status.c:1480
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-
-#: wt-status.c:1491
-msgid "Cherry-pick currently in progress."
-msgstr ""
-
-#: wt-status.c:1494
-#, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr ""
-
-#: wt-status.c:1501
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1504
-msgid "  (run \"git cherry-pick --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1507
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1509
-msgid "  (use \"git cherry-pick --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1511
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-
-#: wt-status.c:1521
-msgid "Revert currently in progress."
-msgstr ""
-
-#: wt-status.c:1524
-#, c-format
-msgid "You are currently reverting commit %s."
-msgstr ""
-
-#: wt-status.c:1530
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1533
-msgid "  (run \"git revert --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1536
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1538
-msgid "  (use \"git revert --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1540
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-
-#: wt-status.c:1550
-#, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
-
-#: wt-status.c:1554
-msgid "You are currently bisecting."
-msgstr ""
-
-#: wt-status.c:1557
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr ""
-
-#: wt-status.c:1568
-msgid "You are in a sparse checkout."
-msgstr ""
-
-#: wt-status.c:1571
-#, c-format
-msgid "You are in a sparse checkout with %d%% of tracked files present."
-msgstr ""
-
-#: wt-status.c:1815
-msgid "On branch "
-msgstr ""
-
-#: wt-status.c:1822
-msgid "interactive rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1824
-msgid "rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1829
-msgid "HEAD detached at "
-msgstr ""
-
-#: wt-status.c:1831
-msgid "HEAD detached from "
-msgstr ""
-
-#: wt-status.c:1834
-msgid "Not currently on any branch."
-msgstr ""
-
-#: wt-status.c:1851
-msgid "Initial commit"
-msgstr ""
-
-#: wt-status.c:1852
-msgid "No commits yet"
-msgstr ""
-
-#: wt-status.c:1866
-msgid "Untracked files"
-msgstr ""
-
-#: wt-status.c:1868
-msgid "Ignored files"
-msgstr ""
-
-#: wt-status.c:1872
-#, c-format
-msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-
-#: wt-status.c:1878
-#, c-format
-msgid "Untracked files not listed%s"
-msgstr ""
-
-#: wt-status.c:1880
-msgid " (use -u option to show untracked files)"
-msgstr ""
-
-#: wt-status.c:1886
-msgid "No changes"
-msgstr ""
-
-#: wt-status.c:1891
-#, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-
-#: wt-status.c:1895
-#, c-format
-msgid "no changes added to commit\n"
-msgstr ""
-
-#: wt-status.c:1899
-#, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-
-#: wt-status.c:1903
-#, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr ""
-
-#: wt-status.c:1907
-#, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-
-#: wt-status.c:1911 wt-status.c:1917
-#, c-format
-msgid "nothing to commit\n"
-msgstr ""
-
-#: wt-status.c:1914
-#, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-
-#: wt-status.c:1919
-#, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr ""
-
-#: wt-status.c:2024
-msgid "No commits yet on "
-msgstr ""
-
-#: wt-status.c:2028
-msgid "HEAD (no branch)"
-msgstr ""
-
-#: wt-status.c:2059
-msgid "different"
-msgstr ""
-
-#: wt-status.c:2061 wt-status.c:2069
-msgid "behind "
-msgstr ""
-
-#: wt-status.c:2064 wt-status.c:2067
-msgid "ahead "
-msgstr ""
-
-#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2605
-#, c-format
-msgid "cannot %s: You have unstaged changes."
-msgstr ""
-
-#: wt-status.c:2611
-msgid "additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: wt-status.c:2613
-#, c-format
-msgid "cannot %s: Your index contains uncommitted changes."
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:205
-msgid "could not send IPC command"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:212
-msgid "could not read IPC response"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:892
-#, c-format
-msgid "could not start accept_thread '%s'"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:904
-#, c-format
-msgid "could not start worker[0] for '%s'"
-msgstr ""
-
-#: compat/precompose_utf8.c:58 builtin/clone.c:353
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:355
-msgid "Unable to create FSEventStream."
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:403
-msgid "Failed to start the FSEventStream"
-msgstr ""
-
-#: builtin/add.c:26
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/add.c:63
-#, c-format
-msgid "cannot chmod %cx '%s'"
-msgstr ""
-
-#: builtin/add.c:105
-#, c-format
-msgid "unexpected diff status %c"
-msgstr ""
-
-#: builtin/add.c:110 builtin/commit.c:299
-msgid "updating files failed"
-msgstr ""
-
-#: builtin/add.c:120
-#, c-format
-msgid "remove '%s'\n"
-msgstr ""
-
-#: builtin/add.c:204
-msgid "Unstaged changes after refreshing the index:"
-msgstr ""
-
-#: builtin/add.c:312 builtin/rev-parse.c:993
-msgid "Could not read the index"
-msgstr ""
-
-#: builtin/add.c:325
-msgid "Could not write patch"
-msgstr ""
-
-#: builtin/add.c:328
-msgid "editing patch failed"
-msgstr ""
-
-#: builtin/add.c:331
-#, c-format
-msgid "Could not stat '%s'"
-msgstr ""
-
-#: builtin/add.c:333
-msgid "Empty patch. Aborted."
-msgstr ""
-
-#: builtin/add.c:339
-#, c-format
-msgid "Could not apply '%s'"
-msgstr ""
-
-#: builtin/add.c:347
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-
-#: builtin/add.c:367 builtin/clean.c:927 builtin/fetch.c:175 builtin/mv.c:124
-#: builtin/prune-packed.c:14 builtin/pull.c:208 builtin/push.c:550
-#: builtin/remote.c:1454 builtin/rm.c:244 builtin/send-pack.c:194
-msgid "dry run"
-msgstr ""
-
-#: builtin/add.c:368 builtin/check-ignore.c:22 builtin/commit.c:1483
-#: builtin/count-objects.c:98 builtin/fsck.c:789 builtin/log.c:2338
-#: builtin/mv.c:123 builtin/read-tree.c:120
-msgid "be verbose"
-msgstr ""
-
-#: builtin/add.c:370
-msgid "interactive picking"
-msgstr ""
-
-#: builtin/add.c:371 builtin/checkout.c:1599 builtin/reset.c:417
-msgid "select hunks interactively"
-msgstr ""
-
-#: builtin/add.c:372
-msgid "edit current diff and apply"
-msgstr ""
-
-#: builtin/add.c:373
-msgid "allow adding otherwise ignored files"
-msgstr ""
-
-#: builtin/add.c:374
-msgid "update tracked files"
-msgstr ""
-
-#: builtin/add.c:375
-msgid "renormalize EOL of tracked files (implies -u)"
-msgstr ""
-
-#: builtin/add.c:376
-msgid "record only the fact that the path will be added later"
-msgstr ""
-
-#: builtin/add.c:377
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-
-#: builtin/add.c:380
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-
-#: builtin/add.c:382
-msgid "don't add, only refresh the index"
-msgstr ""
-
-#: builtin/add.c:383
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-
-#: builtin/add.c:384
-msgid "check if - even missing - files are ignored in dry run"
-msgstr ""
-
-#: builtin/add.c:385 builtin/mv.c:128 builtin/rm.c:251
-msgid "allow updating entries outside of the sparse-checkout cone"
-msgstr ""
-
-#: builtin/add.c:387 builtin/update-index.c:1023
-msgid "override the executable bit of the listed files"
-msgstr ""
-
-#: builtin/add.c:389
-msgid "warn when adding an embedded repository"
-msgstr ""
-
-#: builtin/add.c:407
-#, c-format
-msgid ""
-"You've added another git repository inside your current repository.\n"
-"Clones of the outer repository will not contain the contents of\n"
-"the embedded repository and will not know how to obtain it.\n"
-"If you meant to add a submodule, use:\n"
-"\n"
-"\tgit submodule add <url> %s\n"
-"\n"
-"If you added this path by mistake, you can remove it from the\n"
-"index with:\n"
-"\n"
-"\tgit rm --cached %s\n"
-"\n"
-"See \"git help submodule\" for more information."
-msgstr ""
-
-#: builtin/add.c:436
-#, c-format
-msgid "adding embedded git repository: %s"
-msgstr ""
-
-#: builtin/add.c:456
-msgid ""
-"Use -f if you really want to add them.\n"
-"Turn this message off by running\n"
-"\"git config advice.addIgnoredFile false\""
-msgstr ""
-
-#: builtin/add.c:471
-msgid "adding files failed"
-msgstr ""
-
-#: builtin/add.c:534
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr ""
-
-#: builtin/add.c:555 builtin/checkout.c:1770 builtin/commit.c:365
-#: builtin/reset.c:436 builtin/rm.c:275 builtin/stash.c:1702
-#, c-format
-msgid "'%s' and pathspec arguments cannot be used together"
-msgstr ""
-
-#: builtin/add.c:566
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr ""
-
-#: builtin/add.c:568
-msgid ""
-"Maybe you wanted to say 'git add .'?\n"
-"Turn this message off by running\n"
-"\"git config advice.addEmptyPathspec false\""
-msgstr ""
-
-#: builtin/am.c:393
-msgid "could not parse author script"
-msgstr ""
-
-#: builtin/am.c:483
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr ""
-
-#: builtin/am.c:525
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr ""
-
-#: builtin/am.c:563
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#: builtin/am.c:589
-msgid "fseek failed"
-msgstr ""
-
-#: builtin/am.c:777
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr ""
-
-#: builtin/am.c:842
-msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
-
-#: builtin/am.c:890
-msgid "invalid timestamp"
-msgstr ""
-
-#: builtin/am.c:895 builtin/am.c:907
-msgid "invalid Date line"
-msgstr ""
-
-#: builtin/am.c:902
-msgid "invalid timezone offset"
-msgstr ""
-
-#: builtin/am.c:995
-msgid "Patch format detection failed."
-msgstr ""
-
-#: builtin/am.c:1000 builtin/clone.c:306
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr ""
-
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr ""
-
-#: builtin/am.c:1154
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr ""
-
-#: builtin/am.c:1155
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-
-#: builtin/am.c:1160
-#, c-format
-msgid "To record the empty patch as an empty commit, run \"%s --allow-empty\"."
-msgstr ""
-
-#: builtin/am.c:1162
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-
-#: builtin/am.c:1257
-msgid "Patch sent with format=flowed; space at the end of lines might be lost."
-msgstr ""
-
-#: builtin/am.c:1345
-#, c-format
-msgid "missing author line in commit %s"
-msgstr ""
-
-#: builtin/am.c:1348
-#, c-format
-msgid "invalid ident line: %.*s"
-msgstr ""
-
-#: builtin/am.c:1567
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-
-#: builtin/am.c:1569
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-
-#: builtin/am.c:1588
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-
-#: builtin/am.c:1594
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-
-#: builtin/am.c:1620
-msgid "Failed to merge in the changes."
-msgstr ""
-
-#: builtin/am.c:1652
-msgid "applying to an empty history"
-msgstr ""
-
-#: builtin/am.c:1704 builtin/am.c:1708
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr ""
-
-#: builtin/am.c:1726
-msgid "Commit Body is:"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1736
-#, c-format
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-
-#: builtin/am.c:1782 builtin/commit.c:410
-msgid "unable to write index file"
-msgstr ""
-
-#: builtin/am.c:1786
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr ""
-
-#: builtin/am.c:1828
-#, c-format
-msgid "Skipping: %.*s"
-msgstr ""
-
-#: builtin/am.c:1833
-#, c-format
-msgid "Creating an empty commit: %.*s"
-msgstr ""
-
-#: builtin/am.c:1837
-msgid "Patch is empty."
-msgstr ""
-
-#: builtin/am.c:1848 builtin/am.c:1917
-#, c-format
-msgid "Applying: %.*s"
-msgstr ""
-
-#: builtin/am.c:1865
-msgid "No changes -- Patch already applied."
-msgstr ""
-
-#: builtin/am.c:1871
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr ""
-
-#: builtin/am.c:1875
-msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
-msgstr ""
-
-#: builtin/am.c:1921
-msgid "No changes - recorded it as an empty commit."
-msgstr ""
-
-#: builtin/am.c:1923
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"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 ""
-
-#: builtin/am.c:1931
-msgid ""
-"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."
-msgstr ""
-
-#: builtin/am.c:2039 builtin/am.c:2043 builtin/am.c:2055 builtin/reset.c:455
-#: builtin/reset.c:463
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr ""
-
-#: builtin/am.c:2091 builtin/am.c:2167
-msgid "failed to clean index"
-msgstr ""
-
-#: builtin/am.c:2135
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-
-#: builtin/am.c:2292
-#, c-format
-msgid "options '%s=%s' and '%s=%s' cannot be used together"
-msgstr ""
-
-#: builtin/am.c:2323
-msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
-msgstr ""
-
-#: builtin/am.c:2324
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr ""
-
-#: builtin/am.c:2330
-msgid "run interactively"
-msgstr ""
-
-#: builtin/am.c:2332
-msgid "historical option -- no-op"
-msgstr ""
-
-#: builtin/am.c:2334
-msgid "allow fall back on 3way merging if needed"
-msgstr ""
-
-#: builtin/am.c:2335 builtin/init-db.c:547 builtin/prune-packed.c:16
-#: builtin/repack.c:646 builtin/stash.c:946
-msgid "be quiet"
-msgstr ""
-
-#: builtin/am.c:2337
-msgid "add a Signed-off-by trailer to the commit message"
-msgstr ""
-
-#: builtin/am.c:2340
-msgid "recode into utf8 (default)"
-msgstr ""
-
-#: builtin/am.c:2342
-msgid "pass -k flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2344
-msgid "pass -b flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2346
-msgid "pass -m flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2348
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr ""
-
-#: builtin/am.c:2351
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-
-#: builtin/am.c:2354
-msgid "strip everything before a scissors line"
-msgstr ""
-
-#: builtin/am.c:2356
-msgid "pass it through git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2359 builtin/am.c:2362 builtin/am.c:2365 builtin/am.c:2368
-#: builtin/am.c:2371 builtin/am.c:2374 builtin/am.c:2377 builtin/am.c:2380
-#: builtin/am.c:2386
-msgid "pass it through git-apply"
-msgstr ""
-
-#: builtin/am.c:2376 builtin/commit.c:1514 builtin/fmt-merge-msg.c:18
-#: builtin/fmt-merge-msg.c:21 builtin/grep.c:920 builtin/merge.c:263
-#: builtin/pull.c:142 builtin/pull.c:204 builtin/pull.c:221
-#: builtin/rebase.c:1074 builtin/repack.c:657 builtin/repack.c:661
-#: builtin/repack.c:663 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:446 parse-options.h:159 parse-options.h:180
-#: parse-options.h:348
-msgid "n"
-msgstr ""
-
-#: builtin/am.c:2382 builtin/branch.c:695 builtin/bugreport.c:109
-#: builtin/cat-file.c:848 builtin/cat-file.c:852 builtin/cat-file.c:856
-#: builtin/for-each-ref.c:41 builtin/ls-tree.c:357 builtin/replace.c:555
-#: builtin/tag.c:480 builtin/verify-tag.c:38
-msgid "format"
-msgstr ""
-
-#: builtin/am.c:2383
-msgid "format the patch(es) are in"
-msgstr ""
-
-#: builtin/am.c:2389
-msgid "override error message when patch failure occurs"
-msgstr ""
-
-#: builtin/am.c:2391
-msgid "continue applying patches after resolving a conflict"
-msgstr ""
-
-#: builtin/am.c:2394
-msgid "synonyms for --continue"
-msgstr ""
-
-#: builtin/am.c:2397
-msgid "skip the current patch"
-msgstr ""
-
-#: builtin/am.c:2400
-msgid "restore the original branch and abort the patching operation"
-msgstr ""
-
-#: builtin/am.c:2403
-msgid "abort the patching operation but keep HEAD where it is"
-msgstr ""
-
-#: builtin/am.c:2407
-msgid "show the patch being applied"
-msgstr ""
-
-#: builtin/am.c:2411
-msgid "record the empty patch as an empty commit"
-msgstr ""
-
-#: builtin/am.c:2415
-msgid "lie about committer date"
-msgstr ""
-
-#: builtin/am.c:2417
-msgid "use current timestamp for author date"
-msgstr ""
-
-#: builtin/am.c:2419 builtin/commit-tree.c:118 builtin/commit.c:1642
-#: builtin/merge.c:302 builtin/pull.c:179 builtin/rebase.c:1127
-#: builtin/revert.c:117 builtin/tag.c:461
-msgid "key-id"
-msgstr ""
-
-#: builtin/am.c:2420 builtin/rebase.c:1128
-msgid "GPG-sign commits"
-msgstr ""
-
-#: builtin/am.c:2423
-msgid "how to handle empty patches"
-msgstr ""
-
-#: builtin/am.c:2426
-msgid "(internal use for git-rebase)"
-msgstr ""
-
-#: builtin/am.c:2444
-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 ""
-
-#: builtin/am.c:2451
-msgid "failed to read the index"
-msgstr ""
-
-#: builtin/am.c:2466
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-
-#: builtin/am.c:2490
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-
-#: builtin/am.c:2496
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
-
-#: builtin/am.c:2506
-msgid "interactive mode requires patches on the command line"
-msgstr ""
-
-#: builtin/apply.c:8
-msgid "git apply [<options>] [<patch>...]"
-msgstr ""
-
-#: builtin/archive.c:18
-msgid "could not redirect output"
-msgstr ""
-
-#: builtin/archive.c:35
-msgid "git archive: Remote with no URL"
-msgstr ""
-
-#: builtin/archive.c:59
-msgid "git archive: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: builtin/archive.c:62
-#, c-format
-msgid "git archive: NACK %s"
-msgstr ""
-
-#: builtin/archive.c:63
-msgid "git archive: protocol error"
-msgstr ""
-
-#: builtin/archive.c:67
-msgid "git archive: expected a flush"
-msgstr ""
-
-#: builtin/bisect--helper.c:24
-msgid "git bisect--helper --bisect-reset [<commit>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:26
-msgid ""
-"git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
-"=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
-"[<paths>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:29
-msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:30
-msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:31
-msgid "git bisect--helper --bisect-replay <filename>"
-msgstr ""
-
-#: builtin/bisect--helper.c:32
-msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:34
-msgid "git bisect--helper --bisect-run <cmd>..."
-msgstr ""
-
-#: builtin/bisect--helper.c:109
-#, c-format
-msgid "cannot open file '%s' in mode '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:116
-#, c-format
-msgid "could not write to file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:154
-#, c-format
-msgid "cannot open file '%s' for reading"
-msgstr ""
-
-#: builtin/bisect--helper.c:170
-#, c-format
-msgid "'%s' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:174
-#, c-format
-msgid "can't use the builtin command '%s' as a term"
-msgstr ""
-
-#: builtin/bisect--helper.c:184
-#, c-format
-msgid "can't change the meaning of the term '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:194
-msgid "please use two different terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:210
-#, c-format
-msgid "We are not bisecting.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:218
-#, c-format
-msgid "'%s' is not a valid commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:227
-#, c-format
-msgid ""
-"could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:271
-#, c-format
-msgid "Bad bisect_write argument: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:276
-#, c-format
-msgid "couldn't get the oid of the rev '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:288
-#, c-format
-msgid "couldn't open the file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:314
-#, c-format
-msgid "Invalid command: you're currently in a %s/%s bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:341
-#, c-format
-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 ""
-
-#: builtin/bisect--helper.c:345
-#, c-format
-msgid ""
-"You need to start by \"git bisect start\".\n"
-"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 ""
-
-#: builtin/bisect--helper.c:365
-#, c-format
-msgid "bisecting only with a %s commit"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:373
-msgid "Are you sure [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:434
-msgid "no terms defined"
-msgstr ""
-
-#: builtin/bisect--helper.c:437
-#, c-format
-msgid ""
-"Your current terms are %s for the old state\n"
-"and %s for the new state.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:447
-#, c-format
-msgid ""
-"invalid argument %s for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
-msgstr ""
-
-#: builtin/bisect--helper.c:514 builtin/bisect--helper.c:1038
-msgid "revision walk setup failed\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:536
-#, c-format
-msgid "could not open '%s' for appending"
-msgstr ""
-
-#: builtin/bisect--helper.c:655 builtin/bisect--helper.c:668
-msgid "'' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:678
-#, c-format
-msgid "unrecognized option: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:682
-#, c-format
-msgid "'%s' does not appear to be a valid revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:713
-msgid "bad HEAD - I need a HEAD"
-msgstr ""
-
-#: builtin/bisect--helper.c:728
-#, c-format
-msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:749
-msgid "won't bisect on cg-seek'ed tree"
-msgstr ""
-
-#: builtin/bisect--helper.c:752
-msgid "bad HEAD - strange symbolic ref"
-msgstr ""
-
-#: builtin/bisect--helper.c:772
-#, c-format
-msgid "invalid ref: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:830
-msgid "You need to start by \"git bisect start\"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:841
-msgid "Do you want me to do it for you [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:859
-msgid "Please call `--bisect-state` with at least one argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:872
-#, c-format
-msgid "'git bisect %s' can take only one argument."
-msgstr ""
-
-#: builtin/bisect--helper.c:884 builtin/bisect--helper.c:897
-#, c-format
-msgid "Bad rev input: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:904
-#, c-format
-msgid "Bad rev input (not a commit): %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:936
-msgid "We are not bisecting."
-msgstr ""
-
-#: builtin/bisect--helper.c:986
-#, c-format
-msgid "'%s'?? what are you talking about?"
-msgstr ""
-
-#: builtin/bisect--helper.c:998
-#, c-format
-msgid "cannot read file '%s' for replaying"
-msgstr ""
-
-#: builtin/bisect--helper.c:1120 builtin/bisect--helper.c:1152
-#, c-format
-msgid "running %s\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:1145 builtin/bisect--helper.c:1335
-msgid "bisect run failed: no command provided."
-msgstr ""
-
-#: builtin/bisect--helper.c:1166
-#, c-format
-msgid "unable to verify '%s' on good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1172
-#, c-format
-msgid "bogus exit code %d for good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1180
-#, c-format
-msgid "bisect run failed: exit code %d from '%s' is < 0 or >= 128"
-msgstr ""
-
-#: builtin/bisect--helper.c:1195
-#, c-format
-msgid "cannot open file '%s' for writing"
-msgstr ""
-
-#: builtin/bisect--helper.c:1213
-msgid "bisect run cannot continue any more"
-msgstr ""
-
-#: builtin/bisect--helper.c:1215
-#, c-format
-msgid "bisect run success"
-msgstr ""
-
-#: builtin/bisect--helper.c:1218
-#, c-format
-msgid "bisect found first bad commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1221
-#, c-format
-msgid ""
-"bisect run failed: 'git bisect--helper --bisect-state %s' exited with error "
-"code %d"
-msgstr ""
-
-#: builtin/bisect--helper.c:1253
-msgid "reset the bisection state"
-msgstr ""
-
-#: builtin/bisect--helper.c:1255
-msgid "check whether bad or good terms exist"
-msgstr ""
-
-#: builtin/bisect--helper.c:1257
-msgid "print out the bisect terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:1259
-msgid "start the bisect session"
-msgstr ""
-
-#: builtin/bisect--helper.c:1261
-msgid "find the next bisection commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1263
-msgid "mark the state of ref (or refs)"
-msgstr ""
-
-#: builtin/bisect--helper.c:1265
-msgid "list the bisection steps so far"
-msgstr ""
-
-#: builtin/bisect--helper.c:1267
-msgid "replay the bisection process from the given file"
-msgstr ""
-
-#: builtin/bisect--helper.c:1269
-msgid "skip some commits for checkout"
-msgstr ""
-
-#: builtin/bisect--helper.c:1271
-msgid "visualize the bisection"
-msgstr ""
-
-#: builtin/bisect--helper.c:1273
-msgid "use <cmd>... to automatically bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:1275
-msgid "no log for BISECT_WRITE"
-msgstr ""
-
-#: builtin/bisect--helper.c:1290
-msgid "--bisect-reset requires either no argument or a commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1295
-msgid "--bisect-terms requires 0 or 1 argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:1304
-msgid "--bisect-next requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1315
-msgid "--bisect-log requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1320
-msgid "no logfile given"
-msgstr ""
-
-#: builtin/blame.c:32
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr ""
-
-#: builtin/blame.c:37
-msgid "<rev-opts> are documented in git-rev-list(1)"
-msgstr ""
-
-#: builtin/blame.c:406
-#, c-format
-msgid "expecting a color: %s"
-msgstr ""
-
-#: builtin/blame.c:413
-msgid "must end with a color"
-msgstr ""
-
-#: builtin/blame.c:842
-#, c-format
-msgid "cannot find revision %s to ignore"
-msgstr ""
-
-#: builtin/blame.c:864
-msgid "show blame entries as we find them, incrementally"
-msgstr ""
-
-#: builtin/blame.c:865
-msgid "do not show object names of boundary commits (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:866
-msgid "do not treat root commits as boundaries (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:867
-msgid "show work cost statistics"
-msgstr ""
-
-#: builtin/blame.c:868 builtin/checkout.c:1554 builtin/clone.c:98
-#: builtin/commit-graph.c:75 builtin/commit-graph.c:228 builtin/fetch.c:181
-#: builtin/merge.c:301 builtin/multi-pack-index.c:103
-#: builtin/multi-pack-index.c:154 builtin/multi-pack-index.c:180
-#: builtin/multi-pack-index.c:208 builtin/pull.c:120 builtin/push.c:566
-#: builtin/remote.c:683 builtin/send-pack.c:202
-msgid "force progress reporting"
-msgstr ""
-
-#: builtin/blame.c:869
-msgid "show output score for blame entries"
-msgstr ""
-
-#: builtin/blame.c:870
-msgid "show original filename (Default: auto)"
-msgstr ""
-
-#: builtin/blame.c:871
-msgid "show original linenumber (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:872
-msgid "show in a format designed for machine consumption"
-msgstr ""
-
-#: builtin/blame.c:873
-msgid "show porcelain format with per-line commit information"
-msgstr ""
-
-#: builtin/blame.c:874
-msgid "use the same output mode as git-annotate (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:875
-msgid "show raw timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:876
-msgid "show long commit SHA1 (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:877
-msgid "suppress author name and timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:878
-msgid "show author email instead of name (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:879
-msgid "ignore whitespace differences"
-msgstr ""
-
-#: builtin/blame.c:880 builtin/log.c:1857
-msgid "rev"
-msgstr ""
-
-#: builtin/blame.c:880
-msgid "ignore <rev> when blaming"
-msgstr ""
-
-#: builtin/blame.c:881
-msgid "ignore revisions from <file>"
-msgstr ""
-
-#: builtin/blame.c:882
-msgid "color redundant metadata from previous line differently"
-msgstr ""
-
-#: builtin/blame.c:883
-msgid "color lines by age"
-msgstr ""
-
-#: builtin/blame.c:884
-msgid "spend extra cycles to find better match"
-msgstr ""
-
-#: builtin/blame.c:885
-msgid "use revisions from <file> instead of calling git-rev-list"
-msgstr ""
-
-#: builtin/blame.c:886
-msgid "use <file>'s contents as the final image"
-msgstr ""
-
-#: builtin/blame.c:887 builtin/blame.c:888
-msgid "score"
-msgstr ""
-
-#: builtin/blame.c:887
-msgid "find line copies within and across files"
-msgstr ""
-
-#: builtin/blame.c:888
-msgid "find line movements within and across files"
-msgstr ""
-
-#: builtin/blame.c:889
-msgid "range"
-msgstr ""
-
-#: builtin/blame.c:890
-msgid "process only line range <start>,<end> or function :<funcname>"
-msgstr ""
-
-#: builtin/blame.c:949
-msgid "--progress can't be used with --incremental or porcelain formats"
-msgstr ""
-
-#. TRANSLATORS: This string is used to tell us the
-#. maximum display width for a relative timestamp in
-#. "git blame" output.  For C locale, "4 years, 11
-#. months ago", which takes 22 places, is the longest
-#. among various forms of relative timestamps, but
-#. your language may need more or fewer display
-#. columns.
-#.
-#: builtin/blame.c:1000
-msgid "4 years, 11 months ago"
-msgstr ""
-
-#: builtin/blame.c:1116
-#, c-format
-msgid "file %s has only %lu line"
-msgid_plural "file %s has only %lu lines"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/blame.c:1161
-msgid "Blaming lines"
-msgstr ""
-
-#: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--merged] [--no-merged]"
-msgstr ""
-
-#: builtin/branch.c:30
-msgid ""
-"git branch [<options>] [-f] [--recurse-submodules] <branch-name> [<start-"
-"point>]"
-msgstr ""
-
-#: builtin/branch.c:31
-msgid "git branch [<options>] [-l] [<pattern>...]"
-msgstr ""
-
-#: builtin/branch.c:32
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr ""
-
-#: builtin/branch.c:33
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:34
-msgid "git branch [<options>] (-c | -C) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:35
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr ""
-
-#: builtin/branch.c:36
-msgid "git branch [<options>] [-r | -a] [--format]"
-msgstr ""
-
-#: builtin/branch.c:165
-#, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:169
-#, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:183
-#, c-format
-msgid "Couldn't look up commit object for '%s'"
-msgstr ""
-
-#: builtin/branch.c:187
-#, c-format
-msgid ""
-"The branch '%s' is not fully merged.\n"
-"If you are sure you want to delete it, run 'git branch -D %s'."
-msgstr ""
-
-#: builtin/branch.c:200
-msgid "Update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:235
-msgid "cannot use -a with -d"
-msgstr ""
-
-#: builtin/branch.c:242
-msgid "Couldn't look up commit object for HEAD"
-msgstr ""
-
-#: builtin/branch.c:259
-#, c-format
-msgid "Cannot delete branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/branch.c:274
-#, c-format
-msgid "remote-tracking branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:275
-#, c-format
-msgid "branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:306
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:307
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:457 builtin/tag.c:64
-msgid "unable to parse format string"
-msgstr ""
-
-#: builtin/branch.c:488
-msgid "could not resolve HEAD"
-msgstr ""
-
-#: builtin/branch.c:494
-#, c-format
-msgid "HEAD (%s) points outside of refs/heads/"
-msgstr ""
-
-#: builtin/branch.c:509
-#, c-format
-msgid "Branch %s is being rebased at %s"
-msgstr ""
-
-#: builtin/branch.c:513
-#, c-format
-msgid "Branch %s is being bisected at %s"
-msgstr ""
-
-#: builtin/branch.c:530
-msgid "cannot copy the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:532
-msgid "cannot rename the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:543
-#, c-format
-msgid "Invalid branch name: '%s'"
-msgstr ""
-
-#: builtin/branch.c:572
-msgid "Branch rename failed"
-msgstr ""
-
-#: builtin/branch.c:574
-msgid "Branch copy failed"
-msgstr ""
-
-#: builtin/branch.c:578
-#, c-format
-msgid "Created a copy of a misnamed branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:581
-#, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
-
-#: builtin/branch.c:587
-#, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
-
-#: builtin/branch.c:596
-msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:598
-msgid "Branch is copied, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:614
-#, c-format
-msgid ""
-"Please edit the description for the branch\n"
-"  %s\n"
-"Lines starting with '%c' will be stripped.\n"
-msgstr ""
-
-#: builtin/branch.c:651
-msgid "Generic options"
-msgstr ""
-
-#: builtin/branch.c:653
-msgid "show hash and subject, give twice for upstream branch"
-msgstr ""
-
-#: builtin/branch.c:654
-msgid "suppress informational messages"
-msgstr ""
-
-#: builtin/branch.c:656 builtin/checkout.c:1571
-#: builtin/submodule--helper.c:3077
-msgid "set branch tracking configuration"
-msgstr ""
-
-#: builtin/branch.c:659
-msgid "do not use"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "upstream"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "change the upstream info"
-msgstr ""
-
-#: builtin/branch.c:662
-msgid "unset the upstream info"
-msgstr ""
-
-#: builtin/branch.c:663
-msgid "use colored output"
-msgstr ""
-
-#: builtin/branch.c:664
-msgid "act on remote-tracking branches"
-msgstr ""
-
-#: builtin/branch.c:666 builtin/branch.c:668
-msgid "print only branches that contain the commit"
-msgstr ""
-
-#: builtin/branch.c:667 builtin/branch.c:669
-msgid "print only branches that don't contain the commit"
-msgstr ""
-
-#: builtin/branch.c:672
-msgid "Specific git-branch actions:"
-msgstr ""
-
-#: builtin/branch.c:673
-msgid "list both remote-tracking and local branches"
-msgstr ""
-
-#: builtin/branch.c:675
-msgid "delete fully merged branch"
-msgstr ""
-
-#: builtin/branch.c:676
-msgid "delete branch (even if not merged)"
-msgstr ""
-
-#: builtin/branch.c:677
-msgid "move/rename a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:678
-msgid "move/rename a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:679
-msgid "copy a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:680
-msgid "copy a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:681
-msgid "list branch names"
-msgstr ""
-
-#: builtin/branch.c:682
-msgid "show current branch name"
-msgstr ""
-
-#: builtin/branch.c:683 builtin/submodule--helper.c:3075
-msgid "create the branch's reflog"
-msgstr ""
-
-#: builtin/branch.c:685
-msgid "edit the description for the branch"
-msgstr ""
-
-#: builtin/branch.c:686
-msgid "force creation, move/rename, deletion"
-msgstr ""
-
-#: builtin/branch.c:687
-msgid "print only branches that are merged"
-msgstr ""
-
-#: builtin/branch.c:688
-msgid "print only branches that are not merged"
-msgstr ""
-
-#: builtin/branch.c:689
-msgid "list branches in columns"
-msgstr ""
-
-#: builtin/branch.c:691 builtin/for-each-ref.c:45 builtin/notes.c:413
-#: builtin/notes.c:416 builtin/notes.c:579 builtin/notes.c:582
-#: builtin/tag.c:476
-msgid "object"
-msgstr ""
-
-#: builtin/branch.c:692
-msgid "print only branches of the object"
-msgstr ""
-
-#: builtin/branch.c:693 builtin/for-each-ref.c:51 builtin/tag.c:483
-msgid "sorting and filtering are case insensitive"
-msgstr ""
-
-#: builtin/branch.c:694 builtin/ls-files.c:667
-msgid "recurse through submodules"
-msgstr ""
-
-#: builtin/branch.c:695 builtin/for-each-ref.c:41 builtin/ls-tree.c:358
-#: builtin/tag.c:481 builtin/verify-tag.c:38
-msgid "format to use for the output"
-msgstr ""
-
-#: builtin/branch.c:718 builtin/clone.c:684
-msgid "HEAD not found below refs/heads!"
-msgstr ""
-
-#: builtin/branch.c:739
-msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
-msgstr ""
-
-#: builtin/branch.c:741
-msgid "--recurse-submodules can only be used to create branches"
-msgstr ""
-
-#: builtin/branch.c:770 builtin/branch.c:826 builtin/branch.c:835
-msgid "branch name required"
-msgstr ""
-
-#: builtin/branch.c:802
-msgid "Cannot give description to detached HEAD"
-msgstr ""
-
-#: builtin/branch.c:807
-msgid "cannot edit description of more than one branch"
-msgstr ""
-
-#: builtin/branch.c:814
-#, c-format
-msgid "No commit on branch '%s' yet."
-msgstr ""
-
-#: builtin/branch.c:817
-#, c-format
-msgid "No branch named '%s'."
-msgstr ""
-
-#: builtin/branch.c:832
-msgid "too many branches for a copy operation"
-msgstr ""
-
-#: builtin/branch.c:841
-msgid "too many arguments for a rename operation"
-msgstr ""
-
-#: builtin/branch.c:846
-msgid "too many arguments to set new upstream"
-msgstr ""
-
-#: builtin/branch.c:850
-#, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:853 builtin/branch.c:873
-#, c-format
-msgid "no such branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:857
-#, c-format
-msgid "branch '%s' does not exist"
-msgstr ""
-
-#: builtin/branch.c:867
-msgid "too many arguments to unset upstream"
-msgstr ""
-
-#: builtin/branch.c:871
-msgid "could not unset upstream of HEAD when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:877
-#, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr ""
-
-#: builtin/branch.c:890
-msgid ""
-"The -a, and -r, options to 'git branch' do not take a branch name.\n"
-"Did you mean to use: -a|-r --list <pattern>?"
-msgstr ""
-
-#: builtin/branch.c:894
-msgid ""
-"the '--set-upstream' option is no longer supported. Please use '--track' or "
-"'--set-upstream-to' instead."
-msgstr ""
-
-#: builtin/bugreport.c:16
-msgid "git version:\n"
-msgstr ""
-
-#: builtin/bugreport.c:22
-#, c-format
-msgid "uname() failed with error '%s' (%d)\n"
-msgstr ""
-
-#: builtin/bugreport.c:32
-msgid "compiler info: "
-msgstr ""
-
-#: builtin/bugreport.c:35
-msgid "libc info: "
-msgstr ""
-
-#: builtin/bugreport.c:49
-msgid "not run from a git repository - no hooks to show\n"
-msgstr ""
-
-#: builtin/bugreport.c:62
-msgid "git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"
-msgstr ""
-
-#: builtin/bugreport.c:69
-msgid ""
-"Thank you for filling out a Git bug report!\n"
-"Please answer the following questions to help us understand your issue.\n"
-"\n"
-"What did you do before the bug happened? (Steps to reproduce your issue)\n"
-"\n"
-"What did you expect to happen? (Expected behavior)\n"
-"\n"
-"What happened instead? (Actual behavior)\n"
-"\n"
-"What's different between what you expected and what actually happened?\n"
-"\n"
-"Anything else you want to add:\n"
-"\n"
-"Please review the rest of the bug report below.\n"
-"You can delete any lines you don't wish to share.\n"
-msgstr ""
-
-#: builtin/bugreport.c:108
-msgid "specify a destination for the bugreport file"
-msgstr ""
-
-#: builtin/bugreport.c:110
-msgid "specify a strftime format suffix for the filename"
-msgstr ""
-
-#: builtin/bugreport.c:132
-#, c-format
-msgid "could not create leading directories for '%s'"
-msgstr ""
-
-#: builtin/bugreport.c:139
-msgid "System Info"
-msgstr ""
-
-#: builtin/bugreport.c:142
-msgid "Enabled Hooks"
-msgstr ""
-
-#: builtin/bugreport.c:149
-#, c-format
-msgid "unable to write to %s"
-msgstr ""
-
-#: builtin/bugreport.c:159
-#, c-format
-msgid "Created new report at '%s'.\n"
-msgstr ""
-
-#: builtin/bundle.c:15 builtin/bundle.c:23
-msgid "git bundle create [<options>] <file> <git-rev-list args>"
-msgstr ""
-
-#: builtin/bundle.c:16 builtin/bundle.c:28
-msgid "git bundle verify [<options>] <file>"
-msgstr ""
-
-#: builtin/bundle.c:17 builtin/bundle.c:33
-msgid "git bundle list-heads <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:18 builtin/bundle.c:38
-msgid "git bundle unbundle <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:65 builtin/pack-objects.c:3899
-msgid "do not show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:67 builtin/bundle.c:168 builtin/pack-objects.c:3901
-msgid "show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:69 builtin/pack-objects.c:3903
-msgid "show progress meter during object writing phase"
-msgstr ""
-
-#: builtin/bundle.c:72 builtin/pack-objects.c:3906
-msgid "similar to --all-progress when progress meter is shown"
-msgstr ""
-
-#: builtin/bundle.c:74
-msgid "specify bundle format version"
-msgstr ""
-
-#: builtin/bundle.c:94
-msgid "Need a repository to create a bundle."
-msgstr ""
-
-#: builtin/bundle.c:108
-msgid "do not show bundle details"
-msgstr ""
-
-#: builtin/bundle.c:127
-#, c-format
-msgid "%s is okay\n"
-msgstr ""
-
-#: builtin/bundle.c:183
-msgid "Need a repository to unbundle."
-msgstr ""
-
-#: builtin/bundle.c:186
-msgid "Unbundling objects"
-msgstr ""
-
-#: builtin/bundle.c:220 builtin/remote.c:1758
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr ""
-
-#: builtin/cat-file.c:568
-msgid "flush is only for --buffer mode"
-msgstr ""
-
-#: builtin/cat-file.c:612
-msgid "empty command in input"
-msgstr ""
-
-#: builtin/cat-file.c:614
-#, c-format
-msgid "whitespace before command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:623
-#, c-format
-msgid "%s requires arguments"
-msgstr ""
-
-#: builtin/cat-file.c:628
-#, c-format
-msgid "%s takes no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:636
-#, c-format
-msgid "unknown command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:795
-msgid "only one batch option may be specified"
-msgstr ""
-
-#: builtin/cat-file.c:824
-msgid "git cat-file <type> <object>"
-msgstr ""
-
-#: builtin/cat-file.c:825
-msgid "git cat-file (-e | -p) <object>"
-msgstr ""
-
-#: builtin/cat-file.c:826
-msgid "git cat-file (-t | -s) [--allow-unknown-type] <object>"
-msgstr ""
-
-#: builtin/cat-file.c:827
-msgid ""
-"git cat-file (--batch | --batch-check | --batch-command) [--batch-all-"
-"objects]\n"
-"             [--buffer] [--follow-symlinks] [--unordered]\n"
-"             [--textconv | --filters]"
-msgstr ""
-
-#: builtin/cat-file.c:830
-msgid ""
-"git cat-file (--textconv | --filters)\n"
-"             [<rev>:<path|tree-ish> | --path=<path|tree-ish> <rev>]"
-msgstr ""
-
-#: builtin/cat-file.c:836
-msgid "Check object existence or emit object contents"
-msgstr ""
-
-#: builtin/cat-file.c:838
-msgid "check if <object> exists"
-msgstr ""
-
-#: builtin/cat-file.c:839
-msgid "pretty-print <object> content"
-msgstr ""
-
-#: builtin/cat-file.c:841
-msgid "Emit [broken] object attributes"
-msgstr ""
-
-#: builtin/cat-file.c:842
-msgid "show object type (one of 'blob', 'tree', 'commit', 'tag', ...)"
-msgstr ""
-
-#: builtin/cat-file.c:843
-msgid "show object size"
-msgstr ""
-
-#: builtin/cat-file.c:845
-msgid "allow -s and -t to work with broken/corrupt objects"
-msgstr ""
-
-#: builtin/cat-file.c:847
-msgid "Batch objects requested on stdin (or --batch-all-objects)"
-msgstr ""
-
-#: builtin/cat-file.c:849
-msgid "show full <object> or <rev> contents"
-msgstr ""
-
-#: builtin/cat-file.c:853
-msgid "like --batch, but don't emit <contents>"
-msgstr ""
-
-#: builtin/cat-file.c:857
-msgid "read commands from stdin"
-msgstr ""
-
-#: builtin/cat-file.c:861
-msgid "with --batch[-check]: ignores stdin, batches all known objects"
-msgstr ""
-
-#: builtin/cat-file.c:863
-msgid "Change or optimize batch output"
-msgstr ""
-
-#: builtin/cat-file.c:864
-msgid "buffer --batch output"
-msgstr ""
-
-#: builtin/cat-file.c:866
-msgid "follow in-tree symlinks"
-msgstr ""
-
-#: builtin/cat-file.c:868
-msgid "do not order objects before emitting them"
-msgstr ""
-
-#: builtin/cat-file.c:870
-msgid ""
-"Emit object (blob or tree) with conversion or filter (stand-alone, or with "
-"batch)"
-msgstr ""
-
-#: builtin/cat-file.c:872
-msgid "run textconv on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:874
-msgid "run filters on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:875
-msgid "blob|tree"
-msgstr ""
-
-#: builtin/cat-file.c:876
-msgid "use a <path> for (--textconv | --filters); Not with 'batch'"
-msgstr ""
-
-#: builtin/cat-file.c:894
-#, c-format
-msgid "'%s=<%s>' needs '%s' or '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:896
-msgid "path|tree-ish"
-msgstr ""
-
-#: builtin/cat-file.c:903 builtin/cat-file.c:906 builtin/cat-file.c:909
-#, c-format
-msgid "'%s' requires a batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:921
-#, c-format
-msgid "'-%c' is incompatible with batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:924
-msgid "batch modes take no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:932 builtin/cat-file.c:935
-#, c-format
-msgid "<rev> required with '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:938
-#, c-format
-msgid "<object> required with '-%c'"
-msgstr ""
-
-#: builtin/cat-file.c:943 builtin/notes.c:374 builtin/notes.c:429
-#: builtin/notes.c:507 builtin/notes.c:519 builtin/notes.c:596
-#: builtin/notes.c:663 builtin/notes.c:813 builtin/notes.c:965
-#: builtin/notes.c:987 builtin/prune-packed.c:25 builtin/receive-pack.c:2489
-#: builtin/tag.c:592
-msgid "too many arguments"
-msgstr ""
-
-#: builtin/cat-file.c:947
-#, c-format
-msgid "only two arguments allowed in <type> <object> mode, not %d"
-msgstr ""
-
-#: builtin/check-attr.c:13
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr ""
-
-#: builtin/check-attr.c:14
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr ""
-
-#: builtin/check-attr.c:21
-msgid "report all attributes set on file"
-msgstr ""
-
-#: builtin/check-attr.c:22
-msgid "use .gitattributes only from the index"
-msgstr ""
-
-#: builtin/check-attr.c:23 builtin/check-ignore.c:25 builtin/hash-object.c:101
-msgid "read file names from stdin"
-msgstr ""
-
-#: builtin/check-attr.c:25 builtin/check-ignore.c:27
-msgid "terminate input and output records by a NUL character"
-msgstr ""
-
-#: builtin/check-ignore.c:21 builtin/checkout.c:1550 builtin/gc.c:550
-#: builtin/worktree.c:565
-msgid "suppress progress reporting"
-msgstr ""
-
-#: builtin/check-ignore.c:29
-msgid "show non-matching input paths"
-msgstr ""
-
-#: builtin/check-ignore.c:31
-msgid "ignore index when checking"
-msgstr ""
-
-#: builtin/check-ignore.c:165
-msgid "cannot specify pathnames with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:168
-msgid "-z only makes sense with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:170
-msgid "no path specified"
-msgstr ""
-
-#: builtin/check-ignore.c:174
-msgid "--quiet is only valid with a single pathname"
-msgstr ""
-
-#: builtin/check-ignore.c:176
-msgid "cannot have both --quiet and --verbose"
-msgstr ""
-
-#: builtin/check-ignore.c:179
-msgid "--non-matching is only valid with --verbose"
-msgstr ""
-
-#: builtin/check-mailmap.c:9
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr ""
-
-#: builtin/check-mailmap.c:14
-msgid "also read contacts from stdin"
-msgstr ""
-
-#: builtin/check-mailmap.c:25
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr ""
-
-#: builtin/check-mailmap.c:48
-msgid "no contacts specified"
-msgstr ""
-
-#: builtin/checkout--worker.c:110
-msgid "git checkout--worker [<options>]"
-msgstr ""
-
-#: builtin/checkout--worker.c:118 builtin/checkout-index.c:235
-#: builtin/column.c:31 builtin/column.c:32 builtin/submodule--helper.c:1878
-#: builtin/submodule--helper.c:1881 builtin/submodule--helper.c:1889
-#: builtin/submodule--helper.c:2716 builtin/worktree.c:563
-#: builtin/worktree.c:808
-msgid "string"
-msgstr ""
-
-#: builtin/checkout--worker.c:119 builtin/checkout-index.c:236
-msgid "when creating files, prepend <string>"
-msgstr ""
-
-#: builtin/checkout-index.c:184
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/checkout-index.c:201
-msgid "stage should be between 1 and 3 or all"
-msgstr ""
-
-#: builtin/checkout-index.c:219
-msgid "check out all files in the index"
-msgstr ""
-
-#: builtin/checkout-index.c:221
-msgid "do not skip files with skip-worktree set"
-msgstr ""
-
-#: builtin/checkout-index.c:222
-msgid "force overwrite of existing files"
-msgstr ""
-
-#: builtin/checkout-index.c:224
-msgid "no warning for existing files and files not in index"
-msgstr ""
-
-#: builtin/checkout-index.c:226
-msgid "don't checkout new files"
-msgstr ""
-
-#: builtin/checkout-index.c:228
-msgid "update stat information in the index file"
-msgstr ""
-
-#: builtin/checkout-index.c:232
-msgid "read list of paths from the standard input"
-msgstr ""
-
-#: builtin/checkout-index.c:234
-msgid "write the content to temporary files"
-msgstr ""
-
-#: builtin/checkout-index.c:238
-msgid "copy out the files from named stage"
-msgstr ""
-
-#: builtin/checkout.c:34
-msgid "git checkout [<options>] <branch>"
-msgstr ""
-
-#: builtin/checkout.c:35
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr ""
-
-#: builtin/checkout.c:40
-msgid "git switch [<options>] [<branch>]"
-msgstr ""
-
-#: builtin/checkout.c:45
-msgid "git restore [<options>] [--source=<branch>] <file>..."
-msgstr ""
-
-#: builtin/checkout.c:199 builtin/checkout.c:238
-#, c-format
-msgid "path '%s' does not have our version"
-msgstr ""
-
-#: builtin/checkout.c:201 builtin/checkout.c:240
-#, c-format
-msgid "path '%s' does not have their version"
-msgstr ""
-
-#: builtin/checkout.c:217
-#, c-format
-msgid "path '%s' does not have all necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:271
-#, c-format
-msgid "path '%s' does not have necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:291
-#, c-format
-msgid "path '%s': cannot merge"
-msgstr ""
-
-#: builtin/checkout.c:307
-#, c-format
-msgid "Unable to add merge result for '%s'"
-msgstr ""
-
-#: builtin/checkout.c:424
-#, c-format
-msgid "Recreated %d merge conflict"
-msgid_plural "Recreated %d merge conflicts"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:429
-#, c-format
-msgid "Updated %d path from %s"
-msgid_plural "Updated %d paths from %s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:436
-#, c-format
-msgid "Updated %d path from the index"
-msgid_plural "Updated %d paths from the index"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:459 builtin/checkout.c:462 builtin/checkout.c:465
-#: builtin/checkout.c:469
-#, c-format
-msgid "'%s' cannot be used with updating paths"
-msgstr ""
-
-#: builtin/checkout.c:479
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
-msgstr ""
-
-#: builtin/checkout.c:483
-#, c-format
-msgid "neither '%s' or '%s' is specified"
-msgstr ""
-
-#: builtin/checkout.c:487
-#, c-format
-msgid "'%s' must be used when '%s' is not specified"
-msgstr ""
-
-#: builtin/checkout.c:492 builtin/checkout.c:497
-#, c-format
-msgid "'%s' or '%s' cannot be used with %s"
-msgstr ""
-
-#: builtin/checkout.c:571 builtin/checkout.c:578
-#, c-format
-msgid "path '%s' is unmerged"
-msgstr ""
-
-#: builtin/checkout.c:753
-msgid "you need to resolve your current index first"
-msgstr ""
-
-#: builtin/checkout.c:809
-#, c-format
-msgid ""
-"cannot continue with staged changes in the following files:\n"
-"%s"
-msgstr ""
-
-#: builtin/checkout.c:902
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
-msgstr ""
-
-#: builtin/checkout.c:947
-msgid "HEAD is now at"
-msgstr ""
-
-#: builtin/checkout.c:951 builtin/clone.c:615 t/helper/test-fast-rebase.c:203
-msgid "unable to update HEAD"
-msgstr ""
-
-#: builtin/checkout.c:955
-#, c-format
-msgid "Reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:958
-#, c-format
-msgid "Already on '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:962
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:964 builtin/checkout.c:1398
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:966
-#, c-format
-msgid "Switched to branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:1017
-#, c-format
-msgid " ... and %d more.\n"
-msgstr ""
-
-#: builtin/checkout.c:1023
-#, c-format
-msgid ""
-"Warning: you are leaving %d commit behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgid_plural ""
-"Warning: you are leaving %d commits behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1042
-#, c-format
-msgid ""
-"If you want to keep it by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgid_plural ""
-"If you want to keep them by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1077
-msgid "internal error in revision walk"
-msgstr ""
-
-#: builtin/checkout.c:1081
-msgid "Previous HEAD position was"
-msgstr ""
-
-#: builtin/checkout.c:1124 builtin/checkout.c:1393
-msgid "You are on a branch yet to be born"
-msgstr ""
-
-#: builtin/checkout.c:1206
-#, c-format
-msgid ""
-"'%s' could be both a local file and a tracking branch.\n"
-"Please use -- (and optionally --no-guess) to disambiguate"
-msgstr ""
-
-#: builtin/checkout.c:1213
-msgid ""
-"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
-"you can do so by fully qualifying the name with the --track option:\n"
-"\n"
-"    git checkout --track origin/<name>\n"
-"\n"
-"If you'd like to always have checkouts of an ambiguous <name> prefer\n"
-"one remote, e.g. the 'origin' remote, consider setting\n"
-"checkout.defaultRemote=origin in your config."
-msgstr ""
-
-#: builtin/checkout.c:1223
-#, c-format
-msgid "'%s' matched multiple (%d) remote tracking branches"
-msgstr ""
-
-#: builtin/checkout.c:1289
-msgid "only one reference expected"
-msgstr ""
-
-#: builtin/checkout.c:1306
-#, c-format
-msgid "only one reference expected, %d given."
-msgstr ""
-
-#: builtin/checkout.c:1352 builtin/worktree.c:338 builtin/worktree.c:508
-#, c-format
-msgid "invalid reference: %s"
-msgstr ""
-
-#: builtin/checkout.c:1365 builtin/checkout.c:1744
-#, c-format
-msgid "reference is not a tree: %s"
-msgstr ""
-
-#: builtin/checkout.c:1413
-#, c-format
-msgid "a branch is expected, got tag '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1415
-#, c-format
-msgid "a branch is expected, got remote branch '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1417 builtin/checkout.c:1426
-#, c-format
-msgid "a branch is expected, got '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1420
-#, c-format
-msgid "a branch is expected, got commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1429
-msgid ""
-"If you want to detach HEAD at the commit, try again with the --detach option."
-msgstr ""
-
-#: builtin/checkout.c:1442
-msgid ""
-"cannot switch branch while merging\n"
-"Consider \"git merge --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1446
-msgid ""
-"cannot switch branch in the middle of an am session\n"
-"Consider \"git am --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1450
-msgid ""
-"cannot switch branch while rebasing\n"
-"Consider \"git rebase --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1454
-msgid ""
-"cannot switch branch while cherry-picking\n"
-"Consider \"git cherry-pick --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1458
-msgid ""
-"cannot switch branch while reverting\n"
-"Consider \"git revert --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1462
-msgid "you are switching branch while bisecting"
-msgstr ""
-
-#: builtin/checkout.c:1469
-msgid "paths cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1472 builtin/checkout.c:1476 builtin/checkout.c:1480
-#, c-format
-msgid "'%s' cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1484 builtin/checkout.c:1487 builtin/checkout.c:1490
-#: builtin/checkout.c:1495 builtin/checkout.c:1500
-#, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1497
-#, c-format
-msgid "'%s' cannot take <start-point>"
-msgstr ""
-
-#: builtin/checkout.c:1505
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1512
-msgid "missing branch or commit argument"
-msgstr ""
-
-#: builtin/checkout.c:1555
-msgid "perform a 3-way merge with the new branch"
-msgstr ""
-
-#: builtin/checkout.c:1556 builtin/log.c:1844 parse-options.h:354
-msgid "style"
-msgstr ""
-
-#: builtin/checkout.c:1557
-msgid "conflict style (merge, diff3, or zdiff3)"
-msgstr ""
-
-#: builtin/checkout.c:1569 builtin/worktree.c:560
-msgid "detach HEAD at named commit"
-msgstr ""
-
-#: builtin/checkout.c:1574
-msgid "force checkout (throw away local modifications)"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new-branch"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new unparented branch"
-msgstr ""
-
-#: builtin/checkout.c:1578 builtin/merge.c:305
-msgid "update ignored files (default)"
-msgstr ""
-
-#: builtin/checkout.c:1581
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-
-#: builtin/checkout.c:1594
-msgid "checkout our version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1597
-msgid "checkout their version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1601
-msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
-
-#: builtin/checkout.c:1659
-#, c-format
-msgid "options '-%c', '-%c', and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/checkout.c:1700
-msgid "--track needs a branch name"
-msgstr ""
-
-#: builtin/checkout.c:1705
-#, c-format
-msgid "missing branch name; try -%c"
-msgstr ""
-
-#: builtin/checkout.c:1737
-#, c-format
-msgid "could not resolve %s"
-msgstr ""
-
-#: builtin/checkout.c:1753
-msgid "invalid path specification"
-msgstr ""
-
-#: builtin/checkout.c:1760
-#, c-format
-msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
-msgstr ""
-
-#: builtin/checkout.c:1764
-#, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1789
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
-msgstr ""
-
-#: builtin/checkout.c:1794
-msgid "you must specify path(s) to restore"
-msgstr ""
-
-#: builtin/checkout.c:1819 builtin/checkout.c:1821 builtin/checkout.c:1873
-#: builtin/checkout.c:1875 builtin/clone.c:130 builtin/remote.c:171
-#: builtin/remote.c:173 builtin/submodule--helper.c:3038
-#: builtin/submodule--helper.c:3371 builtin/worktree.c:556
-#: builtin/worktree.c:558
-msgid "branch"
-msgstr ""
-
-#: builtin/checkout.c:1820
-msgid "create and checkout a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1822
-msgid "create/reset and checkout a branch"
-msgstr ""
-
-#: builtin/checkout.c:1823
-msgid "create reflog for new branch"
-msgstr ""
-
-#: builtin/checkout.c:1825
-msgid "second guess 'git checkout <no-such-branch>' (default)"
-msgstr ""
-
-#: builtin/checkout.c:1826
-msgid "use overlay mode (default)"
-msgstr ""
-
-#: builtin/checkout.c:1874
-msgid "create and switch to a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1876
-msgid "create/reset and switch to a branch"
-msgstr ""
-
-#: builtin/checkout.c:1878
-msgid "second guess 'git switch <no-such-branch>'"
-msgstr ""
-
-#: builtin/checkout.c:1880
-msgid "throw away local modifications"
-msgstr ""
-
-#: builtin/checkout.c:1916
-msgid "which tree-ish to checkout from"
-msgstr ""
-
-#: builtin/checkout.c:1918
-msgid "restore the index"
-msgstr ""
-
-#: builtin/checkout.c:1920
-msgid "restore the working tree (default)"
-msgstr ""
-
-#: builtin/checkout.c:1922
-msgid "ignore unmerged entries"
-msgstr ""
-
-#: builtin/checkout.c:1923
-msgid "use overlay mode"
-msgstr ""
-
-#: builtin/clean.c:29
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr ""
-
-#: builtin/clean.c:33
-#, c-format
-msgid "Removing %s\n"
-msgstr ""
-
-#: builtin/clean.c:34
-#, c-format
-msgid "Would remove %s\n"
-msgstr ""
-
-#: builtin/clean.c:35
-#, c-format
-msgid "Skipping repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:36
-#, c-format
-msgid "Would skip repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:38
-#, c-format
-msgid "could not lstat %s\n"
-msgstr ""
-
-#: builtin/clean.c:39
-msgid "Refusing to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:40
-msgid "Would refuse to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:326 git-add--interactive.perl:593
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing\n"
-msgstr ""
-
-#: builtin/clean.c:330 git-add--interactive.perl:602
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a single item\n"
-"3-5        - select a range of items\n"
-"2-3,6-9    - select multiple ranges\n"
-"foo        - select item based on unique prefix\n"
-"-...       - unselect specified items\n"
-"*          - choose all items\n"
-"           - (empty) finish selecting\n"
-msgstr ""
-
-#: builtin/clean.c:545 git-add--interactive.perl:568
-#: git-add--interactive.perl:573
-#, c-format, perl-format
-msgid "Huh (%s)?\n"
-msgstr ""
-
-#: builtin/clean.c:685
-#, c-format
-msgid "Input ignore patterns>> "
-msgstr ""
-
-#: builtin/clean.c:719
-#, c-format
-msgid "WARNING: Cannot find items matched by: %s"
-msgstr ""
-
-#: builtin/clean.c:740
-msgid "Select items to delete"
-msgstr ""
-
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:781
-#, c-format
-msgid "Remove %s [y/N]? "
-msgstr ""
-
-#: builtin/clean.c:812
-msgid ""
-"clean               - start cleaning\n"
-"filter by pattern   - exclude items from deletion\n"
-"select by numbers   - select items to be deleted by numbers\n"
-"ask each            - confirm each deletion (like \"rm -i\")\n"
-"quit                - stop cleaning\n"
-"help                - this screen\n"
-"?                   - help for prompt selection"
-msgstr ""
-
-#: builtin/clean.c:848
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/clean.c:864
-msgid "No more files to clean, exiting."
-msgstr ""
-
-#: builtin/clean.c:926
-msgid "do not print names of files removed"
-msgstr ""
-
-#: builtin/clean.c:928
-msgid "force"
-msgstr ""
-
-#: builtin/clean.c:929
-msgid "interactive cleaning"
-msgstr ""
-
-#: builtin/clean.c:931
-msgid "remove whole directories"
-msgstr ""
-
-#: builtin/clean.c:932 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:938 builtin/log.c:185 builtin/log.c:187
-#: builtin/ls-files.c:651 builtin/name-rev.c:585 builtin/name-rev.c:587
-#: builtin/show-ref.c:179
-msgid "pattern"
-msgstr ""
-
-#: builtin/clean.c:933
-msgid "add <pattern> to ignore rules"
-msgstr ""
-
-#: builtin/clean.c:934
-msgid "remove ignored files, too"
-msgstr ""
-
-#: builtin/clean.c:936
-msgid "remove only ignored files"
-msgstr ""
-
-#: builtin/clean.c:951
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
-msgstr ""
-
-#: builtin/clean.c:954
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
-msgstr ""
-
-#: builtin/clean.c:966
-msgid "-x and -X cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:47
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: builtin/clone.c:100
-msgid "don't clone shallow repository"
-msgstr ""
-
-#: builtin/clone.c:102
-msgid "don't create a checkout"
-msgstr ""
-
-#: builtin/clone.c:103 builtin/clone.c:105 builtin/init-db.c:542
-msgid "create a bare repository"
-msgstr ""
-
-#: builtin/clone.c:107
-msgid "create a mirror repository (implies bare)"
-msgstr ""
-
-#: builtin/clone.c:109
-msgid "to clone from a local repository"
-msgstr ""
-
-#: builtin/clone.c:111
-msgid "don't use local hardlinks, always copy"
-msgstr ""
-
-#: builtin/clone.c:113
-msgid "setup as shared repository"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "pathspec"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "initialize submodules in the clone"
-msgstr ""
-
-#: builtin/clone.c:119
-msgid "number of submodules cloned in parallel"
-msgstr ""
-
-#: builtin/clone.c:120 builtin/init-db.c:539
-msgid "template-directory"
-msgstr ""
-
-#: builtin/clone.c:121 builtin/init-db.c:540
-msgid "directory from which templates will be used"
-msgstr ""
-
-#: builtin/clone.c:123 builtin/clone.c:125 builtin/submodule--helper.c:1885
-#: builtin/submodule--helper.c:2719 builtin/submodule--helper.c:3378
-msgid "reference repository"
-msgstr ""
-
-#: builtin/clone.c:127 builtin/submodule--helper.c:1887
-#: builtin/submodule--helper.c:2721
-msgid "use --reference only while cloning"
-msgstr ""
-
-#: builtin/clone.c:128 builtin/column.c:27 builtin/fmt-merge-msg.c:27
-#: builtin/init-db.c:550 builtin/merge-file.c:48 builtin/merge.c:290
-#: builtin/pack-objects.c:3967 builtin/repack.c:669
-#: builtin/submodule--helper.c:3380 t/helper/test-simple-ipc.c:595
-#: t/helper/test-simple-ipc.c:597
-msgid "name"
-msgstr ""
-
-#: builtin/clone.c:129
-msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
-
-#: builtin/clone.c:131
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
-
-#: builtin/clone.c:133
-msgid "path to git-upload-pack on the remote"
-msgstr ""
-
-#: builtin/clone.c:134 builtin/fetch.c:182 builtin/grep.c:877
-#: builtin/pull.c:212
-msgid "depth"
-msgstr ""
-
-#: builtin/clone.c:135
-msgid "create a shallow clone of that depth"
-msgstr ""
-
-#: builtin/clone.c:136 builtin/fetch.c:184 builtin/pack-objects.c:3956
-#: builtin/pull.c:215
-msgid "time"
-msgstr ""
-
-#: builtin/clone.c:137
-msgid "create a shallow clone since a specific time"
-msgstr ""
-
-#: builtin/clone.c:138 builtin/fetch.c:186 builtin/fetch.c:212
-#: builtin/pull.c:218 builtin/pull.c:243 builtin/rebase.c:1050
-msgid "revision"
-msgstr ""
-
-#: builtin/clone.c:139 builtin/fetch.c:187 builtin/pull.c:219
-msgid "deepen history of shallow clone, excluding rev"
-msgstr ""
-
-#: builtin/clone.c:141 builtin/submodule--helper.c:1897
-#: builtin/submodule--helper.c:2735
-msgid "clone only one branch, HEAD or --branch"
-msgstr ""
-
-#: builtin/clone.c:143
-msgid "don't clone any tags, and make later fetches not to follow them"
-msgstr ""
-
-#: builtin/clone.c:145
-msgid "any cloned submodules will be shallow"
-msgstr ""
-
-#: builtin/clone.c:146 builtin/init-db.c:548
-msgid "gitdir"
-msgstr ""
-
-#: builtin/clone.c:147 builtin/init-db.c:549
-msgid "separate git dir from working tree"
-msgstr ""
-
-#: builtin/clone.c:148
-msgid "key=value"
-msgstr ""
-
-#: builtin/clone.c:149
-msgid "set config inside the new repository"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:234 builtin/push.c:575 builtin/send-pack.c:200
-msgid "server-specific"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:235 builtin/push.c:575 builtin/send-pack.c:201
-msgid "option to transmit"
-msgstr ""
-
-#: builtin/clone.c:152 builtin/fetch.c:208 builtin/pull.c:238
-#: builtin/push.c:576
-msgid "use IPv4 addresses only"
-msgstr ""
-
-#: builtin/clone.c:154 builtin/fetch.c:210 builtin/pull.c:241
-#: builtin/push.c:578
-msgid "use IPv6 addresses only"
-msgstr ""
-
-#: builtin/clone.c:158
-msgid "apply partial clone filters to submodules"
-msgstr ""
-
-#: builtin/clone.c:160
-msgid "any cloned submodules will use their remote-tracking branch"
-msgstr ""
-
-#: builtin/clone.c:162
-msgid "initialize sparse-checkout file to include only files at root"
-msgstr ""
-
-#: builtin/clone.c:237
-#, c-format
-msgid "info: Could not add alternate for '%s': %s\n"
-msgstr ""
-
-#: builtin/clone.c:310
-#, c-format
-msgid "%s exists and is not a directory"
-msgstr ""
-
-#: builtin/clone.c:328
-#, c-format
-msgid "failed to start iterator over '%s'"
-msgstr ""
-
-#: builtin/clone.c:359
-#, c-format
-msgid "failed to create link '%s'"
-msgstr ""
-
-#: builtin/clone.c:363
-#, c-format
-msgid "failed to copy file to '%s'"
-msgstr ""
-
-#: builtin/clone.c:368
-#, c-format
-msgid "failed to iterate over '%s'"
-msgstr ""
-
-#: builtin/clone.c:395
-#, c-format
-msgid "done.\n"
-msgstr ""
-
-#: builtin/clone.c:409
-msgid ""
-"Clone succeeded, but checkout failed.\n"
-"You can inspect what was checked out with 'git status'\n"
-"and retry with 'git restore --source=HEAD :/'\n"
-msgstr ""
-
-#: builtin/clone.c:486
-#, c-format
-msgid "Could not find remote branch %s to clone."
-msgstr ""
-
-#: builtin/clone.c:603
-#, c-format
-msgid "unable to update %s"
-msgstr ""
-
-#: builtin/clone.c:651
-msgid "failed to initialize sparse-checkout"
-msgstr ""
-
-#: builtin/clone.c:674
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr ""
-
-#: builtin/clone.c:709
-msgid "unable to checkout working tree"
-msgstr ""
-
-#: builtin/clone.c:793
-msgid "unable to write parameters to config file"
-msgstr ""
-
-#: builtin/clone.c:856
-msgid "cannot repack to clean up"
-msgstr ""
-
-#: builtin/clone.c:858
-msgid "cannot unlink temporary alternates file"
-msgstr ""
-
-#: builtin/clone.c:901
-msgid "Too many arguments."
-msgstr ""
-
-#: builtin/clone.c:905 contrib/scalar/scalar.c:413
-msgid "You must specify a repository to clone."
-msgstr ""
-
-#: builtin/clone.c:918
-#, c-format
-msgid "options '%s' and '%s %s' cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:935
-#, c-format
-msgid "repository '%s' does not exist"
-msgstr ""
-
-#: builtin/clone.c:939 builtin/fetch.c:2176
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr ""
-
-#: builtin/clone.c:949
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:955
-#, c-format
-msgid "repository path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:969
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr ""
-
-#: builtin/clone.c:984 builtin/clone.c:1005 builtin/difftool.c:256
-#: builtin/log.c:2037 builtin/worktree.c:350 builtin/worktree.c:382
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr ""
-
-#: builtin/clone.c:989
-#, c-format
-msgid "could not create work tree dir '%s'"
-msgstr ""
-
-#: builtin/clone.c:1009
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1011
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1040
-msgid ""
-"clone --recursive is not compatible with both --reference and --reference-if-"
-"able"
-msgstr ""
-
-#: builtin/clone.c:1116 builtin/remote.c:201 builtin/remote.c:721
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr ""
-
-#: builtin/clone.c:1157
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1159
-msgid "--shallow-since is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1161
-msgid "--shallow-exclude is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1163
-msgid "--filter is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1168
-msgid "source repository is shallow, ignoring --local"
-msgstr ""
-
-#: builtin/clone.c:1173
-msgid "--local is ignored"
-msgstr ""
-
-#: builtin/clone.c:1185
-msgid "cannot clone from filtered bundle"
-msgstr ""
-
-#: builtin/clone.c:1265 builtin/clone.c:1324
-msgid "remote transport reported error"
-msgstr ""
-
-#: builtin/clone.c:1277 builtin/clone.c:1289
-#, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr ""
-
-#: builtin/clone.c:1292
-msgid "You appear to have cloned an empty repository."
-msgstr ""
-
-#: builtin/column.c:10
-msgid "git column [<options>]"
-msgstr ""
-
-#: builtin/column.c:27
-msgid "lookup config vars"
-msgstr ""
-
-#: builtin/column.c:28 builtin/column.c:29
-msgid "layout to use"
-msgstr ""
-
-#: builtin/column.c:30
-msgid "maximum width"
-msgstr ""
-
-#: builtin/column.c:31
-msgid "padding space on left border"
-msgstr ""
-
-#: builtin/column.c:32
-msgid "padding space on right border"
-msgstr ""
-
-#: builtin/column.c:33
-msgid "padding space between columns"
-msgstr ""
-
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr ""
-
-#: builtin/commit-graph.c:13
-msgid ""
-"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
-msgstr ""
-
-#: builtin/commit-graph.c:16
-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 ""
-
-#: builtin/commit-graph.c:51 builtin/fetch.c:196 builtin/log.c:1813
-msgid "dir"
-msgstr ""
-
-#: builtin/commit-graph.c:52
-msgid "the object directory to store the graph"
-msgstr ""
-
-#: builtin/commit-graph.c:73
-msgid "if the commit-graph is split, only verify the tip file"
-msgstr ""
-
-#: builtin/commit-graph.c:100
-#, c-format
-msgid "Could not open commit-graph '%s'"
-msgstr ""
-
-#: builtin/commit-graph.c:137
-#, c-format
-msgid "unrecognized --split argument, %s"
-msgstr ""
-
-#: builtin/commit-graph.c:150
-#, c-format
-msgid "unexpected non-hex object ID: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:155
-#, c-format
-msgid "invalid object: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:205
-msgid "start walk at all refs"
-msgstr ""
-
-#: builtin/commit-graph.c:207
-msgid "scan pack-indexes listed by stdin for commits"
-msgstr ""
-
-#: builtin/commit-graph.c:209
-msgid "start walk at commits listed by stdin"
-msgstr ""
-
-#: builtin/commit-graph.c:211
-msgid "include all commits already in the commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:213
-msgid "enable computation for changed paths"
-msgstr ""
-
-#: builtin/commit-graph.c:215
-msgid "allow writing an incremental commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:219
-msgid "maximum number of commits in a non-base split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:221
-msgid "maximum ratio between two levels of a split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:223
-msgid "only expire files older than a given date-time"
-msgstr ""
-
-#: builtin/commit-graph.c:225
-msgid "maximum number of changed-path Bloom filters to compute"
-msgstr ""
-
-#: builtin/commit-graph.c:251
-msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
-msgstr ""
-
-#: builtin/commit-graph.c:282
-msgid "Collecting commits from input"
-msgstr ""
-
-#: builtin/commit-graph.c:328 builtin/multi-pack-index.c:259
-#, c-format
-msgid "unrecognized subcommand: %s"
-msgstr ""
-
-#: builtin/commit-tree.c:18
-msgid ""
-"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F "
-"<file>)...] <tree>"
-msgstr ""
-
-#: builtin/commit-tree.c:31
-#, c-format
-msgid "duplicate parent %s ignored"
-msgstr ""
-
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:134 builtin/log.c:590
-#, c-format
-msgid "not a valid object name %s"
-msgstr ""
-
-#: builtin/commit-tree.c:94
-#, c-format
-msgid "git commit-tree: failed to read '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:96
-#, c-format
-msgid "git commit-tree: failed to close '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:109
-msgid "parent"
-msgstr ""
-
-#: builtin/commit-tree.c:110
-msgid "id of a parent commit object"
-msgstr ""
-
-#: builtin/commit-tree.c:112 builtin/commit.c:1626 builtin/merge.c:284
-#: builtin/notes.c:407 builtin/notes.c:573 builtin/stash.c:1666
-#: builtin/tag.c:455
-msgid "message"
-msgstr ""
-
-#: builtin/commit-tree.c:113 builtin/commit.c:1626
-msgid "commit message"
-msgstr ""
-
-#: builtin/commit-tree.c:116
-msgid "read commit log message from file"
-msgstr ""
-
-#: builtin/commit-tree.c:119 builtin/commit.c:1643 builtin/merge.c:303
-#: builtin/pull.c:180 builtin/revert.c:118
-msgid "GPG sign commit"
-msgstr ""
-
-#: builtin/commit-tree.c:131
-msgid "must give exactly one tree"
-msgstr ""
-
-#: builtin/commit-tree.c:138
-msgid "git commit-tree: failed to read"
-msgstr ""
-
-#: builtin/commit.c:43
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:48
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:53
-msgid ""
-"You asked to amend the most recent commit, but doing so would make\n"
-"it empty. You can repeat your command with --allow-empty, or you can\n"
-"remove the commit entirely with \"git reset HEAD^\".\n"
-msgstr ""
-
-#: builtin/commit.c:58
-msgid ""
-"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
-"If you wish to commit it anyway, use:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:65
-msgid "Otherwise, please use 'git rebase --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:68
-msgid "Otherwise, please use 'git cherry-pick --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:71
-msgid ""
-"and then use:\n"
-"\n"
-"    git cherry-pick --continue\n"
-"\n"
-"to resume cherry-picking the remaining commits.\n"
-"If you wish to skip this commit, use:\n"
-"\n"
-"    git cherry-pick --skip\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:326
-msgid "failed to unpack HEAD tree object"
-msgstr ""
-
-#: builtin/commit.c:376
-msgid "No paths with --include/--only does not make sense."
-msgstr ""
-
-#: builtin/commit.c:388
-msgid "unable to create temporary index"
-msgstr ""
-
-#: builtin/commit.c:397
-msgid "interactive add failed"
-msgstr ""
-
-#: builtin/commit.c:412
-msgid "unable to update temporary index"
-msgstr ""
-
-#: builtin/commit.c:414
-msgid "Failed to update main cache tree"
-msgstr ""
-
-#: builtin/commit.c:439 builtin/commit.c:462 builtin/commit.c:510
-msgid "unable to write new_index file"
-msgstr ""
-
-#: builtin/commit.c:491
-msgid "cannot do a partial commit during a merge."
-msgstr ""
-
-#: builtin/commit.c:493
-msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
-
-#: builtin/commit.c:495
-msgid "cannot do a partial commit during a rebase."
-msgstr ""
-
-#: builtin/commit.c:503
-msgid "cannot read the index"
-msgstr ""
-
-#: builtin/commit.c:522
-msgid "unable to write temporary index file"
-msgstr ""
-
-#: builtin/commit.c:620
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr ""
-
-#: builtin/commit.c:622
-#, c-format
-msgid "commit '%s' has malformed author line"
-msgstr ""
-
-#: builtin/commit.c:641
-msgid "malformed --author parameter"
-msgstr ""
-
-#: builtin/commit.c:694
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-msgstr ""
-
-#: builtin/commit.c:750 builtin/commit.c:784 builtin/commit.c:1170
-#, c-format
-msgid "could not lookup commit %s"
-msgstr ""
-
-#: builtin/commit.c:762 builtin/shortlog.c:417
-#, c-format
-msgid "(reading log message from standard input)\n"
-msgstr ""
-
-#: builtin/commit.c:764
-msgid "could not read log from standard input"
-msgstr ""
-
-#: builtin/commit.c:768
-#, c-format
-msgid "could not read log file '%s'"
-msgstr ""
-
-#: builtin/commit.c:805
-#, c-format
-msgid "options '%s' and '%s:%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:817 builtin/commit.c:833
-msgid "could not read SQUASH_MSG"
-msgstr ""
-
-#: builtin/commit.c:824
-msgid "could not read MERGE_MSG"
-msgstr ""
-
-#: builtin/commit.c:884
-msgid "could not write commit template"
-msgstr ""
-
-#: builtin/commit.c:897
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/commit.c:899
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored, and an empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:903
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-msgstr ""
-
-#: builtin/commit.c:907
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-"An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:919
-msgid ""
-"\n"
-"It looks like you may be committing a merge.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d MERGE_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:924
-msgid ""
-"\n"
-"It looks like you may be committing a cherry-pick.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d CHERRY_PICK_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:951
-#, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:959
-#, c-format
-msgid "%sDate:      %s"
-msgstr ""
-
-#: builtin/commit.c:966
-#, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:984
-msgid "Cannot read index"
-msgstr ""
-
-#: builtin/commit.c:1029
-msgid "unable to pass trailers to --trailers"
-msgstr ""
-
-#: builtin/commit.c:1069
-msgid "Error building trees"
-msgstr ""
-
-#: builtin/commit.c:1083 builtin/tag.c:317
-#, c-format
-msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
-
-#: builtin/commit.c:1128
-#, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
-msgstr ""
-
-#: builtin/commit.c:1142
-#, c-format
-msgid "Invalid ignored mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1160 builtin/commit.c:1450
-#, c-format
-msgid "Invalid untracked files mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1231
-msgid "You are in the middle of a merge -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1233
-msgid "You are in the middle of a cherry-pick -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1236
-#, c-format
-msgid "reword option of '%s' and path '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1238
-#, c-format
-msgid "reword option of '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1263
-msgid "You have nothing to amend."
-msgstr ""
-
-#: builtin/commit.c:1266
-msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1268
-msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1270
-msgid "You are in the middle of a rebase -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1290
-msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr ""
-
-#: builtin/commit.c:1337
-#, c-format
-msgid "unknown option: --fixup=%s:%s"
-msgstr ""
-
-#: builtin/commit.c:1354
-#, c-format
-msgid "paths '%s ...' with -a does not make sense"
-msgstr ""
-
-#: builtin/commit.c:1485 builtin/commit.c:1654
-msgid "show status concisely"
-msgstr ""
-
-#: builtin/commit.c:1487 builtin/commit.c:1656
-msgid "show branch information"
-msgstr ""
-
-#: builtin/commit.c:1489
-msgid "show stash information"
-msgstr ""
-
-#: builtin/commit.c:1491 builtin/commit.c:1658
-msgid "compute full ahead/behind values"
-msgstr ""
-
-#: builtin/commit.c:1493
-msgid "version"
-msgstr ""
-
-#: builtin/commit.c:1493 builtin/commit.c:1660 builtin/push.c:551
-#: builtin/worktree.c:765
-msgid "machine-readable output"
-msgstr ""
-
-#: builtin/commit.c:1496 builtin/commit.c:1662
-msgid "show status in long format (default)"
-msgstr ""
-
-#: builtin/commit.c:1499 builtin/commit.c:1665
-msgid "terminate entries with NUL"
-msgstr ""
-
-#: builtin/commit.c:1501 builtin/commit.c:1505 builtin/commit.c:1668
-#: builtin/fast-export.c:1172 builtin/fast-export.c:1175
-#: builtin/fast-export.c:1178 builtin/rebase.c:1139 parse-options.h:368
-msgid "mode"
-msgstr ""
-
-#: builtin/commit.c:1502 builtin/commit.c:1668
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1506
-msgid ""
-"show ignored files, optional modes: traditional, matching, no. (Default: "
-"traditional)"
-msgstr ""
-
-#: builtin/commit.c:1508 parse-options.h:197
-msgid "when"
-msgstr ""
-
-#: builtin/commit.c:1509
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1511
-msgid "list untracked files in columns"
-msgstr ""
-
-#: builtin/commit.c:1512
-msgid "do not detect renames"
-msgstr ""
-
-#: builtin/commit.c:1514
-msgid "detect renames, optionally set similarity index"
-msgstr ""
-
-#: builtin/commit.c:1537
-msgid "Unsupported combination of ignored and untracked-files arguments"
-msgstr ""
-
-#: builtin/commit.c:1619
-msgid "suppress summary after successful commit"
-msgstr ""
-
-#: builtin/commit.c:1620
-msgid "show diff in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1622
-msgid "Commit message options"
-msgstr ""
-
-#: builtin/commit.c:1623 builtin/merge.c:288 builtin/tag.c:457
-msgid "read message from file"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "author"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "override author for commit"
-msgstr ""
-
-#: builtin/commit.c:1625 builtin/gc.c:551
-msgid "date"
-msgstr ""
-
-#: builtin/commit.c:1625
-msgid "override date for commit"
-msgstr ""
-
-#: builtin/commit.c:1627 builtin/commit.c:1628 builtin/commit.c:1634
-#: parse-options.h:360 ref-filter.h:89
-msgid "commit"
-msgstr ""
-
-#: builtin/commit.c:1627
-msgid "reuse and edit message from specified commit"
-msgstr ""
-
-#: builtin/commit.c:1628
-msgid "reuse message from specified commit"
-msgstr ""
-
-#. TRANSLATORS: Leave "[(amend|reword):]" as-is,
-#. and only translate <commit>.
-#.
-#: builtin/commit.c:1633
-msgid "[(amend|reword):]commit"
-msgstr ""
-
-#: builtin/commit.c:1633
-msgid ""
-"use autosquash formatted message to fixup or amend/reword specified commit"
-msgstr ""
-
-#: builtin/commit.c:1634
-msgid "use autosquash formatted message to squash specified commit"
-msgstr ""
-
-#: builtin/commit.c:1635
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
-msgstr ""
-
-#: builtin/commit.c:1636 builtin/interpret-trailers.c:111
-msgid "trailer"
-msgstr ""
-
-#: builtin/commit.c:1636
-msgid "add custom trailer(s)"
-msgstr ""
-
-#: builtin/commit.c:1637 builtin/log.c:1788 builtin/merge.c:306
-#: builtin/pull.c:146 builtin/revert.c:110
-msgid "add a Signed-off-by trailer"
-msgstr ""
-
-#: builtin/commit.c:1638
-msgid "use specified template file"
-msgstr ""
-
-#: builtin/commit.c:1639
-msgid "force edit of commit"
-msgstr ""
-
-#: builtin/commit.c:1641
-msgid "include status in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1646
-msgid "Commit contents options"
-msgstr ""
-
-#: builtin/commit.c:1647
-msgid "commit all changed files"
-msgstr ""
-
-#: builtin/commit.c:1648
-msgid "add specified files to index for commit"
-msgstr ""
-
-#: builtin/commit.c:1649
-msgid "interactively add files"
-msgstr ""
-
-#: builtin/commit.c:1650
-msgid "interactively add changes"
-msgstr ""
-
-#: builtin/commit.c:1651
-msgid "commit only specified files"
-msgstr ""
-
-#: builtin/commit.c:1652
-msgid "bypass pre-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/commit.c:1653
-msgid "show what would be committed"
-msgstr ""
-
-#: builtin/commit.c:1666
-msgid "amend previous commit"
-msgstr ""
-
-#: builtin/commit.c:1667
-msgid "bypass post-rewrite hook"
-msgstr ""
-
-#: builtin/commit.c:1674
-msgid "ok to record an empty change"
-msgstr ""
-
-#: builtin/commit.c:1676
-msgid "ok to record a change with an empty message"
-msgstr ""
-
-#: builtin/commit.c:1752
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
-
-#: builtin/commit.c:1759
-msgid "could not read MERGE_MODE"
-msgstr ""
-
-#: builtin/commit.c:1780
-#, c-format
-msgid "could not read commit message: %s"
-msgstr ""
-
-#: builtin/commit.c:1787
-#, c-format
-msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
-
-#: builtin/commit.c:1792
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
-
-#: builtin/commit.c:1803
-#, c-format
-msgid "Aborting commit due to empty commit message body.\n"
-msgstr ""
-
-#: builtin/commit.c:1839
-msgid ""
-"repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full and quota is\n"
-"not exceeded, and then \"git restore --staged :/\" to recover."
-msgstr ""
-
-#: builtin/config.c:11
-msgid "git config [<options>]"
-msgstr ""
-
-#: builtin/config.c:109 builtin/env--helper.c:27
-#, c-format
-msgid "unrecognized --type argument, %s"
-msgstr ""
-
-#: builtin/config.c:121
-msgid "only one type at a time"
-msgstr ""
-
-#: builtin/config.c:130
-msgid "Config file location"
-msgstr ""
-
-#: builtin/config.c:131
-msgid "use global config file"
-msgstr ""
-
-#: builtin/config.c:132
-msgid "use system config file"
-msgstr ""
-
-#: builtin/config.c:133
-msgid "use repository config file"
-msgstr ""
-
-#: builtin/config.c:134
-msgid "use per-worktree config file"
-msgstr ""
-
-#: builtin/config.c:135
-msgid "use given config file"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "blob-id"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "read config from given blob object"
-msgstr ""
-
-#: builtin/config.c:137
-msgid "Action"
-msgstr ""
-
-#: builtin/config.c:138
-msgid "get value: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:139
-msgid "get all values: key [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:140
-msgid "get values for regexp: name-regex [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:141
-msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
-
-#: builtin/config.c:142
-msgid "replace all matching variables: name value [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:143
-msgid "add a new variable: name value"
-msgstr ""
-
-#: builtin/config.c:144
-msgid "remove a variable: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:145
-msgid "remove all matches: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:146
-msgid "rename section: old-name new-name"
-msgstr ""
-
-#: builtin/config.c:147
-msgid "remove a section: name"
-msgstr ""
-
-#: builtin/config.c:148
-msgid "list all"
-msgstr ""
-
-#: builtin/config.c:149
-msgid "use string equality when comparing values to 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:150
-msgid "open an editor"
-msgstr ""
-
-#: builtin/config.c:151
-msgid "find the color configured: slot [default]"
-msgstr ""
-
-#: builtin/config.c:152
-msgid "find the color setting: slot [stdout-is-tty]"
-msgstr ""
-
-#: builtin/config.c:153
-msgid "Type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:42 builtin/hash-object.c:97
-msgid "type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:43
-msgid "value is given this type"
-msgstr ""
-
-#: builtin/config.c:155
-msgid "value is \"true\" or \"false\""
-msgstr ""
-
-#: builtin/config.c:156
-msgid "value is decimal number"
-msgstr ""
-
-#: builtin/config.c:157
-msgid "value is --bool or --int"
-msgstr ""
-
-#: builtin/config.c:158
-msgid "value is --bool or string"
-msgstr ""
-
-#: builtin/config.c:159
-msgid "value is a path (file or directory name)"
-msgstr ""
-
-#: builtin/config.c:160
-msgid "value is an expiry date"
-msgstr ""
-
-#: builtin/config.c:161
-msgid "Other"
-msgstr ""
-
-#: builtin/config.c:162
-msgid "terminate values with NUL byte"
-msgstr ""
-
-#: builtin/config.c:163
-msgid "show variable names only"
-msgstr ""
-
-#: builtin/config.c:164
-msgid "respect include directives on lookup"
-msgstr ""
-
-#: builtin/config.c:165
-msgid "show origin of config (file, standard input, blob, command line)"
-msgstr ""
-
-#: builtin/config.c:166
-msgid "show scope of config (worktree, local, global, system, command)"
-msgstr ""
-
-#: builtin/config.c:167 builtin/env--helper.c:45
-msgid "value"
-msgstr ""
-
-#: builtin/config.c:167
-msgid "with --get, use default value when missing entry"
-msgstr ""
-
-#: builtin/config.c:181
-#, c-format
-msgid "wrong number of arguments, should be %d"
-msgstr ""
-
-#: builtin/config.c:183
-#, c-format
-msgid "wrong number of arguments, should be from %d to %d"
-msgstr ""
-
-#: builtin/config.c:339
-#, c-format
-msgid "invalid key pattern: %s"
-msgstr ""
-
-#: builtin/config.c:377
-#, c-format
-msgid "failed to format default config value: %s"
-msgstr ""
-
-#: builtin/config.c:441
-#, c-format
-msgid "cannot parse color '%s'"
-msgstr ""
-
-#: builtin/config.c:483
-msgid "unable to parse default color value"
-msgstr ""
-
-#: builtin/config.c:536 builtin/config.c:833
-msgid "not in a git directory"
-msgstr ""
-
-#: builtin/config.c:539
-msgid "writing to stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:542
-msgid "writing config blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:627
-#, c-format
-msgid ""
-"# This is Git's per-user configuration file.\n"
-"[user]\n"
-"# Please adapt and uncomment the following lines:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
-msgstr ""
-
-#: builtin/config.c:652
-msgid "only one config file at a time"
-msgstr ""
-
-#: builtin/config.c:658
-msgid "--local can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:660
-msgid "--blob can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:662
-msgid "--worktree can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:684
-msgid "$HOME not set"
-msgstr ""
-
-#: builtin/config.c:708
-msgid ""
-"--worktree cannot be used with multiple working trees unless the config\n"
-"extension worktreeConfig is enabled. Please read \"CONFIGURATION FILE\"\n"
-"section in \"git help worktree\" for details"
-msgstr ""
-
-#: builtin/config.c:743
-msgid "--get-color and variable type are incoherent"
-msgstr ""
-
-#: builtin/config.c:748
-msgid "only one action at a time"
-msgstr ""
-
-#: builtin/config.c:761
-msgid "--name-only is only applicable to --list or --get-regexp"
-msgstr ""
-
-#: builtin/config.c:767
-msgid ""
-"--show-origin is only applicable to --get, --get-all, --get-regexp, and --"
-"list"
-msgstr ""
-
-#: builtin/config.c:773
-msgid "--default is only applicable to --get"
-msgstr ""
-
-#: builtin/config.c:806
-msgid "--fixed-value only applies with 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:822
-#, c-format
-msgid "unable to read config file '%s'"
-msgstr ""
-
-#: builtin/config.c:825
-msgid "error processing config file(s)"
-msgstr ""
-
-#: builtin/config.c:835
-msgid "editing stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:837
-msgid "editing blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:851
-#, c-format
-msgid "cannot create configuration file %s"
-msgstr ""
-
-#: builtin/config.c:864
-#, c-format
-msgid ""
-"cannot overwrite multiple values with a single value\n"
-"       Use a regexp, --add or --replace-all to change %s."
-msgstr ""
-
-#: builtin/config.c:943 builtin/config.c:954
-#, c-format
-msgid "no such section: %s"
-msgstr ""
-
-#: builtin/count-objects.c:100
-msgid "print sizes in human readable format"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:227
-#, c-format
-msgid ""
-"The permissions on your socket directory are too loose; other\n"
-"users may be able to read your cached credentials. Consider running:\n"
-"\n"
-"\tchmod 0700 %s"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:276
-msgid "print debugging messages to stderr"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:316
-msgid "credential-cache--daemon unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-cache.c:180
-msgid "credential-cache unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-store.c:66
-#, c-format
-msgid "unable to get credential storage lock in %d ms"
-msgstr ""
-
-#: builtin/describe.c:26
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr ""
-
-#: builtin/describe.c:27
-msgid "git describe [<options>] --dirty"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "head"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "lightweight"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "annotated"
-msgstr ""
-
-#: builtin/describe.c:277
-#, c-format
-msgid "annotated tag %s not available"
-msgstr ""
-
-#: builtin/describe.c:281
-#, c-format
-msgid "tag '%s' is externally known as '%s'"
-msgstr ""
-
-#: builtin/describe.c:328
-#, c-format
-msgid "no tag exactly matches '%s'"
-msgstr ""
-
-#: builtin/describe.c:330
-#, c-format
-msgid "No exact match on refs or tags, searching to describe\n"
-msgstr ""
-
-#: builtin/describe.c:397
-#, c-format
-msgid "finished search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:424
-#, c-format
-msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
-msgstr ""
-
-#: builtin/describe.c:428
-#, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
-msgstr ""
-
-#: builtin/describe.c:458
-#, c-format
-msgid "traversed %lu commits\n"
-msgstr ""
-
-#: builtin/describe.c:461
-#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:529
-#, c-format
-msgid "describe %s\n"
-msgstr ""
-
-#: builtin/describe.c:532
-#, c-format
-msgid "Not a valid object name %s"
-msgstr ""
-
-#: builtin/describe.c:540
-#, c-format
-msgid "%s is neither a commit nor blob"
-msgstr ""
-
-#: builtin/describe.c:554
-msgid "find the tag that comes after the commit"
-msgstr ""
-
-#: builtin/describe.c:555
-msgid "debug search strategy on stderr"
-msgstr ""
-
-#: builtin/describe.c:556
-msgid "use any ref"
-msgstr ""
-
-#: builtin/describe.c:557
-msgid "use any tag, even unannotated"
-msgstr ""
-
-#: builtin/describe.c:558
-msgid "always use long format"
-msgstr ""
-
-#: builtin/describe.c:559
-msgid "only follow first parent"
-msgstr ""
-
-#: builtin/describe.c:562
-msgid "only output exact matches"
-msgstr ""
-
-#: builtin/describe.c:564
-msgid "consider <n> most recent tags (default: 10)"
-msgstr ""
-
-#: builtin/describe.c:566
-msgid "only consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:568
-msgid "do not consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:570 builtin/name-rev.c:595
-msgid "show abbreviated commit object as fallback"
-msgstr ""
-
-#: builtin/describe.c:571 builtin/describe.c:574
-msgid "mark"
-msgstr ""
-
-#: builtin/describe.c:572
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr ""
-
-#: builtin/describe.c:575
-msgid "append <mark> on broken working tree (default: \"-broken\")"
-msgstr ""
-
-#: builtin/describe.c:622
-msgid "No names found, cannot describe anything."
-msgstr ""
-
-#: builtin/describe.c:673 builtin/describe.c:675
-#, c-format
-msgid "option '%s' and commit-ishes cannot be used together"
-msgstr ""
-
-#: builtin/diff-tree.c:157
-msgid "--merge-base only works with two commits"
-msgstr ""
-
-#: builtin/diff.c:92
-#, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr ""
-
-#: builtin/diff.c:259
-#, c-format
-msgid "invalid option: %s"
-msgstr ""
-
-#: builtin/diff.c:376
-#, c-format
-msgid "%s...%s: no merge base"
-msgstr ""
-
-#: builtin/diff.c:491
-msgid "Not a git repository"
-msgstr ""
-
-#: builtin/diff.c:537 builtin/grep.c:700
-#, c-format
-msgid "invalid object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:548
-#, c-format
-msgid "more than two blobs given: '%s'"
-msgstr ""
-
-#: builtin/diff.c:553
-#, c-format
-msgid "unhandled object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:587
-#, c-format
-msgid "%s...%s: multiple merge bases, using %s"
-msgstr ""
-
-#: builtin/difftool.c:31
-msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
-msgstr ""
-
-#: builtin/difftool.c:287
-#, c-format
-msgid "could not read symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:289
-#, c-format
-msgid "could not read symlink file %s"
-msgstr ""
-
-#: builtin/difftool.c:297
-#, c-format
-msgid "could not read object %s for symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:421
-msgid ""
-"combined diff formats ('-c' and '--cc') are not supported in\n"
-"directory diff mode ('-d' and '--dir-diff')."
-msgstr ""
-
-#: builtin/difftool.c:626
-#, c-format
-msgid "both files modified: '%s' and '%s'."
-msgstr ""
-
-#: builtin/difftool.c:628
-msgid "working tree file has been left."
-msgstr ""
-
-#: builtin/difftool.c:639
-#, c-format
-msgid "temporary files exist in '%s'."
-msgstr ""
-
-#: builtin/difftool.c:640
-msgid "you may want to cleanup or recover these."
-msgstr ""
-
-#: builtin/difftool.c:645
-#, c-format
-msgid "failed: %d"
-msgstr ""
-
-#: builtin/difftool.c:690
-msgid "use `diff.guitool` instead of `diff.tool`"
-msgstr ""
-
-#: builtin/difftool.c:692
-msgid "perform a full-directory diff"
-msgstr ""
-
-#: builtin/difftool.c:694
-msgid "do not prompt before launching a diff tool"
-msgstr ""
-
-#: builtin/difftool.c:699
-msgid "use symlinks in dir-diff mode"
-msgstr ""
-
-#: builtin/difftool.c:700
-msgid "tool"
-msgstr ""
-
-#: builtin/difftool.c:701
-msgid "use the specified diff tool"
-msgstr ""
-
-#: builtin/difftool.c:703
-msgid "print a list of diff tools that may be used with `--tool`"
-msgstr ""
-
-#: builtin/difftool.c:706
-msgid ""
-"make 'git-difftool' exit when an invoked diff tool returns a non-zero exit "
-"code"
-msgstr ""
-
-#: builtin/difftool.c:709
-msgid "specify a custom command for viewing diffs"
-msgstr ""
-
-#: builtin/difftool.c:710
-msgid "passed to `diff`"
-msgstr ""
-
-#: builtin/difftool.c:726
-msgid "difftool requires worktree or --no-index"
-msgstr ""
-
-#: builtin/difftool.c:745
-msgid "no <tool> given for --tool=<tool>"
-msgstr ""
-
-#: builtin/difftool.c:752
-msgid "no <cmd> given for --extcmd=<cmd>"
-msgstr ""
-
-#: builtin/env--helper.c:6
-msgid "git env--helper --type=[bool|ulong] <options> <env-var>"
-msgstr ""
-
-#: builtin/env--helper.c:46
-msgid "default for git_env_*(...) to fall back on"
-msgstr ""
-
-#: builtin/env--helper.c:48
-msgid "be quiet only use git_env_*() value as exit code"
-msgstr ""
-
-#: builtin/env--helper.c:67
-#, c-format
-msgid "option `--default' expects a boolean value with `--type=bool`, not `%s`"
-msgstr ""
-
-#: builtin/env--helper.c:82
-#, c-format
-msgid ""
-"option `--default' expects an unsigned long value with `--type=ulong`, not `"
-"%s`"
-msgstr ""
-
-#: builtin/fast-export.c:29
-msgid "git fast-export [<rev-list-opts>]"
-msgstr ""
-
-#: builtin/fast-export.c:843
-msgid "Error: Cannot export nested tags unless --mark-tags is specified."
-msgstr ""
-
-#: builtin/fast-export.c:1152
-msgid "--anonymize-map token cannot be empty"
-msgstr ""
-
-#: builtin/fast-export.c:1171
-msgid "show progress after <n> objects"
-msgstr ""
-
-#: builtin/fast-export.c:1173
-msgid "select handling of signed tags"
-msgstr ""
-
-#: builtin/fast-export.c:1176
-msgid "select handling of tags that tag filtered objects"
-msgstr ""
-
-#: builtin/fast-export.c:1179
-msgid "select handling of commit messages in an alternate encoding"
-msgstr ""
-
-#: builtin/fast-export.c:1182
-msgid "dump marks to this file"
-msgstr ""
-
-#: builtin/fast-export.c:1184
-msgid "import marks from this file"
-msgstr ""
-
-#: builtin/fast-export.c:1188
-msgid "import marks from this file if it exists"
-msgstr ""
-
-#: builtin/fast-export.c:1190
-msgid "fake a tagger when tags lack one"
-msgstr ""
-
-#: builtin/fast-export.c:1192
-msgid "output full tree for each commit"
-msgstr ""
-
-#: builtin/fast-export.c:1194
-msgid "use the done feature to terminate the stream"
-msgstr ""
-
-#: builtin/fast-export.c:1195
-msgid "skip output of blob data"
-msgstr ""
-
-#: builtin/fast-export.c:1196 builtin/log.c:1860
-msgid "refspec"
-msgstr ""
-
-#: builtin/fast-export.c:1197
-msgid "apply refspec to exported refs"
-msgstr ""
-
-#: builtin/fast-export.c:1198
-msgid "anonymize output"
-msgstr ""
-
-#: builtin/fast-export.c:1199
-msgid "from:to"
-msgstr ""
-
-#: builtin/fast-export.c:1200
-msgid "convert <from> to <to> in anonymized output"
-msgstr ""
-
-#: builtin/fast-export.c:1203
-msgid "reference parents which are not in fast-export stream by object id"
-msgstr ""
-
-#: builtin/fast-export.c:1205
-msgid "show original object ids of blobs/commits"
-msgstr ""
-
-#: builtin/fast-export.c:1207
-msgid "label tags with mark ids"
-msgstr ""
-
-#: builtin/fast-import.c:3097
-#, c-format
-msgid "Missing from marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3099
-#, c-format
-msgid "Missing to marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3234
-#, c-format
-msgid "Expected 'mark' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3239
-#, c-format
-msgid "Expected 'to' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3331
-msgid "Expected format name:filename for submodule rewrite option"
-msgstr ""
-
-#: builtin/fast-import.c:3386
-#, c-format
-msgid "feature '%s' forbidden in input without --allow-unsafe-features"
-msgstr ""
-
-#: builtin/fetch-pack.c:246
-#, c-format
-msgid "Lockfile created but not reported: %s"
-msgstr ""
-
-#: builtin/fetch.c:36
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/fetch.c:37
-msgid "git fetch [<options>] <group>"
-msgstr ""
-
-#: builtin/fetch.c:38
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
-
-#: builtin/fetch.c:39
-msgid "git fetch --all [<options>]"
-msgstr ""
-
-#: builtin/fetch.c:124
-msgid "fetch.parallel cannot be negative"
-msgstr ""
-
-#: builtin/fetch.c:147 builtin/pull.c:189
-msgid "fetch from all remotes"
-msgstr ""
-
-#: builtin/fetch.c:149 builtin/pull.c:249
-msgid "set upstream for git pull/fetch"
-msgstr ""
-
-#: builtin/fetch.c:151 builtin/pull.c:192
-msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
-
-#: builtin/fetch.c:153
-msgid "use atomic transaction to update references"
-msgstr ""
-
-#: builtin/fetch.c:155 builtin/pull.c:195
-msgid "path to upload pack on remote end"
-msgstr ""
-
-#: builtin/fetch.c:156
-msgid "force overwrite of local reference"
-msgstr ""
-
-#: builtin/fetch.c:158
-msgid "fetch from multiple remotes"
-msgstr ""
-
-#: builtin/fetch.c:160 builtin/pull.c:199
-msgid "fetch all tags and associated objects"
-msgstr ""
-
-#: builtin/fetch.c:162
-msgid "do not fetch all tags (--no-tags)"
-msgstr ""
-
-#: builtin/fetch.c:164
-msgid "number of submodules fetched in parallel"
-msgstr ""
-
-#: builtin/fetch.c:166
-msgid "modify the refspec to place all refs within refs/prefetch/"
-msgstr ""
-
-#: builtin/fetch.c:168 builtin/pull.c:202
-msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
-
-#: builtin/fetch.c:170
-msgid "prune local tags no longer on remote and clobber changed tags"
-msgstr ""
-
-#: builtin/fetch.c:171 builtin/fetch.c:199 builtin/pull.c:123
-msgid "on-demand"
-msgstr ""
-
-#: builtin/fetch.c:172
-msgid "control recursive fetching of submodules"
-msgstr ""
-
-#: builtin/fetch.c:177
-msgid "write fetched references to the FETCH_HEAD file"
-msgstr ""
-
-#: builtin/fetch.c:178 builtin/pull.c:210
-msgid "keep downloaded pack"
-msgstr ""
-
-#: builtin/fetch.c:180
-msgid "allow updating of HEAD ref"
-msgstr ""
-
-#: builtin/fetch.c:183 builtin/fetch.c:189 builtin/pull.c:213
-#: builtin/pull.c:222
-msgid "deepen history of shallow clone"
-msgstr ""
-
-#: builtin/fetch.c:185 builtin/pull.c:216
-msgid "deepen history of shallow repository based on time"
-msgstr ""
-
-#: builtin/fetch.c:191 builtin/pull.c:225
-msgid "convert to a complete repository"
-msgstr ""
-
-#: builtin/fetch.c:194
-msgid "re-fetch without negotiating common commits"
-msgstr ""
-
-#: builtin/fetch.c:197
-msgid "prepend this to submodule path output"
-msgstr ""
-
-#: builtin/fetch.c:200
-msgid ""
-"default for recursive fetching of submodules (lower priority than config "
-"files)"
-msgstr ""
-
-#: builtin/fetch.c:204 builtin/pull.c:228
-msgid "accept refs that update .git/shallow"
-msgstr ""
-
-#: builtin/fetch.c:205 builtin/pull.c:230
-msgid "refmap"
-msgstr ""
-
-#: builtin/fetch.c:206 builtin/pull.c:231
-msgid "specify fetch refmap"
-msgstr ""
-
-#: builtin/fetch.c:213 builtin/pull.c:244
-msgid "report that we have only objects reachable from this object"
-msgstr ""
-
-#: builtin/fetch.c:215
-msgid "do not fetch a packfile; instead, print ancestors of negotiation tips"
-msgstr ""
-
-#: builtin/fetch.c:218 builtin/fetch.c:220
-msgid "run 'maintenance --auto' after fetching"
-msgstr ""
-
-#: builtin/fetch.c:222 builtin/pull.c:247
-msgid "check for forced-updates on all updated branches"
-msgstr ""
-
-#: builtin/fetch.c:224
-msgid "write the commit-graph after fetching"
-msgstr ""
-
-#: builtin/fetch.c:226
-msgid "accept refspecs from stdin"
-msgstr ""
-
-#: builtin/fetch.c:618
-msgid "couldn't find remote ref HEAD"
-msgstr ""
-
-#: builtin/fetch.c:893
-#, c-format
-msgid "object %s not found"
-msgstr ""
-
-#: builtin/fetch.c:897
-msgid "[up to date]"
-msgstr ""
-
-#: builtin/fetch.c:909 builtin/fetch.c:927 builtin/fetch.c:999
-msgid "[rejected]"
-msgstr ""
-
-#: builtin/fetch.c:911
-msgid "can't fetch in current branch"
-msgstr ""
-
-#: builtin/fetch.c:912
-msgid "checked out in another worktree"
-msgstr ""
-
-#: builtin/fetch.c:922
-msgid "[tag update]"
-msgstr ""
-
-#: builtin/fetch.c:923 builtin/fetch.c:960 builtin/fetch.c:982
-#: builtin/fetch.c:994
-msgid "unable to update local ref"
-msgstr ""
-
-#: builtin/fetch.c:927
-msgid "would clobber existing tag"
-msgstr ""
-
-#: builtin/fetch.c:949
-msgid "[new tag]"
-msgstr ""
-
-#: builtin/fetch.c:952
-msgid "[new branch]"
-msgstr ""
-
-#: builtin/fetch.c:955
-msgid "[new ref]"
-msgstr ""
-
-#: builtin/fetch.c:994
-msgid "forced update"
-msgstr ""
-
-#: builtin/fetch.c:999
-msgid "non-fast-forward"
-msgstr ""
-
-#: builtin/fetch.c:1102
-msgid ""
-"fetch normally indicates which branches had a forced update,\n"
-"but that check has been disabled; to re-enable, use '--show-forced-updates'\n"
-"flag or run 'git config fetch.showForcedUpdates true'"
-msgstr ""
-
-#: builtin/fetch.c:1106
-#, c-format
-msgid ""
-"it took %.2f seconds to check forced updates; you can use\n"
-"'--no-show-forced-updates' or run 'git config fetch.showForcedUpdates "
-"false'\n"
-"to avoid this check\n"
-msgstr ""
-
-#: builtin/fetch.c:1136
-#, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr ""
-
-#: builtin/fetch.c:1156
-#, c-format
-msgid "rejected %s because shallow roots are not allowed to be updated"
-msgstr ""
-
-#: builtin/fetch.c:1259 builtin/fetch.c:1418
-#, c-format
-msgid "From %.*s\n"
-msgstr ""
-
-#: builtin/fetch.c:1269
-#, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
-msgstr ""
-
-#: builtin/fetch.c:1377
-#, c-format
-msgid "   (%s will become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1378
-#, c-format
-msgid "   (%s has become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1421
-msgid "[deleted]"
-msgstr ""
-
-#: builtin/fetch.c:1422 builtin/remote.c:1153
-msgid "(none)"
-msgstr ""
-
-#: builtin/fetch.c:1446
-#, c-format
-msgid "refusing to fetch into branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/fetch.c:1466
-#, c-format
-msgid "option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
-
-#: builtin/fetch.c:1469
-#, c-format
-msgid "option \"%s\" is ignored for %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1496
-#, c-format
-msgid "the object %s does not exist"
-msgstr ""
-
-#: builtin/fetch.c:1748
-msgid "multiple branches detected, incompatible with --set-upstream"
-msgstr ""
-
-#: builtin/fetch.c:1760
-#, c-format
-msgid ""
-"could not set upstream of HEAD to '%s' from '%s' when it does not point to "
-"any branch."
-msgstr ""
-
-#: builtin/fetch.c:1773
-msgid "not setting upstream for a remote remote-tracking branch"
-msgstr ""
-
-#: builtin/fetch.c:1775
-msgid "not setting upstream for a remote tag"
-msgstr ""
-
-#: builtin/fetch.c:1777
-msgid "unknown branch type"
-msgstr ""
-
-#: builtin/fetch.c:1779
-msgid ""
-"no source branch found;\n"
-"you need to specify exactly one branch with the --set-upstream option"
-msgstr ""
-
-#: builtin/fetch.c:1904 builtin/fetch.c:1967
-#, c-format
-msgid "Fetching %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1914 builtin/fetch.c:1969
-#, c-format
-msgid "could not fetch %s"
-msgstr ""
-
-#: builtin/fetch.c:1926
-#, c-format
-msgid "could not fetch '%s' (exit code: %d)\n"
-msgstr ""
-
-#: builtin/fetch.c:2030
-msgid ""
-"no remote repository specified; please specify either a URL or a\n"
-"remote name from which new revisions should be fetched"
-msgstr ""
-
-#: builtin/fetch.c:2066
-msgid "you need to specify a tag name"
-msgstr ""
-
-#: builtin/fetch.c:2156
-msgid "--negotiate-only needs one or more --negotiation-tip=*"
-msgstr ""
-
-#: builtin/fetch.c:2160
-msgid "negative depth in --deepen is not supported"
-msgstr ""
-
-#: builtin/fetch.c:2169
-msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2186
-msgid "fetch --all does not take a repository argument"
-msgstr ""
-
-#: builtin/fetch.c:2188
-msgid "fetch --all does not make sense with refspecs"
-msgstr ""
-
-#: builtin/fetch.c:2197
-#, c-format
-msgid "no such remote or remote group: %s"
-msgstr ""
-
-#: builtin/fetch.c:2205
-msgid "fetching a group and specifying refspecs does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2221
-msgid "must supply remote when using --negotiate-only"
-msgstr ""
-
-#: builtin/fetch.c:2226
-msgid "protocol does not support --negotiate-only, exiting"
-msgstr ""
-
-#: builtin/fetch.c:2246
-msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
-msgstr ""
-
-#: builtin/fetch.c:2250
-msgid "--atomic can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fetch.c:2254
-msgid "--stdin can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:7
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:19
-msgid "populate log with at most <n> entries from shortlog"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:22
-msgid "alias for --log (deprecated)"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:25
-msgid "text"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:26
-msgid "use <text> as start of message"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:28
-msgid "use <name> instead of the real target branch"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:29
-msgid "file to read from"
-msgstr ""
-
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [--points-at <object>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:13
-msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for shells"
-msgstr ""
-
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for perl"
-msgstr ""
-
-#: builtin/for-each-ref.c:35
-msgid "quote placeholders suitably for python"
-msgstr ""
-
-#: builtin/for-each-ref.c:37
-msgid "quote placeholders suitably for Tcl"
-msgstr ""
-
-#: builtin/for-each-ref.c:40
-msgid "show only <n> matched refs"
-msgstr ""
-
-#: builtin/for-each-ref.c:42 builtin/tag.c:482
-msgid "respect format colors"
-msgstr ""
-
-#: builtin/for-each-ref.c:45
-msgid "print only refs which points at the given object"
-msgstr ""
-
-#: builtin/for-each-ref.c:47
-msgid "print only refs that are merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:48
-msgid "print only refs that are not merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:49
-msgid "print only refs which contain the commit"
-msgstr ""
-
-#: builtin/for-each-ref.c:50
-msgid "print only refs which don't contain the commit"
-msgstr ""
-
-#: builtin/for-each-repo.c:9
-msgid "git for-each-repo --config=<config> <command-args>"
-msgstr ""
-
-#: builtin/for-each-repo.c:34
-msgid "config"
-msgstr ""
-
-#: builtin/for-each-repo.c:35
-msgid "config key storing a list of repository paths"
-msgstr ""
-
-#: builtin/for-each-repo.c:43
-msgid "missing --config=<config>"
-msgstr ""
-
-#: builtin/fsck.c:69 builtin/fsck.c:128 builtin/fsck.c:129
-msgid "unknown"
-msgstr ""
-
-#. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:78 builtin/fsck.c:100
-#, c-format
-msgid "error in %s %s: %s"
-msgstr ""
-
-#. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:94
-#, c-format
-msgid "warning in %s %s: %s"
-msgstr ""
-
-#: builtin/fsck.c:124 builtin/fsck.c:127
-#, c-format
-msgid "broken link from %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:136
-msgid "wrong object type in link"
-msgstr ""
-
-#: builtin/fsck.c:152
-#, c-format
-msgid ""
-"broken link from %7s %s\n"
-"              to %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:264
-#, c-format
-msgid "missing %s %s"
-msgstr ""
-
-#: builtin/fsck.c:291
-#, c-format
-msgid "unreachable %s %s"
-msgstr ""
-
-#: builtin/fsck.c:311
-#, c-format
-msgid "dangling %s %s"
-msgstr ""
-
-#: builtin/fsck.c:321
-msgid "could not create lost-found"
-msgstr ""
-
-#: builtin/fsck.c:332
-#, c-format
-msgid "could not finish '%s'"
-msgstr ""
-
-#: builtin/fsck.c:349
-#, c-format
-msgid "Checking %s"
-msgstr ""
-
-#: builtin/fsck.c:387
-#, c-format
-msgid "Checking connectivity (%d objects)"
-msgstr ""
-
-#: builtin/fsck.c:406
-#, c-format
-msgid "Checking %s %s"
-msgstr ""
-
-#: builtin/fsck.c:411
-msgid "broken links"
-msgstr ""
-
-#: builtin/fsck.c:420
-#, c-format
-msgid "root %s"
-msgstr ""
-
-#: builtin/fsck.c:428
-#, c-format
-msgid "tagged %s %s (%s) in %s"
-msgstr ""
-
-#: builtin/fsck.c:457
-#, c-format
-msgid "%s: object corrupt or missing"
-msgstr ""
-
-#: builtin/fsck.c:482
-#, c-format
-msgid "%s: invalid reflog entry %s"
-msgstr ""
-
-#: builtin/fsck.c:496
-#, c-format
-msgid "Checking reflog %s->%s"
-msgstr ""
-
-#: builtin/fsck.c:530
-#, c-format
-msgid "%s: invalid sha1 pointer %s"
-msgstr ""
-
-#: builtin/fsck.c:537
-#, c-format
-msgid "%s: not a commit"
-msgstr ""
-
-#: builtin/fsck.c:591
-msgid "notice: No default references"
-msgstr ""
-
-#: builtin/fsck.c:621
-#, c-format
-msgid "%s: hash-path mismatch, found at: %s"
-msgstr ""
-
-#: builtin/fsck.c:624
-#, c-format
-msgid "%s: object corrupt or missing: %s"
-msgstr ""
-
-#: builtin/fsck.c:628
-#, c-format
-msgid "%s: object is of unknown type '%s': %s"
-msgstr ""
-
-#: builtin/fsck.c:645
-#, c-format
-msgid "%s: object could not be parsed: %s"
-msgstr ""
-
-#: builtin/fsck.c:665
-#, c-format
-msgid "bad sha1 file: %s"
-msgstr ""
-
-#: builtin/fsck.c:686
-msgid "Checking object directory"
-msgstr ""
-
-#: builtin/fsck.c:689
-msgid "Checking object directories"
-msgstr ""
-
-#: builtin/fsck.c:705
-#, c-format
-msgid "Checking %s link"
-msgstr ""
-
-#: builtin/fsck.c:710 builtin/index-pack.c:862
-#, c-format
-msgid "invalid %s"
-msgstr ""
-
-#: builtin/fsck.c:717
-#, c-format
-msgid "%s points to something strange (%s)"
-msgstr ""
-
-#: builtin/fsck.c:723
-#, c-format
-msgid "%s: detached HEAD points at nothing"
-msgstr ""
-
-#: builtin/fsck.c:727
-#, c-format
-msgid "notice: %s points to an unborn branch (%s)"
-msgstr ""
-
-#: builtin/fsck.c:739
-msgid "Checking cache tree"
-msgstr ""
-
-#: builtin/fsck.c:744
-#, c-format
-msgid "%s: invalid sha1 pointer in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:753
-msgid "non-tree in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:784
-msgid "git fsck [<options>] [<object>...]"
-msgstr ""
-
-#: builtin/fsck.c:790
-msgid "show unreachable objects"
-msgstr ""
-
-#: builtin/fsck.c:791
-msgid "show dangling objects"
-msgstr ""
-
-#: builtin/fsck.c:792
-msgid "report tags"
-msgstr ""
-
-#: builtin/fsck.c:793
-msgid "report root nodes"
-msgstr ""
-
-#: builtin/fsck.c:794
-msgid "make index objects head nodes"
-msgstr ""
-
-#: builtin/fsck.c:795
-msgid "make reflogs head nodes (default)"
-msgstr ""
-
-#: builtin/fsck.c:796
-msgid "also consider packs and alternate objects"
-msgstr ""
-
-#: builtin/fsck.c:797
-msgid "check only connectivity"
-msgstr ""
-
-#: builtin/fsck.c:798 builtin/mktag.c:75
-msgid "enable more strict checking"
-msgstr ""
-
-#: builtin/fsck.c:800
-msgid "write dangling objects in .git/lost-found"
-msgstr ""
-
-#: builtin/fsck.c:801 builtin/prune.c:146
-msgid "show progress"
-msgstr ""
-
-#: builtin/fsck.c:802
-msgid "show verbose names for reachable objects"
-msgstr ""
-
-#: builtin/fsck.c:862 builtin/index-pack.c:261
-msgid "Checking objects"
-msgstr ""
-
-#: builtin/fsck.c:890
-#, c-format
-msgid "%s: object missing"
-msgstr ""
-
-#: builtin/fsck.c:901
-#, c-format
-msgid "invalid parameter: expected sha1, got '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:13
-msgid "git fsmonitor--daemon start [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:14
-msgid "git fsmonitor--daemon run [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:15
-msgid "git fsmonitor--daemon stop"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:16
-msgid "git fsmonitor--daemon status"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:38 builtin/fsmonitor--daemon.c:47
-#, c-format
-msgid "value of '%s' out of range: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:57
-#, c-format
-msgid "value of '%s' not bool or int: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:99
-#, c-format
-msgid "fsmonitor-daemon is watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:104
-#, c-format
-msgid "fsmonitor-daemon is not watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:170
-#, c-format
-msgid "could not create fsmonitor cookie '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:753
-#, c-format
-msgid "fsmonitor: cookie_result '%d' != SEEN"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1187
-#, c-format
-msgid "could not start IPC thread pool on '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1199
-msgid "could not start fsmonitor listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1297
-msgid "could not initialize listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1328 builtin/fsmonitor--daemon.c:1383
-#, c-format
-msgid "fsmonitor--daemon is already running '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1332
-#, c-format
-msgid "running fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1387
-#, c-format
-msgid "starting fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1413
-msgid "daemon failed to start"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1416
-msgid "daemon not online yet"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1419
-msgid "daemon terminated"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1429
-msgid "detach from console"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1432
-msgid "use <n> ipc worker threads"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1435
-msgid "max seconds to wait for background daemon startup"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1449
-#, c-format
-msgid "invalid 'ipc-threads' value (%d)"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1464
-#, c-format
-msgid "Unhandled subcommand '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1477
-msgid "fsmonitor--daemon not supported on this platform"
-msgstr ""
-
-#: builtin/gc.c:39
-msgid "git gc [<options>]"
-msgstr ""
-
-#: builtin/gc.c:93
-#, c-format
-msgid "Failed to fstat %s: %s"
-msgstr ""
-
-#: builtin/gc.c:129
-#, c-format
-msgid "failed to parse '%s' value '%s'"
-msgstr ""
-
-#: builtin/gc.c:488 builtin/init-db.c:57
-#, c-format
-msgid "cannot stat '%s'"
-msgstr ""
-
-#: builtin/gc.c:504
-#, c-format
-msgid ""
-"The last gc run reported the following. Please correct the root cause\n"
-"and remove %s\n"
-"Automatic cleanup will not be performed until the file is removed.\n"
-"\n"
-"%s"
-msgstr ""
-
-#: builtin/gc.c:552
-msgid "prune unreferenced objects"
-msgstr ""
-
-#: builtin/gc.c:554
-msgid "be more thorough (increased runtime)"
-msgstr ""
-
-#: builtin/gc.c:555
-msgid "enable auto-gc mode"
-msgstr ""
-
-#: builtin/gc.c:558
-msgid "force running gc even if there may be another gc running"
-msgstr ""
-
-#: builtin/gc.c:561
-msgid "repack all other packs except the largest pack"
-msgstr ""
-
-#: builtin/gc.c:577
-#, c-format
-msgid "failed to parse gc.logexpiry value %s"
-msgstr ""
-
-#: builtin/gc.c:588
-#, c-format
-msgid "failed to parse prune expiry value %s"
-msgstr ""
-
-#: builtin/gc.c:608
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:610
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:611
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
-msgstr ""
-
-#: builtin/gc.c:652
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
-msgstr ""
-
-#: builtin/gc.c:707
-msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
-msgstr ""
-
-#: builtin/gc.c:717
-msgid ""
-"git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
-msgstr ""
-
-#: builtin/gc.c:747
-msgid "--no-schedule is not allowed"
-msgstr ""
-
-#: builtin/gc.c:752
-#, c-format
-msgid "unrecognized --schedule argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:870
-msgid "failed to write commit-graph"
-msgstr ""
-
-#: builtin/gc.c:906
-msgid "failed to prefetch remotes"
-msgstr ""
-
-#: builtin/gc.c:1022
-msgid "failed to start 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1039
-msgid "failed to finish 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1090
-msgid "failed to write multi-pack-index"
-msgstr ""
-
-#: builtin/gc.c:1106
-msgid "'git multi-pack-index expire' failed"
-msgstr ""
-
-#: builtin/gc.c:1165
-msgid "'git multi-pack-index repack' failed"
-msgstr ""
-
-#: builtin/gc.c:1174
-msgid ""
-"skipping incremental-repack task because core.multiPackIndex is disabled"
-msgstr ""
-
-#: builtin/gc.c:1278
-#, c-format
-msgid "lock file '%s' exists, skipping maintenance"
-msgstr ""
-
-#: builtin/gc.c:1308
-#, c-format
-msgid "task '%s' failed"
-msgstr ""
-
-#: builtin/gc.c:1390
-#, c-format
-msgid "'%s' is not a valid task"
-msgstr ""
-
-#: builtin/gc.c:1395
-#, c-format
-msgid "task '%s' cannot be selected multiple times"
-msgstr ""
-
-#: builtin/gc.c:1410
-msgid "run tasks based on the state of the repository"
-msgstr ""
-
-#: builtin/gc.c:1411
-msgid "frequency"
-msgstr ""
-
-#: builtin/gc.c:1412
-msgid "run tasks based on frequency"
-msgstr ""
-
-#: builtin/gc.c:1415
-msgid "do not report progress or other information over stderr"
-msgstr ""
-
-#: builtin/gc.c:1416
-msgid "task"
-msgstr ""
-
-#: builtin/gc.c:1417
-msgid "run a specific task"
-msgstr ""
-
-#: builtin/gc.c:1434
-msgid "use at most one of --auto and --schedule=<frequency>"
-msgstr ""
-
-#: builtin/gc.c:1477
-msgid "failed to run 'git config'"
-msgstr ""
-
-#: builtin/gc.c:1629
-#, c-format
-msgid "failed to expand path '%s'"
-msgstr ""
-
-#: builtin/gc.c:1656 builtin/gc.c:1694
-msgid "failed to start launchctl"
-msgstr ""
-
-#: builtin/gc.c:1769 builtin/gc.c:2237
-#, c-format
-msgid "failed to create directories for '%s'"
-msgstr ""
-
-#: builtin/gc.c:1796
-#, c-format
-msgid "failed to bootstrap service %s"
-msgstr ""
-
-#: builtin/gc.c:1889
-msgid "failed to create temp xml file"
-msgstr ""
-
-#: builtin/gc.c:1979
-msgid "failed to start schtasks"
-msgstr ""
-
-#: builtin/gc.c:2063
-msgid "failed to run 'crontab -l'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2080
-msgid "failed to run 'crontab'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2084
-msgid "failed to open stdin of 'crontab'"
-msgstr ""
-
-#: builtin/gc.c:2126
-msgid "'crontab' died"
-msgstr ""
-
-#: builtin/gc.c:2191
-msgid "failed to start systemctl"
-msgstr ""
-
-#: builtin/gc.c:2201
-msgid "failed to run systemctl"
-msgstr ""
-
-#: builtin/gc.c:2210 builtin/gc.c:2215 builtin/worktree.c:63
-#: builtin/worktree.c:1024
-#, c-format
-msgid "failed to delete '%s'"
-msgstr ""
-
-#: builtin/gc.c:2395
-#, c-format
-msgid "unrecognized --scheduler argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:2420
-msgid "neither systemd timers nor crontab are available"
-msgstr ""
-
-#: builtin/gc.c:2435
-#, c-format
-msgid "%s scheduler is not available"
-msgstr ""
-
-#: builtin/gc.c:2449
-msgid "another process is scheduling background maintenance"
-msgstr ""
-
-#: builtin/gc.c:2471
-msgid "git maintenance start [--scheduler=<scheduler>]"
-msgstr ""
-
-#: builtin/gc.c:2480
-msgid "scheduler"
-msgstr ""
-
-#: builtin/gc.c:2481
-msgid "scheduler to trigger git maintenance run"
-msgstr ""
-
-#: builtin/gc.c:2495
-msgid "failed to add repo to global config"
-msgstr ""
-
-#: builtin/gc.c:2504
-msgid "git maintenance <subcommand> [<options>]"
-msgstr ""
-
-#: builtin/gc.c:2523
-#, c-format
-msgid "invalid subcommand: %s"
-msgstr ""
-
-#: builtin/grep.c:32
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
-
-#: builtin/grep.c:241
-#, c-format
-msgid "grep: failed to create thread: %s"
-msgstr ""
-
-#: builtin/grep.c:295
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
-msgstr ""
-
-#. TRANSLATORS: %s is the configuration
-#. variable for tweaking threads, currently
-#. grep.threads
-#.
-#: builtin/grep.c:303 builtin/index-pack.c:1587 builtin/index-pack.c:1791
-#: builtin/pack-objects.c:3150
-#, c-format
-msgid "no threads support, ignoring %s"
-msgstr ""
-
-#: builtin/grep.c:490 builtin/grep.c:619 builtin/grep.c:659
-#, c-format
-msgid "unable to read tree (%s)"
-msgstr ""
-
-#: builtin/grep.c:674
-#, c-format
-msgid "unable to grep from object of type %s"
-msgstr ""
-
-#: builtin/grep.c:754
-#, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr ""
-
-#: builtin/grep.c:852
-msgid "search in index instead of in the work tree"
-msgstr ""
-
-#: builtin/grep.c:854
-msgid "find in contents not managed by git"
-msgstr ""
-
-#: builtin/grep.c:856
-msgid "search in both tracked and untracked files"
-msgstr ""
-
-#: builtin/grep.c:858
-msgid "ignore files specified via '.gitignore'"
-msgstr ""
-
-#: builtin/grep.c:860
-msgid "recursively search in each submodule"
-msgstr ""
-
-#: builtin/grep.c:863
-msgid "show non-matching lines"
-msgstr ""
-
-#: builtin/grep.c:865
-msgid "case insensitive matching"
-msgstr ""
-
-#: builtin/grep.c:867
-msgid "match patterns only at word boundaries"
-msgstr ""
-
-#: builtin/grep.c:869
-msgid "process binary files as text"
-msgstr ""
-
-#: builtin/grep.c:871
-msgid "don't match patterns in binary files"
-msgstr ""
-
-#: builtin/grep.c:874
-msgid "process binary files with textconv filters"
-msgstr ""
-
-#: builtin/grep.c:876
-msgid "search in subdirectories (default)"
-msgstr ""
-
-#: builtin/grep.c:878
-msgid "descend at most <depth> levels"
-msgstr ""
-
-#: builtin/grep.c:882
-msgid "use extended POSIX regular expressions"
-msgstr ""
-
-#: builtin/grep.c:885
-msgid "use basic POSIX regular expressions (default)"
-msgstr ""
-
-#: builtin/grep.c:888
-msgid "interpret patterns as fixed strings"
-msgstr ""
-
-#: builtin/grep.c:891
-msgid "use Perl-compatible regular expressions"
-msgstr ""
-
-#: builtin/grep.c:894
-msgid "show line numbers"
-msgstr ""
-
-#: builtin/grep.c:895
-msgid "show column number of first match"
-msgstr ""
-
-#: builtin/grep.c:896
-msgid "don't show filenames"
-msgstr ""
-
-#: builtin/grep.c:897
-msgid "show filenames"
-msgstr ""
-
-#: builtin/grep.c:899
-msgid "show filenames relative to top directory"
-msgstr ""
-
-#: builtin/grep.c:901
-msgid "show only filenames instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:903
-msgid "synonym for --files-with-matches"
-msgstr ""
-
-#: builtin/grep.c:906
-msgid "show only the names of files without match"
-msgstr ""
-
-#: builtin/grep.c:908
-msgid "print NUL after filenames"
-msgstr ""
-
-#: builtin/grep.c:911
-msgid "show only matching parts of a line"
-msgstr ""
-
-#: builtin/grep.c:913
-msgid "show the number of matches instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:914
-msgid "highlight matches"
-msgstr ""
-
-#: builtin/grep.c:916
-msgid "print empty line between matches from different files"
-msgstr ""
-
-#: builtin/grep.c:918
-msgid "show filename only once above matches from same file"
-msgstr ""
-
-#: builtin/grep.c:921
-msgid "show <n> context lines before and after matches"
-msgstr ""
-
-#: builtin/grep.c:924
-msgid "show <n> context lines before matches"
-msgstr ""
-
-#: builtin/grep.c:926
-msgid "show <n> context lines after matches"
-msgstr ""
-
-#: builtin/grep.c:928
-msgid "use <n> worker threads"
-msgstr ""
-
-#: builtin/grep.c:929
-msgid "shortcut for -C NUM"
-msgstr ""
-
-#: builtin/grep.c:932
-msgid "show a line with the function name before matches"
-msgstr ""
-
-#: builtin/grep.c:934
-msgid "show the surrounding function"
-msgstr ""
-
-#: builtin/grep.c:937
-msgid "read patterns from file"
-msgstr ""
-
-#: builtin/grep.c:939
-msgid "match <pattern>"
-msgstr ""
-
-#: builtin/grep.c:941
-msgid "combine patterns specified with -e"
-msgstr ""
-
-#: builtin/grep.c:953
-msgid "indicate hit with exit status without output"
-msgstr ""
-
-#: builtin/grep.c:955
-msgid "show only matches from files that match all patterns"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "pager"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "show matching files in the pager"
-msgstr ""
-
-#: builtin/grep.c:962
-msgid "allow calling of grep(1) (ignored by this build)"
-msgstr ""
-
-#: builtin/grep.c:1028
-msgid "no pattern given"
-msgstr ""
-
-#: builtin/grep.c:1064
-msgid "--no-index or --untracked cannot be used with revs"
-msgstr ""
-
-#: builtin/grep.c:1072
-#, c-format
-msgid "unable to resolve revision: %s"
-msgstr ""
-
-#: builtin/grep.c:1102
-msgid "--untracked not supported with --recurse-submodules"
-msgstr ""
-
-#: builtin/grep.c:1106
-msgid "invalid option combination, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1109 builtin/pack-objects.c:4084
-msgid "no threads support, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1112 builtin/index-pack.c:1584 builtin/pack-objects.c:3147
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr ""
-
-#: builtin/grep.c:1146
-msgid "--open-files-in-pager only works on the worktree"
-msgstr ""
-
-#: builtin/grep.c:1179
-msgid "--[no-]exclude-standard cannot be used for tracked contents"
-msgstr ""
-
-#: builtin/grep.c:1187
-msgid "both --cached and trees are given"
-msgstr ""
-
-#: builtin/hash-object.c:83
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
-msgstr ""
-
-#: builtin/hash-object.c:97
-msgid "object type"
-msgstr ""
-
-#: builtin/hash-object.c:98
-msgid "write the object into the object database"
-msgstr ""
-
-#: builtin/hash-object.c:100
-msgid "read the object from stdin"
-msgstr ""
-
-#: builtin/hash-object.c:102
-msgid "store file as is without filters"
-msgstr ""
-
-#: builtin/hash-object.c:103
-msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
-msgstr ""
-
-#: builtin/hash-object.c:104
-msgid "process file as it were from this path"
-msgstr ""
-
-#: builtin/help.c:57
-msgid "print all available commands"
-msgstr ""
-
-#: builtin/help.c:60
-msgid "show external commands in --all"
-msgstr ""
-
-#: builtin/help.c:61
-msgid "show aliases in --all"
-msgstr ""
-
-#: builtin/help.c:62
-msgid "exclude guides"
-msgstr ""
-
-#: builtin/help.c:63
-msgid "show man page"
-msgstr ""
-
-#: builtin/help.c:64
-msgid "show manual in web browser"
-msgstr ""
-
-#: builtin/help.c:66
-msgid "show info page"
-msgstr ""
-
-#: builtin/help.c:68
-msgid "print command description"
-msgstr ""
-
-#: builtin/help.c:70
-msgid "print list of useful guides"
-msgstr ""
-
-#: builtin/help.c:72
-msgid "print all configuration variable names"
-msgstr ""
-
-#: builtin/help.c:84
-msgid "git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"
-msgstr ""
-
-#: builtin/help.c:201
-#, c-format
-msgid "unrecognized help format '%s'"
-msgstr ""
-
-#: builtin/help.c:227
-msgid "Failed to start emacsclient."
-msgstr ""
-
-#: builtin/help.c:240
-msgid "Failed to parse emacsclient version."
-msgstr ""
-
-#: builtin/help.c:248
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr ""
-
-#: builtin/help.c:266 builtin/help.c:288 builtin/help.c:298 builtin/help.c:306
-#, c-format
-msgid "failed to exec '%s'"
-msgstr ""
-
-#: builtin/help.c:344
-#, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
-msgstr ""
-
-#: builtin/help.c:356
-#, c-format
-msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
-msgstr ""
-
-#: builtin/help.c:471
-#, c-format
-msgid "'%s': unknown man viewer."
-msgstr ""
-
-#: builtin/help.c:487
-msgid "no man viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:494
-msgid "no info viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:555 builtin/help.c:566 git.c:348
-#, c-format
-msgid "'%s' is aliased to '%s'"
-msgstr ""
-
-#: builtin/help.c:569 git.c:380
-#, c-format
-msgid "bad alias.%s string: %s"
-msgstr ""
-
-#: builtin/help.c:611
-#, c-format
-msgid "the '%s' option doesn't take any non-option arguments"
-msgstr ""
-
-#: builtin/help.c:631
-msgid ""
-"the '--no-[external-commands|aliases]' options can only be used with '--all'"
-msgstr ""
-
-#: builtin/help.c:643 builtin/help.c:671
-#, c-format
-msgid "usage: %s%s"
-msgstr ""
-
-#: builtin/help.c:666
-msgid "'git help config' for more information"
-msgstr ""
-
-#: builtin/hook.c:10
-msgid "git hook run [--ignore-missing] <hook-name> [-- <hook-args>]"
-msgstr ""
-
-#: builtin/hook.c:30
-msgid "silently ignore missing requested <hook-name>"
-msgstr ""
-
-#: builtin/index-pack.c:221
-#, c-format
-msgid "object type mismatch at %s"
-msgstr ""
-
-#: builtin/index-pack.c:241
-#, c-format
-msgid "did not receive expected object %s"
-msgstr ""
-
-#: builtin/index-pack.c:244
-#, c-format
-msgid "object %s: expected type %s, found %s"
-msgstr ""
-
-#: builtin/index-pack.c:294
-#, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:304
-msgid "early EOF"
-msgstr ""
-
-#: builtin/index-pack.c:305
-msgid "read error on input"
-msgstr ""
-
-#: builtin/index-pack.c:317
-msgid "used more bytes than were available"
-msgstr ""
-
-#: builtin/index-pack.c:324 builtin/pack-objects.c:754
-msgid "pack too large for current definition of off_t"
-msgstr ""
-
-#: builtin/index-pack.c:329
-#, c-format
-msgid "pack exceeds maximum allowed size (%s)"
-msgstr ""
-
-#: builtin/index-pack.c:362
-msgid "pack signature mismatch"
-msgstr ""
-
-#: builtin/index-pack.c:364
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr ""
-
-#: builtin/index-pack.c:380
-#, c-format
-msgid "pack has bad object at offset %<PRIuMAX>: %s"
-msgstr ""
-
-#: builtin/index-pack.c:485
-#, c-format
-msgid "inflate returned %d"
-msgstr ""
-
-#: builtin/index-pack.c:534
-msgid "offset value overflow for delta base object"
-msgstr ""
-
-#: builtin/index-pack.c:542
-msgid "delta base offset is out of bound"
-msgstr ""
-
-#: builtin/index-pack.c:550
-#, c-format
-msgid "unknown object type %d"
-msgstr ""
-
-#: builtin/index-pack.c:581
-msgid "cannot pread pack file"
-msgstr ""
-
-#: builtin/index-pack.c:583
-#, c-format
-msgid "premature end of pack file, %<PRIuMAX> byte missing"
-msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:609
-msgid "serious inflate inconsistency"
-msgstr ""
-
-#: builtin/index-pack.c:754 builtin/index-pack.c:760 builtin/index-pack.c:784
-#: builtin/index-pack.c:823 builtin/index-pack.c:832
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
-msgstr ""
-
-#: builtin/index-pack.c:757 builtin/pack-objects.c:290
-#: builtin/pack-objects.c:350 builtin/pack-objects.c:456
-#, c-format
-msgid "unable to read %s"
-msgstr ""
-
-#: builtin/index-pack.c:821
-#, c-format
-msgid "cannot read existing object info %s"
-msgstr ""
-
-#: builtin/index-pack.c:829
-#, c-format
-msgid "cannot read existing object %s"
-msgstr ""
-
-#: builtin/index-pack.c:843
-#, c-format
-msgid "invalid blob object %s"
-msgstr ""
-
-#: builtin/index-pack.c:846 builtin/index-pack.c:865
-msgid "fsck error in packed object"
-msgstr ""
-
-#: builtin/index-pack.c:867
-#, c-format
-msgid "Not all child objects of %s are reachable"
-msgstr ""
-
-#: builtin/index-pack.c:928 builtin/index-pack.c:975
-msgid "failed to apply delta"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Receiving objects"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Indexing objects"
-msgstr ""
-
-#: builtin/index-pack.c:1195
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr ""
-
-#: builtin/index-pack.c:1200
-msgid "cannot fstat packfile"
-msgstr ""
-
-#: builtin/index-pack.c:1203
-msgid "pack has junk at the end"
-msgstr ""
-
-#: builtin/index-pack.c:1215
-msgid "confusion beyond insanity in parse_pack_objects()"
-msgstr ""
-
-#: builtin/index-pack.c:1238
-msgid "Resolving deltas"
-msgstr ""
-
-#: builtin/index-pack.c:1249 builtin/pack-objects.c:2913
-#, c-format
-msgid "unable to create thread: %s"
-msgstr ""
-
-#: builtin/index-pack.c:1282
-msgid "confusion beyond insanity"
-msgstr ""
-
-#: builtin/index-pack.c:1288
-#, c-format
-msgid "completed with %d local object"
-msgid_plural "completed with %d local objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1300
-#, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr ""
-
-#: builtin/index-pack.c:1304
-#, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1328
-#, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr ""
-
-#: builtin/index-pack.c:1423
-#, c-format
-msgid "local object %s is corrupt"
-msgstr ""
-
-#: builtin/index-pack.c:1445
-#, c-format
-msgid "packfile name '%s' does not end with '.%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1469
-#, c-format
-msgid "cannot write %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1477
-#, c-format
-msgid "cannot close written %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1494
-#, c-format
-msgid "unable to rename temporary '*.%s' file to '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1519
-msgid "error while closing pack file"
-msgstr ""
-
-#: builtin/index-pack.c:1578 builtin/pack-objects.c:3158
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr ""
-
-#: builtin/index-pack.c:1648
-#, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1650
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1698
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1705
-#, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1748
-msgid "Cannot come back to cwd"
-msgstr ""
-
-#: builtin/index-pack.c:1802 builtin/index-pack.c:1805
-#: builtin/index-pack.c:1825 builtin/index-pack.c:1829
-#, c-format
-msgid "bad %s"
-msgstr ""
-
-#: builtin/index-pack.c:1835 builtin/init-db.c:379 builtin/init-db.c:614
-#, c-format
-msgid "unknown hash algorithm '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1856
-msgid "--stdin requires a git repository"
-msgstr ""
-
-#: builtin/index-pack.c:1873
-msgid "--verify with no packfile name given"
-msgstr ""
-
-#: builtin/index-pack.c:1939 builtin/unpack-objects.c:584
-msgid "fsck error in pack objects"
-msgstr ""
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr ""
-
-#: builtin/init-db.c:68
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr ""
-
-#: builtin/init-db.c:80
-#, c-format
-msgid "cannot readlink '%s'"
-msgstr ""
-
-#: builtin/init-db.c:82
-#, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr ""
-
-#: builtin/init-db.c:88
-#, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr ""
-
-#: builtin/init-db.c:92
-#, c-format
-msgid "ignoring template %s"
-msgstr ""
-
-#: builtin/init-db.c:123
-#, c-format
-msgid "templates not found in %s"
-msgstr ""
-
-#: builtin/init-db.c:138
-#, c-format
-msgid "not copying templates from '%s': %s"
-msgstr ""
-
-#: builtin/init-db.c:263
-#, c-format
-msgid "invalid initial branch name: '%s'"
-msgstr ""
-
-#: builtin/init-db.c:354
-#, c-format
-msgid "unable to handle file type %d"
-msgstr ""
-
-#: builtin/init-db.c:357
-#, c-format
-msgid "unable to move %s to %s"
-msgstr ""
-
-#: builtin/init-db.c:373
-msgid "attempt to reinitialize repository with different hash"
-msgstr ""
-
-#: builtin/init-db.c:397 builtin/init-db.c:400
-#, c-format
-msgid "%s already exists"
-msgstr ""
-
-#: builtin/init-db.c:432
-#, c-format
-msgid "re-init: ignored --initial-branch=%s"
-msgstr ""
-
-#: builtin/init-db.c:463
-#, c-format
-msgid "Reinitialized existing shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:464
-#, c-format
-msgid "Reinitialized existing Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:468
-#, c-format
-msgid "Initialized empty shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:469
-#, c-format
-msgid "Initialized empty Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:518
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-
-#: builtin/init-db.c:544
-msgid "permissions"
-msgstr ""
-
-#: builtin/init-db.c:545
-msgid "specify that the git repository is to be shared amongst several users"
-msgstr ""
-
-#: builtin/init-db.c:551
-msgid "override the name of the initial branch"
-msgstr ""
-
-#: builtin/init-db.c:552 builtin/verify-pack.c:74
-msgid "hash"
-msgstr ""
-
-#: builtin/init-db.c:553 builtin/show-index.c:22 builtin/verify-pack.c:75
-msgid "specify the hash algorithm to use"
-msgstr ""
-
-#: builtin/init-db.c:591 builtin/init-db.c:596
-#, c-format
-msgid "cannot mkdir %s"
-msgstr ""
-
-#: builtin/init-db.c:600 builtin/init-db.c:655
-#, c-format
-msgid "cannot chdir to %s"
-msgstr ""
-
-#: builtin/init-db.c:627
-#, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-msgstr ""
-
-#: builtin/init-db.c:679
-#, c-format
-msgid "Cannot access work tree '%s'"
-msgstr ""
-
-#: builtin/init-db.c:684
-msgid "--separate-git-dir incompatible with bare repository"
-msgstr ""
-
-#: builtin/interpret-trailers.c:16
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
-msgstr ""
-
-#: builtin/interpret-trailers.c:95
-msgid "edit files in place"
-msgstr ""
-
-#: builtin/interpret-trailers.c:96
-msgid "trim empty trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:99
-msgid "where to place the new trailer"
-msgstr ""
-
-#: builtin/interpret-trailers.c:101
-msgid "action if trailer already exists"
-msgstr ""
-
-#: builtin/interpret-trailers.c:103
-msgid "action if trailer is missing"
-msgstr ""
-
-#: builtin/interpret-trailers.c:105
-msgid "output only the trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:106
-msgid "do not apply config rules"
-msgstr ""
-
-#: builtin/interpret-trailers.c:107
-msgid "join whitespace-continued values"
-msgstr ""
-
-#: builtin/interpret-trailers.c:108
-msgid "set parsing options"
-msgstr ""
-
-#: builtin/interpret-trailers.c:110
-msgid "do not treat --- specially"
-msgstr ""
-
-#: builtin/interpret-trailers.c:112
-msgid "trailer(s) to add"
-msgstr ""
-
-#: builtin/interpret-trailers.c:123
-msgid "--trailer with --only-input does not make sense"
-msgstr ""
-
-#: builtin/interpret-trailers.c:133
-msgid "no input file given for in-place editing"
-msgstr ""
-
-#: builtin/log.c:60
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/log.c:61
-msgid "git show [<options>] <object>..."
-msgstr ""
-
-#: builtin/log.c:114
-#, c-format
-msgid "invalid --decorate option: %s"
-msgstr ""
-
-#: builtin/log.c:181
-msgid "show source"
-msgstr ""
-
-#: builtin/log.c:182
-msgid "use mail map file"
-msgstr ""
-
-#: builtin/log.c:185
-msgid "only decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:187
-msgid "do not decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:188
-msgid "decorate options"
-msgstr ""
-
-#: builtin/log.c:191
-msgid ""
-"trace the evolution of line range <start>,<end> or function :<funcname> in "
-"<file>"
-msgstr ""
-
-#: builtin/log.c:214
-msgid "-L<range>:<file> cannot be used with pathspec"
-msgstr ""
-
-#: builtin/log.c:322
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr ""
-
-#: builtin/log.c:429
-msgid "unable to create temporary object directory"
-msgstr ""
-
-#: builtin/log.c:599
-#, c-format
-msgid "git show %s: bad file"
-msgstr ""
-
-#: builtin/log.c:614 builtin/log.c:706
-#, c-format
-msgid "could not read object %s"
-msgstr ""
-
-#: builtin/log.c:731
-#, c-format
-msgid "unknown type: %d"
-msgstr ""
-
-#: builtin/log.c:880
-#, c-format
-msgid "%s: invalid cover from description mode"
-msgstr ""
-
-#: builtin/log.c:887
-msgid "format.headers without value"
-msgstr ""
-
-#: builtin/log.c:1016
-#, c-format
-msgid "cannot open patch file %s"
-msgstr ""
-
-#: builtin/log.c:1033
-msgid "need exactly one range"
-msgstr ""
-
-#: builtin/log.c:1043
-msgid "not a range"
-msgstr ""
-
-#: builtin/log.c:1207
-msgid "cover letter needs email format"
-msgstr ""
-
-#: builtin/log.c:1213
-msgid "failed to create cover-letter file"
-msgstr ""
-
-#: builtin/log.c:1300
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr ""
-
-#: builtin/log.c:1327
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
-msgstr ""
-
-#: builtin/log.c:1385
-msgid "two output directories?"
-msgstr ""
-
-#: builtin/log.c:1536 builtin/log.c:2369 builtin/log.c:2371 builtin/log.c:2383
-#, c-format
-msgid "unknown commit %s"
-msgstr ""
-
-#: builtin/log.c:1547 builtin/replace.c:58 builtin/replace.c:207
-#: builtin/replace.c:210
-#, c-format
-msgid "failed to resolve '%s' as a valid ref"
-msgstr ""
-
-#: builtin/log.c:1556
-msgid "could not find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1566
-msgid ""
-"failed to get upstream, if you want to record base commit automatically,\n"
-"please use git branch --set-upstream-to to track a remote branch.\n"
-"Or you could specify base commit by --base=<base-commit-id> manually"
-msgstr ""
-
-#: builtin/log.c:1589
-msgid "failed to find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1606
-msgid "base commit should be the ancestor of revision list"
-msgstr ""
-
-#: builtin/log.c:1616
-msgid "base commit shouldn't be in revision list"
-msgstr ""
-
-#: builtin/log.c:1674
-msgid "cannot get patch id"
-msgstr ""
-
-#: builtin/log.c:1737
-msgid "failed to infer range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1739
-#, c-format
-msgid "using '%s' as range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1783
-msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
-
-#: builtin/log.c:1786
-msgid "use [PATCH] even with multiple patches"
-msgstr ""
-
-#: builtin/log.c:1790
-msgid "print patches to standard out"
-msgstr ""
-
-#: builtin/log.c:1792
-msgid "generate a cover letter"
-msgstr ""
-
-#: builtin/log.c:1794
-msgid "use simple number sequence for output file names"
-msgstr ""
-
-#: builtin/log.c:1795
-msgid "sfx"
-msgstr ""
-
-#: builtin/log.c:1796
-msgid "use <sfx> instead of '.patch'"
-msgstr ""
-
-#: builtin/log.c:1798
-msgid "start numbering patches at <n> instead of 1"
-msgstr ""
-
-#: builtin/log.c:1799
-msgid "reroll-count"
-msgstr ""
-
-#: builtin/log.c:1800
-msgid "mark the series as Nth re-roll"
-msgstr ""
-
-#: builtin/log.c:1802
-msgid "max length of output filename"
-msgstr ""
-
-#: builtin/log.c:1804
-msgid "use [RFC PATCH] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1807
-msgid "cover-from-description-mode"
-msgstr ""
-
-#: builtin/log.c:1808
-msgid "generate parts of a cover letter based on a branch's description"
-msgstr ""
-
-#: builtin/log.c:1810
-msgid "use [<prefix>] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1813
-msgid "store resulting files in <dir>"
-msgstr ""
-
-#: builtin/log.c:1816
-msgid "don't strip/add [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1819
-msgid "don't output binary diffs"
-msgstr ""
-
-#: builtin/log.c:1821
-msgid "output all-zero hash in From header"
-msgstr ""
-
-#: builtin/log.c:1823
-msgid "don't include a patch matching a commit upstream"
-msgstr ""
-
-#: builtin/log.c:1825
-msgid "show patch format instead of default (patch + stat)"
-msgstr ""
-
-#: builtin/log.c:1827
-msgid "Messaging"
-msgstr ""
-
-#: builtin/log.c:1828
-msgid "header"
-msgstr ""
-
-#: builtin/log.c:1829
-msgid "add email header"
-msgstr ""
-
-#: builtin/log.c:1830 builtin/log.c:1831
-msgid "email"
-msgstr ""
-
-#: builtin/log.c:1830
-msgid "add To: header"
-msgstr ""
-
-#: builtin/log.c:1831
-msgid "add Cc: header"
-msgstr ""
-
-#: builtin/log.c:1832
-msgid "ident"
-msgstr ""
-
-#: builtin/log.c:1833
-msgid "set From address to <ident> (or committer ident if absent)"
-msgstr ""
-
-#: builtin/log.c:1835
-msgid "message-id"
-msgstr ""
-
-#: builtin/log.c:1836
-msgid "make first mail a reply to <message-id>"
-msgstr ""
-
-#: builtin/log.c:1837 builtin/log.c:1840
-msgid "boundary"
-msgstr ""
-
-#: builtin/log.c:1838
-msgid "attach the patch"
-msgstr ""
-
-#: builtin/log.c:1841
-msgid "inline the patch"
-msgstr ""
-
-#: builtin/log.c:1845
-msgid "enable message threading, styles: shallow, deep"
-msgstr ""
-
-#: builtin/log.c:1847
-msgid "signature"
-msgstr ""
-
-#: builtin/log.c:1848
-msgid "add a signature"
-msgstr ""
-
-#: builtin/log.c:1849
-msgid "base-commit"
-msgstr ""
-
-#: builtin/log.c:1850
-msgid "add prerequisite tree info to the patch series"
-msgstr ""
-
-#: builtin/log.c:1853
-msgid "add a signature from a file"
-msgstr ""
-
-#: builtin/log.c:1854
-msgid "don't print the patch filenames"
-msgstr ""
-
-#: builtin/log.c:1856
-msgid "show progress while generating patches"
-msgstr ""
-
-#: builtin/log.c:1858
-msgid "show changes against <rev> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1861
-msgid "show changes against <refspec> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1863 builtin/range-diff.c:28
-msgid "percentage by which creation is weighted"
-msgstr ""
-
-#: builtin/log.c:1953
-#, c-format
-msgid "invalid ident line: %s"
-msgstr ""
-
-#: builtin/log.c:1978
-msgid "--name-only does not make sense"
-msgstr ""
-
-#: builtin/log.c:1980
-msgid "--name-status does not make sense"
-msgstr ""
-
-#: builtin/log.c:1982
-msgid "--check does not make sense"
-msgstr ""
-
-#: builtin/log.c:1984
-msgid "--remerge-diff does not make sense"
-msgstr ""
-
-#: builtin/log.c:2129
-msgid "--interdiff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2133
-msgid "Interdiff:"
-msgstr ""
-
-#: builtin/log.c:2134
-#, c-format
-msgid "Interdiff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2144
-msgid "--range-diff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2152
-msgid "Range-diff:"
-msgstr ""
-
-#: builtin/log.c:2153
-#, c-format
-msgid "Range-diff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2164
-#, c-format
-msgid "unable to read signature file '%s'"
-msgstr ""
-
-#: builtin/log.c:2200
-msgid "Generating patches"
-msgstr ""
-
-#: builtin/log.c:2244
-msgid "failed to create output files"
-msgstr ""
-
-#: builtin/log.c:2304
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
-
-#: builtin/log.c:2358
-#, c-format
-msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
-msgstr ""
-
-#: builtin/ls-files.c:564
-msgid "git ls-files [<options>] [<file>...]"
-msgstr ""
-
-#: builtin/ls-files.c:618
-msgid "separate paths with the NUL character"
-msgstr ""
-
-#: builtin/ls-files.c:620
-msgid "identify the file status with tags"
-msgstr ""
-
-#: builtin/ls-files.c:622
-msgid "use lowercase letters for 'assume unchanged' files"
-msgstr ""
-
-#: builtin/ls-files.c:624
-msgid "use lowercase letters for 'fsmonitor clean' files"
-msgstr ""
-
-#: builtin/ls-files.c:626
-msgid "show cached files in the output (default)"
-msgstr ""
-
-#: builtin/ls-files.c:628
-msgid "show deleted files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:630
-msgid "show modified files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:632
-msgid "show other files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:634
-msgid "show ignored files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:637
-msgid "show staged contents' object name in the output"
-msgstr ""
-
-#: builtin/ls-files.c:639
-msgid "show files on the filesystem that need to be removed"
-msgstr ""
-
-#: builtin/ls-files.c:641
-msgid "show 'other' directories' names only"
-msgstr ""
-
-#: builtin/ls-files.c:643
-msgid "show line endings of files"
-msgstr ""
-
-#: builtin/ls-files.c:645
-msgid "don't show empty directories"
-msgstr ""
-
-#: builtin/ls-files.c:648
-msgid "show unmerged files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:650
-msgid "show resolve-undo information"
-msgstr ""
-
-#: builtin/ls-files.c:652
-msgid "skip files matching pattern"
-msgstr ""
-
-#: builtin/ls-files.c:655
-msgid "read exclude patterns from <file>"
-msgstr ""
-
-#: builtin/ls-files.c:658
-msgid "read additional per-directory exclude patterns in <file>"
-msgstr ""
-
-#: builtin/ls-files.c:660
-msgid "add the standard git exclusions"
-msgstr ""
-
-#: builtin/ls-files.c:664
-msgid "make the output relative to the project top directory"
-msgstr ""
-
-#: builtin/ls-files.c:669
-msgid "if any <file> is not in the index, treat this as an error"
-msgstr ""
-
-#: builtin/ls-files.c:670
-msgid "tree-ish"
-msgstr ""
-
-#: builtin/ls-files.c:671
-msgid "pretend that paths removed since <tree-ish> are still present"
-msgstr ""
-
-#: builtin/ls-files.c:673
-msgid "show debugging data"
-msgstr ""
-
-#: builtin/ls-files.c:675
-msgid "suppress duplicate entries"
-msgstr ""
-
-#: builtin/ls-files.c:677
-msgid "show sparse directories in the presence of a sparse index"
-msgstr ""
-
-#: builtin/ls-remote.c:9
-msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"              [-q | --quiet] [--exit-code] [--get-url]\n"
-"              [--symref] [<repository> [<refs>...]]"
-msgstr ""
-
-#: builtin/ls-remote.c:60
-msgid "do not print remote URL"
-msgstr ""
-
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1131
-msgid "exec"
-msgstr ""
-
-#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
-msgid "path of git-upload-pack on the remote host"
-msgstr ""
-
-#: builtin/ls-remote.c:66
-msgid "limit to tags"
-msgstr ""
-
-#: builtin/ls-remote.c:67
-msgid "limit to heads"
-msgstr ""
-
-#: builtin/ls-remote.c:68
-msgid "do not show peeled tags"
-msgstr ""
-
-#: builtin/ls-remote.c:70
-msgid "take url.<base>.insteadOf into account"
-msgstr ""
-
-#: builtin/ls-remote.c:73
-msgid "exit with exit code 2 if no matching refs are found"
-msgstr ""
-
-#: builtin/ls-remote.c:76
-msgid "show underlying ref in addition to the object pointed by it"
-msgstr ""
-
-#: builtin/ls-tree.c:36
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: builtin/ls-tree.c:54
-#, c-format
-msgid "could not get object info about '%s'"
-msgstr ""
-
-#: builtin/ls-tree.c:79
-#, c-format
-msgid "bad ls-tree format: element '%s' does not start with '('"
-msgstr ""
-
-#: builtin/ls-tree.c:83
-#, c-format
-msgid "bad ls-tree format: element '%s' does not end in ')'"
-msgstr ""
-
-#: builtin/ls-tree.c:109
-#, c-format
-msgid "bad ls-tree format: %%%.*s"
-msgstr ""
-
-#: builtin/ls-tree.c:336
-msgid "only show trees"
-msgstr ""
-
-#: builtin/ls-tree.c:338
-msgid "recurse into subtrees"
-msgstr ""
-
-#: builtin/ls-tree.c:340
-msgid "show trees when recursing"
-msgstr ""
-
-#: builtin/ls-tree.c:343
-msgid "terminate entries with NUL byte"
-msgstr ""
-
-#: builtin/ls-tree.c:344
-msgid "include object size"
-msgstr ""
-
-#: builtin/ls-tree.c:346 builtin/ls-tree.c:348
-msgid "list only filenames"
-msgstr ""
-
-#: builtin/ls-tree.c:350
-msgid "list only objects"
-msgstr ""
-
-#: builtin/ls-tree.c:353
-msgid "use full path names"
-msgstr ""
-
-#: builtin/ls-tree.c:355
-msgid "list entire tree; not just current directory (implies --full-name)"
-msgstr ""
-
-#: builtin/ls-tree.c:391
-msgid "--format can't be combined with other format-altering options"
-msgstr ""
-
-#. TRANSLATORS: keep <> in "<" mail ">" info.
-#: builtin/mailinfo.c:14
-msgid "git mailinfo [<options>] <msg> <patch> < mail >info"
-msgstr ""
-
-#: builtin/mailinfo.c:58
-msgid "keep subject"
-msgstr ""
-
-#: builtin/mailinfo.c:60
-msgid "keep non patch brackets in subject"
-msgstr ""
-
-#: builtin/mailinfo.c:62
-msgid "copy Message-ID to the end of commit message"
-msgstr ""
-
-#: builtin/mailinfo.c:64
-msgid "re-code metadata to i18n.commitEncoding"
-msgstr ""
-
-#: builtin/mailinfo.c:67
-msgid "disable charset re-coding of metadata"
-msgstr ""
-
-#: builtin/mailinfo.c:69
-msgid "encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:70
-msgid "re-code metadata to this encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:72
-msgid "use scissors"
-msgstr ""
-
-#: builtin/mailinfo.c:73
-msgid "<action>"
-msgstr ""
-
-#: builtin/mailinfo.c:74
-msgid "action when quoted CR is found"
-msgstr ""
-
-#: builtin/mailinfo.c:77
-msgid "use headers in message's body"
-msgstr ""
-
-#: builtin/mailsplit.c:227
-msgid "reading patches from stdin/tty..."
-msgstr ""
-
-#: builtin/mailsplit.c:242
-#, c-format
-msgid "empty mbox: '%s'"
-msgstr ""
-
-#: builtin/merge-base.c:32
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:33
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:34
-msgid "git merge-base --independent <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:35
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr ""
-
-#: builtin/merge-base.c:36
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr ""
-
-#: builtin/merge-base.c:144
-msgid "output all common ancestors"
-msgstr ""
-
-#: builtin/merge-base.c:146
-msgid "find ancestors for a single n-way merge"
-msgstr ""
-
-#: builtin/merge-base.c:148
-msgid "list revs not reachable from others"
-msgstr ""
-
-#: builtin/merge-base.c:150
-msgid "is the first one ancestor of the other?"
-msgstr ""
-
-#: builtin/merge-base.c:152
-msgid "find where <commit> forked from reflog of <ref>"
-msgstr ""
-
-#: builtin/merge-file.c:9
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
-msgstr ""
-
-#: builtin/merge-file.c:35
-msgid "send results to standard output"
-msgstr ""
-
-#: builtin/merge-file.c:36
-msgid "use a diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:37
-msgid "use a zealous diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:39
-msgid "for conflicts, use our version"
-msgstr ""
-
-#: builtin/merge-file.c:41
-msgid "for conflicts, use their version"
-msgstr ""
-
-#: builtin/merge-file.c:43
-msgid "for conflicts, use a union version"
-msgstr ""
-
-#: builtin/merge-file.c:46
-msgid "for conflicts, use this marker size"
-msgstr ""
-
-#: builtin/merge-file.c:47
-msgid "do not warn about conflicts"
-msgstr ""
-
-#: builtin/merge-file.c:49
-msgid "set labels for file1/orig-file/file2"
-msgstr ""
-
-#: builtin/merge-recursive.c:47
-#, c-format
-msgid "unknown option %s"
-msgstr ""
-
-#: builtin/merge-recursive.c:53
-#, c-format
-msgid "could not parse object '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:57
-#, c-format
-msgid "cannot handle more than %d base. Ignoring %s."
-msgid_plural "cannot handle more than %d bases. Ignoring %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/merge-recursive.c:65
-msgid "not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge-recursive.c:74 builtin/merge-recursive.c:76
-#, c-format
-msgid "could not resolve ref '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:82
-#, c-format
-msgid "Merging %s with %s\n"
-msgstr ""
-
-#: builtin/merge.c:59
-msgid "git merge [<options>] [<commit>...]"
-msgstr ""
-
-#: builtin/merge.c:125
-msgid "switch `m' requires a value"
-msgstr ""
-
-#: builtin/merge.c:148
-#, c-format
-msgid "option `%s' requires a value"
-msgstr ""
-
-#: builtin/merge.c:201
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr ""
-
-#: builtin/merge.c:202
-#, c-format
-msgid "Available strategies are:"
-msgstr ""
-
-#: builtin/merge.c:207
-#, c-format
-msgid "Available custom strategies are:"
-msgstr ""
-
-#: builtin/merge.c:258 builtin/pull.c:134
-msgid "do not show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:261 builtin/pull.c:137
-msgid "show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:262 builtin/pull.c:140
-msgid "(synonym to --stat)"
-msgstr ""
-
-#: builtin/merge.c:264 builtin/pull.c:143
-msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr ""
-
-#: builtin/merge.c:267 builtin/pull.c:149
-msgid "create a single commit instead of doing a merge"
-msgstr ""
-
-#: builtin/merge.c:269 builtin/pull.c:152
-msgid "perform a commit if the merge succeeds (default)"
-msgstr ""
-
-#: builtin/merge.c:271 builtin/pull.c:155
-msgid "edit message before committing"
-msgstr ""
-
-#: builtin/merge.c:273
-msgid "allow fast-forward (default)"
-msgstr ""
-
-#: builtin/merge.c:275 builtin/pull.c:162
-msgid "abort if fast-forward is not possible"
-msgstr ""
-
-#: builtin/merge.c:279 builtin/pull.c:168
-msgid "verify that the named commit has a valid GPG signature"
-msgstr ""
-
-#: builtin/merge.c:280 builtin/notes.c:785 builtin/pull.c:172
-#: builtin/rebase.c:1145 builtin/revert.c:114
-msgid "strategy"
-msgstr ""
-
-#: builtin/merge.c:281 builtin/pull.c:173
-msgid "merge strategy to use"
-msgstr ""
-
-#: builtin/merge.c:282 builtin/pull.c:176
-msgid "option=value"
-msgstr ""
-
-#: builtin/merge.c:283 builtin/pull.c:177
-msgid "option for selected merge strategy"
-msgstr ""
-
-#: builtin/merge.c:285
-msgid "merge commit message (for a non-fast-forward merge)"
-msgstr ""
-
-#: builtin/merge.c:291
-msgid "use <name> instead of the real target"
-msgstr ""
-
-#: builtin/merge.c:294
-msgid "abort the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:296
-msgid "--abort but leave index and working tree alone"
-msgstr ""
-
-#: builtin/merge.c:298
-msgid "continue the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:300 builtin/pull.c:184
-msgid "allow merging unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:307
-msgid "bypass pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/merge.c:323
-msgid "could not run stash."
-msgstr ""
-
-#: builtin/merge.c:328
-msgid "stash failed"
-msgstr ""
-
-#: builtin/merge.c:333
-#, c-format
-msgid "not a valid object: %s"
-msgstr ""
-
-#: builtin/merge.c:355 builtin/merge.c:372
-msgid "read-tree failed"
-msgstr ""
-
-#: builtin/merge.c:403
-msgid "Already up to date. (nothing to squash)"
-msgstr ""
-
-#: builtin/merge.c:417
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:467
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:517
-#, c-format
-msgid "'%s' does not point to a commit"
-msgstr ""
-
-#: builtin/merge.c:605
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr ""
-
-#: builtin/merge.c:732
-msgid "Not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge.c:745
-#, c-format
-msgid "unknown strategy option: -X%s"
-msgstr ""
-
-#: builtin/merge.c:764 t/helper/test-fast-rebase.c:223
-#, c-format
-msgid "unable to write %s"
-msgstr ""
-
-#: builtin/merge.c:816
-#, c-format
-msgid "Could not read from '%s'"
-msgstr ""
-
-#: builtin/merge.c:825
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:831
-msgid ""
-"Please enter a commit message to explain why this merge is necessary,\n"
-"especially if it merges an updated upstream into a topic branch.\n"
-"\n"
-msgstr ""
-
-#: builtin/merge.c:836
-msgid "An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:839
-#, c-format
-msgid ""
-"Lines starting with '%c' will be ignored, and an empty message aborts\n"
-"the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:900
-msgid "Empty commit message."
-msgstr ""
-
-#: builtin/merge.c:915
-#, c-format
-msgid "Wonderful.\n"
-msgstr ""
-
-#: builtin/merge.c:976
-#, c-format
-msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr ""
-
-#: builtin/merge.c:1015
-msgid "No current branch."
-msgstr ""
-
-#: builtin/merge.c:1017
-msgid "No remote for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1019
-msgid "No default upstream defined for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1024
-#, c-format
-msgid "No remote-tracking branch for %s from %s"
-msgstr ""
-
-#: builtin/merge.c:1081
-#, c-format
-msgid "Bad value '%s' in environment '%s'"
-msgstr ""
-
-#: builtin/merge.c:1183
-#, c-format
-msgid "not something we can merge in %s: %s"
-msgstr ""
-
-#: builtin/merge.c:1217
-msgid "not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1330
-msgid "--abort expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1334
-msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1352
-msgid "--quit expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1365
-msgid "--continue expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1369
-msgid "There is no merge in progress (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1385
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1392
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1395
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr ""
-
-#: builtin/merge.c:1427
-msgid "No commit specified and merge.defaultToUpstream not set."
-msgstr ""
-
-#: builtin/merge.c:1444
-msgid "Squash commit into empty head not supported yet"
-msgstr ""
-
-#: builtin/merge.c:1446
-msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr ""
-
-#: builtin/merge.c:1451
-#, c-format
-msgid "%s - not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1453
-msgid "Can merge only exactly one commit into empty head"
-msgstr ""
-
-#: builtin/merge.c:1540
-msgid "refusing to merge unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:1559
-#, c-format
-msgid "Updating %s..%s\n"
-msgstr ""
-
-#: builtin/merge.c:1606
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr ""
-
-#: builtin/merge.c:1613
-#, c-format
-msgid "Nope.\n"
-msgstr ""
-
-#: builtin/merge.c:1671 builtin/merge.c:1737
-#, c-format
-msgid "Rewinding the tree to pristine...\n"
-msgstr ""
-
-#: builtin/merge.c:1675
-#, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr ""
-
-#: builtin/merge.c:1727
-#, c-format
-msgid "No merge strategy handled the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:1729
-#, c-format
-msgid "Merge with strategy %s failed.\n"
-msgstr ""
-
-#: builtin/merge.c:1739
-#, c-format
-msgid "Using the %s strategy to prepare resolving by hand.\n"
-msgstr ""
-
-#: builtin/merge.c:1753
-#, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-
-#: builtin/mktag.c:27
-#, c-format
-msgid "warning: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:38
-#, c-format
-msgid "error: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:41
-#, c-format
-msgid "%d (FSCK_IGNORE?) should never trigger this callback"
-msgstr ""
-
-#: builtin/mktag.c:56
-#, c-format
-msgid "could not read tagged object '%s'"
-msgstr ""
-
-#: builtin/mktag.c:59
-#, c-format
-msgid "object '%s' tagged as '%s', but is a '%s' type"
-msgstr ""
-
-#: builtin/mktag.c:97
-msgid "tag on stdin did not pass our strict fsck check"
-msgstr ""
-
-#: builtin/mktag.c:100
-msgid "tag on stdin did not refer to a valid object"
-msgstr ""
-
-#: builtin/mktag.c:103 builtin/tag.c:243
-msgid "unable to write tag file"
-msgstr ""
-
-#: builtin/mktree.c:154
-msgid "input is NUL terminated"
-msgstr ""
-
-#: builtin/mktree.c:155 builtin/write-tree.c:26
-msgid "allow missing objects"
-msgstr ""
-
-#: builtin/mktree.c:156
-msgid "allow creation of more than one tree"
-msgstr ""
-
-#: builtin/multi-pack-index.c:10
-msgid ""
-"git multi-pack-index [<options>] write [--preferred-pack=<pack>][--refs-"
-"snapshot=<path>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:14
-msgid "git multi-pack-index [<options>] verify"
-msgstr ""
-
-#: builtin/multi-pack-index.c:17
-msgid "git multi-pack-index [<options>] expire"
-msgstr ""
-
-#: builtin/multi-pack-index.c:20
-msgid "git multi-pack-index [<options>] repack [--batch-size=<size>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:57
-msgid "object directory containing set of packfile and pack-index pairs"
-msgstr ""
-
-#: builtin/multi-pack-index.c:98
-msgid "preferred-pack"
-msgstr ""
-
-#: builtin/multi-pack-index.c:99
-msgid "pack for reuse when computing a multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:100
-msgid "write multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:105
-msgid "write multi-pack index containing only given indexes"
-msgstr ""
-
-#: builtin/multi-pack-index.c:107
-msgid "refs snapshot for selecting bitmap commits"
-msgstr ""
-
-#: builtin/multi-pack-index.c:206
-msgid ""
-"during repack, collect pack-files of smaller size into a batch that is "
-"larger than this size"
-msgstr ""
-
-#: builtin/mv.c:18
-msgid "git mv [<options>] <source>... <destination>"
-msgstr ""
-
-#: builtin/mv.c:83
-#, c-format
-msgid "Directory %s is in index and no submodule?"
-msgstr ""
-
-#: builtin/mv.c:85
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/mv.c:103
-#, c-format
-msgid "%.*s is in index"
-msgstr ""
-
-#: builtin/mv.c:125
-msgid "force move/rename even if target exists"
-msgstr ""
-
-#: builtin/mv.c:127
-msgid "skip move/rename errors"
-msgstr ""
-
-#: builtin/mv.c:172
-#, c-format
-msgid "destination '%s' is not a directory"
-msgstr ""
-
-#: builtin/mv.c:184
-#, c-format
-msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
-
-#: builtin/mv.c:190
-msgid "bad source"
-msgstr ""
-
-#: builtin/mv.c:193
-msgid "can not move directory into itself"
-msgstr ""
-
-#: builtin/mv.c:196
-msgid "cannot move directory over file"
-msgstr ""
-
-#: builtin/mv.c:205
-msgid "source directory is empty"
-msgstr ""
-
-#: builtin/mv.c:231
-msgid "not under version control"
-msgstr ""
-
-#: builtin/mv.c:233
-msgid "conflicted"
-msgstr ""
-
-#: builtin/mv.c:236
-msgid "destination exists"
-msgstr ""
-
-#: builtin/mv.c:244
-#, c-format
-msgid "overwriting '%s'"
-msgstr ""
-
-#: builtin/mv.c:247
-msgid "Cannot overwrite"
-msgstr ""
-
-#: builtin/mv.c:250
-msgid "multiple sources for the same target"
-msgstr ""
-
-#: builtin/mv.c:252
-msgid "destination directory does not exist"
-msgstr ""
-
-#: builtin/mv.c:280
-#, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr ""
-
-#: builtin/mv.c:308
-#, c-format
-msgid "Renaming %s to %s\n"
-msgstr ""
-
-#: builtin/mv.c:314 builtin/remote.c:812 builtin/repack.c:861
-#, c-format
-msgid "renaming '%s' failed"
-msgstr ""
-
-#: builtin/name-rev.c:524
-msgid "git name-rev [<options>] <commit>..."
-msgstr ""
-
-#: builtin/name-rev.c:525
-msgid "git name-rev [<options>] --all"
-msgstr ""
-
-#: builtin/name-rev.c:526
-msgid "git name-rev [<options>] --annotate-stdin"
-msgstr ""
-
-#: builtin/name-rev.c:583
-msgid "print only ref-based names (no object names)"
-msgstr ""
-
-#: builtin/name-rev.c:584
-msgid "only use tags to name the commits"
-msgstr ""
-
-#: builtin/name-rev.c:586
-msgid "only use refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:588
-msgid "ignore refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:590
-msgid "list all commits reachable from all refs"
-msgstr ""
-
-#: builtin/name-rev.c:591
-msgid "deprecated: use annotate-stdin instead"
-msgstr ""
-
-#: builtin/name-rev.c:592
-msgid "annotate text from stdin"
-msgstr ""
-
-#: builtin/name-rev.c:593
-msgid "allow to print `undefined` names (default)"
-msgstr ""
-
-#: builtin/name-rev.c:599
-msgid "dereference tags in the input (internal use)"
-msgstr ""
-
-#: builtin/notes.c:28
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:29
-msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:32
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:33
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:34
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:37
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr ""
-
-#: builtin/notes.c:38
-msgid "git notes [--ref <notes-ref>] prune [-n] [-v]"
-msgstr ""
-
-#: builtin/notes.c:39
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr ""
-
-#: builtin/notes.c:44
-msgid "git notes [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:49
-msgid "git notes add [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:54
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:55
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr ""
-
-#: builtin/notes.c:60
-msgid "git notes append [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:65
-msgid "git notes edit [<object>]"
-msgstr ""
-
-#: builtin/notes.c:70
-msgid "git notes show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:75
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:76
-msgid "git notes merge --commit [<options>]"
-msgstr ""
-
-#: builtin/notes.c:77
-msgid "git notes merge --abort [<options>]"
-msgstr ""
-
-#: builtin/notes.c:82
-msgid "git notes remove [<object>]"
-msgstr ""
-
-#: builtin/notes.c:87
-msgid "git notes prune [<options>]"
-msgstr ""
-
-#: builtin/notes.c:97
-msgid "Write/edit the notes for the following object:"
-msgstr ""
-
-#: builtin/notes.c:149
-#, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:153
-msgid "could not read 'show' output"
-msgstr ""
-
-#: builtin/notes.c:161
-#, c-format
-msgid "failed to finish 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:194
-msgid "please supply the note contents using either -m or -F option"
-msgstr ""
-
-#: builtin/notes.c:203
-msgid "unable to write note object"
-msgstr ""
-
-#: builtin/notes.c:206
-#, c-format
-msgid "the note contents have been left in %s"
-msgstr ""
-
-#: builtin/notes.c:240 builtin/tag.c:582
-#, c-format
-msgid "could not open or read '%s'"
-msgstr ""
-
-#: builtin/notes.c:261 builtin/notes.c:311 builtin/notes.c:313
-#: builtin/notes.c:381 builtin/notes.c:436 builtin/notes.c:524
-#: builtin/notes.c:529 builtin/notes.c:608 builtin/notes.c:670
-#, c-format
-msgid "failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:263
-#, c-format
-msgid "failed to read object '%s'."
-msgstr ""
-
-#: builtin/notes.c:266
-#, c-format
-msgid "cannot read note data from non-blob object '%s'."
-msgstr ""
-
-#: builtin/notes.c:307
-#, c-format
-msgid "malformed input line: '%s'."
-msgstr ""
-
-#: builtin/notes.c:322
-#, c-format
-msgid "failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#. TRANSLATORS: the first %s will be replaced by a git
-#. notes command: 'add', 'merge', 'remove', etc.
-#.
-#: builtin/notes.c:354
-#, c-format
-msgid "refusing to %s notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#: builtin/notes.c:387 builtin/notes.c:676
-#, c-format
-msgid "no note found for object %s."
-msgstr ""
-
-#: builtin/notes.c:408 builtin/notes.c:574
-msgid "note contents as a string"
-msgstr ""
-
-#: builtin/notes.c:411 builtin/notes.c:577
-msgid "note contents in a file"
-msgstr ""
-
-#: builtin/notes.c:414 builtin/notes.c:580
-msgid "reuse and edit specified note object"
-msgstr ""
-
-#: builtin/notes.c:417 builtin/notes.c:583
-msgid "reuse specified note object"
-msgstr ""
-
-#: builtin/notes.c:420 builtin/notes.c:586
-msgid "allow storing empty note"
-msgstr ""
-
-#: builtin/notes.c:421 builtin/notes.c:494
-msgid "replace existing notes"
-msgstr ""
-
-#: builtin/notes.c:446
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:461 builtin/notes.c:542
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:473 builtin/notes.c:635 builtin/notes.c:904
-#, c-format
-msgid "Removing note for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:495
-msgid "read objects from stdin"
-msgstr ""
-
-#: builtin/notes.c:497
-msgid "load rewriting config for <command> (implies --stdin)"
-msgstr ""
-
-#: builtin/notes.c:515
-msgid "too few arguments"
-msgstr ""
-
-#: builtin/notes.c:536
-#, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:548
-#, c-format
-msgid "missing notes on source object %s. Cannot copy."
-msgstr ""
-
-#: builtin/notes.c:601
-#, c-format
-msgid ""
-"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
-"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
-msgstr ""
-
-#: builtin/notes.c:696
-msgid "failed to delete ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:698
-msgid "failed to delete ref NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:700
-msgid "failed to remove 'git notes merge' worktree"
-msgstr ""
-
-#: builtin/notes.c:720
-msgid "failed to read ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:722
-msgid "could not find commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:724
-msgid "could not parse commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:737
-msgid "failed to resolve NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:740
-msgid "failed to finalize notes merge"
-msgstr ""
-
-#: builtin/notes.c:766
-#, c-format
-msgid "unknown notes merge strategy %s"
-msgstr ""
-
-#: builtin/notes.c:782
-msgid "General options"
-msgstr ""
-
-#: builtin/notes.c:784
-msgid "Merge options"
-msgstr ""
-
-#: builtin/notes.c:786
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
-msgstr ""
-
-#: builtin/notes.c:788
-msgid "Committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:790
-msgid "finalize notes merge by committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:792
-msgid "Aborting notes merge resolution"
-msgstr ""
-
-#: builtin/notes.c:794
-msgid "abort notes merge"
-msgstr ""
-
-#: builtin/notes.c:805
-msgid "cannot mix --commit, --abort or -s/--strategy"
-msgstr ""
-
-#: builtin/notes.c:810
-msgid "must specify a notes ref to merge"
-msgstr ""
-
-#: builtin/notes.c:834
-#, c-format
-msgid "unknown -s/--strategy: %s"
-msgstr ""
-
-#: builtin/notes.c:874
-#, c-format
-msgid "a notes merge into %s is already in-progress at %s"
-msgstr ""
-
-#: builtin/notes.c:878
-#, c-format
-msgid "failed to store link to current notes ref (%s)"
-msgstr ""
-
-#: builtin/notes.c:880
-#, c-format
-msgid ""
-"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
-"'git notes merge --commit', or abort the merge with 'git notes merge --"
-"abort'.\n"
-msgstr ""
-
-#: builtin/notes.c:899 builtin/tag.c:595
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:902
-#, c-format
-msgid "Object %s has no note\n"
-msgstr ""
-
-#: builtin/notes.c:914
-msgid "attempt to remove non-existent note is not an error"
-msgstr ""
-
-#: builtin/notes.c:917
-msgid "read object names from the standard input"
-msgstr ""
-
-#: builtin/notes.c:956 builtin/prune.c:144 builtin/worktree.c:148
-msgid "do not remove, show only"
-msgstr ""
-
-#: builtin/notes.c:957
-msgid "report pruned notes"
-msgstr ""
-
-#: builtin/notes.c:1000
-msgid "notes-ref"
-msgstr ""
-
-#: builtin/notes.c:1001
-msgid "use notes from <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:1036 builtin/stash.c:1802
-#, c-format
-msgid "unknown subcommand: %s"
-msgstr ""
-
-#: builtin/pack-objects.c:182
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:183
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:570
-#, c-format
-msgid ""
-"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
-"pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:578
-#, c-format
-msgid "bad packed object CRC for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:589
-#, c-format
-msgid "corrupt packed object for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:720
-#, c-format
-msgid "recursive delta detected for object %s"
-msgstr ""
-
-#: builtin/pack-objects.c:939
-#, c-format
-msgid "ordered %u objects, expected %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1034
-#, c-format
-msgid "expected object at offset %<PRIuMAX> in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1158
-msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
-msgstr ""
-
-#: builtin/pack-objects.c:1171
-msgid "Writing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:1243 builtin/update-index.c:90
-#, c-format
-msgid "failed to stat %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1276
-msgid "failed to write bitmap index"
-msgstr ""
-
-#: builtin/pack-objects.c:1302
-#, c-format
-msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1544
-msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr ""
-
-#: builtin/pack-objects.c:1992
-#, c-format
-msgid "delta base offset overflow in pack for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2001
-#, c-format
-msgid "delta base offset out of bound for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2282
-msgid "Counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2447
-#, c-format
-msgid "unable to parse object header of %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2517 builtin/pack-objects.c:2533
-#: builtin/pack-objects.c:2543
-#, c-format
-msgid "object %s cannot be read"
-msgstr ""
-
-#: builtin/pack-objects.c:2520 builtin/pack-objects.c:2547
-#, c-format
-msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
-msgstr ""
-
-#: builtin/pack-objects.c:2557
-msgid "suboptimal pack - out of memory"
-msgstr ""
-
-#: builtin/pack-objects.c:2872
-#, c-format
-msgid "Delta compression using up to %d threads"
-msgstr ""
-
-#: builtin/pack-objects.c:3011
-#, c-format
-msgid "unable to pack objects reachable from tag %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3097
-msgid "Compressing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3103
-msgid "inconsistency with delta count"
-msgstr ""
-
-#: builtin/pack-objects.c:3182
-#, c-format
-msgid ""
-"value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
-"hash> <uri>' (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3185
-#, c-format
-msgid ""
-"object already configured in another uploadpack.blobpackfileuri (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3220
-#, c-format
-msgid "could not get type of object %s in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3348 builtin/pack-objects.c:3359
-#: builtin/pack-objects.c:3373
-#, c-format
-msgid "could not find pack '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3416
-#, c-format
-msgid ""
-"expected edge object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3422
-#, c-format
-msgid ""
-"expected object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3540 builtin/pack-objects.c:3627
-msgid "cannot open pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3549
-#, c-format
-msgid "loose object at %s could not be examined"
-msgstr ""
-
-#: builtin/pack-objects.c:3635
-msgid "unable to force loose object"
-msgstr ""
-
-#: builtin/pack-objects.c:3763
-#, c-format
-msgid "not a rev '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3766 builtin/rev-parse.c:1061
-#, c-format
-msgid "bad revision '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3794
-msgid "unable to add recent objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3847
-#, c-format
-msgid "unsupported index version %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3851
-#, c-format
-msgid "bad index version '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3907
-msgid "<version>[,<offset>]"
-msgstr ""
-
-#: builtin/pack-objects.c:3908
-msgid "write the pack index file in the specified idx format version"
-msgstr ""
-
-#: builtin/pack-objects.c:3911
-msgid "maximum size of each output pack file"
-msgstr ""
-
-#: builtin/pack-objects.c:3913
-msgid "ignore borrowed objects from alternate object store"
-msgstr ""
-
-#: builtin/pack-objects.c:3915
-msgid "ignore packed objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3917
-msgid "limit pack window by objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3919
-msgid "limit pack window by memory in addition to object limit"
-msgstr ""
-
-#: builtin/pack-objects.c:3921
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3923
-msgid "reuse existing deltas"
-msgstr ""
-
-#: builtin/pack-objects.c:3925
-msgid "reuse existing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3927
-msgid "use OFS_DELTA objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3929
-msgid "use threads when searching for best delta matches"
-msgstr ""
-
-#: builtin/pack-objects.c:3931
-msgid "do not create an empty pack output"
-msgstr ""
-
-#: builtin/pack-objects.c:3933
-msgid "read revision arguments from standard input"
-msgstr ""
-
-#: builtin/pack-objects.c:3935
-msgid "limit the objects to those that are not yet packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3938
-msgid "include objects reachable from any reference"
-msgstr ""
-
-#: builtin/pack-objects.c:3941
-msgid "include objects referred by reflog entries"
-msgstr ""
-
-#: builtin/pack-objects.c:3944
-msgid "include objects referred to by the index"
-msgstr ""
-
-#: builtin/pack-objects.c:3947
-msgid "read packs from stdin"
-msgstr ""
-
-#: builtin/pack-objects.c:3949
-msgid "output pack to stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:3951
-msgid "include tag objects that refer to objects to be packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3953
-msgid "keep unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3955
-msgid "pack loose unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3957
-msgid "unpack unreachable objects newer than <time>"
-msgstr ""
-
-#: builtin/pack-objects.c:3960
-msgid "use the sparse reachability algorithm"
-msgstr ""
-
-#: builtin/pack-objects.c:3962
-msgid "create thin packs"
-msgstr ""
-
-#: builtin/pack-objects.c:3964
-msgid "create packs suitable for shallow fetches"
-msgstr ""
-
-#: builtin/pack-objects.c:3966
-msgid "ignore packs that have companion .keep file"
-msgstr ""
-
-#: builtin/pack-objects.c:3968
-msgid "ignore this pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3970
-msgid "pack compression level"
-msgstr ""
-
-#: builtin/pack-objects.c:3972
-msgid "do not hide commits by grafts"
-msgstr ""
-
-#: builtin/pack-objects.c:3974
-msgid "use a bitmap index if available to speed up counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3976
-msgid "write a bitmap index together with the pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3980
-msgid "write a bitmap index if possible"
-msgstr ""
-
-#: builtin/pack-objects.c:3984
-msgid "handling for missing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3987
-msgid "do not pack objects in promisor packfiles"
-msgstr ""
-
-#: builtin/pack-objects.c:3989
-msgid "respect islands during delta compression"
-msgstr ""
-
-#: builtin/pack-objects.c:3991
-msgid "protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:3992
-msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:4027
-#, c-format
-msgid "delta chain depth %d is too deep, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4032
-#, c-format
-msgid "pack.deltaCacheLimit is too high, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4088
-msgid "--max-pack-size cannot be used to build a pack for transfer"
-msgstr ""
-
-#: builtin/pack-objects.c:4090
-msgid "minimum pack size limit is 1 MiB"
-msgstr ""
-
-#: builtin/pack-objects.c:4095
-msgid "--thin cannot be used to build an indexable pack"
-msgstr ""
-
-#: builtin/pack-objects.c:4104
-msgid "cannot use --filter without --stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:4106
-msgid "cannot use --filter with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4110
-msgid "cannot use internal rev list with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4169
-msgid "Enumerating objects"
-msgstr ""
-
-#: builtin/pack-objects.c:4210
-#, c-format
-msgid ""
-"Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
-"reused %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-redundant.c:601
-msgid ""
-"'git pack-redundant' is nominated for removal.\n"
-"If you still use this command, please add an extra\n"
-"option, '--i-still-use-this', on the command line\n"
-"and let us know you still use it by sending an e-mail\n"
-"to <git@vger.kernel.org>.  Thanks.\n"
-msgstr ""
-
-#: builtin/pack-refs.c:8
-msgid "git pack-refs [<options>]"
-msgstr ""
-
-#: builtin/pack-refs.c:16
-msgid "pack everything"
-msgstr ""
-
-#: builtin/pack-refs.c:17
-msgid "prune loose refs (default)"
-msgstr ""
-
-#: builtin/prune.c:14
-msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]"
-msgstr ""
-
-#: builtin/prune.c:145
-msgid "report pruned objects"
-msgstr ""
-
-#: builtin/prune.c:148
-msgid "expire objects older than <time>"
-msgstr ""
-
-#: builtin/prune.c:150
-msgid "limit traversal to objects outside promisor packfiles"
-msgstr ""
-
-#: builtin/prune.c:163
-msgid "cannot prune in a precious-objects repo"
-msgstr ""
-
-#: builtin/pull.c:67
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/pull.c:124
-msgid "control for recursive fetching of submodules"
-msgstr ""
-
-#: builtin/pull.c:128
-msgid "Options related to merging"
-msgstr ""
-
-#: builtin/pull.c:131
-msgid "incorporate changes by rebasing rather than merging"
-msgstr ""
-
-#: builtin/pull.c:159 builtin/revert.c:126
-msgid "allow fast-forward"
-msgstr ""
-
-#: builtin/pull.c:165
-msgid "control use of pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/pull.c:171 parse-options.h:371
-msgid "automatically stash/stash pop before and after"
-msgstr ""
-
-#: builtin/pull.c:187
-msgid "Options related to fetching"
-msgstr ""
-
-#: builtin/pull.c:197
-msgid "force overwrite of local branch"
-msgstr ""
-
-#: builtin/pull.c:205
-msgid "number of submodules pulled in parallel"
-msgstr ""
-
-#: builtin/pull.c:449
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-
-#: builtin/pull.c:451
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-
-#: builtin/pull.c:452
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-
-#: builtin/pull.c:455
-#, c-format
-msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
-msgstr ""
-
-#: builtin/pull.c:460 builtin/rebase.c:978
-msgid "You are not currently on a branch."
-msgstr ""
-
-#: builtin/pull.c:462 builtin/pull.c:477
-msgid "Please specify which branch you want to rebase against."
-msgstr ""
-
-#: builtin/pull.c:464 builtin/pull.c:479
-msgid "Please specify which branch you want to merge with."
-msgstr ""
-
-#: builtin/pull.c:465 builtin/pull.c:480
-msgid "See git-pull(1) for details."
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:473 builtin/pull.c:482
-#: builtin/rebase.c:984
-msgid "<remote>"
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:482 builtin/pull.c:487
-#: contrib/scalar/scalar.c:374
-msgid "<branch>"
-msgstr ""
-
-#: builtin/pull.c:475 builtin/rebase.c:976
-msgid "There is no tracking information for the current branch."
-msgstr ""
-
-#: builtin/pull.c:484
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-
-#: builtin/pull.c:489
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-
-#: builtin/pull.c:600
-#, c-format
-msgid "unable to access commit %s"
-msgstr ""
-
-#: builtin/pull.c:908
-msgid "ignoring --verify-signatures for rebase"
-msgstr ""
-
-#: builtin/pull.c:969
-msgid ""
-"You have divergent branches and need to specify how to reconcile them.\n"
-"You can do so by running one of the following commands sometime before\n"
-"your next pull:\n"
-"\n"
-"  git config pull.rebase false  # merge\n"
-"  git config pull.rebase true   # rebase\n"
-"  git config pull.ff only       # fast-forward only\n"
-"\n"
-"You can replace \"git config\" with \"git config --global\" to set a "
-"default\n"
-"preference for all repositories. You can also pass --rebase, --no-rebase,\n"
-"or --ff-only on the command line to override the configured default per\n"
-"invocation.\n"
-msgstr ""
-
-#: builtin/pull.c:1047
-msgid "Updating an unborn branch with changes added to the index."
-msgstr ""
-
-#: builtin/pull.c:1051
-msgid "pull with rebase"
-msgstr ""
-
-#: builtin/pull.c:1052
-msgid "please commit or stash them."
-msgstr ""
-
-#: builtin/pull.c:1077
-#, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
-msgstr ""
-
-#: builtin/pull.c:1083
-#, c-format
-msgid ""
-"Cannot fast-forward your working tree.\n"
-"After making sure that you saved anything precious from\n"
-"$ git diff %s\n"
-"output, run\n"
-"$ git reset --hard\n"
-"to recover."
-msgstr ""
-
-#: builtin/pull.c:1098
-msgid "Cannot merge multiple branches into empty head."
-msgstr ""
-
-#: builtin/pull.c:1103
-msgid "Cannot rebase onto multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1105
-msgid "Cannot fast-forward to multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1120
-msgid "Need to specify how to reconcile divergent branches."
-msgstr ""
-
-#: builtin/pull.c:1134
-msgid "cannot rebase with locally recorded submodule modifications"
-msgstr ""
-
-#: builtin/push.c:19
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/push.c:111
-msgid "tag shorthand without <tag>"
-msgstr ""
-
-#: builtin/push.c:119
-msgid "--delete only accepts plain target ref names"
-msgstr ""
-
-#: builtin/push.c:164
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
-msgstr ""
-
-#: builtin/push.c:167
-#, c-format
-msgid ""
-"The upstream branch of your current branch does not match\n"
-"the name of your current branch.  To push to the upstream branch\n"
-"on the remote, use\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"To push to the branch of the same name on the remote, use\n"
-"\n"
-"    git push %s HEAD\n"
-"%s"
-msgstr ""
-
-#: builtin/push.c:182
-#, c-format
-msgid ""
-"You are not currently on a branch.\n"
-"To push the history leading to the current (detached HEAD)\n"
-"state now, use\n"
-"\n"
-"    git push %s HEAD:<name-of-remote-branch>\n"
-msgstr ""
-
-#: builtin/push.c:191
-#, c-format
-msgid ""
-"The current branch %s has no upstream branch.\n"
-"To push the current branch and set the remote as upstream, use\n"
-"\n"
-"    git push --set-upstream %s %s\n"
-msgstr ""
-
-#: builtin/push.c:199
-#, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr ""
-
-#: builtin/push.c:217
-msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr ""
-
-#: builtin/push.c:243
-#, c-format
-msgid ""
-"You are pushing to remote '%s', which is not the upstream of\n"
-"your current branch '%s', without telling me what to push\n"
-"to update which remote branch."
-msgstr ""
-
-#: builtin/push.c:258
-msgid ""
-"Updates were rejected because the tip of your current branch is behind\n"
-"its remote counterpart. Integrate the remote changes (e.g.\n"
-"'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:264
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. Check out this branch and integrate the remote changes\n"
-"(e.g. 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:270
-msgid ""
-"Updates were rejected because the remote contains work that you do\n"
-"not have locally. This is usually caused by another repository pushing\n"
-"to the same ref. You may want to first integrate the remote changes\n"
-"(e.g., 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:277
-msgid "Updates were rejected because the tag already exists in the remote."
-msgstr ""
-
-#: builtin/push.c:280
-msgid ""
-"You cannot update a remote ref that points at a non-commit object,\n"
-"or update a remote ref to make it point at a non-commit object,\n"
-"without using the '--force' option.\n"
-msgstr ""
-
-#: builtin/push.c:285
-msgid ""
-"Updates were rejected because the tip of the remote-tracking\n"
-"branch has been updated since the last checkout. You may want\n"
-"to integrate those changes locally (e.g., 'git pull ...')\n"
-"before forcing an update.\n"
-msgstr ""
-
-#: builtin/push.c:355
-#, c-format
-msgid "Pushing to %s\n"
-msgstr ""
-
-#: builtin/push.c:362
-#, c-format
-msgid "failed to push some refs to '%s'"
-msgstr ""
-
-#: builtin/push.c:544 builtin/submodule--helper.c:3377
-msgid "repository"
-msgstr ""
-
-#: builtin/push.c:545 builtin/send-pack.c:193
-msgid "push all refs"
-msgstr ""
-
-#: builtin/push.c:546 builtin/send-pack.c:195
-msgid "mirror all refs"
-msgstr ""
-
-#: builtin/push.c:548
-msgid "delete refs"
-msgstr ""
-
-#: builtin/push.c:549
-msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
-
-#: builtin/push.c:552 builtin/send-pack.c:196
-msgid "force updates"
-msgstr ""
-
-#: builtin/push.c:553 builtin/send-pack.c:208
-msgid "<refname>:<expect>"
-msgstr ""
-
-#: builtin/push.c:554 builtin/send-pack.c:209
-msgid "require old value of ref to be at this value"
-msgstr ""
-
-#: builtin/push.c:557 builtin/send-pack.c:212
-msgid "require remote updates to be integrated locally"
-msgstr ""
-
-#: builtin/push.c:560
-msgid "control recursive pushing of submodules"
-msgstr ""
-
-#: builtin/push.c:561 builtin/send-pack.c:203
-msgid "use thin pack"
-msgstr ""
-
-#: builtin/push.c:562 builtin/push.c:563 builtin/send-pack.c:190
-#: builtin/send-pack.c:191
-msgid "receive pack program"
-msgstr ""
-
-#: builtin/push.c:564
-msgid "set upstream for git pull/status"
-msgstr ""
-
-#: builtin/push.c:567
-msgid "prune locally removed refs"
-msgstr ""
-
-#: builtin/push.c:569
-msgid "bypass pre-push hook"
-msgstr ""
-
-#: builtin/push.c:570
-msgid "push missing but relevant tags"
-msgstr ""
-
-#: builtin/push.c:572 builtin/send-pack.c:197
-msgid "GPG sign the push"
-msgstr ""
-
-#: builtin/push.c:574 builtin/send-pack.c:204
-msgid "request atomic transaction on remote side"
-msgstr ""
-
-#: builtin/push.c:594
-msgid "--delete doesn't make sense without any refs"
-msgstr ""
-
-#: builtin/push.c:614
-#, c-format
-msgid "bad repository '%s'"
-msgstr ""
-
-#: builtin/push.c:615
-msgid ""
-"No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote "
-"repository using\n"
-"\n"
-"    git remote add <name> <url>\n"
-"\n"
-"and then push using the remote name\n"
-"\n"
-"    git push <name>\n"
-msgstr ""
-
-#: builtin/push.c:632
-msgid "--all can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:638
-msgid "--mirror can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:648
-msgid "push options must not have new line characters"
-msgstr ""
-
-#: builtin/range-diff.c:9
-msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:10
-msgid "git range-diff [<options>] <old-tip>...<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:11
-msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:30
-msgid "use simple diff colors"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "notes"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "passed to 'git log'"
-msgstr ""
-
-#: builtin/range-diff.c:35
-msgid "only emit output related to the first range"
-msgstr ""
-
-#: builtin/range-diff.c:37
-msgid "only emit output related to the second range"
-msgstr ""
-
-#: builtin/range-diff.c:60 builtin/range-diff.c:64
-#, c-format
-msgid "not a commit range: '%s'"
-msgstr ""
-
-#: builtin/range-diff.c:74
-msgid "single arg format must be symmetric range"
-msgstr ""
-
-#: builtin/range-diff.c:89
-msgid "need two commit ranges"
-msgstr ""
-
-#: builtin/read-tree.c:41
-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>]])"
-msgstr ""
-
-#: builtin/read-tree.c:116
-msgid "write resulting index to <file>"
-msgstr ""
-
-#: builtin/read-tree.c:119
-msgid "only empty the index"
-msgstr ""
-
-#: builtin/read-tree.c:121
-msgid "Merging"
-msgstr ""
-
-#: builtin/read-tree.c:123
-msgid "perform a merge in addition to a read"
-msgstr ""
-
-#: builtin/read-tree.c:125
-msgid "3-way merge if no file level merging required"
-msgstr ""
-
-#: builtin/read-tree.c:127
-msgid "3-way merge in presence of adds and removes"
-msgstr ""
-
-#: builtin/read-tree.c:129
-msgid "same as -m, but discard unmerged entries"
-msgstr ""
-
-#: builtin/read-tree.c:130
-msgid "<subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:131
-msgid "read the tree into the index under <subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:134
-msgid "update working tree with merge result"
-msgstr ""
-
-#: builtin/read-tree.c:136
-msgid "gitignore"
-msgstr ""
-
-#: builtin/read-tree.c:137
-msgid "allow explicitly ignored files to be overwritten"
-msgstr ""
-
-#: builtin/read-tree.c:140
-msgid "don't check the working tree after merging"
-msgstr ""
-
-#: builtin/read-tree.c:141
-msgid "don't update the index or the work tree"
-msgstr ""
-
-#: builtin/read-tree.c:143
-msgid "skip applying sparse checkout filter"
-msgstr ""
-
-#: builtin/read-tree.c:145
-msgid "debug unpack-trees"
-msgstr ""
-
-#: builtin/read-tree.c:149
-msgid "suppress feedback messages"
-msgstr ""
-
-#: builtin/read-tree.c:190
-msgid "You need to resolve your current index first"
-msgstr ""
-
-#: builtin/rebase.c:36
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] "
-"[<upstream> [<branch>]]"
-msgstr ""
-
-#: builtin/rebase.c:38
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]"
-msgstr ""
-
-#: builtin/rebase.c:231
-#, c-format
-msgid "could not create temporary %s"
-msgstr ""
-
-#: builtin/rebase.c:237
-msgid "could not mark as interactive"
-msgstr ""
-
-#: builtin/rebase.c:290
-msgid "could not generate todo list"
-msgstr ""
-
-#: builtin/rebase.c:332
-msgid "a base commit must be provided with --upstream or --onto"
-msgstr ""
-
-#: builtin/rebase.c:391
-#, c-format
-msgid "%s requires the merge backend"
-msgstr ""
-
-#: builtin/rebase.c:433
-#, c-format
-msgid "could not get 'onto': '%s'"
-msgstr ""
-
-#: builtin/rebase.c:450
-#, c-format
-msgid "invalid orig-head: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:475
-#, c-format
-msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:600
-msgid ""
-"Resolve all conflicts manually, mark them as resolved with\n"
-"\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
-"You can instead skip this commit: run \"git rebase --skip\".\n"
-"To abort and get back to the state before \"git rebase\", run \"git rebase --"
-"abort\"."
-msgstr ""
-
-#: builtin/rebase.c:685
-#, c-format
-msgid ""
-"\n"
-"git encountered an error while preparing the patches to replay\n"
-"these revisions:\n"
-"\n"
-"    %s\n"
-"\n"
-"As a result, git cannot rebase them."
-msgstr ""
-
-#: builtin/rebase.c:836
-#, c-format
-msgid "could not switch to %s"
-msgstr ""
-
-#: builtin/rebase.c:952
-#, c-format
-msgid ""
-"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
-"\"."
-msgstr ""
-
-#: builtin/rebase.c:970
-#, c-format
-msgid ""
-"%s\n"
-"Please specify which branch you want to rebase against.\n"
-"See git-rebase(1) for details.\n"
-"\n"
-"    git rebase '<branch>'\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:986
-#, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:1016
-msgid "exec commands cannot contain newlines"
-msgstr ""
-
-#: builtin/rebase.c:1020
-msgid "empty exec command"
-msgstr ""
-
-#: builtin/rebase.c:1051
-msgid "rebase onto given branch instead of upstream"
-msgstr ""
-
-#: builtin/rebase.c:1053
-msgid "use the merge-base of upstream and branch as the current base"
-msgstr ""
-
-#: builtin/rebase.c:1055
-msgid "allow pre-rebase hook to run"
-msgstr ""
-
-#: builtin/rebase.c:1057
-msgid "be quiet. implies --no-stat"
-msgstr ""
-
-#: builtin/rebase.c:1060
-msgid "display a diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1063
-msgid "do not show diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1066
-msgid "add a Signed-off-by trailer to each commit"
-msgstr ""
-
-#: builtin/rebase.c:1069
-msgid "make committer date match author date"
-msgstr ""
-
-#: builtin/rebase.c:1071
-msgid "ignore author date and use current date"
-msgstr ""
-
-#: builtin/rebase.c:1073
-msgid "synonym of --reset-author-date"
-msgstr ""
-
-#: builtin/rebase.c:1075 builtin/rebase.c:1079
-msgid "passed to 'git apply'"
-msgstr ""
-
-#: builtin/rebase.c:1077
-msgid "ignore changes in whitespace"
-msgstr ""
-
-#: builtin/rebase.c:1081 builtin/rebase.c:1084
-msgid "cherry-pick all commits, even if unchanged"
-msgstr ""
-
-#: builtin/rebase.c:1086
-msgid "continue"
-msgstr ""
-
-#: builtin/rebase.c:1089
-msgid "skip current patch and continue"
-msgstr ""
-
-#: builtin/rebase.c:1091
-msgid "abort and check out the original branch"
-msgstr ""
-
-#: builtin/rebase.c:1094
-msgid "abort but keep HEAD where it is"
-msgstr ""
-
-#: builtin/rebase.c:1095
-msgid "edit the todo list during an interactive rebase"
-msgstr ""
-
-#: builtin/rebase.c:1098
-msgid "show the patch file being applied or merged"
-msgstr ""
-
-#: builtin/rebase.c:1101
-msgid "use apply strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1105
-msgid "use merging strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1109
-msgid "let the user edit the list of commits to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1113
-msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
-msgstr ""
-
-#: builtin/rebase.c:1118
-msgid "how to handle commits that become empty"
-msgstr ""
-
-#: builtin/rebase.c:1121
-msgid "keep commits which start empty"
-msgstr ""
-
-#: builtin/rebase.c:1125
-msgid "move commits that begin with squash!/fixup! under -i"
-msgstr ""
-
-#: builtin/rebase.c:1132
-msgid "add exec lines after each commit of the editable list"
-msgstr ""
-
-#: builtin/rebase.c:1136
-msgid "allow rebasing commits with empty messages"
-msgstr ""
-
-#: builtin/rebase.c:1140
-msgid "try to rebase merges instead of skipping them"
-msgstr ""
-
-#: builtin/rebase.c:1143
-msgid "use 'merge-base --fork-point' to refine upstream"
-msgstr ""
-
-#: builtin/rebase.c:1145
-msgid "use the given merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1147 builtin/revert.c:115
-msgid "option"
-msgstr ""
-
-#: builtin/rebase.c:1148
-msgid "pass the argument through to the merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1151
-msgid "rebase all reachable commits up to the root(s)"
-msgstr ""
-
-#: builtin/rebase.c:1154
-msgid "automatically re-schedule any `exec` that fails"
-msgstr ""
-
-#: builtin/rebase.c:1156
-msgid "apply all changes, even those already present upstream"
-msgstr ""
-
-#: builtin/rebase.c:1177
-msgid "It looks like 'git am' is in progress. Cannot rebase."
-msgstr ""
-
-#: builtin/rebase.c:1208
-msgid "--preserve-merges was replaced by --rebase-merges"
-msgstr ""
-
-#: builtin/rebase.c:1230
-msgid "No rebase in progress?"
-msgstr ""
-
-#: builtin/rebase.c:1234
-msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
-
-#: builtin/rebase.c:1257 t/helper/test-fast-rebase.c:122
-msgid "Cannot read HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1269
-msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
-msgstr ""
-
-#: builtin/rebase.c:1287
-msgid "could not discard worktree changes"
-msgstr ""
-
-#: builtin/rebase.c:1308
-#, c-format
-msgid "could not move back to %s"
-msgstr ""
-
-#: builtin/rebase.c:1354
-#, c-format
-msgid ""
-"It seems that there is already a %s directory, and\n"
-"I wonder if you are in the middle of another rebase.  If that is the\n"
-"case, please try\n"
-"\t%s\n"
-"If that is not the case, please\n"
-"\t%s\n"
-"and run me again.  I am stopping in case you still have something\n"
-"valuable there.\n"
-msgstr ""
-
-#: builtin/rebase.c:1382
-msgid "switch `C' expects a numerical value"
-msgstr ""
-
-#: builtin/rebase.c:1424
-#, c-format
-msgid "Unknown mode: %s"
-msgstr ""
-
-#: builtin/rebase.c:1463
-msgid "--strategy requires --merge or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1492
-msgid "apply options and merge options cannot be used together"
-msgstr ""
-
-#: builtin/rebase.c:1505
-#, c-format
-msgid "Unknown rebase backend: %s"
-msgstr ""
-
-#: builtin/rebase.c:1534
-msgid "--reschedule-failed-exec requires --exec or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1565
-#, c-format
-msgid "invalid upstream '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1571
-msgid "Could not create new root commit"
-msgstr ""
-
-#: builtin/rebase.c:1597
-#, c-format
-msgid "'%s': need exactly one merge base with branch"
-msgstr ""
-
-#: builtin/rebase.c:1600
-#, c-format
-msgid "'%s': need exactly one merge base"
-msgstr ""
-
-#: builtin/rebase.c:1609
-#, c-format
-msgid "Does not point to a valid commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1636
-#, c-format
-msgid "no such branch/commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1647 builtin/submodule--helper.c:43
-#: builtin/submodule--helper.c:2477
-#, c-format
-msgid "No such ref: %s"
-msgstr ""
-
-#: builtin/rebase.c:1658
-msgid "Could not resolve HEAD to a revision"
-msgstr ""
-
-#: builtin/rebase.c:1679
-msgid "Please commit or stash them."
-msgstr ""
-
-#: builtin/rebase.c:1714
-msgid "HEAD is up to date."
-msgstr ""
-
-#: builtin/rebase.c:1716
-#, c-format
-msgid "Current branch %s is up to date.\n"
-msgstr ""
-
-#: builtin/rebase.c:1724
-msgid "HEAD is up to date, rebase forced."
-msgstr ""
-
-#: builtin/rebase.c:1726
-#, c-format
-msgid "Current branch %s is up to date, rebase forced.\n"
-msgstr ""
-
-#: builtin/rebase.c:1734
-msgid "The pre-rebase hook refused to rebase."
-msgstr ""
-
-#: builtin/rebase.c:1741
-#, c-format
-msgid "Changes to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1744
-#, c-format
-msgid "Changes from %s to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1769
-#, c-format
-msgid "First, rewinding head to replay your work on top of it...\n"
-msgstr ""
-
-#: builtin/rebase.c:1781
-msgid "Could not detach HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1790
-#, c-format
-msgid "Fast-forwarded %s to %s.\n"
-msgstr ""
-
-#: builtin/receive-pack.c:35
-msgid "git receive-pack <git-dir>"
-msgstr ""
-
-#: builtin/receive-pack.c:1263
-msgid ""
-"By default, updating the current branch in a non-bare repository\n"
-"is denied, because it will make the index and work tree inconsistent\n"
-"with what you pushed, and will require 'git reset --hard' to match\n"
-"the work tree to HEAD.\n"
-"\n"
-"You can set the 'receive.denyCurrentBranch' configuration variable\n"
-"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
-"its current branch; however, this is not recommended unless you\n"
-"arranged to update its work tree to match what you pushed in some\n"
-"other way.\n"
-"\n"
-"To squelch this message and still keep the default behaviour, set\n"
-"'receive.denyCurrentBranch' configuration variable to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:1283
-msgid ""
-"By default, deleting the current branch is denied, because the next\n"
-"'git clone' won't result in any file checked out, causing confusion.\n"
-"\n"
-"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
-"'warn' or 'ignore' in the remote repository to allow deleting the\n"
-"current branch, with or without a warning message.\n"
-"\n"
-"To squelch this message, you can set it to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:2476
-msgid "quiet"
-msgstr ""
-
-#: builtin/receive-pack.c:2491
-msgid "you must specify a directory"
-msgstr ""
-
-#: builtin/reflog.c:9
-msgid "git reflog [show] [<log-options>] [<ref>]"
-msgstr ""
-
-#: builtin/reflog.c:12
-msgid ""
-"git reflog expire [--expire=<time>] [--expire-unreachable=<time>]\n"
-"                  [--rewrite] [--updateref] [--stale-fix]\n"
-"                  [--dry-run | -n] [--verbose] [--all [--single-worktree] | "
-"<refs>...]"
-msgstr ""
-
-#: builtin/reflog.c:17
-msgid ""
-"git reflog delete [--rewrite] [--updateref]\n"
-"                  [--dry-run | -n] [--verbose] <ref>@{<specifier>}..."
-msgstr ""
-
-#: builtin/reflog.c:21
-msgid "git reflog exists <ref>"
-msgstr ""
-
-#: builtin/reflog.c:197 builtin/reflog.c:211
-#, c-format
-msgid "invalid timestamp '%s' given to '--%s'"
-msgstr ""
-
-#: builtin/reflog.c:240 builtin/reflog.c:359
-msgid "do not actually prune any entries"
-msgstr ""
-
-#: builtin/reflog.c:243 builtin/reflog.c:362
-msgid ""
-"rewrite the old SHA1 with the new SHA1 of the entry that now precedes it"
-msgstr ""
-
-#: builtin/reflog.c:246 builtin/reflog.c:365
-msgid "update the reference to the value of the top reflog entry"
-msgstr ""
-
-#: builtin/reflog.c:248 builtin/reflog.c:367
-msgid "print extra information on screen"
-msgstr ""
-
-#: builtin/reflog.c:249 builtin/reflog.c:253
-msgid "timestamp"
-msgstr ""
-
-#: builtin/reflog.c:250
-msgid "prune entries older than the specified time"
-msgstr ""
-
-#: builtin/reflog.c:254
-msgid ""
-"prune entries older than <time> that are not reachable from the current tip "
-"of the branch"
-msgstr ""
-
-#: builtin/reflog.c:258
-msgid "prune any reflog entries that point to broken commits"
-msgstr ""
-
-#: builtin/reflog.c:259
-msgid "process the reflogs of all references"
-msgstr ""
-
-#: builtin/reflog.c:261
-msgid "limits processing to reflogs from the current worktree only"
-msgstr ""
-
-#: builtin/reflog.c:294
-#, c-format
-msgid "Marking reachable objects..."
-msgstr ""
-
-#: builtin/reflog.c:338
-#, c-format
-msgid "%s points nowhere!"
-msgstr ""
-
-#: builtin/reflog.c:374
-msgid "no reflog specified to delete"
-msgstr ""
-
-#: builtin/reflog.c:396
-#, c-format
-msgid "invalid ref format: %s"
-msgstr ""
-
-#: builtin/remote.c:19
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:20 builtin/remote.c:40
-msgid "git remote rename [--[no-]progress] <old> <new>"
-msgstr ""
-
-#: builtin/remote.c:21 builtin/remote.c:45
-msgid "git remote remove <name>"
-msgstr ""
-
-#: builtin/remote.c:22 builtin/remote.c:50
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr ""
-
-#: builtin/remote.c:23
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr ""
-
-#: builtin/remote.c:24
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr ""
-
-#: builtin/remote.c:25
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
-
-#: builtin/remote.c:26
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:27 builtin/remote.c:76
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr ""
-
-#: builtin/remote.c:28 builtin/remote.c:81
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr ""
-
-#: builtin/remote.c:29 builtin/remote.c:82
-msgid "git remote set-url --add <name> <newurl>"
-msgstr ""
-
-#: builtin/remote.c:30 builtin/remote.c:83
-msgid "git remote set-url --delete <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:35
-msgid "git remote add [<options>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:55
-msgid "git remote set-branches <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:56
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:61
-msgid "git remote show [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:66
-msgid "git remote prune [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:71
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr ""
-
-#: builtin/remote.c:100
-#, c-format
-msgid "Updating %s"
-msgstr ""
-
-#: builtin/remote.c:102
-#, c-format
-msgid "Could not fetch %s"
-msgstr ""
-
-#: builtin/remote.c:132
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
-msgstr ""
-
-#: builtin/remote.c:149
-#, c-format
-msgid "unknown mirror argument: %s"
-msgstr ""
-
-#: builtin/remote.c:165
-msgid "fetch the remote branches"
-msgstr ""
-
-#: builtin/remote.c:167
-msgid "import all tags and associated objects when fetching"
-msgstr ""
-
-#: builtin/remote.c:170
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr ""
-
-#: builtin/remote.c:172
-msgid "branch(es) to track"
-msgstr ""
-
-#: builtin/remote.c:173
-msgid "master branch"
-msgstr ""
-
-#: builtin/remote.c:175
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr ""
-
-#: builtin/remote.c:187
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr ""
-
-#: builtin/remote.c:189
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr ""
-
-#: builtin/remote.c:196 builtin/remote.c:716
-#, c-format
-msgid "remote %s already exists."
-msgstr ""
-
-#: builtin/remote.c:241
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr ""
-
-#: builtin/remote.c:323
-#, c-format
-msgid "unhandled branch.%s.rebase=%s; assuming 'true'"
-msgstr ""
-
-#: builtin/remote.c:367
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr ""
-
-#: builtin/remote.c:461 builtin/remote.c:469
-msgid "(matching)"
-msgstr ""
-
-#: builtin/remote.c:473
-msgid "(delete)"
-msgstr ""
-
-#: builtin/remote.c:664
-#, c-format
-msgid "could not set '%s'"
-msgstr ""
-
-#: builtin/remote.c:669
-#, c-format
-msgid ""
-"The %s configuration remote.pushDefault in:\n"
-"\t%s:%d\n"
-"now names the non-existent remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:707 builtin/remote.c:866 builtin/remote.c:973
-#, c-format
-msgid "No such remote: '%s'"
-msgstr ""
-
-#: builtin/remote.c:726
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr ""
-
-#: builtin/remote.c:746
-#, c-format
-msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
-msgstr ""
-
-#: builtin/remote.c:783
-msgid "Renaming remote references"
-msgstr ""
-
-#: builtin/remote.c:794
-#, c-format
-msgid "deleting '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:832
-#, c-format
-msgid "creating '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:912
-msgid ""
-"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
-"to delete it, use:"
-msgid_plural ""
-"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
-"to delete them, use:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:926
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr ""
-
-#: builtin/remote.c:1034
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
-msgstr ""
-
-#: builtin/remote.c:1037
-msgid " tracked"
-msgstr ""
-
-#: builtin/remote.c:1039
-msgid " stale (use 'git remote prune' to remove)"
-msgstr ""
-
-#: builtin/remote.c:1041
-msgid " ???"
-msgstr ""
-
-#: builtin/remote.c:1082
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr ""
-
-#: builtin/remote.c:1091
-#, c-format
-msgid "rebases interactively onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1093
-#, c-format
-msgid "rebases interactively (with merges) onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1096
-#, c-format
-msgid "rebases onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1100
-#, c-format
-msgid " merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1103
-#, c-format
-msgid "merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1106
-#, c-format
-msgid "%-*s    and with remote %s\n"
-msgstr ""
-
-#: builtin/remote.c:1149
-msgid "create"
-msgstr ""
-
-#: builtin/remote.c:1152
-msgid "delete"
-msgstr ""
-
-#: builtin/remote.c:1156
-msgid "up to date"
-msgstr ""
-
-#: builtin/remote.c:1159
-msgid "fast-forwardable"
-msgstr ""
-
-#: builtin/remote.c:1162
-msgid "local out of date"
-msgstr ""
-
-#: builtin/remote.c:1169
-#, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1172
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1176
-#, c-format
-msgid "    %-*s forces to %s"
-msgstr ""
-
-#: builtin/remote.c:1179
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr ""
-
-#: builtin/remote.c:1247
-msgid "do not query remotes"
-msgstr ""
-
-#: builtin/remote.c:1268
-#, c-format
-msgid "* remote %s"
-msgstr ""
-
-#: builtin/remote.c:1269
-#, c-format
-msgid "  Fetch URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1270 builtin/remote.c:1286 builtin/remote.c:1423
-msgid "(no URL)"
-msgstr ""
-
-#. TRANSLATORS: the colon ':' should align
-#. with the one in " Fetch URL: %s"
-#. translation.
-#.
-#: builtin/remote.c:1284 builtin/remote.c:1286
-#, c-format
-msgid "  Push  URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1288 builtin/remote.c:1290 builtin/remote.c:1292
-#, c-format
-msgid "  HEAD branch: %s"
-msgstr ""
-
-#: builtin/remote.c:1288
-msgid "(not queried)"
-msgstr ""
-
-#: builtin/remote.c:1290
-msgid "(unknown)"
-msgstr ""
-
-#: builtin/remote.c:1294
-#, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr ""
-
-#: builtin/remote.c:1306
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1309 builtin/remote.c:1335
-msgid " (status not queried)"
-msgstr ""
-
-#: builtin/remote.c:1318
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1326
-msgid "  Local refs will be mirrored by 'git push'"
-msgstr ""
-
-#: builtin/remote.c:1332
-#, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1353
-msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr ""
-
-#: builtin/remote.c:1355
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr ""
-
-#: builtin/remote.c:1369
-msgid "Cannot determine remote HEAD"
-msgstr ""
-
-#: builtin/remote.c:1371
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
-msgstr ""
-
-#: builtin/remote.c:1381
-#, c-format
-msgid "Could not delete %s"
-msgstr ""
-
-#: builtin/remote.c:1389
-#, c-format
-msgid "Not a valid ref: %s"
-msgstr ""
-
-#: builtin/remote.c:1391
-#, c-format
-msgid "Could not setup %s"
-msgstr ""
-
-#: builtin/remote.c:1409
-#, c-format
-msgid " %s will become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1410
-#, c-format
-msgid " %s has become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1419
-#, c-format
-msgid "Pruning %s"
-msgstr ""
-
-#: builtin/remote.c:1420
-#, c-format
-msgid "URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1436
-#, c-format
-msgid " * [would prune] %s"
-msgstr ""
-
-#: builtin/remote.c:1439
-#, c-format
-msgid " * [pruned] %s"
-msgstr ""
-
-#: builtin/remote.c:1484
-msgid "prune remotes after fetching"
-msgstr ""
-
-#: builtin/remote.c:1548 builtin/remote.c:1604 builtin/remote.c:1674
-#, c-format
-msgid "No such remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1566
-msgid "add branch"
-msgstr ""
-
-#: builtin/remote.c:1573
-msgid "no remote specified"
-msgstr ""
-
-#: builtin/remote.c:1590
-msgid "query push URLs rather than fetch URLs"
-msgstr ""
-
-#: builtin/remote.c:1592
-msgid "return all URLs"
-msgstr ""
-
-#: builtin/remote.c:1622
-#, c-format
-msgid "no URLs configured for remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1648
-msgid "manipulate push URLs"
-msgstr ""
-
-#: builtin/remote.c:1650
-msgid "add URL"
-msgstr ""
-
-#: builtin/remote.c:1652
-msgid "delete URLs"
-msgstr ""
-
-#: builtin/remote.c:1659
-msgid "--add --delete doesn't make sense"
-msgstr ""
-
-#: builtin/remote.c:1700
-#, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr ""
-
-#: builtin/remote.c:1708
-#, c-format
-msgid "No such URL found: %s"
-msgstr ""
-
-#: builtin/remote.c:1710
-msgid "Will not delete all non-push URLs"
-msgstr ""
-
-#: builtin/remote.c:1727
-msgid "be verbose; must be placed before a subcommand"
-msgstr ""
-
-#: builtin/repack.c:29
-msgid "git repack [<options>]"
-msgstr ""
-
-#: builtin/repack.c:34
-msgid ""
-"Incremental repacks are incompatible with bitmap indexes.  Use\n"
-"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
-msgstr ""
-
-#: builtin/repack.c:206
-msgid "could not start pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:280 builtin/repack.c:824
-msgid "repack: Expecting full hex object ID lines only from pack-objects."
-msgstr ""
-
-#: builtin/repack.c:304
-msgid "could not finish pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:319
-#, c-format
-msgid "cannot open index for %s"
-msgstr ""
-
-#: builtin/repack.c:378
-#, c-format
-msgid "pack %s too large to consider in geometric progression"
-msgstr ""
-
-#: builtin/repack.c:411 builtin/repack.c:418 builtin/repack.c:423
-#, c-format
-msgid "pack %s too large to roll up"
-msgstr ""
-
-#: builtin/repack.c:503
-#, c-format
-msgid "could not open tempfile %s for writing"
-msgstr ""
-
-#: builtin/repack.c:521
-msgid "could not close refs snapshot tempfile"
-msgstr ""
-
-#: builtin/repack.c:634
-msgid "pack everything in a single pack"
-msgstr ""
-
-#: builtin/repack.c:636
-msgid "same as -a, and turn unreachable objects loose"
-msgstr ""
-
-#: builtin/repack.c:639
-msgid "remove redundant packs, and run git-prune-packed"
-msgstr ""
-
-#: builtin/repack.c:641
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:643
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:645
-msgid "do not run git-update-server-info"
-msgstr ""
-
-#: builtin/repack.c:648
-msgid "pass --local to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:650
-msgid "write bitmap index"
-msgstr ""
-
-#: builtin/repack.c:652
-msgid "pass --delta-islands to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:653
-msgid "approxidate"
-msgstr ""
-
-#: builtin/repack.c:654
-msgid "with -A, do not loosen objects older than this"
-msgstr ""
-
-#: builtin/repack.c:656
-msgid "with -a, repack unreachable objects"
-msgstr ""
-
-#: builtin/repack.c:658
-msgid "size of the window used for delta compression"
-msgstr ""
-
-#: builtin/repack.c:659 builtin/repack.c:665
-msgid "bytes"
-msgstr ""
-
-#: builtin/repack.c:660
-msgid "same as the above, but limit memory size instead of entries count"
-msgstr ""
-
-#: builtin/repack.c:662
-msgid "limits the maximum delta depth"
-msgstr ""
-
-#: builtin/repack.c:664
-msgid "limits the maximum number of threads"
-msgstr ""
-
-#: builtin/repack.c:666
-msgid "maximum size of each packfile"
-msgstr ""
-
-#: builtin/repack.c:668
-msgid "repack objects in packs marked with .keep"
-msgstr ""
-
-#: builtin/repack.c:670
-msgid "do not repack this pack"
-msgstr ""
-
-#: builtin/repack.c:672
-msgid "find a geometric progression with factor <N>"
-msgstr ""
-
-#: builtin/repack.c:674
-msgid "write a multi-pack index of the resulting packs"
-msgstr ""
-
-#: builtin/repack.c:684
-msgid "cannot delete packs in a precious-objects repo"
-msgstr ""
-
-#: builtin/repack.c:833
-msgid "Nothing new to pack."
-msgstr ""
-
-#: builtin/repack.c:863
-#, c-format
-msgid "missing required file: %s"
-msgstr ""
-
-#: builtin/repack.c:865
-#, c-format
-msgid "could not unlink: %s"
-msgstr ""
-
-#: builtin/replace.c:22
-msgid "git replace [-f] <object> <replacement>"
-msgstr ""
-
-#: builtin/replace.c:23
-msgid "git replace [-f] --edit <object>"
-msgstr ""
-
-#: builtin/replace.c:24
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr ""
-
-#: builtin/replace.c:26
-msgid "git replace -d <object>..."
-msgstr ""
-
-#: builtin/replace.c:27
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr ""
-
-#: builtin/replace.c:90
-#, c-format
-msgid ""
-"invalid replace format '%s'\n"
-"valid formats are 'short', 'medium' and 'long'"
-msgstr ""
-
-#: builtin/replace.c:125
-#, c-format
-msgid "replace ref '%s' not found"
-msgstr ""
-
-#: builtin/replace.c:141
-#, c-format
-msgid "Deleted replace ref '%s'"
-msgstr ""
-
-#: builtin/replace.c:153
-#, c-format
-msgid "'%s' is not a valid ref name"
-msgstr ""
-
-#: builtin/replace.c:158
-#, c-format
-msgid "replace ref '%s' already exists"
-msgstr ""
-
-#: builtin/replace.c:178
-#, c-format
-msgid ""
-"Objects must be of the same type.\n"
-"'%s' points to a replaced object of type '%s'\n"
-"while '%s' points to a replacement object of type '%s'."
-msgstr ""
-
-#: builtin/replace.c:229
-#, c-format
-msgid "unable to open %s for writing"
-msgstr ""
-
-#: builtin/replace.c:242
-msgid "cat-file reported failure"
-msgstr ""
-
-#: builtin/replace.c:258
-#, c-format
-msgid "unable to open %s for reading"
-msgstr ""
-
-#: builtin/replace.c:271
-msgid "unable to spawn mktree"
-msgstr ""
-
-#: builtin/replace.c:275
-msgid "unable to read from mktree"
-msgstr ""
-
-#: builtin/replace.c:284
-msgid "mktree reported failure"
-msgstr ""
-
-#: builtin/replace.c:288
-msgid "mktree did not return an object name"
-msgstr ""
-
-#: builtin/replace.c:297
-#, c-format
-msgid "unable to fstat %s"
-msgstr ""
-
-#: builtin/replace.c:302
-msgid "unable to write object to database"
-msgstr ""
-
-#: builtin/replace.c:325
-#, c-format
-msgid "unable to get object type for %s"
-msgstr ""
-
-#: builtin/replace.c:341
-msgid "editing object file failed"
-msgstr ""
-
-#: builtin/replace.c:350
-#, c-format
-msgid "new object is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:383
-#, c-format
-msgid "could not parse %s as a commit"
-msgstr ""
-
-#: builtin/replace.c:415
-#, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:417
-#, c-format
-msgid "malformed mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:429
-#, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
-msgstr ""
-
-#: builtin/replace.c:468
-#, c-format
-msgid "the original commit '%s' has a gpg signature"
-msgstr ""
-
-#: builtin/replace.c:469
-msgid "the signature will be removed in the replacement commit!"
-msgstr ""
-
-#: builtin/replace.c:479
-#, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr ""
-
-#: builtin/replace.c:487
-#, c-format
-msgid "graft for '%s' unnecessary"
-msgstr ""
-
-#: builtin/replace.c:491
-#, c-format
-msgid "new commit is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:526
-#, c-format
-msgid ""
-"could not convert the following graft(s):\n"
-"%s"
-msgstr ""
-
-#: builtin/replace.c:547
-msgid "list replace refs"
-msgstr ""
-
-#: builtin/replace.c:548
-msgid "delete replace refs"
-msgstr ""
-
-#: builtin/replace.c:549
-msgid "edit existing object"
-msgstr ""
-
-#: builtin/replace.c:550
-msgid "change a commit's parents"
-msgstr ""
-
-#: builtin/replace.c:551
-msgid "convert existing graft file"
-msgstr ""
-
-#: builtin/replace.c:552
-msgid "replace the ref if it exists"
-msgstr ""
-
-#: builtin/replace.c:554
-msgid "do not pretty-print contents for --edit"
-msgstr ""
-
-#: builtin/replace.c:555
-msgid "use this format"
-msgstr ""
-
-#: builtin/replace.c:568
-msgid "--format cannot be used when not listing"
-msgstr ""
-
-#: builtin/replace.c:576
-msgid "-f only makes sense when writing a replacement"
-msgstr ""
-
-#: builtin/replace.c:580
-msgid "--raw only makes sense with --edit"
-msgstr ""
-
-#: builtin/replace.c:586
-msgid "-d needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:592
-msgid "bad number of arguments"
-msgstr ""
-
-#: builtin/replace.c:598
-msgid "-e needs exactly one argument"
-msgstr ""
-
-#: builtin/replace.c:604
-msgid "-g needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:610
-msgid "--convert-graft-file takes no argument"
-msgstr ""
-
-#: builtin/replace.c:616
-msgid "only one pattern can be given with -l"
-msgstr ""
-
-#: builtin/rerere.c:13
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr ""
-
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr ""
-
-#: builtin/rerere.c:77
-msgid "'git rerere forget' without paths is deprecated"
-msgstr ""
-
-#: builtin/rerere.c:111
-#, c-format
-msgid "unable to generate diff for '%s'"
-msgstr ""
-
-#: builtin/reset.c:33
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
-msgstr ""
-
-#: builtin/reset.c:34
-msgid "git reset [-q] [<tree-ish>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/reset.c:35
-msgid ""
-"git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]"
-msgstr ""
-
-#: builtin/reset.c:36
-msgid "git reset --patch [<tree-ish>] [--] [<pathspec>...]"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "mixed"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "soft"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "hard"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "merge"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "keep"
-msgstr ""
-
-#: builtin/reset.c:90
-msgid "You do not have a valid HEAD."
-msgstr ""
-
-#: builtin/reset.c:92
-msgid "Failed to find tree of HEAD."
-msgstr ""
-
-#: builtin/reset.c:98
-#, c-format
-msgid "Failed to find tree of %s."
-msgstr ""
-
-#: builtin/reset.c:123
-#, c-format
-msgid "HEAD is now at %s"
-msgstr ""
-
-#: builtin/reset.c:304
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
-
-#: builtin/reset.c:402 builtin/stash.c:606 builtin/stash.c:669
-#: builtin/stash.c:693
-msgid "be quiet, only report errors"
-msgstr ""
-
-#: builtin/reset.c:404
-msgid "skip refreshing the index after reset"
-msgstr ""
-
-#: builtin/reset.c:406
-msgid "reset HEAD and index"
-msgstr ""
-
-#: builtin/reset.c:407
-msgid "reset only HEAD"
-msgstr ""
-
-#: builtin/reset.c:409 builtin/reset.c:411
-msgid "reset HEAD, index and working tree"
-msgstr ""
-
-#: builtin/reset.c:413
-msgid "reset HEAD but keep local changes"
-msgstr ""
-
-#: builtin/reset.c:419
-msgid "record only the fact that removed paths will be added later"
-msgstr ""
-
-#: builtin/reset.c:452
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
-
-#: builtin/reset.c:460
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
-
-#: builtin/reset.c:479
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-
-#: builtin/reset.c:481
-#, c-format
-msgid "Cannot do %s reset with paths."
-msgstr ""
-
-#: builtin/reset.c:496
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr ""
-
-#: builtin/reset.c:527
-msgid "Unstaged changes after reset:"
-msgstr ""
-
-#: builtin/reset.c:530
-#, c-format
-msgid ""
-"It took %.2f seconds to refresh the index after reset.  You can use\n"
-"'--no-refresh' to avoid this."
-msgstr ""
-
-#: builtin/reset.c:547
-#, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr ""
-
-#: builtin/reset.c:552
-msgid "Could not write new index file."
-msgstr ""
-
-#: builtin/rev-list.c:659
-msgid "rev-list does not support display of notes"
-msgstr ""
-
-#: builtin/rev-list.c:664
-#, c-format
-msgid "marked counting and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/rev-parse.c:409
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr ""
-
-#: builtin/rev-parse.c:414
-msgid "keep the `--` passed as an arg"
-msgstr ""
-
-#: builtin/rev-parse.c:416
-msgid "stop parsing after the first non-option argument"
-msgstr ""
-
-#: builtin/rev-parse.c:419
-msgid "output in stuck long form"
-msgstr ""
-
-#: builtin/rev-parse.c:438
-msgid "premature end of input"
-msgstr ""
-
-#: builtin/rev-parse.c:442
-msgid "no usage string given before the `--' separator"
-msgstr ""
-
-#: builtin/rev-parse.c:548
-msgid "Needed a single revision"
-msgstr ""
-
-#: builtin/rev-parse.c:552
-msgid ""
-"git rev-parse --parseopt [<options>] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [<options>] [<arg>...]\n"
-"\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
-msgstr ""
-
-#: builtin/rev-parse.c:712
-msgid "--resolve-git-dir requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:715
-#, c-format
-msgid "not a gitdir '%s'"
-msgstr ""
-
-#: builtin/rev-parse.c:739
-msgid "--git-path requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:749
-msgid "-n requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:763
-msgid "--path-format requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:769
-#, c-format
-msgid "unknown argument to --path-format: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:776
-msgid "--default requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:782
-msgid "--prefix requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:851
-#, c-format
-msgid "unknown mode for --abbrev-ref: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:1023
-#, c-format
-msgid "unknown mode for --show-object-format: %s"
-msgstr ""
-
-#: builtin/revert.c:24
-msgid "git revert [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:25
-msgid "git revert <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:30
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:31
-msgid "git cherry-pick <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:72
-#, c-format
-msgid "option `%s' expects a number greater than zero"
-msgstr ""
-
-#: builtin/revert.c:92
-#, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr ""
-
-#: builtin/revert.c:102
-msgid "end revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:103
-msgid "resume revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:104
-msgid "cancel revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:105
-msgid "skip current commit and continue"
-msgstr ""
-
-#: builtin/revert.c:107
-msgid "don't automatically commit"
-msgstr ""
-
-#: builtin/revert.c:108
-msgid "edit the commit message"
-msgstr ""
-
-#: builtin/revert.c:111
-msgid "parent-number"
-msgstr ""
-
-#: builtin/revert.c:112
-msgid "select mainline parent"
-msgstr ""
-
-#: builtin/revert.c:114
-msgid "merge strategy"
-msgstr ""
-
-#: builtin/revert.c:116
-msgid "option for merge strategy"
-msgstr ""
-
-#: builtin/revert.c:125
-msgid "append commit name"
-msgstr ""
-
-#: builtin/revert.c:127
-msgid "preserve initially empty commits"
-msgstr ""
-
-#: builtin/revert.c:128
-msgid "allow commits with empty messages"
-msgstr ""
-
-#: builtin/revert.c:129
-msgid "keep redundant, empty commits"
-msgstr ""
-
-#: builtin/revert.c:241
-msgid "revert failed"
-msgstr ""
-
-#: builtin/revert.c:254
-msgid "cherry-pick failed"
-msgstr ""
-
-#: builtin/rm.c:20
-msgid "git rm [<options>] [--] <file>..."
-msgstr ""
-
-#: builtin/rm.c:208
-msgid ""
-"the following file has staged content different from both the\n"
-"file and the HEAD:"
-msgid_plural ""
-"the following files have staged content different from both the\n"
-"file and the HEAD:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:213
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:217
-msgid "the following file has changes staged in the index:"
-msgid_plural "the following files have changes staged in the index:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:221 builtin/rm.c:230
-msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:227
-msgid "the following file has local modifications:"
-msgid_plural "the following files have local modifications:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:245
-msgid "do not list removed files"
-msgstr ""
-
-#: builtin/rm.c:246
-msgid "only remove from the index"
-msgstr ""
-
-#: builtin/rm.c:247
-msgid "override the up-to-date check"
-msgstr ""
-
-#: builtin/rm.c:248
-msgid "allow recursive removal"
-msgstr ""
-
-#: builtin/rm.c:250
-msgid "exit with a zero status even if nothing matched"
-msgstr ""
-
-#: builtin/rm.c:285
-msgid "No pathspec was given. Which files should I remove?"
-msgstr ""
-
-#: builtin/rm.c:315
-msgid "please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/rm.c:337
-#, c-format
-msgid "not removing '%s' recursively without -r"
-msgstr ""
-
-#: builtin/rm.c:385
-#, c-format
-msgid "git rm: unable to remove %s"
-msgstr ""
-
-#: builtin/send-pack.c:20
-msgid ""
-"git send-pack [--mirror] [--dry-run] [--force]\n"
-"              [--receive-pack=<git-receive-pack>]\n"
-"              [--verbose] [--thin] [--atomic]\n"
-"              [<host>:]<directory> (--all | <ref>...)"
-msgstr ""
-
-#: builtin/send-pack.c:192
-msgid "remote name"
-msgstr ""
-
-#: builtin/send-pack.c:205
-msgid "use stateless RPC protocol"
-msgstr ""
-
-#: builtin/send-pack.c:206
-msgid "read refs from stdin"
-msgstr ""
-
-#: builtin/send-pack.c:207
-msgid "print status from remote helper"
-msgstr ""
-
-#: builtin/shortlog.c:16
-msgid "git shortlog [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/shortlog.c:17
-msgid "git log --pretty=short | git shortlog [<options>]"
-msgstr ""
-
-#: builtin/shortlog.c:123
-msgid "using multiple --group options with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:133
-msgid "using --group=trailer with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:323
-#, c-format
-msgid "unknown group type: %s"
-msgstr ""
-
-#: builtin/shortlog.c:351
-msgid "group by committer rather than author"
-msgstr ""
-
-#: builtin/shortlog.c:354
-msgid "sort output according to the number of commits per author"
-msgstr ""
-
-#: builtin/shortlog.c:356
-msgid "suppress commit descriptions, only provides commit count"
-msgstr ""
-
-#: builtin/shortlog.c:358
-msgid "show the email address of each author"
-msgstr ""
-
-#: builtin/shortlog.c:359
-msgid "<w>[,<i1>[,<i2>]]"
-msgstr ""
-
-#: builtin/shortlog.c:360
-msgid "linewrap output"
-msgstr ""
-
-#: builtin/shortlog.c:362
-msgid "field"
-msgstr ""
-
-#: builtin/shortlog.c:363
-msgid "group by field"
-msgstr ""
-
-#: builtin/shortlog.c:395
-msgid "too many arguments given outside repository"
-msgstr ""
-
-#: builtin/show-branch.c: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>)...]"
-msgstr ""
-
-#: builtin/show-branch.c:18
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr ""
-
-#: builtin/show-branch.c:396
-#, c-format
-msgid "ignoring %s; cannot handle more than %d ref"
-msgid_plural "ignoring %s; cannot handle more than %d refs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:548
-#, c-format
-msgid "no matching refs with %s"
-msgstr ""
-
-#: builtin/show-branch.c:645
-msgid "show remote-tracking and local branches"
-msgstr ""
-
-#: builtin/show-branch.c:647
-msgid "show remote-tracking branches"
-msgstr ""
-
-#: builtin/show-branch.c:649
-msgid "color '*!+-' corresponding to the branch"
-msgstr ""
-
-#: builtin/show-branch.c:651
-msgid "show <n> more commits after the common ancestor"
-msgstr ""
-
-#: builtin/show-branch.c:653
-msgid "synonym to more=-1"
-msgstr ""
-
-#: builtin/show-branch.c:654
-msgid "suppress naming strings"
-msgstr ""
-
-#: builtin/show-branch.c:656
-msgid "include the current branch"
-msgstr ""
-
-#: builtin/show-branch.c:658
-msgid "name commits with their object names"
-msgstr ""
-
-#: builtin/show-branch.c:660
-msgid "show possible merge bases"
-msgstr ""
-
-#: builtin/show-branch.c:662
-msgid "show refs unreachable from any other ref"
-msgstr ""
-
-#: builtin/show-branch.c:664
-msgid "show commits in topological order"
-msgstr ""
-
-#: builtin/show-branch.c:667
-msgid "show only commits not on the first branch"
-msgstr ""
-
-#: builtin/show-branch.c:669
-msgid "show merges reachable from only one tip"
-msgstr ""
-
-#: builtin/show-branch.c:671
-msgid "topologically sort, maintaining date order where possible"
-msgstr ""
-
-#: builtin/show-branch.c:674
-msgid "<n>[,<base>]"
-msgstr ""
-
-#: builtin/show-branch.c:675
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr ""
-
-#: builtin/show-branch.c:735
-msgid "no branches given, and HEAD is not valid"
-msgstr ""
-
-#: builtin/show-branch.c:738
-msgid "--reflog option needs one branch name"
-msgstr ""
-
-#: builtin/show-branch.c:741
-#, c-format
-msgid "only %d entry can be shown at one time."
-msgid_plural "only %d entries can be shown at one time."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:745
-#, c-format
-msgid "no such ref %s"
-msgstr ""
-
-#: builtin/show-branch.c:831
-#, c-format
-msgid "cannot handle more than %d rev."
-msgid_plural "cannot handle more than %d revs."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:835
-#, c-format
-msgid "'%s' is not a valid ref."
-msgstr ""
-
-#: builtin/show-branch.c:838
-#, c-format
-msgid "cannot find commit %s (%s)"
-msgstr ""
-
-#: builtin/show-index.c:21
-msgid "hash-algorithm"
-msgstr ""
-
-#: builtin/show-index.c:31
-msgid "Unknown hash algorithm"
-msgstr ""
-
-#: builtin/show-ref.c:12
-msgid ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
-msgstr ""
-
-#: builtin/show-ref.c:13
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr ""
-
-#: builtin/show-ref.c:162
-msgid "only show tags (can be combined with heads)"
-msgstr ""
-
-#: builtin/show-ref.c:163
-msgid "only show heads (can be combined with tags)"
-msgstr ""
-
-#: builtin/show-ref.c:164
-msgid "stricter reference checking, requires exact ref path"
-msgstr ""
-
-#: builtin/show-ref.c:167 builtin/show-ref.c:169
-msgid "show the HEAD reference, even if it would be filtered out"
-msgstr ""
-
-#: builtin/show-ref.c:171
-msgid "dereference tags into object IDs"
-msgstr ""
-
-#: builtin/show-ref.c:173
-msgid "only show SHA1 hash using <n> digits"
-msgstr ""
-
-#: builtin/show-ref.c:177
-msgid "do not print results to stdout (useful with --verify)"
-msgstr ""
-
-#: builtin/show-ref.c:179
-msgid "show refs from stdin that aren't in local repository"
-msgstr ""
-
-#: builtin/sparse-checkout.c:23
-msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
-msgstr ""
-
-#: builtin/sparse-checkout.c:61
-msgid "this worktree is not sparse"
-msgstr ""
-
-#: builtin/sparse-checkout.c:76
-msgid "this worktree is not sparse (sparse-checkout file may not exist)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:177
-#, c-format
-msgid ""
-"directory '%s' contains untracked files, but is not in the sparse-checkout "
-"cone"
-msgstr ""
-
-#: builtin/sparse-checkout.c:185
-#, c-format
-msgid "failed to remove directory '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:327
-msgid "failed to create directory for sparse-checkout file"
-msgstr ""
-
-#: builtin/sparse-checkout.c:366
-msgid "failed to initialize worktree config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:411
-msgid "failed to modify sparse-index config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:441 builtin/sparse-checkout.c:793
-#: builtin/sparse-checkout.c:847
-msgid "initialize the sparse-checkout in cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:443 builtin/sparse-checkout.c:795
-#: builtin/sparse-checkout.c:849
-msgid "toggle the use of a sparse index"
-msgstr ""
-
-#: builtin/sparse-checkout.c:479
-#, c-format
-msgid "failed to open '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:531
-#, c-format
-msgid "could not normalize path %s"
-msgstr ""
-
-#: builtin/sparse-checkout.c:560
-#, c-format
-msgid "unable to unquote C-style string '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:615 builtin/sparse-checkout.c:643
-msgid "unable to load existing sparse-checkout patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:619
-msgid "existing sparse-checkout patterns do not use cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:707
-msgid "please run from the toplevel directory in non-cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:712
-msgid "specify directories rather than patterns (no leading slash)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:714
-msgid ""
-"specify directories rather than patterns.  If your directory starts with a "
-"'!', pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:716
-msgid ""
-"specify directories rather than patterns.  If your directory really has any "
-"of '*?[]\\' in it, pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:732
-#, c-format
-msgid ""
-"'%s' is not a directory; to treat it as a directory anyway, rerun with --"
-"skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:734
-#, c-format
-msgid ""
-"pass a leading slash before paths such as '%s' if you want a single file "
-"(see NON-CONE PROBLEMS in the git-sparse-checkout manual)."
-msgstr ""
-
-#: builtin/sparse-checkout.c:739
-msgid "git sparse-checkout add [--skip-checks] (--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:752 builtin/sparse-checkout.c:797
-msgid ""
-"skip some sanity checks on the given paths that might give false positives"
-msgstr ""
-
-#: builtin/sparse-checkout.c:755 builtin/sparse-checkout.c:800
-msgid "read patterns from standard in"
-msgstr ""
-
-#: builtin/sparse-checkout.c:760
-msgid "no sparse-checkout to add to"
-msgstr ""
-
-#: builtin/sparse-checkout.c:775
-msgid ""
-"git sparse-checkout set [--[no-]cone] [--[no-]sparse-index] [--skip-checks] "
-"(--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:854
-msgid "must be in a sparse-checkout to reapply sparsity patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:914
-msgid "error while refreshing working directory"
-msgstr ""
-
-#: builtin/stash.c:24 builtin/stash.c:40
-msgid "git stash list [<options>]"
-msgstr ""
-
-#: builtin/stash.c:25 builtin/stash.c:45
-msgid "git stash show [<options>] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:26 builtin/stash.c:50
-msgid "git stash drop [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:27
-msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:28 builtin/stash.c:65
-msgid "git stash branch <branchname> [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:30
-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 ""
-
-#: builtin/stash.c:34
-msgid ""
-"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--"
-"quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:55
-msgid "git stash pop [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:60
-msgid "git stash apply [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:75
-msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>"
-msgstr ""
-
-#: builtin/stash.c:80
-msgid ""
-"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
-"          [--] [<pathspec>...]]"
-msgstr ""
-
-#: builtin/stash.c:87
-msgid ""
-"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"               [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:130
-#, c-format
-msgid "'%s' is not a stash-like commit"
-msgstr ""
-
-#: builtin/stash.c:150
-#, c-format
-msgid "Too many revisions specified:%s"
-msgstr ""
-
-#: builtin/stash.c:164
-msgid "No stash entries found."
-msgstr ""
-
-#: builtin/stash.c:178
-#, c-format
-msgid "%s is not a valid reference"
-msgstr ""
-
-#: builtin/stash.c:227
-msgid "git stash clear with arguments is unimplemented"
-msgstr ""
-
-#: builtin/stash.c:447
-#, c-format
-msgid ""
-"WARNING: Untracked file in way of tracked file!  Renaming\n"
-"            %s -> %s\n"
-"         to make room.\n"
-msgstr ""
-
-#: builtin/stash.c:508
-msgid "cannot apply a stash in the middle of a merge"
-msgstr ""
-
-#: builtin/stash.c:519
-#, c-format
-msgid "could not generate diff %s^!."
-msgstr ""
-
-#: builtin/stash.c:526
-msgid "conflicts in index. Try without --index."
-msgstr ""
-
-#: builtin/stash.c:532
-msgid "could not save index tree"
-msgstr ""
-
-#: builtin/stash.c:552
-#, c-format
-msgid "Merging %s with %s"
-msgstr ""
-
-#: builtin/stash.c:562
-msgid "Index was not unstashed."
-msgstr ""
-
-#: builtin/stash.c:576
-msgid "could not restore untracked files from stash"
-msgstr ""
-
-#: builtin/stash.c:608 builtin/stash.c:695
-msgid "attempt to recreate the index"
-msgstr ""
-
-#: builtin/stash.c:641
-#, c-format
-msgid "Dropped %s (%s)"
-msgstr ""
-
-#: builtin/stash.c:644
-#, c-format
-msgid "%s: Could not drop stash entry"
-msgstr ""
-
-#: builtin/stash.c:657
-#, c-format
-msgid "'%s' is not a stash reference"
-msgstr ""
-
-#: builtin/stash.c:707
-msgid "The stash entry is kept in case you need it again."
-msgstr ""
-
-#: builtin/stash.c:730
-msgid "No branch name specified"
-msgstr ""
-
-#: builtin/stash.c:809
-msgid "failed to parse tree"
-msgstr ""
-
-#: builtin/stash.c:820
-msgid "failed to unpack trees"
-msgstr ""
-
-#: builtin/stash.c:840
-msgid "include untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:843
-msgid "only show untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:930 builtin/stash.c:967
-#, c-format
-msgid "Cannot update %s with %s"
-msgstr ""
-
-#: builtin/stash.c:948 builtin/stash.c:1667 builtin/stash.c:1739
-msgid "stash message"
-msgstr ""
-
-#: builtin/stash.c:958
-msgid "\"git stash store\" requires one <commit> argument"
-msgstr ""
-
-#: builtin/stash.c:1143
-msgid "No staged changes"
-msgstr ""
-
-#: builtin/stash.c:1204
-msgid "No changes selected"
-msgstr ""
-
-#: builtin/stash.c:1304
-msgid "You do not have the initial commit yet"
-msgstr ""
-
-#: builtin/stash.c:1331
-msgid "Cannot save the current index state"
-msgstr ""
-
-#: builtin/stash.c:1340
-msgid "Cannot save the untracked files"
-msgstr ""
-
-#: builtin/stash.c:1351 builtin/stash.c:1370
-msgid "Cannot save the current worktree state"
-msgstr ""
-
-#: builtin/stash.c:1361
-msgid "Cannot save the current staged state"
-msgstr ""
-
-#: builtin/stash.c:1398
-msgid "Cannot record working tree state"
-msgstr ""
-
-#: builtin/stash.c:1447
-msgid "Can't use --patch and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1458
-msgid "Can't use --staged and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1476
-msgid "Did you forget to 'git add'?"
-msgstr ""
-
-#: builtin/stash.c:1491
-msgid "No local changes to save"
-msgstr ""
-
-#: builtin/stash.c:1498
-msgid "Cannot initialize stash"
-msgstr ""
-
-#: builtin/stash.c:1513
-msgid "Cannot save the current status"
-msgstr ""
-
-#: builtin/stash.c:1518
-#, c-format
-msgid "Saved working directory and index state %s"
-msgstr ""
-
-#: builtin/stash.c:1615
-msgid "Cannot remove worktree changes"
-msgstr ""
-
-#: builtin/stash.c:1656 builtin/stash.c:1728
-msgid "keep index"
-msgstr ""
-
-#: builtin/stash.c:1658 builtin/stash.c:1730
-msgid "stash staged changes only"
-msgstr ""
-
-#: builtin/stash.c:1660 builtin/stash.c:1732
-msgid "stash in patch mode"
-msgstr ""
-
-#: builtin/stash.c:1661 builtin/stash.c:1733
-msgid "quiet mode"
-msgstr ""
-
-#: builtin/stash.c:1663 builtin/stash.c:1735
-msgid "include untracked files in stash"
-msgstr ""
-
-#: builtin/stash.c:1665 builtin/stash.c:1737
-msgid "include ignore files"
-msgstr ""
-
-#: builtin/stripspace.c:37
-msgid "skip and remove all lines starting with comment character"
-msgstr ""
-
-#: builtin/stripspace.c:40
-msgid "prepend comment character and space to each line"
-msgstr ""
-
-#: builtin/submodule--helper.c:50 builtin/submodule--helper.c:2486
-#, c-format
-msgid "Expecting a full ref name, got %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:103
-#, c-format
-msgid "cannot strip one component off url '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:213
-#, c-format
-msgid ""
-"could not look up configuration '%s'. Assuming this repository is its own "
-"authoritative upstream."
-msgstr ""
-
-#: builtin/submodule--helper.c:413 builtin/submodule--helper.c:1873
-msgid "alternative anchor for relative paths"
-msgstr ""
-
-#: builtin/submodule--helper.c:418
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:476 builtin/submodule--helper.c:617
-#: builtin/submodule--helper.c:640
-#, c-format
-msgid "No url found for submodule path '%s' in .gitmodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:528
-#, c-format
-msgid "Entering '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:531
-#, c-format
-msgid ""
-"run_command returned non-zero status for %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:553
-#, c-format
-msgid ""
-"run_command returned non-zero status while recursing in the nested "
-"submodules of %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:569
-msgid "suppress output of entering each submodule command"
-msgstr ""
-
-#: builtin/submodule--helper.c:571 builtin/submodule--helper.c:876
-#: builtin/submodule--helper.c:1458
-msgid "recurse into nested submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:576
-msgid "git submodule--helper foreach [--quiet] [--recursive] [--] <command>"
-msgstr ""
-
-#: builtin/submodule--helper.c:654
-#, c-format
-msgid "Failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:658
-#, c-format
-msgid "Submodule '%s' (%s) registered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:668
-#, c-format
-msgid "warning: command update mode suggested for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:675
-#, c-format
-msgid "Failed to register update mode for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:697
-msgid "suppress output for initializing a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:702
-msgid "git submodule--helper init [<options>] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:775 builtin/submodule--helper.c:910
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:823
-#, c-format
-msgid "could not resolve HEAD ref inside the submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:850 builtin/submodule--helper.c:1428
-#, c-format
-msgid "failed to recurse into submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:874 builtin/submodule--helper.c:1595
-msgid "suppress submodule status output"
-msgstr ""
-
-#: builtin/submodule--helper.c:875
-msgid ""
-"use commit stored in the index instead of the one stored in the submodule "
-"HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:881
-msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:905
-msgid "git submodule--helper name <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:977
-#, c-format
-msgid "* %s %s(blob)->%s(submodule)"
-msgstr ""
-
-#: builtin/submodule--helper.c:980
-#, c-format
-msgid "* %s %s(submodule)->%s(blob)"
-msgstr ""
-
-#: builtin/submodule--helper.c:993
-#, c-format
-msgid "%s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1043
-#, c-format
-msgid "couldn't hash object from '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1047
-#, c-format
-msgid "unexpected mode %o\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1288
-msgid "use the commit stored in the index instead of the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1290
-msgid "compare the commit in the index with that in the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1292
-msgid "skip submodules with 'ignore_config' value set to 'all'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1294
-msgid "limit the summary size"
-msgstr ""
-
-#: builtin/submodule--helper.c:1299
-msgid "git submodule--helper summary [<options>] [<commit>] [--] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1323
-msgid "could not fetch a revision for HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1384
-#, c-format
-msgid "Synchronizing submodule url for '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1390
-#, c-format
-msgid "failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1399
-#, c-format
-msgid "failed to get the default remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1409
-#, c-format
-msgid "failed to update remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1456
-msgid "suppress output of synchronizing submodule url"
-msgstr ""
-
-#: builtin/submodule--helper.c:1463
-msgid "git submodule--helper sync [--quiet] [--recursive] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1513
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains a .git directory. This will be replaced "
-"with a .git file by using absorbgitdirs."
-msgstr ""
-
-#: builtin/submodule--helper.c:1530
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains local modifications; use '-f' to discard "
-"them"
-msgstr ""
-
-#: builtin/submodule--helper.c:1538
-#, c-format
-msgid "Cleared directory '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1540
-#, c-format
-msgid "Could not remove submodule work tree '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1551
-#, c-format
-msgid "could not create empty submodule directory %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1567
-#, c-format
-msgid "Submodule '%s' (%s) unregistered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1596
-msgid "remove submodule working trees even if they contain local changes"
-msgstr ""
-
-#: builtin/submodule--helper.c:1597
-msgid "unregister all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1602
-msgid ""
-"git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1616
-msgid "Use '--all' if you really want to deinitialize all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1665
-msgid ""
-"An alternate computed from a superproject's alternate is invalid.\n"
-"To allow Git to clone without an alternate in such a case, set\n"
-"submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"
-"'--reference-if-able' instead of '--reference'."
-msgstr ""
-
-#: builtin/submodule--helper.c:1710 builtin/submodule--helper.c:1713
-#, c-format
-msgid "submodule '%s' cannot add alternate: %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1749
-#, c-format
-msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1756
-#, c-format
-msgid "Value '%s' for submodule.alternateLocation is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1781
-#, c-format
-msgid "refusing to create/use '%s' in another submodule's git dir"
-msgstr ""
-
-#: builtin/submodule--helper.c:1826
-#, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
-msgstr ""
-
-#: builtin/submodule--helper.c:1831
-#, c-format
-msgid "directory not empty: '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1843
-#, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1876
-msgid "where the new submodule will be cloned to"
-msgstr ""
-
-#: builtin/submodule--helper.c:1879
-msgid "name of the new submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:1882
-msgid "url where to clone the submodule from"
-msgstr ""
-
-#: builtin/submodule--helper.c:1890 builtin/submodule--helper.c:3383
-msgid "depth for shallow clones"
-msgstr ""
-
-#: builtin/submodule--helper.c:1893 builtin/submodule--helper.c:2731
-#: builtin/submodule--helper.c:3376
-msgid "force cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:1895 builtin/submodule--helper.c:2733
-msgid "disallow cloning into non-empty directory"
-msgstr ""
-
-#: builtin/submodule--helper.c:1903
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--depth <depth>] [--single-branch] [--filter "
-"<filter-spec>] --url <url> --path <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:1943
-#, c-format
-msgid "Invalid update mode '%s' for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1947
-#, c-format
-msgid "Invalid update mode '%s' configured for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2041
-#, c-format
-msgid "Submodule path '%s' not initialized"
-msgstr ""
-
-#: builtin/submodule--helper.c:2045
-msgid "Maybe you want to use 'update --init'?"
-msgstr ""
-
-#: builtin/submodule--helper.c:2075
-#, c-format
-msgid "Skipping unmerged submodule %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:2104
-#, c-format
-msgid "Skipping submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2257
-#, c-format
-msgid "Failed to clone '%s'. Retry scheduled"
-msgstr ""
-
-#: builtin/submodule--helper.c:2268
-#, c-format
-msgid "Failed to clone '%s' a second time, aborting"
-msgstr ""
-
-#: builtin/submodule--helper.c:2371
-#, c-format
-msgid "Unable to checkout '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2375
-#, c-format
-msgid "Unable to rebase '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2379
-#, c-format
-msgid "Unable to merge '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2383
-#, c-format
-msgid "Execution of '%s %s' failed in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2402
-#, c-format
-msgid "Submodule path '%s': checked out '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2406
-#, c-format
-msgid "Submodule path '%s': rebased into '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2410
-#, c-format
-msgid "Submodule path '%s': merged in '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2414
-#, c-format
-msgid "Submodule path '%s': '%s %s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2438
-#, c-format
-msgid "Unable to fetch in submodule path '%s'; trying to directly fetch %s:"
-msgstr ""
-
-#: builtin/submodule--helper.c:2447
-#, c-format
-msgid ""
-"Fetched in submodule path '%s', but it did not contain %s. Direct fetching "
-"of that commit failed."
-msgstr ""
-
-#: builtin/submodule--helper.c:2481
-#, c-format
-msgid ""
-"Submodule (%s) branch configured to inherit branch from superproject, but "
-"the superproject is not on any branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2499
-#, c-format
-msgid "could not get a repository handle for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2588
-#, c-format
-msgid "Unable to find current revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2599
-#, c-format
-msgid "Unable to fetch in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2604
-#, c-format
-msgid "Unable to find %s revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2640
-#, c-format
-msgid "Failed to recurse into submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2699
-msgid "force checkout updates"
-msgstr ""
-
-#: builtin/submodule--helper.c:2701
-msgid "initialize uninitialized submodules before update"
-msgstr ""
-
-#: builtin/submodule--helper.c:2703
-msgid "use SHA-1 of submodule's remote tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2705
-msgid "traverse submodules recursively"
-msgstr ""
-
-#: builtin/submodule--helper.c:2707
-msgid "don't fetch new objects from the remote site"
-msgstr ""
-
-#: builtin/submodule--helper.c:2710 builtin/submodule--helper.c:2892
-msgid "path into the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:2713
-msgid "path into the working tree, across nested submodule boundaries"
-msgstr ""
-
-#: builtin/submodule--helper.c:2717
-msgid "rebase, merge, checkout or none"
-msgstr ""
-
-#: builtin/submodule--helper.c:2723
-msgid "create a shallow clone truncated to the specified number of revisions"
-msgstr ""
-
-#: builtin/submodule--helper.c:2726
-msgid "parallel jobs"
-msgstr ""
-
-#: builtin/submodule--helper.c:2728
-msgid "whether the initial clone should follow the shallow recommendation"
-msgstr ""
-
-#: builtin/submodule--helper.c:2729
-msgid "don't print cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:2741
-msgid ""
-"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>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2767
-msgid "bad value for update parameter"
-msgstr ""
-
-#: builtin/submodule--helper.c:2893
-msgid "recurse into submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:2899
-msgid "git submodule--helper absorb-git-dirs [<options>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2955
-msgid "check if it is safe to write to the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2958
-msgid "unset the config in the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2963
-msgid "git submodule--helper config <name> [<value>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2964
-msgid "git submodule--helper config --unset <name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:2984 builtin/submodule--helper.c:3238
-#: builtin/submodule--helper.c:3395
-msgid "please make sure that the .gitmodules file is in the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3000
-msgid "suppress output for setting url of a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3004
-msgid "git submodule--helper set-url [--quiet] <path> <newurl>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3037
-msgid "set the default tracking branch to master"
-msgstr ""
-
-#: builtin/submodule--helper.c:3039
-msgid "set the default tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:3043
-msgid "git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3044
-msgid ""
-"git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3051
-msgid "--branch or --default required"
-msgstr ""
-
-#: builtin/submodule--helper.c:3072 builtin/submodule--helper.c:3375
-msgid "print only error messages"
-msgstr ""
-
-#: builtin/submodule--helper.c:3073
-msgid "force creation"
-msgstr ""
-
-#: builtin/submodule--helper.c:3081
-msgid "show whether the branch would be created"
-msgstr ""
-
-#: builtin/submodule--helper.c:3085
-msgid ""
-"git submodule--helper create-branch [-f|--force] [--create-reflog] [-q|--"
-"quiet] [-t|--track] [-n|--dry-run] <name> <start-oid> <start-name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3097
-#, c-format
-msgid "creating branch '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3155
-#, c-format
-msgid "Adding existing repo at '%s' to the index\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3158
-#, c-format
-msgid "'%s' already exists and is not a valid git repo"
-msgstr ""
-
-#: builtin/submodule--helper.c:3171
-#, c-format
-msgid "A git directory for '%s' is found locally with remote(s):\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3178
-#, c-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from\n"
-"  %s\n"
-"use the '--force' option. If the local git directory is not the correct "
-"repo\n"
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-
-#: builtin/submodule--helper.c:3190
-#, c-format
-msgid "Reactivating local git directory for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3227
-#, c-format
-msgid "unable to checkout submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3266
-#, c-format
-msgid "Failed to add submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3270 builtin/submodule--helper.c:3275
-#: builtin/submodule--helper.c:3283
-#, c-format
-msgid "Failed to register submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3339
-#, c-format
-msgid "'%s' already exists in the index"
-msgstr ""
-
-#: builtin/submodule--helper.c:3342
-#, c-format
-msgid "'%s' already exists in the index and is not a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3372
-msgid "branch of repository to add as submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3373
-msgid "allow adding an otherwise ignored submodule path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3379
-msgid "borrow the objects from reference repositories"
-msgstr ""
-
-#: builtin/submodule--helper.c:3381
-msgid ""
-"sets the submodule’s name to the given string instead of defaulting to its "
-"path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3388
-msgid "git submodule--helper add [<options>] [--] <repository> [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:3416
-msgid "Relative path can only be used from the toplevel of the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3425
-#, c-format
-msgid "repo URL: '%s' must be absolute or begin with ./|../"
-msgstr ""
-
-#: builtin/submodule--helper.c:3460
-#, c-format
-msgid "'%s' is not a valid submodule name"
-msgstr ""
-
-#: builtin/submodule--helper.c:3520 git.c:453 git.c:729
-#, c-format
-msgid "%s doesn't support --super-prefix"
-msgstr ""
-
-#: builtin/submodule--helper.c:3526
-#, c-format
-msgid "'%s' is not a valid submodule--helper subcommand"
-msgstr ""
-
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr ""
-
-#: builtin/symbolic-ref.c:9
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr ""
-
-#: builtin/symbolic-ref.c:42
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
-
-#: builtin/symbolic-ref.c:43
-msgid "delete symbolic ref"
-msgstr ""
-
-#: builtin/symbolic-ref.c:44
-msgid "shorten ref output"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason of the update"
-msgstr ""
-
-#: builtin/tag.c:26
-msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n"
-"        <tagname> [<head>]"
-msgstr ""
-
-#: builtin/tag.c:28
-msgid "git tag -d <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:29
-msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
-"points-at <object>]\n"
-"        [--format=<format>] [--merged <commit>] [--no-merged <commit>] "
-"[<pattern>...]"
-msgstr ""
-
-#: builtin/tag.c:31
-msgid "git tag -v [--format=<format>] <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:101
-#, c-format
-msgid "tag '%s' not found."
-msgstr ""
-
-#: builtin/tag.c:136
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/tag.c:171
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/tag.c:175
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be kept; you may remove them yourself if you "
-"want to.\n"
-msgstr ""
-
-#: builtin/tag.c:241
-msgid "unable to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:259
-#, c-format
-msgid ""
-"You have created a nested tag. The object referred to by your new tag is\n"
-"already a tag. If you meant to tag the object that it points to, use:\n"
-"\n"
-"\tgit tag -f %s %s^{}"
-msgstr ""
-
-#: builtin/tag.c:275
-msgid "bad object type."
-msgstr ""
-
-#: builtin/tag.c:326
-msgid "no tag message?"
-msgstr ""
-
-#: builtin/tag.c:333
-#, c-format
-msgid "The tag message has been left in %s\n"
-msgstr ""
-
-#: builtin/tag.c:445
-msgid "list tag names"
-msgstr ""
-
-#: builtin/tag.c:447
-msgid "print <n> lines of each tag message"
-msgstr ""
-
-#: builtin/tag.c:449
-msgid "delete tags"
-msgstr ""
-
-#: builtin/tag.c:450
-msgid "verify tags"
-msgstr ""
-
-#: builtin/tag.c:452
-msgid "Tag creation options"
-msgstr ""
-
-#: builtin/tag.c:454
-msgid "annotated tag, needs a message"
-msgstr ""
-
-#: builtin/tag.c:456
-msgid "tag message"
-msgstr ""
-
-#: builtin/tag.c:458
-msgid "force edit of tag message"
-msgstr ""
-
-#: builtin/tag.c:459
-msgid "annotated and GPG-signed tag"
-msgstr ""
-
-#: builtin/tag.c:462
-msgid "use another key to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:463
-msgid "replace the tag if exists"
-msgstr ""
-
-#: builtin/tag.c:464 builtin/update-ref.c:511
-msgid "create a reflog"
-msgstr ""
-
-#: builtin/tag.c:466
-msgid "Tag listing options"
-msgstr ""
-
-#: builtin/tag.c:467
-msgid "show tag list in columns"
-msgstr ""
-
-#: builtin/tag.c:468 builtin/tag.c:470
-msgid "print only tags that contain the commit"
-msgstr ""
-
-#: builtin/tag.c:469 builtin/tag.c:471
-msgid "print only tags that don't contain the commit"
-msgstr ""
-
-#: builtin/tag.c:472
-msgid "print only tags that are merged"
-msgstr ""
-
-#: builtin/tag.c:473
-msgid "print only tags that are not merged"
-msgstr ""
-
-#: builtin/tag.c:477
-msgid "print only tags of the object"
-msgstr ""
-
-#: builtin/tag.c:559
-#, c-format
-msgid "the '%s' option is only allowed in list mode"
-msgstr ""
-
-#: builtin/tag.c:598
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr ""
-
-#: builtin/tag.c:603
-#, c-format
-msgid "tag '%s' already exists"
-msgstr ""
-
-#: builtin/tag.c:634
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/unpack-objects.c:95
-msgid "pack exceeds maximum allowed size"
-msgstr ""
-
-#: builtin/unpack-objects.c:504
-msgid "Unpacking objects"
-msgstr ""
-
-#: builtin/update-index.c:84
-#, c-format
-msgid "failed to create directory %s"
-msgstr ""
-
-#: builtin/update-index.c:106
-#, c-format
-msgid "failed to delete file %s"
-msgstr ""
-
-#: builtin/update-index.c:113 builtin/update-index.c:219
-#, c-format
-msgid "failed to delete directory %s"
-msgstr ""
-
-#: builtin/update-index.c:138
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr ""
-
-#: builtin/update-index.c:152
-msgid "directory stat info does not change after adding a new file"
-msgstr ""
-
-#: builtin/update-index.c:165
-msgid "directory stat info does not change after adding a new directory"
-msgstr ""
-
-#: builtin/update-index.c:178
-msgid "directory stat info changes after updating a file"
-msgstr ""
-
-#: builtin/update-index.c:189
-msgid "directory stat info changes after adding a file inside subdirectory"
-msgstr ""
-
-#: builtin/update-index.c:200
-msgid "directory stat info does not change after deleting a file"
-msgstr ""
-
-#: builtin/update-index.c:213
-msgid "directory stat info does not change after deleting a directory"
-msgstr ""
-
-#: builtin/update-index.c:220
-msgid " OK"
-msgstr ""
-
-#: builtin/update-index.c:589
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/update-index.c:993
-msgid "continue refresh even when index needs update"
-msgstr ""
-
-#: builtin/update-index.c:996
-msgid "refresh: ignore submodules"
-msgstr ""
-
-#: builtin/update-index.c:999
-msgid "do not ignore new files"
-msgstr ""
-
-#: builtin/update-index.c:1001
-msgid "let files replace directories and vice-versa"
-msgstr ""
-
-#: builtin/update-index.c:1003
-msgid "notice files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1005
-msgid "refresh even if index contains unmerged entries"
-msgstr ""
-
-#: builtin/update-index.c:1008
-msgid "refresh stat information"
-msgstr ""
-
-#: builtin/update-index.c:1012
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr ""
-
-#: builtin/update-index.c:1016
-msgid "<mode>,<object>,<path>"
-msgstr ""
-
-#: builtin/update-index.c:1017
-msgid "add the specified entry to the index"
-msgstr ""
-
-#: builtin/update-index.c:1027
-msgid "mark files as \"not changing\""
-msgstr ""
-
-#: builtin/update-index.c:1030
-msgid "clear assumed-unchanged bit"
-msgstr ""
-
-#: builtin/update-index.c:1033
-msgid "mark files as \"index-only\""
-msgstr ""
-
-#: builtin/update-index.c:1036
-msgid "clear skip-worktree bit"
-msgstr ""
-
-#: builtin/update-index.c:1039
-msgid "do not touch index-only entries"
-msgstr ""
-
-#: builtin/update-index.c:1041
-msgid "add to index only; do not add content to object database"
-msgstr ""
-
-#: builtin/update-index.c:1043
-msgid "remove named paths even if present in worktree"
-msgstr ""
-
-#: builtin/update-index.c:1045
-msgid "with --stdin: input lines are terminated by null bytes"
-msgstr ""
-
-#: builtin/update-index.c:1047
-msgid "read list of paths to be updated from standard input"
-msgstr ""
-
-#: builtin/update-index.c:1051
-msgid "add entries from standard input to the index"
-msgstr ""
-
-#: builtin/update-index.c:1055
-msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr ""
-
-#: builtin/update-index.c:1059
-msgid "only update entries that differ from HEAD"
-msgstr ""
-
-#: builtin/update-index.c:1063
-msgid "ignore files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1066
-msgid "report actions to standard output"
-msgstr ""
-
-#: builtin/update-index.c:1068
-msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr ""
-
-#: builtin/update-index.c:1072
-msgid "write index in this format"
-msgstr ""
-
-#: builtin/update-index.c:1074
-msgid "enable or disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1076
-msgid "enable/disable untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1078
-msgid "test if the filesystem supports untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1080
-msgid "enable untracked cache without testing the filesystem"
-msgstr ""
-
-#: builtin/update-index.c:1082
-msgid "write out the index even if is not flagged as changed"
-msgstr ""
-
-#: builtin/update-index.c:1084
-msgid "enable or disable file system monitor"
-msgstr ""
-
-#: builtin/update-index.c:1086
-msgid "mark files as fsmonitor valid"
-msgstr ""
-
-#: builtin/update-index.c:1089
-msgid "clear fsmonitor valid bit"
-msgstr ""
-
-#: builtin/update-index.c:1195
-msgid ""
-"core.splitIndex is set to false; remove or change it, if you really want to "
-"enable split index"
-msgstr ""
-
-#: builtin/update-index.c:1204
-msgid ""
-"core.splitIndex is set to true; remove or change it, if you really want to "
-"disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1216
-msgid ""
-"core.untrackedCache is set to true; remove or change it, if you really want "
-"to disable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1220
-msgid "Untracked cache disabled"
-msgstr ""
-
-#: builtin/update-index.c:1228
-msgid ""
-"core.untrackedCache is set to false; remove or change it, if you really want "
-"to enable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1232
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr ""
-
-#: builtin/update-index.c:1241
-msgid "core.fsmonitor is unset; set it if you really want to enable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1246
-msgid "fsmonitor enabled"
-msgstr ""
-
-#: builtin/update-index.c:1250
-msgid ""
-"core.fsmonitor is set; remove it if you really want to disable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1254
-msgid "fsmonitor disabled"
-msgstr ""
-
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:12
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr ""
-
-#: builtin/update-ref.c:506
-msgid "delete the reference"
-msgstr ""
-
-#: builtin/update-ref.c:508
-msgid "update <refname> not the one it points to"
-msgstr ""
-
-#: builtin/update-ref.c:509
-msgid "stdin has NUL-terminated arguments"
-msgstr ""
-
-#: builtin/update-ref.c:510
-msgid "read updates from stdin"
-msgstr ""
-
-#: builtin/update-server-info.c:15
-msgid "update the info files from scratch"
-msgstr ""
-
-#: builtin/upload-pack.c:11
-msgid "git upload-pack [<options>] <dir>"
-msgstr ""
-
-#: builtin/upload-pack.c:24 t/helper/test-serve-v2.c:17
-msgid "quit after a single request/response exchange"
-msgstr ""
-
-#: builtin/upload-pack.c:26
-msgid "serve up the info/refs for git-http-backend"
-msgstr ""
-
-#: builtin/upload-pack.c:29
-msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr ""
-
-#: builtin/upload-pack.c:31
-msgid "interrupt transfer after <n> seconds of inactivity"
-msgstr ""
-
-#: builtin/verify-commit.c:19
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr ""
-
-#: builtin/verify-commit.c:68
-msgid "print commit contents"
-msgstr ""
-
-#: builtin/verify-commit.c:69 builtin/verify-tag.c:37
-msgid "print raw gpg status output"
-msgstr ""
-
-#: builtin/verify-pack.c:59
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr ""
-
-#: builtin/verify-pack.c:70
-msgid "verbose"
-msgstr ""
-
-#: builtin/verify-pack.c:72
-msgid "show statistics only"
-msgstr ""
-
-#: builtin/verify-tag.c:18
-msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
-msgstr ""
-
-#: builtin/verify-tag.c:36
-msgid "print tag contents"
-msgstr ""
-
-#: builtin/worktree.c:19
-msgid "git worktree add [<options>] <path> [<commit-ish>]"
-msgstr ""
-
-#: builtin/worktree.c:20
-msgid "git worktree list [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:21
-msgid "git worktree lock [<options>] <path>"
-msgstr ""
-
-#: builtin/worktree.c:22
-msgid "git worktree move <worktree> <new-path>"
-msgstr ""
-
-#: builtin/worktree.c:23
-msgid "git worktree prune [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:24
-msgid "git worktree remove [<options>] <worktree>"
-msgstr ""
-
-#: builtin/worktree.c:25
-msgid "git worktree repair [<path>...]"
-msgstr ""
-
-#: builtin/worktree.c:26
-msgid "git worktree unlock <path>"
-msgstr ""
-
-#: builtin/worktree.c:76
-#, c-format
-msgid "Removing %s/%s: %s"
-msgstr ""
-
-#: builtin/worktree.c:149
-msgid "report pruned working trees"
-msgstr ""
-
-#: builtin/worktree.c:151
-msgid "expire working trees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:221
-#, c-format
-msgid "'%s' already exists"
-msgstr ""
-
-#: builtin/worktree.c:230
-#, c-format
-msgid "unusable worktree destination '%s'"
-msgstr ""
-
-#: builtin/worktree.c:235
-#, c-format
-msgid ""
-"'%s' is a missing but locked worktree;\n"
-"use '%s -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:237
-#, c-format
-msgid ""
-"'%s' is a missing but already registered worktree;\n"
-"use '%s -f' to override, or 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:248
-#, c-format
-msgid "failed to copy '%s' to '%s'; sparse-checkout may not work correctly"
-msgstr ""
-
-#: builtin/worktree.c:268
-#, c-format
-msgid "failed to copy worktree config from '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:280 builtin/worktree.c:285
-#, c-format
-msgid "failed to unset '%s' in '%s'"
-msgstr ""
-
-#: builtin/worktree.c:356
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr ""
-
-#: builtin/worktree.c:378
-msgid "initializing"
-msgstr ""
-
-#: builtin/worktree.c:492 builtin/worktree.c:498
-#, c-format
-msgid "Preparing worktree (new branch '%s')"
-msgstr ""
-
-#: builtin/worktree.c:494
-#, c-format
-msgid "Preparing worktree (resetting branch '%s'; was at %s)"
-msgstr ""
-
-#: builtin/worktree.c:503
-#, c-format
-msgid "Preparing worktree (checking out '%s')"
-msgstr ""
-
-#: builtin/worktree.c:509
-#, c-format
-msgid "Preparing worktree (detached HEAD %s)"
-msgstr ""
-
-#: builtin/worktree.c:554
-msgid "checkout <branch> even if already checked out in other worktree"
-msgstr ""
-
-#: builtin/worktree.c:557
-msgid "create a new branch"
-msgstr ""
-
-#: builtin/worktree.c:559
-msgid "create or reset a branch"
-msgstr ""
-
-#: builtin/worktree.c:561
-msgid "populate the new working tree"
-msgstr ""
-
-#: builtin/worktree.c:562
-msgid "keep the new working tree locked"
-msgstr ""
-
-#: builtin/worktree.c:564 builtin/worktree.c:809
-msgid "reason for locking"
-msgstr ""
-
-#: builtin/worktree.c:567
-msgid "set up tracking mode (see git-branch(1))"
-msgstr ""
-
-#: builtin/worktree.c:570
-msgid "try to match the new branch name with a remote-tracking branch"
-msgstr ""
-
-#: builtin/worktree.c:584
-msgid "added with --lock"
-msgstr ""
-
-#: builtin/worktree.c:646
-msgid "--[no-]track can only be used if a new branch is created"
-msgstr ""
-
-#: builtin/worktree.c:766
-msgid "show extended annotations and reasons, if available"
-msgstr ""
-
-#: builtin/worktree.c:768
-msgid "add 'prunable' annotation to worktrees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:770
-msgid "terminate records with a NUL character"
-msgstr ""
-
-#: builtin/worktree.c:821 builtin/worktree.c:854 builtin/worktree.c:928
-#: builtin/worktree.c:1052
-#, c-format
-msgid "'%s' is not a working tree"
-msgstr ""
-
-#: builtin/worktree.c:823 builtin/worktree.c:856
-msgid "The main working tree cannot be locked or unlocked"
-msgstr ""
-
-#: builtin/worktree.c:828
-#, c-format
-msgid "'%s' is already locked, reason: %s"
-msgstr ""
-
-#: builtin/worktree.c:830
-#, c-format
-msgid "'%s' is already locked"
-msgstr ""
-
-#: builtin/worktree.c:858
-#, c-format
-msgid "'%s' is not locked"
-msgstr ""
-
-#: builtin/worktree.c:899
-msgid "working trees containing submodules cannot be moved or removed"
-msgstr ""
-
-#: builtin/worktree.c:907
-msgid "force move even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:930 builtin/worktree.c:1054
-#, c-format
-msgid "'%s' is a main working tree"
-msgstr ""
-
-#: builtin/worktree.c:935
-#, c-format
-msgid "could not figure out destination name from '%s'"
-msgstr ""
-
-#: builtin/worktree.c:948
-#, c-format
-msgid ""
-"cannot move a locked working tree, lock reason: %s\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:950
-msgid ""
-"cannot move a locked working tree;\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:953
-#, c-format
-msgid "validation failed, cannot move working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:958
-#, c-format
-msgid "failed to move '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1004
-#, c-format
-msgid "failed to run 'git status' on '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1008
-#, c-format
-msgid "'%s' contains modified or untracked files, use --force to delete it"
-msgstr ""
-
-#: builtin/worktree.c:1013
-#, c-format
-msgid "failed to run 'git status' on '%s', code %d"
-msgstr ""
-
-#: builtin/worktree.c:1036
-msgid "force removal even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:1059
-#, c-format
-msgid ""
-"cannot remove a locked working tree, lock reason: %s\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1061
-msgid ""
-"cannot remove a locked working tree;\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1064
-#, c-format
-msgid "validation failed, cannot remove working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:1088
-#, c-format
-msgid "repair: %s: %s"
-msgstr ""
-
-#: builtin/worktree.c:1091
-#, c-format
-msgid "error: %s: %s"
-msgstr ""
-
-#: builtin/write-tree.c:15
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
-
-#: builtin/write-tree.c:28
-msgid "<prefix>/"
-msgstr ""
-
-#: builtin/write-tree.c:29
-msgid "write tree object for a subdirectory <prefix>"
-msgstr ""
-
-#: builtin/write-tree.c:31
-msgid "only useful for debugging"
-msgstr ""
-
-#: git.c:28
-msgid ""
-"git [--version] [--help] [-C <path>] [-c <name>=<value>]\n"
-"           [--exec-path[=<path>]] [--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"
-"           <command> [<args>]"
-msgstr ""
-
-#: git.c:36
-msgid ""
-"'git help -a' and 'git help -g' list available subcommands and some\n"
-"concept guides. See 'git help <command>' or 'git help <concept>'\n"
-"to read about a specific subcommand or concept.\n"
-"See 'git help git' for an overview of the system."
-msgstr ""
-
-#: git.c:188 git.c:216 git.c:300
-#, c-format
-msgid "no directory given for '%s' option\n"
-msgstr ""
-
-#: git.c:202
-#, c-format
-msgid "no namespace given for --namespace\n"
-msgstr ""
-
-#: git.c:230
-#, c-format
-msgid "no prefix given for --super-prefix\n"
-msgstr ""
-
-#: git.c:252
-#, c-format
-msgid "-c expects a configuration string\n"
-msgstr ""
-
-#: git.c:260
-#, c-format
-msgid "no config key given for --config-env\n"
-msgstr ""
-
-#: git.c:326
-#, c-format
-msgid "unknown option: %s\n"
-msgstr ""
-
-#: git.c:375
-#, c-format
-msgid "while expanding alias '%s': '%s'"
-msgstr ""
-
-#: git.c:384
-#, c-format
-msgid ""
-"alias '%s' changes environment variables.\n"
-"You can use '!git' in the alias to do this"
-msgstr ""
-
-#: git.c:391
-#, c-format
-msgid "empty alias for %s"
-msgstr ""
-
-#: git.c:394
-#, c-format
-msgid "recursive alias: %s"
-msgstr ""
-
-#: git.c:480
-msgid "write failure on standard output"
-msgstr ""
-
-#: git.c:482
-msgid "unknown write failure on standard output"
-msgstr ""
-
-#: git.c:484
-msgid "close failed on standard output"
-msgstr ""
-
-#: git.c:838
-#, c-format
-msgid "alias loop detected: expansion of '%s' does not terminate:%s"
-msgstr ""
-
-#: git.c:888
-#, c-format
-msgid "cannot handle %s as a builtin"
-msgstr ""
-
-#: git.c:901
-#, c-format
-msgid ""
-"usage: %s\n"
-"\n"
-msgstr ""
-
-#: git.c:921
-#, c-format
-msgid "expansion of alias '%s' failed; '%s' is not a git command\n"
-msgstr ""
-
-#: git.c:933
-#, c-format
-msgid "failed to run command '%s': %s\n"
-msgstr ""
-
-#: http-fetch.c:128
-#, c-format
-msgid "argument to --packfile must be a valid hash (got '%s')"
-msgstr ""
-
-#: http-fetch.c:138
-msgid "not a git repository"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:141
-msgid "unhandled options"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:146
-msgid "error preparing revisions"
-msgstr ""
-
-#: t/helper/test-reach.c:154
-#, c-format
-msgid "commit %s is not marked reachable"
-msgstr ""
-
-#: t/helper/test-reach.c:164
-msgid "too many commits marked reachable"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:7
-msgid "test-tool serve-v2 [<options>]"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:19
-msgid "exit immediately after advertising capabilities"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:581
-msgid "test-helper simple-ipc is-active    [<name>] [<options>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:582
-msgid "test-helper simple-ipc run-daemon   [<name>] [<threads>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:583
-msgid "test-helper simple-ipc start-daemon [<name>] [<threads>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:584
-msgid "test-helper simple-ipc stop-daemon  [<name>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:585
-msgid "test-helper simple-ipc send         [<name>] [<token>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:586
-msgid "test-helper simple-ipc sendbytes    [<name>] [<bytecount>] [<byte>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:587
-msgid ""
-"test-helper simple-ipc multiple     [<name>] [<threads>] [<bytecount>] "
-"[<batchsize>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:595
-msgid "name or pathname of unix domain socket"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:597
-msgid "named-pipe name"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:599
-msgid "number of threads in server thread pool"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:600
-msgid "seconds to wait for daemon to start or stop"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:602
-msgid "number of bytes"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:603
-msgid "number of requests per thread"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "byte"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "ballast character"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "token"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "command token to send to the server"
-msgstr ""
-
-#: http.c:350
-#, c-format
-msgid "negative value for http.postbuffer; defaulting to %d"
-msgstr ""
-
-#: http.c:371
-msgid "Delegation control is not supported with cURL < 7.22.0"
-msgstr ""
-
-#: http.c:380
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr ""
-
-#: http.c:812
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr ""
-
-#: http.c:1016
-#, c-format
-msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
-msgstr ""
-
-#: http.c:1023
-#, c-format
-msgid "Could not set SSL backend to '%s': cURL was built without SSL backends"
-msgstr ""
-
-#: http.c:1027
-#, c-format
-msgid "Could not set SSL backend to '%s': already set"
-msgstr ""
-
-#: http.c:1876
-#, c-format
-msgid ""
-"unable to update url base from redirection:\n"
-"  asked for: %s\n"
-"   redirect: %s"
-msgstr ""
-
-#: remote-curl.c:184
-#, c-format
-msgid "invalid quoting in push-option value: '%s'"
-msgstr ""
-
-#: remote-curl.c:308
-#, c-format
-msgid "%sinfo/refs not valid: is this a git repository?"
-msgstr ""
-
-#: remote-curl.c:409
-msgid "invalid server response; expected service, got flush packet"
-msgstr ""
-
-#: remote-curl.c:440
-#, c-format
-msgid "invalid server response; got '%s'"
-msgstr ""
-
-#: remote-curl.c:500
-#, c-format
-msgid "repository '%s' not found"
-msgstr ""
-
-#: remote-curl.c:504
-#, c-format
-msgid "Authentication failed for '%s'"
-msgstr ""
-
-#: remote-curl.c:508
-#, c-format
-msgid "unable to access '%s' with http.pinnedPubkey configuration: %s"
-msgstr ""
-
-#: remote-curl.c:512
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr ""
-
-#: remote-curl.c:518
-#, c-format
-msgid "redirecting to %s"
-msgstr ""
-
-#: remote-curl.c:649
-msgid "shouldn't have EOF when not gentle on EOF"
-msgstr ""
-
-#: remote-curl.c:661
-msgid "remote server sent unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:730
-msgid "unable to rewind rpc post data - try increasing http.postBuffer"
-msgstr ""
-
-#: remote-curl.c:759
-#, c-format
-msgid "remote-curl: bad line length character: %.4s"
-msgstr ""
-
-#: remote-curl.c:761
-msgid "remote-curl: unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:837
-#, c-format
-msgid "RPC failed; %s"
-msgstr ""
-
-#: remote-curl.c:877
-msgid "cannot handle pushes this big"
-msgstr ""
-
-#: remote-curl.c:990
-#, c-format
-msgid "cannot deflate request; zlib deflate error %d"
-msgstr ""
-
-#: remote-curl.c:994
-#, c-format
-msgid "cannot deflate request; zlib end error %d"
-msgstr ""
-
-#: remote-curl.c:1044
-#, c-format
-msgid "%d bytes of length header were received"
-msgstr ""
-
-#: remote-curl.c:1046
-#, c-format
-msgid "%d bytes of body are still expected"
-msgstr ""
-
-#: remote-curl.c:1135
-msgid "dumb http transport does not support shallow capabilities"
-msgstr ""
-
-#: remote-curl.c:1150
-msgid "fetch failed."
-msgstr ""
-
-#: remote-curl.c:1198
-msgid "cannot fetch by sha1 over smart http"
-msgstr ""
-
-#: remote-curl.c:1242 remote-curl.c:1248
-#, c-format
-msgid "protocol error: expected sha/ref, got '%s'"
-msgstr ""
-
-#: remote-curl.c:1260 remote-curl.c:1378
-#, c-format
-msgid "http transport does not support %s"
-msgstr ""
-
-#: remote-curl.c:1296
-msgid "git-http-push failed"
-msgstr ""
-
-#: remote-curl.c:1485
-msgid "remote-curl: usage: git remote-curl <remote> [<url>]"
-msgstr ""
-
-#: remote-curl.c:1517
-msgid "remote-curl: error reading command stream from git"
-msgstr ""
-
-#: remote-curl.c:1524
-msgid "remote-curl: fetch attempted without a local repo"
-msgstr ""
-
-#: remote-curl.c:1565
-#, c-format
-msgid "remote-curl: unknown command '%s' from git"
-msgstr ""
-
-#: contrib/scalar/scalar.c:49
-msgid "need a working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:86
-msgid "could not find enlistment root"
-msgstr ""
-
-#: contrib/scalar/scalar.c:89 contrib/scalar/scalar.c:350
-#: contrib/scalar/scalar.c:435 contrib/scalar/scalar.c:578
-#, c-format
-msgid "could not switch to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:179
-#, c-format
-msgid "could not configure %s=%s"
-msgstr ""
-
-#: contrib/scalar/scalar.c:197
-msgid "could not configure log.excludeDecoration"
-msgstr ""
-
-#: contrib/scalar/scalar.c:218
-msgid "Scalar enlistments require a worktree"
-msgstr ""
-
-#: contrib/scalar/scalar.c:310
-#, c-format
-msgid "remote HEAD is not a branch: '%.*s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:316
-msgid "failed to get default branch name from remote; using local default"
-msgstr ""
-
-#: contrib/scalar/scalar.c:329
-msgid "failed to get default branch name"
-msgstr ""
-
-#: contrib/scalar/scalar.c:340
-msgid "failed to unregister repository"
-msgstr ""
-
-#: contrib/scalar/scalar.c:355
-msgid "failed to delete enlistment directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:375
-msgid "branch to checkout after clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:377
-msgid "when cloning, create full working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:379
-msgid "only download metadata for the branch that will be checked out"
-msgstr ""
-
-#: contrib/scalar/scalar.c:384
-msgid "scalar clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:409
-#, c-format
-msgid "cannot deduce worktree name from '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:418
-#, c-format
-msgid "directory '%s' exists already"
-msgstr ""
-
-#: contrib/scalar/scalar.c:445
-#, c-format
-msgid "failed to get default branch for '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:456
-#, c-format
-msgid "could not configure remote in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:465
-#, c-format
-msgid "could not configure '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:468
-msgid "partial clone failed; attempting full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:472
-msgid "could not configure for full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:504
-msgid "`scalar list` does not take arguments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:517
-msgid "scalar register [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:544
-msgid "reconfigure all registered enlistments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:548
-msgid "scalar reconfigure [--all | <enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:566
-msgid "--all or <enlistment>, but not both"
-msgstr ""
-
-#: contrib/scalar/scalar.c:581
-#, c-format
-msgid "git repository gone in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:621
-msgid ""
-"scalar run <task> [<enlistment>]\n"
-"Tasks:\n"
-msgstr ""
-
-#: contrib/scalar/scalar.c:639
-#, c-format
-msgid "no such task: '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:689
-msgid "scalar unregister [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:736
-msgid "scalar delete <enlistment>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:751
-msgid "refusing to delete current working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:766
-msgid "include Git version"
-msgstr ""
-
-#: contrib/scalar/scalar.c:768
-msgid "include Git's build options"
-msgstr ""
-
-#: contrib/scalar/scalar.c:772
-msgid "scalar verbose [-v | --verbose] [--build-options]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:813
-msgid "-C requires a <directory>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:815
-#, c-format
-msgid "could not change to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:821
-msgid "-c requires a <key>=<value> argument"
-msgstr ""
-
-#: contrib/scalar/scalar.c:839
-msgid ""
-"scalar [-C <directory>] [-c <key>=<value>] <command> [<options>]\n"
-"\n"
-"Commands:\n"
-msgstr ""
-
-#: compat/compiler.h:26
-msgid "no compiler information available\n"
-msgstr ""
-
-#: compat/compiler.h:38
-msgid "no libc information available\n"
-msgstr ""
-
-#: list-objects-filter-options.h:126
-msgid "args"
-msgstr ""
-
-#: list-objects-filter-options.h:127
-msgid "object filtering"
-msgstr ""
-
-#: parse-options.h:188
-msgid "expiry-date"
-msgstr ""
-
-#: parse-options.h:202
-msgid "no-op (backward compatibility)"
-msgstr ""
-
-#: parse-options.h:341
-msgid "be more verbose"
-msgstr ""
-
-#: parse-options.h:343
-msgid "be more quiet"
-msgstr ""
-
-#: parse-options.h:349
-msgid "use <n> digits to display object names"
-msgstr ""
-
-#: parse-options.h:368
-msgid "how to strip spaces and #comments from message"
-msgstr ""
-
-#: parse-options.h:369
-msgid "read pathspec from file"
-msgstr ""
-
-#: parse-options.h:370
-msgid ""
-"with --pathspec-from-file, pathspec elements are separated with NUL character"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "key"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "field name to sort on"
-msgstr ""
-
-#: rerere.h:44
-msgid "update the index with reused conflict resolution if possible"
-msgstr ""
-
-#: command-list.h:50
-msgid "Add file contents to the index"
-msgstr ""
-
-#: command-list.h:51
-msgid "Apply a series of patches from a mailbox"
-msgstr ""
-
-#: command-list.h:52
-msgid "Annotate file lines with commit information"
-msgstr ""
-
-#: command-list.h:53
-msgid "Apply a patch to files and/or to the index"
-msgstr ""
-
-#: command-list.h:54
-msgid "Import a GNU Arch repository into Git"
-msgstr ""
-
-#: command-list.h:55
-msgid "Create an archive of files from a named tree"
-msgstr ""
-
-#: command-list.h:56
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr ""
-
-#: command-list.h:57
-msgid "Show what revision and author last modified each line of a file"
-msgstr ""
-
-#: command-list.h:58
-msgid "List, create, or delete branches"
-msgstr ""
-
-#: command-list.h:59
-msgid "Collect information for user to file a bug report"
-msgstr ""
-
-#: command-list.h:60
-msgid "Move objects and refs by archive"
-msgstr ""
-
-#: command-list.h:61
-msgid "Provide content or type and size information for repository objects"
-msgstr ""
-
-#: command-list.h:62
-msgid "Display gitattributes information"
-msgstr ""
-
-#: command-list.h:63
-msgid "Debug gitignore / exclude files"
-msgstr ""
-
-#: command-list.h:64
-msgid "Show canonical names and email addresses of contacts"
-msgstr ""
-
-#: command-list.h:65
-msgid "Ensures that a reference name is well formed"
-msgstr ""
-
-#: command-list.h:66
-msgid "Switch branches or restore working tree files"
-msgstr ""
-
-#: command-list.h:67
-msgid "Copy files from the index to the working tree"
-msgstr ""
-
-#: command-list.h:68
-msgid "Find commits yet to be applied to upstream"
-msgstr ""
-
-#: command-list.h:69
-msgid "Apply the changes introduced by some existing commits"
-msgstr ""
-
-#: command-list.h:70
-msgid "Graphical alternative to git-commit"
-msgstr ""
-
-#: command-list.h:71
-msgid "Remove untracked files from the working tree"
-msgstr ""
-
-#: command-list.h:72
-msgid "Clone a repository into a new directory"
-msgstr ""
-
-#: command-list.h:73
-msgid "Display data in columns"
-msgstr ""
-
-#: command-list.h:74
-msgid "Record changes to the repository"
-msgstr ""
-
-#: command-list.h:75
-msgid "Write and verify Git commit-graph files"
-msgstr ""
-
-#: command-list.h:76
-msgid "Create a new commit object"
-msgstr ""
-
-#: command-list.h:77
-msgid "Get and set repository or global options"
-msgstr ""
-
-#: command-list.h:78
-msgid "Count unpacked number of objects and their disk consumption"
-msgstr ""
-
-#: command-list.h:79
-msgid "Retrieve and store user credentials"
-msgstr ""
-
-#: command-list.h:80
-msgid "Helper to temporarily store passwords in memory"
-msgstr ""
-
-#: command-list.h:81
-msgid "Helper to store credentials on disk"
-msgstr ""
-
-#: command-list.h:82
-msgid "Export a single commit to a CVS checkout"
-msgstr ""
-
-#: command-list.h:83
-msgid "Salvage your data out of another SCM people love to hate"
-msgstr ""
-
-#: command-list.h:84
-msgid "A CVS server emulator for Git"
-msgstr ""
-
-#: command-list.h:85
-msgid "A really simple server for Git repositories"
-msgstr ""
-
-#: command-list.h:86
-msgid "Give an object a human readable name based on an available ref"
-msgstr ""
-
-#: command-list.h:87
-msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
-
-#: command-list.h:88
-msgid "Compares files in the working tree and the index"
-msgstr ""
-
-#: command-list.h:89
-msgid "Compare a tree to the working tree or index"
-msgstr ""
-
-#: command-list.h:90
-msgid "Compares the content and mode of blobs found via two tree objects"
-msgstr ""
-
-#: command-list.h:91
-msgid "Show changes using common diff tools"
-msgstr ""
-
-#: command-list.h:92
-msgid "Git data exporter"
-msgstr ""
-
-#: command-list.h:93
-msgid "Backend for fast Git data importers"
-msgstr ""
-
-#: command-list.h:94
-msgid "Download objects and refs from another repository"
-msgstr ""
-
-#: command-list.h:95
-msgid "Receive missing objects from another repository"
-msgstr ""
-
-#: command-list.h:96
-msgid "Rewrite branches"
-msgstr ""
-
-#: command-list.h:97
-msgid "Produce a merge commit message"
-msgstr ""
-
-#: command-list.h:98
-msgid "Output information on each ref"
-msgstr ""
-
-#: command-list.h:99
-msgid "Run a Git command on a list of repositories"
-msgstr ""
-
-#: command-list.h:100
-msgid "Prepare patches for e-mail submission"
-msgstr ""
-
-#: command-list.h:101
-msgid "Verifies the connectivity and validity of the objects in the database"
-msgstr ""
-
-#: command-list.h:102
-msgid "Cleanup unnecessary files and optimize the local repository"
-msgstr ""
-
-#: command-list.h:103
-msgid "Extract commit ID from an archive created using git-archive"
-msgstr ""
-
-#: command-list.h:104
-msgid "Print lines matching a pattern"
-msgstr ""
-
-#: command-list.h:105
-msgid "A portable graphical interface to Git"
-msgstr ""
-
-#: command-list.h:106
-msgid "Compute object ID and optionally creates a blob from a file"
-msgstr ""
-
-#: command-list.h:107
-msgid "Display help information about Git"
-msgstr ""
-
-#: command-list.h:108
-msgid "Run git hooks"
-msgstr ""
-
-#: command-list.h:109
-msgid "Server side implementation of Git over HTTP"
-msgstr ""
-
-#: command-list.h:110
-msgid "Download from a remote Git repository via HTTP"
-msgstr ""
-
-#: command-list.h:111
-msgid "Push objects over HTTP/DAV to another repository"
-msgstr ""
-
-#: command-list.h:112
-msgid "Send a collection of patches from stdin to an IMAP folder"
-msgstr ""
-
-#: command-list.h:113
-msgid "Build pack index file for an existing packed archive"
-msgstr ""
-
-#: command-list.h:114
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
-
-#: command-list.h:115
-msgid "Instantly browse your working repository in gitweb"
-msgstr ""
-
-#: command-list.h:116
-msgid "Add or parse structured information in commit messages"
-msgstr ""
-
-#: command-list.h:117
-msgid "Show commit logs"
-msgstr ""
-
-#: command-list.h:118
-msgid "Show information about files in the index and the working tree"
-msgstr ""
-
-#: command-list.h:119
-msgid "List references in a remote repository"
-msgstr ""
-
-#: command-list.h:120
-msgid "List the contents of a tree object"
-msgstr ""
-
-#: command-list.h:121
-msgid "Extracts patch and authorship from a single e-mail message"
-msgstr ""
-
-#: command-list.h:122
-msgid "Simple UNIX mbox splitter program"
-msgstr ""
-
-#: command-list.h:123
-msgid "Run tasks to optimize Git repository data"
-msgstr ""
-
-#: command-list.h:124
-msgid "Join two or more development histories together"
-msgstr ""
-
-#: command-list.h:125
-msgid "Find as good common ancestors as possible for a merge"
-msgstr ""
-
-#: command-list.h:126
-msgid "Run a three-way file merge"
-msgstr ""
-
-#: command-list.h:127
-msgid "Run a merge for files needing merging"
-msgstr ""
-
-#: command-list.h:128
-msgid "The standard helper program to use with git-merge-index"
-msgstr ""
-
-#: command-list.h:129
-msgid "Show three-way merge without touching index"
-msgstr ""
-
-#: command-list.h:130
-msgid "Run merge conflict resolution tools to resolve merge conflicts"
-msgstr ""
-
-#: command-list.h:131
-msgid "Creates a tag object with extra validation"
-msgstr ""
-
-#: command-list.h:132
-msgid "Build a tree-object from ls-tree formatted text"
-msgstr ""
-
-#: command-list.h:133
-msgid "Write and verify multi-pack-indexes"
-msgstr ""
-
-#: command-list.h:134
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
-
-#: command-list.h:135
-msgid "Find symbolic names for given revs"
-msgstr ""
-
-#: command-list.h:136
-msgid "Add or inspect object notes"
-msgstr ""
-
-#: command-list.h:137
-msgid "Import from and submit to Perforce repositories"
-msgstr ""
-
-#: command-list.h:138
-msgid "Create a packed archive of objects"
-msgstr ""
-
-#: command-list.h:139
-msgid "Find redundant pack files"
-msgstr ""
-
-#: command-list.h:140
-msgid "Pack heads and tags for efficient repository access"
-msgstr ""
-
-#: command-list.h:141
-msgid "Compute unique ID for a patch"
-msgstr ""
-
-#: command-list.h:142
-msgid "Prune all unreachable objects from the object database"
-msgstr ""
-
-#: command-list.h:143
-msgid "Remove extra objects that are already in pack files"
-msgstr ""
-
-#: command-list.h:144
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr ""
-
-#: command-list.h:145
-msgid "Update remote refs along with associated objects"
-msgstr ""
-
-#: command-list.h:146
-msgid "Applies a quilt patchset onto the current branch"
-msgstr ""
-
-#: command-list.h:147
-msgid "Compare two commit ranges (e.g. two versions of a branch)"
-msgstr ""
-
-#: command-list.h:148
-msgid "Reads tree information into the index"
-msgstr ""
-
-#: command-list.h:149
-msgid "Reapply commits on top of another base tip"
-msgstr ""
-
-#: command-list.h:150
-msgid "Receive what is pushed into the repository"
-msgstr ""
-
-#: command-list.h:151
-msgid "Manage reflog information"
-msgstr ""
-
-#: command-list.h:152
-msgid "Manage set of tracked repositories"
-msgstr ""
-
-#: command-list.h:153
-msgid "Pack unpacked objects in a repository"
-msgstr ""
-
-#: command-list.h:154
-msgid "Create, list, delete refs to replace objects"
-msgstr ""
-
-#: command-list.h:155
-msgid "Generates a summary of pending changes"
-msgstr ""
-
-#: command-list.h:156
-msgid "Reuse recorded resolution of conflicted merges"
-msgstr ""
-
-#: command-list.h:157
-msgid "Reset current HEAD to the specified state"
-msgstr ""
-
-#: command-list.h:158
-msgid "Restore working tree files"
-msgstr ""
-
-#: command-list.h:159
-msgid "Lists commit objects in reverse chronological order"
-msgstr ""
-
-#: command-list.h:160
-msgid "Pick out and massage parameters"
-msgstr ""
-
-#: command-list.h:161
-msgid "Revert some existing commits"
-msgstr ""
-
-#: command-list.h:162
-msgid "Remove files from the working tree and from the index"
-msgstr ""
-
-#: command-list.h:163
-msgid "Send a collection of patches as emails"
-msgstr ""
-
-#: command-list.h:164
-msgid "Push objects over Git protocol to another repository"
-msgstr ""
-
-#: command-list.h:165
-msgid "Git's i18n setup code for shell scripts"
-msgstr ""
-
-#: command-list.h:166
-msgid "Common Git shell script setup code"
-msgstr ""
-
-#: command-list.h:167
-msgid "Restricted login shell for Git-only SSH access"
-msgstr ""
-
-#: command-list.h:168
-msgid "Summarize 'git log' output"
-msgstr ""
-
-#: command-list.h:169
-msgid "Show various types of objects"
-msgstr ""
-
-#: command-list.h:170
-msgid "Show branches and their commits"
-msgstr ""
-
-#: command-list.h:171
-msgid "Show packed archive index"
-msgstr ""
-
-#: command-list.h:172
-msgid "List references in a local repository"
-msgstr ""
-
-#: command-list.h:173
-msgid "Reduce your working tree to a subset of tracked files"
-msgstr ""
-
-#: command-list.h:174
-msgid "Add file contents to the staging area"
-msgstr ""
-
-#: command-list.h:175
-msgid "Stash the changes in a dirty working directory away"
-msgstr ""
-
-#: command-list.h:176
-msgid "Show the working tree status"
-msgstr ""
-
-#: command-list.h:177
-msgid "Remove unnecessary whitespace"
-msgstr ""
-
-#: command-list.h:178
-msgid "Initialize, update or inspect submodules"
-msgstr ""
-
-#: command-list.h:179
-msgid "Bidirectional operation between a Subversion repository and Git"
-msgstr ""
-
-#: command-list.h:180
-msgid "Switch branches"
-msgstr ""
-
-#: command-list.h:181
-msgid "Read, modify and delete symbolic refs"
-msgstr ""
-
-#: command-list.h:182
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
-
-#: command-list.h:183
-msgid "Creates a temporary file with a blob's contents"
-msgstr ""
-
-#: command-list.h:184
-msgid "Unpack objects from a packed archive"
-msgstr ""
-
-#: command-list.h:185
-msgid "Register file contents in the working tree to the index"
-msgstr ""
-
-#: command-list.h:186
-msgid "Update the object name stored in a ref safely"
-msgstr ""
-
-#: command-list.h:187
-msgid "Update auxiliary info file to help dumb servers"
-msgstr ""
-
-#: command-list.h:188
-msgid "Send archive back to git-archive"
-msgstr ""
-
-#: command-list.h:189
-msgid "Send objects packed back to git-fetch-pack"
-msgstr ""
-
-#: command-list.h:190
-msgid "Show a Git logical variable"
-msgstr ""
-
-#: command-list.h:191
-msgid "Check the GPG signature of commits"
-msgstr ""
-
-#: command-list.h:192
-msgid "Validate packed Git archive files"
-msgstr ""
-
-#: command-list.h:193
-msgid "Check the GPG signature of tags"
-msgstr ""
-
-#: command-list.h:194
-msgid "Show logs with difference each commit introduces"
-msgstr ""
-
-#: command-list.h:195
-msgid "Manage multiple working trees"
-msgstr ""
-
-#: command-list.h:196
-msgid "Create a tree object from the current index"
-msgstr ""
-
-#: command-list.h:197
-msgid "Defining attributes per path"
-msgstr ""
-
-#: command-list.h:198
-msgid "Git command-line interface and conventions"
-msgstr ""
-
-#: command-list.h:199
-msgid "A Git core tutorial for developers"
-msgstr ""
-
-#: command-list.h:200
-msgid "Providing usernames and passwords to Git"
-msgstr ""
-
-#: command-list.h:201
-msgid "Git for CVS users"
-msgstr ""
-
-#: command-list.h:202
-msgid "Tweaking diff output"
-msgstr ""
-
-#: command-list.h:203
-msgid "A useful minimum set of commands for Everyday Git"
-msgstr ""
-
-#: command-list.h:204
-msgid "Frequently asked questions about using Git"
-msgstr ""
-
-#: command-list.h:205
-msgid "A Git Glossary"
-msgstr ""
-
-#: command-list.h:206
-msgid "Hooks used by Git"
-msgstr ""
-
-#: command-list.h:207
-msgid "Specifies intentionally untracked files to ignore"
-msgstr ""
-
-#: command-list.h:208
-msgid "The Git repository browser"
-msgstr ""
-
-#: command-list.h:209
-msgid "Map author/committer names and/or E-Mail addresses"
-msgstr ""
-
-#: command-list.h:210
-msgid "Defining submodule properties"
-msgstr ""
-
-#: command-list.h:211
-msgid "Git namespaces"
-msgstr ""
-
-#: command-list.h:212
-msgid "Helper programs to interact with remote repositories"
-msgstr ""
-
-#: command-list.h:213
-msgid "Git Repository Layout"
-msgstr ""
-
-#: command-list.h:214
-msgid "Specifying revisions and ranges for Git"
-msgstr ""
-
-#: command-list.h:215
-msgid "Mounting one repository inside another"
-msgstr ""
-
-#: command-list.h:216
-msgid "A tutorial introduction to Git"
-msgstr ""
-
-#: command-list.h:217
-msgid "A tutorial introduction to Git: part two"
-msgstr ""
-
-#: command-list.h:218
-msgid "Git web interface (web frontend to Git repositories)"
-msgstr ""
-
-#: command-list.h:219
-msgid "An overview of recommended workflows with Git"
-msgstr ""
-
-#: git-merge-octopus.sh:46
-msgid ""
-"Error: Your local changes to the following files would be overwritten by "
-"merge"
-msgstr ""
-
-#: git-merge-octopus.sh:61
-msgid "Automated merge did not work."
-msgstr ""
-
-#: git-merge-octopus.sh:62
-msgid "Should not be doing an octopus."
-msgstr ""
-
-#: git-merge-octopus.sh:73
-#, sh-format
-msgid "Unable to find common commit with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:77
-#, sh-format
-msgid "Already up to date with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:89
-#, sh-format
-msgid "Fast-forwarding to: $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:97
-#, sh-format
-msgid "Trying simple merge with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:102
-msgid "Simple merge did not work, trying automatic merge."
-msgstr ""
-
-#: git-sh-setup.sh:89 git-sh-setup.sh:94
-#, sh-format
-msgid "usage: $dashless $USAGE"
-msgstr ""
-
-#: git-sh-setup.sh:182
-#, sh-format
-msgid "Cannot chdir to $cdup, the toplevel of the working tree"
-msgstr ""
-
-#: git-sh-setup.sh:191 git-sh-setup.sh:198
-#, sh-format
-msgid "fatal: $program_name cannot be used without a working tree."
-msgstr ""
-
-#: git-sh-setup.sh:212
-msgid "Cannot rewrite branches: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:215
-#, sh-format
-msgid "Cannot $action: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:226
-#, sh-format
-msgid "Cannot $action: Your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:228
-msgid "Additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:348
-msgid "You need to run this command from the toplevel of the working tree."
-msgstr ""
-
-#: git-sh-setup.sh:353
-msgid "Unable to determine absolute path of git directory"
-msgstr ""
-
-#. TRANSLATORS: you can adjust this to align "git add -i" status menu
-#: git-add--interactive.perl:212
-#, perl-format
-msgid "%12s %12s %s"
-msgstr ""
-
-#: git-add--interactive.perl:632
-#, perl-format
-msgid "touched %d path\n"
-msgid_plural "touched %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1056
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for staging."
-msgstr ""
-
-#: git-add--interactive.perl:1059
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for stashing."
-msgstr ""
-
-#: git-add--interactive.perl:1062
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for unstaging."
-msgstr ""
-
-#: git-add--interactive.perl:1065 git-add--interactive.perl:1074
-#: git-add--interactive.perl:1080
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for applying."
-msgstr ""
-
-#: git-add--interactive.perl:1068 git-add--interactive.perl:1071
-#: git-add--interactive.perl:1077
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for discarding."
-msgstr ""
-
-#: git-add--interactive.perl:1114
-#, perl-format
-msgid "failed to open hunk edit file for writing: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1121
-#, perl-format
-msgid ""
-"---\n"
-"To remove '%s' lines, make them ' ' lines (context).\n"
-"To remove '%s' lines, delete them.\n"
-"Lines starting with %s will be removed.\n"
-msgstr ""
-
-#: git-add--interactive.perl:1143
-#, perl-format
-msgid "failed to open hunk edit file for reading: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1253
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1259
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: git-add--interactive.perl:1265
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1271
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1277 git-add--interactive.perl:1295
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1283
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1289
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1301
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1316
-msgid ""
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: git-add--interactive.perl:1347
-msgid "The selected hunks do not apply to the index!\n"
-msgstr ""
-
-#: git-add--interactive.perl:1362
-#, perl-format
-msgid "ignoring unmerged: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1481
-#, perl-format
-msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1482
-#, perl-format
-msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1483
-#, perl-format
-msgid "Apply addition to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1484
-#, perl-format
-msgid "Apply this hunk to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1601
-msgid "No other hunks to goto\n"
-msgstr ""
-
-#: git-add--interactive.perl:1619
-#, perl-format
-msgid "Invalid number: '%s'\n"
-msgstr ""
-
-#: git-add--interactive.perl:1624
-#, perl-format
-msgid "Sorry, only %d hunk available.\n"
-msgid_plural "Sorry, only %d hunks available.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1659
-msgid "No other hunks to search\n"
-msgstr ""
-
-#: git-add--interactive.perl:1676
-#, perl-format
-msgid "Malformed search regexp %s: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1686
-msgid "No hunk matches the given pattern\n"
-msgstr ""
-
-#: git-add--interactive.perl:1698 git-add--interactive.perl:1720
-msgid "No previous hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1707 git-add--interactive.perl:1726
-msgid "No next hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1732
-msgid "Sorry, cannot split this hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1738
-#, perl-format
-msgid "Split into %d hunk.\n"
-msgid_plural "Split into %d hunks.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1748
-msgid "Sorry, cannot edit this hunk\n"
-msgstr ""
-
-#. TRANSLATORS: please do not translate the command names
-#. 'status', 'update', 'revert', etc.
-#: git-add--interactive.perl:1813
-msgid ""
-"status        - show paths with changes\n"
-"update        - add working tree state to the staged set of changes\n"
-"revert        - revert staged set of changes back to the HEAD version\n"
-"patch         - pick hunks and update selectively\n"
-"diff          - view diff between HEAD and index\n"
-"add untracked - add contents of untracked files to the staged set of "
-"changes\n"
-msgstr ""
-
-#: git-add--interactive.perl:1830 git-add--interactive.perl:1842
-#: git-add--interactive.perl:1845 git-add--interactive.perl:1852
-#: git-add--interactive.perl:1855 git-add--interactive.perl:1862
-#: git-add--interactive.perl:1866 git-add--interactive.perl:1872
-msgid "missing --"
-msgstr ""
-
-#: git-add--interactive.perl:1868
-#, perl-format
-msgid "unknown --patch mode: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1874 git-add--interactive.perl:1880
-#, perl-format
-msgid "invalid argument %s, expecting --"
-msgstr ""
-
-#: git-send-email.perl:159
-msgid "local zone differs from GMT by a non-minute interval\n"
-msgstr ""
-
-#: git-send-email.perl:166 git-send-email.perl:172
-msgid "local time offset greater than or equal to 24 hours\n"
-msgstr ""
-
-#: git-send-email.perl:244
-#, perl-format
-msgid "fatal: command '%s' died with exit code %d"
-msgstr ""
-
-#: git-send-email.perl:257
-msgid "the editor exited uncleanly, aborting everything"
-msgstr ""
-
-#: git-send-email.perl:346
-#, perl-format
-msgid ""
-"'%s' contains an intermediate version of the email you were composing.\n"
-msgstr ""
-
-#: git-send-email.perl:351
-#, perl-format
-msgid "'%s.final' contains the composed email.\n"
-msgstr ""
-
-#: git-send-email.perl:484
-msgid "--dump-aliases incompatible with other options\n"
-msgstr ""
-
-#: git-send-email.perl:561
-msgid ""
-"fatal: found configuration options for 'sendmail'\n"
-"git-send-email is configured with the sendemail.* options - note the 'e'.\n"
-"Set sendemail.forbidSendmailVariables to false to disable this check.\n"
-msgstr ""
-
-#: git-send-email.perl:566 git-send-email.perl:782
-msgid "Cannot run git format-patch from outside a repository\n"
-msgstr ""
-
-#: git-send-email.perl:569
-msgid ""
-"`batch-size` and `relogin` must be specified together (via command-line or "
-"configuration option)\n"
-msgstr ""
-
-#: git-send-email.perl:582
-#, perl-format
-msgid "Unknown --suppress-cc field: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:613
-#, perl-format
-msgid "Unknown --confirm setting: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:653
-#, perl-format
-msgid "warning: sendmail alias with quotes is not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:655
-#, perl-format
-msgid "warning: `:include:` not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:657
-#, perl-format
-msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:662
-#, perl-format
-msgid "warning: sendmail line is not recognized: %s\n"
-msgstr ""
-
-#: git-send-email.perl:747
-#, perl-format
-msgid ""
-"File '%s' exists but it could also be the range of commits\n"
-"to produce patches for.  Please disambiguate by...\n"
-"\n"
-"    * Saying \"./%s\" if you mean a file; or\n"
-"    * Giving --format-patch option if you mean a range.\n"
-msgstr ""
-
-#: git-send-email.perl:768
-#, perl-format
-msgid "Failed to opendir %s: %s"
-msgstr ""
-
-#: git-send-email.perl:803
-msgid ""
-"\n"
-"No patch files specified!\n"
-"\n"
-msgstr ""
-
-#: git-send-email.perl:816
-#, perl-format
-msgid "No subject line in %s?"
-msgstr ""
-
-#: git-send-email.perl:827
-#, perl-format
-msgid "Failed to open for writing %s: %s"
-msgstr ""
-
-#: git-send-email.perl:838
-msgid ""
-"Lines beginning in \"GIT:\" will be removed.\n"
-"Consider including an overall diffstat or table of contents\n"
-"for the patch you are writing.\n"
-"\n"
-"Clear the body content if you don't wish to send a summary.\n"
-msgstr ""
-
-#: git-send-email.perl:862
-#, perl-format
-msgid "Failed to open %s: %s"
-msgstr ""
-
-#: git-send-email.perl:879
-#, perl-format
-msgid "Failed to open %s.final: %s"
-msgstr ""
-
-#: git-send-email.perl:922
-msgid "Summary email is empty, skipping it\n"
-msgstr ""
-
-#. TRANSLATORS: please keep [y/N] as is.
-#: git-send-email.perl:971
-#, perl-format
-msgid "Are you sure you want to use <%s> [y/N]? "
-msgstr ""
-
-#: git-send-email.perl:1026
-msgid ""
-"The following files are 8bit, but do not declare a Content-Transfer-"
-"Encoding.\n"
-msgstr ""
-
-#: git-send-email.perl:1031
-msgid "Which 8bit encoding should I declare [UTF-8]? "
-msgstr ""
-
-#: git-send-email.perl:1039
-#, perl-format
-msgid ""
-"Refusing to send because the patch\n"
-"\t%s\n"
-"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
-"want to send.\n"
-msgstr ""
-
-#: git-send-email.perl:1058
-msgid "To whom should the emails be sent (if anyone)?"
-msgstr ""
-
-#: git-send-email.perl:1076
-#, perl-format
-msgid "fatal: alias '%s' expands to itself\n"
-msgstr ""
-
-#: git-send-email.perl:1088
-msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
-msgstr ""
-
-#: git-send-email.perl:1150 git-send-email.perl:1158
-#, perl-format
-msgid "error: unable to extract a valid address from: %s\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [q] [d] [e] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1162
-msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
-msgstr ""
-
-#: git-send-email.perl:1482
-#, perl-format
-msgid "CA path \"%s\" does not exist"
-msgstr ""
-
-#: git-send-email.perl:1565
-msgid ""
-"    The Cc list above has been expanded by additional\n"
-"    addresses found in the patch commit message. By default\n"
-"    send-email prompts before sending whenever this occurs.\n"
-"    This behavior is controlled by the sendemail.confirm\n"
-"    configuration setting.\n"
-"\n"
-"    For additional information, run 'git send-email --help'.\n"
-"    To retain the current behavior, but squelch this message,\n"
-"    run 'git config --global sendemail.confirm auto'.\n"
-"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y] [n] [e] [q] [a] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1580
-msgid "Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): "
-msgstr ""
-
-#: git-send-email.perl:1583
-msgid "Send this email reply required"
-msgstr ""
-
-#: git-send-email.perl:1617
-msgid "The required SMTP server is not properly defined."
-msgstr ""
-
-#: git-send-email.perl:1664
-#, perl-format
-msgid "Server does not support STARTTLS! %s"
-msgstr ""
-
-#: git-send-email.perl:1669 git-send-email.perl:1673
-#, perl-format
-msgid "STARTTLS failed! %s"
-msgstr ""
-
-#: git-send-email.perl:1682
-msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
-msgstr ""
-
-#: git-send-email.perl:1700
-#, perl-format
-msgid "Failed to send %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Dry-Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "Dry-OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1724
-msgid "Result: "
-msgstr ""
-
-#: git-send-email.perl:1727
-msgid "Result: OK\n"
-msgstr ""
-
-#: git-send-email.perl:1744
-#, perl-format
-msgid "can't open file %s"
-msgstr ""
-
-#: git-send-email.perl:1792 git-send-email.perl:1812
-#, perl-format
-msgid "(mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1798
-#, perl-format
-msgid "(mbox) Adding to: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1855
-#, perl-format
-msgid "(non-mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1890
-#, perl-format
-msgid "(body) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2009
-#, perl-format
-msgid "(%s) Could not execute '%s'"
-msgstr ""
-
-#: git-send-email.perl:2016
-#, perl-format
-msgid "(%s) Adding %s: %s from: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2020
-#, perl-format
-msgid "(%s) failed to close pipe to '%s'"
-msgstr ""
-
-#: git-send-email.perl:2050
-msgid "cannot send message as 7bit"
-msgstr ""
-
-#: git-send-email.perl:2058
-msgid "invalid transfer encoding"
-msgstr ""
-
-#: git-send-email.perl:2100
-#, perl-format
-msgid ""
-"fatal: %s: rejected by %s hook\n"
-"%s\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2110 git-send-email.perl:2163 git-send-email.perl:2173
-#, perl-format
-msgid "unable to open %s: %s\n"
-msgstr ""
-
-#: git-send-email.perl:2113
-#, perl-format
-msgid ""
-"fatal: %s:%d is longer than 998 characters\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2131
-#, perl-format
-msgid "Skipping %s with backup suffix '%s'.\n"
-msgstr ""
-
-#. TRANSLATORS: please keep "[y|N]" as is.
-#: git-send-email.perl:2135
-#, perl-format
-msgid "Do you really want to send %s? [y|N]: "
-msgstr ""
-- 
2.36.0.1.g15c4090757


^ permalink raw reply related	[relevance 1%]

* [PATCH 6/9] po/git.pot: remove this now generated file, see preceding commit
  @ 2022-05-03 13:23  1% ` Jiang Xin
    2022-05-19  8:15  1% ` [PATCH v2 5/9] po/git.pot: this is now a generated file Jiang Xin
  2 siblings, 0 replies; 200+ results
From: Jiang Xin @ 2022-05-03 13:23 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason, Junio C Hamano, Git List
  Cc: Alexander Shopov, Jordi Mas, Matthias Rüster,
	Jimmy Angelakos, Christopher Díaz, Jean-Noël Avila,
	Bagas Sanjaya, Alessandro Menti, Gwan-gyeong Mun, Arusekk,
	Daniel Santos, Dimitriy Ryazantcev, Peter Krefting, Emir SARI,
	Trần Ngọc Quân, Fangyi Zhou, Yi-Jyun Pan

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot

diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-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 ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, 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] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-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 ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#, c-format
-msgid ""
-"\n"
-"It took %.2f seconds to compute the branch ahead/behind values.\n"
-"You can use '--no-ahead-behind' to avoid this.\n"
-msgstr ""
-
-#: wt-status.c:1210
-msgid "You have unmerged paths."
-msgstr ""
-
-#: wt-status.c:1213
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr ""
-
-#: wt-status.c:1215
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr ""
-
-#: wt-status.c:1219
-msgid "All conflicts fixed but you are still merging."
-msgstr ""
-
-#: wt-status.c:1222
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr ""
-
-#: wt-status.c:1233
-msgid "You are in the middle of an am session."
-msgstr ""
-
-#: wt-status.c:1236
-msgid "The current patch is empty."
-msgstr ""
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-
-#: wt-status.c:1243
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1246
-msgid ""
-"  (use \"git am --allow-empty\" to record this patch as an empty commit)"
-msgstr ""
-
-#: wt-status.c:1248
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-
-#: wt-status.c:1381
-msgid "git-rebase-todo is missing."
-msgstr ""
-
-#: wt-status.c:1383
-msgid "No commands done."
-msgstr ""
-
-#: wt-status.c:1386
-#, c-format
-msgid "Last command done (%<PRIuMAX> command done):"
-msgid_plural "Last commands done (%<PRIuMAX> commands done):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1397
-#, c-format
-msgid "  (see more in file %s)"
-msgstr ""
-
-#: wt-status.c:1402
-msgid "No commands remaining."
-msgstr ""
-
-#: wt-status.c:1405
-#, c-format
-msgid "Next command to do (%<PRIuMAX> remaining command):"
-msgid_plural "Next commands to do (%<PRIuMAX> remaining commands):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1413
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr ""
-
-#: wt-status.c:1425
-#, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1430
-msgid "You are currently rebasing."
-msgstr ""
-
-#: wt-status.c:1443
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1445
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1447
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-
-#: wt-status.c:1454
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1458
-#, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1463
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1466
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-
-#: wt-status.c:1470
-#, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1475
-msgid "You are currently editing a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1478
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-
-#: wt-status.c:1480
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-
-#: wt-status.c:1491
-msgid "Cherry-pick currently in progress."
-msgstr ""
-
-#: wt-status.c:1494
-#, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr ""
-
-#: wt-status.c:1501
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1504
-msgid "  (run \"git cherry-pick --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1507
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-
-#: wt-status.c:1509
-msgid "  (use \"git cherry-pick --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1511
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-
-#: wt-status.c:1521
-msgid "Revert currently in progress."
-msgstr ""
-
-#: wt-status.c:1524
-#, c-format
-msgid "You are currently reverting commit %s."
-msgstr ""
-
-#: wt-status.c:1530
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1533
-msgid "  (run \"git revert --continue\" to continue)"
-msgstr ""
-
-#: wt-status.c:1536
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-
-#: wt-status.c:1538
-msgid "  (use \"git revert --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:1540
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-
-#: wt-status.c:1550
-#, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
-
-#: wt-status.c:1554
-msgid "You are currently bisecting."
-msgstr ""
-
-#: wt-status.c:1557
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr ""
-
-#: wt-status.c:1568
-msgid "You are in a sparse checkout."
-msgstr ""
-
-#: wt-status.c:1571
-#, c-format
-msgid "You are in a sparse checkout with %d%% of tracked files present."
-msgstr ""
-
-#: wt-status.c:1815
-msgid "On branch "
-msgstr ""
-
-#: wt-status.c:1822
-msgid "interactive rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1824
-msgid "rebase in progress; onto "
-msgstr ""
-
-#: wt-status.c:1829
-msgid "HEAD detached at "
-msgstr ""
-
-#: wt-status.c:1831
-msgid "HEAD detached from "
-msgstr ""
-
-#: wt-status.c:1834
-msgid "Not currently on any branch."
-msgstr ""
-
-#: wt-status.c:1851
-msgid "Initial commit"
-msgstr ""
-
-#: wt-status.c:1852
-msgid "No commits yet"
-msgstr ""
-
-#: wt-status.c:1866
-msgid "Untracked files"
-msgstr ""
-
-#: wt-status.c:1868
-msgid "Ignored files"
-msgstr ""
-
-#: wt-status.c:1872
-#, c-format
-msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-
-#: wt-status.c:1878
-#, c-format
-msgid "Untracked files not listed%s"
-msgstr ""
-
-#: wt-status.c:1880
-msgid " (use -u option to show untracked files)"
-msgstr ""
-
-#: wt-status.c:1886
-msgid "No changes"
-msgstr ""
-
-#: wt-status.c:1891
-#, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-
-#: wt-status.c:1895
-#, c-format
-msgid "no changes added to commit\n"
-msgstr ""
-
-#: wt-status.c:1899
-#, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-
-#: wt-status.c:1903
-#, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr ""
-
-#: wt-status.c:1907
-#, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-
-#: wt-status.c:1911 wt-status.c:1917
-#, c-format
-msgid "nothing to commit\n"
-msgstr ""
-
-#: wt-status.c:1914
-#, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-
-#: wt-status.c:1919
-#, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr ""
-
-#: wt-status.c:2024
-msgid "No commits yet on "
-msgstr ""
-
-#: wt-status.c:2028
-msgid "HEAD (no branch)"
-msgstr ""
-
-#: wt-status.c:2059
-msgid "different"
-msgstr ""
-
-#: wt-status.c:2061 wt-status.c:2069
-msgid "behind "
-msgstr ""
-
-#: wt-status.c:2064 wt-status.c:2067
-msgid "ahead "
-msgstr ""
-
-#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2605
-#, c-format
-msgid "cannot %s: You have unstaged changes."
-msgstr ""
-
-#: wt-status.c:2611
-msgid "additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: wt-status.c:2613
-#, c-format
-msgid "cannot %s: Your index contains uncommitted changes."
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:205
-msgid "could not send IPC command"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:212
-msgid "could not read IPC response"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:892
-#, c-format
-msgid "could not start accept_thread '%s'"
-msgstr ""
-
-#: compat/simple-ipc/ipc-unix-socket.c:904
-#, c-format
-msgid "could not start worker[0] for '%s'"
-msgstr ""
-
-#: compat/precompose_utf8.c:58 builtin/clone.c:353
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:355
-msgid "Unable to create FSEventStream."
-msgstr ""
-
-#: compat/fsmonitor/fsm-listen-darwin.c:403
-msgid "Failed to start the FSEventStream"
-msgstr ""
-
-#: builtin/add.c:26
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/add.c:63
-#, c-format
-msgid "cannot chmod %cx '%s'"
-msgstr ""
-
-#: builtin/add.c:105
-#, c-format
-msgid "unexpected diff status %c"
-msgstr ""
-
-#: builtin/add.c:110 builtin/commit.c:299
-msgid "updating files failed"
-msgstr ""
-
-#: builtin/add.c:120
-#, c-format
-msgid "remove '%s'\n"
-msgstr ""
-
-#: builtin/add.c:204
-msgid "Unstaged changes after refreshing the index:"
-msgstr ""
-
-#: builtin/add.c:312 builtin/rev-parse.c:993
-msgid "Could not read the index"
-msgstr ""
-
-#: builtin/add.c:325
-msgid "Could not write patch"
-msgstr ""
-
-#: builtin/add.c:328
-msgid "editing patch failed"
-msgstr ""
-
-#: builtin/add.c:331
-#, c-format
-msgid "Could not stat '%s'"
-msgstr ""
-
-#: builtin/add.c:333
-msgid "Empty patch. Aborted."
-msgstr ""
-
-#: builtin/add.c:339
-#, c-format
-msgid "Could not apply '%s'"
-msgstr ""
-
-#: builtin/add.c:347
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-
-#: builtin/add.c:367 builtin/clean.c:927 builtin/fetch.c:175 builtin/mv.c:124
-#: builtin/prune-packed.c:14 builtin/pull.c:208 builtin/push.c:550
-#: builtin/remote.c:1454 builtin/rm.c:244 builtin/send-pack.c:194
-msgid "dry run"
-msgstr ""
-
-#: builtin/add.c:368 builtin/check-ignore.c:22 builtin/commit.c:1483
-#: builtin/count-objects.c:98 builtin/fsck.c:789 builtin/log.c:2338
-#: builtin/mv.c:123 builtin/read-tree.c:120
-msgid "be verbose"
-msgstr ""
-
-#: builtin/add.c:370
-msgid "interactive picking"
-msgstr ""
-
-#: builtin/add.c:371 builtin/checkout.c:1599 builtin/reset.c:417
-msgid "select hunks interactively"
-msgstr ""
-
-#: builtin/add.c:372
-msgid "edit current diff and apply"
-msgstr ""
-
-#: builtin/add.c:373
-msgid "allow adding otherwise ignored files"
-msgstr ""
-
-#: builtin/add.c:374
-msgid "update tracked files"
-msgstr ""
-
-#: builtin/add.c:375
-msgid "renormalize EOL of tracked files (implies -u)"
-msgstr ""
-
-#: builtin/add.c:376
-msgid "record only the fact that the path will be added later"
-msgstr ""
-
-#: builtin/add.c:377
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-
-#: builtin/add.c:380
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-
-#: builtin/add.c:382
-msgid "don't add, only refresh the index"
-msgstr ""
-
-#: builtin/add.c:383
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-
-#: builtin/add.c:384
-msgid "check if - even missing - files are ignored in dry run"
-msgstr ""
-
-#: builtin/add.c:385 builtin/mv.c:128 builtin/rm.c:251
-msgid "allow updating entries outside of the sparse-checkout cone"
-msgstr ""
-
-#: builtin/add.c:387 builtin/update-index.c:1023
-msgid "override the executable bit of the listed files"
-msgstr ""
-
-#: builtin/add.c:389
-msgid "warn when adding an embedded repository"
-msgstr ""
-
-#: builtin/add.c:407
-#, c-format
-msgid ""
-"You've added another git repository inside your current repository.\n"
-"Clones of the outer repository will not contain the contents of\n"
-"the embedded repository and will not know how to obtain it.\n"
-"If you meant to add a submodule, use:\n"
-"\n"
-"\tgit submodule add <url> %s\n"
-"\n"
-"If you added this path by mistake, you can remove it from the\n"
-"index with:\n"
-"\n"
-"\tgit rm --cached %s\n"
-"\n"
-"See \"git help submodule\" for more information."
-msgstr ""
-
-#: builtin/add.c:436
-#, c-format
-msgid "adding embedded git repository: %s"
-msgstr ""
-
-#: builtin/add.c:456
-msgid ""
-"Use -f if you really want to add them.\n"
-"Turn this message off by running\n"
-"\"git config advice.addIgnoredFile false\""
-msgstr ""
-
-#: builtin/add.c:471
-msgid "adding files failed"
-msgstr ""
-
-#: builtin/add.c:534
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr ""
-
-#: builtin/add.c:555 builtin/checkout.c:1770 builtin/commit.c:365
-#: builtin/reset.c:436 builtin/rm.c:275 builtin/stash.c:1702
-#, c-format
-msgid "'%s' and pathspec arguments cannot be used together"
-msgstr ""
-
-#: builtin/add.c:566
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr ""
-
-#: builtin/add.c:568
-msgid ""
-"Maybe you wanted to say 'git add .'?\n"
-"Turn this message off by running\n"
-"\"git config advice.addEmptyPathspec false\""
-msgstr ""
-
-#: builtin/am.c:393
-msgid "could not parse author script"
-msgstr ""
-
-#: builtin/am.c:483
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr ""
-
-#: builtin/am.c:525
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr ""
-
-#: builtin/am.c:563
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#: builtin/am.c:589
-msgid "fseek failed"
-msgstr ""
-
-#: builtin/am.c:777
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr ""
-
-#: builtin/am.c:842
-msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
-
-#: builtin/am.c:890
-msgid "invalid timestamp"
-msgstr ""
-
-#: builtin/am.c:895 builtin/am.c:907
-msgid "invalid Date line"
-msgstr ""
-
-#: builtin/am.c:902
-msgid "invalid timezone offset"
-msgstr ""
-
-#: builtin/am.c:995
-msgid "Patch format detection failed."
-msgstr ""
-
-#: builtin/am.c:1000 builtin/clone.c:306
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr ""
-
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr ""
-
-#: builtin/am.c:1154
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr ""
-
-#: builtin/am.c:1155
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-
-#: builtin/am.c:1160
-#, c-format
-msgid "To record the empty patch as an empty commit, run \"%s --allow-empty\"."
-msgstr ""
-
-#: builtin/am.c:1162
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-
-#: builtin/am.c:1257
-msgid "Patch sent with format=flowed; space at the end of lines might be lost."
-msgstr ""
-
-#: builtin/am.c:1345
-#, c-format
-msgid "missing author line in commit %s"
-msgstr ""
-
-#: builtin/am.c:1348
-#, c-format
-msgid "invalid ident line: %.*s"
-msgstr ""
-
-#: builtin/am.c:1567
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-
-#: builtin/am.c:1569
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-
-#: builtin/am.c:1588
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-
-#: builtin/am.c:1594
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-
-#: builtin/am.c:1620
-msgid "Failed to merge in the changes."
-msgstr ""
-
-#: builtin/am.c:1652
-msgid "applying to an empty history"
-msgstr ""
-
-#: builtin/am.c:1704 builtin/am.c:1708
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr ""
-
-#: builtin/am.c:1726
-msgid "Commit Body is:"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1736
-#, c-format
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-
-#: builtin/am.c:1782 builtin/commit.c:410
-msgid "unable to write index file"
-msgstr ""
-
-#: builtin/am.c:1786
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr ""
-
-#: builtin/am.c:1828
-#, c-format
-msgid "Skipping: %.*s"
-msgstr ""
-
-#: builtin/am.c:1833
-#, c-format
-msgid "Creating an empty commit: %.*s"
-msgstr ""
-
-#: builtin/am.c:1837
-msgid "Patch is empty."
-msgstr ""
-
-#: builtin/am.c:1848 builtin/am.c:1917
-#, c-format
-msgid "Applying: %.*s"
-msgstr ""
-
-#: builtin/am.c:1865
-msgid "No changes -- Patch already applied."
-msgstr ""
-
-#: builtin/am.c:1871
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr ""
-
-#: builtin/am.c:1875
-msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
-msgstr ""
-
-#: builtin/am.c:1921
-msgid "No changes - recorded it as an empty commit."
-msgstr ""
-
-#: builtin/am.c:1923
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"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 ""
-
-#: builtin/am.c:1931
-msgid ""
-"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."
-msgstr ""
-
-#: builtin/am.c:2039 builtin/am.c:2043 builtin/am.c:2055 builtin/reset.c:455
-#: builtin/reset.c:463
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr ""
-
-#: builtin/am.c:2091 builtin/am.c:2167
-msgid "failed to clean index"
-msgstr ""
-
-#: builtin/am.c:2135
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-
-#: builtin/am.c:2292
-#, c-format
-msgid "options '%s=%s' and '%s=%s' cannot be used together"
-msgstr ""
-
-#: builtin/am.c:2323
-msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
-msgstr ""
-
-#: builtin/am.c:2324
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr ""
-
-#: builtin/am.c:2330
-msgid "run interactively"
-msgstr ""
-
-#: builtin/am.c:2332
-msgid "historical option -- no-op"
-msgstr ""
-
-#: builtin/am.c:2334
-msgid "allow fall back on 3way merging if needed"
-msgstr ""
-
-#: builtin/am.c:2335 builtin/init-db.c:547 builtin/prune-packed.c:16
-#: builtin/repack.c:646 builtin/stash.c:946
-msgid "be quiet"
-msgstr ""
-
-#: builtin/am.c:2337
-msgid "add a Signed-off-by trailer to the commit message"
-msgstr ""
-
-#: builtin/am.c:2340
-msgid "recode into utf8 (default)"
-msgstr ""
-
-#: builtin/am.c:2342
-msgid "pass -k flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2344
-msgid "pass -b flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2346
-msgid "pass -m flag to git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2348
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr ""
-
-#: builtin/am.c:2351
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-
-#: builtin/am.c:2354
-msgid "strip everything before a scissors line"
-msgstr ""
-
-#: builtin/am.c:2356
-msgid "pass it through git-mailinfo"
-msgstr ""
-
-#: builtin/am.c:2359 builtin/am.c:2362 builtin/am.c:2365 builtin/am.c:2368
-#: builtin/am.c:2371 builtin/am.c:2374 builtin/am.c:2377 builtin/am.c:2380
-#: builtin/am.c:2386
-msgid "pass it through git-apply"
-msgstr ""
-
-#: builtin/am.c:2376 builtin/commit.c:1514 builtin/fmt-merge-msg.c:18
-#: builtin/fmt-merge-msg.c:21 builtin/grep.c:920 builtin/merge.c:263
-#: builtin/pull.c:142 builtin/pull.c:204 builtin/pull.c:221
-#: builtin/rebase.c:1074 builtin/repack.c:657 builtin/repack.c:661
-#: builtin/repack.c:663 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:446 parse-options.h:159 parse-options.h:180
-#: parse-options.h:348
-msgid "n"
-msgstr ""
-
-#: builtin/am.c:2382 builtin/branch.c:695 builtin/bugreport.c:109
-#: builtin/cat-file.c:848 builtin/cat-file.c:852 builtin/cat-file.c:856
-#: builtin/for-each-ref.c:41 builtin/ls-tree.c:357 builtin/replace.c:555
-#: builtin/tag.c:480 builtin/verify-tag.c:38
-msgid "format"
-msgstr ""
-
-#: builtin/am.c:2383
-msgid "format the patch(es) are in"
-msgstr ""
-
-#: builtin/am.c:2389
-msgid "override error message when patch failure occurs"
-msgstr ""
-
-#: builtin/am.c:2391
-msgid "continue applying patches after resolving a conflict"
-msgstr ""
-
-#: builtin/am.c:2394
-msgid "synonyms for --continue"
-msgstr ""
-
-#: builtin/am.c:2397
-msgid "skip the current patch"
-msgstr ""
-
-#: builtin/am.c:2400
-msgid "restore the original branch and abort the patching operation"
-msgstr ""
-
-#: builtin/am.c:2403
-msgid "abort the patching operation but keep HEAD where it is"
-msgstr ""
-
-#: builtin/am.c:2407
-msgid "show the patch being applied"
-msgstr ""
-
-#: builtin/am.c:2411
-msgid "record the empty patch as an empty commit"
-msgstr ""
-
-#: builtin/am.c:2415
-msgid "lie about committer date"
-msgstr ""
-
-#: builtin/am.c:2417
-msgid "use current timestamp for author date"
-msgstr ""
-
-#: builtin/am.c:2419 builtin/commit-tree.c:118 builtin/commit.c:1642
-#: builtin/merge.c:302 builtin/pull.c:179 builtin/rebase.c:1127
-#: builtin/revert.c:117 builtin/tag.c:461
-msgid "key-id"
-msgstr ""
-
-#: builtin/am.c:2420 builtin/rebase.c:1128
-msgid "GPG-sign commits"
-msgstr ""
-
-#: builtin/am.c:2423
-msgid "how to handle empty patches"
-msgstr ""
-
-#: builtin/am.c:2426
-msgid "(internal use for git-rebase)"
-msgstr ""
-
-#: builtin/am.c:2444
-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 ""
-
-#: builtin/am.c:2451
-msgid "failed to read the index"
-msgstr ""
-
-#: builtin/am.c:2466
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-
-#: builtin/am.c:2490
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-
-#: builtin/am.c:2496
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
-
-#: builtin/am.c:2506
-msgid "interactive mode requires patches on the command line"
-msgstr ""
-
-#: builtin/apply.c:8
-msgid "git apply [<options>] [<patch>...]"
-msgstr ""
-
-#: builtin/archive.c:18
-msgid "could not redirect output"
-msgstr ""
-
-#: builtin/archive.c:35
-msgid "git archive: Remote with no URL"
-msgstr ""
-
-#: builtin/archive.c:59
-msgid "git archive: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: builtin/archive.c:62
-#, c-format
-msgid "git archive: NACK %s"
-msgstr ""
-
-#: builtin/archive.c:63
-msgid "git archive: protocol error"
-msgstr ""
-
-#: builtin/archive.c:67
-msgid "git archive: expected a flush"
-msgstr ""
-
-#: builtin/bisect--helper.c:24
-msgid "git bisect--helper --bisect-reset [<commit>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:26
-msgid ""
-"git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
-"=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
-"[<paths>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:29
-msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
-msgstr ""
-
-#: builtin/bisect--helper.c:30
-msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:31
-msgid "git bisect--helper --bisect-replay <filename>"
-msgstr ""
-
-#: builtin/bisect--helper.c:32
-msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
-msgstr ""
-
-#: builtin/bisect--helper.c:34
-msgid "git bisect--helper --bisect-run <cmd>..."
-msgstr ""
-
-#: builtin/bisect--helper.c:109
-#, c-format
-msgid "cannot open file '%s' in mode '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:116
-#, c-format
-msgid "could not write to file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:154
-#, c-format
-msgid "cannot open file '%s' for reading"
-msgstr ""
-
-#: builtin/bisect--helper.c:170
-#, c-format
-msgid "'%s' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:174
-#, c-format
-msgid "can't use the builtin command '%s' as a term"
-msgstr ""
-
-#: builtin/bisect--helper.c:184
-#, c-format
-msgid "can't change the meaning of the term '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:194
-msgid "please use two different terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:210
-#, c-format
-msgid "We are not bisecting.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:218
-#, c-format
-msgid "'%s' is not a valid commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:227
-#, c-format
-msgid ""
-"could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:271
-#, c-format
-msgid "Bad bisect_write argument: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:276
-#, c-format
-msgid "couldn't get the oid of the rev '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:288
-#, c-format
-msgid "couldn't open the file '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:314
-#, c-format
-msgid "Invalid command: you're currently in a %s/%s bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:341
-#, c-format
-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 ""
-
-#: builtin/bisect--helper.c:345
-#, c-format
-msgid ""
-"You need to start by \"git bisect start\".\n"
-"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 ""
-
-#: builtin/bisect--helper.c:365
-#, c-format
-msgid "bisecting only with a %s commit"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:373
-msgid "Are you sure [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:434
-msgid "no terms defined"
-msgstr ""
-
-#: builtin/bisect--helper.c:437
-#, c-format
-msgid ""
-"Your current terms are %s for the old state\n"
-"and %s for the new state.\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:447
-#, c-format
-msgid ""
-"invalid argument %s for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
-msgstr ""
-
-#: builtin/bisect--helper.c:514 builtin/bisect--helper.c:1038
-msgid "revision walk setup failed\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:536
-#, c-format
-msgid "could not open '%s' for appending"
-msgstr ""
-
-#: builtin/bisect--helper.c:655 builtin/bisect--helper.c:668
-msgid "'' is not a valid term"
-msgstr ""
-
-#: builtin/bisect--helper.c:678
-#, c-format
-msgid "unrecognized option: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:682
-#, c-format
-msgid "'%s' does not appear to be a valid revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:713
-msgid "bad HEAD - I need a HEAD"
-msgstr ""
-
-#: builtin/bisect--helper.c:728
-#, c-format
-msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
-msgstr ""
-
-#: builtin/bisect--helper.c:749
-msgid "won't bisect on cg-seek'ed tree"
-msgstr ""
-
-#: builtin/bisect--helper.c:752
-msgid "bad HEAD - strange symbolic ref"
-msgstr ""
-
-#: builtin/bisect--helper.c:772
-#, c-format
-msgid "invalid ref: '%s'"
-msgstr ""
-
-#: builtin/bisect--helper.c:830
-msgid "You need to start by \"git bisect start\"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#.
-#: builtin/bisect--helper.c:841
-msgid "Do you want me to do it for you [Y/n]? "
-msgstr ""
-
-#: builtin/bisect--helper.c:859
-msgid "Please call `--bisect-state` with at least one argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:872
-#, c-format
-msgid "'git bisect %s' can take only one argument."
-msgstr ""
-
-#: builtin/bisect--helper.c:884 builtin/bisect--helper.c:897
-#, c-format
-msgid "Bad rev input: %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:904
-#, c-format
-msgid "Bad rev input (not a commit): %s"
-msgstr ""
-
-#: builtin/bisect--helper.c:936
-msgid "We are not bisecting."
-msgstr ""
-
-#: builtin/bisect--helper.c:986
-#, c-format
-msgid "'%s'?? what are you talking about?"
-msgstr ""
-
-#: builtin/bisect--helper.c:998
-#, c-format
-msgid "cannot read file '%s' for replaying"
-msgstr ""
-
-#: builtin/bisect--helper.c:1120 builtin/bisect--helper.c:1152
-#, c-format
-msgid "running %s\n"
-msgstr ""
-
-#: builtin/bisect--helper.c:1145 builtin/bisect--helper.c:1335
-msgid "bisect run failed: no command provided."
-msgstr ""
-
-#: builtin/bisect--helper.c:1166
-#, c-format
-msgid "unable to verify '%s' on good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1172
-#, c-format
-msgid "bogus exit code %d for good revision"
-msgstr ""
-
-#: builtin/bisect--helper.c:1180
-#, c-format
-msgid "bisect run failed: exit code %d from '%s' is < 0 or >= 128"
-msgstr ""
-
-#: builtin/bisect--helper.c:1195
-#, c-format
-msgid "cannot open file '%s' for writing"
-msgstr ""
-
-#: builtin/bisect--helper.c:1213
-msgid "bisect run cannot continue any more"
-msgstr ""
-
-#: builtin/bisect--helper.c:1215
-#, c-format
-msgid "bisect run success"
-msgstr ""
-
-#: builtin/bisect--helper.c:1218
-#, c-format
-msgid "bisect found first bad commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1221
-#, c-format
-msgid ""
-"bisect run failed: 'git bisect--helper --bisect-state %s' exited with error "
-"code %d"
-msgstr ""
-
-#: builtin/bisect--helper.c:1253
-msgid "reset the bisection state"
-msgstr ""
-
-#: builtin/bisect--helper.c:1255
-msgid "check whether bad or good terms exist"
-msgstr ""
-
-#: builtin/bisect--helper.c:1257
-msgid "print out the bisect terms"
-msgstr ""
-
-#: builtin/bisect--helper.c:1259
-msgid "start the bisect session"
-msgstr ""
-
-#: builtin/bisect--helper.c:1261
-msgid "find the next bisection commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1263
-msgid "mark the state of ref (or refs)"
-msgstr ""
-
-#: builtin/bisect--helper.c:1265
-msgid "list the bisection steps so far"
-msgstr ""
-
-#: builtin/bisect--helper.c:1267
-msgid "replay the bisection process from the given file"
-msgstr ""
-
-#: builtin/bisect--helper.c:1269
-msgid "skip some commits for checkout"
-msgstr ""
-
-#: builtin/bisect--helper.c:1271
-msgid "visualize the bisection"
-msgstr ""
-
-#: builtin/bisect--helper.c:1273
-msgid "use <cmd>... to automatically bisect"
-msgstr ""
-
-#: builtin/bisect--helper.c:1275
-msgid "no log for BISECT_WRITE"
-msgstr ""
-
-#: builtin/bisect--helper.c:1290
-msgid "--bisect-reset requires either no argument or a commit"
-msgstr ""
-
-#: builtin/bisect--helper.c:1295
-msgid "--bisect-terms requires 0 or 1 argument"
-msgstr ""
-
-#: builtin/bisect--helper.c:1304
-msgid "--bisect-next requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1315
-msgid "--bisect-log requires 0 arguments"
-msgstr ""
-
-#: builtin/bisect--helper.c:1320
-msgid "no logfile given"
-msgstr ""
-
-#: builtin/blame.c:32
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr ""
-
-#: builtin/blame.c:37
-msgid "<rev-opts> are documented in git-rev-list(1)"
-msgstr ""
-
-#: builtin/blame.c:406
-#, c-format
-msgid "expecting a color: %s"
-msgstr ""
-
-#: builtin/blame.c:413
-msgid "must end with a color"
-msgstr ""
-
-#: builtin/blame.c:842
-#, c-format
-msgid "cannot find revision %s to ignore"
-msgstr ""
-
-#: builtin/blame.c:864
-msgid "show blame entries as we find them, incrementally"
-msgstr ""
-
-#: builtin/blame.c:865
-msgid "do not show object names of boundary commits (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:866
-msgid "do not treat root commits as boundaries (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:867
-msgid "show work cost statistics"
-msgstr ""
-
-#: builtin/blame.c:868 builtin/checkout.c:1554 builtin/clone.c:98
-#: builtin/commit-graph.c:75 builtin/commit-graph.c:228 builtin/fetch.c:181
-#: builtin/merge.c:301 builtin/multi-pack-index.c:103
-#: builtin/multi-pack-index.c:154 builtin/multi-pack-index.c:180
-#: builtin/multi-pack-index.c:208 builtin/pull.c:120 builtin/push.c:566
-#: builtin/remote.c:683 builtin/send-pack.c:202
-msgid "force progress reporting"
-msgstr ""
-
-#: builtin/blame.c:869
-msgid "show output score for blame entries"
-msgstr ""
-
-#: builtin/blame.c:870
-msgid "show original filename (Default: auto)"
-msgstr ""
-
-#: builtin/blame.c:871
-msgid "show original linenumber (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:872
-msgid "show in a format designed for machine consumption"
-msgstr ""
-
-#: builtin/blame.c:873
-msgid "show porcelain format with per-line commit information"
-msgstr ""
-
-#: builtin/blame.c:874
-msgid "use the same output mode as git-annotate (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:875
-msgid "show raw timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:876
-msgid "show long commit SHA1 (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:877
-msgid "suppress author name and timestamp (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:878
-msgid "show author email instead of name (Default: off)"
-msgstr ""
-
-#: builtin/blame.c:879
-msgid "ignore whitespace differences"
-msgstr ""
-
-#: builtin/blame.c:880 builtin/log.c:1857
-msgid "rev"
-msgstr ""
-
-#: builtin/blame.c:880
-msgid "ignore <rev> when blaming"
-msgstr ""
-
-#: builtin/blame.c:881
-msgid "ignore revisions from <file>"
-msgstr ""
-
-#: builtin/blame.c:882
-msgid "color redundant metadata from previous line differently"
-msgstr ""
-
-#: builtin/blame.c:883
-msgid "color lines by age"
-msgstr ""
-
-#: builtin/blame.c:884
-msgid "spend extra cycles to find better match"
-msgstr ""
-
-#: builtin/blame.c:885
-msgid "use revisions from <file> instead of calling git-rev-list"
-msgstr ""
-
-#: builtin/blame.c:886
-msgid "use <file>'s contents as the final image"
-msgstr ""
-
-#: builtin/blame.c:887 builtin/blame.c:888
-msgid "score"
-msgstr ""
-
-#: builtin/blame.c:887
-msgid "find line copies within and across files"
-msgstr ""
-
-#: builtin/blame.c:888
-msgid "find line movements within and across files"
-msgstr ""
-
-#: builtin/blame.c:889
-msgid "range"
-msgstr ""
-
-#: builtin/blame.c:890
-msgid "process only line range <start>,<end> or function :<funcname>"
-msgstr ""
-
-#: builtin/blame.c:949
-msgid "--progress can't be used with --incremental or porcelain formats"
-msgstr ""
-
-#. TRANSLATORS: This string is used to tell us the
-#. maximum display width for a relative timestamp in
-#. "git blame" output.  For C locale, "4 years, 11
-#. months ago", which takes 22 places, is the longest
-#. among various forms of relative timestamps, but
-#. your language may need more or fewer display
-#. columns.
-#.
-#: builtin/blame.c:1000
-msgid "4 years, 11 months ago"
-msgstr ""
-
-#: builtin/blame.c:1116
-#, c-format
-msgid "file %s has only %lu line"
-msgid_plural "file %s has only %lu lines"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/blame.c:1161
-msgid "Blaming lines"
-msgstr ""
-
-#: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--merged] [--no-merged]"
-msgstr ""
-
-#: builtin/branch.c:30
-msgid ""
-"git branch [<options>] [-f] [--recurse-submodules] <branch-name> [<start-"
-"point>]"
-msgstr ""
-
-#: builtin/branch.c:31
-msgid "git branch [<options>] [-l] [<pattern>...]"
-msgstr ""
-
-#: builtin/branch.c:32
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr ""
-
-#: builtin/branch.c:33
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:34
-msgid "git branch [<options>] (-c | -C) [<old-branch>] <new-branch>"
-msgstr ""
-
-#: builtin/branch.c:35
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr ""
-
-#: builtin/branch.c:36
-msgid "git branch [<options>] [-r | -a] [--format]"
-msgstr ""
-
-#: builtin/branch.c:165
-#, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:169
-#, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
-msgstr ""
-
-#: builtin/branch.c:183
-#, c-format
-msgid "Couldn't look up commit object for '%s'"
-msgstr ""
-
-#: builtin/branch.c:187
-#, c-format
-msgid ""
-"The branch '%s' is not fully merged.\n"
-"If you are sure you want to delete it, run 'git branch -D %s'."
-msgstr ""
-
-#: builtin/branch.c:200
-msgid "Update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:235
-msgid "cannot use -a with -d"
-msgstr ""
-
-#: builtin/branch.c:242
-msgid "Couldn't look up commit object for HEAD"
-msgstr ""
-
-#: builtin/branch.c:259
-#, c-format
-msgid "Cannot delete branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/branch.c:274
-#, c-format
-msgid "remote-tracking branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:275
-#, c-format
-msgid "branch '%s' not found."
-msgstr ""
-
-#: builtin/branch.c:306
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:307
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr ""
-
-#: builtin/branch.c:457 builtin/tag.c:64
-msgid "unable to parse format string"
-msgstr ""
-
-#: builtin/branch.c:488
-msgid "could not resolve HEAD"
-msgstr ""
-
-#: builtin/branch.c:494
-#, c-format
-msgid "HEAD (%s) points outside of refs/heads/"
-msgstr ""
-
-#: builtin/branch.c:509
-#, c-format
-msgid "Branch %s is being rebased at %s"
-msgstr ""
-
-#: builtin/branch.c:513
-#, c-format
-msgid "Branch %s is being bisected at %s"
-msgstr ""
-
-#: builtin/branch.c:530
-msgid "cannot copy the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:532
-msgid "cannot rename the current branch while not on any."
-msgstr ""
-
-#: builtin/branch.c:543
-#, c-format
-msgid "Invalid branch name: '%s'"
-msgstr ""
-
-#: builtin/branch.c:572
-msgid "Branch rename failed"
-msgstr ""
-
-#: builtin/branch.c:574
-msgid "Branch copy failed"
-msgstr ""
-
-#: builtin/branch.c:578
-#, c-format
-msgid "Created a copy of a misnamed branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:581
-#, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
-
-#: builtin/branch.c:587
-#, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
-
-#: builtin/branch.c:596
-msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:598
-msgid "Branch is copied, but update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:614
-#, c-format
-msgid ""
-"Please edit the description for the branch\n"
-"  %s\n"
-"Lines starting with '%c' will be stripped.\n"
-msgstr ""
-
-#: builtin/branch.c:651
-msgid "Generic options"
-msgstr ""
-
-#: builtin/branch.c:653
-msgid "show hash and subject, give twice for upstream branch"
-msgstr ""
-
-#: builtin/branch.c:654
-msgid "suppress informational messages"
-msgstr ""
-
-#: builtin/branch.c:656 builtin/checkout.c:1571
-#: builtin/submodule--helper.c:3077
-msgid "set branch tracking configuration"
-msgstr ""
-
-#: builtin/branch.c:659
-msgid "do not use"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "upstream"
-msgstr ""
-
-#: builtin/branch.c:661
-msgid "change the upstream info"
-msgstr ""
-
-#: builtin/branch.c:662
-msgid "unset the upstream info"
-msgstr ""
-
-#: builtin/branch.c:663
-msgid "use colored output"
-msgstr ""
-
-#: builtin/branch.c:664
-msgid "act on remote-tracking branches"
-msgstr ""
-
-#: builtin/branch.c:666 builtin/branch.c:668
-msgid "print only branches that contain the commit"
-msgstr ""
-
-#: builtin/branch.c:667 builtin/branch.c:669
-msgid "print only branches that don't contain the commit"
-msgstr ""
-
-#: builtin/branch.c:672
-msgid "Specific git-branch actions:"
-msgstr ""
-
-#: builtin/branch.c:673
-msgid "list both remote-tracking and local branches"
-msgstr ""
-
-#: builtin/branch.c:675
-msgid "delete fully merged branch"
-msgstr ""
-
-#: builtin/branch.c:676
-msgid "delete branch (even if not merged)"
-msgstr ""
-
-#: builtin/branch.c:677
-msgid "move/rename a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:678
-msgid "move/rename a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:679
-msgid "copy a branch and its reflog"
-msgstr ""
-
-#: builtin/branch.c:680
-msgid "copy a branch, even if target exists"
-msgstr ""
-
-#: builtin/branch.c:681
-msgid "list branch names"
-msgstr ""
-
-#: builtin/branch.c:682
-msgid "show current branch name"
-msgstr ""
-
-#: builtin/branch.c:683 builtin/submodule--helper.c:3075
-msgid "create the branch's reflog"
-msgstr ""
-
-#: builtin/branch.c:685
-msgid "edit the description for the branch"
-msgstr ""
-
-#: builtin/branch.c:686
-msgid "force creation, move/rename, deletion"
-msgstr ""
-
-#: builtin/branch.c:687
-msgid "print only branches that are merged"
-msgstr ""
-
-#: builtin/branch.c:688
-msgid "print only branches that are not merged"
-msgstr ""
-
-#: builtin/branch.c:689
-msgid "list branches in columns"
-msgstr ""
-
-#: builtin/branch.c:691 builtin/for-each-ref.c:45 builtin/notes.c:413
-#: builtin/notes.c:416 builtin/notes.c:579 builtin/notes.c:582
-#: builtin/tag.c:476
-msgid "object"
-msgstr ""
-
-#: builtin/branch.c:692
-msgid "print only branches of the object"
-msgstr ""
-
-#: builtin/branch.c:693 builtin/for-each-ref.c:51 builtin/tag.c:483
-msgid "sorting and filtering are case insensitive"
-msgstr ""
-
-#: builtin/branch.c:694 builtin/ls-files.c:667
-msgid "recurse through submodules"
-msgstr ""
-
-#: builtin/branch.c:695 builtin/for-each-ref.c:41 builtin/ls-tree.c:358
-#: builtin/tag.c:481 builtin/verify-tag.c:38
-msgid "format to use for the output"
-msgstr ""
-
-#: builtin/branch.c:718 builtin/clone.c:684
-msgid "HEAD not found below refs/heads!"
-msgstr ""
-
-#: builtin/branch.c:739
-msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
-msgstr ""
-
-#: builtin/branch.c:741
-msgid "--recurse-submodules can only be used to create branches"
-msgstr ""
-
-#: builtin/branch.c:770 builtin/branch.c:826 builtin/branch.c:835
-msgid "branch name required"
-msgstr ""
-
-#: builtin/branch.c:802
-msgid "Cannot give description to detached HEAD"
-msgstr ""
-
-#: builtin/branch.c:807
-msgid "cannot edit description of more than one branch"
-msgstr ""
-
-#: builtin/branch.c:814
-#, c-format
-msgid "No commit on branch '%s' yet."
-msgstr ""
-
-#: builtin/branch.c:817
-#, c-format
-msgid "No branch named '%s'."
-msgstr ""
-
-#: builtin/branch.c:832
-msgid "too many branches for a copy operation"
-msgstr ""
-
-#: builtin/branch.c:841
-msgid "too many arguments for a rename operation"
-msgstr ""
-
-#: builtin/branch.c:846
-msgid "too many arguments to set new upstream"
-msgstr ""
-
-#: builtin/branch.c:850
-#, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:853 builtin/branch.c:873
-#, c-format
-msgid "no such branch '%s'"
-msgstr ""
-
-#: builtin/branch.c:857
-#, c-format
-msgid "branch '%s' does not exist"
-msgstr ""
-
-#: builtin/branch.c:867
-msgid "too many arguments to unset upstream"
-msgstr ""
-
-#: builtin/branch.c:871
-msgid "could not unset upstream of HEAD when it does not point to any branch."
-msgstr ""
-
-#: builtin/branch.c:877
-#, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr ""
-
-#: builtin/branch.c:890
-msgid ""
-"The -a, and -r, options to 'git branch' do not take a branch name.\n"
-"Did you mean to use: -a|-r --list <pattern>?"
-msgstr ""
-
-#: builtin/branch.c:894
-msgid ""
-"the '--set-upstream' option is no longer supported. Please use '--track' or "
-"'--set-upstream-to' instead."
-msgstr ""
-
-#: builtin/bugreport.c:16
-msgid "git version:\n"
-msgstr ""
-
-#: builtin/bugreport.c:22
-#, c-format
-msgid "uname() failed with error '%s' (%d)\n"
-msgstr ""
-
-#: builtin/bugreport.c:32
-msgid "compiler info: "
-msgstr ""
-
-#: builtin/bugreport.c:35
-msgid "libc info: "
-msgstr ""
-
-#: builtin/bugreport.c:49
-msgid "not run from a git repository - no hooks to show\n"
-msgstr ""
-
-#: builtin/bugreport.c:62
-msgid "git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"
-msgstr ""
-
-#: builtin/bugreport.c:69
-msgid ""
-"Thank you for filling out a Git bug report!\n"
-"Please answer the following questions to help us understand your issue.\n"
-"\n"
-"What did you do before the bug happened? (Steps to reproduce your issue)\n"
-"\n"
-"What did you expect to happen? (Expected behavior)\n"
-"\n"
-"What happened instead? (Actual behavior)\n"
-"\n"
-"What's different between what you expected and what actually happened?\n"
-"\n"
-"Anything else you want to add:\n"
-"\n"
-"Please review the rest of the bug report below.\n"
-"You can delete any lines you don't wish to share.\n"
-msgstr ""
-
-#: builtin/bugreport.c:108
-msgid "specify a destination for the bugreport file"
-msgstr ""
-
-#: builtin/bugreport.c:110
-msgid "specify a strftime format suffix for the filename"
-msgstr ""
-
-#: builtin/bugreport.c:132
-#, c-format
-msgid "could not create leading directories for '%s'"
-msgstr ""
-
-#: builtin/bugreport.c:139
-msgid "System Info"
-msgstr ""
-
-#: builtin/bugreport.c:142
-msgid "Enabled Hooks"
-msgstr ""
-
-#: builtin/bugreport.c:149
-#, c-format
-msgid "unable to write to %s"
-msgstr ""
-
-#: builtin/bugreport.c:159
-#, c-format
-msgid "Created new report at '%s'.\n"
-msgstr ""
-
-#: builtin/bundle.c:15 builtin/bundle.c:23
-msgid "git bundle create [<options>] <file> <git-rev-list args>"
-msgstr ""
-
-#: builtin/bundle.c:16 builtin/bundle.c:28
-msgid "git bundle verify [<options>] <file>"
-msgstr ""
-
-#: builtin/bundle.c:17 builtin/bundle.c:33
-msgid "git bundle list-heads <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:18 builtin/bundle.c:38
-msgid "git bundle unbundle <file> [<refname>...]"
-msgstr ""
-
-#: builtin/bundle.c:65 builtin/pack-objects.c:3899
-msgid "do not show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:67 builtin/bundle.c:168 builtin/pack-objects.c:3901
-msgid "show progress meter"
-msgstr ""
-
-#: builtin/bundle.c:69 builtin/pack-objects.c:3903
-msgid "show progress meter during object writing phase"
-msgstr ""
-
-#: builtin/bundle.c:72 builtin/pack-objects.c:3906
-msgid "similar to --all-progress when progress meter is shown"
-msgstr ""
-
-#: builtin/bundle.c:74
-msgid "specify bundle format version"
-msgstr ""
-
-#: builtin/bundle.c:94
-msgid "Need a repository to create a bundle."
-msgstr ""
-
-#: builtin/bundle.c:108
-msgid "do not show bundle details"
-msgstr ""
-
-#: builtin/bundle.c:127
-#, c-format
-msgid "%s is okay\n"
-msgstr ""
-
-#: builtin/bundle.c:183
-msgid "Need a repository to unbundle."
-msgstr ""
-
-#: builtin/bundle.c:186
-msgid "Unbundling objects"
-msgstr ""
-
-#: builtin/bundle.c:220 builtin/remote.c:1758
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr ""
-
-#: builtin/cat-file.c:568
-msgid "flush is only for --buffer mode"
-msgstr ""
-
-#: builtin/cat-file.c:612
-msgid "empty command in input"
-msgstr ""
-
-#: builtin/cat-file.c:614
-#, c-format
-msgid "whitespace before command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:623
-#, c-format
-msgid "%s requires arguments"
-msgstr ""
-
-#: builtin/cat-file.c:628
-#, c-format
-msgid "%s takes no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:636
-#, c-format
-msgid "unknown command: '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:795
-msgid "only one batch option may be specified"
-msgstr ""
-
-#: builtin/cat-file.c:824
-msgid "git cat-file <type> <object>"
-msgstr ""
-
-#: builtin/cat-file.c:825
-msgid "git cat-file (-e | -p) <object>"
-msgstr ""
-
-#: builtin/cat-file.c:826
-msgid "git cat-file (-t | -s) [--allow-unknown-type] <object>"
-msgstr ""
-
-#: builtin/cat-file.c:827
-msgid ""
-"git cat-file (--batch | --batch-check | --batch-command) [--batch-all-"
-"objects]\n"
-"             [--buffer] [--follow-symlinks] [--unordered]\n"
-"             [--textconv | --filters]"
-msgstr ""
-
-#: builtin/cat-file.c:830
-msgid ""
-"git cat-file (--textconv | --filters)\n"
-"             [<rev>:<path|tree-ish> | --path=<path|tree-ish> <rev>]"
-msgstr ""
-
-#: builtin/cat-file.c:836
-msgid "Check object existence or emit object contents"
-msgstr ""
-
-#: builtin/cat-file.c:838
-msgid "check if <object> exists"
-msgstr ""
-
-#: builtin/cat-file.c:839
-msgid "pretty-print <object> content"
-msgstr ""
-
-#: builtin/cat-file.c:841
-msgid "Emit [broken] object attributes"
-msgstr ""
-
-#: builtin/cat-file.c:842
-msgid "show object type (one of 'blob', 'tree', 'commit', 'tag', ...)"
-msgstr ""
-
-#: builtin/cat-file.c:843
-msgid "show object size"
-msgstr ""
-
-#: builtin/cat-file.c:845
-msgid "allow -s and -t to work with broken/corrupt objects"
-msgstr ""
-
-#: builtin/cat-file.c:847
-msgid "Batch objects requested on stdin (or --batch-all-objects)"
-msgstr ""
-
-#: builtin/cat-file.c:849
-msgid "show full <object> or <rev> contents"
-msgstr ""
-
-#: builtin/cat-file.c:853
-msgid "like --batch, but don't emit <contents>"
-msgstr ""
-
-#: builtin/cat-file.c:857
-msgid "read commands from stdin"
-msgstr ""
-
-#: builtin/cat-file.c:861
-msgid "with --batch[-check]: ignores stdin, batches all known objects"
-msgstr ""
-
-#: builtin/cat-file.c:863
-msgid "Change or optimize batch output"
-msgstr ""
-
-#: builtin/cat-file.c:864
-msgid "buffer --batch output"
-msgstr ""
-
-#: builtin/cat-file.c:866
-msgid "follow in-tree symlinks"
-msgstr ""
-
-#: builtin/cat-file.c:868
-msgid "do not order objects before emitting them"
-msgstr ""
-
-#: builtin/cat-file.c:870
-msgid ""
-"Emit object (blob or tree) with conversion or filter (stand-alone, or with "
-"batch)"
-msgstr ""
-
-#: builtin/cat-file.c:872
-msgid "run textconv on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:874
-msgid "run filters on object's content"
-msgstr ""
-
-#: builtin/cat-file.c:875
-msgid "blob|tree"
-msgstr ""
-
-#: builtin/cat-file.c:876
-msgid "use a <path> for (--textconv | --filters); Not with 'batch'"
-msgstr ""
-
-#: builtin/cat-file.c:894
-#, c-format
-msgid "'%s=<%s>' needs '%s' or '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:896
-msgid "path|tree-ish"
-msgstr ""
-
-#: builtin/cat-file.c:903 builtin/cat-file.c:906 builtin/cat-file.c:909
-#, c-format
-msgid "'%s' requires a batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:921
-#, c-format
-msgid "'-%c' is incompatible with batch mode"
-msgstr ""
-
-#: builtin/cat-file.c:924
-msgid "batch modes take no arguments"
-msgstr ""
-
-#: builtin/cat-file.c:932 builtin/cat-file.c:935
-#, c-format
-msgid "<rev> required with '%s'"
-msgstr ""
-
-#: builtin/cat-file.c:938
-#, c-format
-msgid "<object> required with '-%c'"
-msgstr ""
-
-#: builtin/cat-file.c:943 builtin/notes.c:374 builtin/notes.c:429
-#: builtin/notes.c:507 builtin/notes.c:519 builtin/notes.c:596
-#: builtin/notes.c:663 builtin/notes.c:813 builtin/notes.c:965
-#: builtin/notes.c:987 builtin/prune-packed.c:25 builtin/receive-pack.c:2489
-#: builtin/tag.c:592
-msgid "too many arguments"
-msgstr ""
-
-#: builtin/cat-file.c:947
-#, c-format
-msgid "only two arguments allowed in <type> <object> mode, not %d"
-msgstr ""
-
-#: builtin/check-attr.c:13
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr ""
-
-#: builtin/check-attr.c:14
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr ""
-
-#: builtin/check-attr.c:21
-msgid "report all attributes set on file"
-msgstr ""
-
-#: builtin/check-attr.c:22
-msgid "use .gitattributes only from the index"
-msgstr ""
-
-#: builtin/check-attr.c:23 builtin/check-ignore.c:25 builtin/hash-object.c:101
-msgid "read file names from stdin"
-msgstr ""
-
-#: builtin/check-attr.c:25 builtin/check-ignore.c:27
-msgid "terminate input and output records by a NUL character"
-msgstr ""
-
-#: builtin/check-ignore.c:21 builtin/checkout.c:1550 builtin/gc.c:550
-#: builtin/worktree.c:565
-msgid "suppress progress reporting"
-msgstr ""
-
-#: builtin/check-ignore.c:29
-msgid "show non-matching input paths"
-msgstr ""
-
-#: builtin/check-ignore.c:31
-msgid "ignore index when checking"
-msgstr ""
-
-#: builtin/check-ignore.c:165
-msgid "cannot specify pathnames with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:168
-msgid "-z only makes sense with --stdin"
-msgstr ""
-
-#: builtin/check-ignore.c:170
-msgid "no path specified"
-msgstr ""
-
-#: builtin/check-ignore.c:174
-msgid "--quiet is only valid with a single pathname"
-msgstr ""
-
-#: builtin/check-ignore.c:176
-msgid "cannot have both --quiet and --verbose"
-msgstr ""
-
-#: builtin/check-ignore.c:179
-msgid "--non-matching is only valid with --verbose"
-msgstr ""
-
-#: builtin/check-mailmap.c:9
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr ""
-
-#: builtin/check-mailmap.c:14
-msgid "also read contacts from stdin"
-msgstr ""
-
-#: builtin/check-mailmap.c:25
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr ""
-
-#: builtin/check-mailmap.c:48
-msgid "no contacts specified"
-msgstr ""
-
-#: builtin/checkout--worker.c:110
-msgid "git checkout--worker [<options>]"
-msgstr ""
-
-#: builtin/checkout--worker.c:118 builtin/checkout-index.c:235
-#: builtin/column.c:31 builtin/column.c:32 builtin/submodule--helper.c:1878
-#: builtin/submodule--helper.c:1881 builtin/submodule--helper.c:1889
-#: builtin/submodule--helper.c:2716 builtin/worktree.c:563
-#: builtin/worktree.c:808
-msgid "string"
-msgstr ""
-
-#: builtin/checkout--worker.c:119 builtin/checkout-index.c:236
-msgid "when creating files, prepend <string>"
-msgstr ""
-
-#: builtin/checkout-index.c:184
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/checkout-index.c:201
-msgid "stage should be between 1 and 3 or all"
-msgstr ""
-
-#: builtin/checkout-index.c:219
-msgid "check out all files in the index"
-msgstr ""
-
-#: builtin/checkout-index.c:221
-msgid "do not skip files with skip-worktree set"
-msgstr ""
-
-#: builtin/checkout-index.c:222
-msgid "force overwrite of existing files"
-msgstr ""
-
-#: builtin/checkout-index.c:224
-msgid "no warning for existing files and files not in index"
-msgstr ""
-
-#: builtin/checkout-index.c:226
-msgid "don't checkout new files"
-msgstr ""
-
-#: builtin/checkout-index.c:228
-msgid "update stat information in the index file"
-msgstr ""
-
-#: builtin/checkout-index.c:232
-msgid "read list of paths from the standard input"
-msgstr ""
-
-#: builtin/checkout-index.c:234
-msgid "write the content to temporary files"
-msgstr ""
-
-#: builtin/checkout-index.c:238
-msgid "copy out the files from named stage"
-msgstr ""
-
-#: builtin/checkout.c:34
-msgid "git checkout [<options>] <branch>"
-msgstr ""
-
-#: builtin/checkout.c:35
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr ""
-
-#: builtin/checkout.c:40
-msgid "git switch [<options>] [<branch>]"
-msgstr ""
-
-#: builtin/checkout.c:45
-msgid "git restore [<options>] [--source=<branch>] <file>..."
-msgstr ""
-
-#: builtin/checkout.c:199 builtin/checkout.c:238
-#, c-format
-msgid "path '%s' does not have our version"
-msgstr ""
-
-#: builtin/checkout.c:201 builtin/checkout.c:240
-#, c-format
-msgid "path '%s' does not have their version"
-msgstr ""
-
-#: builtin/checkout.c:217
-#, c-format
-msgid "path '%s' does not have all necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:271
-#, c-format
-msgid "path '%s' does not have necessary versions"
-msgstr ""
-
-#: builtin/checkout.c:291
-#, c-format
-msgid "path '%s': cannot merge"
-msgstr ""
-
-#: builtin/checkout.c:307
-#, c-format
-msgid "Unable to add merge result for '%s'"
-msgstr ""
-
-#: builtin/checkout.c:424
-#, c-format
-msgid "Recreated %d merge conflict"
-msgid_plural "Recreated %d merge conflicts"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:429
-#, c-format
-msgid "Updated %d path from %s"
-msgid_plural "Updated %d paths from %s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:436
-#, c-format
-msgid "Updated %d path from the index"
-msgid_plural "Updated %d paths from the index"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:459 builtin/checkout.c:462 builtin/checkout.c:465
-#: builtin/checkout.c:469
-#, c-format
-msgid "'%s' cannot be used with updating paths"
-msgstr ""
-
-#: builtin/checkout.c:479
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
-msgstr ""
-
-#: builtin/checkout.c:483
-#, c-format
-msgid "neither '%s' or '%s' is specified"
-msgstr ""
-
-#: builtin/checkout.c:487
-#, c-format
-msgid "'%s' must be used when '%s' is not specified"
-msgstr ""
-
-#: builtin/checkout.c:492 builtin/checkout.c:497
-#, c-format
-msgid "'%s' or '%s' cannot be used with %s"
-msgstr ""
-
-#: builtin/checkout.c:571 builtin/checkout.c:578
-#, c-format
-msgid "path '%s' is unmerged"
-msgstr ""
-
-#: builtin/checkout.c:753
-msgid "you need to resolve your current index first"
-msgstr ""
-
-#: builtin/checkout.c:809
-#, c-format
-msgid ""
-"cannot continue with staged changes in the following files:\n"
-"%s"
-msgstr ""
-
-#: builtin/checkout.c:902
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
-msgstr ""
-
-#: builtin/checkout.c:947
-msgid "HEAD is now at"
-msgstr ""
-
-#: builtin/checkout.c:951 builtin/clone.c:615 t/helper/test-fast-rebase.c:203
-msgid "unable to update HEAD"
-msgstr ""
-
-#: builtin/checkout.c:955
-#, c-format
-msgid "Reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:958
-#, c-format
-msgid "Already on '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:962
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:964 builtin/checkout.c:1398
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:966
-#, c-format
-msgid "Switched to branch '%s'\n"
-msgstr ""
-
-#: builtin/checkout.c:1017
-#, c-format
-msgid " ... and %d more.\n"
-msgstr ""
-
-#: builtin/checkout.c:1023
-#, c-format
-msgid ""
-"Warning: you are leaving %d commit behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgid_plural ""
-"Warning: you are leaving %d commits behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1042
-#, c-format
-msgid ""
-"If you want to keep it by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgid_plural ""
-"If you want to keep them by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:1077
-msgid "internal error in revision walk"
-msgstr ""
-
-#: builtin/checkout.c:1081
-msgid "Previous HEAD position was"
-msgstr ""
-
-#: builtin/checkout.c:1124 builtin/checkout.c:1393
-msgid "You are on a branch yet to be born"
-msgstr ""
-
-#: builtin/checkout.c:1206
-#, c-format
-msgid ""
-"'%s' could be both a local file and a tracking branch.\n"
-"Please use -- (and optionally --no-guess) to disambiguate"
-msgstr ""
-
-#: builtin/checkout.c:1213
-msgid ""
-"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
-"you can do so by fully qualifying the name with the --track option:\n"
-"\n"
-"    git checkout --track origin/<name>\n"
-"\n"
-"If you'd like to always have checkouts of an ambiguous <name> prefer\n"
-"one remote, e.g. the 'origin' remote, consider setting\n"
-"checkout.defaultRemote=origin in your config."
-msgstr ""
-
-#: builtin/checkout.c:1223
-#, c-format
-msgid "'%s' matched multiple (%d) remote tracking branches"
-msgstr ""
-
-#: builtin/checkout.c:1289
-msgid "only one reference expected"
-msgstr ""
-
-#: builtin/checkout.c:1306
-#, c-format
-msgid "only one reference expected, %d given."
-msgstr ""
-
-#: builtin/checkout.c:1352 builtin/worktree.c:338 builtin/worktree.c:508
-#, c-format
-msgid "invalid reference: %s"
-msgstr ""
-
-#: builtin/checkout.c:1365 builtin/checkout.c:1744
-#, c-format
-msgid "reference is not a tree: %s"
-msgstr ""
-
-#: builtin/checkout.c:1413
-#, c-format
-msgid "a branch is expected, got tag '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1415
-#, c-format
-msgid "a branch is expected, got remote branch '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1417 builtin/checkout.c:1426
-#, c-format
-msgid "a branch is expected, got '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1420
-#, c-format
-msgid "a branch is expected, got commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1429
-msgid ""
-"If you want to detach HEAD at the commit, try again with the --detach option."
-msgstr ""
-
-#: builtin/checkout.c:1442
-msgid ""
-"cannot switch branch while merging\n"
-"Consider \"git merge --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1446
-msgid ""
-"cannot switch branch in the middle of an am session\n"
-"Consider \"git am --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1450
-msgid ""
-"cannot switch branch while rebasing\n"
-"Consider \"git rebase --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1454
-msgid ""
-"cannot switch branch while cherry-picking\n"
-"Consider \"git cherry-pick --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1458
-msgid ""
-"cannot switch branch while reverting\n"
-"Consider \"git revert --quit\" or \"git worktree add\"."
-msgstr ""
-
-#: builtin/checkout.c:1462
-msgid "you are switching branch while bisecting"
-msgstr ""
-
-#: builtin/checkout.c:1469
-msgid "paths cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1472 builtin/checkout.c:1476 builtin/checkout.c:1480
-#, c-format
-msgid "'%s' cannot be used with switching branches"
-msgstr ""
-
-#: builtin/checkout.c:1484 builtin/checkout.c:1487 builtin/checkout.c:1490
-#: builtin/checkout.c:1495 builtin/checkout.c:1500
-#, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1497
-#, c-format
-msgid "'%s' cannot take <start-point>"
-msgstr ""
-
-#: builtin/checkout.c:1505
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1512
-msgid "missing branch or commit argument"
-msgstr ""
-
-#: builtin/checkout.c:1555
-msgid "perform a 3-way merge with the new branch"
-msgstr ""
-
-#: builtin/checkout.c:1556 builtin/log.c:1844 parse-options.h:354
-msgid "style"
-msgstr ""
-
-#: builtin/checkout.c:1557
-msgid "conflict style (merge, diff3, or zdiff3)"
-msgstr ""
-
-#: builtin/checkout.c:1569 builtin/worktree.c:560
-msgid "detach HEAD at named commit"
-msgstr ""
-
-#: builtin/checkout.c:1574
-msgid "force checkout (throw away local modifications)"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new-branch"
-msgstr ""
-
-#: builtin/checkout.c:1576
-msgid "new unparented branch"
-msgstr ""
-
-#: builtin/checkout.c:1578 builtin/merge.c:305
-msgid "update ignored files (default)"
-msgstr ""
-
-#: builtin/checkout.c:1581
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-
-#: builtin/checkout.c:1594
-msgid "checkout our version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1597
-msgid "checkout their version for unmerged files"
-msgstr ""
-
-#: builtin/checkout.c:1601
-msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
-
-#: builtin/checkout.c:1659
-#, c-format
-msgid "options '-%c', '-%c', and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/checkout.c:1700
-msgid "--track needs a branch name"
-msgstr ""
-
-#: builtin/checkout.c:1705
-#, c-format
-msgid "missing branch name; try -%c"
-msgstr ""
-
-#: builtin/checkout.c:1737
-#, c-format
-msgid "could not resolve %s"
-msgstr ""
-
-#: builtin/checkout.c:1753
-msgid "invalid path specification"
-msgstr ""
-
-#: builtin/checkout.c:1760
-#, c-format
-msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
-msgstr ""
-
-#: builtin/checkout.c:1764
-#, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
-
-#: builtin/checkout.c:1789
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
-msgstr ""
-
-#: builtin/checkout.c:1794
-msgid "you must specify path(s) to restore"
-msgstr ""
-
-#: builtin/checkout.c:1819 builtin/checkout.c:1821 builtin/checkout.c:1873
-#: builtin/checkout.c:1875 builtin/clone.c:130 builtin/remote.c:171
-#: builtin/remote.c:173 builtin/submodule--helper.c:3038
-#: builtin/submodule--helper.c:3371 builtin/worktree.c:556
-#: builtin/worktree.c:558
-msgid "branch"
-msgstr ""
-
-#: builtin/checkout.c:1820
-msgid "create and checkout a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1822
-msgid "create/reset and checkout a branch"
-msgstr ""
-
-#: builtin/checkout.c:1823
-msgid "create reflog for new branch"
-msgstr ""
-
-#: builtin/checkout.c:1825
-msgid "second guess 'git checkout <no-such-branch>' (default)"
-msgstr ""
-
-#: builtin/checkout.c:1826
-msgid "use overlay mode (default)"
-msgstr ""
-
-#: builtin/checkout.c:1874
-msgid "create and switch to a new branch"
-msgstr ""
-
-#: builtin/checkout.c:1876
-msgid "create/reset and switch to a branch"
-msgstr ""
-
-#: builtin/checkout.c:1878
-msgid "second guess 'git switch <no-such-branch>'"
-msgstr ""
-
-#: builtin/checkout.c:1880
-msgid "throw away local modifications"
-msgstr ""
-
-#: builtin/checkout.c:1916
-msgid "which tree-ish to checkout from"
-msgstr ""
-
-#: builtin/checkout.c:1918
-msgid "restore the index"
-msgstr ""
-
-#: builtin/checkout.c:1920
-msgid "restore the working tree (default)"
-msgstr ""
-
-#: builtin/checkout.c:1922
-msgid "ignore unmerged entries"
-msgstr ""
-
-#: builtin/checkout.c:1923
-msgid "use overlay mode"
-msgstr ""
-
-#: builtin/clean.c:29
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr ""
-
-#: builtin/clean.c:33
-#, c-format
-msgid "Removing %s\n"
-msgstr ""
-
-#: builtin/clean.c:34
-#, c-format
-msgid "Would remove %s\n"
-msgstr ""
-
-#: builtin/clean.c:35
-#, c-format
-msgid "Skipping repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:36
-#, c-format
-msgid "Would skip repository %s\n"
-msgstr ""
-
-#: builtin/clean.c:38
-#, c-format
-msgid "could not lstat %s\n"
-msgstr ""
-
-#: builtin/clean.c:39
-msgid "Refusing to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:40
-msgid "Would refuse to remove current working directory\n"
-msgstr ""
-
-#: builtin/clean.c:326 git-add--interactive.perl:593
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing\n"
-msgstr ""
-
-#: builtin/clean.c:330 git-add--interactive.perl:602
-#, c-format
-msgid ""
-"Prompt help:\n"
-"1          - select a single item\n"
-"3-5        - select a range of items\n"
-"2-3,6-9    - select multiple ranges\n"
-"foo        - select item based on unique prefix\n"
-"-...       - unselect specified items\n"
-"*          - choose all items\n"
-"           - (empty) finish selecting\n"
-msgstr ""
-
-#: builtin/clean.c:545 git-add--interactive.perl:568
-#: git-add--interactive.perl:573
-#, c-format, perl-format
-msgid "Huh (%s)?\n"
-msgstr ""
-
-#: builtin/clean.c:685
-#, c-format
-msgid "Input ignore patterns>> "
-msgstr ""
-
-#: builtin/clean.c:719
-#, c-format
-msgid "WARNING: Cannot find items matched by: %s"
-msgstr ""
-
-#: builtin/clean.c:740
-msgid "Select items to delete"
-msgstr ""
-
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:781
-#, c-format
-msgid "Remove %s [y/N]? "
-msgstr ""
-
-#: builtin/clean.c:812
-msgid ""
-"clean               - start cleaning\n"
-"filter by pattern   - exclude items from deletion\n"
-"select by numbers   - select items to be deleted by numbers\n"
-"ask each            - confirm each deletion (like \"rm -i\")\n"
-"quit                - stop cleaning\n"
-"help                - this screen\n"
-"?                   - help for prompt selection"
-msgstr ""
-
-#: builtin/clean.c:848
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/clean.c:864
-msgid "No more files to clean, exiting."
-msgstr ""
-
-#: builtin/clean.c:926
-msgid "do not print names of files removed"
-msgstr ""
-
-#: builtin/clean.c:928
-msgid "force"
-msgstr ""
-
-#: builtin/clean.c:929
-msgid "interactive cleaning"
-msgstr ""
-
-#: builtin/clean.c:931
-msgid "remove whole directories"
-msgstr ""
-
-#: builtin/clean.c:932 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:938 builtin/log.c:185 builtin/log.c:187
-#: builtin/ls-files.c:651 builtin/name-rev.c:585 builtin/name-rev.c:587
-#: builtin/show-ref.c:179
-msgid "pattern"
-msgstr ""
-
-#: builtin/clean.c:933
-msgid "add <pattern> to ignore rules"
-msgstr ""
-
-#: builtin/clean.c:934
-msgid "remove ignored files, too"
-msgstr ""
-
-#: builtin/clean.c:936
-msgid "remove only ignored files"
-msgstr ""
-
-#: builtin/clean.c:951
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
-msgstr ""
-
-#: builtin/clean.c:954
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
-msgstr ""
-
-#: builtin/clean.c:966
-msgid "-x and -X cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:47
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: builtin/clone.c:100
-msgid "don't clone shallow repository"
-msgstr ""
-
-#: builtin/clone.c:102
-msgid "don't create a checkout"
-msgstr ""
-
-#: builtin/clone.c:103 builtin/clone.c:105 builtin/init-db.c:542
-msgid "create a bare repository"
-msgstr ""
-
-#: builtin/clone.c:107
-msgid "create a mirror repository (implies bare)"
-msgstr ""
-
-#: builtin/clone.c:109
-msgid "to clone from a local repository"
-msgstr ""
-
-#: builtin/clone.c:111
-msgid "don't use local hardlinks, always copy"
-msgstr ""
-
-#: builtin/clone.c:113
-msgid "setup as shared repository"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "pathspec"
-msgstr ""
-
-#: builtin/clone.c:115
-msgid "initialize submodules in the clone"
-msgstr ""
-
-#: builtin/clone.c:119
-msgid "number of submodules cloned in parallel"
-msgstr ""
-
-#: builtin/clone.c:120 builtin/init-db.c:539
-msgid "template-directory"
-msgstr ""
-
-#: builtin/clone.c:121 builtin/init-db.c:540
-msgid "directory from which templates will be used"
-msgstr ""
-
-#: builtin/clone.c:123 builtin/clone.c:125 builtin/submodule--helper.c:1885
-#: builtin/submodule--helper.c:2719 builtin/submodule--helper.c:3378
-msgid "reference repository"
-msgstr ""
-
-#: builtin/clone.c:127 builtin/submodule--helper.c:1887
-#: builtin/submodule--helper.c:2721
-msgid "use --reference only while cloning"
-msgstr ""
-
-#: builtin/clone.c:128 builtin/column.c:27 builtin/fmt-merge-msg.c:27
-#: builtin/init-db.c:550 builtin/merge-file.c:48 builtin/merge.c:290
-#: builtin/pack-objects.c:3967 builtin/repack.c:669
-#: builtin/submodule--helper.c:3380 t/helper/test-simple-ipc.c:595
-#: t/helper/test-simple-ipc.c:597
-msgid "name"
-msgstr ""
-
-#: builtin/clone.c:129
-msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
-
-#: builtin/clone.c:131
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
-
-#: builtin/clone.c:133
-msgid "path to git-upload-pack on the remote"
-msgstr ""
-
-#: builtin/clone.c:134 builtin/fetch.c:182 builtin/grep.c:877
-#: builtin/pull.c:212
-msgid "depth"
-msgstr ""
-
-#: builtin/clone.c:135
-msgid "create a shallow clone of that depth"
-msgstr ""
-
-#: builtin/clone.c:136 builtin/fetch.c:184 builtin/pack-objects.c:3956
-#: builtin/pull.c:215
-msgid "time"
-msgstr ""
-
-#: builtin/clone.c:137
-msgid "create a shallow clone since a specific time"
-msgstr ""
-
-#: builtin/clone.c:138 builtin/fetch.c:186 builtin/fetch.c:212
-#: builtin/pull.c:218 builtin/pull.c:243 builtin/rebase.c:1050
-msgid "revision"
-msgstr ""
-
-#: builtin/clone.c:139 builtin/fetch.c:187 builtin/pull.c:219
-msgid "deepen history of shallow clone, excluding rev"
-msgstr ""
-
-#: builtin/clone.c:141 builtin/submodule--helper.c:1897
-#: builtin/submodule--helper.c:2735
-msgid "clone only one branch, HEAD or --branch"
-msgstr ""
-
-#: builtin/clone.c:143
-msgid "don't clone any tags, and make later fetches not to follow them"
-msgstr ""
-
-#: builtin/clone.c:145
-msgid "any cloned submodules will be shallow"
-msgstr ""
-
-#: builtin/clone.c:146 builtin/init-db.c:548
-msgid "gitdir"
-msgstr ""
-
-#: builtin/clone.c:147 builtin/init-db.c:549
-msgid "separate git dir from working tree"
-msgstr ""
-
-#: builtin/clone.c:148
-msgid "key=value"
-msgstr ""
-
-#: builtin/clone.c:149
-msgid "set config inside the new repository"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:234 builtin/push.c:575 builtin/send-pack.c:200
-msgid "server-specific"
-msgstr ""
-
-#: builtin/clone.c:151 builtin/fetch.c:207 builtin/ls-remote.c:77
-#: builtin/pull.c:235 builtin/push.c:575 builtin/send-pack.c:201
-msgid "option to transmit"
-msgstr ""
-
-#: builtin/clone.c:152 builtin/fetch.c:208 builtin/pull.c:238
-#: builtin/push.c:576
-msgid "use IPv4 addresses only"
-msgstr ""
-
-#: builtin/clone.c:154 builtin/fetch.c:210 builtin/pull.c:241
-#: builtin/push.c:578
-msgid "use IPv6 addresses only"
-msgstr ""
-
-#: builtin/clone.c:158
-msgid "apply partial clone filters to submodules"
-msgstr ""
-
-#: builtin/clone.c:160
-msgid "any cloned submodules will use their remote-tracking branch"
-msgstr ""
-
-#: builtin/clone.c:162
-msgid "initialize sparse-checkout file to include only files at root"
-msgstr ""
-
-#: builtin/clone.c:237
-#, c-format
-msgid "info: Could not add alternate for '%s': %s\n"
-msgstr ""
-
-#: builtin/clone.c:310
-#, c-format
-msgid "%s exists and is not a directory"
-msgstr ""
-
-#: builtin/clone.c:328
-#, c-format
-msgid "failed to start iterator over '%s'"
-msgstr ""
-
-#: builtin/clone.c:359
-#, c-format
-msgid "failed to create link '%s'"
-msgstr ""
-
-#: builtin/clone.c:363
-#, c-format
-msgid "failed to copy file to '%s'"
-msgstr ""
-
-#: builtin/clone.c:368
-#, c-format
-msgid "failed to iterate over '%s'"
-msgstr ""
-
-#: builtin/clone.c:395
-#, c-format
-msgid "done.\n"
-msgstr ""
-
-#: builtin/clone.c:409
-msgid ""
-"Clone succeeded, but checkout failed.\n"
-"You can inspect what was checked out with 'git status'\n"
-"and retry with 'git restore --source=HEAD :/'\n"
-msgstr ""
-
-#: builtin/clone.c:486
-#, c-format
-msgid "Could not find remote branch %s to clone."
-msgstr ""
-
-#: builtin/clone.c:603
-#, c-format
-msgid "unable to update %s"
-msgstr ""
-
-#: builtin/clone.c:651
-msgid "failed to initialize sparse-checkout"
-msgstr ""
-
-#: builtin/clone.c:674
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr ""
-
-#: builtin/clone.c:709
-msgid "unable to checkout working tree"
-msgstr ""
-
-#: builtin/clone.c:793
-msgid "unable to write parameters to config file"
-msgstr ""
-
-#: builtin/clone.c:856
-msgid "cannot repack to clean up"
-msgstr ""
-
-#: builtin/clone.c:858
-msgid "cannot unlink temporary alternates file"
-msgstr ""
-
-#: builtin/clone.c:901
-msgid "Too many arguments."
-msgstr ""
-
-#: builtin/clone.c:905 contrib/scalar/scalar.c:413
-msgid "You must specify a repository to clone."
-msgstr ""
-
-#: builtin/clone.c:918
-#, c-format
-msgid "options '%s' and '%s %s' cannot be used together"
-msgstr ""
-
-#: builtin/clone.c:935
-#, c-format
-msgid "repository '%s' does not exist"
-msgstr ""
-
-#: builtin/clone.c:939 builtin/fetch.c:2176
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr ""
-
-#: builtin/clone.c:949
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:955
-#, c-format
-msgid "repository path '%s' already exists and is not an empty directory."
-msgstr ""
-
-#: builtin/clone.c:969
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr ""
-
-#: builtin/clone.c:984 builtin/clone.c:1005 builtin/difftool.c:256
-#: builtin/log.c:2037 builtin/worktree.c:350 builtin/worktree.c:382
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr ""
-
-#: builtin/clone.c:989
-#, c-format
-msgid "could not create work tree dir '%s'"
-msgstr ""
-
-#: builtin/clone.c:1009
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1011
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr ""
-
-#: builtin/clone.c:1040
-msgid ""
-"clone --recursive is not compatible with both --reference and --reference-if-"
-"able"
-msgstr ""
-
-#: builtin/clone.c:1116 builtin/remote.c:201 builtin/remote.c:721
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr ""
-
-#: builtin/clone.c:1157
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1159
-msgid "--shallow-since is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1161
-msgid "--shallow-exclude is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1163
-msgid "--filter is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:1168
-msgid "source repository is shallow, ignoring --local"
-msgstr ""
-
-#: builtin/clone.c:1173
-msgid "--local is ignored"
-msgstr ""
-
-#: builtin/clone.c:1185
-msgid "cannot clone from filtered bundle"
-msgstr ""
-
-#: builtin/clone.c:1265 builtin/clone.c:1324
-msgid "remote transport reported error"
-msgstr ""
-
-#: builtin/clone.c:1277 builtin/clone.c:1289
-#, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr ""
-
-#: builtin/clone.c:1292
-msgid "You appear to have cloned an empty repository."
-msgstr ""
-
-#: builtin/column.c:10
-msgid "git column [<options>]"
-msgstr ""
-
-#: builtin/column.c:27
-msgid "lookup config vars"
-msgstr ""
-
-#: builtin/column.c:28 builtin/column.c:29
-msgid "layout to use"
-msgstr ""
-
-#: builtin/column.c:30
-msgid "maximum width"
-msgstr ""
-
-#: builtin/column.c:31
-msgid "padding space on left border"
-msgstr ""
-
-#: builtin/column.c:32
-msgid "padding space on right border"
-msgstr ""
-
-#: builtin/column.c:33
-msgid "padding space between columns"
-msgstr ""
-
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr ""
-
-#: builtin/commit-graph.c:13
-msgid ""
-"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
-msgstr ""
-
-#: builtin/commit-graph.c:16
-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 ""
-
-#: builtin/commit-graph.c:51 builtin/fetch.c:196 builtin/log.c:1813
-msgid "dir"
-msgstr ""
-
-#: builtin/commit-graph.c:52
-msgid "the object directory to store the graph"
-msgstr ""
-
-#: builtin/commit-graph.c:73
-msgid "if the commit-graph is split, only verify the tip file"
-msgstr ""
-
-#: builtin/commit-graph.c:100
-#, c-format
-msgid "Could not open commit-graph '%s'"
-msgstr ""
-
-#: builtin/commit-graph.c:137
-#, c-format
-msgid "unrecognized --split argument, %s"
-msgstr ""
-
-#: builtin/commit-graph.c:150
-#, c-format
-msgid "unexpected non-hex object ID: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:155
-#, c-format
-msgid "invalid object: %s"
-msgstr ""
-
-#: builtin/commit-graph.c:205
-msgid "start walk at all refs"
-msgstr ""
-
-#: builtin/commit-graph.c:207
-msgid "scan pack-indexes listed by stdin for commits"
-msgstr ""
-
-#: builtin/commit-graph.c:209
-msgid "start walk at commits listed by stdin"
-msgstr ""
-
-#: builtin/commit-graph.c:211
-msgid "include all commits already in the commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:213
-msgid "enable computation for changed paths"
-msgstr ""
-
-#: builtin/commit-graph.c:215
-msgid "allow writing an incremental commit-graph file"
-msgstr ""
-
-#: builtin/commit-graph.c:219
-msgid "maximum number of commits in a non-base split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:221
-msgid "maximum ratio between two levels of a split commit-graph"
-msgstr ""
-
-#: builtin/commit-graph.c:223
-msgid "only expire files older than a given date-time"
-msgstr ""
-
-#: builtin/commit-graph.c:225
-msgid "maximum number of changed-path Bloom filters to compute"
-msgstr ""
-
-#: builtin/commit-graph.c:251
-msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
-msgstr ""
-
-#: builtin/commit-graph.c:282
-msgid "Collecting commits from input"
-msgstr ""
-
-#: builtin/commit-graph.c:328 builtin/multi-pack-index.c:259
-#, c-format
-msgid "unrecognized subcommand: %s"
-msgstr ""
-
-#: builtin/commit-tree.c:18
-msgid ""
-"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F "
-"<file>)...] <tree>"
-msgstr ""
-
-#: builtin/commit-tree.c:31
-#, c-format
-msgid "duplicate parent %s ignored"
-msgstr ""
-
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:134 builtin/log.c:590
-#, c-format
-msgid "not a valid object name %s"
-msgstr ""
-
-#: builtin/commit-tree.c:94
-#, c-format
-msgid "git commit-tree: failed to read '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:96
-#, c-format
-msgid "git commit-tree: failed to close '%s'"
-msgstr ""
-
-#: builtin/commit-tree.c:109
-msgid "parent"
-msgstr ""
-
-#: builtin/commit-tree.c:110
-msgid "id of a parent commit object"
-msgstr ""
-
-#: builtin/commit-tree.c:112 builtin/commit.c:1626 builtin/merge.c:284
-#: builtin/notes.c:407 builtin/notes.c:573 builtin/stash.c:1666
-#: builtin/tag.c:455
-msgid "message"
-msgstr ""
-
-#: builtin/commit-tree.c:113 builtin/commit.c:1626
-msgid "commit message"
-msgstr ""
-
-#: builtin/commit-tree.c:116
-msgid "read commit log message from file"
-msgstr ""
-
-#: builtin/commit-tree.c:119 builtin/commit.c:1643 builtin/merge.c:303
-#: builtin/pull.c:180 builtin/revert.c:118
-msgid "GPG sign commit"
-msgstr ""
-
-#: builtin/commit-tree.c:131
-msgid "must give exactly one tree"
-msgstr ""
-
-#: builtin/commit-tree.c:138
-msgid "git commit-tree: failed to read"
-msgstr ""
-
-#: builtin/commit.c:43
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:48
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/commit.c:53
-msgid ""
-"You asked to amend the most recent commit, but doing so would make\n"
-"it empty. You can repeat your command with --allow-empty, or you can\n"
-"remove the commit entirely with \"git reset HEAD^\".\n"
-msgstr ""
-
-#: builtin/commit.c:58
-msgid ""
-"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
-"If you wish to commit it anyway, use:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:65
-msgid "Otherwise, please use 'git rebase --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:68
-msgid "Otherwise, please use 'git cherry-pick --skip'\n"
-msgstr ""
-
-#: builtin/commit.c:71
-msgid ""
-"and then use:\n"
-"\n"
-"    git cherry-pick --continue\n"
-"\n"
-"to resume cherry-picking the remaining commits.\n"
-"If you wish to skip this commit, use:\n"
-"\n"
-"    git cherry-pick --skip\n"
-"\n"
-msgstr ""
-
-#: builtin/commit.c:326
-msgid "failed to unpack HEAD tree object"
-msgstr ""
-
-#: builtin/commit.c:376
-msgid "No paths with --include/--only does not make sense."
-msgstr ""
-
-#: builtin/commit.c:388
-msgid "unable to create temporary index"
-msgstr ""
-
-#: builtin/commit.c:397
-msgid "interactive add failed"
-msgstr ""
-
-#: builtin/commit.c:412
-msgid "unable to update temporary index"
-msgstr ""
-
-#: builtin/commit.c:414
-msgid "Failed to update main cache tree"
-msgstr ""
-
-#: builtin/commit.c:439 builtin/commit.c:462 builtin/commit.c:510
-msgid "unable to write new_index file"
-msgstr ""
-
-#: builtin/commit.c:491
-msgid "cannot do a partial commit during a merge."
-msgstr ""
-
-#: builtin/commit.c:493
-msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
-
-#: builtin/commit.c:495
-msgid "cannot do a partial commit during a rebase."
-msgstr ""
-
-#: builtin/commit.c:503
-msgid "cannot read the index"
-msgstr ""
-
-#: builtin/commit.c:522
-msgid "unable to write temporary index file"
-msgstr ""
-
-#: builtin/commit.c:620
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr ""
-
-#: builtin/commit.c:622
-#, c-format
-msgid "commit '%s' has malformed author line"
-msgstr ""
-
-#: builtin/commit.c:641
-msgid "malformed --author parameter"
-msgstr ""
-
-#: builtin/commit.c:694
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-msgstr ""
-
-#: builtin/commit.c:750 builtin/commit.c:784 builtin/commit.c:1170
-#, c-format
-msgid "could not lookup commit %s"
-msgstr ""
-
-#: builtin/commit.c:762 builtin/shortlog.c:417
-#, c-format
-msgid "(reading log message from standard input)\n"
-msgstr ""
-
-#: builtin/commit.c:764
-msgid "could not read log from standard input"
-msgstr ""
-
-#: builtin/commit.c:768
-#, c-format
-msgid "could not read log file '%s'"
-msgstr ""
-
-#: builtin/commit.c:805
-#, c-format
-msgid "options '%s' and '%s:%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:817 builtin/commit.c:833
-msgid "could not read SQUASH_MSG"
-msgstr ""
-
-#: builtin/commit.c:824
-msgid "could not read MERGE_MSG"
-msgstr ""
-
-#: builtin/commit.c:884
-msgid "could not write commit template"
-msgstr ""
-
-#: builtin/commit.c:897
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/commit.c:899
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored, and an empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:903
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-msgstr ""
-
-#: builtin/commit.c:907
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-"An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/commit.c:919
-msgid ""
-"\n"
-"It looks like you may be committing a merge.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d MERGE_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:924
-msgid ""
-"\n"
-"It looks like you may be committing a cherry-pick.\n"
-"If this is not correct, please run\n"
-"\tgit update-ref -d CHERRY_PICK_HEAD\n"
-"and try again.\n"
-msgstr ""
-
-#: builtin/commit.c:951
-#, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:959
-#, c-format
-msgid "%sDate:      %s"
-msgstr ""
-
-#: builtin/commit.c:966
-#, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr ""
-
-#: builtin/commit.c:984
-msgid "Cannot read index"
-msgstr ""
-
-#: builtin/commit.c:1029
-msgid "unable to pass trailers to --trailers"
-msgstr ""
-
-#: builtin/commit.c:1069
-msgid "Error building trees"
-msgstr ""
-
-#: builtin/commit.c:1083 builtin/tag.c:317
-#, c-format
-msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
-
-#: builtin/commit.c:1128
-#, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
-msgstr ""
-
-#: builtin/commit.c:1142
-#, c-format
-msgid "Invalid ignored mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1160 builtin/commit.c:1450
-#, c-format
-msgid "Invalid untracked files mode '%s'"
-msgstr ""
-
-#: builtin/commit.c:1231
-msgid "You are in the middle of a merge -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1233
-msgid "You are in the middle of a cherry-pick -- cannot reword."
-msgstr ""
-
-#: builtin/commit.c:1236
-#, c-format
-msgid "reword option of '%s' and path '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1238
-#, c-format
-msgid "reword option of '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/commit.c:1263
-msgid "You have nothing to amend."
-msgstr ""
-
-#: builtin/commit.c:1266
-msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1268
-msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1270
-msgid "You are in the middle of a rebase -- cannot amend."
-msgstr ""
-
-#: builtin/commit.c:1290
-msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr ""
-
-#: builtin/commit.c:1337
-#, c-format
-msgid "unknown option: --fixup=%s:%s"
-msgstr ""
-
-#: builtin/commit.c:1354
-#, c-format
-msgid "paths '%s ...' with -a does not make sense"
-msgstr ""
-
-#: builtin/commit.c:1485 builtin/commit.c:1654
-msgid "show status concisely"
-msgstr ""
-
-#: builtin/commit.c:1487 builtin/commit.c:1656
-msgid "show branch information"
-msgstr ""
-
-#: builtin/commit.c:1489
-msgid "show stash information"
-msgstr ""
-
-#: builtin/commit.c:1491 builtin/commit.c:1658
-msgid "compute full ahead/behind values"
-msgstr ""
-
-#: builtin/commit.c:1493
-msgid "version"
-msgstr ""
-
-#: builtin/commit.c:1493 builtin/commit.c:1660 builtin/push.c:551
-#: builtin/worktree.c:765
-msgid "machine-readable output"
-msgstr ""
-
-#: builtin/commit.c:1496 builtin/commit.c:1662
-msgid "show status in long format (default)"
-msgstr ""
-
-#: builtin/commit.c:1499 builtin/commit.c:1665
-msgid "terminate entries with NUL"
-msgstr ""
-
-#: builtin/commit.c:1501 builtin/commit.c:1505 builtin/commit.c:1668
-#: builtin/fast-export.c:1172 builtin/fast-export.c:1175
-#: builtin/fast-export.c:1178 builtin/rebase.c:1139 parse-options.h:368
-msgid "mode"
-msgstr ""
-
-#: builtin/commit.c:1502 builtin/commit.c:1668
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1506
-msgid ""
-"show ignored files, optional modes: traditional, matching, no. (Default: "
-"traditional)"
-msgstr ""
-
-#: builtin/commit.c:1508 parse-options.h:197
-msgid "when"
-msgstr ""
-
-#: builtin/commit.c:1509
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-
-#: builtin/commit.c:1511
-msgid "list untracked files in columns"
-msgstr ""
-
-#: builtin/commit.c:1512
-msgid "do not detect renames"
-msgstr ""
-
-#: builtin/commit.c:1514
-msgid "detect renames, optionally set similarity index"
-msgstr ""
-
-#: builtin/commit.c:1537
-msgid "Unsupported combination of ignored and untracked-files arguments"
-msgstr ""
-
-#: builtin/commit.c:1619
-msgid "suppress summary after successful commit"
-msgstr ""
-
-#: builtin/commit.c:1620
-msgid "show diff in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1622
-msgid "Commit message options"
-msgstr ""
-
-#: builtin/commit.c:1623 builtin/merge.c:288 builtin/tag.c:457
-msgid "read message from file"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "author"
-msgstr ""
-
-#: builtin/commit.c:1624
-msgid "override author for commit"
-msgstr ""
-
-#: builtin/commit.c:1625 builtin/gc.c:551
-msgid "date"
-msgstr ""
-
-#: builtin/commit.c:1625
-msgid "override date for commit"
-msgstr ""
-
-#: builtin/commit.c:1627 builtin/commit.c:1628 builtin/commit.c:1634
-#: parse-options.h:360 ref-filter.h:89
-msgid "commit"
-msgstr ""
-
-#: builtin/commit.c:1627
-msgid "reuse and edit message from specified commit"
-msgstr ""
-
-#: builtin/commit.c:1628
-msgid "reuse message from specified commit"
-msgstr ""
-
-#. TRANSLATORS: Leave "[(amend|reword):]" as-is,
-#. and only translate <commit>.
-#.
-#: builtin/commit.c:1633
-msgid "[(amend|reword):]commit"
-msgstr ""
-
-#: builtin/commit.c:1633
-msgid ""
-"use autosquash formatted message to fixup or amend/reword specified commit"
-msgstr ""
-
-#: builtin/commit.c:1634
-msgid "use autosquash formatted message to squash specified commit"
-msgstr ""
-
-#: builtin/commit.c:1635
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
-msgstr ""
-
-#: builtin/commit.c:1636 builtin/interpret-trailers.c:111
-msgid "trailer"
-msgstr ""
-
-#: builtin/commit.c:1636
-msgid "add custom trailer(s)"
-msgstr ""
-
-#: builtin/commit.c:1637 builtin/log.c:1788 builtin/merge.c:306
-#: builtin/pull.c:146 builtin/revert.c:110
-msgid "add a Signed-off-by trailer"
-msgstr ""
-
-#: builtin/commit.c:1638
-msgid "use specified template file"
-msgstr ""
-
-#: builtin/commit.c:1639
-msgid "force edit of commit"
-msgstr ""
-
-#: builtin/commit.c:1641
-msgid "include status in commit message template"
-msgstr ""
-
-#: builtin/commit.c:1646
-msgid "Commit contents options"
-msgstr ""
-
-#: builtin/commit.c:1647
-msgid "commit all changed files"
-msgstr ""
-
-#: builtin/commit.c:1648
-msgid "add specified files to index for commit"
-msgstr ""
-
-#: builtin/commit.c:1649
-msgid "interactively add files"
-msgstr ""
-
-#: builtin/commit.c:1650
-msgid "interactively add changes"
-msgstr ""
-
-#: builtin/commit.c:1651
-msgid "commit only specified files"
-msgstr ""
-
-#: builtin/commit.c:1652
-msgid "bypass pre-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/commit.c:1653
-msgid "show what would be committed"
-msgstr ""
-
-#: builtin/commit.c:1666
-msgid "amend previous commit"
-msgstr ""
-
-#: builtin/commit.c:1667
-msgid "bypass post-rewrite hook"
-msgstr ""
-
-#: builtin/commit.c:1674
-msgid "ok to record an empty change"
-msgstr ""
-
-#: builtin/commit.c:1676
-msgid "ok to record a change with an empty message"
-msgstr ""
-
-#: builtin/commit.c:1752
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
-
-#: builtin/commit.c:1759
-msgid "could not read MERGE_MODE"
-msgstr ""
-
-#: builtin/commit.c:1780
-#, c-format
-msgid "could not read commit message: %s"
-msgstr ""
-
-#: builtin/commit.c:1787
-#, c-format
-msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
-
-#: builtin/commit.c:1792
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
-
-#: builtin/commit.c:1803
-#, c-format
-msgid "Aborting commit due to empty commit message body.\n"
-msgstr ""
-
-#: builtin/commit.c:1839
-msgid ""
-"repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full and quota is\n"
-"not exceeded, and then \"git restore --staged :/\" to recover."
-msgstr ""
-
-#: builtin/config.c:11
-msgid "git config [<options>]"
-msgstr ""
-
-#: builtin/config.c:109 builtin/env--helper.c:27
-#, c-format
-msgid "unrecognized --type argument, %s"
-msgstr ""
-
-#: builtin/config.c:121
-msgid "only one type at a time"
-msgstr ""
-
-#: builtin/config.c:130
-msgid "Config file location"
-msgstr ""
-
-#: builtin/config.c:131
-msgid "use global config file"
-msgstr ""
-
-#: builtin/config.c:132
-msgid "use system config file"
-msgstr ""
-
-#: builtin/config.c:133
-msgid "use repository config file"
-msgstr ""
-
-#: builtin/config.c:134
-msgid "use per-worktree config file"
-msgstr ""
-
-#: builtin/config.c:135
-msgid "use given config file"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "blob-id"
-msgstr ""
-
-#: builtin/config.c:136
-msgid "read config from given blob object"
-msgstr ""
-
-#: builtin/config.c:137
-msgid "Action"
-msgstr ""
-
-#: builtin/config.c:138
-msgid "get value: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:139
-msgid "get all values: key [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:140
-msgid "get values for regexp: name-regex [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:141
-msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
-
-#: builtin/config.c:142
-msgid "replace all matching variables: name value [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:143
-msgid "add a new variable: name value"
-msgstr ""
-
-#: builtin/config.c:144
-msgid "remove a variable: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:145
-msgid "remove all matches: name [value-pattern]"
-msgstr ""
-
-#: builtin/config.c:146
-msgid "rename section: old-name new-name"
-msgstr ""
-
-#: builtin/config.c:147
-msgid "remove a section: name"
-msgstr ""
-
-#: builtin/config.c:148
-msgid "list all"
-msgstr ""
-
-#: builtin/config.c:149
-msgid "use string equality when comparing values to 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:150
-msgid "open an editor"
-msgstr ""
-
-#: builtin/config.c:151
-msgid "find the color configured: slot [default]"
-msgstr ""
-
-#: builtin/config.c:152
-msgid "find the color setting: slot [stdout-is-tty]"
-msgstr ""
-
-#: builtin/config.c:153
-msgid "Type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:42 builtin/hash-object.c:97
-msgid "type"
-msgstr ""
-
-#: builtin/config.c:154 builtin/env--helper.c:43
-msgid "value is given this type"
-msgstr ""
-
-#: builtin/config.c:155
-msgid "value is \"true\" or \"false\""
-msgstr ""
-
-#: builtin/config.c:156
-msgid "value is decimal number"
-msgstr ""
-
-#: builtin/config.c:157
-msgid "value is --bool or --int"
-msgstr ""
-
-#: builtin/config.c:158
-msgid "value is --bool or string"
-msgstr ""
-
-#: builtin/config.c:159
-msgid "value is a path (file or directory name)"
-msgstr ""
-
-#: builtin/config.c:160
-msgid "value is an expiry date"
-msgstr ""
-
-#: builtin/config.c:161
-msgid "Other"
-msgstr ""
-
-#: builtin/config.c:162
-msgid "terminate values with NUL byte"
-msgstr ""
-
-#: builtin/config.c:163
-msgid "show variable names only"
-msgstr ""
-
-#: builtin/config.c:164
-msgid "respect include directives on lookup"
-msgstr ""
-
-#: builtin/config.c:165
-msgid "show origin of config (file, standard input, blob, command line)"
-msgstr ""
-
-#: builtin/config.c:166
-msgid "show scope of config (worktree, local, global, system, command)"
-msgstr ""
-
-#: builtin/config.c:167 builtin/env--helper.c:45
-msgid "value"
-msgstr ""
-
-#: builtin/config.c:167
-msgid "with --get, use default value when missing entry"
-msgstr ""
-
-#: builtin/config.c:181
-#, c-format
-msgid "wrong number of arguments, should be %d"
-msgstr ""
-
-#: builtin/config.c:183
-#, c-format
-msgid "wrong number of arguments, should be from %d to %d"
-msgstr ""
-
-#: builtin/config.c:339
-#, c-format
-msgid "invalid key pattern: %s"
-msgstr ""
-
-#: builtin/config.c:377
-#, c-format
-msgid "failed to format default config value: %s"
-msgstr ""
-
-#: builtin/config.c:441
-#, c-format
-msgid "cannot parse color '%s'"
-msgstr ""
-
-#: builtin/config.c:483
-msgid "unable to parse default color value"
-msgstr ""
-
-#: builtin/config.c:536 builtin/config.c:833
-msgid "not in a git directory"
-msgstr ""
-
-#: builtin/config.c:539
-msgid "writing to stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:542
-msgid "writing config blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:627
-#, c-format
-msgid ""
-"# This is Git's per-user configuration file.\n"
-"[user]\n"
-"# Please adapt and uncomment the following lines:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
-msgstr ""
-
-#: builtin/config.c:652
-msgid "only one config file at a time"
-msgstr ""
-
-#: builtin/config.c:658
-msgid "--local can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:660
-msgid "--blob can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:662
-msgid "--worktree can only be used inside a git repository"
-msgstr ""
-
-#: builtin/config.c:684
-msgid "$HOME not set"
-msgstr ""
-
-#: builtin/config.c:708
-msgid ""
-"--worktree cannot be used with multiple working trees unless the config\n"
-"extension worktreeConfig is enabled. Please read \"CONFIGURATION FILE\"\n"
-"section in \"git help worktree\" for details"
-msgstr ""
-
-#: builtin/config.c:743
-msgid "--get-color and variable type are incoherent"
-msgstr ""
-
-#: builtin/config.c:748
-msgid "only one action at a time"
-msgstr ""
-
-#: builtin/config.c:761
-msgid "--name-only is only applicable to --list or --get-regexp"
-msgstr ""
-
-#: builtin/config.c:767
-msgid ""
-"--show-origin is only applicable to --get, --get-all, --get-regexp, and --"
-"list"
-msgstr ""
-
-#: builtin/config.c:773
-msgid "--default is only applicable to --get"
-msgstr ""
-
-#: builtin/config.c:806
-msgid "--fixed-value only applies with 'value-pattern'"
-msgstr ""
-
-#: builtin/config.c:822
-#, c-format
-msgid "unable to read config file '%s'"
-msgstr ""
-
-#: builtin/config.c:825
-msgid "error processing config file(s)"
-msgstr ""
-
-#: builtin/config.c:835
-msgid "editing stdin is not supported"
-msgstr ""
-
-#: builtin/config.c:837
-msgid "editing blobs is not supported"
-msgstr ""
-
-#: builtin/config.c:851
-#, c-format
-msgid "cannot create configuration file %s"
-msgstr ""
-
-#: builtin/config.c:864
-#, c-format
-msgid ""
-"cannot overwrite multiple values with a single value\n"
-"       Use a regexp, --add or --replace-all to change %s."
-msgstr ""
-
-#: builtin/config.c:943 builtin/config.c:954
-#, c-format
-msgid "no such section: %s"
-msgstr ""
-
-#: builtin/count-objects.c:100
-msgid "print sizes in human readable format"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:227
-#, c-format
-msgid ""
-"The permissions on your socket directory are too loose; other\n"
-"users may be able to read your cached credentials. Consider running:\n"
-"\n"
-"\tchmod 0700 %s"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:276
-msgid "print debugging messages to stderr"
-msgstr ""
-
-#: builtin/credential-cache--daemon.c:316
-msgid "credential-cache--daemon unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-cache.c:180
-msgid "credential-cache unavailable; no unix socket support"
-msgstr ""
-
-#: builtin/credential-store.c:66
-#, c-format
-msgid "unable to get credential storage lock in %d ms"
-msgstr ""
-
-#: builtin/describe.c:26
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr ""
-
-#: builtin/describe.c:27
-msgid "git describe [<options>] --dirty"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "head"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "lightweight"
-msgstr ""
-
-#: builtin/describe.c:63
-msgid "annotated"
-msgstr ""
-
-#: builtin/describe.c:277
-#, c-format
-msgid "annotated tag %s not available"
-msgstr ""
-
-#: builtin/describe.c:281
-#, c-format
-msgid "tag '%s' is externally known as '%s'"
-msgstr ""
-
-#: builtin/describe.c:328
-#, c-format
-msgid "no tag exactly matches '%s'"
-msgstr ""
-
-#: builtin/describe.c:330
-#, c-format
-msgid "No exact match on refs or tags, searching to describe\n"
-msgstr ""
-
-#: builtin/describe.c:397
-#, c-format
-msgid "finished search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:424
-#, c-format
-msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
-msgstr ""
-
-#: builtin/describe.c:428
-#, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
-msgstr ""
-
-#: builtin/describe.c:458
-#, c-format
-msgid "traversed %lu commits\n"
-msgstr ""
-
-#: builtin/describe.c:461
-#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-
-#: builtin/describe.c:529
-#, c-format
-msgid "describe %s\n"
-msgstr ""
-
-#: builtin/describe.c:532
-#, c-format
-msgid "Not a valid object name %s"
-msgstr ""
-
-#: builtin/describe.c:540
-#, c-format
-msgid "%s is neither a commit nor blob"
-msgstr ""
-
-#: builtin/describe.c:554
-msgid "find the tag that comes after the commit"
-msgstr ""
-
-#: builtin/describe.c:555
-msgid "debug search strategy on stderr"
-msgstr ""
-
-#: builtin/describe.c:556
-msgid "use any ref"
-msgstr ""
-
-#: builtin/describe.c:557
-msgid "use any tag, even unannotated"
-msgstr ""
-
-#: builtin/describe.c:558
-msgid "always use long format"
-msgstr ""
-
-#: builtin/describe.c:559
-msgid "only follow first parent"
-msgstr ""
-
-#: builtin/describe.c:562
-msgid "only output exact matches"
-msgstr ""
-
-#: builtin/describe.c:564
-msgid "consider <n> most recent tags (default: 10)"
-msgstr ""
-
-#: builtin/describe.c:566
-msgid "only consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:568
-msgid "do not consider tags matching <pattern>"
-msgstr ""
-
-#: builtin/describe.c:570 builtin/name-rev.c:595
-msgid "show abbreviated commit object as fallback"
-msgstr ""
-
-#: builtin/describe.c:571 builtin/describe.c:574
-msgid "mark"
-msgstr ""
-
-#: builtin/describe.c:572
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr ""
-
-#: builtin/describe.c:575
-msgid "append <mark> on broken working tree (default: \"-broken\")"
-msgstr ""
-
-#: builtin/describe.c:622
-msgid "No names found, cannot describe anything."
-msgstr ""
-
-#: builtin/describe.c:673 builtin/describe.c:675
-#, c-format
-msgid "option '%s' and commit-ishes cannot be used together"
-msgstr ""
-
-#: builtin/diff-tree.c:157
-msgid "--merge-base only works with two commits"
-msgstr ""
-
-#: builtin/diff.c:92
-#, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr ""
-
-#: builtin/diff.c:259
-#, c-format
-msgid "invalid option: %s"
-msgstr ""
-
-#: builtin/diff.c:376
-#, c-format
-msgid "%s...%s: no merge base"
-msgstr ""
-
-#: builtin/diff.c:491
-msgid "Not a git repository"
-msgstr ""
-
-#: builtin/diff.c:537 builtin/grep.c:700
-#, c-format
-msgid "invalid object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:548
-#, c-format
-msgid "more than two blobs given: '%s'"
-msgstr ""
-
-#: builtin/diff.c:553
-#, c-format
-msgid "unhandled object '%s' given."
-msgstr ""
-
-#: builtin/diff.c:587
-#, c-format
-msgid "%s...%s: multiple merge bases, using %s"
-msgstr ""
-
-#: builtin/difftool.c:31
-msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
-msgstr ""
-
-#: builtin/difftool.c:287
-#, c-format
-msgid "could not read symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:289
-#, c-format
-msgid "could not read symlink file %s"
-msgstr ""
-
-#: builtin/difftool.c:297
-#, c-format
-msgid "could not read object %s for symlink %s"
-msgstr ""
-
-#: builtin/difftool.c:421
-msgid ""
-"combined diff formats ('-c' and '--cc') are not supported in\n"
-"directory diff mode ('-d' and '--dir-diff')."
-msgstr ""
-
-#: builtin/difftool.c:626
-#, c-format
-msgid "both files modified: '%s' and '%s'."
-msgstr ""
-
-#: builtin/difftool.c:628
-msgid "working tree file has been left."
-msgstr ""
-
-#: builtin/difftool.c:639
-#, c-format
-msgid "temporary files exist in '%s'."
-msgstr ""
-
-#: builtin/difftool.c:640
-msgid "you may want to cleanup or recover these."
-msgstr ""
-
-#: builtin/difftool.c:645
-#, c-format
-msgid "failed: %d"
-msgstr ""
-
-#: builtin/difftool.c:690
-msgid "use `diff.guitool` instead of `diff.tool`"
-msgstr ""
-
-#: builtin/difftool.c:692
-msgid "perform a full-directory diff"
-msgstr ""
-
-#: builtin/difftool.c:694
-msgid "do not prompt before launching a diff tool"
-msgstr ""
-
-#: builtin/difftool.c:699
-msgid "use symlinks in dir-diff mode"
-msgstr ""
-
-#: builtin/difftool.c:700
-msgid "tool"
-msgstr ""
-
-#: builtin/difftool.c:701
-msgid "use the specified diff tool"
-msgstr ""
-
-#: builtin/difftool.c:703
-msgid "print a list of diff tools that may be used with `--tool`"
-msgstr ""
-
-#: builtin/difftool.c:706
-msgid ""
-"make 'git-difftool' exit when an invoked diff tool returns a non-zero exit "
-"code"
-msgstr ""
-
-#: builtin/difftool.c:709
-msgid "specify a custom command for viewing diffs"
-msgstr ""
-
-#: builtin/difftool.c:710
-msgid "passed to `diff`"
-msgstr ""
-
-#: builtin/difftool.c:726
-msgid "difftool requires worktree or --no-index"
-msgstr ""
-
-#: builtin/difftool.c:745
-msgid "no <tool> given for --tool=<tool>"
-msgstr ""
-
-#: builtin/difftool.c:752
-msgid "no <cmd> given for --extcmd=<cmd>"
-msgstr ""
-
-#: builtin/env--helper.c:6
-msgid "git env--helper --type=[bool|ulong] <options> <env-var>"
-msgstr ""
-
-#: builtin/env--helper.c:46
-msgid "default for git_env_*(...) to fall back on"
-msgstr ""
-
-#: builtin/env--helper.c:48
-msgid "be quiet only use git_env_*() value as exit code"
-msgstr ""
-
-#: builtin/env--helper.c:67
-#, c-format
-msgid "option `--default' expects a boolean value with `--type=bool`, not `%s`"
-msgstr ""
-
-#: builtin/env--helper.c:82
-#, c-format
-msgid ""
-"option `--default' expects an unsigned long value with `--type=ulong`, not `"
-"%s`"
-msgstr ""
-
-#: builtin/fast-export.c:29
-msgid "git fast-export [<rev-list-opts>]"
-msgstr ""
-
-#: builtin/fast-export.c:843
-msgid "Error: Cannot export nested tags unless --mark-tags is specified."
-msgstr ""
-
-#: builtin/fast-export.c:1152
-msgid "--anonymize-map token cannot be empty"
-msgstr ""
-
-#: builtin/fast-export.c:1171
-msgid "show progress after <n> objects"
-msgstr ""
-
-#: builtin/fast-export.c:1173
-msgid "select handling of signed tags"
-msgstr ""
-
-#: builtin/fast-export.c:1176
-msgid "select handling of tags that tag filtered objects"
-msgstr ""
-
-#: builtin/fast-export.c:1179
-msgid "select handling of commit messages in an alternate encoding"
-msgstr ""
-
-#: builtin/fast-export.c:1182
-msgid "dump marks to this file"
-msgstr ""
-
-#: builtin/fast-export.c:1184
-msgid "import marks from this file"
-msgstr ""
-
-#: builtin/fast-export.c:1188
-msgid "import marks from this file if it exists"
-msgstr ""
-
-#: builtin/fast-export.c:1190
-msgid "fake a tagger when tags lack one"
-msgstr ""
-
-#: builtin/fast-export.c:1192
-msgid "output full tree for each commit"
-msgstr ""
-
-#: builtin/fast-export.c:1194
-msgid "use the done feature to terminate the stream"
-msgstr ""
-
-#: builtin/fast-export.c:1195
-msgid "skip output of blob data"
-msgstr ""
-
-#: builtin/fast-export.c:1196 builtin/log.c:1860
-msgid "refspec"
-msgstr ""
-
-#: builtin/fast-export.c:1197
-msgid "apply refspec to exported refs"
-msgstr ""
-
-#: builtin/fast-export.c:1198
-msgid "anonymize output"
-msgstr ""
-
-#: builtin/fast-export.c:1199
-msgid "from:to"
-msgstr ""
-
-#: builtin/fast-export.c:1200
-msgid "convert <from> to <to> in anonymized output"
-msgstr ""
-
-#: builtin/fast-export.c:1203
-msgid "reference parents which are not in fast-export stream by object id"
-msgstr ""
-
-#: builtin/fast-export.c:1205
-msgid "show original object ids of blobs/commits"
-msgstr ""
-
-#: builtin/fast-export.c:1207
-msgid "label tags with mark ids"
-msgstr ""
-
-#: builtin/fast-import.c:3097
-#, c-format
-msgid "Missing from marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3099
-#, c-format
-msgid "Missing to marks for submodule '%s'"
-msgstr ""
-
-#: builtin/fast-import.c:3234
-#, c-format
-msgid "Expected 'mark' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3239
-#, c-format
-msgid "Expected 'to' command, got %s"
-msgstr ""
-
-#: builtin/fast-import.c:3331
-msgid "Expected format name:filename for submodule rewrite option"
-msgstr ""
-
-#: builtin/fast-import.c:3386
-#, c-format
-msgid "feature '%s' forbidden in input without --allow-unsafe-features"
-msgstr ""
-
-#: builtin/fetch-pack.c:246
-#, c-format
-msgid "Lockfile created but not reported: %s"
-msgstr ""
-
-#: builtin/fetch.c:36
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/fetch.c:37
-msgid "git fetch [<options>] <group>"
-msgstr ""
-
-#: builtin/fetch.c:38
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
-
-#: builtin/fetch.c:39
-msgid "git fetch --all [<options>]"
-msgstr ""
-
-#: builtin/fetch.c:124
-msgid "fetch.parallel cannot be negative"
-msgstr ""
-
-#: builtin/fetch.c:147 builtin/pull.c:189
-msgid "fetch from all remotes"
-msgstr ""
-
-#: builtin/fetch.c:149 builtin/pull.c:249
-msgid "set upstream for git pull/fetch"
-msgstr ""
-
-#: builtin/fetch.c:151 builtin/pull.c:192
-msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
-
-#: builtin/fetch.c:153
-msgid "use atomic transaction to update references"
-msgstr ""
-
-#: builtin/fetch.c:155 builtin/pull.c:195
-msgid "path to upload pack on remote end"
-msgstr ""
-
-#: builtin/fetch.c:156
-msgid "force overwrite of local reference"
-msgstr ""
-
-#: builtin/fetch.c:158
-msgid "fetch from multiple remotes"
-msgstr ""
-
-#: builtin/fetch.c:160 builtin/pull.c:199
-msgid "fetch all tags and associated objects"
-msgstr ""
-
-#: builtin/fetch.c:162
-msgid "do not fetch all tags (--no-tags)"
-msgstr ""
-
-#: builtin/fetch.c:164
-msgid "number of submodules fetched in parallel"
-msgstr ""
-
-#: builtin/fetch.c:166
-msgid "modify the refspec to place all refs within refs/prefetch/"
-msgstr ""
-
-#: builtin/fetch.c:168 builtin/pull.c:202
-msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
-
-#: builtin/fetch.c:170
-msgid "prune local tags no longer on remote and clobber changed tags"
-msgstr ""
-
-#: builtin/fetch.c:171 builtin/fetch.c:199 builtin/pull.c:123
-msgid "on-demand"
-msgstr ""
-
-#: builtin/fetch.c:172
-msgid "control recursive fetching of submodules"
-msgstr ""
-
-#: builtin/fetch.c:177
-msgid "write fetched references to the FETCH_HEAD file"
-msgstr ""
-
-#: builtin/fetch.c:178 builtin/pull.c:210
-msgid "keep downloaded pack"
-msgstr ""
-
-#: builtin/fetch.c:180
-msgid "allow updating of HEAD ref"
-msgstr ""
-
-#: builtin/fetch.c:183 builtin/fetch.c:189 builtin/pull.c:213
-#: builtin/pull.c:222
-msgid "deepen history of shallow clone"
-msgstr ""
-
-#: builtin/fetch.c:185 builtin/pull.c:216
-msgid "deepen history of shallow repository based on time"
-msgstr ""
-
-#: builtin/fetch.c:191 builtin/pull.c:225
-msgid "convert to a complete repository"
-msgstr ""
-
-#: builtin/fetch.c:194
-msgid "re-fetch without negotiating common commits"
-msgstr ""
-
-#: builtin/fetch.c:197
-msgid "prepend this to submodule path output"
-msgstr ""
-
-#: builtin/fetch.c:200
-msgid ""
-"default for recursive fetching of submodules (lower priority than config "
-"files)"
-msgstr ""
-
-#: builtin/fetch.c:204 builtin/pull.c:228
-msgid "accept refs that update .git/shallow"
-msgstr ""
-
-#: builtin/fetch.c:205 builtin/pull.c:230
-msgid "refmap"
-msgstr ""
-
-#: builtin/fetch.c:206 builtin/pull.c:231
-msgid "specify fetch refmap"
-msgstr ""
-
-#: builtin/fetch.c:213 builtin/pull.c:244
-msgid "report that we have only objects reachable from this object"
-msgstr ""
-
-#: builtin/fetch.c:215
-msgid "do not fetch a packfile; instead, print ancestors of negotiation tips"
-msgstr ""
-
-#: builtin/fetch.c:218 builtin/fetch.c:220
-msgid "run 'maintenance --auto' after fetching"
-msgstr ""
-
-#: builtin/fetch.c:222 builtin/pull.c:247
-msgid "check for forced-updates on all updated branches"
-msgstr ""
-
-#: builtin/fetch.c:224
-msgid "write the commit-graph after fetching"
-msgstr ""
-
-#: builtin/fetch.c:226
-msgid "accept refspecs from stdin"
-msgstr ""
-
-#: builtin/fetch.c:618
-msgid "couldn't find remote ref HEAD"
-msgstr ""
-
-#: builtin/fetch.c:893
-#, c-format
-msgid "object %s not found"
-msgstr ""
-
-#: builtin/fetch.c:897
-msgid "[up to date]"
-msgstr ""
-
-#: builtin/fetch.c:909 builtin/fetch.c:927 builtin/fetch.c:999
-msgid "[rejected]"
-msgstr ""
-
-#: builtin/fetch.c:911
-msgid "can't fetch in current branch"
-msgstr ""
-
-#: builtin/fetch.c:912
-msgid "checked out in another worktree"
-msgstr ""
-
-#: builtin/fetch.c:922
-msgid "[tag update]"
-msgstr ""
-
-#: builtin/fetch.c:923 builtin/fetch.c:960 builtin/fetch.c:982
-#: builtin/fetch.c:994
-msgid "unable to update local ref"
-msgstr ""
-
-#: builtin/fetch.c:927
-msgid "would clobber existing tag"
-msgstr ""
-
-#: builtin/fetch.c:949
-msgid "[new tag]"
-msgstr ""
-
-#: builtin/fetch.c:952
-msgid "[new branch]"
-msgstr ""
-
-#: builtin/fetch.c:955
-msgid "[new ref]"
-msgstr ""
-
-#: builtin/fetch.c:994
-msgid "forced update"
-msgstr ""
-
-#: builtin/fetch.c:999
-msgid "non-fast-forward"
-msgstr ""
-
-#: builtin/fetch.c:1102
-msgid ""
-"fetch normally indicates which branches had a forced update,\n"
-"but that check has been disabled; to re-enable, use '--show-forced-updates'\n"
-"flag or run 'git config fetch.showForcedUpdates true'"
-msgstr ""
-
-#: builtin/fetch.c:1106
-#, c-format
-msgid ""
-"it took %.2f seconds to check forced updates; you can use\n"
-"'--no-show-forced-updates' or run 'git config fetch.showForcedUpdates "
-"false'\n"
-"to avoid this check\n"
-msgstr ""
-
-#: builtin/fetch.c:1136
-#, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr ""
-
-#: builtin/fetch.c:1156
-#, c-format
-msgid "rejected %s because shallow roots are not allowed to be updated"
-msgstr ""
-
-#: builtin/fetch.c:1259 builtin/fetch.c:1418
-#, c-format
-msgid "From %.*s\n"
-msgstr ""
-
-#: builtin/fetch.c:1269
-#, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
-msgstr ""
-
-#: builtin/fetch.c:1377
-#, c-format
-msgid "   (%s will become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1378
-#, c-format
-msgid "   (%s has become dangling)"
-msgstr ""
-
-#: builtin/fetch.c:1421
-msgid "[deleted]"
-msgstr ""
-
-#: builtin/fetch.c:1422 builtin/remote.c:1153
-msgid "(none)"
-msgstr ""
-
-#: builtin/fetch.c:1446
-#, c-format
-msgid "refusing to fetch into branch '%s' checked out at '%s'"
-msgstr ""
-
-#: builtin/fetch.c:1466
-#, c-format
-msgid "option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
-
-#: builtin/fetch.c:1469
-#, c-format
-msgid "option \"%s\" is ignored for %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1496
-#, c-format
-msgid "the object %s does not exist"
-msgstr ""
-
-#: builtin/fetch.c:1748
-msgid "multiple branches detected, incompatible with --set-upstream"
-msgstr ""
-
-#: builtin/fetch.c:1760
-#, c-format
-msgid ""
-"could not set upstream of HEAD to '%s' from '%s' when it does not point to "
-"any branch."
-msgstr ""
-
-#: builtin/fetch.c:1773
-msgid "not setting upstream for a remote remote-tracking branch"
-msgstr ""
-
-#: builtin/fetch.c:1775
-msgid "not setting upstream for a remote tag"
-msgstr ""
-
-#: builtin/fetch.c:1777
-msgid "unknown branch type"
-msgstr ""
-
-#: builtin/fetch.c:1779
-msgid ""
-"no source branch found;\n"
-"you need to specify exactly one branch with the --set-upstream option"
-msgstr ""
-
-#: builtin/fetch.c:1904 builtin/fetch.c:1967
-#, c-format
-msgid "Fetching %s\n"
-msgstr ""
-
-#: builtin/fetch.c:1914 builtin/fetch.c:1969
-#, c-format
-msgid "could not fetch %s"
-msgstr ""
-
-#: builtin/fetch.c:1926
-#, c-format
-msgid "could not fetch '%s' (exit code: %d)\n"
-msgstr ""
-
-#: builtin/fetch.c:2030
-msgid ""
-"no remote repository specified; please specify either a URL or a\n"
-"remote name from which new revisions should be fetched"
-msgstr ""
-
-#: builtin/fetch.c:2066
-msgid "you need to specify a tag name"
-msgstr ""
-
-#: builtin/fetch.c:2156
-msgid "--negotiate-only needs one or more --negotiation-tip=*"
-msgstr ""
-
-#: builtin/fetch.c:2160
-msgid "negative depth in --deepen is not supported"
-msgstr ""
-
-#: builtin/fetch.c:2169
-msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2186
-msgid "fetch --all does not take a repository argument"
-msgstr ""
-
-#: builtin/fetch.c:2188
-msgid "fetch --all does not make sense with refspecs"
-msgstr ""
-
-#: builtin/fetch.c:2197
-#, c-format
-msgid "no such remote or remote group: %s"
-msgstr ""
-
-#: builtin/fetch.c:2205
-msgid "fetching a group and specifying refspecs does not make sense"
-msgstr ""
-
-#: builtin/fetch.c:2221
-msgid "must supply remote when using --negotiate-only"
-msgstr ""
-
-#: builtin/fetch.c:2226
-msgid "protocol does not support --negotiate-only, exiting"
-msgstr ""
-
-#: builtin/fetch.c:2246
-msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
-msgstr ""
-
-#: builtin/fetch.c:2250
-msgid "--atomic can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fetch.c:2254
-msgid "--stdin can only be used when fetching from one remote"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:7
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:19
-msgid "populate log with at most <n> entries from shortlog"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:22
-msgid "alias for --log (deprecated)"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:25
-msgid "text"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:26
-msgid "use <text> as start of message"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:28
-msgid "use <name> instead of the real target branch"
-msgstr ""
-
-#: builtin/fmt-merge-msg.c:29
-msgid "file to read from"
-msgstr ""
-
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [--points-at <object>]"
-msgstr ""
-
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:13
-msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
-msgstr ""
-
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for shells"
-msgstr ""
-
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for perl"
-msgstr ""
-
-#: builtin/for-each-ref.c:35
-msgid "quote placeholders suitably for python"
-msgstr ""
-
-#: builtin/for-each-ref.c:37
-msgid "quote placeholders suitably for Tcl"
-msgstr ""
-
-#: builtin/for-each-ref.c:40
-msgid "show only <n> matched refs"
-msgstr ""
-
-#: builtin/for-each-ref.c:42 builtin/tag.c:482
-msgid "respect format colors"
-msgstr ""
-
-#: builtin/for-each-ref.c:45
-msgid "print only refs which points at the given object"
-msgstr ""
-
-#: builtin/for-each-ref.c:47
-msgid "print only refs that are merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:48
-msgid "print only refs that are not merged"
-msgstr ""
-
-#: builtin/for-each-ref.c:49
-msgid "print only refs which contain the commit"
-msgstr ""
-
-#: builtin/for-each-ref.c:50
-msgid "print only refs which don't contain the commit"
-msgstr ""
-
-#: builtin/for-each-repo.c:9
-msgid "git for-each-repo --config=<config> <command-args>"
-msgstr ""
-
-#: builtin/for-each-repo.c:34
-msgid "config"
-msgstr ""
-
-#: builtin/for-each-repo.c:35
-msgid "config key storing a list of repository paths"
-msgstr ""
-
-#: builtin/for-each-repo.c:43
-msgid "missing --config=<config>"
-msgstr ""
-
-#: builtin/fsck.c:69 builtin/fsck.c:128 builtin/fsck.c:129
-msgid "unknown"
-msgstr ""
-
-#. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:78 builtin/fsck.c:100
-#, c-format
-msgid "error in %s %s: %s"
-msgstr ""
-
-#. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:94
-#, c-format
-msgid "warning in %s %s: %s"
-msgstr ""
-
-#: builtin/fsck.c:124 builtin/fsck.c:127
-#, c-format
-msgid "broken link from %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:136
-msgid "wrong object type in link"
-msgstr ""
-
-#: builtin/fsck.c:152
-#, c-format
-msgid ""
-"broken link from %7s %s\n"
-"              to %7s %s"
-msgstr ""
-
-#: builtin/fsck.c:264
-#, c-format
-msgid "missing %s %s"
-msgstr ""
-
-#: builtin/fsck.c:291
-#, c-format
-msgid "unreachable %s %s"
-msgstr ""
-
-#: builtin/fsck.c:311
-#, c-format
-msgid "dangling %s %s"
-msgstr ""
-
-#: builtin/fsck.c:321
-msgid "could not create lost-found"
-msgstr ""
-
-#: builtin/fsck.c:332
-#, c-format
-msgid "could not finish '%s'"
-msgstr ""
-
-#: builtin/fsck.c:349
-#, c-format
-msgid "Checking %s"
-msgstr ""
-
-#: builtin/fsck.c:387
-#, c-format
-msgid "Checking connectivity (%d objects)"
-msgstr ""
-
-#: builtin/fsck.c:406
-#, c-format
-msgid "Checking %s %s"
-msgstr ""
-
-#: builtin/fsck.c:411
-msgid "broken links"
-msgstr ""
-
-#: builtin/fsck.c:420
-#, c-format
-msgid "root %s"
-msgstr ""
-
-#: builtin/fsck.c:428
-#, c-format
-msgid "tagged %s %s (%s) in %s"
-msgstr ""
-
-#: builtin/fsck.c:457
-#, c-format
-msgid "%s: object corrupt or missing"
-msgstr ""
-
-#: builtin/fsck.c:482
-#, c-format
-msgid "%s: invalid reflog entry %s"
-msgstr ""
-
-#: builtin/fsck.c:496
-#, c-format
-msgid "Checking reflog %s->%s"
-msgstr ""
-
-#: builtin/fsck.c:530
-#, c-format
-msgid "%s: invalid sha1 pointer %s"
-msgstr ""
-
-#: builtin/fsck.c:537
-#, c-format
-msgid "%s: not a commit"
-msgstr ""
-
-#: builtin/fsck.c:591
-msgid "notice: No default references"
-msgstr ""
-
-#: builtin/fsck.c:621
-#, c-format
-msgid "%s: hash-path mismatch, found at: %s"
-msgstr ""
-
-#: builtin/fsck.c:624
-#, c-format
-msgid "%s: object corrupt or missing: %s"
-msgstr ""
-
-#: builtin/fsck.c:628
-#, c-format
-msgid "%s: object is of unknown type '%s': %s"
-msgstr ""
-
-#: builtin/fsck.c:645
-#, c-format
-msgid "%s: object could not be parsed: %s"
-msgstr ""
-
-#: builtin/fsck.c:665
-#, c-format
-msgid "bad sha1 file: %s"
-msgstr ""
-
-#: builtin/fsck.c:686
-msgid "Checking object directory"
-msgstr ""
-
-#: builtin/fsck.c:689
-msgid "Checking object directories"
-msgstr ""
-
-#: builtin/fsck.c:705
-#, c-format
-msgid "Checking %s link"
-msgstr ""
-
-#: builtin/fsck.c:710 builtin/index-pack.c:862
-#, c-format
-msgid "invalid %s"
-msgstr ""
-
-#: builtin/fsck.c:717
-#, c-format
-msgid "%s points to something strange (%s)"
-msgstr ""
-
-#: builtin/fsck.c:723
-#, c-format
-msgid "%s: detached HEAD points at nothing"
-msgstr ""
-
-#: builtin/fsck.c:727
-#, c-format
-msgid "notice: %s points to an unborn branch (%s)"
-msgstr ""
-
-#: builtin/fsck.c:739
-msgid "Checking cache tree"
-msgstr ""
-
-#: builtin/fsck.c:744
-#, c-format
-msgid "%s: invalid sha1 pointer in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:753
-msgid "non-tree in cache-tree"
-msgstr ""
-
-#: builtin/fsck.c:784
-msgid "git fsck [<options>] [<object>...]"
-msgstr ""
-
-#: builtin/fsck.c:790
-msgid "show unreachable objects"
-msgstr ""
-
-#: builtin/fsck.c:791
-msgid "show dangling objects"
-msgstr ""
-
-#: builtin/fsck.c:792
-msgid "report tags"
-msgstr ""
-
-#: builtin/fsck.c:793
-msgid "report root nodes"
-msgstr ""
-
-#: builtin/fsck.c:794
-msgid "make index objects head nodes"
-msgstr ""
-
-#: builtin/fsck.c:795
-msgid "make reflogs head nodes (default)"
-msgstr ""
-
-#: builtin/fsck.c:796
-msgid "also consider packs and alternate objects"
-msgstr ""
-
-#: builtin/fsck.c:797
-msgid "check only connectivity"
-msgstr ""
-
-#: builtin/fsck.c:798 builtin/mktag.c:75
-msgid "enable more strict checking"
-msgstr ""
-
-#: builtin/fsck.c:800
-msgid "write dangling objects in .git/lost-found"
-msgstr ""
-
-#: builtin/fsck.c:801 builtin/prune.c:146
-msgid "show progress"
-msgstr ""
-
-#: builtin/fsck.c:802
-msgid "show verbose names for reachable objects"
-msgstr ""
-
-#: builtin/fsck.c:862 builtin/index-pack.c:261
-msgid "Checking objects"
-msgstr ""
-
-#: builtin/fsck.c:890
-#, c-format
-msgid "%s: object missing"
-msgstr ""
-
-#: builtin/fsck.c:901
-#, c-format
-msgid "invalid parameter: expected sha1, got '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:13
-msgid "git fsmonitor--daemon start [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:14
-msgid "git fsmonitor--daemon run [<options>]"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:15
-msgid "git fsmonitor--daemon stop"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:16
-msgid "git fsmonitor--daemon status"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:38 builtin/fsmonitor--daemon.c:47
-#, c-format
-msgid "value of '%s' out of range: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:57
-#, c-format
-msgid "value of '%s' not bool or int: %d"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:99
-#, c-format
-msgid "fsmonitor-daemon is watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:104
-#, c-format
-msgid "fsmonitor-daemon is not watching '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:170
-#, c-format
-msgid "could not create fsmonitor cookie '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:753
-#, c-format
-msgid "fsmonitor: cookie_result '%d' != SEEN"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1187
-#, c-format
-msgid "could not start IPC thread pool on '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1199
-msgid "could not start fsmonitor listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1297
-msgid "could not initialize listener thread"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1328 builtin/fsmonitor--daemon.c:1383
-#, c-format
-msgid "fsmonitor--daemon is already running '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1332
-#, c-format
-msgid "running fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1387
-#, c-format
-msgid "starting fsmonitor-daemon in '%s'\n"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1413
-msgid "daemon failed to start"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1416
-msgid "daemon not online yet"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1419
-msgid "daemon terminated"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1429
-msgid "detach from console"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1432
-msgid "use <n> ipc worker threads"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1435
-msgid "max seconds to wait for background daemon startup"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1449
-#, c-format
-msgid "invalid 'ipc-threads' value (%d)"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1464
-#, c-format
-msgid "Unhandled subcommand '%s'"
-msgstr ""
-
-#: builtin/fsmonitor--daemon.c:1477
-msgid "fsmonitor--daemon not supported on this platform"
-msgstr ""
-
-#: builtin/gc.c:39
-msgid "git gc [<options>]"
-msgstr ""
-
-#: builtin/gc.c:93
-#, c-format
-msgid "Failed to fstat %s: %s"
-msgstr ""
-
-#: builtin/gc.c:129
-#, c-format
-msgid "failed to parse '%s' value '%s'"
-msgstr ""
-
-#: builtin/gc.c:488 builtin/init-db.c:57
-#, c-format
-msgid "cannot stat '%s'"
-msgstr ""
-
-#: builtin/gc.c:504
-#, c-format
-msgid ""
-"The last gc run reported the following. Please correct the root cause\n"
-"and remove %s\n"
-"Automatic cleanup will not be performed until the file is removed.\n"
-"\n"
-"%s"
-msgstr ""
-
-#: builtin/gc.c:552
-msgid "prune unreferenced objects"
-msgstr ""
-
-#: builtin/gc.c:554
-msgid "be more thorough (increased runtime)"
-msgstr ""
-
-#: builtin/gc.c:555
-msgid "enable auto-gc mode"
-msgstr ""
-
-#: builtin/gc.c:558
-msgid "force running gc even if there may be another gc running"
-msgstr ""
-
-#: builtin/gc.c:561
-msgid "repack all other packs except the largest pack"
-msgstr ""
-
-#: builtin/gc.c:577
-#, c-format
-msgid "failed to parse gc.logexpiry value %s"
-msgstr ""
-
-#: builtin/gc.c:588
-#, c-format
-msgid "failed to parse prune expiry value %s"
-msgstr ""
-
-#: builtin/gc.c:608
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:610
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:611
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
-msgstr ""
-
-#: builtin/gc.c:652
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
-msgstr ""
-
-#: builtin/gc.c:707
-msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
-msgstr ""
-
-#: builtin/gc.c:717
-msgid ""
-"git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
-msgstr ""
-
-#: builtin/gc.c:747
-msgid "--no-schedule is not allowed"
-msgstr ""
-
-#: builtin/gc.c:752
-#, c-format
-msgid "unrecognized --schedule argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:870
-msgid "failed to write commit-graph"
-msgstr ""
-
-#: builtin/gc.c:906
-msgid "failed to prefetch remotes"
-msgstr ""
-
-#: builtin/gc.c:1022
-msgid "failed to start 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1039
-msgid "failed to finish 'git pack-objects' process"
-msgstr ""
-
-#: builtin/gc.c:1090
-msgid "failed to write multi-pack-index"
-msgstr ""
-
-#: builtin/gc.c:1106
-msgid "'git multi-pack-index expire' failed"
-msgstr ""
-
-#: builtin/gc.c:1165
-msgid "'git multi-pack-index repack' failed"
-msgstr ""
-
-#: builtin/gc.c:1174
-msgid ""
-"skipping incremental-repack task because core.multiPackIndex is disabled"
-msgstr ""
-
-#: builtin/gc.c:1278
-#, c-format
-msgid "lock file '%s' exists, skipping maintenance"
-msgstr ""
-
-#: builtin/gc.c:1308
-#, c-format
-msgid "task '%s' failed"
-msgstr ""
-
-#: builtin/gc.c:1390
-#, c-format
-msgid "'%s' is not a valid task"
-msgstr ""
-
-#: builtin/gc.c:1395
-#, c-format
-msgid "task '%s' cannot be selected multiple times"
-msgstr ""
-
-#: builtin/gc.c:1410
-msgid "run tasks based on the state of the repository"
-msgstr ""
-
-#: builtin/gc.c:1411
-msgid "frequency"
-msgstr ""
-
-#: builtin/gc.c:1412
-msgid "run tasks based on frequency"
-msgstr ""
-
-#: builtin/gc.c:1415
-msgid "do not report progress or other information over stderr"
-msgstr ""
-
-#: builtin/gc.c:1416
-msgid "task"
-msgstr ""
-
-#: builtin/gc.c:1417
-msgid "run a specific task"
-msgstr ""
-
-#: builtin/gc.c:1434
-msgid "use at most one of --auto and --schedule=<frequency>"
-msgstr ""
-
-#: builtin/gc.c:1477
-msgid "failed to run 'git config'"
-msgstr ""
-
-#: builtin/gc.c:1629
-#, c-format
-msgid "failed to expand path '%s'"
-msgstr ""
-
-#: builtin/gc.c:1656 builtin/gc.c:1694
-msgid "failed to start launchctl"
-msgstr ""
-
-#: builtin/gc.c:1769 builtin/gc.c:2237
-#, c-format
-msgid "failed to create directories for '%s'"
-msgstr ""
-
-#: builtin/gc.c:1796
-#, c-format
-msgid "failed to bootstrap service %s"
-msgstr ""
-
-#: builtin/gc.c:1889
-msgid "failed to create temp xml file"
-msgstr ""
-
-#: builtin/gc.c:1979
-msgid "failed to start schtasks"
-msgstr ""
-
-#: builtin/gc.c:2063
-msgid "failed to run 'crontab -l'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2080
-msgid "failed to run 'crontab'; your system might not support 'cron'"
-msgstr ""
-
-#: builtin/gc.c:2084
-msgid "failed to open stdin of 'crontab'"
-msgstr ""
-
-#: builtin/gc.c:2126
-msgid "'crontab' died"
-msgstr ""
-
-#: builtin/gc.c:2191
-msgid "failed to start systemctl"
-msgstr ""
-
-#: builtin/gc.c:2201
-msgid "failed to run systemctl"
-msgstr ""
-
-#: builtin/gc.c:2210 builtin/gc.c:2215 builtin/worktree.c:63
-#: builtin/worktree.c:1024
-#, c-format
-msgid "failed to delete '%s'"
-msgstr ""
-
-#: builtin/gc.c:2395
-#, c-format
-msgid "unrecognized --scheduler argument '%s'"
-msgstr ""
-
-#: builtin/gc.c:2420
-msgid "neither systemd timers nor crontab are available"
-msgstr ""
-
-#: builtin/gc.c:2435
-#, c-format
-msgid "%s scheduler is not available"
-msgstr ""
-
-#: builtin/gc.c:2449
-msgid "another process is scheduling background maintenance"
-msgstr ""
-
-#: builtin/gc.c:2471
-msgid "git maintenance start [--scheduler=<scheduler>]"
-msgstr ""
-
-#: builtin/gc.c:2480
-msgid "scheduler"
-msgstr ""
-
-#: builtin/gc.c:2481
-msgid "scheduler to trigger git maintenance run"
-msgstr ""
-
-#: builtin/gc.c:2495
-msgid "failed to add repo to global config"
-msgstr ""
-
-#: builtin/gc.c:2504
-msgid "git maintenance <subcommand> [<options>]"
-msgstr ""
-
-#: builtin/gc.c:2523
-#, c-format
-msgid "invalid subcommand: %s"
-msgstr ""
-
-#: builtin/grep.c:32
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
-
-#: builtin/grep.c:241
-#, c-format
-msgid "grep: failed to create thread: %s"
-msgstr ""
-
-#: builtin/grep.c:295
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
-msgstr ""
-
-#. TRANSLATORS: %s is the configuration
-#. variable for tweaking threads, currently
-#. grep.threads
-#.
-#: builtin/grep.c:303 builtin/index-pack.c:1587 builtin/index-pack.c:1791
-#: builtin/pack-objects.c:3150
-#, c-format
-msgid "no threads support, ignoring %s"
-msgstr ""
-
-#: builtin/grep.c:490 builtin/grep.c:619 builtin/grep.c:659
-#, c-format
-msgid "unable to read tree (%s)"
-msgstr ""
-
-#: builtin/grep.c:674
-#, c-format
-msgid "unable to grep from object of type %s"
-msgstr ""
-
-#: builtin/grep.c:754
-#, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr ""
-
-#: builtin/grep.c:852
-msgid "search in index instead of in the work tree"
-msgstr ""
-
-#: builtin/grep.c:854
-msgid "find in contents not managed by git"
-msgstr ""
-
-#: builtin/grep.c:856
-msgid "search in both tracked and untracked files"
-msgstr ""
-
-#: builtin/grep.c:858
-msgid "ignore files specified via '.gitignore'"
-msgstr ""
-
-#: builtin/grep.c:860
-msgid "recursively search in each submodule"
-msgstr ""
-
-#: builtin/grep.c:863
-msgid "show non-matching lines"
-msgstr ""
-
-#: builtin/grep.c:865
-msgid "case insensitive matching"
-msgstr ""
-
-#: builtin/grep.c:867
-msgid "match patterns only at word boundaries"
-msgstr ""
-
-#: builtin/grep.c:869
-msgid "process binary files as text"
-msgstr ""
-
-#: builtin/grep.c:871
-msgid "don't match patterns in binary files"
-msgstr ""
-
-#: builtin/grep.c:874
-msgid "process binary files with textconv filters"
-msgstr ""
-
-#: builtin/grep.c:876
-msgid "search in subdirectories (default)"
-msgstr ""
-
-#: builtin/grep.c:878
-msgid "descend at most <depth> levels"
-msgstr ""
-
-#: builtin/grep.c:882
-msgid "use extended POSIX regular expressions"
-msgstr ""
-
-#: builtin/grep.c:885
-msgid "use basic POSIX regular expressions (default)"
-msgstr ""
-
-#: builtin/grep.c:888
-msgid "interpret patterns as fixed strings"
-msgstr ""
-
-#: builtin/grep.c:891
-msgid "use Perl-compatible regular expressions"
-msgstr ""
-
-#: builtin/grep.c:894
-msgid "show line numbers"
-msgstr ""
-
-#: builtin/grep.c:895
-msgid "show column number of first match"
-msgstr ""
-
-#: builtin/grep.c:896
-msgid "don't show filenames"
-msgstr ""
-
-#: builtin/grep.c:897
-msgid "show filenames"
-msgstr ""
-
-#: builtin/grep.c:899
-msgid "show filenames relative to top directory"
-msgstr ""
-
-#: builtin/grep.c:901
-msgid "show only filenames instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:903
-msgid "synonym for --files-with-matches"
-msgstr ""
-
-#: builtin/grep.c:906
-msgid "show only the names of files without match"
-msgstr ""
-
-#: builtin/grep.c:908
-msgid "print NUL after filenames"
-msgstr ""
-
-#: builtin/grep.c:911
-msgid "show only matching parts of a line"
-msgstr ""
-
-#: builtin/grep.c:913
-msgid "show the number of matches instead of matching lines"
-msgstr ""
-
-#: builtin/grep.c:914
-msgid "highlight matches"
-msgstr ""
-
-#: builtin/grep.c:916
-msgid "print empty line between matches from different files"
-msgstr ""
-
-#: builtin/grep.c:918
-msgid "show filename only once above matches from same file"
-msgstr ""
-
-#: builtin/grep.c:921
-msgid "show <n> context lines before and after matches"
-msgstr ""
-
-#: builtin/grep.c:924
-msgid "show <n> context lines before matches"
-msgstr ""
-
-#: builtin/grep.c:926
-msgid "show <n> context lines after matches"
-msgstr ""
-
-#: builtin/grep.c:928
-msgid "use <n> worker threads"
-msgstr ""
-
-#: builtin/grep.c:929
-msgid "shortcut for -C NUM"
-msgstr ""
-
-#: builtin/grep.c:932
-msgid "show a line with the function name before matches"
-msgstr ""
-
-#: builtin/grep.c:934
-msgid "show the surrounding function"
-msgstr ""
-
-#: builtin/grep.c:937
-msgid "read patterns from file"
-msgstr ""
-
-#: builtin/grep.c:939
-msgid "match <pattern>"
-msgstr ""
-
-#: builtin/grep.c:941
-msgid "combine patterns specified with -e"
-msgstr ""
-
-#: builtin/grep.c:953
-msgid "indicate hit with exit status without output"
-msgstr ""
-
-#: builtin/grep.c:955
-msgid "show only matches from files that match all patterns"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "pager"
-msgstr ""
-
-#: builtin/grep.c:958
-msgid "show matching files in the pager"
-msgstr ""
-
-#: builtin/grep.c:962
-msgid "allow calling of grep(1) (ignored by this build)"
-msgstr ""
-
-#: builtin/grep.c:1028
-msgid "no pattern given"
-msgstr ""
-
-#: builtin/grep.c:1064
-msgid "--no-index or --untracked cannot be used with revs"
-msgstr ""
-
-#: builtin/grep.c:1072
-#, c-format
-msgid "unable to resolve revision: %s"
-msgstr ""
-
-#: builtin/grep.c:1102
-msgid "--untracked not supported with --recurse-submodules"
-msgstr ""
-
-#: builtin/grep.c:1106
-msgid "invalid option combination, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1109 builtin/pack-objects.c:4084
-msgid "no threads support, ignoring --threads"
-msgstr ""
-
-#: builtin/grep.c:1112 builtin/index-pack.c:1584 builtin/pack-objects.c:3147
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr ""
-
-#: builtin/grep.c:1146
-msgid "--open-files-in-pager only works on the worktree"
-msgstr ""
-
-#: builtin/grep.c:1179
-msgid "--[no-]exclude-standard cannot be used for tracked contents"
-msgstr ""
-
-#: builtin/grep.c:1187
-msgid "both --cached and trees are given"
-msgstr ""
-
-#: builtin/hash-object.c:83
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
-msgstr ""
-
-#: builtin/hash-object.c:97
-msgid "object type"
-msgstr ""
-
-#: builtin/hash-object.c:98
-msgid "write the object into the object database"
-msgstr ""
-
-#: builtin/hash-object.c:100
-msgid "read the object from stdin"
-msgstr ""
-
-#: builtin/hash-object.c:102
-msgid "store file as is without filters"
-msgstr ""
-
-#: builtin/hash-object.c:103
-msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
-msgstr ""
-
-#: builtin/hash-object.c:104
-msgid "process file as it were from this path"
-msgstr ""
-
-#: builtin/help.c:57
-msgid "print all available commands"
-msgstr ""
-
-#: builtin/help.c:60
-msgid "show external commands in --all"
-msgstr ""
-
-#: builtin/help.c:61
-msgid "show aliases in --all"
-msgstr ""
-
-#: builtin/help.c:62
-msgid "exclude guides"
-msgstr ""
-
-#: builtin/help.c:63
-msgid "show man page"
-msgstr ""
-
-#: builtin/help.c:64
-msgid "show manual in web browser"
-msgstr ""
-
-#: builtin/help.c:66
-msgid "show info page"
-msgstr ""
-
-#: builtin/help.c:68
-msgid "print command description"
-msgstr ""
-
-#: builtin/help.c:70
-msgid "print list of useful guides"
-msgstr ""
-
-#: builtin/help.c:72
-msgid "print all configuration variable names"
-msgstr ""
-
-#: builtin/help.c:84
-msgid "git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"
-msgstr ""
-
-#: builtin/help.c:201
-#, c-format
-msgid "unrecognized help format '%s'"
-msgstr ""
-
-#: builtin/help.c:227
-msgid "Failed to start emacsclient."
-msgstr ""
-
-#: builtin/help.c:240
-msgid "Failed to parse emacsclient version."
-msgstr ""
-
-#: builtin/help.c:248
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr ""
-
-#: builtin/help.c:266 builtin/help.c:288 builtin/help.c:298 builtin/help.c:306
-#, c-format
-msgid "failed to exec '%s'"
-msgstr ""
-
-#: builtin/help.c:344
-#, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
-msgstr ""
-
-#: builtin/help.c:356
-#, c-format
-msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
-msgstr ""
-
-#: builtin/help.c:471
-#, c-format
-msgid "'%s': unknown man viewer."
-msgstr ""
-
-#: builtin/help.c:487
-msgid "no man viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:494
-msgid "no info viewer handled the request"
-msgstr ""
-
-#: builtin/help.c:555 builtin/help.c:566 git.c:348
-#, c-format
-msgid "'%s' is aliased to '%s'"
-msgstr ""
-
-#: builtin/help.c:569 git.c:380
-#, c-format
-msgid "bad alias.%s string: %s"
-msgstr ""
-
-#: builtin/help.c:611
-#, c-format
-msgid "the '%s' option doesn't take any non-option arguments"
-msgstr ""
-
-#: builtin/help.c:631
-msgid ""
-"the '--no-[external-commands|aliases]' options can only be used with '--all'"
-msgstr ""
-
-#: builtin/help.c:643 builtin/help.c:671
-#, c-format
-msgid "usage: %s%s"
-msgstr ""
-
-#: builtin/help.c:666
-msgid "'git help config' for more information"
-msgstr ""
-
-#: builtin/hook.c:10
-msgid "git hook run [--ignore-missing] <hook-name> [-- <hook-args>]"
-msgstr ""
-
-#: builtin/hook.c:30
-msgid "silently ignore missing requested <hook-name>"
-msgstr ""
-
-#: builtin/index-pack.c:221
-#, c-format
-msgid "object type mismatch at %s"
-msgstr ""
-
-#: builtin/index-pack.c:241
-#, c-format
-msgid "did not receive expected object %s"
-msgstr ""
-
-#: builtin/index-pack.c:244
-#, c-format
-msgid "object %s: expected type %s, found %s"
-msgstr ""
-
-#: builtin/index-pack.c:294
-#, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:304
-msgid "early EOF"
-msgstr ""
-
-#: builtin/index-pack.c:305
-msgid "read error on input"
-msgstr ""
-
-#: builtin/index-pack.c:317
-msgid "used more bytes than were available"
-msgstr ""
-
-#: builtin/index-pack.c:324 builtin/pack-objects.c:754
-msgid "pack too large for current definition of off_t"
-msgstr ""
-
-#: builtin/index-pack.c:329
-#, c-format
-msgid "pack exceeds maximum allowed size (%s)"
-msgstr ""
-
-#: builtin/index-pack.c:362
-msgid "pack signature mismatch"
-msgstr ""
-
-#: builtin/index-pack.c:364
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr ""
-
-#: builtin/index-pack.c:380
-#, c-format
-msgid "pack has bad object at offset %<PRIuMAX>: %s"
-msgstr ""
-
-#: builtin/index-pack.c:485
-#, c-format
-msgid "inflate returned %d"
-msgstr ""
-
-#: builtin/index-pack.c:534
-msgid "offset value overflow for delta base object"
-msgstr ""
-
-#: builtin/index-pack.c:542
-msgid "delta base offset is out of bound"
-msgstr ""
-
-#: builtin/index-pack.c:550
-#, c-format
-msgid "unknown object type %d"
-msgstr ""
-
-#: builtin/index-pack.c:581
-msgid "cannot pread pack file"
-msgstr ""
-
-#: builtin/index-pack.c:583
-#, c-format
-msgid "premature end of pack file, %<PRIuMAX> byte missing"
-msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:609
-msgid "serious inflate inconsistency"
-msgstr ""
-
-#: builtin/index-pack.c:754 builtin/index-pack.c:760 builtin/index-pack.c:784
-#: builtin/index-pack.c:823 builtin/index-pack.c:832
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
-msgstr ""
-
-#: builtin/index-pack.c:757 builtin/pack-objects.c:290
-#: builtin/pack-objects.c:350 builtin/pack-objects.c:456
-#, c-format
-msgid "unable to read %s"
-msgstr ""
-
-#: builtin/index-pack.c:821
-#, c-format
-msgid "cannot read existing object info %s"
-msgstr ""
-
-#: builtin/index-pack.c:829
-#, c-format
-msgid "cannot read existing object %s"
-msgstr ""
-
-#: builtin/index-pack.c:843
-#, c-format
-msgid "invalid blob object %s"
-msgstr ""
-
-#: builtin/index-pack.c:846 builtin/index-pack.c:865
-msgid "fsck error in packed object"
-msgstr ""
-
-#: builtin/index-pack.c:867
-#, c-format
-msgid "Not all child objects of %s are reachable"
-msgstr ""
-
-#: builtin/index-pack.c:928 builtin/index-pack.c:975
-msgid "failed to apply delta"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Receiving objects"
-msgstr ""
-
-#: builtin/index-pack.c:1161
-msgid "Indexing objects"
-msgstr ""
-
-#: builtin/index-pack.c:1195
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr ""
-
-#: builtin/index-pack.c:1200
-msgid "cannot fstat packfile"
-msgstr ""
-
-#: builtin/index-pack.c:1203
-msgid "pack has junk at the end"
-msgstr ""
-
-#: builtin/index-pack.c:1215
-msgid "confusion beyond insanity in parse_pack_objects()"
-msgstr ""
-
-#: builtin/index-pack.c:1238
-msgid "Resolving deltas"
-msgstr ""
-
-#: builtin/index-pack.c:1249 builtin/pack-objects.c:2913
-#, c-format
-msgid "unable to create thread: %s"
-msgstr ""
-
-#: builtin/index-pack.c:1282
-msgid "confusion beyond insanity"
-msgstr ""
-
-#: builtin/index-pack.c:1288
-#, c-format
-msgid "completed with %d local object"
-msgid_plural "completed with %d local objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1300
-#, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr ""
-
-#: builtin/index-pack.c:1304
-#, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1328
-#, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr ""
-
-#: builtin/index-pack.c:1423
-#, c-format
-msgid "local object %s is corrupt"
-msgstr ""
-
-#: builtin/index-pack.c:1445
-#, c-format
-msgid "packfile name '%s' does not end with '.%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1469
-#, c-format
-msgid "cannot write %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1477
-#, c-format
-msgid "cannot close written %s file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1494
-#, c-format
-msgid "unable to rename temporary '*.%s' file to '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1519
-msgid "error while closing pack file"
-msgstr ""
-
-#: builtin/index-pack.c:1578 builtin/pack-objects.c:3158
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr ""
-
-#: builtin/index-pack.c:1648
-#, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1650
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1698
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1705
-#, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1748
-msgid "Cannot come back to cwd"
-msgstr ""
-
-#: builtin/index-pack.c:1802 builtin/index-pack.c:1805
-#: builtin/index-pack.c:1825 builtin/index-pack.c:1829
-#, c-format
-msgid "bad %s"
-msgstr ""
-
-#: builtin/index-pack.c:1835 builtin/init-db.c:379 builtin/init-db.c:614
-#, c-format
-msgid "unknown hash algorithm '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:1856
-msgid "--stdin requires a git repository"
-msgstr ""
-
-#: builtin/index-pack.c:1873
-msgid "--verify with no packfile name given"
-msgstr ""
-
-#: builtin/index-pack.c:1939 builtin/unpack-objects.c:584
-msgid "fsck error in pack objects"
-msgstr ""
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr ""
-
-#: builtin/init-db.c:68
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr ""
-
-#: builtin/init-db.c:80
-#, c-format
-msgid "cannot readlink '%s'"
-msgstr ""
-
-#: builtin/init-db.c:82
-#, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr ""
-
-#: builtin/init-db.c:88
-#, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr ""
-
-#: builtin/init-db.c:92
-#, c-format
-msgid "ignoring template %s"
-msgstr ""
-
-#: builtin/init-db.c:123
-#, c-format
-msgid "templates not found in %s"
-msgstr ""
-
-#: builtin/init-db.c:138
-#, c-format
-msgid "not copying templates from '%s': %s"
-msgstr ""
-
-#: builtin/init-db.c:263
-#, c-format
-msgid "invalid initial branch name: '%s'"
-msgstr ""
-
-#: builtin/init-db.c:354
-#, c-format
-msgid "unable to handle file type %d"
-msgstr ""
-
-#: builtin/init-db.c:357
-#, c-format
-msgid "unable to move %s to %s"
-msgstr ""
-
-#: builtin/init-db.c:373
-msgid "attempt to reinitialize repository with different hash"
-msgstr ""
-
-#: builtin/init-db.c:397 builtin/init-db.c:400
-#, c-format
-msgid "%s already exists"
-msgstr ""
-
-#: builtin/init-db.c:432
-#, c-format
-msgid "re-init: ignored --initial-branch=%s"
-msgstr ""
-
-#: builtin/init-db.c:463
-#, c-format
-msgid "Reinitialized existing shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:464
-#, c-format
-msgid "Reinitialized existing Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:468
-#, c-format
-msgid "Initialized empty shared Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:469
-#, c-format
-msgid "Initialized empty Git repository in %s%s\n"
-msgstr ""
-
-#: builtin/init-db.c:518
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-
-#: builtin/init-db.c:544
-msgid "permissions"
-msgstr ""
-
-#: builtin/init-db.c:545
-msgid "specify that the git repository is to be shared amongst several users"
-msgstr ""
-
-#: builtin/init-db.c:551
-msgid "override the name of the initial branch"
-msgstr ""
-
-#: builtin/init-db.c:552 builtin/verify-pack.c:74
-msgid "hash"
-msgstr ""
-
-#: builtin/init-db.c:553 builtin/show-index.c:22 builtin/verify-pack.c:75
-msgid "specify the hash algorithm to use"
-msgstr ""
-
-#: builtin/init-db.c:591 builtin/init-db.c:596
-#, c-format
-msgid "cannot mkdir %s"
-msgstr ""
-
-#: builtin/init-db.c:600 builtin/init-db.c:655
-#, c-format
-msgid "cannot chdir to %s"
-msgstr ""
-
-#: builtin/init-db.c:627
-#, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-msgstr ""
-
-#: builtin/init-db.c:679
-#, c-format
-msgid "Cannot access work tree '%s'"
-msgstr ""
-
-#: builtin/init-db.c:684
-msgid "--separate-git-dir incompatible with bare repository"
-msgstr ""
-
-#: builtin/interpret-trailers.c:16
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
-msgstr ""
-
-#: builtin/interpret-trailers.c:95
-msgid "edit files in place"
-msgstr ""
-
-#: builtin/interpret-trailers.c:96
-msgid "trim empty trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:99
-msgid "where to place the new trailer"
-msgstr ""
-
-#: builtin/interpret-trailers.c:101
-msgid "action if trailer already exists"
-msgstr ""
-
-#: builtin/interpret-trailers.c:103
-msgid "action if trailer is missing"
-msgstr ""
-
-#: builtin/interpret-trailers.c:105
-msgid "output only the trailers"
-msgstr ""
-
-#: builtin/interpret-trailers.c:106
-msgid "do not apply config rules"
-msgstr ""
-
-#: builtin/interpret-trailers.c:107
-msgid "join whitespace-continued values"
-msgstr ""
-
-#: builtin/interpret-trailers.c:108
-msgid "set parsing options"
-msgstr ""
-
-#: builtin/interpret-trailers.c:110
-msgid "do not treat --- specially"
-msgstr ""
-
-#: builtin/interpret-trailers.c:112
-msgid "trailer(s) to add"
-msgstr ""
-
-#: builtin/interpret-trailers.c:123
-msgid "--trailer with --only-input does not make sense"
-msgstr ""
-
-#: builtin/interpret-trailers.c:133
-msgid "no input file given for in-place editing"
-msgstr ""
-
-#: builtin/log.c:60
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/log.c:61
-msgid "git show [<options>] <object>..."
-msgstr ""
-
-#: builtin/log.c:114
-#, c-format
-msgid "invalid --decorate option: %s"
-msgstr ""
-
-#: builtin/log.c:181
-msgid "show source"
-msgstr ""
-
-#: builtin/log.c:182
-msgid "use mail map file"
-msgstr ""
-
-#: builtin/log.c:185
-msgid "only decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:187
-msgid "do not decorate refs that match <pattern>"
-msgstr ""
-
-#: builtin/log.c:188
-msgid "decorate options"
-msgstr ""
-
-#: builtin/log.c:191
-msgid ""
-"trace the evolution of line range <start>,<end> or function :<funcname> in "
-"<file>"
-msgstr ""
-
-#: builtin/log.c:214
-msgid "-L<range>:<file> cannot be used with pathspec"
-msgstr ""
-
-#: builtin/log.c:322
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr ""
-
-#: builtin/log.c:429
-msgid "unable to create temporary object directory"
-msgstr ""
-
-#: builtin/log.c:599
-#, c-format
-msgid "git show %s: bad file"
-msgstr ""
-
-#: builtin/log.c:614 builtin/log.c:706
-#, c-format
-msgid "could not read object %s"
-msgstr ""
-
-#: builtin/log.c:731
-#, c-format
-msgid "unknown type: %d"
-msgstr ""
-
-#: builtin/log.c:880
-#, c-format
-msgid "%s: invalid cover from description mode"
-msgstr ""
-
-#: builtin/log.c:887
-msgid "format.headers without value"
-msgstr ""
-
-#: builtin/log.c:1016
-#, c-format
-msgid "cannot open patch file %s"
-msgstr ""
-
-#: builtin/log.c:1033
-msgid "need exactly one range"
-msgstr ""
-
-#: builtin/log.c:1043
-msgid "not a range"
-msgstr ""
-
-#: builtin/log.c:1207
-msgid "cover letter needs email format"
-msgstr ""
-
-#: builtin/log.c:1213
-msgid "failed to create cover-letter file"
-msgstr ""
-
-#: builtin/log.c:1300
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr ""
-
-#: builtin/log.c:1327
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
-msgstr ""
-
-#: builtin/log.c:1385
-msgid "two output directories?"
-msgstr ""
-
-#: builtin/log.c:1536 builtin/log.c:2369 builtin/log.c:2371 builtin/log.c:2383
-#, c-format
-msgid "unknown commit %s"
-msgstr ""
-
-#: builtin/log.c:1547 builtin/replace.c:58 builtin/replace.c:207
-#: builtin/replace.c:210
-#, c-format
-msgid "failed to resolve '%s' as a valid ref"
-msgstr ""
-
-#: builtin/log.c:1556
-msgid "could not find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1566
-msgid ""
-"failed to get upstream, if you want to record base commit automatically,\n"
-"please use git branch --set-upstream-to to track a remote branch.\n"
-"Or you could specify base commit by --base=<base-commit-id> manually"
-msgstr ""
-
-#: builtin/log.c:1589
-msgid "failed to find exact merge base"
-msgstr ""
-
-#: builtin/log.c:1606
-msgid "base commit should be the ancestor of revision list"
-msgstr ""
-
-#: builtin/log.c:1616
-msgid "base commit shouldn't be in revision list"
-msgstr ""
-
-#: builtin/log.c:1674
-msgid "cannot get patch id"
-msgstr ""
-
-#: builtin/log.c:1737
-msgid "failed to infer range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1739
-#, c-format
-msgid "using '%s' as range-diff origin of current series"
-msgstr ""
-
-#: builtin/log.c:1783
-msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
-
-#: builtin/log.c:1786
-msgid "use [PATCH] even with multiple patches"
-msgstr ""
-
-#: builtin/log.c:1790
-msgid "print patches to standard out"
-msgstr ""
-
-#: builtin/log.c:1792
-msgid "generate a cover letter"
-msgstr ""
-
-#: builtin/log.c:1794
-msgid "use simple number sequence for output file names"
-msgstr ""
-
-#: builtin/log.c:1795
-msgid "sfx"
-msgstr ""
-
-#: builtin/log.c:1796
-msgid "use <sfx> instead of '.patch'"
-msgstr ""
-
-#: builtin/log.c:1798
-msgid "start numbering patches at <n> instead of 1"
-msgstr ""
-
-#: builtin/log.c:1799
-msgid "reroll-count"
-msgstr ""
-
-#: builtin/log.c:1800
-msgid "mark the series as Nth re-roll"
-msgstr ""
-
-#: builtin/log.c:1802
-msgid "max length of output filename"
-msgstr ""
-
-#: builtin/log.c:1804
-msgid "use [RFC PATCH] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1807
-msgid "cover-from-description-mode"
-msgstr ""
-
-#: builtin/log.c:1808
-msgid "generate parts of a cover letter based on a branch's description"
-msgstr ""
-
-#: builtin/log.c:1810
-msgid "use [<prefix>] instead of [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1813
-msgid "store resulting files in <dir>"
-msgstr ""
-
-#: builtin/log.c:1816
-msgid "don't strip/add [PATCH]"
-msgstr ""
-
-#: builtin/log.c:1819
-msgid "don't output binary diffs"
-msgstr ""
-
-#: builtin/log.c:1821
-msgid "output all-zero hash in From header"
-msgstr ""
-
-#: builtin/log.c:1823
-msgid "don't include a patch matching a commit upstream"
-msgstr ""
-
-#: builtin/log.c:1825
-msgid "show patch format instead of default (patch + stat)"
-msgstr ""
-
-#: builtin/log.c:1827
-msgid "Messaging"
-msgstr ""
-
-#: builtin/log.c:1828
-msgid "header"
-msgstr ""
-
-#: builtin/log.c:1829
-msgid "add email header"
-msgstr ""
-
-#: builtin/log.c:1830 builtin/log.c:1831
-msgid "email"
-msgstr ""
-
-#: builtin/log.c:1830
-msgid "add To: header"
-msgstr ""
-
-#: builtin/log.c:1831
-msgid "add Cc: header"
-msgstr ""
-
-#: builtin/log.c:1832
-msgid "ident"
-msgstr ""
-
-#: builtin/log.c:1833
-msgid "set From address to <ident> (or committer ident if absent)"
-msgstr ""
-
-#: builtin/log.c:1835
-msgid "message-id"
-msgstr ""
-
-#: builtin/log.c:1836
-msgid "make first mail a reply to <message-id>"
-msgstr ""
-
-#: builtin/log.c:1837 builtin/log.c:1840
-msgid "boundary"
-msgstr ""
-
-#: builtin/log.c:1838
-msgid "attach the patch"
-msgstr ""
-
-#: builtin/log.c:1841
-msgid "inline the patch"
-msgstr ""
-
-#: builtin/log.c:1845
-msgid "enable message threading, styles: shallow, deep"
-msgstr ""
-
-#: builtin/log.c:1847
-msgid "signature"
-msgstr ""
-
-#: builtin/log.c:1848
-msgid "add a signature"
-msgstr ""
-
-#: builtin/log.c:1849
-msgid "base-commit"
-msgstr ""
-
-#: builtin/log.c:1850
-msgid "add prerequisite tree info to the patch series"
-msgstr ""
-
-#: builtin/log.c:1853
-msgid "add a signature from a file"
-msgstr ""
-
-#: builtin/log.c:1854
-msgid "don't print the patch filenames"
-msgstr ""
-
-#: builtin/log.c:1856
-msgid "show progress while generating patches"
-msgstr ""
-
-#: builtin/log.c:1858
-msgid "show changes against <rev> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1861
-msgid "show changes against <refspec> in cover letter or single patch"
-msgstr ""
-
-#: builtin/log.c:1863 builtin/range-diff.c:28
-msgid "percentage by which creation is weighted"
-msgstr ""
-
-#: builtin/log.c:1953
-#, c-format
-msgid "invalid ident line: %s"
-msgstr ""
-
-#: builtin/log.c:1978
-msgid "--name-only does not make sense"
-msgstr ""
-
-#: builtin/log.c:1980
-msgid "--name-status does not make sense"
-msgstr ""
-
-#: builtin/log.c:1982
-msgid "--check does not make sense"
-msgstr ""
-
-#: builtin/log.c:1984
-msgid "--remerge-diff does not make sense"
-msgstr ""
-
-#: builtin/log.c:2129
-msgid "--interdiff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2133
-msgid "Interdiff:"
-msgstr ""
-
-#: builtin/log.c:2134
-#, c-format
-msgid "Interdiff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2144
-msgid "--range-diff requires --cover-letter or single patch"
-msgstr ""
-
-#: builtin/log.c:2152
-msgid "Range-diff:"
-msgstr ""
-
-#: builtin/log.c:2153
-#, c-format
-msgid "Range-diff against v%d:"
-msgstr ""
-
-#: builtin/log.c:2164
-#, c-format
-msgid "unable to read signature file '%s'"
-msgstr ""
-
-#: builtin/log.c:2200
-msgid "Generating patches"
-msgstr ""
-
-#: builtin/log.c:2244
-msgid "failed to create output files"
-msgstr ""
-
-#: builtin/log.c:2304
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
-
-#: builtin/log.c:2358
-#, c-format
-msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
-msgstr ""
-
-#: builtin/ls-files.c:564
-msgid "git ls-files [<options>] [<file>...]"
-msgstr ""
-
-#: builtin/ls-files.c:618
-msgid "separate paths with the NUL character"
-msgstr ""
-
-#: builtin/ls-files.c:620
-msgid "identify the file status with tags"
-msgstr ""
-
-#: builtin/ls-files.c:622
-msgid "use lowercase letters for 'assume unchanged' files"
-msgstr ""
-
-#: builtin/ls-files.c:624
-msgid "use lowercase letters for 'fsmonitor clean' files"
-msgstr ""
-
-#: builtin/ls-files.c:626
-msgid "show cached files in the output (default)"
-msgstr ""
-
-#: builtin/ls-files.c:628
-msgid "show deleted files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:630
-msgid "show modified files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:632
-msgid "show other files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:634
-msgid "show ignored files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:637
-msgid "show staged contents' object name in the output"
-msgstr ""
-
-#: builtin/ls-files.c:639
-msgid "show files on the filesystem that need to be removed"
-msgstr ""
-
-#: builtin/ls-files.c:641
-msgid "show 'other' directories' names only"
-msgstr ""
-
-#: builtin/ls-files.c:643
-msgid "show line endings of files"
-msgstr ""
-
-#: builtin/ls-files.c:645
-msgid "don't show empty directories"
-msgstr ""
-
-#: builtin/ls-files.c:648
-msgid "show unmerged files in the output"
-msgstr ""
-
-#: builtin/ls-files.c:650
-msgid "show resolve-undo information"
-msgstr ""
-
-#: builtin/ls-files.c:652
-msgid "skip files matching pattern"
-msgstr ""
-
-#: builtin/ls-files.c:655
-msgid "read exclude patterns from <file>"
-msgstr ""
-
-#: builtin/ls-files.c:658
-msgid "read additional per-directory exclude patterns in <file>"
-msgstr ""
-
-#: builtin/ls-files.c:660
-msgid "add the standard git exclusions"
-msgstr ""
-
-#: builtin/ls-files.c:664
-msgid "make the output relative to the project top directory"
-msgstr ""
-
-#: builtin/ls-files.c:669
-msgid "if any <file> is not in the index, treat this as an error"
-msgstr ""
-
-#: builtin/ls-files.c:670
-msgid "tree-ish"
-msgstr ""
-
-#: builtin/ls-files.c:671
-msgid "pretend that paths removed since <tree-ish> are still present"
-msgstr ""
-
-#: builtin/ls-files.c:673
-msgid "show debugging data"
-msgstr ""
-
-#: builtin/ls-files.c:675
-msgid "suppress duplicate entries"
-msgstr ""
-
-#: builtin/ls-files.c:677
-msgid "show sparse directories in the presence of a sparse index"
-msgstr ""
-
-#: builtin/ls-remote.c:9
-msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"              [-q | --quiet] [--exit-code] [--get-url]\n"
-"              [--symref] [<repository> [<refs>...]]"
-msgstr ""
-
-#: builtin/ls-remote.c:60
-msgid "do not print remote URL"
-msgstr ""
-
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1131
-msgid "exec"
-msgstr ""
-
-#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
-msgid "path of git-upload-pack on the remote host"
-msgstr ""
-
-#: builtin/ls-remote.c:66
-msgid "limit to tags"
-msgstr ""
-
-#: builtin/ls-remote.c:67
-msgid "limit to heads"
-msgstr ""
-
-#: builtin/ls-remote.c:68
-msgid "do not show peeled tags"
-msgstr ""
-
-#: builtin/ls-remote.c:70
-msgid "take url.<base>.insteadOf into account"
-msgstr ""
-
-#: builtin/ls-remote.c:73
-msgid "exit with exit code 2 if no matching refs are found"
-msgstr ""
-
-#: builtin/ls-remote.c:76
-msgid "show underlying ref in addition to the object pointed by it"
-msgstr ""
-
-#: builtin/ls-tree.c:36
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: builtin/ls-tree.c:54
-#, c-format
-msgid "could not get object info about '%s'"
-msgstr ""
-
-#: builtin/ls-tree.c:79
-#, c-format
-msgid "bad ls-tree format: element '%s' does not start with '('"
-msgstr ""
-
-#: builtin/ls-tree.c:83
-#, c-format
-msgid "bad ls-tree format: element '%s' does not end in ')'"
-msgstr ""
-
-#: builtin/ls-tree.c:109
-#, c-format
-msgid "bad ls-tree format: %%%.*s"
-msgstr ""
-
-#: builtin/ls-tree.c:336
-msgid "only show trees"
-msgstr ""
-
-#: builtin/ls-tree.c:338
-msgid "recurse into subtrees"
-msgstr ""
-
-#: builtin/ls-tree.c:340
-msgid "show trees when recursing"
-msgstr ""
-
-#: builtin/ls-tree.c:343
-msgid "terminate entries with NUL byte"
-msgstr ""
-
-#: builtin/ls-tree.c:344
-msgid "include object size"
-msgstr ""
-
-#: builtin/ls-tree.c:346 builtin/ls-tree.c:348
-msgid "list only filenames"
-msgstr ""
-
-#: builtin/ls-tree.c:350
-msgid "list only objects"
-msgstr ""
-
-#: builtin/ls-tree.c:353
-msgid "use full path names"
-msgstr ""
-
-#: builtin/ls-tree.c:355
-msgid "list entire tree; not just current directory (implies --full-name)"
-msgstr ""
-
-#: builtin/ls-tree.c:391
-msgid "--format can't be combined with other format-altering options"
-msgstr ""
-
-#. TRANSLATORS: keep <> in "<" mail ">" info.
-#: builtin/mailinfo.c:14
-msgid "git mailinfo [<options>] <msg> <patch> < mail >info"
-msgstr ""
-
-#: builtin/mailinfo.c:58
-msgid "keep subject"
-msgstr ""
-
-#: builtin/mailinfo.c:60
-msgid "keep non patch brackets in subject"
-msgstr ""
-
-#: builtin/mailinfo.c:62
-msgid "copy Message-ID to the end of commit message"
-msgstr ""
-
-#: builtin/mailinfo.c:64
-msgid "re-code metadata to i18n.commitEncoding"
-msgstr ""
-
-#: builtin/mailinfo.c:67
-msgid "disable charset re-coding of metadata"
-msgstr ""
-
-#: builtin/mailinfo.c:69
-msgid "encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:70
-msgid "re-code metadata to this encoding"
-msgstr ""
-
-#: builtin/mailinfo.c:72
-msgid "use scissors"
-msgstr ""
-
-#: builtin/mailinfo.c:73
-msgid "<action>"
-msgstr ""
-
-#: builtin/mailinfo.c:74
-msgid "action when quoted CR is found"
-msgstr ""
-
-#: builtin/mailinfo.c:77
-msgid "use headers in message's body"
-msgstr ""
-
-#: builtin/mailsplit.c:227
-msgid "reading patches from stdin/tty..."
-msgstr ""
-
-#: builtin/mailsplit.c:242
-#, c-format
-msgid "empty mbox: '%s'"
-msgstr ""
-
-#: builtin/merge-base.c:32
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:33
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:34
-msgid "git merge-base --independent <commit>..."
-msgstr ""
-
-#: builtin/merge-base.c:35
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr ""
-
-#: builtin/merge-base.c:36
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr ""
-
-#: builtin/merge-base.c:144
-msgid "output all common ancestors"
-msgstr ""
-
-#: builtin/merge-base.c:146
-msgid "find ancestors for a single n-way merge"
-msgstr ""
-
-#: builtin/merge-base.c:148
-msgid "list revs not reachable from others"
-msgstr ""
-
-#: builtin/merge-base.c:150
-msgid "is the first one ancestor of the other?"
-msgstr ""
-
-#: builtin/merge-base.c:152
-msgid "find where <commit> forked from reflog of <ref>"
-msgstr ""
-
-#: builtin/merge-file.c:9
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
-msgstr ""
-
-#: builtin/merge-file.c:35
-msgid "send results to standard output"
-msgstr ""
-
-#: builtin/merge-file.c:36
-msgid "use a diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:37
-msgid "use a zealous diff3 based merge"
-msgstr ""
-
-#: builtin/merge-file.c:39
-msgid "for conflicts, use our version"
-msgstr ""
-
-#: builtin/merge-file.c:41
-msgid "for conflicts, use their version"
-msgstr ""
-
-#: builtin/merge-file.c:43
-msgid "for conflicts, use a union version"
-msgstr ""
-
-#: builtin/merge-file.c:46
-msgid "for conflicts, use this marker size"
-msgstr ""
-
-#: builtin/merge-file.c:47
-msgid "do not warn about conflicts"
-msgstr ""
-
-#: builtin/merge-file.c:49
-msgid "set labels for file1/orig-file/file2"
-msgstr ""
-
-#: builtin/merge-recursive.c:47
-#, c-format
-msgid "unknown option %s"
-msgstr ""
-
-#: builtin/merge-recursive.c:53
-#, c-format
-msgid "could not parse object '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:57
-#, c-format
-msgid "cannot handle more than %d base. Ignoring %s."
-msgid_plural "cannot handle more than %d bases. Ignoring %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/merge-recursive.c:65
-msgid "not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge-recursive.c:74 builtin/merge-recursive.c:76
-#, c-format
-msgid "could not resolve ref '%s'"
-msgstr ""
-
-#: builtin/merge-recursive.c:82
-#, c-format
-msgid "Merging %s with %s\n"
-msgstr ""
-
-#: builtin/merge.c:59
-msgid "git merge [<options>] [<commit>...]"
-msgstr ""
-
-#: builtin/merge.c:125
-msgid "switch `m' requires a value"
-msgstr ""
-
-#: builtin/merge.c:148
-#, c-format
-msgid "option `%s' requires a value"
-msgstr ""
-
-#: builtin/merge.c:201
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr ""
-
-#: builtin/merge.c:202
-#, c-format
-msgid "Available strategies are:"
-msgstr ""
-
-#: builtin/merge.c:207
-#, c-format
-msgid "Available custom strategies are:"
-msgstr ""
-
-#: builtin/merge.c:258 builtin/pull.c:134
-msgid "do not show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:261 builtin/pull.c:137
-msgid "show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:262 builtin/pull.c:140
-msgid "(synonym to --stat)"
-msgstr ""
-
-#: builtin/merge.c:264 builtin/pull.c:143
-msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr ""
-
-#: builtin/merge.c:267 builtin/pull.c:149
-msgid "create a single commit instead of doing a merge"
-msgstr ""
-
-#: builtin/merge.c:269 builtin/pull.c:152
-msgid "perform a commit if the merge succeeds (default)"
-msgstr ""
-
-#: builtin/merge.c:271 builtin/pull.c:155
-msgid "edit message before committing"
-msgstr ""
-
-#: builtin/merge.c:273
-msgid "allow fast-forward (default)"
-msgstr ""
-
-#: builtin/merge.c:275 builtin/pull.c:162
-msgid "abort if fast-forward is not possible"
-msgstr ""
-
-#: builtin/merge.c:279 builtin/pull.c:168
-msgid "verify that the named commit has a valid GPG signature"
-msgstr ""
-
-#: builtin/merge.c:280 builtin/notes.c:785 builtin/pull.c:172
-#: builtin/rebase.c:1145 builtin/revert.c:114
-msgid "strategy"
-msgstr ""
-
-#: builtin/merge.c:281 builtin/pull.c:173
-msgid "merge strategy to use"
-msgstr ""
-
-#: builtin/merge.c:282 builtin/pull.c:176
-msgid "option=value"
-msgstr ""
-
-#: builtin/merge.c:283 builtin/pull.c:177
-msgid "option for selected merge strategy"
-msgstr ""
-
-#: builtin/merge.c:285
-msgid "merge commit message (for a non-fast-forward merge)"
-msgstr ""
-
-#: builtin/merge.c:291
-msgid "use <name> instead of the real target"
-msgstr ""
-
-#: builtin/merge.c:294
-msgid "abort the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:296
-msgid "--abort but leave index and working tree alone"
-msgstr ""
-
-#: builtin/merge.c:298
-msgid "continue the current in-progress merge"
-msgstr ""
-
-#: builtin/merge.c:300 builtin/pull.c:184
-msgid "allow merging unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:307
-msgid "bypass pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/merge.c:323
-msgid "could not run stash."
-msgstr ""
-
-#: builtin/merge.c:328
-msgid "stash failed"
-msgstr ""
-
-#: builtin/merge.c:333
-#, c-format
-msgid "not a valid object: %s"
-msgstr ""
-
-#: builtin/merge.c:355 builtin/merge.c:372
-msgid "read-tree failed"
-msgstr ""
-
-#: builtin/merge.c:403
-msgid "Already up to date. (nothing to squash)"
-msgstr ""
-
-#: builtin/merge.c:417
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:467
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
-msgstr ""
-
-#: builtin/merge.c:517
-#, c-format
-msgid "'%s' does not point to a commit"
-msgstr ""
-
-#: builtin/merge.c:605
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr ""
-
-#: builtin/merge.c:732
-msgid "Not handling anything other than two heads merge."
-msgstr ""
-
-#: builtin/merge.c:745
-#, c-format
-msgid "unknown strategy option: -X%s"
-msgstr ""
-
-#: builtin/merge.c:764 t/helper/test-fast-rebase.c:223
-#, c-format
-msgid "unable to write %s"
-msgstr ""
-
-#: builtin/merge.c:816
-#, c-format
-msgid "Could not read from '%s'"
-msgstr ""
-
-#: builtin/merge.c:825
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:831
-msgid ""
-"Please enter a commit message to explain why this merge is necessary,\n"
-"especially if it merges an updated upstream into a topic branch.\n"
-"\n"
-msgstr ""
-
-#: builtin/merge.c:836
-msgid "An empty message aborts the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:839
-#, c-format
-msgid ""
-"Lines starting with '%c' will be ignored, and an empty message aborts\n"
-"the commit.\n"
-msgstr ""
-
-#: builtin/merge.c:900
-msgid "Empty commit message."
-msgstr ""
-
-#: builtin/merge.c:915
-#, c-format
-msgid "Wonderful.\n"
-msgstr ""
-
-#: builtin/merge.c:976
-#, c-format
-msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr ""
-
-#: builtin/merge.c:1015
-msgid "No current branch."
-msgstr ""
-
-#: builtin/merge.c:1017
-msgid "No remote for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1019
-msgid "No default upstream defined for the current branch."
-msgstr ""
-
-#: builtin/merge.c:1024
-#, c-format
-msgid "No remote-tracking branch for %s from %s"
-msgstr ""
-
-#: builtin/merge.c:1081
-#, c-format
-msgid "Bad value '%s' in environment '%s'"
-msgstr ""
-
-#: builtin/merge.c:1183
-#, c-format
-msgid "not something we can merge in %s: %s"
-msgstr ""
-
-#: builtin/merge.c:1217
-msgid "not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1330
-msgid "--abort expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1334
-msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1352
-msgid "--quit expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1365
-msgid "--continue expects no arguments"
-msgstr ""
-
-#: builtin/merge.c:1369
-msgid "There is no merge in progress (MERGE_HEAD missing)."
-msgstr ""
-
-#: builtin/merge.c:1385
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1392
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-
-#: builtin/merge.c:1395
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr ""
-
-#: builtin/merge.c:1427
-msgid "No commit specified and merge.defaultToUpstream not set."
-msgstr ""
-
-#: builtin/merge.c:1444
-msgid "Squash commit into empty head not supported yet"
-msgstr ""
-
-#: builtin/merge.c:1446
-msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr ""
-
-#: builtin/merge.c:1451
-#, c-format
-msgid "%s - not something we can merge"
-msgstr ""
-
-#: builtin/merge.c:1453
-msgid "Can merge only exactly one commit into empty head"
-msgstr ""
-
-#: builtin/merge.c:1540
-msgid "refusing to merge unrelated histories"
-msgstr ""
-
-#: builtin/merge.c:1559
-#, c-format
-msgid "Updating %s..%s\n"
-msgstr ""
-
-#: builtin/merge.c:1606
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr ""
-
-#: builtin/merge.c:1613
-#, c-format
-msgid "Nope.\n"
-msgstr ""
-
-#: builtin/merge.c:1671 builtin/merge.c:1737
-#, c-format
-msgid "Rewinding the tree to pristine...\n"
-msgstr ""
-
-#: builtin/merge.c:1675
-#, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr ""
-
-#: builtin/merge.c:1727
-#, c-format
-msgid "No merge strategy handled the merge.\n"
-msgstr ""
-
-#: builtin/merge.c:1729
-#, c-format
-msgid "Merge with strategy %s failed.\n"
-msgstr ""
-
-#: builtin/merge.c:1739
-#, c-format
-msgid "Using the %s strategy to prepare resolving by hand.\n"
-msgstr ""
-
-#: builtin/merge.c:1753
-#, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-
-#: builtin/mktag.c:27
-#, c-format
-msgid "warning: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:38
-#, c-format
-msgid "error: tag input does not pass fsck: %s"
-msgstr ""
-
-#: builtin/mktag.c:41
-#, c-format
-msgid "%d (FSCK_IGNORE?) should never trigger this callback"
-msgstr ""
-
-#: builtin/mktag.c:56
-#, c-format
-msgid "could not read tagged object '%s'"
-msgstr ""
-
-#: builtin/mktag.c:59
-#, c-format
-msgid "object '%s' tagged as '%s', but is a '%s' type"
-msgstr ""
-
-#: builtin/mktag.c:97
-msgid "tag on stdin did not pass our strict fsck check"
-msgstr ""
-
-#: builtin/mktag.c:100
-msgid "tag on stdin did not refer to a valid object"
-msgstr ""
-
-#: builtin/mktag.c:103 builtin/tag.c:243
-msgid "unable to write tag file"
-msgstr ""
-
-#: builtin/mktree.c:154
-msgid "input is NUL terminated"
-msgstr ""
-
-#: builtin/mktree.c:155 builtin/write-tree.c:26
-msgid "allow missing objects"
-msgstr ""
-
-#: builtin/mktree.c:156
-msgid "allow creation of more than one tree"
-msgstr ""
-
-#: builtin/multi-pack-index.c:10
-msgid ""
-"git multi-pack-index [<options>] write [--preferred-pack=<pack>][--refs-"
-"snapshot=<path>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:14
-msgid "git multi-pack-index [<options>] verify"
-msgstr ""
-
-#: builtin/multi-pack-index.c:17
-msgid "git multi-pack-index [<options>] expire"
-msgstr ""
-
-#: builtin/multi-pack-index.c:20
-msgid "git multi-pack-index [<options>] repack [--batch-size=<size>]"
-msgstr ""
-
-#: builtin/multi-pack-index.c:57
-msgid "object directory containing set of packfile and pack-index pairs"
-msgstr ""
-
-#: builtin/multi-pack-index.c:98
-msgid "preferred-pack"
-msgstr ""
-
-#: builtin/multi-pack-index.c:99
-msgid "pack for reuse when computing a multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:100
-msgid "write multi-pack bitmap"
-msgstr ""
-
-#: builtin/multi-pack-index.c:105
-msgid "write multi-pack index containing only given indexes"
-msgstr ""
-
-#: builtin/multi-pack-index.c:107
-msgid "refs snapshot for selecting bitmap commits"
-msgstr ""
-
-#: builtin/multi-pack-index.c:206
-msgid ""
-"during repack, collect pack-files of smaller size into a batch that is "
-"larger than this size"
-msgstr ""
-
-#: builtin/mv.c:18
-msgid "git mv [<options>] <source>... <destination>"
-msgstr ""
-
-#: builtin/mv.c:83
-#, c-format
-msgid "Directory %s is in index and no submodule?"
-msgstr ""
-
-#: builtin/mv.c:85
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/mv.c:103
-#, c-format
-msgid "%.*s is in index"
-msgstr ""
-
-#: builtin/mv.c:125
-msgid "force move/rename even if target exists"
-msgstr ""
-
-#: builtin/mv.c:127
-msgid "skip move/rename errors"
-msgstr ""
-
-#: builtin/mv.c:172
-#, c-format
-msgid "destination '%s' is not a directory"
-msgstr ""
-
-#: builtin/mv.c:184
-#, c-format
-msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
-
-#: builtin/mv.c:190
-msgid "bad source"
-msgstr ""
-
-#: builtin/mv.c:193
-msgid "can not move directory into itself"
-msgstr ""
-
-#: builtin/mv.c:196
-msgid "cannot move directory over file"
-msgstr ""
-
-#: builtin/mv.c:205
-msgid "source directory is empty"
-msgstr ""
-
-#: builtin/mv.c:231
-msgid "not under version control"
-msgstr ""
-
-#: builtin/mv.c:233
-msgid "conflicted"
-msgstr ""
-
-#: builtin/mv.c:236
-msgid "destination exists"
-msgstr ""
-
-#: builtin/mv.c:244
-#, c-format
-msgid "overwriting '%s'"
-msgstr ""
-
-#: builtin/mv.c:247
-msgid "Cannot overwrite"
-msgstr ""
-
-#: builtin/mv.c:250
-msgid "multiple sources for the same target"
-msgstr ""
-
-#: builtin/mv.c:252
-msgid "destination directory does not exist"
-msgstr ""
-
-#: builtin/mv.c:280
-#, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr ""
-
-#: builtin/mv.c:308
-#, c-format
-msgid "Renaming %s to %s\n"
-msgstr ""
-
-#: builtin/mv.c:314 builtin/remote.c:812 builtin/repack.c:861
-#, c-format
-msgid "renaming '%s' failed"
-msgstr ""
-
-#: builtin/name-rev.c:524
-msgid "git name-rev [<options>] <commit>..."
-msgstr ""
-
-#: builtin/name-rev.c:525
-msgid "git name-rev [<options>] --all"
-msgstr ""
-
-#: builtin/name-rev.c:526
-msgid "git name-rev [<options>] --annotate-stdin"
-msgstr ""
-
-#: builtin/name-rev.c:583
-msgid "print only ref-based names (no object names)"
-msgstr ""
-
-#: builtin/name-rev.c:584
-msgid "only use tags to name the commits"
-msgstr ""
-
-#: builtin/name-rev.c:586
-msgid "only use refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:588
-msgid "ignore refs matching <pattern>"
-msgstr ""
-
-#: builtin/name-rev.c:590
-msgid "list all commits reachable from all refs"
-msgstr ""
-
-#: builtin/name-rev.c:591
-msgid "deprecated: use annotate-stdin instead"
-msgstr ""
-
-#: builtin/name-rev.c:592
-msgid "annotate text from stdin"
-msgstr ""
-
-#: builtin/name-rev.c:593
-msgid "allow to print `undefined` names (default)"
-msgstr ""
-
-#: builtin/name-rev.c:599
-msgid "dereference tags in the input (internal use)"
-msgstr ""
-
-#: builtin/notes.c:28
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:29
-msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:32
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:33
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:34
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:37
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr ""
-
-#: builtin/notes.c:38
-msgid "git notes [--ref <notes-ref>] prune [-n] [-v]"
-msgstr ""
-
-#: builtin/notes.c:39
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr ""
-
-#: builtin/notes.c:44
-msgid "git notes [list [<object>]]"
-msgstr ""
-
-#: builtin/notes.c:49
-msgid "git notes add [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:54
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr ""
-
-#: builtin/notes.c:55
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr ""
-
-#: builtin/notes.c:60
-msgid "git notes append [<options>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:65
-msgid "git notes edit [<object>]"
-msgstr ""
-
-#: builtin/notes.c:70
-msgid "git notes show [<object>]"
-msgstr ""
-
-#: builtin/notes.c:75
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:76
-msgid "git notes merge --commit [<options>]"
-msgstr ""
-
-#: builtin/notes.c:77
-msgid "git notes merge --abort [<options>]"
-msgstr ""
-
-#: builtin/notes.c:82
-msgid "git notes remove [<object>]"
-msgstr ""
-
-#: builtin/notes.c:87
-msgid "git notes prune [<options>]"
-msgstr ""
-
-#: builtin/notes.c:97
-msgid "Write/edit the notes for the following object:"
-msgstr ""
-
-#: builtin/notes.c:149
-#, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:153
-msgid "could not read 'show' output"
-msgstr ""
-
-#: builtin/notes.c:161
-#, c-format
-msgid "failed to finish 'show' for object '%s'"
-msgstr ""
-
-#: builtin/notes.c:194
-msgid "please supply the note contents using either -m or -F option"
-msgstr ""
-
-#: builtin/notes.c:203
-msgid "unable to write note object"
-msgstr ""
-
-#: builtin/notes.c:206
-#, c-format
-msgid "the note contents have been left in %s"
-msgstr ""
-
-#: builtin/notes.c:240 builtin/tag.c:582
-#, c-format
-msgid "could not open or read '%s'"
-msgstr ""
-
-#: builtin/notes.c:261 builtin/notes.c:311 builtin/notes.c:313
-#: builtin/notes.c:381 builtin/notes.c:436 builtin/notes.c:524
-#: builtin/notes.c:529 builtin/notes.c:608 builtin/notes.c:670
-#, c-format
-msgid "failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:263
-#, c-format
-msgid "failed to read object '%s'."
-msgstr ""
-
-#: builtin/notes.c:266
-#, c-format
-msgid "cannot read note data from non-blob object '%s'."
-msgstr ""
-
-#: builtin/notes.c:307
-#, c-format
-msgid "malformed input line: '%s'."
-msgstr ""
-
-#: builtin/notes.c:322
-#, c-format
-msgid "failed to copy notes from '%s' to '%s'"
-msgstr ""
-
-#. TRANSLATORS: the first %s will be replaced by a git
-#. notes command: 'add', 'merge', 'remove', etc.
-#.
-#: builtin/notes.c:354
-#, c-format
-msgid "refusing to %s notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#: builtin/notes.c:387 builtin/notes.c:676
-#, c-format
-msgid "no note found for object %s."
-msgstr ""
-
-#: builtin/notes.c:408 builtin/notes.c:574
-msgid "note contents as a string"
-msgstr ""
-
-#: builtin/notes.c:411 builtin/notes.c:577
-msgid "note contents in a file"
-msgstr ""
-
-#: builtin/notes.c:414 builtin/notes.c:580
-msgid "reuse and edit specified note object"
-msgstr ""
-
-#: builtin/notes.c:417 builtin/notes.c:583
-msgid "reuse specified note object"
-msgstr ""
-
-#: builtin/notes.c:420 builtin/notes.c:586
-msgid "allow storing empty note"
-msgstr ""
-
-#: builtin/notes.c:421 builtin/notes.c:494
-msgid "replace existing notes"
-msgstr ""
-
-#: builtin/notes.c:446
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:461 builtin/notes.c:542
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:473 builtin/notes.c:635 builtin/notes.c:904
-#, c-format
-msgid "Removing note for object %s\n"
-msgstr ""
-
-#: builtin/notes.c:495
-msgid "read objects from stdin"
-msgstr ""
-
-#: builtin/notes.c:497
-msgid "load rewriting config for <command> (implies --stdin)"
-msgstr ""
-
-#: builtin/notes.c:515
-msgid "too few arguments"
-msgstr ""
-
-#: builtin/notes.c:536
-#, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-
-#: builtin/notes.c:548
-#, c-format
-msgid "missing notes on source object %s. Cannot copy."
-msgstr ""
-
-#: builtin/notes.c:601
-#, c-format
-msgid ""
-"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
-"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
-msgstr ""
-
-#: builtin/notes.c:696
-msgid "failed to delete ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:698
-msgid "failed to delete ref NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:700
-msgid "failed to remove 'git notes merge' worktree"
-msgstr ""
-
-#: builtin/notes.c:720
-msgid "failed to read ref NOTES_MERGE_PARTIAL"
-msgstr ""
-
-#: builtin/notes.c:722
-msgid "could not find commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:724
-msgid "could not parse commit from NOTES_MERGE_PARTIAL."
-msgstr ""
-
-#: builtin/notes.c:737
-msgid "failed to resolve NOTES_MERGE_REF"
-msgstr ""
-
-#: builtin/notes.c:740
-msgid "failed to finalize notes merge"
-msgstr ""
-
-#: builtin/notes.c:766
-#, c-format
-msgid "unknown notes merge strategy %s"
-msgstr ""
-
-#: builtin/notes.c:782
-msgid "General options"
-msgstr ""
-
-#: builtin/notes.c:784
-msgid "Merge options"
-msgstr ""
-
-#: builtin/notes.c:786
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
-msgstr ""
-
-#: builtin/notes.c:788
-msgid "Committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:790
-msgid "finalize notes merge by committing unmerged notes"
-msgstr ""
-
-#: builtin/notes.c:792
-msgid "Aborting notes merge resolution"
-msgstr ""
-
-#: builtin/notes.c:794
-msgid "abort notes merge"
-msgstr ""
-
-#: builtin/notes.c:805
-msgid "cannot mix --commit, --abort or -s/--strategy"
-msgstr ""
-
-#: builtin/notes.c:810
-msgid "must specify a notes ref to merge"
-msgstr ""
-
-#: builtin/notes.c:834
-#, c-format
-msgid "unknown -s/--strategy: %s"
-msgstr ""
-
-#: builtin/notes.c:874
-#, c-format
-msgid "a notes merge into %s is already in-progress at %s"
-msgstr ""
-
-#: builtin/notes.c:878
-#, c-format
-msgid "failed to store link to current notes ref (%s)"
-msgstr ""
-
-#: builtin/notes.c:880
-#, c-format
-msgid ""
-"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
-"'git notes merge --commit', or abort the merge with 'git notes merge --"
-"abort'.\n"
-msgstr ""
-
-#: builtin/notes.c:899 builtin/tag.c:595
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr ""
-
-#: builtin/notes.c:902
-#, c-format
-msgid "Object %s has no note\n"
-msgstr ""
-
-#: builtin/notes.c:914
-msgid "attempt to remove non-existent note is not an error"
-msgstr ""
-
-#: builtin/notes.c:917
-msgid "read object names from the standard input"
-msgstr ""
-
-#: builtin/notes.c:956 builtin/prune.c:144 builtin/worktree.c:148
-msgid "do not remove, show only"
-msgstr ""
-
-#: builtin/notes.c:957
-msgid "report pruned notes"
-msgstr ""
-
-#: builtin/notes.c:1000
-msgid "notes-ref"
-msgstr ""
-
-#: builtin/notes.c:1001
-msgid "use notes from <notes-ref>"
-msgstr ""
-
-#: builtin/notes.c:1036 builtin/stash.c:1802
-#, c-format
-msgid "unknown subcommand: %s"
-msgstr ""
-
-#: builtin/pack-objects.c:182
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:183
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
-msgstr ""
-
-#: builtin/pack-objects.c:570
-#, c-format
-msgid ""
-"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
-"pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:578
-#, c-format
-msgid "bad packed object CRC for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:589
-#, c-format
-msgid "corrupt packed object for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:720
-#, c-format
-msgid "recursive delta detected for object %s"
-msgstr ""
-
-#: builtin/pack-objects.c:939
-#, c-format
-msgid "ordered %u objects, expected %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1034
-#, c-format
-msgid "expected object at offset %<PRIuMAX> in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1158
-msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
-msgstr ""
-
-#: builtin/pack-objects.c:1171
-msgid "Writing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:1243 builtin/update-index.c:90
-#, c-format
-msgid "failed to stat %s"
-msgstr ""
-
-#: builtin/pack-objects.c:1276
-msgid "failed to write bitmap index"
-msgstr ""
-
-#: builtin/pack-objects.c:1302
-#, c-format
-msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-objects.c:1544
-msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr ""
-
-#: builtin/pack-objects.c:1992
-#, c-format
-msgid "delta base offset overflow in pack for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2001
-#, c-format
-msgid "delta base offset out of bound for %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2282
-msgid "Counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2447
-#, c-format
-msgid "unable to parse object header of %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2517 builtin/pack-objects.c:2533
-#: builtin/pack-objects.c:2543
-#, c-format
-msgid "object %s cannot be read"
-msgstr ""
-
-#: builtin/pack-objects.c:2520 builtin/pack-objects.c:2547
-#, c-format
-msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
-msgstr ""
-
-#: builtin/pack-objects.c:2557
-msgid "suboptimal pack - out of memory"
-msgstr ""
-
-#: builtin/pack-objects.c:2872
-#, c-format
-msgid "Delta compression using up to %d threads"
-msgstr ""
-
-#: builtin/pack-objects.c:3011
-#, c-format
-msgid "unable to pack objects reachable from tag %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3097
-msgid "Compressing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3103
-msgid "inconsistency with delta count"
-msgstr ""
-
-#: builtin/pack-objects.c:3182
-#, c-format
-msgid ""
-"value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
-"hash> <uri>' (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3185
-#, c-format
-msgid ""
-"object already configured in another uploadpack.blobpackfileuri (got '%s')"
-msgstr ""
-
-#: builtin/pack-objects.c:3220
-#, c-format
-msgid "could not get type of object %s in pack %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3348 builtin/pack-objects.c:3359
-#: builtin/pack-objects.c:3373
-#, c-format
-msgid "could not find pack '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3416
-#, c-format
-msgid ""
-"expected edge object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3422
-#, c-format
-msgid ""
-"expected object ID, got garbage:\n"
-" %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3540 builtin/pack-objects.c:3627
-msgid "cannot open pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3549
-#, c-format
-msgid "loose object at %s could not be examined"
-msgstr ""
-
-#: builtin/pack-objects.c:3635
-msgid "unable to force loose object"
-msgstr ""
-
-#: builtin/pack-objects.c:3763
-#, c-format
-msgid "not a rev '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3766 builtin/rev-parse.c:1061
-#, c-format
-msgid "bad revision '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3794
-msgid "unable to add recent objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3847
-#, c-format
-msgid "unsupported index version %s"
-msgstr ""
-
-#: builtin/pack-objects.c:3851
-#, c-format
-msgid "bad index version '%s'"
-msgstr ""
-
-#: builtin/pack-objects.c:3907
-msgid "<version>[,<offset>]"
-msgstr ""
-
-#: builtin/pack-objects.c:3908
-msgid "write the pack index file in the specified idx format version"
-msgstr ""
-
-#: builtin/pack-objects.c:3911
-msgid "maximum size of each output pack file"
-msgstr ""
-
-#: builtin/pack-objects.c:3913
-msgid "ignore borrowed objects from alternate object store"
-msgstr ""
-
-#: builtin/pack-objects.c:3915
-msgid "ignore packed objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3917
-msgid "limit pack window by objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3919
-msgid "limit pack window by memory in addition to object limit"
-msgstr ""
-
-#: builtin/pack-objects.c:3921
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3923
-msgid "reuse existing deltas"
-msgstr ""
-
-#: builtin/pack-objects.c:3925
-msgid "reuse existing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3927
-msgid "use OFS_DELTA objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3929
-msgid "use threads when searching for best delta matches"
-msgstr ""
-
-#: builtin/pack-objects.c:3931
-msgid "do not create an empty pack output"
-msgstr ""
-
-#: builtin/pack-objects.c:3933
-msgid "read revision arguments from standard input"
-msgstr ""
-
-#: builtin/pack-objects.c:3935
-msgid "limit the objects to those that are not yet packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3938
-msgid "include objects reachable from any reference"
-msgstr ""
-
-#: builtin/pack-objects.c:3941
-msgid "include objects referred by reflog entries"
-msgstr ""
-
-#: builtin/pack-objects.c:3944
-msgid "include objects referred to by the index"
-msgstr ""
-
-#: builtin/pack-objects.c:3947
-msgid "read packs from stdin"
-msgstr ""
-
-#: builtin/pack-objects.c:3949
-msgid "output pack to stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:3951
-msgid "include tag objects that refer to objects to be packed"
-msgstr ""
-
-#: builtin/pack-objects.c:3953
-msgid "keep unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3955
-msgid "pack loose unreachable objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3957
-msgid "unpack unreachable objects newer than <time>"
-msgstr ""
-
-#: builtin/pack-objects.c:3960
-msgid "use the sparse reachability algorithm"
-msgstr ""
-
-#: builtin/pack-objects.c:3962
-msgid "create thin packs"
-msgstr ""
-
-#: builtin/pack-objects.c:3964
-msgid "create packs suitable for shallow fetches"
-msgstr ""
-
-#: builtin/pack-objects.c:3966
-msgid "ignore packs that have companion .keep file"
-msgstr ""
-
-#: builtin/pack-objects.c:3968
-msgid "ignore this pack"
-msgstr ""
-
-#: builtin/pack-objects.c:3970
-msgid "pack compression level"
-msgstr ""
-
-#: builtin/pack-objects.c:3972
-msgid "do not hide commits by grafts"
-msgstr ""
-
-#: builtin/pack-objects.c:3974
-msgid "use a bitmap index if available to speed up counting objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3976
-msgid "write a bitmap index together with the pack index"
-msgstr ""
-
-#: builtin/pack-objects.c:3980
-msgid "write a bitmap index if possible"
-msgstr ""
-
-#: builtin/pack-objects.c:3984
-msgid "handling for missing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:3987
-msgid "do not pack objects in promisor packfiles"
-msgstr ""
-
-#: builtin/pack-objects.c:3989
-msgid "respect islands during delta compression"
-msgstr ""
-
-#: builtin/pack-objects.c:3991
-msgid "protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:3992
-msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
-msgstr ""
-
-#: builtin/pack-objects.c:4027
-#, c-format
-msgid "delta chain depth %d is too deep, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4032
-#, c-format
-msgid "pack.deltaCacheLimit is too high, forcing %d"
-msgstr ""
-
-#: builtin/pack-objects.c:4088
-msgid "--max-pack-size cannot be used to build a pack for transfer"
-msgstr ""
-
-#: builtin/pack-objects.c:4090
-msgid "minimum pack size limit is 1 MiB"
-msgstr ""
-
-#: builtin/pack-objects.c:4095
-msgid "--thin cannot be used to build an indexable pack"
-msgstr ""
-
-#: builtin/pack-objects.c:4104
-msgid "cannot use --filter without --stdout"
-msgstr ""
-
-#: builtin/pack-objects.c:4106
-msgid "cannot use --filter with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4110
-msgid "cannot use internal rev list with --stdin-packs"
-msgstr ""
-
-#: builtin/pack-objects.c:4169
-msgid "Enumerating objects"
-msgstr ""
-
-#: builtin/pack-objects.c:4210
-#, c-format
-msgid ""
-"Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
-"reused %<PRIu32>"
-msgstr ""
-
-#: builtin/pack-redundant.c:601
-msgid ""
-"'git pack-redundant' is nominated for removal.\n"
-"If you still use this command, please add an extra\n"
-"option, '--i-still-use-this', on the command line\n"
-"and let us know you still use it by sending an e-mail\n"
-"to <git@vger.kernel.org>.  Thanks.\n"
-msgstr ""
-
-#: builtin/pack-refs.c:8
-msgid "git pack-refs [<options>]"
-msgstr ""
-
-#: builtin/pack-refs.c:16
-msgid "pack everything"
-msgstr ""
-
-#: builtin/pack-refs.c:17
-msgid "prune loose refs (default)"
-msgstr ""
-
-#: builtin/prune.c:14
-msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]"
-msgstr ""
-
-#: builtin/prune.c:145
-msgid "report pruned objects"
-msgstr ""
-
-#: builtin/prune.c:148
-msgid "expire objects older than <time>"
-msgstr ""
-
-#: builtin/prune.c:150
-msgid "limit traversal to objects outside promisor packfiles"
-msgstr ""
-
-#: builtin/prune.c:163
-msgid "cannot prune in a precious-objects repo"
-msgstr ""
-
-#: builtin/pull.c:67
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/pull.c:124
-msgid "control for recursive fetching of submodules"
-msgstr ""
-
-#: builtin/pull.c:128
-msgid "Options related to merging"
-msgstr ""
-
-#: builtin/pull.c:131
-msgid "incorporate changes by rebasing rather than merging"
-msgstr ""
-
-#: builtin/pull.c:159 builtin/revert.c:126
-msgid "allow fast-forward"
-msgstr ""
-
-#: builtin/pull.c:165
-msgid "control use of pre-merge-commit and commit-msg hooks"
-msgstr ""
-
-#: builtin/pull.c:171 parse-options.h:371
-msgid "automatically stash/stash pop before and after"
-msgstr ""
-
-#: builtin/pull.c:187
-msgid "Options related to fetching"
-msgstr ""
-
-#: builtin/pull.c:197
-msgid "force overwrite of local branch"
-msgstr ""
-
-#: builtin/pull.c:205
-msgid "number of submodules pulled in parallel"
-msgstr ""
-
-#: builtin/pull.c:449
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-
-#: builtin/pull.c:451
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-
-#: builtin/pull.c:452
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-
-#: builtin/pull.c:455
-#, c-format
-msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
-msgstr ""
-
-#: builtin/pull.c:460 builtin/rebase.c:978
-msgid "You are not currently on a branch."
-msgstr ""
-
-#: builtin/pull.c:462 builtin/pull.c:477
-msgid "Please specify which branch you want to rebase against."
-msgstr ""
-
-#: builtin/pull.c:464 builtin/pull.c:479
-msgid "Please specify which branch you want to merge with."
-msgstr ""
-
-#: builtin/pull.c:465 builtin/pull.c:480
-msgid "See git-pull(1) for details."
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:473 builtin/pull.c:482
-#: builtin/rebase.c:984
-msgid "<remote>"
-msgstr ""
-
-#: builtin/pull.c:467 builtin/pull.c:482 builtin/pull.c:487
-#: contrib/scalar/scalar.c:374
-msgid "<branch>"
-msgstr ""
-
-#: builtin/pull.c:475 builtin/rebase.c:976
-msgid "There is no tracking information for the current branch."
-msgstr ""
-
-#: builtin/pull.c:484
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-
-#: builtin/pull.c:489
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-
-#: builtin/pull.c:600
-#, c-format
-msgid "unable to access commit %s"
-msgstr ""
-
-#: builtin/pull.c:908
-msgid "ignoring --verify-signatures for rebase"
-msgstr ""
-
-#: builtin/pull.c:969
-msgid ""
-"You have divergent branches and need to specify how to reconcile them.\n"
-"You can do so by running one of the following commands sometime before\n"
-"your next pull:\n"
-"\n"
-"  git config pull.rebase false  # merge\n"
-"  git config pull.rebase true   # rebase\n"
-"  git config pull.ff only       # fast-forward only\n"
-"\n"
-"You can replace \"git config\" with \"git config --global\" to set a "
-"default\n"
-"preference for all repositories. You can also pass --rebase, --no-rebase,\n"
-"or --ff-only on the command line to override the configured default per\n"
-"invocation.\n"
-msgstr ""
-
-#: builtin/pull.c:1047
-msgid "Updating an unborn branch with changes added to the index."
-msgstr ""
-
-#: builtin/pull.c:1051
-msgid "pull with rebase"
-msgstr ""
-
-#: builtin/pull.c:1052
-msgid "please commit or stash them."
-msgstr ""
-
-#: builtin/pull.c:1077
-#, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
-msgstr ""
-
-#: builtin/pull.c:1083
-#, c-format
-msgid ""
-"Cannot fast-forward your working tree.\n"
-"After making sure that you saved anything precious from\n"
-"$ git diff %s\n"
-"output, run\n"
-"$ git reset --hard\n"
-"to recover."
-msgstr ""
-
-#: builtin/pull.c:1098
-msgid "Cannot merge multiple branches into empty head."
-msgstr ""
-
-#: builtin/pull.c:1103
-msgid "Cannot rebase onto multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1105
-msgid "Cannot fast-forward to multiple branches."
-msgstr ""
-
-#: builtin/pull.c:1120
-msgid "Need to specify how to reconcile divergent branches."
-msgstr ""
-
-#: builtin/pull.c:1134
-msgid "cannot rebase with locally recorded submodule modifications"
-msgstr ""
-
-#: builtin/push.c:19
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
-
-#: builtin/push.c:111
-msgid "tag shorthand without <tag>"
-msgstr ""
-
-#: builtin/push.c:119
-msgid "--delete only accepts plain target ref names"
-msgstr ""
-
-#: builtin/push.c:164
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
-msgstr ""
-
-#: builtin/push.c:167
-#, c-format
-msgid ""
-"The upstream branch of your current branch does not match\n"
-"the name of your current branch.  To push to the upstream branch\n"
-"on the remote, use\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"To push to the branch of the same name on the remote, use\n"
-"\n"
-"    git push %s HEAD\n"
-"%s"
-msgstr ""
-
-#: builtin/push.c:182
-#, c-format
-msgid ""
-"You are not currently on a branch.\n"
-"To push the history leading to the current (detached HEAD)\n"
-"state now, use\n"
-"\n"
-"    git push %s HEAD:<name-of-remote-branch>\n"
-msgstr ""
-
-#: builtin/push.c:191
-#, c-format
-msgid ""
-"The current branch %s has no upstream branch.\n"
-"To push the current branch and set the remote as upstream, use\n"
-"\n"
-"    git push --set-upstream %s %s\n"
-msgstr ""
-
-#: builtin/push.c:199
-#, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr ""
-
-#: builtin/push.c:217
-msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr ""
-
-#: builtin/push.c:243
-#, c-format
-msgid ""
-"You are pushing to remote '%s', which is not the upstream of\n"
-"your current branch '%s', without telling me what to push\n"
-"to update which remote branch."
-msgstr ""
-
-#: builtin/push.c:258
-msgid ""
-"Updates were rejected because the tip of your current branch is behind\n"
-"its remote counterpart. Integrate the remote changes (e.g.\n"
-"'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:264
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. Check out this branch and integrate the remote changes\n"
-"(e.g. 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:270
-msgid ""
-"Updates were rejected because the remote contains work that you do\n"
-"not have locally. This is usually caused by another repository pushing\n"
-"to the same ref. You may want to first integrate the remote changes\n"
-"(e.g., 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-
-#: builtin/push.c:277
-msgid "Updates were rejected because the tag already exists in the remote."
-msgstr ""
-
-#: builtin/push.c:280
-msgid ""
-"You cannot update a remote ref that points at a non-commit object,\n"
-"or update a remote ref to make it point at a non-commit object,\n"
-"without using the '--force' option.\n"
-msgstr ""
-
-#: builtin/push.c:285
-msgid ""
-"Updates were rejected because the tip of the remote-tracking\n"
-"branch has been updated since the last checkout. You may want\n"
-"to integrate those changes locally (e.g., 'git pull ...')\n"
-"before forcing an update.\n"
-msgstr ""
-
-#: builtin/push.c:355
-#, c-format
-msgid "Pushing to %s\n"
-msgstr ""
-
-#: builtin/push.c:362
-#, c-format
-msgid "failed to push some refs to '%s'"
-msgstr ""
-
-#: builtin/push.c:544 builtin/submodule--helper.c:3377
-msgid "repository"
-msgstr ""
-
-#: builtin/push.c:545 builtin/send-pack.c:193
-msgid "push all refs"
-msgstr ""
-
-#: builtin/push.c:546 builtin/send-pack.c:195
-msgid "mirror all refs"
-msgstr ""
-
-#: builtin/push.c:548
-msgid "delete refs"
-msgstr ""
-
-#: builtin/push.c:549
-msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
-
-#: builtin/push.c:552 builtin/send-pack.c:196
-msgid "force updates"
-msgstr ""
-
-#: builtin/push.c:553 builtin/send-pack.c:208
-msgid "<refname>:<expect>"
-msgstr ""
-
-#: builtin/push.c:554 builtin/send-pack.c:209
-msgid "require old value of ref to be at this value"
-msgstr ""
-
-#: builtin/push.c:557 builtin/send-pack.c:212
-msgid "require remote updates to be integrated locally"
-msgstr ""
-
-#: builtin/push.c:560
-msgid "control recursive pushing of submodules"
-msgstr ""
-
-#: builtin/push.c:561 builtin/send-pack.c:203
-msgid "use thin pack"
-msgstr ""
-
-#: builtin/push.c:562 builtin/push.c:563 builtin/send-pack.c:190
-#: builtin/send-pack.c:191
-msgid "receive pack program"
-msgstr ""
-
-#: builtin/push.c:564
-msgid "set upstream for git pull/status"
-msgstr ""
-
-#: builtin/push.c:567
-msgid "prune locally removed refs"
-msgstr ""
-
-#: builtin/push.c:569
-msgid "bypass pre-push hook"
-msgstr ""
-
-#: builtin/push.c:570
-msgid "push missing but relevant tags"
-msgstr ""
-
-#: builtin/push.c:572 builtin/send-pack.c:197
-msgid "GPG sign the push"
-msgstr ""
-
-#: builtin/push.c:574 builtin/send-pack.c:204
-msgid "request atomic transaction on remote side"
-msgstr ""
-
-#: builtin/push.c:594
-msgid "--delete doesn't make sense without any refs"
-msgstr ""
-
-#: builtin/push.c:614
-#, c-format
-msgid "bad repository '%s'"
-msgstr ""
-
-#: builtin/push.c:615
-msgid ""
-"No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote "
-"repository using\n"
-"\n"
-"    git remote add <name> <url>\n"
-"\n"
-"and then push using the remote name\n"
-"\n"
-"    git push <name>\n"
-msgstr ""
-
-#: builtin/push.c:632
-msgid "--all can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:638
-msgid "--mirror can't be combined with refspecs"
-msgstr ""
-
-#: builtin/push.c:648
-msgid "push options must not have new line characters"
-msgstr ""
-
-#: builtin/range-diff.c:9
-msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:10
-msgid "git range-diff [<options>] <old-tip>...<new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:11
-msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
-msgstr ""
-
-#: builtin/range-diff.c:30
-msgid "use simple diff colors"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "notes"
-msgstr ""
-
-#: builtin/range-diff.c:32
-msgid "passed to 'git log'"
-msgstr ""
-
-#: builtin/range-diff.c:35
-msgid "only emit output related to the first range"
-msgstr ""
-
-#: builtin/range-diff.c:37
-msgid "only emit output related to the second range"
-msgstr ""
-
-#: builtin/range-diff.c:60 builtin/range-diff.c:64
-#, c-format
-msgid "not a commit range: '%s'"
-msgstr ""
-
-#: builtin/range-diff.c:74
-msgid "single arg format must be symmetric range"
-msgstr ""
-
-#: builtin/range-diff.c:89
-msgid "need two commit ranges"
-msgstr ""
-
-#: builtin/read-tree.c:41
-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>]])"
-msgstr ""
-
-#: builtin/read-tree.c:116
-msgid "write resulting index to <file>"
-msgstr ""
-
-#: builtin/read-tree.c:119
-msgid "only empty the index"
-msgstr ""
-
-#: builtin/read-tree.c:121
-msgid "Merging"
-msgstr ""
-
-#: builtin/read-tree.c:123
-msgid "perform a merge in addition to a read"
-msgstr ""
-
-#: builtin/read-tree.c:125
-msgid "3-way merge if no file level merging required"
-msgstr ""
-
-#: builtin/read-tree.c:127
-msgid "3-way merge in presence of adds and removes"
-msgstr ""
-
-#: builtin/read-tree.c:129
-msgid "same as -m, but discard unmerged entries"
-msgstr ""
-
-#: builtin/read-tree.c:130
-msgid "<subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:131
-msgid "read the tree into the index under <subdirectory>/"
-msgstr ""
-
-#: builtin/read-tree.c:134
-msgid "update working tree with merge result"
-msgstr ""
-
-#: builtin/read-tree.c:136
-msgid "gitignore"
-msgstr ""
-
-#: builtin/read-tree.c:137
-msgid "allow explicitly ignored files to be overwritten"
-msgstr ""
-
-#: builtin/read-tree.c:140
-msgid "don't check the working tree after merging"
-msgstr ""
-
-#: builtin/read-tree.c:141
-msgid "don't update the index or the work tree"
-msgstr ""
-
-#: builtin/read-tree.c:143
-msgid "skip applying sparse checkout filter"
-msgstr ""
-
-#: builtin/read-tree.c:145
-msgid "debug unpack-trees"
-msgstr ""
-
-#: builtin/read-tree.c:149
-msgid "suppress feedback messages"
-msgstr ""
-
-#: builtin/read-tree.c:190
-msgid "You need to resolve your current index first"
-msgstr ""
-
-#: builtin/rebase.c:36
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] "
-"[<upstream> [<branch>]]"
-msgstr ""
-
-#: builtin/rebase.c:38
-msgid ""
-"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]"
-msgstr ""
-
-#: builtin/rebase.c:231
-#, c-format
-msgid "could not create temporary %s"
-msgstr ""
-
-#: builtin/rebase.c:237
-msgid "could not mark as interactive"
-msgstr ""
-
-#: builtin/rebase.c:290
-msgid "could not generate todo list"
-msgstr ""
-
-#: builtin/rebase.c:332
-msgid "a base commit must be provided with --upstream or --onto"
-msgstr ""
-
-#: builtin/rebase.c:391
-#, c-format
-msgid "%s requires the merge backend"
-msgstr ""
-
-#: builtin/rebase.c:433
-#, c-format
-msgid "could not get 'onto': '%s'"
-msgstr ""
-
-#: builtin/rebase.c:450
-#, c-format
-msgid "invalid orig-head: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:475
-#, c-format
-msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
-msgstr ""
-
-#: builtin/rebase.c:600
-msgid ""
-"Resolve all conflicts manually, mark them as resolved with\n"
-"\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
-"You can instead skip this commit: run \"git rebase --skip\".\n"
-"To abort and get back to the state before \"git rebase\", run \"git rebase --"
-"abort\"."
-msgstr ""
-
-#: builtin/rebase.c:685
-#, c-format
-msgid ""
-"\n"
-"git encountered an error while preparing the patches to replay\n"
-"these revisions:\n"
-"\n"
-"    %s\n"
-"\n"
-"As a result, git cannot rebase them."
-msgstr ""
-
-#: builtin/rebase.c:836
-#, c-format
-msgid "could not switch to %s"
-msgstr ""
-
-#: builtin/rebase.c:952
-#, c-format
-msgid ""
-"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
-"\"."
-msgstr ""
-
-#: builtin/rebase.c:970
-#, c-format
-msgid ""
-"%s\n"
-"Please specify which branch you want to rebase against.\n"
-"See git-rebase(1) for details.\n"
-"\n"
-"    git rebase '<branch>'\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:986
-#, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-"\n"
-msgstr ""
-
-#: builtin/rebase.c:1016
-msgid "exec commands cannot contain newlines"
-msgstr ""
-
-#: builtin/rebase.c:1020
-msgid "empty exec command"
-msgstr ""
-
-#: builtin/rebase.c:1051
-msgid "rebase onto given branch instead of upstream"
-msgstr ""
-
-#: builtin/rebase.c:1053
-msgid "use the merge-base of upstream and branch as the current base"
-msgstr ""
-
-#: builtin/rebase.c:1055
-msgid "allow pre-rebase hook to run"
-msgstr ""
-
-#: builtin/rebase.c:1057
-msgid "be quiet. implies --no-stat"
-msgstr ""
-
-#: builtin/rebase.c:1060
-msgid "display a diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1063
-msgid "do not show diffstat of what changed upstream"
-msgstr ""
-
-#: builtin/rebase.c:1066
-msgid "add a Signed-off-by trailer to each commit"
-msgstr ""
-
-#: builtin/rebase.c:1069
-msgid "make committer date match author date"
-msgstr ""
-
-#: builtin/rebase.c:1071
-msgid "ignore author date and use current date"
-msgstr ""
-
-#: builtin/rebase.c:1073
-msgid "synonym of --reset-author-date"
-msgstr ""
-
-#: builtin/rebase.c:1075 builtin/rebase.c:1079
-msgid "passed to 'git apply'"
-msgstr ""
-
-#: builtin/rebase.c:1077
-msgid "ignore changes in whitespace"
-msgstr ""
-
-#: builtin/rebase.c:1081 builtin/rebase.c:1084
-msgid "cherry-pick all commits, even if unchanged"
-msgstr ""
-
-#: builtin/rebase.c:1086
-msgid "continue"
-msgstr ""
-
-#: builtin/rebase.c:1089
-msgid "skip current patch and continue"
-msgstr ""
-
-#: builtin/rebase.c:1091
-msgid "abort and check out the original branch"
-msgstr ""
-
-#: builtin/rebase.c:1094
-msgid "abort but keep HEAD where it is"
-msgstr ""
-
-#: builtin/rebase.c:1095
-msgid "edit the todo list during an interactive rebase"
-msgstr ""
-
-#: builtin/rebase.c:1098
-msgid "show the patch file being applied or merged"
-msgstr ""
-
-#: builtin/rebase.c:1101
-msgid "use apply strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1105
-msgid "use merging strategies to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1109
-msgid "let the user edit the list of commits to rebase"
-msgstr ""
-
-#: builtin/rebase.c:1113
-msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
-msgstr ""
-
-#: builtin/rebase.c:1118
-msgid "how to handle commits that become empty"
-msgstr ""
-
-#: builtin/rebase.c:1121
-msgid "keep commits which start empty"
-msgstr ""
-
-#: builtin/rebase.c:1125
-msgid "move commits that begin with squash!/fixup! under -i"
-msgstr ""
-
-#: builtin/rebase.c:1132
-msgid "add exec lines after each commit of the editable list"
-msgstr ""
-
-#: builtin/rebase.c:1136
-msgid "allow rebasing commits with empty messages"
-msgstr ""
-
-#: builtin/rebase.c:1140
-msgid "try to rebase merges instead of skipping them"
-msgstr ""
-
-#: builtin/rebase.c:1143
-msgid "use 'merge-base --fork-point' to refine upstream"
-msgstr ""
-
-#: builtin/rebase.c:1145
-msgid "use the given merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1147 builtin/revert.c:115
-msgid "option"
-msgstr ""
-
-#: builtin/rebase.c:1148
-msgid "pass the argument through to the merge strategy"
-msgstr ""
-
-#: builtin/rebase.c:1151
-msgid "rebase all reachable commits up to the root(s)"
-msgstr ""
-
-#: builtin/rebase.c:1154
-msgid "automatically re-schedule any `exec` that fails"
-msgstr ""
-
-#: builtin/rebase.c:1156
-msgid "apply all changes, even those already present upstream"
-msgstr ""
-
-#: builtin/rebase.c:1177
-msgid "It looks like 'git am' is in progress. Cannot rebase."
-msgstr ""
-
-#: builtin/rebase.c:1208
-msgid "--preserve-merges was replaced by --rebase-merges"
-msgstr ""
-
-#: builtin/rebase.c:1230
-msgid "No rebase in progress?"
-msgstr ""
-
-#: builtin/rebase.c:1234
-msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
-
-#: builtin/rebase.c:1257 t/helper/test-fast-rebase.c:122
-msgid "Cannot read HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1269
-msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
-msgstr ""
-
-#: builtin/rebase.c:1287
-msgid "could not discard worktree changes"
-msgstr ""
-
-#: builtin/rebase.c:1308
-#, c-format
-msgid "could not move back to %s"
-msgstr ""
-
-#: builtin/rebase.c:1354
-#, c-format
-msgid ""
-"It seems that there is already a %s directory, and\n"
-"I wonder if you are in the middle of another rebase.  If that is the\n"
-"case, please try\n"
-"\t%s\n"
-"If that is not the case, please\n"
-"\t%s\n"
-"and run me again.  I am stopping in case you still have something\n"
-"valuable there.\n"
-msgstr ""
-
-#: builtin/rebase.c:1382
-msgid "switch `C' expects a numerical value"
-msgstr ""
-
-#: builtin/rebase.c:1424
-#, c-format
-msgid "Unknown mode: %s"
-msgstr ""
-
-#: builtin/rebase.c:1463
-msgid "--strategy requires --merge or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1492
-msgid "apply options and merge options cannot be used together"
-msgstr ""
-
-#: builtin/rebase.c:1505
-#, c-format
-msgid "Unknown rebase backend: %s"
-msgstr ""
-
-#: builtin/rebase.c:1534
-msgid "--reschedule-failed-exec requires --exec or --interactive"
-msgstr ""
-
-#: builtin/rebase.c:1565
-#, c-format
-msgid "invalid upstream '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1571
-msgid "Could not create new root commit"
-msgstr ""
-
-#: builtin/rebase.c:1597
-#, c-format
-msgid "'%s': need exactly one merge base with branch"
-msgstr ""
-
-#: builtin/rebase.c:1600
-#, c-format
-msgid "'%s': need exactly one merge base"
-msgstr ""
-
-#: builtin/rebase.c:1609
-#, c-format
-msgid "Does not point to a valid commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1636
-#, c-format
-msgid "no such branch/commit '%s'"
-msgstr ""
-
-#: builtin/rebase.c:1647 builtin/submodule--helper.c:43
-#: builtin/submodule--helper.c:2477
-#, c-format
-msgid "No such ref: %s"
-msgstr ""
-
-#: builtin/rebase.c:1658
-msgid "Could not resolve HEAD to a revision"
-msgstr ""
-
-#: builtin/rebase.c:1679
-msgid "Please commit or stash them."
-msgstr ""
-
-#: builtin/rebase.c:1714
-msgid "HEAD is up to date."
-msgstr ""
-
-#: builtin/rebase.c:1716
-#, c-format
-msgid "Current branch %s is up to date.\n"
-msgstr ""
-
-#: builtin/rebase.c:1724
-msgid "HEAD is up to date, rebase forced."
-msgstr ""
-
-#: builtin/rebase.c:1726
-#, c-format
-msgid "Current branch %s is up to date, rebase forced.\n"
-msgstr ""
-
-#: builtin/rebase.c:1734
-msgid "The pre-rebase hook refused to rebase."
-msgstr ""
-
-#: builtin/rebase.c:1741
-#, c-format
-msgid "Changes to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1744
-#, c-format
-msgid "Changes from %s to %s:\n"
-msgstr ""
-
-#: builtin/rebase.c:1769
-#, c-format
-msgid "First, rewinding head to replay your work on top of it...\n"
-msgstr ""
-
-#: builtin/rebase.c:1781
-msgid "Could not detach HEAD"
-msgstr ""
-
-#: builtin/rebase.c:1790
-#, c-format
-msgid "Fast-forwarded %s to %s.\n"
-msgstr ""
-
-#: builtin/receive-pack.c:35
-msgid "git receive-pack <git-dir>"
-msgstr ""
-
-#: builtin/receive-pack.c:1263
-msgid ""
-"By default, updating the current branch in a non-bare repository\n"
-"is denied, because it will make the index and work tree inconsistent\n"
-"with what you pushed, and will require 'git reset --hard' to match\n"
-"the work tree to HEAD.\n"
-"\n"
-"You can set the 'receive.denyCurrentBranch' configuration variable\n"
-"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
-"its current branch; however, this is not recommended unless you\n"
-"arranged to update its work tree to match what you pushed in some\n"
-"other way.\n"
-"\n"
-"To squelch this message and still keep the default behaviour, set\n"
-"'receive.denyCurrentBranch' configuration variable to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:1283
-msgid ""
-"By default, deleting the current branch is denied, because the next\n"
-"'git clone' won't result in any file checked out, causing confusion.\n"
-"\n"
-"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
-"'warn' or 'ignore' in the remote repository to allow deleting the\n"
-"current branch, with or without a warning message.\n"
-"\n"
-"To squelch this message, you can set it to 'refuse'."
-msgstr ""
-
-#: builtin/receive-pack.c:2476
-msgid "quiet"
-msgstr ""
-
-#: builtin/receive-pack.c:2491
-msgid "you must specify a directory"
-msgstr ""
-
-#: builtin/reflog.c:9
-msgid "git reflog [show] [<log-options>] [<ref>]"
-msgstr ""
-
-#: builtin/reflog.c:12
-msgid ""
-"git reflog expire [--expire=<time>] [--expire-unreachable=<time>]\n"
-"                  [--rewrite] [--updateref] [--stale-fix]\n"
-"                  [--dry-run | -n] [--verbose] [--all [--single-worktree] | "
-"<refs>...]"
-msgstr ""
-
-#: builtin/reflog.c:17
-msgid ""
-"git reflog delete [--rewrite] [--updateref]\n"
-"                  [--dry-run | -n] [--verbose] <ref>@{<specifier>}..."
-msgstr ""
-
-#: builtin/reflog.c:21
-msgid "git reflog exists <ref>"
-msgstr ""
-
-#: builtin/reflog.c:197 builtin/reflog.c:211
-#, c-format
-msgid "invalid timestamp '%s' given to '--%s'"
-msgstr ""
-
-#: builtin/reflog.c:240 builtin/reflog.c:359
-msgid "do not actually prune any entries"
-msgstr ""
-
-#: builtin/reflog.c:243 builtin/reflog.c:362
-msgid ""
-"rewrite the old SHA1 with the new SHA1 of the entry that now precedes it"
-msgstr ""
-
-#: builtin/reflog.c:246 builtin/reflog.c:365
-msgid "update the reference to the value of the top reflog entry"
-msgstr ""
-
-#: builtin/reflog.c:248 builtin/reflog.c:367
-msgid "print extra information on screen"
-msgstr ""
-
-#: builtin/reflog.c:249 builtin/reflog.c:253
-msgid "timestamp"
-msgstr ""
-
-#: builtin/reflog.c:250
-msgid "prune entries older than the specified time"
-msgstr ""
-
-#: builtin/reflog.c:254
-msgid ""
-"prune entries older than <time> that are not reachable from the current tip "
-"of the branch"
-msgstr ""
-
-#: builtin/reflog.c:258
-msgid "prune any reflog entries that point to broken commits"
-msgstr ""
-
-#: builtin/reflog.c:259
-msgid "process the reflogs of all references"
-msgstr ""
-
-#: builtin/reflog.c:261
-msgid "limits processing to reflogs from the current worktree only"
-msgstr ""
-
-#: builtin/reflog.c:294
-#, c-format
-msgid "Marking reachable objects..."
-msgstr ""
-
-#: builtin/reflog.c:338
-#, c-format
-msgid "%s points nowhere!"
-msgstr ""
-
-#: builtin/reflog.c:374
-msgid "no reflog specified to delete"
-msgstr ""
-
-#: builtin/reflog.c:396
-#, c-format
-msgid "invalid ref format: %s"
-msgstr ""
-
-#: builtin/remote.c:19
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:20 builtin/remote.c:40
-msgid "git remote rename [--[no-]progress] <old> <new>"
-msgstr ""
-
-#: builtin/remote.c:21 builtin/remote.c:45
-msgid "git remote remove <name>"
-msgstr ""
-
-#: builtin/remote.c:22 builtin/remote.c:50
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr ""
-
-#: builtin/remote.c:23
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr ""
-
-#: builtin/remote.c:24
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr ""
-
-#: builtin/remote.c:25
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
-
-#: builtin/remote.c:26
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:27 builtin/remote.c:76
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr ""
-
-#: builtin/remote.c:28 builtin/remote.c:81
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr ""
-
-#: builtin/remote.c:29 builtin/remote.c:82
-msgid "git remote set-url --add <name> <newurl>"
-msgstr ""
-
-#: builtin/remote.c:30 builtin/remote.c:83
-msgid "git remote set-url --delete <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:35
-msgid "git remote add [<options>] <name> <url>"
-msgstr ""
-
-#: builtin/remote.c:55
-msgid "git remote set-branches <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:56
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr ""
-
-#: builtin/remote.c:61
-msgid "git remote show [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:66
-msgid "git remote prune [<options>] <name>"
-msgstr ""
-
-#: builtin/remote.c:71
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr ""
-
-#: builtin/remote.c:100
-#, c-format
-msgid "Updating %s"
-msgstr ""
-
-#: builtin/remote.c:102
-#, c-format
-msgid "Could not fetch %s"
-msgstr ""
-
-#: builtin/remote.c:132
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
-msgstr ""
-
-#: builtin/remote.c:149
-#, c-format
-msgid "unknown mirror argument: %s"
-msgstr ""
-
-#: builtin/remote.c:165
-msgid "fetch the remote branches"
-msgstr ""
-
-#: builtin/remote.c:167
-msgid "import all tags and associated objects when fetching"
-msgstr ""
-
-#: builtin/remote.c:170
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr ""
-
-#: builtin/remote.c:172
-msgid "branch(es) to track"
-msgstr ""
-
-#: builtin/remote.c:173
-msgid "master branch"
-msgstr ""
-
-#: builtin/remote.c:175
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr ""
-
-#: builtin/remote.c:187
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr ""
-
-#: builtin/remote.c:189
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr ""
-
-#: builtin/remote.c:196 builtin/remote.c:716
-#, c-format
-msgid "remote %s already exists."
-msgstr ""
-
-#: builtin/remote.c:241
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr ""
-
-#: builtin/remote.c:323
-#, c-format
-msgid "unhandled branch.%s.rebase=%s; assuming 'true'"
-msgstr ""
-
-#: builtin/remote.c:367
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr ""
-
-#: builtin/remote.c:461 builtin/remote.c:469
-msgid "(matching)"
-msgstr ""
-
-#: builtin/remote.c:473
-msgid "(delete)"
-msgstr ""
-
-#: builtin/remote.c:664
-#, c-format
-msgid "could not set '%s'"
-msgstr ""
-
-#: builtin/remote.c:669
-#, c-format
-msgid ""
-"The %s configuration remote.pushDefault in:\n"
-"\t%s:%d\n"
-"now names the non-existent remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:707 builtin/remote.c:866 builtin/remote.c:973
-#, c-format
-msgid "No such remote: '%s'"
-msgstr ""
-
-#: builtin/remote.c:726
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr ""
-
-#: builtin/remote.c:746
-#, c-format
-msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
-msgstr ""
-
-#: builtin/remote.c:783
-msgid "Renaming remote references"
-msgstr ""
-
-#: builtin/remote.c:794
-#, c-format
-msgid "deleting '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:832
-#, c-format
-msgid "creating '%s' failed"
-msgstr ""
-
-#: builtin/remote.c:912
-msgid ""
-"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
-"to delete it, use:"
-msgid_plural ""
-"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
-"to delete them, use:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:926
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr ""
-
-#: builtin/remote.c:1034
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
-msgstr ""
-
-#: builtin/remote.c:1037
-msgid " tracked"
-msgstr ""
-
-#: builtin/remote.c:1039
-msgid " stale (use 'git remote prune' to remove)"
-msgstr ""
-
-#: builtin/remote.c:1041
-msgid " ???"
-msgstr ""
-
-#: builtin/remote.c:1082
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr ""
-
-#: builtin/remote.c:1091
-#, c-format
-msgid "rebases interactively onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1093
-#, c-format
-msgid "rebases interactively (with merges) onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1096
-#, c-format
-msgid "rebases onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:1100
-#, c-format
-msgid " merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1103
-#, c-format
-msgid "merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:1106
-#, c-format
-msgid "%-*s    and with remote %s\n"
-msgstr ""
-
-#: builtin/remote.c:1149
-msgid "create"
-msgstr ""
-
-#: builtin/remote.c:1152
-msgid "delete"
-msgstr ""
-
-#: builtin/remote.c:1156
-msgid "up to date"
-msgstr ""
-
-#: builtin/remote.c:1159
-msgid "fast-forwardable"
-msgstr ""
-
-#: builtin/remote.c:1162
-msgid "local out of date"
-msgstr ""
-
-#: builtin/remote.c:1169
-#, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1172
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr ""
-
-#: builtin/remote.c:1176
-#, c-format
-msgid "    %-*s forces to %s"
-msgstr ""
-
-#: builtin/remote.c:1179
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr ""
-
-#: builtin/remote.c:1247
-msgid "do not query remotes"
-msgstr ""
-
-#: builtin/remote.c:1268
-#, c-format
-msgid "* remote %s"
-msgstr ""
-
-#: builtin/remote.c:1269
-#, c-format
-msgid "  Fetch URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1270 builtin/remote.c:1286 builtin/remote.c:1423
-msgid "(no URL)"
-msgstr ""
-
-#. TRANSLATORS: the colon ':' should align
-#. with the one in " Fetch URL: %s"
-#. translation.
-#.
-#: builtin/remote.c:1284 builtin/remote.c:1286
-#, c-format
-msgid "  Push  URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1288 builtin/remote.c:1290 builtin/remote.c:1292
-#, c-format
-msgid "  HEAD branch: %s"
-msgstr ""
-
-#: builtin/remote.c:1288
-msgid "(not queried)"
-msgstr ""
-
-#: builtin/remote.c:1290
-msgid "(unknown)"
-msgstr ""
-
-#: builtin/remote.c:1294
-#, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr ""
-
-#: builtin/remote.c:1306
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1309 builtin/remote.c:1335
-msgid " (status not queried)"
-msgstr ""
-
-#: builtin/remote.c:1318
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1326
-msgid "  Local refs will be mirrored by 'git push'"
-msgstr ""
-
-#: builtin/remote.c:1332
-#, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1353
-msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr ""
-
-#: builtin/remote.c:1355
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr ""
-
-#: builtin/remote.c:1369
-msgid "Cannot determine remote HEAD"
-msgstr ""
-
-#: builtin/remote.c:1371
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
-msgstr ""
-
-#: builtin/remote.c:1381
-#, c-format
-msgid "Could not delete %s"
-msgstr ""
-
-#: builtin/remote.c:1389
-#, c-format
-msgid "Not a valid ref: %s"
-msgstr ""
-
-#: builtin/remote.c:1391
-#, c-format
-msgid "Could not setup %s"
-msgstr ""
-
-#: builtin/remote.c:1409
-#, c-format
-msgid " %s will become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1410
-#, c-format
-msgid " %s has become dangling!"
-msgstr ""
-
-#: builtin/remote.c:1419
-#, c-format
-msgid "Pruning %s"
-msgstr ""
-
-#: builtin/remote.c:1420
-#, c-format
-msgid "URL: %s"
-msgstr ""
-
-#: builtin/remote.c:1436
-#, c-format
-msgid " * [would prune] %s"
-msgstr ""
-
-#: builtin/remote.c:1439
-#, c-format
-msgid " * [pruned] %s"
-msgstr ""
-
-#: builtin/remote.c:1484
-msgid "prune remotes after fetching"
-msgstr ""
-
-#: builtin/remote.c:1548 builtin/remote.c:1604 builtin/remote.c:1674
-#, c-format
-msgid "No such remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1566
-msgid "add branch"
-msgstr ""
-
-#: builtin/remote.c:1573
-msgid "no remote specified"
-msgstr ""
-
-#: builtin/remote.c:1590
-msgid "query push URLs rather than fetch URLs"
-msgstr ""
-
-#: builtin/remote.c:1592
-msgid "return all URLs"
-msgstr ""
-
-#: builtin/remote.c:1622
-#, c-format
-msgid "no URLs configured for remote '%s'"
-msgstr ""
-
-#: builtin/remote.c:1648
-msgid "manipulate push URLs"
-msgstr ""
-
-#: builtin/remote.c:1650
-msgid "add URL"
-msgstr ""
-
-#: builtin/remote.c:1652
-msgid "delete URLs"
-msgstr ""
-
-#: builtin/remote.c:1659
-msgid "--add --delete doesn't make sense"
-msgstr ""
-
-#: builtin/remote.c:1700
-#, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr ""
-
-#: builtin/remote.c:1708
-#, c-format
-msgid "No such URL found: %s"
-msgstr ""
-
-#: builtin/remote.c:1710
-msgid "Will not delete all non-push URLs"
-msgstr ""
-
-#: builtin/remote.c:1727
-msgid "be verbose; must be placed before a subcommand"
-msgstr ""
-
-#: builtin/repack.c:29
-msgid "git repack [<options>]"
-msgstr ""
-
-#: builtin/repack.c:34
-msgid ""
-"Incremental repacks are incompatible with bitmap indexes.  Use\n"
-"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
-msgstr ""
-
-#: builtin/repack.c:206
-msgid "could not start pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:280 builtin/repack.c:824
-msgid "repack: Expecting full hex object ID lines only from pack-objects."
-msgstr ""
-
-#: builtin/repack.c:304
-msgid "could not finish pack-objects to repack promisor objects"
-msgstr ""
-
-#: builtin/repack.c:319
-#, c-format
-msgid "cannot open index for %s"
-msgstr ""
-
-#: builtin/repack.c:378
-#, c-format
-msgid "pack %s too large to consider in geometric progression"
-msgstr ""
-
-#: builtin/repack.c:411 builtin/repack.c:418 builtin/repack.c:423
-#, c-format
-msgid "pack %s too large to roll up"
-msgstr ""
-
-#: builtin/repack.c:503
-#, c-format
-msgid "could not open tempfile %s for writing"
-msgstr ""
-
-#: builtin/repack.c:521
-msgid "could not close refs snapshot tempfile"
-msgstr ""
-
-#: builtin/repack.c:634
-msgid "pack everything in a single pack"
-msgstr ""
-
-#: builtin/repack.c:636
-msgid "same as -a, and turn unreachable objects loose"
-msgstr ""
-
-#: builtin/repack.c:639
-msgid "remove redundant packs, and run git-prune-packed"
-msgstr ""
-
-#: builtin/repack.c:641
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:643
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:645
-msgid "do not run git-update-server-info"
-msgstr ""
-
-#: builtin/repack.c:648
-msgid "pass --local to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:650
-msgid "write bitmap index"
-msgstr ""
-
-#: builtin/repack.c:652
-msgid "pass --delta-islands to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:653
-msgid "approxidate"
-msgstr ""
-
-#: builtin/repack.c:654
-msgid "with -A, do not loosen objects older than this"
-msgstr ""
-
-#: builtin/repack.c:656
-msgid "with -a, repack unreachable objects"
-msgstr ""
-
-#: builtin/repack.c:658
-msgid "size of the window used for delta compression"
-msgstr ""
-
-#: builtin/repack.c:659 builtin/repack.c:665
-msgid "bytes"
-msgstr ""
-
-#: builtin/repack.c:660
-msgid "same as the above, but limit memory size instead of entries count"
-msgstr ""
-
-#: builtin/repack.c:662
-msgid "limits the maximum delta depth"
-msgstr ""
-
-#: builtin/repack.c:664
-msgid "limits the maximum number of threads"
-msgstr ""
-
-#: builtin/repack.c:666
-msgid "maximum size of each packfile"
-msgstr ""
-
-#: builtin/repack.c:668
-msgid "repack objects in packs marked with .keep"
-msgstr ""
-
-#: builtin/repack.c:670
-msgid "do not repack this pack"
-msgstr ""
-
-#: builtin/repack.c:672
-msgid "find a geometric progression with factor <N>"
-msgstr ""
-
-#: builtin/repack.c:674
-msgid "write a multi-pack index of the resulting packs"
-msgstr ""
-
-#: builtin/repack.c:684
-msgid "cannot delete packs in a precious-objects repo"
-msgstr ""
-
-#: builtin/repack.c:833
-msgid "Nothing new to pack."
-msgstr ""
-
-#: builtin/repack.c:863
-#, c-format
-msgid "missing required file: %s"
-msgstr ""
-
-#: builtin/repack.c:865
-#, c-format
-msgid "could not unlink: %s"
-msgstr ""
-
-#: builtin/replace.c:22
-msgid "git replace [-f] <object> <replacement>"
-msgstr ""
-
-#: builtin/replace.c:23
-msgid "git replace [-f] --edit <object>"
-msgstr ""
-
-#: builtin/replace.c:24
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr ""
-
-#: builtin/replace.c:26
-msgid "git replace -d <object>..."
-msgstr ""
-
-#: builtin/replace.c:27
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr ""
-
-#: builtin/replace.c:90
-#, c-format
-msgid ""
-"invalid replace format '%s'\n"
-"valid formats are 'short', 'medium' and 'long'"
-msgstr ""
-
-#: builtin/replace.c:125
-#, c-format
-msgid "replace ref '%s' not found"
-msgstr ""
-
-#: builtin/replace.c:141
-#, c-format
-msgid "Deleted replace ref '%s'"
-msgstr ""
-
-#: builtin/replace.c:153
-#, c-format
-msgid "'%s' is not a valid ref name"
-msgstr ""
-
-#: builtin/replace.c:158
-#, c-format
-msgid "replace ref '%s' already exists"
-msgstr ""
-
-#: builtin/replace.c:178
-#, c-format
-msgid ""
-"Objects must be of the same type.\n"
-"'%s' points to a replaced object of type '%s'\n"
-"while '%s' points to a replacement object of type '%s'."
-msgstr ""
-
-#: builtin/replace.c:229
-#, c-format
-msgid "unable to open %s for writing"
-msgstr ""
-
-#: builtin/replace.c:242
-msgid "cat-file reported failure"
-msgstr ""
-
-#: builtin/replace.c:258
-#, c-format
-msgid "unable to open %s for reading"
-msgstr ""
-
-#: builtin/replace.c:271
-msgid "unable to spawn mktree"
-msgstr ""
-
-#: builtin/replace.c:275
-msgid "unable to read from mktree"
-msgstr ""
-
-#: builtin/replace.c:284
-msgid "mktree reported failure"
-msgstr ""
-
-#: builtin/replace.c:288
-msgid "mktree did not return an object name"
-msgstr ""
-
-#: builtin/replace.c:297
-#, c-format
-msgid "unable to fstat %s"
-msgstr ""
-
-#: builtin/replace.c:302
-msgid "unable to write object to database"
-msgstr ""
-
-#: builtin/replace.c:325
-#, c-format
-msgid "unable to get object type for %s"
-msgstr ""
-
-#: builtin/replace.c:341
-msgid "editing object file failed"
-msgstr ""
-
-#: builtin/replace.c:350
-#, c-format
-msgid "new object is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:383
-#, c-format
-msgid "could not parse %s as a commit"
-msgstr ""
-
-#: builtin/replace.c:415
-#, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:417
-#, c-format
-msgid "malformed mergetag in commit '%s'"
-msgstr ""
-
-#: builtin/replace.c:429
-#, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
-msgstr ""
-
-#: builtin/replace.c:468
-#, c-format
-msgid "the original commit '%s' has a gpg signature"
-msgstr ""
-
-#: builtin/replace.c:469
-msgid "the signature will be removed in the replacement commit!"
-msgstr ""
-
-#: builtin/replace.c:479
-#, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr ""
-
-#: builtin/replace.c:487
-#, c-format
-msgid "graft for '%s' unnecessary"
-msgstr ""
-
-#: builtin/replace.c:491
-#, c-format
-msgid "new commit is the same as the old one: '%s'"
-msgstr ""
-
-#: builtin/replace.c:526
-#, c-format
-msgid ""
-"could not convert the following graft(s):\n"
-"%s"
-msgstr ""
-
-#: builtin/replace.c:547
-msgid "list replace refs"
-msgstr ""
-
-#: builtin/replace.c:548
-msgid "delete replace refs"
-msgstr ""
-
-#: builtin/replace.c:549
-msgid "edit existing object"
-msgstr ""
-
-#: builtin/replace.c:550
-msgid "change a commit's parents"
-msgstr ""
-
-#: builtin/replace.c:551
-msgid "convert existing graft file"
-msgstr ""
-
-#: builtin/replace.c:552
-msgid "replace the ref if it exists"
-msgstr ""
-
-#: builtin/replace.c:554
-msgid "do not pretty-print contents for --edit"
-msgstr ""
-
-#: builtin/replace.c:555
-msgid "use this format"
-msgstr ""
-
-#: builtin/replace.c:568
-msgid "--format cannot be used when not listing"
-msgstr ""
-
-#: builtin/replace.c:576
-msgid "-f only makes sense when writing a replacement"
-msgstr ""
-
-#: builtin/replace.c:580
-msgid "--raw only makes sense with --edit"
-msgstr ""
-
-#: builtin/replace.c:586
-msgid "-d needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:592
-msgid "bad number of arguments"
-msgstr ""
-
-#: builtin/replace.c:598
-msgid "-e needs exactly one argument"
-msgstr ""
-
-#: builtin/replace.c:604
-msgid "-g needs at least one argument"
-msgstr ""
-
-#: builtin/replace.c:610
-msgid "--convert-graft-file takes no argument"
-msgstr ""
-
-#: builtin/replace.c:616
-msgid "only one pattern can be given with -l"
-msgstr ""
-
-#: builtin/rerere.c:13
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr ""
-
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr ""
-
-#: builtin/rerere.c:77
-msgid "'git rerere forget' without paths is deprecated"
-msgstr ""
-
-#: builtin/rerere.c:111
-#, c-format
-msgid "unable to generate diff for '%s'"
-msgstr ""
-
-#: builtin/reset.c:33
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
-msgstr ""
-
-#: builtin/reset.c:34
-msgid "git reset [-q] [<tree-ish>] [--] <pathspec>..."
-msgstr ""
-
-#: builtin/reset.c:35
-msgid ""
-"git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]"
-msgstr ""
-
-#: builtin/reset.c:36
-msgid "git reset --patch [<tree-ish>] [--] [<pathspec>...]"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "mixed"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "soft"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "hard"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "merge"
-msgstr ""
-
-#: builtin/reset.c:42
-msgid "keep"
-msgstr ""
-
-#: builtin/reset.c:90
-msgid "You do not have a valid HEAD."
-msgstr ""
-
-#: builtin/reset.c:92
-msgid "Failed to find tree of HEAD."
-msgstr ""
-
-#: builtin/reset.c:98
-#, c-format
-msgid "Failed to find tree of %s."
-msgstr ""
-
-#: builtin/reset.c:123
-#, c-format
-msgid "HEAD is now at %s"
-msgstr ""
-
-#: builtin/reset.c:304
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
-
-#: builtin/reset.c:402 builtin/stash.c:606 builtin/stash.c:669
-#: builtin/stash.c:693
-msgid "be quiet, only report errors"
-msgstr ""
-
-#: builtin/reset.c:404
-msgid "skip refreshing the index after reset"
-msgstr ""
-
-#: builtin/reset.c:406
-msgid "reset HEAD and index"
-msgstr ""
-
-#: builtin/reset.c:407
-msgid "reset only HEAD"
-msgstr ""
-
-#: builtin/reset.c:409 builtin/reset.c:411
-msgid "reset HEAD, index and working tree"
-msgstr ""
-
-#: builtin/reset.c:413
-msgid "reset HEAD but keep local changes"
-msgstr ""
-
-#: builtin/reset.c:419
-msgid "record only the fact that removed paths will be added later"
-msgstr ""
-
-#: builtin/reset.c:452
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
-
-#: builtin/reset.c:460
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
-
-#: builtin/reset.c:479
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-
-#: builtin/reset.c:481
-#, c-format
-msgid "Cannot do %s reset with paths."
-msgstr ""
-
-#: builtin/reset.c:496
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr ""
-
-#: builtin/reset.c:527
-msgid "Unstaged changes after reset:"
-msgstr ""
-
-#: builtin/reset.c:530
-#, c-format
-msgid ""
-"It took %.2f seconds to refresh the index after reset.  You can use\n"
-"'--no-refresh' to avoid this."
-msgstr ""
-
-#: builtin/reset.c:547
-#, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr ""
-
-#: builtin/reset.c:552
-msgid "Could not write new index file."
-msgstr ""
-
-#: builtin/rev-list.c:659
-msgid "rev-list does not support display of notes"
-msgstr ""
-
-#: builtin/rev-list.c:664
-#, c-format
-msgid "marked counting and '%s' cannot be used together"
-msgstr ""
-
-#: builtin/rev-parse.c:409
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr ""
-
-#: builtin/rev-parse.c:414
-msgid "keep the `--` passed as an arg"
-msgstr ""
-
-#: builtin/rev-parse.c:416
-msgid "stop parsing after the first non-option argument"
-msgstr ""
-
-#: builtin/rev-parse.c:419
-msgid "output in stuck long form"
-msgstr ""
-
-#: builtin/rev-parse.c:438
-msgid "premature end of input"
-msgstr ""
-
-#: builtin/rev-parse.c:442
-msgid "no usage string given before the `--' separator"
-msgstr ""
-
-#: builtin/rev-parse.c:548
-msgid "Needed a single revision"
-msgstr ""
-
-#: builtin/rev-parse.c:552
-msgid ""
-"git rev-parse --parseopt [<options>] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [<options>] [<arg>...]\n"
-"\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
-msgstr ""
-
-#: builtin/rev-parse.c:712
-msgid "--resolve-git-dir requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:715
-#, c-format
-msgid "not a gitdir '%s'"
-msgstr ""
-
-#: builtin/rev-parse.c:739
-msgid "--git-path requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:749
-msgid "-n requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:763
-msgid "--path-format requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:769
-#, c-format
-msgid "unknown argument to --path-format: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:776
-msgid "--default requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:782
-msgid "--prefix requires an argument"
-msgstr ""
-
-#: builtin/rev-parse.c:851
-#, c-format
-msgid "unknown mode for --abbrev-ref: %s"
-msgstr ""
-
-#: builtin/rev-parse.c:1023
-#, c-format
-msgid "unknown mode for --show-object-format: %s"
-msgstr ""
-
-#: builtin/revert.c:24
-msgid "git revert [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:25
-msgid "git revert <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:30
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr ""
-
-#: builtin/revert.c:31
-msgid "git cherry-pick <subcommand>"
-msgstr ""
-
-#: builtin/revert.c:72
-#, c-format
-msgid "option `%s' expects a number greater than zero"
-msgstr ""
-
-#: builtin/revert.c:92
-#, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr ""
-
-#: builtin/revert.c:102
-msgid "end revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:103
-msgid "resume revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:104
-msgid "cancel revert or cherry-pick sequence"
-msgstr ""
-
-#: builtin/revert.c:105
-msgid "skip current commit and continue"
-msgstr ""
-
-#: builtin/revert.c:107
-msgid "don't automatically commit"
-msgstr ""
-
-#: builtin/revert.c:108
-msgid "edit the commit message"
-msgstr ""
-
-#: builtin/revert.c:111
-msgid "parent-number"
-msgstr ""
-
-#: builtin/revert.c:112
-msgid "select mainline parent"
-msgstr ""
-
-#: builtin/revert.c:114
-msgid "merge strategy"
-msgstr ""
-
-#: builtin/revert.c:116
-msgid "option for merge strategy"
-msgstr ""
-
-#: builtin/revert.c:125
-msgid "append commit name"
-msgstr ""
-
-#: builtin/revert.c:127
-msgid "preserve initially empty commits"
-msgstr ""
-
-#: builtin/revert.c:128
-msgid "allow commits with empty messages"
-msgstr ""
-
-#: builtin/revert.c:129
-msgid "keep redundant, empty commits"
-msgstr ""
-
-#: builtin/revert.c:241
-msgid "revert failed"
-msgstr ""
-
-#: builtin/revert.c:254
-msgid "cherry-pick failed"
-msgstr ""
-
-#: builtin/rm.c:20
-msgid "git rm [<options>] [--] <file>..."
-msgstr ""
-
-#: builtin/rm.c:208
-msgid ""
-"the following file has staged content different from both the\n"
-"file and the HEAD:"
-msgid_plural ""
-"the following files have staged content different from both the\n"
-"file and the HEAD:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:213
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:217
-msgid "the following file has changes staged in the index:"
-msgid_plural "the following files have changes staged in the index:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:221 builtin/rm.c:230
-msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
-msgstr ""
-
-#: builtin/rm.c:227
-msgid "the following file has local modifications:"
-msgid_plural "the following files have local modifications:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:245
-msgid "do not list removed files"
-msgstr ""
-
-#: builtin/rm.c:246
-msgid "only remove from the index"
-msgstr ""
-
-#: builtin/rm.c:247
-msgid "override the up-to-date check"
-msgstr ""
-
-#: builtin/rm.c:248
-msgid "allow recursive removal"
-msgstr ""
-
-#: builtin/rm.c:250
-msgid "exit with a zero status even if nothing matched"
-msgstr ""
-
-#: builtin/rm.c:285
-msgid "No pathspec was given. Which files should I remove?"
-msgstr ""
-
-#: builtin/rm.c:315
-msgid "please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/rm.c:337
-#, c-format
-msgid "not removing '%s' recursively without -r"
-msgstr ""
-
-#: builtin/rm.c:385
-#, c-format
-msgid "git rm: unable to remove %s"
-msgstr ""
-
-#: builtin/send-pack.c:20
-msgid ""
-"git send-pack [--mirror] [--dry-run] [--force]\n"
-"              [--receive-pack=<git-receive-pack>]\n"
-"              [--verbose] [--thin] [--atomic]\n"
-"              [<host>:]<directory> (--all | <ref>...)"
-msgstr ""
-
-#: builtin/send-pack.c:192
-msgid "remote name"
-msgstr ""
-
-#: builtin/send-pack.c:205
-msgid "use stateless RPC protocol"
-msgstr ""
-
-#: builtin/send-pack.c:206
-msgid "read refs from stdin"
-msgstr ""
-
-#: builtin/send-pack.c:207
-msgid "print status from remote helper"
-msgstr ""
-
-#: builtin/shortlog.c:16
-msgid "git shortlog [<options>] [<revision-range>] [[--] <path>...]"
-msgstr ""
-
-#: builtin/shortlog.c:17
-msgid "git log --pretty=short | git shortlog [<options>]"
-msgstr ""
-
-#: builtin/shortlog.c:123
-msgid "using multiple --group options with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:133
-msgid "using --group=trailer with stdin is not supported"
-msgstr ""
-
-#: builtin/shortlog.c:323
-#, c-format
-msgid "unknown group type: %s"
-msgstr ""
-
-#: builtin/shortlog.c:351
-msgid "group by committer rather than author"
-msgstr ""
-
-#: builtin/shortlog.c:354
-msgid "sort output according to the number of commits per author"
-msgstr ""
-
-#: builtin/shortlog.c:356
-msgid "suppress commit descriptions, only provides commit count"
-msgstr ""
-
-#: builtin/shortlog.c:358
-msgid "show the email address of each author"
-msgstr ""
-
-#: builtin/shortlog.c:359
-msgid "<w>[,<i1>[,<i2>]]"
-msgstr ""
-
-#: builtin/shortlog.c:360
-msgid "linewrap output"
-msgstr ""
-
-#: builtin/shortlog.c:362
-msgid "field"
-msgstr ""
-
-#: builtin/shortlog.c:363
-msgid "group by field"
-msgstr ""
-
-#: builtin/shortlog.c:395
-msgid "too many arguments given outside repository"
-msgstr ""
-
-#: builtin/show-branch.c: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>)...]"
-msgstr ""
-
-#: builtin/show-branch.c:18
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr ""
-
-#: builtin/show-branch.c:396
-#, c-format
-msgid "ignoring %s; cannot handle more than %d ref"
-msgid_plural "ignoring %s; cannot handle more than %d refs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:548
-#, c-format
-msgid "no matching refs with %s"
-msgstr ""
-
-#: builtin/show-branch.c:645
-msgid "show remote-tracking and local branches"
-msgstr ""
-
-#: builtin/show-branch.c:647
-msgid "show remote-tracking branches"
-msgstr ""
-
-#: builtin/show-branch.c:649
-msgid "color '*!+-' corresponding to the branch"
-msgstr ""
-
-#: builtin/show-branch.c:651
-msgid "show <n> more commits after the common ancestor"
-msgstr ""
-
-#: builtin/show-branch.c:653
-msgid "synonym to more=-1"
-msgstr ""
-
-#: builtin/show-branch.c:654
-msgid "suppress naming strings"
-msgstr ""
-
-#: builtin/show-branch.c:656
-msgid "include the current branch"
-msgstr ""
-
-#: builtin/show-branch.c:658
-msgid "name commits with their object names"
-msgstr ""
-
-#: builtin/show-branch.c:660
-msgid "show possible merge bases"
-msgstr ""
-
-#: builtin/show-branch.c:662
-msgid "show refs unreachable from any other ref"
-msgstr ""
-
-#: builtin/show-branch.c:664
-msgid "show commits in topological order"
-msgstr ""
-
-#: builtin/show-branch.c:667
-msgid "show only commits not on the first branch"
-msgstr ""
-
-#: builtin/show-branch.c:669
-msgid "show merges reachable from only one tip"
-msgstr ""
-
-#: builtin/show-branch.c:671
-msgid "topologically sort, maintaining date order where possible"
-msgstr ""
-
-#: builtin/show-branch.c:674
-msgid "<n>[,<base>]"
-msgstr ""
-
-#: builtin/show-branch.c:675
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr ""
-
-#: builtin/show-branch.c:735
-msgid "no branches given, and HEAD is not valid"
-msgstr ""
-
-#: builtin/show-branch.c:738
-msgid "--reflog option needs one branch name"
-msgstr ""
-
-#: builtin/show-branch.c:741
-#, c-format
-msgid "only %d entry can be shown at one time."
-msgid_plural "only %d entries can be shown at one time."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:745
-#, c-format
-msgid "no such ref %s"
-msgstr ""
-
-#: builtin/show-branch.c:831
-#, c-format
-msgid "cannot handle more than %d rev."
-msgid_plural "cannot handle more than %d revs."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/show-branch.c:835
-#, c-format
-msgid "'%s' is not a valid ref."
-msgstr ""
-
-#: builtin/show-branch.c:838
-#, c-format
-msgid "cannot find commit %s (%s)"
-msgstr ""
-
-#: builtin/show-index.c:21
-msgid "hash-algorithm"
-msgstr ""
-
-#: builtin/show-index.c:31
-msgid "Unknown hash algorithm"
-msgstr ""
-
-#: builtin/show-ref.c:12
-msgid ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
-msgstr ""
-
-#: builtin/show-ref.c:13
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr ""
-
-#: builtin/show-ref.c:162
-msgid "only show tags (can be combined with heads)"
-msgstr ""
-
-#: builtin/show-ref.c:163
-msgid "only show heads (can be combined with tags)"
-msgstr ""
-
-#: builtin/show-ref.c:164
-msgid "stricter reference checking, requires exact ref path"
-msgstr ""
-
-#: builtin/show-ref.c:167 builtin/show-ref.c:169
-msgid "show the HEAD reference, even if it would be filtered out"
-msgstr ""
-
-#: builtin/show-ref.c:171
-msgid "dereference tags into object IDs"
-msgstr ""
-
-#: builtin/show-ref.c:173
-msgid "only show SHA1 hash using <n> digits"
-msgstr ""
-
-#: builtin/show-ref.c:177
-msgid "do not print results to stdout (useful with --verify)"
-msgstr ""
-
-#: builtin/show-ref.c:179
-msgid "show refs from stdin that aren't in local repository"
-msgstr ""
-
-#: builtin/sparse-checkout.c:23
-msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
-msgstr ""
-
-#: builtin/sparse-checkout.c:61
-msgid "this worktree is not sparse"
-msgstr ""
-
-#: builtin/sparse-checkout.c:76
-msgid "this worktree is not sparse (sparse-checkout file may not exist)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:177
-#, c-format
-msgid ""
-"directory '%s' contains untracked files, but is not in the sparse-checkout "
-"cone"
-msgstr ""
-
-#: builtin/sparse-checkout.c:185
-#, c-format
-msgid "failed to remove directory '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:327
-msgid "failed to create directory for sparse-checkout file"
-msgstr ""
-
-#: builtin/sparse-checkout.c:366
-msgid "failed to initialize worktree config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:411
-msgid "failed to modify sparse-index config"
-msgstr ""
-
-#: builtin/sparse-checkout.c:441 builtin/sparse-checkout.c:793
-#: builtin/sparse-checkout.c:847
-msgid "initialize the sparse-checkout in cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:443 builtin/sparse-checkout.c:795
-#: builtin/sparse-checkout.c:849
-msgid "toggle the use of a sparse index"
-msgstr ""
-
-#: builtin/sparse-checkout.c:479
-#, c-format
-msgid "failed to open '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:531
-#, c-format
-msgid "could not normalize path %s"
-msgstr ""
-
-#: builtin/sparse-checkout.c:560
-#, c-format
-msgid "unable to unquote C-style string '%s'"
-msgstr ""
-
-#: builtin/sparse-checkout.c:615 builtin/sparse-checkout.c:643
-msgid "unable to load existing sparse-checkout patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:619
-msgid "existing sparse-checkout patterns do not use cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:707
-msgid "please run from the toplevel directory in non-cone mode"
-msgstr ""
-
-#: builtin/sparse-checkout.c:712
-msgid "specify directories rather than patterns (no leading slash)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:714
-msgid ""
-"specify directories rather than patterns.  If your directory starts with a "
-"'!', pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:716
-msgid ""
-"specify directories rather than patterns.  If your directory really has any "
-"of '*?[]\\' in it, pass --skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:732
-#, c-format
-msgid ""
-"'%s' is not a directory; to treat it as a directory anyway, rerun with --"
-"skip-checks"
-msgstr ""
-
-#: builtin/sparse-checkout.c:734
-#, c-format
-msgid ""
-"pass a leading slash before paths such as '%s' if you want a single file "
-"(see NON-CONE PROBLEMS in the git-sparse-checkout manual)."
-msgstr ""
-
-#: builtin/sparse-checkout.c:739
-msgid "git sparse-checkout add [--skip-checks] (--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:752 builtin/sparse-checkout.c:797
-msgid ""
-"skip some sanity checks on the given paths that might give false positives"
-msgstr ""
-
-#: builtin/sparse-checkout.c:755 builtin/sparse-checkout.c:800
-msgid "read patterns from standard in"
-msgstr ""
-
-#: builtin/sparse-checkout.c:760
-msgid "no sparse-checkout to add to"
-msgstr ""
-
-#: builtin/sparse-checkout.c:775
-msgid ""
-"git sparse-checkout set [--[no-]cone] [--[no-]sparse-index] [--skip-checks] "
-"(--stdin | <patterns>)"
-msgstr ""
-
-#: builtin/sparse-checkout.c:854
-msgid "must be in a sparse-checkout to reapply sparsity patterns"
-msgstr ""
-
-#: builtin/sparse-checkout.c:914
-msgid "error while refreshing working directory"
-msgstr ""
-
-#: builtin/stash.c:24 builtin/stash.c:40
-msgid "git stash list [<options>]"
-msgstr ""
-
-#: builtin/stash.c:25 builtin/stash.c:45
-msgid "git stash show [<options>] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:26 builtin/stash.c:50
-msgid "git stash drop [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:27
-msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:28 builtin/stash.c:65
-msgid "git stash branch <branchname> [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:30
-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 ""
-
-#: builtin/stash.c:34
-msgid ""
-"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--"
-"quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:55
-msgid "git stash pop [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:60
-msgid "git stash apply [--index] [-q|--quiet] [<stash>]"
-msgstr ""
-
-#: builtin/stash.c:75
-msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>"
-msgstr ""
-
-#: builtin/stash.c:80
-msgid ""
-"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"          [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
-"          [--] [<pathspec>...]]"
-msgstr ""
-
-#: builtin/stash.c:87
-msgid ""
-"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
-"               [-u|--include-untracked] [-a|--all] [<message>]"
-msgstr ""
-
-#: builtin/stash.c:130
-#, c-format
-msgid "'%s' is not a stash-like commit"
-msgstr ""
-
-#: builtin/stash.c:150
-#, c-format
-msgid "Too many revisions specified:%s"
-msgstr ""
-
-#: builtin/stash.c:164
-msgid "No stash entries found."
-msgstr ""
-
-#: builtin/stash.c:178
-#, c-format
-msgid "%s is not a valid reference"
-msgstr ""
-
-#: builtin/stash.c:227
-msgid "git stash clear with arguments is unimplemented"
-msgstr ""
-
-#: builtin/stash.c:447
-#, c-format
-msgid ""
-"WARNING: Untracked file in way of tracked file!  Renaming\n"
-"            %s -> %s\n"
-"         to make room.\n"
-msgstr ""
-
-#: builtin/stash.c:508
-msgid "cannot apply a stash in the middle of a merge"
-msgstr ""
-
-#: builtin/stash.c:519
-#, c-format
-msgid "could not generate diff %s^!."
-msgstr ""
-
-#: builtin/stash.c:526
-msgid "conflicts in index. Try without --index."
-msgstr ""
-
-#: builtin/stash.c:532
-msgid "could not save index tree"
-msgstr ""
-
-#: builtin/stash.c:552
-#, c-format
-msgid "Merging %s with %s"
-msgstr ""
-
-#: builtin/stash.c:562
-msgid "Index was not unstashed."
-msgstr ""
-
-#: builtin/stash.c:576
-msgid "could not restore untracked files from stash"
-msgstr ""
-
-#: builtin/stash.c:608 builtin/stash.c:695
-msgid "attempt to recreate the index"
-msgstr ""
-
-#: builtin/stash.c:641
-#, c-format
-msgid "Dropped %s (%s)"
-msgstr ""
-
-#: builtin/stash.c:644
-#, c-format
-msgid "%s: Could not drop stash entry"
-msgstr ""
-
-#: builtin/stash.c:657
-#, c-format
-msgid "'%s' is not a stash reference"
-msgstr ""
-
-#: builtin/stash.c:707
-msgid "The stash entry is kept in case you need it again."
-msgstr ""
-
-#: builtin/stash.c:730
-msgid "No branch name specified"
-msgstr ""
-
-#: builtin/stash.c:809
-msgid "failed to parse tree"
-msgstr ""
-
-#: builtin/stash.c:820
-msgid "failed to unpack trees"
-msgstr ""
-
-#: builtin/stash.c:840
-msgid "include untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:843
-msgid "only show untracked files in the stash"
-msgstr ""
-
-#: builtin/stash.c:930 builtin/stash.c:967
-#, c-format
-msgid "Cannot update %s with %s"
-msgstr ""
-
-#: builtin/stash.c:948 builtin/stash.c:1667 builtin/stash.c:1739
-msgid "stash message"
-msgstr ""
-
-#: builtin/stash.c:958
-msgid "\"git stash store\" requires one <commit> argument"
-msgstr ""
-
-#: builtin/stash.c:1143
-msgid "No staged changes"
-msgstr ""
-
-#: builtin/stash.c:1204
-msgid "No changes selected"
-msgstr ""
-
-#: builtin/stash.c:1304
-msgid "You do not have the initial commit yet"
-msgstr ""
-
-#: builtin/stash.c:1331
-msgid "Cannot save the current index state"
-msgstr ""
-
-#: builtin/stash.c:1340
-msgid "Cannot save the untracked files"
-msgstr ""
-
-#: builtin/stash.c:1351 builtin/stash.c:1370
-msgid "Cannot save the current worktree state"
-msgstr ""
-
-#: builtin/stash.c:1361
-msgid "Cannot save the current staged state"
-msgstr ""
-
-#: builtin/stash.c:1398
-msgid "Cannot record working tree state"
-msgstr ""
-
-#: builtin/stash.c:1447
-msgid "Can't use --patch and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1458
-msgid "Can't use --staged and --include-untracked or --all at the same time"
-msgstr ""
-
-#: builtin/stash.c:1476
-msgid "Did you forget to 'git add'?"
-msgstr ""
-
-#: builtin/stash.c:1491
-msgid "No local changes to save"
-msgstr ""
-
-#: builtin/stash.c:1498
-msgid "Cannot initialize stash"
-msgstr ""
-
-#: builtin/stash.c:1513
-msgid "Cannot save the current status"
-msgstr ""
-
-#: builtin/stash.c:1518
-#, c-format
-msgid "Saved working directory and index state %s"
-msgstr ""
-
-#: builtin/stash.c:1615
-msgid "Cannot remove worktree changes"
-msgstr ""
-
-#: builtin/stash.c:1656 builtin/stash.c:1728
-msgid "keep index"
-msgstr ""
-
-#: builtin/stash.c:1658 builtin/stash.c:1730
-msgid "stash staged changes only"
-msgstr ""
-
-#: builtin/stash.c:1660 builtin/stash.c:1732
-msgid "stash in patch mode"
-msgstr ""
-
-#: builtin/stash.c:1661 builtin/stash.c:1733
-msgid "quiet mode"
-msgstr ""
-
-#: builtin/stash.c:1663 builtin/stash.c:1735
-msgid "include untracked files in stash"
-msgstr ""
-
-#: builtin/stash.c:1665 builtin/stash.c:1737
-msgid "include ignore files"
-msgstr ""
-
-#: builtin/stripspace.c:37
-msgid "skip and remove all lines starting with comment character"
-msgstr ""
-
-#: builtin/stripspace.c:40
-msgid "prepend comment character and space to each line"
-msgstr ""
-
-#: builtin/submodule--helper.c:50 builtin/submodule--helper.c:2486
-#, c-format
-msgid "Expecting a full ref name, got %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:103
-#, c-format
-msgid "cannot strip one component off url '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:213
-#, c-format
-msgid ""
-"could not look up configuration '%s'. Assuming this repository is its own "
-"authoritative upstream."
-msgstr ""
-
-#: builtin/submodule--helper.c:413 builtin/submodule--helper.c:1873
-msgid "alternative anchor for relative paths"
-msgstr ""
-
-#: builtin/submodule--helper.c:418
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:476 builtin/submodule--helper.c:617
-#: builtin/submodule--helper.c:640
-#, c-format
-msgid "No url found for submodule path '%s' in .gitmodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:528
-#, c-format
-msgid "Entering '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:531
-#, c-format
-msgid ""
-"run_command returned non-zero status for %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:553
-#, c-format
-msgid ""
-"run_command returned non-zero status while recursing in the nested "
-"submodules of %s\n"
-"."
-msgstr ""
-
-#: builtin/submodule--helper.c:569
-msgid "suppress output of entering each submodule command"
-msgstr ""
-
-#: builtin/submodule--helper.c:571 builtin/submodule--helper.c:876
-#: builtin/submodule--helper.c:1458
-msgid "recurse into nested submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:576
-msgid "git submodule--helper foreach [--quiet] [--recursive] [--] <command>"
-msgstr ""
-
-#: builtin/submodule--helper.c:654
-#, c-format
-msgid "Failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:658
-#, c-format
-msgid "Submodule '%s' (%s) registered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:668
-#, c-format
-msgid "warning: command update mode suggested for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:675
-#, c-format
-msgid "Failed to register update mode for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:697
-msgid "suppress output for initializing a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:702
-msgid "git submodule--helper init [<options>] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:775 builtin/submodule--helper.c:910
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:823
-#, c-format
-msgid "could not resolve HEAD ref inside the submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:850 builtin/submodule--helper.c:1428
-#, c-format
-msgid "failed to recurse into submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:874 builtin/submodule--helper.c:1595
-msgid "suppress submodule status output"
-msgstr ""
-
-#: builtin/submodule--helper.c:875
-msgid ""
-"use commit stored in the index instead of the one stored in the submodule "
-"HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:881
-msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:905
-msgid "git submodule--helper name <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:977
-#, c-format
-msgid "* %s %s(blob)->%s(submodule)"
-msgstr ""
-
-#: builtin/submodule--helper.c:980
-#, c-format
-msgid "* %s %s(submodule)->%s(blob)"
-msgstr ""
-
-#: builtin/submodule--helper.c:993
-#, c-format
-msgid "%s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1043
-#, c-format
-msgid "couldn't hash object from '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1047
-#, c-format
-msgid "unexpected mode %o\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1288
-msgid "use the commit stored in the index instead of the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1290
-msgid "compare the commit in the index with that in the submodule HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1292
-msgid "skip submodules with 'ignore_config' value set to 'all'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1294
-msgid "limit the summary size"
-msgstr ""
-
-#: builtin/submodule--helper.c:1299
-msgid "git submodule--helper summary [<options>] [<commit>] [--] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1323
-msgid "could not fetch a revision for HEAD"
-msgstr ""
-
-#: builtin/submodule--helper.c:1384
-#, c-format
-msgid "Synchronizing submodule url for '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1390
-#, c-format
-msgid "failed to register url for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1399
-#, c-format
-msgid "failed to get the default remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1409
-#, c-format
-msgid "failed to update remote for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1456
-msgid "suppress output of synchronizing submodule url"
-msgstr ""
-
-#: builtin/submodule--helper.c:1463
-msgid "git submodule--helper sync [--quiet] [--recursive] [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1513
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains a .git directory. This will be replaced "
-"with a .git file by using absorbgitdirs."
-msgstr ""
-
-#: builtin/submodule--helper.c:1530
-#, c-format
-msgid ""
-"Submodule work tree '%s' contains local modifications; use '-f' to discard "
-"them"
-msgstr ""
-
-#: builtin/submodule--helper.c:1538
-#, c-format
-msgid "Cleared directory '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1540
-#, c-format
-msgid "Could not remove submodule work tree '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1551
-#, c-format
-msgid "could not create empty submodule directory %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1567
-#, c-format
-msgid "Submodule '%s' (%s) unregistered for path '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:1596
-msgid "remove submodule working trees even if they contain local changes"
-msgstr ""
-
-#: builtin/submodule--helper.c:1597
-msgid "unregister all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1602
-msgid ""
-"git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"
-msgstr ""
-
-#: builtin/submodule--helper.c:1616
-msgid "Use '--all' if you really want to deinitialize all submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:1665
-msgid ""
-"An alternate computed from a superproject's alternate is invalid.\n"
-"To allow Git to clone without an alternate in such a case, set\n"
-"submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"
-"'--reference-if-able' instead of '--reference'."
-msgstr ""
-
-#: builtin/submodule--helper.c:1710 builtin/submodule--helper.c:1713
-#, c-format
-msgid "submodule '%s' cannot add alternate: %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:1749
-#, c-format
-msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1756
-#, c-format
-msgid "Value '%s' for submodule.alternateLocation is not recognized"
-msgstr ""
-
-#: builtin/submodule--helper.c:1781
-#, c-format
-msgid "refusing to create/use '%s' in another submodule's git dir"
-msgstr ""
-
-#: builtin/submodule--helper.c:1826
-#, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
-msgstr ""
-
-#: builtin/submodule--helper.c:1831
-#, c-format
-msgid "directory not empty: '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1843
-#, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1876
-msgid "where the new submodule will be cloned to"
-msgstr ""
-
-#: builtin/submodule--helper.c:1879
-msgid "name of the new submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:1882
-msgid "url where to clone the submodule from"
-msgstr ""
-
-#: builtin/submodule--helper.c:1890 builtin/submodule--helper.c:3383
-msgid "depth for shallow clones"
-msgstr ""
-
-#: builtin/submodule--helper.c:1893 builtin/submodule--helper.c:2731
-#: builtin/submodule--helper.c:3376
-msgid "force cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:1895 builtin/submodule--helper.c:2733
-msgid "disallow cloning into non-empty directory"
-msgstr ""
-
-#: builtin/submodule--helper.c:1903
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--depth <depth>] [--single-branch] [--filter "
-"<filter-spec>] --url <url> --path <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:1943
-#, c-format
-msgid "Invalid update mode '%s' for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:1947
-#, c-format
-msgid "Invalid update mode '%s' configured for submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2041
-#, c-format
-msgid "Submodule path '%s' not initialized"
-msgstr ""
-
-#: builtin/submodule--helper.c:2045
-msgid "Maybe you want to use 'update --init'?"
-msgstr ""
-
-#: builtin/submodule--helper.c:2075
-#, c-format
-msgid "Skipping unmerged submodule %s"
-msgstr ""
-
-#: builtin/submodule--helper.c:2104
-#, c-format
-msgid "Skipping submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2257
-#, c-format
-msgid "Failed to clone '%s'. Retry scheduled"
-msgstr ""
-
-#: builtin/submodule--helper.c:2268
-#, c-format
-msgid "Failed to clone '%s' a second time, aborting"
-msgstr ""
-
-#: builtin/submodule--helper.c:2371
-#, c-format
-msgid "Unable to checkout '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2375
-#, c-format
-msgid "Unable to rebase '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2379
-#, c-format
-msgid "Unable to merge '%s' in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2383
-#, c-format
-msgid "Execution of '%s %s' failed in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2402
-#, c-format
-msgid "Submodule path '%s': checked out '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2406
-#, c-format
-msgid "Submodule path '%s': rebased into '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2410
-#, c-format
-msgid "Submodule path '%s': merged in '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2414
-#, c-format
-msgid "Submodule path '%s': '%s %s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:2438
-#, c-format
-msgid "Unable to fetch in submodule path '%s'; trying to directly fetch %s:"
-msgstr ""
-
-#: builtin/submodule--helper.c:2447
-#, c-format
-msgid ""
-"Fetched in submodule path '%s', but it did not contain %s. Direct fetching "
-"of that commit failed."
-msgstr ""
-
-#: builtin/submodule--helper.c:2481
-#, c-format
-msgid ""
-"Submodule (%s) branch configured to inherit branch from superproject, but "
-"the superproject is not on any branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2499
-#, c-format
-msgid "could not get a repository handle for submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2588
-#, c-format
-msgid "Unable to find current revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2599
-#, c-format
-msgid "Unable to fetch in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2604
-#, c-format
-msgid "Unable to find %s revision in submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2640
-#, c-format
-msgid "Failed to recurse into submodule path '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:2699
-msgid "force checkout updates"
-msgstr ""
-
-#: builtin/submodule--helper.c:2701
-msgid "initialize uninitialized submodules before update"
-msgstr ""
-
-#: builtin/submodule--helper.c:2703
-msgid "use SHA-1 of submodule's remote tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:2705
-msgid "traverse submodules recursively"
-msgstr ""
-
-#: builtin/submodule--helper.c:2707
-msgid "don't fetch new objects from the remote site"
-msgstr ""
-
-#: builtin/submodule--helper.c:2710 builtin/submodule--helper.c:2892
-msgid "path into the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:2713
-msgid "path into the working tree, across nested submodule boundaries"
-msgstr ""
-
-#: builtin/submodule--helper.c:2717
-msgid "rebase, merge, checkout or none"
-msgstr ""
-
-#: builtin/submodule--helper.c:2723
-msgid "create a shallow clone truncated to the specified number of revisions"
-msgstr ""
-
-#: builtin/submodule--helper.c:2726
-msgid "parallel jobs"
-msgstr ""
-
-#: builtin/submodule--helper.c:2728
-msgid "whether the initial clone should follow the shallow recommendation"
-msgstr ""
-
-#: builtin/submodule--helper.c:2729
-msgid "don't print cloning progress"
-msgstr ""
-
-#: builtin/submodule--helper.c:2741
-msgid ""
-"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>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2767
-msgid "bad value for update parameter"
-msgstr ""
-
-#: builtin/submodule--helper.c:2893
-msgid "recurse into submodules"
-msgstr ""
-
-#: builtin/submodule--helper.c:2899
-msgid "git submodule--helper absorb-git-dirs [<options>] [<path>...]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2955
-msgid "check if it is safe to write to the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2958
-msgid "unset the config in the .gitmodules file"
-msgstr ""
-
-#: builtin/submodule--helper.c:2963
-msgid "git submodule--helper config <name> [<value>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:2964
-msgid "git submodule--helper config --unset <name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:2984 builtin/submodule--helper.c:3238
-#: builtin/submodule--helper.c:3395
-msgid "please make sure that the .gitmodules file is in the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3000
-msgid "suppress output for setting url of a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3004
-msgid "git submodule--helper set-url [--quiet] <path> <newurl>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3037
-msgid "set the default tracking branch to master"
-msgstr ""
-
-#: builtin/submodule--helper.c:3039
-msgid "set the default tracking branch"
-msgstr ""
-
-#: builtin/submodule--helper.c:3043
-msgid "git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3044
-msgid ""
-"git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3051
-msgid "--branch or --default required"
-msgstr ""
-
-#: builtin/submodule--helper.c:3072 builtin/submodule--helper.c:3375
-msgid "print only error messages"
-msgstr ""
-
-#: builtin/submodule--helper.c:3073
-msgid "force creation"
-msgstr ""
-
-#: builtin/submodule--helper.c:3081
-msgid "show whether the branch would be created"
-msgstr ""
-
-#: builtin/submodule--helper.c:3085
-msgid ""
-"git submodule--helper create-branch [-f|--force] [--create-reflog] [-q|--"
-"quiet] [-t|--track] [-n|--dry-run] <name> <start-oid> <start-name>"
-msgstr ""
-
-#: builtin/submodule--helper.c:3097
-#, c-format
-msgid "creating branch '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3155
-#, c-format
-msgid "Adding existing repo at '%s' to the index\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3158
-#, c-format
-msgid "'%s' already exists and is not a valid git repo"
-msgstr ""
-
-#: builtin/submodule--helper.c:3171
-#, c-format
-msgid "A git directory for '%s' is found locally with remote(s):\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3178
-#, c-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from\n"
-"  %s\n"
-"use the '--force' option. If the local git directory is not the correct "
-"repo\n"
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-
-#: builtin/submodule--helper.c:3190
-#, c-format
-msgid "Reactivating local git directory for submodule '%s'\n"
-msgstr ""
-
-#: builtin/submodule--helper.c:3227
-#, c-format
-msgid "unable to checkout submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3266
-#, c-format
-msgid "Failed to add submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3270 builtin/submodule--helper.c:3275
-#: builtin/submodule--helper.c:3283
-#, c-format
-msgid "Failed to register submodule '%s'"
-msgstr ""
-
-#: builtin/submodule--helper.c:3339
-#, c-format
-msgid "'%s' already exists in the index"
-msgstr ""
-
-#: builtin/submodule--helper.c:3342
-#, c-format
-msgid "'%s' already exists in the index and is not a submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3372
-msgid "branch of repository to add as submodule"
-msgstr ""
-
-#: builtin/submodule--helper.c:3373
-msgid "allow adding an otherwise ignored submodule path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3379
-msgid "borrow the objects from reference repositories"
-msgstr ""
-
-#: builtin/submodule--helper.c:3381
-msgid ""
-"sets the submodule’s name to the given string instead of defaulting to its "
-"path"
-msgstr ""
-
-#: builtin/submodule--helper.c:3388
-msgid "git submodule--helper add [<options>] [--] <repository> [<path>]"
-msgstr ""
-
-#: builtin/submodule--helper.c:3416
-msgid "Relative path can only be used from the toplevel of the working tree"
-msgstr ""
-
-#: builtin/submodule--helper.c:3425
-#, c-format
-msgid "repo URL: '%s' must be absolute or begin with ./|../"
-msgstr ""
-
-#: builtin/submodule--helper.c:3460
-#, c-format
-msgid "'%s' is not a valid submodule name"
-msgstr ""
-
-#: builtin/submodule--helper.c:3520 git.c:453 git.c:729
-#, c-format
-msgid "%s doesn't support --super-prefix"
-msgstr ""
-
-#: builtin/submodule--helper.c:3526
-#, c-format
-msgid "'%s' is not a valid submodule--helper subcommand"
-msgstr ""
-
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr ""
-
-#: builtin/symbolic-ref.c:9
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr ""
-
-#: builtin/symbolic-ref.c:42
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
-
-#: builtin/symbolic-ref.c:43
-msgid "delete symbolic ref"
-msgstr ""
-
-#: builtin/symbolic-ref.c:44
-msgid "shorten ref output"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason"
-msgstr ""
-
-#: builtin/symbolic-ref.c:45 builtin/update-ref.c:505
-msgid "reason of the update"
-msgstr ""
-
-#: builtin/tag.c:26
-msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n"
-"        <tagname> [<head>]"
-msgstr ""
-
-#: builtin/tag.c:28
-msgid "git tag -d <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:29
-msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
-"points-at <object>]\n"
-"        [--format=<format>] [--merged <commit>] [--no-merged <commit>] "
-"[<pattern>...]"
-msgstr ""
-
-#: builtin/tag.c:31
-msgid "git tag -v [--format=<format>] <tagname>..."
-msgstr ""
-
-#: builtin/tag.c:101
-#, c-format
-msgid "tag '%s' not found."
-msgstr ""
-
-#: builtin/tag.c:136
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/tag.c:171
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
-msgstr ""
-
-#: builtin/tag.c:175
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be kept; you may remove them yourself if you "
-"want to.\n"
-msgstr ""
-
-#: builtin/tag.c:241
-msgid "unable to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:259
-#, c-format
-msgid ""
-"You have created a nested tag. The object referred to by your new tag is\n"
-"already a tag. If you meant to tag the object that it points to, use:\n"
-"\n"
-"\tgit tag -f %s %s^{}"
-msgstr ""
-
-#: builtin/tag.c:275
-msgid "bad object type."
-msgstr ""
-
-#: builtin/tag.c:326
-msgid "no tag message?"
-msgstr ""
-
-#: builtin/tag.c:333
-#, c-format
-msgid "The tag message has been left in %s\n"
-msgstr ""
-
-#: builtin/tag.c:445
-msgid "list tag names"
-msgstr ""
-
-#: builtin/tag.c:447
-msgid "print <n> lines of each tag message"
-msgstr ""
-
-#: builtin/tag.c:449
-msgid "delete tags"
-msgstr ""
-
-#: builtin/tag.c:450
-msgid "verify tags"
-msgstr ""
-
-#: builtin/tag.c:452
-msgid "Tag creation options"
-msgstr ""
-
-#: builtin/tag.c:454
-msgid "annotated tag, needs a message"
-msgstr ""
-
-#: builtin/tag.c:456
-msgid "tag message"
-msgstr ""
-
-#: builtin/tag.c:458
-msgid "force edit of tag message"
-msgstr ""
-
-#: builtin/tag.c:459
-msgid "annotated and GPG-signed tag"
-msgstr ""
-
-#: builtin/tag.c:462
-msgid "use another key to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:463
-msgid "replace the tag if exists"
-msgstr ""
-
-#: builtin/tag.c:464 builtin/update-ref.c:511
-msgid "create a reflog"
-msgstr ""
-
-#: builtin/tag.c:466
-msgid "Tag listing options"
-msgstr ""
-
-#: builtin/tag.c:467
-msgid "show tag list in columns"
-msgstr ""
-
-#: builtin/tag.c:468 builtin/tag.c:470
-msgid "print only tags that contain the commit"
-msgstr ""
-
-#: builtin/tag.c:469 builtin/tag.c:471
-msgid "print only tags that don't contain the commit"
-msgstr ""
-
-#: builtin/tag.c:472
-msgid "print only tags that are merged"
-msgstr ""
-
-#: builtin/tag.c:473
-msgid "print only tags that are not merged"
-msgstr ""
-
-#: builtin/tag.c:477
-msgid "print only tags of the object"
-msgstr ""
-
-#: builtin/tag.c:559
-#, c-format
-msgid "the '%s' option is only allowed in list mode"
-msgstr ""
-
-#: builtin/tag.c:598
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr ""
-
-#: builtin/tag.c:603
-#, c-format
-msgid "tag '%s' already exists"
-msgstr ""
-
-#: builtin/tag.c:634
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr ""
-
-#: builtin/unpack-objects.c:95
-msgid "pack exceeds maximum allowed size"
-msgstr ""
-
-#: builtin/unpack-objects.c:504
-msgid "Unpacking objects"
-msgstr ""
-
-#: builtin/update-index.c:84
-#, c-format
-msgid "failed to create directory %s"
-msgstr ""
-
-#: builtin/update-index.c:106
-#, c-format
-msgid "failed to delete file %s"
-msgstr ""
-
-#: builtin/update-index.c:113 builtin/update-index.c:219
-#, c-format
-msgid "failed to delete directory %s"
-msgstr ""
-
-#: builtin/update-index.c:138
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr ""
-
-#: builtin/update-index.c:152
-msgid "directory stat info does not change after adding a new file"
-msgstr ""
-
-#: builtin/update-index.c:165
-msgid "directory stat info does not change after adding a new directory"
-msgstr ""
-
-#: builtin/update-index.c:178
-msgid "directory stat info changes after updating a file"
-msgstr ""
-
-#: builtin/update-index.c:189
-msgid "directory stat info changes after adding a file inside subdirectory"
-msgstr ""
-
-#: builtin/update-index.c:200
-msgid "directory stat info does not change after deleting a file"
-msgstr ""
-
-#: builtin/update-index.c:213
-msgid "directory stat info does not change after deleting a directory"
-msgstr ""
-
-#: builtin/update-index.c:220
-msgid " OK"
-msgstr ""
-
-#: builtin/update-index.c:589
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr ""
-
-#: builtin/update-index.c:993
-msgid "continue refresh even when index needs update"
-msgstr ""
-
-#: builtin/update-index.c:996
-msgid "refresh: ignore submodules"
-msgstr ""
-
-#: builtin/update-index.c:999
-msgid "do not ignore new files"
-msgstr ""
-
-#: builtin/update-index.c:1001
-msgid "let files replace directories and vice-versa"
-msgstr ""
-
-#: builtin/update-index.c:1003
-msgid "notice files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1005
-msgid "refresh even if index contains unmerged entries"
-msgstr ""
-
-#: builtin/update-index.c:1008
-msgid "refresh stat information"
-msgstr ""
-
-#: builtin/update-index.c:1012
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr ""
-
-#: builtin/update-index.c:1016
-msgid "<mode>,<object>,<path>"
-msgstr ""
-
-#: builtin/update-index.c:1017
-msgid "add the specified entry to the index"
-msgstr ""
-
-#: builtin/update-index.c:1027
-msgid "mark files as \"not changing\""
-msgstr ""
-
-#: builtin/update-index.c:1030
-msgid "clear assumed-unchanged bit"
-msgstr ""
-
-#: builtin/update-index.c:1033
-msgid "mark files as \"index-only\""
-msgstr ""
-
-#: builtin/update-index.c:1036
-msgid "clear skip-worktree bit"
-msgstr ""
-
-#: builtin/update-index.c:1039
-msgid "do not touch index-only entries"
-msgstr ""
-
-#: builtin/update-index.c:1041
-msgid "add to index only; do not add content to object database"
-msgstr ""
-
-#: builtin/update-index.c:1043
-msgid "remove named paths even if present in worktree"
-msgstr ""
-
-#: builtin/update-index.c:1045
-msgid "with --stdin: input lines are terminated by null bytes"
-msgstr ""
-
-#: builtin/update-index.c:1047
-msgid "read list of paths to be updated from standard input"
-msgstr ""
-
-#: builtin/update-index.c:1051
-msgid "add entries from standard input to the index"
-msgstr ""
-
-#: builtin/update-index.c:1055
-msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr ""
-
-#: builtin/update-index.c:1059
-msgid "only update entries that differ from HEAD"
-msgstr ""
-
-#: builtin/update-index.c:1063
-msgid "ignore files missing from worktree"
-msgstr ""
-
-#: builtin/update-index.c:1066
-msgid "report actions to standard output"
-msgstr ""
-
-#: builtin/update-index.c:1068
-msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr ""
-
-#: builtin/update-index.c:1072
-msgid "write index in this format"
-msgstr ""
-
-#: builtin/update-index.c:1074
-msgid "enable or disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1076
-msgid "enable/disable untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1078
-msgid "test if the filesystem supports untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1080
-msgid "enable untracked cache without testing the filesystem"
-msgstr ""
-
-#: builtin/update-index.c:1082
-msgid "write out the index even if is not flagged as changed"
-msgstr ""
-
-#: builtin/update-index.c:1084
-msgid "enable or disable file system monitor"
-msgstr ""
-
-#: builtin/update-index.c:1086
-msgid "mark files as fsmonitor valid"
-msgstr ""
-
-#: builtin/update-index.c:1089
-msgid "clear fsmonitor valid bit"
-msgstr ""
-
-#: builtin/update-index.c:1195
-msgid ""
-"core.splitIndex is set to false; remove or change it, if you really want to "
-"enable split index"
-msgstr ""
-
-#: builtin/update-index.c:1204
-msgid ""
-"core.splitIndex is set to true; remove or change it, if you really want to "
-"disable split index"
-msgstr ""
-
-#: builtin/update-index.c:1216
-msgid ""
-"core.untrackedCache is set to true; remove or change it, if you really want "
-"to disable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1220
-msgid "Untracked cache disabled"
-msgstr ""
-
-#: builtin/update-index.c:1228
-msgid ""
-"core.untrackedCache is set to false; remove or change it, if you really want "
-"to enable the untracked cache"
-msgstr ""
-
-#: builtin/update-index.c:1232
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr ""
-
-#: builtin/update-index.c:1241
-msgid "core.fsmonitor is unset; set it if you really want to enable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1246
-msgid "fsmonitor enabled"
-msgstr ""
-
-#: builtin/update-index.c:1250
-msgid ""
-"core.fsmonitor is set; remove it if you really want to disable fsmonitor"
-msgstr ""
-
-#: builtin/update-index.c:1254
-msgid "fsmonitor disabled"
-msgstr ""
-
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:12
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr ""
-
-#: builtin/update-ref.c:506
-msgid "delete the reference"
-msgstr ""
-
-#: builtin/update-ref.c:508
-msgid "update <refname> not the one it points to"
-msgstr ""
-
-#: builtin/update-ref.c:509
-msgid "stdin has NUL-terminated arguments"
-msgstr ""
-
-#: builtin/update-ref.c:510
-msgid "read updates from stdin"
-msgstr ""
-
-#: builtin/update-server-info.c:15
-msgid "update the info files from scratch"
-msgstr ""
-
-#: builtin/upload-pack.c:11
-msgid "git upload-pack [<options>] <dir>"
-msgstr ""
-
-#: builtin/upload-pack.c:24 t/helper/test-serve-v2.c:17
-msgid "quit after a single request/response exchange"
-msgstr ""
-
-#: builtin/upload-pack.c:26
-msgid "serve up the info/refs for git-http-backend"
-msgstr ""
-
-#: builtin/upload-pack.c:29
-msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr ""
-
-#: builtin/upload-pack.c:31
-msgid "interrupt transfer after <n> seconds of inactivity"
-msgstr ""
-
-#: builtin/verify-commit.c:19
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr ""
-
-#: builtin/verify-commit.c:68
-msgid "print commit contents"
-msgstr ""
-
-#: builtin/verify-commit.c:69 builtin/verify-tag.c:37
-msgid "print raw gpg status output"
-msgstr ""
-
-#: builtin/verify-pack.c:59
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr ""
-
-#: builtin/verify-pack.c:70
-msgid "verbose"
-msgstr ""
-
-#: builtin/verify-pack.c:72
-msgid "show statistics only"
-msgstr ""
-
-#: builtin/verify-tag.c:18
-msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
-msgstr ""
-
-#: builtin/verify-tag.c:36
-msgid "print tag contents"
-msgstr ""
-
-#: builtin/worktree.c:19
-msgid "git worktree add [<options>] <path> [<commit-ish>]"
-msgstr ""
-
-#: builtin/worktree.c:20
-msgid "git worktree list [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:21
-msgid "git worktree lock [<options>] <path>"
-msgstr ""
-
-#: builtin/worktree.c:22
-msgid "git worktree move <worktree> <new-path>"
-msgstr ""
-
-#: builtin/worktree.c:23
-msgid "git worktree prune [<options>]"
-msgstr ""
-
-#: builtin/worktree.c:24
-msgid "git worktree remove [<options>] <worktree>"
-msgstr ""
-
-#: builtin/worktree.c:25
-msgid "git worktree repair [<path>...]"
-msgstr ""
-
-#: builtin/worktree.c:26
-msgid "git worktree unlock <path>"
-msgstr ""
-
-#: builtin/worktree.c:76
-#, c-format
-msgid "Removing %s/%s: %s"
-msgstr ""
-
-#: builtin/worktree.c:149
-msgid "report pruned working trees"
-msgstr ""
-
-#: builtin/worktree.c:151
-msgid "expire working trees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:221
-#, c-format
-msgid "'%s' already exists"
-msgstr ""
-
-#: builtin/worktree.c:230
-#, c-format
-msgid "unusable worktree destination '%s'"
-msgstr ""
-
-#: builtin/worktree.c:235
-#, c-format
-msgid ""
-"'%s' is a missing but locked worktree;\n"
-"use '%s -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:237
-#, c-format
-msgid ""
-"'%s' is a missing but already registered worktree;\n"
-"use '%s -f' to override, or 'prune' or 'remove' to clear"
-msgstr ""
-
-#: builtin/worktree.c:248
-#, c-format
-msgid "failed to copy '%s' to '%s'; sparse-checkout may not work correctly"
-msgstr ""
-
-#: builtin/worktree.c:268
-#, c-format
-msgid "failed to copy worktree config from '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:280 builtin/worktree.c:285
-#, c-format
-msgid "failed to unset '%s' in '%s'"
-msgstr ""
-
-#: builtin/worktree.c:356
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr ""
-
-#: builtin/worktree.c:378
-msgid "initializing"
-msgstr ""
-
-#: builtin/worktree.c:492 builtin/worktree.c:498
-#, c-format
-msgid "Preparing worktree (new branch '%s')"
-msgstr ""
-
-#: builtin/worktree.c:494
-#, c-format
-msgid "Preparing worktree (resetting branch '%s'; was at %s)"
-msgstr ""
-
-#: builtin/worktree.c:503
-#, c-format
-msgid "Preparing worktree (checking out '%s')"
-msgstr ""
-
-#: builtin/worktree.c:509
-#, c-format
-msgid "Preparing worktree (detached HEAD %s)"
-msgstr ""
-
-#: builtin/worktree.c:554
-msgid "checkout <branch> even if already checked out in other worktree"
-msgstr ""
-
-#: builtin/worktree.c:557
-msgid "create a new branch"
-msgstr ""
-
-#: builtin/worktree.c:559
-msgid "create or reset a branch"
-msgstr ""
-
-#: builtin/worktree.c:561
-msgid "populate the new working tree"
-msgstr ""
-
-#: builtin/worktree.c:562
-msgid "keep the new working tree locked"
-msgstr ""
-
-#: builtin/worktree.c:564 builtin/worktree.c:809
-msgid "reason for locking"
-msgstr ""
-
-#: builtin/worktree.c:567
-msgid "set up tracking mode (see git-branch(1))"
-msgstr ""
-
-#: builtin/worktree.c:570
-msgid "try to match the new branch name with a remote-tracking branch"
-msgstr ""
-
-#: builtin/worktree.c:584
-msgid "added with --lock"
-msgstr ""
-
-#: builtin/worktree.c:646
-msgid "--[no-]track can only be used if a new branch is created"
-msgstr ""
-
-#: builtin/worktree.c:766
-msgid "show extended annotations and reasons, if available"
-msgstr ""
-
-#: builtin/worktree.c:768
-msgid "add 'prunable' annotation to worktrees older than <time>"
-msgstr ""
-
-#: builtin/worktree.c:770
-msgid "terminate records with a NUL character"
-msgstr ""
-
-#: builtin/worktree.c:821 builtin/worktree.c:854 builtin/worktree.c:928
-#: builtin/worktree.c:1052
-#, c-format
-msgid "'%s' is not a working tree"
-msgstr ""
-
-#: builtin/worktree.c:823 builtin/worktree.c:856
-msgid "The main working tree cannot be locked or unlocked"
-msgstr ""
-
-#: builtin/worktree.c:828
-#, c-format
-msgid "'%s' is already locked, reason: %s"
-msgstr ""
-
-#: builtin/worktree.c:830
-#, c-format
-msgid "'%s' is already locked"
-msgstr ""
-
-#: builtin/worktree.c:858
-#, c-format
-msgid "'%s' is not locked"
-msgstr ""
-
-#: builtin/worktree.c:899
-msgid "working trees containing submodules cannot be moved or removed"
-msgstr ""
-
-#: builtin/worktree.c:907
-msgid "force move even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:930 builtin/worktree.c:1054
-#, c-format
-msgid "'%s' is a main working tree"
-msgstr ""
-
-#: builtin/worktree.c:935
-#, c-format
-msgid "could not figure out destination name from '%s'"
-msgstr ""
-
-#: builtin/worktree.c:948
-#, c-format
-msgid ""
-"cannot move a locked working tree, lock reason: %s\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:950
-msgid ""
-"cannot move a locked working tree;\n"
-"use 'move -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:953
-#, c-format
-msgid "validation failed, cannot move working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:958
-#, c-format
-msgid "failed to move '%s' to '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1004
-#, c-format
-msgid "failed to run 'git status' on '%s'"
-msgstr ""
-
-#: builtin/worktree.c:1008
-#, c-format
-msgid "'%s' contains modified or untracked files, use --force to delete it"
-msgstr ""
-
-#: builtin/worktree.c:1013
-#, c-format
-msgid "failed to run 'git status' on '%s', code %d"
-msgstr ""
-
-#: builtin/worktree.c:1036
-msgid "force removal even if worktree is dirty or locked"
-msgstr ""
-
-#: builtin/worktree.c:1059
-#, c-format
-msgid ""
-"cannot remove a locked working tree, lock reason: %s\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1061
-msgid ""
-"cannot remove a locked working tree;\n"
-"use 'remove -f -f' to override or unlock first"
-msgstr ""
-
-#: builtin/worktree.c:1064
-#, c-format
-msgid "validation failed, cannot remove working tree: %s"
-msgstr ""
-
-#: builtin/worktree.c:1088
-#, c-format
-msgid "repair: %s: %s"
-msgstr ""
-
-#: builtin/worktree.c:1091
-#, c-format
-msgid "error: %s: %s"
-msgstr ""
-
-#: builtin/write-tree.c:15
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
-
-#: builtin/write-tree.c:28
-msgid "<prefix>/"
-msgstr ""
-
-#: builtin/write-tree.c:29
-msgid "write tree object for a subdirectory <prefix>"
-msgstr ""
-
-#: builtin/write-tree.c:31
-msgid "only useful for debugging"
-msgstr ""
-
-#: git.c:28
-msgid ""
-"git [--version] [--help] [-C <path>] [-c <name>=<value>]\n"
-"           [--exec-path[=<path>]] [--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"
-"           <command> [<args>]"
-msgstr ""
-
-#: git.c:36
-msgid ""
-"'git help -a' and 'git help -g' list available subcommands and some\n"
-"concept guides. See 'git help <command>' or 'git help <concept>'\n"
-"to read about a specific subcommand or concept.\n"
-"See 'git help git' for an overview of the system."
-msgstr ""
-
-#: git.c:188 git.c:216 git.c:300
-#, c-format
-msgid "no directory given for '%s' option\n"
-msgstr ""
-
-#: git.c:202
-#, c-format
-msgid "no namespace given for --namespace\n"
-msgstr ""
-
-#: git.c:230
-#, c-format
-msgid "no prefix given for --super-prefix\n"
-msgstr ""
-
-#: git.c:252
-#, c-format
-msgid "-c expects a configuration string\n"
-msgstr ""
-
-#: git.c:260
-#, c-format
-msgid "no config key given for --config-env\n"
-msgstr ""
-
-#: git.c:326
-#, c-format
-msgid "unknown option: %s\n"
-msgstr ""
-
-#: git.c:375
-#, c-format
-msgid "while expanding alias '%s': '%s'"
-msgstr ""
-
-#: git.c:384
-#, c-format
-msgid ""
-"alias '%s' changes environment variables.\n"
-"You can use '!git' in the alias to do this"
-msgstr ""
-
-#: git.c:391
-#, c-format
-msgid "empty alias for %s"
-msgstr ""
-
-#: git.c:394
-#, c-format
-msgid "recursive alias: %s"
-msgstr ""
-
-#: git.c:480
-msgid "write failure on standard output"
-msgstr ""
-
-#: git.c:482
-msgid "unknown write failure on standard output"
-msgstr ""
-
-#: git.c:484
-msgid "close failed on standard output"
-msgstr ""
-
-#: git.c:838
-#, c-format
-msgid "alias loop detected: expansion of '%s' does not terminate:%s"
-msgstr ""
-
-#: git.c:888
-#, c-format
-msgid "cannot handle %s as a builtin"
-msgstr ""
-
-#: git.c:901
-#, c-format
-msgid ""
-"usage: %s\n"
-"\n"
-msgstr ""
-
-#: git.c:921
-#, c-format
-msgid "expansion of alias '%s' failed; '%s' is not a git command\n"
-msgstr ""
-
-#: git.c:933
-#, c-format
-msgid "failed to run command '%s': %s\n"
-msgstr ""
-
-#: http-fetch.c:128
-#, c-format
-msgid "argument to --packfile must be a valid hash (got '%s')"
-msgstr ""
-
-#: http-fetch.c:138
-msgid "not a git repository"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:141
-msgid "unhandled options"
-msgstr ""
-
-#: t/helper/test-fast-rebase.c:146
-msgid "error preparing revisions"
-msgstr ""
-
-#: t/helper/test-reach.c:154
-#, c-format
-msgid "commit %s is not marked reachable"
-msgstr ""
-
-#: t/helper/test-reach.c:164
-msgid "too many commits marked reachable"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:7
-msgid "test-tool serve-v2 [<options>]"
-msgstr ""
-
-#: t/helper/test-serve-v2.c:19
-msgid "exit immediately after advertising capabilities"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:581
-msgid "test-helper simple-ipc is-active    [<name>] [<options>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:582
-msgid "test-helper simple-ipc run-daemon   [<name>] [<threads>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:583
-msgid "test-helper simple-ipc start-daemon [<name>] [<threads>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:584
-msgid "test-helper simple-ipc stop-daemon  [<name>] [<max-wait>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:585
-msgid "test-helper simple-ipc send         [<name>] [<token>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:586
-msgid "test-helper simple-ipc sendbytes    [<name>] [<bytecount>] [<byte>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:587
-msgid ""
-"test-helper simple-ipc multiple     [<name>] [<threads>] [<bytecount>] "
-"[<batchsize>]"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:595
-msgid "name or pathname of unix domain socket"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:597
-msgid "named-pipe name"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:599
-msgid "number of threads in server thread pool"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:600
-msgid "seconds to wait for daemon to start or stop"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:602
-msgid "number of bytes"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:603
-msgid "number of requests per thread"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "byte"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:605
-msgid "ballast character"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "token"
-msgstr ""
-
-#: t/helper/test-simple-ipc.c:606
-msgid "command token to send to the server"
-msgstr ""
-
-#: http.c:350
-#, c-format
-msgid "negative value for http.postbuffer; defaulting to %d"
-msgstr ""
-
-#: http.c:371
-msgid "Delegation control is not supported with cURL < 7.22.0"
-msgstr ""
-
-#: http.c:380
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr ""
-
-#: http.c:812
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr ""
-
-#: http.c:1016
-#, c-format
-msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
-msgstr ""
-
-#: http.c:1023
-#, c-format
-msgid "Could not set SSL backend to '%s': cURL was built without SSL backends"
-msgstr ""
-
-#: http.c:1027
-#, c-format
-msgid "Could not set SSL backend to '%s': already set"
-msgstr ""
-
-#: http.c:1876
-#, c-format
-msgid ""
-"unable to update url base from redirection:\n"
-"  asked for: %s\n"
-"   redirect: %s"
-msgstr ""
-
-#: remote-curl.c:184
-#, c-format
-msgid "invalid quoting in push-option value: '%s'"
-msgstr ""
-
-#: remote-curl.c:308
-#, c-format
-msgid "%sinfo/refs not valid: is this a git repository?"
-msgstr ""
-
-#: remote-curl.c:409
-msgid "invalid server response; expected service, got flush packet"
-msgstr ""
-
-#: remote-curl.c:440
-#, c-format
-msgid "invalid server response; got '%s'"
-msgstr ""
-
-#: remote-curl.c:500
-#, c-format
-msgid "repository '%s' not found"
-msgstr ""
-
-#: remote-curl.c:504
-#, c-format
-msgid "Authentication failed for '%s'"
-msgstr ""
-
-#: remote-curl.c:508
-#, c-format
-msgid "unable to access '%s' with http.pinnedPubkey configuration: %s"
-msgstr ""
-
-#: remote-curl.c:512
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr ""
-
-#: remote-curl.c:518
-#, c-format
-msgid "redirecting to %s"
-msgstr ""
-
-#: remote-curl.c:649
-msgid "shouldn't have EOF when not gentle on EOF"
-msgstr ""
-
-#: remote-curl.c:661
-msgid "remote server sent unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:730
-msgid "unable to rewind rpc post data - try increasing http.postBuffer"
-msgstr ""
-
-#: remote-curl.c:759
-#, c-format
-msgid "remote-curl: bad line length character: %.4s"
-msgstr ""
-
-#: remote-curl.c:761
-msgid "remote-curl: unexpected response end packet"
-msgstr ""
-
-#: remote-curl.c:837
-#, c-format
-msgid "RPC failed; %s"
-msgstr ""
-
-#: remote-curl.c:877
-msgid "cannot handle pushes this big"
-msgstr ""
-
-#: remote-curl.c:990
-#, c-format
-msgid "cannot deflate request; zlib deflate error %d"
-msgstr ""
-
-#: remote-curl.c:994
-#, c-format
-msgid "cannot deflate request; zlib end error %d"
-msgstr ""
-
-#: remote-curl.c:1044
-#, c-format
-msgid "%d bytes of length header were received"
-msgstr ""
-
-#: remote-curl.c:1046
-#, c-format
-msgid "%d bytes of body are still expected"
-msgstr ""
-
-#: remote-curl.c:1135
-msgid "dumb http transport does not support shallow capabilities"
-msgstr ""
-
-#: remote-curl.c:1150
-msgid "fetch failed."
-msgstr ""
-
-#: remote-curl.c:1198
-msgid "cannot fetch by sha1 over smart http"
-msgstr ""
-
-#: remote-curl.c:1242 remote-curl.c:1248
-#, c-format
-msgid "protocol error: expected sha/ref, got '%s'"
-msgstr ""
-
-#: remote-curl.c:1260 remote-curl.c:1378
-#, c-format
-msgid "http transport does not support %s"
-msgstr ""
-
-#: remote-curl.c:1296
-msgid "git-http-push failed"
-msgstr ""
-
-#: remote-curl.c:1485
-msgid "remote-curl: usage: git remote-curl <remote> [<url>]"
-msgstr ""
-
-#: remote-curl.c:1517
-msgid "remote-curl: error reading command stream from git"
-msgstr ""
-
-#: remote-curl.c:1524
-msgid "remote-curl: fetch attempted without a local repo"
-msgstr ""
-
-#: remote-curl.c:1565
-#, c-format
-msgid "remote-curl: unknown command '%s' from git"
-msgstr ""
-
-#: contrib/scalar/scalar.c:49
-msgid "need a working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:86
-msgid "could not find enlistment root"
-msgstr ""
-
-#: contrib/scalar/scalar.c:89 contrib/scalar/scalar.c:350
-#: contrib/scalar/scalar.c:435 contrib/scalar/scalar.c:578
-#, c-format
-msgid "could not switch to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:179
-#, c-format
-msgid "could not configure %s=%s"
-msgstr ""
-
-#: contrib/scalar/scalar.c:197
-msgid "could not configure log.excludeDecoration"
-msgstr ""
-
-#: contrib/scalar/scalar.c:218
-msgid "Scalar enlistments require a worktree"
-msgstr ""
-
-#: contrib/scalar/scalar.c:310
-#, c-format
-msgid "remote HEAD is not a branch: '%.*s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:316
-msgid "failed to get default branch name from remote; using local default"
-msgstr ""
-
-#: contrib/scalar/scalar.c:329
-msgid "failed to get default branch name"
-msgstr ""
-
-#: contrib/scalar/scalar.c:340
-msgid "failed to unregister repository"
-msgstr ""
-
-#: contrib/scalar/scalar.c:355
-msgid "failed to delete enlistment directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:375
-msgid "branch to checkout after clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:377
-msgid "when cloning, create full working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:379
-msgid "only download metadata for the branch that will be checked out"
-msgstr ""
-
-#: contrib/scalar/scalar.c:384
-msgid "scalar clone [<options>] [--] <repo> [<dir>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:409
-#, c-format
-msgid "cannot deduce worktree name from '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:418
-#, c-format
-msgid "directory '%s' exists already"
-msgstr ""
-
-#: contrib/scalar/scalar.c:445
-#, c-format
-msgid "failed to get default branch for '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:456
-#, c-format
-msgid "could not configure remote in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:465
-#, c-format
-msgid "could not configure '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:468
-msgid "partial clone failed; attempting full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:472
-msgid "could not configure for full clone"
-msgstr ""
-
-#: contrib/scalar/scalar.c:504
-msgid "`scalar list` does not take arguments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:517
-msgid "scalar register [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:544
-msgid "reconfigure all registered enlistments"
-msgstr ""
-
-#: contrib/scalar/scalar.c:548
-msgid "scalar reconfigure [--all | <enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:566
-msgid "--all or <enlistment>, but not both"
-msgstr ""
-
-#: contrib/scalar/scalar.c:581
-#, c-format
-msgid "git repository gone in '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:621
-msgid ""
-"scalar run <task> [<enlistment>]\n"
-"Tasks:\n"
-msgstr ""
-
-#: contrib/scalar/scalar.c:639
-#, c-format
-msgid "no such task: '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:689
-msgid "scalar unregister [<enlistment>]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:736
-msgid "scalar delete <enlistment>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:751
-msgid "refusing to delete current working directory"
-msgstr ""
-
-#: contrib/scalar/scalar.c:766
-msgid "include Git version"
-msgstr ""
-
-#: contrib/scalar/scalar.c:768
-msgid "include Git's build options"
-msgstr ""
-
-#: contrib/scalar/scalar.c:772
-msgid "scalar verbose [-v | --verbose] [--build-options]"
-msgstr ""
-
-#: contrib/scalar/scalar.c:813
-msgid "-C requires a <directory>"
-msgstr ""
-
-#: contrib/scalar/scalar.c:815
-#, c-format
-msgid "could not change to '%s'"
-msgstr ""
-
-#: contrib/scalar/scalar.c:821
-msgid "-c requires a <key>=<value> argument"
-msgstr ""
-
-#: contrib/scalar/scalar.c:839
-msgid ""
-"scalar [-C <directory>] [-c <key>=<value>] <command> [<options>]\n"
-"\n"
-"Commands:\n"
-msgstr ""
-
-#: compat/compiler.h:26
-msgid "no compiler information available\n"
-msgstr ""
-
-#: compat/compiler.h:38
-msgid "no libc information available\n"
-msgstr ""
-
-#: list-objects-filter-options.h:126
-msgid "args"
-msgstr ""
-
-#: list-objects-filter-options.h:127
-msgid "object filtering"
-msgstr ""
-
-#: parse-options.h:188
-msgid "expiry-date"
-msgstr ""
-
-#: parse-options.h:202
-msgid "no-op (backward compatibility)"
-msgstr ""
-
-#: parse-options.h:341
-msgid "be more verbose"
-msgstr ""
-
-#: parse-options.h:343
-msgid "be more quiet"
-msgstr ""
-
-#: parse-options.h:349
-msgid "use <n> digits to display object names"
-msgstr ""
-
-#: parse-options.h:368
-msgid "how to strip spaces and #comments from message"
-msgstr ""
-
-#: parse-options.h:369
-msgid "read pathspec from file"
-msgstr ""
-
-#: parse-options.h:370
-msgid ""
-"with --pathspec-from-file, pathspec elements are separated with NUL character"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "key"
-msgstr ""
-
-#: ref-filter.h:98
-msgid "field name to sort on"
-msgstr ""
-
-#: rerere.h:44
-msgid "update the index with reused conflict resolution if possible"
-msgstr ""
-
-#: command-list.h:50
-msgid "Add file contents to the index"
-msgstr ""
-
-#: command-list.h:51
-msgid "Apply a series of patches from a mailbox"
-msgstr ""
-
-#: command-list.h:52
-msgid "Annotate file lines with commit information"
-msgstr ""
-
-#: command-list.h:53
-msgid "Apply a patch to files and/or to the index"
-msgstr ""
-
-#: command-list.h:54
-msgid "Import a GNU Arch repository into Git"
-msgstr ""
-
-#: command-list.h:55
-msgid "Create an archive of files from a named tree"
-msgstr ""
-
-#: command-list.h:56
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr ""
-
-#: command-list.h:57
-msgid "Show what revision and author last modified each line of a file"
-msgstr ""
-
-#: command-list.h:58
-msgid "List, create, or delete branches"
-msgstr ""
-
-#: command-list.h:59
-msgid "Collect information for user to file a bug report"
-msgstr ""
-
-#: command-list.h:60
-msgid "Move objects and refs by archive"
-msgstr ""
-
-#: command-list.h:61
-msgid "Provide content or type and size information for repository objects"
-msgstr ""
-
-#: command-list.h:62
-msgid "Display gitattributes information"
-msgstr ""
-
-#: command-list.h:63
-msgid "Debug gitignore / exclude files"
-msgstr ""
-
-#: command-list.h:64
-msgid "Show canonical names and email addresses of contacts"
-msgstr ""
-
-#: command-list.h:65
-msgid "Ensures that a reference name is well formed"
-msgstr ""
-
-#: command-list.h:66
-msgid "Switch branches or restore working tree files"
-msgstr ""
-
-#: command-list.h:67
-msgid "Copy files from the index to the working tree"
-msgstr ""
-
-#: command-list.h:68
-msgid "Find commits yet to be applied to upstream"
-msgstr ""
-
-#: command-list.h:69
-msgid "Apply the changes introduced by some existing commits"
-msgstr ""
-
-#: command-list.h:70
-msgid "Graphical alternative to git-commit"
-msgstr ""
-
-#: command-list.h:71
-msgid "Remove untracked files from the working tree"
-msgstr ""
-
-#: command-list.h:72
-msgid "Clone a repository into a new directory"
-msgstr ""
-
-#: command-list.h:73
-msgid "Display data in columns"
-msgstr ""
-
-#: command-list.h:74
-msgid "Record changes to the repository"
-msgstr ""
-
-#: command-list.h:75
-msgid "Write and verify Git commit-graph files"
-msgstr ""
-
-#: command-list.h:76
-msgid "Create a new commit object"
-msgstr ""
-
-#: command-list.h:77
-msgid "Get and set repository or global options"
-msgstr ""
-
-#: command-list.h:78
-msgid "Count unpacked number of objects and their disk consumption"
-msgstr ""
-
-#: command-list.h:79
-msgid "Retrieve and store user credentials"
-msgstr ""
-
-#: command-list.h:80
-msgid "Helper to temporarily store passwords in memory"
-msgstr ""
-
-#: command-list.h:81
-msgid "Helper to store credentials on disk"
-msgstr ""
-
-#: command-list.h:82
-msgid "Export a single commit to a CVS checkout"
-msgstr ""
-
-#: command-list.h:83
-msgid "Salvage your data out of another SCM people love to hate"
-msgstr ""
-
-#: command-list.h:84
-msgid "A CVS server emulator for Git"
-msgstr ""
-
-#: command-list.h:85
-msgid "A really simple server for Git repositories"
-msgstr ""
-
-#: command-list.h:86
-msgid "Give an object a human readable name based on an available ref"
-msgstr ""
-
-#: command-list.h:87
-msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
-
-#: command-list.h:88
-msgid "Compares files in the working tree and the index"
-msgstr ""
-
-#: command-list.h:89
-msgid "Compare a tree to the working tree or index"
-msgstr ""
-
-#: command-list.h:90
-msgid "Compares the content and mode of blobs found via two tree objects"
-msgstr ""
-
-#: command-list.h:91
-msgid "Show changes using common diff tools"
-msgstr ""
-
-#: command-list.h:92
-msgid "Git data exporter"
-msgstr ""
-
-#: command-list.h:93
-msgid "Backend for fast Git data importers"
-msgstr ""
-
-#: command-list.h:94
-msgid "Download objects and refs from another repository"
-msgstr ""
-
-#: command-list.h:95
-msgid "Receive missing objects from another repository"
-msgstr ""
-
-#: command-list.h:96
-msgid "Rewrite branches"
-msgstr ""
-
-#: command-list.h:97
-msgid "Produce a merge commit message"
-msgstr ""
-
-#: command-list.h:98
-msgid "Output information on each ref"
-msgstr ""
-
-#: command-list.h:99
-msgid "Run a Git command on a list of repositories"
-msgstr ""
-
-#: command-list.h:100
-msgid "Prepare patches for e-mail submission"
-msgstr ""
-
-#: command-list.h:101
-msgid "Verifies the connectivity and validity of the objects in the database"
-msgstr ""
-
-#: command-list.h:102
-msgid "Cleanup unnecessary files and optimize the local repository"
-msgstr ""
-
-#: command-list.h:103
-msgid "Extract commit ID from an archive created using git-archive"
-msgstr ""
-
-#: command-list.h:104
-msgid "Print lines matching a pattern"
-msgstr ""
-
-#: command-list.h:105
-msgid "A portable graphical interface to Git"
-msgstr ""
-
-#: command-list.h:106
-msgid "Compute object ID and optionally creates a blob from a file"
-msgstr ""
-
-#: command-list.h:107
-msgid "Display help information about Git"
-msgstr ""
-
-#: command-list.h:108
-msgid "Run git hooks"
-msgstr ""
-
-#: command-list.h:109
-msgid "Server side implementation of Git over HTTP"
-msgstr ""
-
-#: command-list.h:110
-msgid "Download from a remote Git repository via HTTP"
-msgstr ""
-
-#: command-list.h:111
-msgid "Push objects over HTTP/DAV to another repository"
-msgstr ""
-
-#: command-list.h:112
-msgid "Send a collection of patches from stdin to an IMAP folder"
-msgstr ""
-
-#: command-list.h:113
-msgid "Build pack index file for an existing packed archive"
-msgstr ""
-
-#: command-list.h:114
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
-
-#: command-list.h:115
-msgid "Instantly browse your working repository in gitweb"
-msgstr ""
-
-#: command-list.h:116
-msgid "Add or parse structured information in commit messages"
-msgstr ""
-
-#: command-list.h:117
-msgid "Show commit logs"
-msgstr ""
-
-#: command-list.h:118
-msgid "Show information about files in the index and the working tree"
-msgstr ""
-
-#: command-list.h:119
-msgid "List references in a remote repository"
-msgstr ""
-
-#: command-list.h:120
-msgid "List the contents of a tree object"
-msgstr ""
-
-#: command-list.h:121
-msgid "Extracts patch and authorship from a single e-mail message"
-msgstr ""
-
-#: command-list.h:122
-msgid "Simple UNIX mbox splitter program"
-msgstr ""
-
-#: command-list.h:123
-msgid "Run tasks to optimize Git repository data"
-msgstr ""
-
-#: command-list.h:124
-msgid "Join two or more development histories together"
-msgstr ""
-
-#: command-list.h:125
-msgid "Find as good common ancestors as possible for a merge"
-msgstr ""
-
-#: command-list.h:126
-msgid "Run a three-way file merge"
-msgstr ""
-
-#: command-list.h:127
-msgid "Run a merge for files needing merging"
-msgstr ""
-
-#: command-list.h:128
-msgid "The standard helper program to use with git-merge-index"
-msgstr ""
-
-#: command-list.h:129
-msgid "Show three-way merge without touching index"
-msgstr ""
-
-#: command-list.h:130
-msgid "Run merge conflict resolution tools to resolve merge conflicts"
-msgstr ""
-
-#: command-list.h:131
-msgid "Creates a tag object with extra validation"
-msgstr ""
-
-#: command-list.h:132
-msgid "Build a tree-object from ls-tree formatted text"
-msgstr ""
-
-#: command-list.h:133
-msgid "Write and verify multi-pack-indexes"
-msgstr ""
-
-#: command-list.h:134
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
-
-#: command-list.h:135
-msgid "Find symbolic names for given revs"
-msgstr ""
-
-#: command-list.h:136
-msgid "Add or inspect object notes"
-msgstr ""
-
-#: command-list.h:137
-msgid "Import from and submit to Perforce repositories"
-msgstr ""
-
-#: command-list.h:138
-msgid "Create a packed archive of objects"
-msgstr ""
-
-#: command-list.h:139
-msgid "Find redundant pack files"
-msgstr ""
-
-#: command-list.h:140
-msgid "Pack heads and tags for efficient repository access"
-msgstr ""
-
-#: command-list.h:141
-msgid "Compute unique ID for a patch"
-msgstr ""
-
-#: command-list.h:142
-msgid "Prune all unreachable objects from the object database"
-msgstr ""
-
-#: command-list.h:143
-msgid "Remove extra objects that are already in pack files"
-msgstr ""
-
-#: command-list.h:144
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr ""
-
-#: command-list.h:145
-msgid "Update remote refs along with associated objects"
-msgstr ""
-
-#: command-list.h:146
-msgid "Applies a quilt patchset onto the current branch"
-msgstr ""
-
-#: command-list.h:147
-msgid "Compare two commit ranges (e.g. two versions of a branch)"
-msgstr ""
-
-#: command-list.h:148
-msgid "Reads tree information into the index"
-msgstr ""
-
-#: command-list.h:149
-msgid "Reapply commits on top of another base tip"
-msgstr ""
-
-#: command-list.h:150
-msgid "Receive what is pushed into the repository"
-msgstr ""
-
-#: command-list.h:151
-msgid "Manage reflog information"
-msgstr ""
-
-#: command-list.h:152
-msgid "Manage set of tracked repositories"
-msgstr ""
-
-#: command-list.h:153
-msgid "Pack unpacked objects in a repository"
-msgstr ""
-
-#: command-list.h:154
-msgid "Create, list, delete refs to replace objects"
-msgstr ""
-
-#: command-list.h:155
-msgid "Generates a summary of pending changes"
-msgstr ""
-
-#: command-list.h:156
-msgid "Reuse recorded resolution of conflicted merges"
-msgstr ""
-
-#: command-list.h:157
-msgid "Reset current HEAD to the specified state"
-msgstr ""
-
-#: command-list.h:158
-msgid "Restore working tree files"
-msgstr ""
-
-#: command-list.h:159
-msgid "Lists commit objects in reverse chronological order"
-msgstr ""
-
-#: command-list.h:160
-msgid "Pick out and massage parameters"
-msgstr ""
-
-#: command-list.h:161
-msgid "Revert some existing commits"
-msgstr ""
-
-#: command-list.h:162
-msgid "Remove files from the working tree and from the index"
-msgstr ""
-
-#: command-list.h:163
-msgid "Send a collection of patches as emails"
-msgstr ""
-
-#: command-list.h:164
-msgid "Push objects over Git protocol to another repository"
-msgstr ""
-
-#: command-list.h:165
-msgid "Git's i18n setup code for shell scripts"
-msgstr ""
-
-#: command-list.h:166
-msgid "Common Git shell script setup code"
-msgstr ""
-
-#: command-list.h:167
-msgid "Restricted login shell for Git-only SSH access"
-msgstr ""
-
-#: command-list.h:168
-msgid "Summarize 'git log' output"
-msgstr ""
-
-#: command-list.h:169
-msgid "Show various types of objects"
-msgstr ""
-
-#: command-list.h:170
-msgid "Show branches and their commits"
-msgstr ""
-
-#: command-list.h:171
-msgid "Show packed archive index"
-msgstr ""
-
-#: command-list.h:172
-msgid "List references in a local repository"
-msgstr ""
-
-#: command-list.h:173
-msgid "Reduce your working tree to a subset of tracked files"
-msgstr ""
-
-#: command-list.h:174
-msgid "Add file contents to the staging area"
-msgstr ""
-
-#: command-list.h:175
-msgid "Stash the changes in a dirty working directory away"
-msgstr ""
-
-#: command-list.h:176
-msgid "Show the working tree status"
-msgstr ""
-
-#: command-list.h:177
-msgid "Remove unnecessary whitespace"
-msgstr ""
-
-#: command-list.h:178
-msgid "Initialize, update or inspect submodules"
-msgstr ""
-
-#: command-list.h:179
-msgid "Bidirectional operation between a Subversion repository and Git"
-msgstr ""
-
-#: command-list.h:180
-msgid "Switch branches"
-msgstr ""
-
-#: command-list.h:181
-msgid "Read, modify and delete symbolic refs"
-msgstr ""
-
-#: command-list.h:182
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
-
-#: command-list.h:183
-msgid "Creates a temporary file with a blob's contents"
-msgstr ""
-
-#: command-list.h:184
-msgid "Unpack objects from a packed archive"
-msgstr ""
-
-#: command-list.h:185
-msgid "Register file contents in the working tree to the index"
-msgstr ""
-
-#: command-list.h:186
-msgid "Update the object name stored in a ref safely"
-msgstr ""
-
-#: command-list.h:187
-msgid "Update auxiliary info file to help dumb servers"
-msgstr ""
-
-#: command-list.h:188
-msgid "Send archive back to git-archive"
-msgstr ""
-
-#: command-list.h:189
-msgid "Send objects packed back to git-fetch-pack"
-msgstr ""
-
-#: command-list.h:190
-msgid "Show a Git logical variable"
-msgstr ""
-
-#: command-list.h:191
-msgid "Check the GPG signature of commits"
-msgstr ""
-
-#: command-list.h:192
-msgid "Validate packed Git archive files"
-msgstr ""
-
-#: command-list.h:193
-msgid "Check the GPG signature of tags"
-msgstr ""
-
-#: command-list.h:194
-msgid "Show logs with difference each commit introduces"
-msgstr ""
-
-#: command-list.h:195
-msgid "Manage multiple working trees"
-msgstr ""
-
-#: command-list.h:196
-msgid "Create a tree object from the current index"
-msgstr ""
-
-#: command-list.h:197
-msgid "Defining attributes per path"
-msgstr ""
-
-#: command-list.h:198
-msgid "Git command-line interface and conventions"
-msgstr ""
-
-#: command-list.h:199
-msgid "A Git core tutorial for developers"
-msgstr ""
-
-#: command-list.h:200
-msgid "Providing usernames and passwords to Git"
-msgstr ""
-
-#: command-list.h:201
-msgid "Git for CVS users"
-msgstr ""
-
-#: command-list.h:202
-msgid "Tweaking diff output"
-msgstr ""
-
-#: command-list.h:203
-msgid "A useful minimum set of commands for Everyday Git"
-msgstr ""
-
-#: command-list.h:204
-msgid "Frequently asked questions about using Git"
-msgstr ""
-
-#: command-list.h:205
-msgid "A Git Glossary"
-msgstr ""
-
-#: command-list.h:206
-msgid "Hooks used by Git"
-msgstr ""
-
-#: command-list.h:207
-msgid "Specifies intentionally untracked files to ignore"
-msgstr ""
-
-#: command-list.h:208
-msgid "The Git repository browser"
-msgstr ""
-
-#: command-list.h:209
-msgid "Map author/committer names and/or E-Mail addresses"
-msgstr ""
-
-#: command-list.h:210
-msgid "Defining submodule properties"
-msgstr ""
-
-#: command-list.h:211
-msgid "Git namespaces"
-msgstr ""
-
-#: command-list.h:212
-msgid "Helper programs to interact with remote repositories"
-msgstr ""
-
-#: command-list.h:213
-msgid "Git Repository Layout"
-msgstr ""
-
-#: command-list.h:214
-msgid "Specifying revisions and ranges for Git"
-msgstr ""
-
-#: command-list.h:215
-msgid "Mounting one repository inside another"
-msgstr ""
-
-#: command-list.h:216
-msgid "A tutorial introduction to Git"
-msgstr ""
-
-#: command-list.h:217
-msgid "A tutorial introduction to Git: part two"
-msgstr ""
-
-#: command-list.h:218
-msgid "Git web interface (web frontend to Git repositories)"
-msgstr ""
-
-#: command-list.h:219
-msgid "An overview of recommended workflows with Git"
-msgstr ""
-
-#: git-merge-octopus.sh:46
-msgid ""
-"Error: Your local changes to the following files would be overwritten by "
-"merge"
-msgstr ""
-
-#: git-merge-octopus.sh:61
-msgid "Automated merge did not work."
-msgstr ""
-
-#: git-merge-octopus.sh:62
-msgid "Should not be doing an octopus."
-msgstr ""
-
-#: git-merge-octopus.sh:73
-#, sh-format
-msgid "Unable to find common commit with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:77
-#, sh-format
-msgid "Already up to date with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:89
-#, sh-format
-msgid "Fast-forwarding to: $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:97
-#, sh-format
-msgid "Trying simple merge with $pretty_name"
-msgstr ""
-
-#: git-merge-octopus.sh:102
-msgid "Simple merge did not work, trying automatic merge."
-msgstr ""
-
-#: git-sh-setup.sh:89 git-sh-setup.sh:94
-#, sh-format
-msgid "usage: $dashless $USAGE"
-msgstr ""
-
-#: git-sh-setup.sh:182
-#, sh-format
-msgid "Cannot chdir to $cdup, the toplevel of the working tree"
-msgstr ""
-
-#: git-sh-setup.sh:191 git-sh-setup.sh:198
-#, sh-format
-msgid "fatal: $program_name cannot be used without a working tree."
-msgstr ""
-
-#: git-sh-setup.sh:212
-msgid "Cannot rewrite branches: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:215
-#, sh-format
-msgid "Cannot $action: You have unstaged changes."
-msgstr ""
-
-#: git-sh-setup.sh:226
-#, sh-format
-msgid "Cannot $action: Your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:228
-msgid "Additionally, your index contains uncommitted changes."
-msgstr ""
-
-#: git-sh-setup.sh:348
-msgid "You need to run this command from the toplevel of the working tree."
-msgstr ""
-
-#: git-sh-setup.sh:353
-msgid "Unable to determine absolute path of git directory"
-msgstr ""
-
-#. TRANSLATORS: you can adjust this to align "git add -i" status menu
-#: git-add--interactive.perl:212
-#, perl-format
-msgid "%12s %12s %s"
-msgstr ""
-
-#: git-add--interactive.perl:632
-#, perl-format
-msgid "touched %d path\n"
-msgid_plural "touched %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1056
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for staging."
-msgstr ""
-
-#: git-add--interactive.perl:1059
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for stashing."
-msgstr ""
-
-#: git-add--interactive.perl:1062
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for unstaging."
-msgstr ""
-
-#: git-add--interactive.perl:1065 git-add--interactive.perl:1074
-#: git-add--interactive.perl:1080
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for applying."
-msgstr ""
-
-#: git-add--interactive.perl:1068 git-add--interactive.perl:1071
-#: git-add--interactive.perl:1077
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be\n"
-"marked for discarding."
-msgstr ""
-
-#: git-add--interactive.perl:1114
-#, perl-format
-msgid "failed to open hunk edit file for writing: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1121
-#, perl-format
-msgid ""
-"---\n"
-"To remove '%s' lines, make them ' ' lines (context).\n"
-"To remove '%s' lines, delete them.\n"
-"Lines starting with %s will be removed.\n"
-msgstr ""
-
-#: git-add--interactive.perl:1143
-#, perl-format
-msgid "failed to open hunk edit file for reading: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1253
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1259
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"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 ""
-
-#: git-add--interactive.perl:1265
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1271
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1277 git-add--interactive.perl:1295
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1283
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1289
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1301
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file"
-msgstr ""
-
-#: git-add--interactive.perl:1316
-msgid ""
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: git-add--interactive.perl:1347
-msgid "The selected hunks do not apply to the index!\n"
-msgstr ""
-
-#: git-add--interactive.perl:1362
-#, perl-format
-msgid "ignoring unmerged: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1481
-#, perl-format
-msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1482
-#, perl-format
-msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1483
-#, perl-format
-msgid "Apply addition to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1484
-#, perl-format
-msgid "Apply this hunk to worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: git-add--interactive.perl:1601
-msgid "No other hunks to goto\n"
-msgstr ""
-
-#: git-add--interactive.perl:1619
-#, perl-format
-msgid "Invalid number: '%s'\n"
-msgstr ""
-
-#: git-add--interactive.perl:1624
-#, perl-format
-msgid "Sorry, only %d hunk available.\n"
-msgid_plural "Sorry, only %d hunks available.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1659
-msgid "No other hunks to search\n"
-msgstr ""
-
-#: git-add--interactive.perl:1676
-#, perl-format
-msgid "Malformed search regexp %s: %s\n"
-msgstr ""
-
-#: git-add--interactive.perl:1686
-msgid "No hunk matches the given pattern\n"
-msgstr ""
-
-#: git-add--interactive.perl:1698 git-add--interactive.perl:1720
-msgid "No previous hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1707 git-add--interactive.perl:1726
-msgid "No next hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1732
-msgid "Sorry, cannot split this hunk\n"
-msgstr ""
-
-#: git-add--interactive.perl:1738
-#, perl-format
-msgid "Split into %d hunk.\n"
-msgid_plural "Split into %d hunks.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: git-add--interactive.perl:1748
-msgid "Sorry, cannot edit this hunk\n"
-msgstr ""
-
-#. TRANSLATORS: please do not translate the command names
-#. 'status', 'update', 'revert', etc.
-#: git-add--interactive.perl:1813
-msgid ""
-"status        - show paths with changes\n"
-"update        - add working tree state to the staged set of changes\n"
-"revert        - revert staged set of changes back to the HEAD version\n"
-"patch         - pick hunks and update selectively\n"
-"diff          - view diff between HEAD and index\n"
-"add untracked - add contents of untracked files to the staged set of "
-"changes\n"
-msgstr ""
-
-#: git-add--interactive.perl:1830 git-add--interactive.perl:1842
-#: git-add--interactive.perl:1845 git-add--interactive.perl:1852
-#: git-add--interactive.perl:1855 git-add--interactive.perl:1862
-#: git-add--interactive.perl:1866 git-add--interactive.perl:1872
-msgid "missing --"
-msgstr ""
-
-#: git-add--interactive.perl:1868
-#, perl-format
-msgid "unknown --patch mode: %s"
-msgstr ""
-
-#: git-add--interactive.perl:1874 git-add--interactive.perl:1880
-#, perl-format
-msgid "invalid argument %s, expecting --"
-msgstr ""
-
-#: git-send-email.perl:159
-msgid "local zone differs from GMT by a non-minute interval\n"
-msgstr ""
-
-#: git-send-email.perl:166 git-send-email.perl:172
-msgid "local time offset greater than or equal to 24 hours\n"
-msgstr ""
-
-#: git-send-email.perl:244
-#, perl-format
-msgid "fatal: command '%s' died with exit code %d"
-msgstr ""
-
-#: git-send-email.perl:257
-msgid "the editor exited uncleanly, aborting everything"
-msgstr ""
-
-#: git-send-email.perl:346
-#, perl-format
-msgid ""
-"'%s' contains an intermediate version of the email you were composing.\n"
-msgstr ""
-
-#: git-send-email.perl:351
-#, perl-format
-msgid "'%s.final' contains the composed email.\n"
-msgstr ""
-
-#: git-send-email.perl:484
-msgid "--dump-aliases incompatible with other options\n"
-msgstr ""
-
-#: git-send-email.perl:561
-msgid ""
-"fatal: found configuration options for 'sendmail'\n"
-"git-send-email is configured with the sendemail.* options - note the 'e'.\n"
-"Set sendemail.forbidSendmailVariables to false to disable this check.\n"
-msgstr ""
-
-#: git-send-email.perl:566 git-send-email.perl:782
-msgid "Cannot run git format-patch from outside a repository\n"
-msgstr ""
-
-#: git-send-email.perl:569
-msgid ""
-"`batch-size` and `relogin` must be specified together (via command-line or "
-"configuration option)\n"
-msgstr ""
-
-#: git-send-email.perl:582
-#, perl-format
-msgid "Unknown --suppress-cc field: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:613
-#, perl-format
-msgid "Unknown --confirm setting: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:653
-#, perl-format
-msgid "warning: sendmail alias with quotes is not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:655
-#, perl-format
-msgid "warning: `:include:` not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:657
-#, perl-format
-msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
-msgstr ""
-
-#: git-send-email.perl:662
-#, perl-format
-msgid "warning: sendmail line is not recognized: %s\n"
-msgstr ""
-
-#: git-send-email.perl:747
-#, perl-format
-msgid ""
-"File '%s' exists but it could also be the range of commits\n"
-"to produce patches for.  Please disambiguate by...\n"
-"\n"
-"    * Saying \"./%s\" if you mean a file; or\n"
-"    * Giving --format-patch option if you mean a range.\n"
-msgstr ""
-
-#: git-send-email.perl:768
-#, perl-format
-msgid "Failed to opendir %s: %s"
-msgstr ""
-
-#: git-send-email.perl:803
-msgid ""
-"\n"
-"No patch files specified!\n"
-"\n"
-msgstr ""
-
-#: git-send-email.perl:816
-#, perl-format
-msgid "No subject line in %s?"
-msgstr ""
-
-#: git-send-email.perl:827
-#, perl-format
-msgid "Failed to open for writing %s: %s"
-msgstr ""
-
-#: git-send-email.perl:838
-msgid ""
-"Lines beginning in \"GIT:\" will be removed.\n"
-"Consider including an overall diffstat or table of contents\n"
-"for the patch you are writing.\n"
-"\n"
-"Clear the body content if you don't wish to send a summary.\n"
-msgstr ""
-
-#: git-send-email.perl:862
-#, perl-format
-msgid "Failed to open %s: %s"
-msgstr ""
-
-#: git-send-email.perl:879
-#, perl-format
-msgid "Failed to open %s.final: %s"
-msgstr ""
-
-#: git-send-email.perl:922
-msgid "Summary email is empty, skipping it\n"
-msgstr ""
-
-#. TRANSLATORS: please keep [y/N] as is.
-#: git-send-email.perl:971
-#, perl-format
-msgid "Are you sure you want to use <%s> [y/N]? "
-msgstr ""
-
-#: git-send-email.perl:1026
-msgid ""
-"The following files are 8bit, but do not declare a Content-Transfer-"
-"Encoding.\n"
-msgstr ""
-
-#: git-send-email.perl:1031
-msgid "Which 8bit encoding should I declare [UTF-8]? "
-msgstr ""
-
-#: git-send-email.perl:1039
-#, perl-format
-msgid ""
-"Refusing to send because the patch\n"
-"\t%s\n"
-"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
-"want to send.\n"
-msgstr ""
-
-#: git-send-email.perl:1058
-msgid "To whom should the emails be sent (if anyone)?"
-msgstr ""
-
-#: git-send-email.perl:1076
-#, perl-format
-msgid "fatal: alias '%s' expands to itself\n"
-msgstr ""
-
-#: git-send-email.perl:1088
-msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
-msgstr ""
-
-#: git-send-email.perl:1150 git-send-email.perl:1158
-#, perl-format
-msgid "error: unable to extract a valid address from: %s\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [q] [d] [e] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1162
-msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
-msgstr ""
-
-#: git-send-email.perl:1482
-#, perl-format
-msgid "CA path \"%s\" does not exist"
-msgstr ""
-
-#: git-send-email.perl:1565
-msgid ""
-"    The Cc list above has been expanded by additional\n"
-"    addresses found in the patch commit message. By default\n"
-"    send-email prompts before sending whenever this occurs.\n"
-"    This behavior is controlled by the sendemail.confirm\n"
-"    configuration setting.\n"
-"\n"
-"    For additional information, run 'git send-email --help'.\n"
-"    To retain the current behavior, but squelch this message,\n"
-"    run 'git config --global sendemail.confirm auto'.\n"
-"\n"
-msgstr ""
-
-#. TRANSLATORS: Make sure to include [y] [n] [e] [q] [a] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-send-email.perl:1580
-msgid "Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): "
-msgstr ""
-
-#: git-send-email.perl:1583
-msgid "Send this email reply required"
-msgstr ""
-
-#: git-send-email.perl:1617
-msgid "The required SMTP server is not properly defined."
-msgstr ""
-
-#: git-send-email.perl:1664
-#, perl-format
-msgid "Server does not support STARTTLS! %s"
-msgstr ""
-
-#: git-send-email.perl:1669 git-send-email.perl:1673
-#, perl-format
-msgid "STARTTLS failed! %s"
-msgstr ""
-
-#: git-send-email.perl:1682
-msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
-msgstr ""
-
-#: git-send-email.perl:1700
-#, perl-format
-msgid "Failed to send %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Dry-Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1703
-#, perl-format
-msgid "Sent %s\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "Dry-OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1705
-msgid "OK. Log says:\n"
-msgstr ""
-
-#: git-send-email.perl:1724
-msgid "Result: "
-msgstr ""
-
-#: git-send-email.perl:1727
-msgid "Result: OK\n"
-msgstr ""
-
-#: git-send-email.perl:1744
-#, perl-format
-msgid "can't open file %s"
-msgstr ""
-
-#: git-send-email.perl:1792 git-send-email.perl:1812
-#, perl-format
-msgid "(mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1798
-#, perl-format
-msgid "(mbox) Adding to: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1855
-#, perl-format
-msgid "(non-mbox) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:1890
-#, perl-format
-msgid "(body) Adding cc: %s from line '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2009
-#, perl-format
-msgid "(%s) Could not execute '%s'"
-msgstr ""
-
-#: git-send-email.perl:2016
-#, perl-format
-msgid "(%s) Adding %s: %s from: '%s'\n"
-msgstr ""
-
-#: git-send-email.perl:2020
-#, perl-format
-msgid "(%s) failed to close pipe to '%s'"
-msgstr ""
-
-#: git-send-email.perl:2050
-msgid "cannot send message as 7bit"
-msgstr ""
-
-#: git-send-email.perl:2058
-msgid "invalid transfer encoding"
-msgstr ""
-
-#: git-send-email.perl:2100
-#, perl-format
-msgid ""
-"fatal: %s: rejected by %s hook\n"
-"%s\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2110 git-send-email.perl:2163 git-send-email.perl:2173
-#, perl-format
-msgid "unable to open %s: %s\n"
-msgstr ""
-
-#: git-send-email.perl:2113
-#, perl-format
-msgid ""
-"fatal: %s:%d is longer than 998 characters\n"
-"warning: no patches were sent\n"
-msgstr ""
-
-#: git-send-email.perl:2131
-#, perl-format
-msgid "Skipping %s with backup suffix '%s'.\n"
-msgstr ""
-
-#. TRANSLATORS: please keep "[y|N]" as is.
-#: git-send-email.perl:2135
-#, perl-format
-msgid "Do you really want to send %s? [y|N]: "
-msgstr ""
-- 
2.35.1.577.g74cc1aa55f


^ permalink raw reply related	[relevance 1%]

* Re: [PATCH 7/8] core.fsync: new option to harden loose references
  @ 2022-03-10 22:54  4%   ` Neeraj Singh
  0 siblings, 0 replies; 200+ results
From: Neeraj Singh @ 2022-03-10 22:54 UTC (permalink / raw)
  To: Patrick Steinhardt
  Cc: Git List, Randall S. Becker, Bagas Sanjaya, Elijah Newren,
	Ævar Arnfjörð Bjarmason, brian m. carlson,
	Neeraj K. Singh, Junio C Hamano

On Thu, Mar 10, 2022 at 1:53 AM Patrick Steinhardt <ps@pks.im> wrote:
> diff --git a/Documentation/config/core.txt b/Documentation/config/core.txt
> index 973805e8a9..b67d3c340e 100644
> --- a/Documentation/config/core.txt
> +++ b/Documentation/config/core.txt
> @@ -564,8 +564,10 @@ core.fsync::
>  * `pack-metadata` hardens packfile bitmaps and indexes.
>  * `commit-graph` hardens the commit graph file.
>  * `index` hardens the index when it is modified.
> +* `loose-ref` hardens references modified in the repo in loose-ref form.
>  * `objects` is an aggregate option that is equivalent to
>    `loose-object,pack`.
> +* `refs` is an aggregate option that is equivalent to `loose-ref`.
>  * `derived-metadata` is an aggregate option that is equivalent to
>    `pack-metadata,commit-graph`.
>  * `default` is an aggregate option that is equivalent to
> diff --git a/cache.h b/cache.h
> index 63a95d1977..b56a56f539 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -1005,11 +1005,14 @@ enum fsync_component {
>         FSYNC_COMPONENT_PACK_METADATA           = 1 << 2,
>         FSYNC_COMPONENT_COMMIT_GRAPH            = 1 << 3,
>         FSYNC_COMPONENT_INDEX                   = 1 << 4,
> +       FSYNC_COMPONENT_LOOSE_REF               = 1 << 5,
>  };
>
>  #define FSYNC_COMPONENTS_OBJECTS (FSYNC_COMPONENT_LOOSE_OBJECT | \
>                                   FSYNC_COMPONENT_PACK)
>
> +#define FSYNC_COMPONENTS_REFS (FSYNC_COMPONENT_LOOSE_REF)
> +
>  #define FSYNC_COMPONENTS_DERIVED_METADATA (FSYNC_COMPONENT_PACK_METADATA | \
>                                            FSYNC_COMPONENT_COMMIT_GRAPH)
>
> @@ -1026,7 +1029,8 @@ enum fsync_component {
>                               FSYNC_COMPONENT_PACK | \
>                               FSYNC_COMPONENT_PACK_METADATA | \
>                               FSYNC_COMPONENT_COMMIT_GRAPH | \
> -                             FSYNC_COMPONENT_INDEX)
> +                             FSYNC_COMPONENT_INDEX | \
> +                             FSYNC_COMPONENT_LOOSE_REF)
>
>  /*
>   * A bitmask indicating which components of the repo should be fsynced.
> diff --git a/config.c b/config.c
> index f03f27c3de..b5d3e6e404 100644
> --- a/config.c
> +++ b/config.c
> @@ -1332,7 +1332,9 @@ static const struct fsync_component_entry {
>         { "pack-metadata", FSYNC_COMPONENT_PACK_METADATA },
>         { "commit-graph", FSYNC_COMPONENT_COMMIT_GRAPH },
>         { "index", FSYNC_COMPONENT_INDEX },
> +       { "loose-ref", FSYNC_COMPONENT_LOOSE_REF },
>         { "objects", FSYNC_COMPONENTS_OBJECTS },
> +       { "refs", FSYNC_COMPONENTS_REFS },
>         { "derived-metadata", FSYNC_COMPONENTS_DERIVED_METADATA },
>         { "default", FSYNC_COMPONENTS_DEFAULT },
>         { "committed", FSYNC_COMPONENTS_COMMITTED },

In terms of the 'preciousness-levels', refs should be included in
FSYNC_COMPONENTS_COMMITTED,
from which it will also be included in _ADDED.

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v4 2/4] core.fsync: introduce granular fsync control
  2022-02-02  1:42  0%       ` Junio C Hamano
@ 2022-02-11 21:18  5%         ` Neeraj Singh
  0 siblings, 0 replies; 200+ results
From: Neeraj Singh @ 2022-02-11 21:18 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Neeraj Singh via GitGitGadget, Git List, Randall S. Becker,
	Bagas Sanjaya, Elijah Newren,
	Ævar Arnfjörð Bjarmason, Patrick Steinhardt,
	Neeraj K. Singh

On Tue, Feb 1, 2022 at 5:42 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Junio C Hamano <gitster@pobox.com> writes:
>
> > I am not quite sure if this is way too complex (e.g. what does it
> > mean that we do not care much about loose-object safety while we do
> > care about commit-graph files?) and at the same time it is too
> > limited (e.g. if it makes sense to say a class of items deserve more
> > protection than another class of items, don't we want to be able to
> > say "class X is ultra-precious so use method A on them, while class
> > Y is mildly precious and use method B on them, everything else are
> > not that important and doing the default thing is just fine").
> >
> > If we wanted to allow the "matrix" kind of flexibility,...
>
> To continue with the thinking aloud...
>
> Sometimes configuration flexibility is truly needed, but often it is
> just a sign of designer being lazy and not thinking it through as an
> end-user facing problem.  In other words, "I am giving enough knobs
> to you, so it is up to you to express your policy in whatever way
> you want with the knobs provided" is a very irresponsible thing to
> tell end-users.
>
> And this one smells like the case of a lazy design.
>
> It may be that it makes sense in some workflows to protect
> commit-graph files less than object files and pack.idx files can be
> corrupted as long as pack.pack files are adequately protected
> because the former can be recomputed from the latter, but in no
> workflows, the reverse would be true.  Yet the design gives such
> needless flexibility, which makes it hard for lay end-users to
> choose the best combination and allows them to protect .idx files
> more than .pack files by mistake, for example.
>
> I am wondering if the classification itself introduced by this step
> actually can form a natural and linear progression of safe-ness.  By
> default, we'd want _all_ classes of things to be equally safe, but
> at one level down, there is "protect things that are not
> recomputable, but recomputable things can be left to the system"
> level, and there would be even riskier "protect packs as it would
> hurt a _lot_ to lose them, but losing loose ones will typically lose
> only the most recent work, and they are less valuable" level.
>
> If we, as the Git experts, spend extra brain cycles to come up with
> an easy to understand spectrum of performance vs durability
> trade-off, end-users won't have to learn the full flexibility and
> easily take the advice from experts.  They just need to say what
> level of durability they want (or how much durability they can risk
> in exchange for an additional throughput), and leave the rest to us.
>
> On the core.fsyncMethod side, the same suggestion applies.
>
> Once we know the desired level of performance vs durability
> trade-off from the user, we, as the impolementors, should know the
> best method, for each class of items, to achieve that durability on
> each platform when writing it to the storage, without exposing the
> low level details of the implementation that only the Git folks need
> to be aware of.
>
> So, from the end-user UI perspective, I'd very much prefer if we can
> just come up with a single scalar variable, (say "fsync.durability"
> that ranges from "conservative" to "performance") that lets our
> users express the level of durability desired.  The combination of
> core.fsyncMethod and core.fsync are one variable too many, and the
> latter being a variable that takes a list of things as its value
> makes it even worse to sell to the end users.

I see the value in simplifying the core.fsync configuration to a
single scalar knob of preciousness. The main motivation for this more
granular scheme is that I didn't think the current configuration
follows a sensible principle. We should be fsyncing the loose objects,
index, refs, and config files in addition to what we're already
syncing today.  On macOS, we should be doing a full hardware flush if
we've said we want to fsync.  But you expressed the notion in [1] that
we don't want to degrade the performance of the vast majority of users
who are happy with the current "unprincipled but mostly works"
configuration.  I agree with that sentiment, but it leads to a design
where we can express the current configuration, which does not follow
a scalar hierarchy.

The aggregate core.fsync options are meant to provide a way for us to
recommend a sensible configuration to the user without having to get
into the intricacies of repo layout. Maybe we can define and document
aggregate options that make sense in terms of a scalar level of
preciousness.

One reason to keep core.fsyncMethod separate from the core.fsync knob
is that it's more a property of the system and FS the repo is on,
rather than the user's value of the repo.  We could try to auto-detect
some known filesystems that might support batch mode using 'statfs',
but having a table like that in Git would go out of date over time.

Please let me know what you think about these justifications for the
current design.  I'd be happy to make a change if the current
constraint of "keep the default config the same" can be relaxed in
some way.  I'd also be happy to go back to some variation of
expressing 'core.fsyncObjectFiles = batch' and leaving the rest of
fsync story alone.

Thanks,
Neeraj

[1] https://lore.kernel.org/git/xmqqtuilyfls.fsf@gitster.g/

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v4 2/4] core.fsync: introduce granular fsync control
  2022-02-02  0:51  7%     ` Junio C Hamano
  2022-02-02  1:42  0%       ` Junio C Hamano
@ 2022-02-11 20:38  0%       ` Neeraj Singh
  1 sibling, 0 replies; 200+ results
From: Neeraj Singh @ 2022-02-11 20:38 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Neeraj Singh via GitGitGadget, Git List, Randall S. Becker,
	Bagas Sanjaya, Elijah Newren,
	Ævar Arnfjörð Bjarmason, Patrick Steinhardt,
	Neeraj K. Singh

Apologies in advance for the delayed reply.  I've finally been able to
return to Git after an absence.

On Tue, Feb 1, 2022 at 4:51 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Neeraj Singh via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > +core.fsync::
> > +     A comma-separated list of parts of the repository which should be
> > +     hardened via the core.fsyncMethod when created or modified. You can
> > +     disable hardening of any component by prefixing it with a '-'. Later
> > +     items take precedence over earlier ones in the list. For example,
> > +     `core.fsync=all,-pack-metadata` means "harden everything except pack
> > +     metadata." Items that are not hardened may be lost in the event of an
> > +     unclean system shutdown.
> > ++
> > +* `none` disables fsync completely. This must be specified alone.
> > +* `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.
> > +* `objects` is an aggregate option that includes `loose-objects`, `pack`,
> > +  `pack-metadata`, and `commit-graph`.
> > +* `default` is an aggregate option that is equivalent to `objects,-loose-object`
> > +* `all` is an aggregate option that syncs all individual components above.
>
> I am not quite sure if this is way too complex (e.g. what does it
> mean that we do not care much about loose-object safety while we do
> care about commit-graph files?) and at the same time it is too
> limited (e.g. if it makes sense to say a class of items deserve more
> protection than another class of items, don't we want to be able to
> say "class X is ultra-precious so use method A on them, while class
> Y is mildly precious and use method B on them, everything else are
> not that important and doing the default thing is just fine").
>
> If we wanted to allow the "matrix" kind of flexibility, I think the
> way to do so would be
>
>         fsync.<class>.method = <value>
>
> e.g.
>
>         [fsync "default"] method = none
>         [fsync "loose-object"] method = fsync
>         [fsync "pack-metadata"] method = writeout-only
>

I don't believe it makes sense to offer a full matrix of what to fsync
and what method to use, since the method is a property of the
filesystem and OS the repo is running on, while the list of things to
fsync is more a selection of what the user values. So if I'm hosting
on APFS on macOS or NTFS on Windows, I'd want to set the fsyncMethod
to batch so that I can get good performance at the safety level I
choose.  If I'm working on my maintainer repo, I'd maybe not want to
fsync anything, but I'd want to fsync everything when working on my
developer repo.

> Where do we expect users to take the core.fsync settings from?  Per
> repository?  If it is from per user (i.e. $HOME/.gitconfig), do
> people tend to share it across systems (not necessarily over NFS)
> with the same contents?  If so, I am not sure if fsync.method that
> is way too close to the actual "implementation" is a good idea to
> begin with.  From end-user's point of view, it may be easier to
> express "class X is ultra-precious, and class Y and Z are mildly
> so", with something like fsync.<class>.level = <how-precious> and
> let the Git implementation on each platform choose the appropriate
> fsync method to protect the stuff at that precious-ness.
>

I expect the vast majority of users to have whatever setting is baked
into their build of Git.  For the users that want to do something
different, I expect them to have core.fsyncMethod and core.fsync
configured per-user for the majority of their repos. Some repos might
have custom settings that override the per-user settings: 1) Ephemeral
repos that don't contain unique data would probably want to set
core.fsync=none. 2) Repos hosting on NFS or on a different FS may have
a stricter core.fsyncmethod setting.

(More more text to follow in reply to your next email).

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4 2/4] core.fsync: introduce granular fsync control
  2022-02-02  0:51  7%     ` Junio C Hamano
@ 2022-02-02  1:42  0%       ` Junio C Hamano
  2022-02-11 21:18  5%         ` Neeraj Singh
  2022-02-11 20:38  0%       ` Neeraj Singh
  1 sibling, 1 reply; 200+ results
From: Junio C Hamano @ 2022-02-02  1:42 UTC (permalink / raw)
  To: Neeraj Singh via GitGitGadget
  Cc: git, rsbecker, bagasdotme, newren, avarab, nksingh85, ps,
	Neeraj K. Singh

Junio C Hamano <gitster@pobox.com> writes:

> I am not quite sure if this is way too complex (e.g. what does it
> mean that we do not care much about loose-object safety while we do
> care about commit-graph files?) and at the same time it is too
> limited (e.g. if it makes sense to say a class of items deserve more
> protection than another class of items, don't we want to be able to
> say "class X is ultra-precious so use method A on them, while class
> Y is mildly precious and use method B on them, everything else are
> not that important and doing the default thing is just fine").
>
> If we wanted to allow the "matrix" kind of flexibility,...

To continue with the thinking aloud...

Sometimes configuration flexibility is truly needed, but often it is
just a sign of designer being lazy and not thinking it through as an
end-user facing problem.  In other words, "I am giving enough knobs
to you, so it is up to you to express your policy in whatever way
you want with the knobs provided" is a very irresponsible thing to
tell end-users.

And this one smells like the case of a lazy design.

It may be that it makes sense in some workflows to protect
commit-graph files less than object files and pack.idx files can be
corrupted as long as pack.pack files are adequately protected
because the former can be recomputed from the latter, but in no
workflows, the reverse would be true.  Yet the design gives such
needless flexibility, which makes it hard for lay end-users to
choose the best combination and allows them to protect .idx files
more than .pack files by mistake, for example.

I am wondering if the classification itself introduced by this step
actually can form a natural and linear progression of safe-ness.  By
default, we'd want _all_ classes of things to be equally safe, but
at one level down, there is "protect things that are not
recomputable, but recomputable things can be left to the system"
level, and there would be even riskier "protect packs as it would
hurt a _lot_ to lose them, but losing loose ones will typically lose
only the most recent work, and they are less valuable" level.

If we, as the Git experts, spend extra brain cycles to come up with
an easy to understand spectrum of performance vs durability
trade-off, end-users won't have to learn the full flexibility and
easily take the advice from experts.  They just need to say what
level of durability they want (or how much durability they can risk
in exchange for an additional throughput), and leave the rest to us.

On the core.fsyncMethod side, the same suggestion applies.

Once we know the desired level of performance vs durability
trade-off from the user, we, as the impolementors, should know the
best method, for each class of items, to achieve that durability on
each platform when writing it to the storage, without exposing the
low level details of the implementation that only the Git folks need
to be aware of.

So, from the end-user UI perspective, I'd very much prefer if we can
just come up with a single scalar variable, (say "fsync.durability"
that ranges from "conservative" to "performance") that lets our
users express the level of durability desired.  The combination of
core.fsyncMethod and core.fsync are one variable too many, and the
latter being a variable that takes a list of things as its value
makes it even worse to sell to the end users.



^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4 2/4] core.fsync: introduce granular fsync control
  @ 2022-02-02  0:51  7%     ` Junio C Hamano
  2022-02-02  1:42  0%       ` Junio C Hamano
  2022-02-11 20:38  0%       ` Neeraj Singh
  0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2022-02-02  0:51 UTC (permalink / raw)
  To: Neeraj Singh via GitGitGadget
  Cc: git, rsbecker, bagasdotme, newren, avarab, nksingh85, ps,
	Neeraj K. Singh

"Neeraj Singh via GitGitGadget" <gitgitgadget@gmail.com> writes:

> +core.fsync::
> +	A comma-separated list of parts of the repository which should be
> +	hardened via the core.fsyncMethod when created or modified. You can
> +	disable hardening of any component by prefixing it with a '-'. Later
> +	items take precedence over earlier ones in the list. For example,
> +	`core.fsync=all,-pack-metadata` means "harden everything except pack
> +	metadata." Items that are not hardened may be lost in the event of an
> +	unclean system shutdown.
> ++
> +* `none` disables fsync completely. This must be specified alone.
> +* `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.
> +* `objects` is an aggregate option that includes `loose-objects`, `pack`,
> +  `pack-metadata`, and `commit-graph`.
> +* `default` is an aggregate option that is equivalent to `objects,-loose-object`
> +* `all` is an aggregate option that syncs all individual components above.

I am not quite sure if this is way too complex (e.g. what does it
mean that we do not care much about loose-object safety while we do
care about commit-graph files?) and at the same time it is too
limited (e.g. if it makes sense to say a class of items deserve more
protection than another class of items, don't we want to be able to
say "class X is ultra-precious so use method A on them, while class
Y is mildly precious and use method B on them, everything else are
not that important and doing the default thing is just fine").

If we wanted to allow the "matrix" kind of flexibility, I think the
way to do so would be

	fsync.<class>.method = <value>

e.g.

	[fsync "default"] method = none
	[fsync "loose-object"] method = fsync
	[fsync "pack-metadata"] method = writeout-only

Where do we expect users to take the core.fsync settings from?  Per
repository?  If it is from per user (i.e. $HOME/.gitconfig), do
people tend to share it across systems (not necessarily over NFS)
with the same contents?  If so, I am not sure if fsync.method that
is way too close to the actual "implementation" is a good idea to
begin with.  From end-user's point of view, it may be easier to
express "class X is ultra-precious, and class Y and Z are mildly
so", with something like fsync.<class>.level = <how-precious> and
let the Git implementation on each platform choose the appropriate
fsync method to protect the stuff at that precious-ness.

Thanks.




	

^ permalink raw reply	[relevance 7%]

* Re: [PATCH] name-rev: deprecate --stdin in favor of --annotate-text
  2021-12-27 19:49  4% ` Junio C Hamano
  2021-12-28  5:13  0%   ` John Cai
@ 2022-01-01 22:59  0%   ` Johannes Schindelin
  1 sibling, 0 replies; 200+ results
From: Johannes Schindelin @ 2022-01-01 22:59 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: John Cai via GitGitGadget, git, John Cai

Hi Junio,

On Mon, 27 Dec 2021, Junio C Hamano wrote:

> "John Cai via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> As name-rev is Dscho's brainchild, I think it is benefitial to ask input
> from him, so I added an address to the CC: list.

Thank you!

> > From: John Cai <johncai86@gmail.com>
> >
> > Introduce a --annotate-text that is functionally equivalent of --stdin.
> > --stdin does not behave as --stdin in other subcommands, such as
> > pack-objects whereby it takes one argument per line. Since --stdin can
> > be a confusing and misleading name, rename it to --annotate-text.
> >
> > This change adds a warning to --stdin warning that it will be removed in
> > the future.
>
> I know I've suggested the name, but 'text' in --annotate-text is a
> low value word in an option name where every byte is precious.
> "Annotate" is very good to convey what is done to the object of the
> verb, but "text" stresses the wrong thing (we do not annotate
> binary,o we annotate text) without saying where the text comes from
> (i.e.  standard input).  Perhaps "--annotate-stdin" would be a much
> better name.

I agree that `--annotate-stdin` is better, especially since people who
might look for a replacement for `--stdin` in the documentation are much
more likely to find what they're looking for.

In addition to this, I also agree with Junio on the deprecation needing to
be done carefully.

Ciao,
Dscho

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] name-rev: deprecate --stdin in favor of --annotate-text
  2021-12-27 19:49  4% ` Junio C Hamano
@ 2021-12-28  5:13  0%   ` John Cai
  2022-01-01 22:59  0%   ` Johannes Schindelin
  1 sibling, 0 replies; 200+ results
From: John Cai @ 2021-12-28  5:13 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: John Cai via GitGitGadget, git, Johannes Schindelin



> On Dec 27, 2021, at 11:49 AM, Junio C Hamano <gitster@pobox.com> wrote:
> 
> "John Cai via GitGitGadget" <gitgitgadget@gmail.com> writes:
> 
> As name-rev is Dscho's brainchild, I think it is benefitial to ask input
> from him, so I added an address to the CC: list.
> 
>> From: John Cai <johncai86@gmail.com>
>> 
>> Introduce a --annotate-text that is functionally equivalent of --stdin.
>> --stdin does not behave as --stdin in other subcommands, such as
>> pack-objects whereby it takes one argument per line. Since --stdin can
>> be a confusing and misleading name, rename it to --annotate-text.
>> 
>> This change adds a warning to --stdin warning that it will be removed in
>> the future.
> 
> I know I've suggested the name, but 'text' in --annotate-text is a
> low value word in an option name where every byte is precious.
> "Annotate" is very good to convey what is done to the object of the
> verb, but "text" stresses the wrong thing (we do not annotate
> binary,o we annotate text) without saying where the text comes from
> (i.e.  standard input).  Perhaps "--annotate-stdin" would be a much
> better name.
> 
> I agree that letting "--stdin" to deviate so much from an emulation
> of "xargs git name-rev" was indeed a mistake that caused the
> confusion that led to the other thread.  If the mode had a better
> name from the day 1, the thread would have been avoided.
> 
> What I am not sure about is how much this transition would hurt
> existing users and scripts.
> 
>> +	For example:
>> ++
>> +----------
>> +$ cat sample.txt
>> +
>> +An abbreviated revision 2ae0a9cb82 will not be substituted.
>> +The full name after substitution is 2ae0a9cb8298185a94e5998086f380a355dd8907,
>> +while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
>> +
>> +$ git name-rev --annotate-text < sample.txt
> 
> Lose SP between the redirection operator '<' and its file 'sample.txt'.
> 
>> +
>> +An abbreviated revision 2ae0a9cb82 will not be substituted.
>> +The full name after substitution is 2ae0a9cb8298185a94e5998086f380a355dd8907
>> +(master),
>> +while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
>> +
>> +$ git name-rev --name-only --annotate-text < sample.txt
> 
> Ditto.
> 
>> +	if (transform_stdin) {
>> +		warning("--stdin is deprecated. Please use --annotate-text instead, "
>> +					"which is functionally equivalent.\n"
>> +					"This option will be removed in a future release.");
>> +		annotate_text = 1;
> 
> I guess that is sensible.  To squelch the warning, they can switch
> to the new option.
> 
>> +	}
>> +
>> +	if (all + annotate_text + !!argc > 1) {
>> 		error("Specify either a list, or --all, not both!");
>> 		usage_with_options(name_rev_usage, opts);
>> 	}
>> -	if (all || transform_stdin)
>> +	if (all || annotate_text)
>> 		cutoff = 0;
>> 
>> 	for (; argc; argc--, argv++) {
>> @@ -613,7 +622,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
>> 	for_each_ref(name_ref, &data);
>> 	name_tips();
>> 
>> -	if (transform_stdin) {
>> +	if (annotate_text) {
>> 		char buffer[2048];
>> 
>> 		while (!feof(stdin)) {
> 
> Not a suggestion to change anything in this patch, but just an
> observation.
> 
> - If the mode is useful enough for many users, certainly somebody
>   would have rewritten this loop to lift the line-length limit, but
>   nobody noticed and complained about this 2k limit for the past 17
>   years.  I am not sure if that is an indication that nobody uses
>   the option in its current form.

Would this also mean that deprecating --stdin wouldn’t be **too** disruptive to existing users and scripts?

> - A low hanging fruit, if we do not go full strbuf_getline(), at
>   least we should narrow the scope of buffer[] array.
> 


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] name-rev: deprecate --stdin in favor of --annotate-text
  @ 2021-12-27 19:49  4% ` Junio C Hamano
  2021-12-28  5:13  0%   ` John Cai
  2022-01-01 22:59  0%   ` Johannes Schindelin
  0 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2021-12-27 19:49 UTC (permalink / raw)
  To: John Cai via GitGitGadget; +Cc: git, John Cai, Johannes Schindelin

"John Cai via GitGitGadget" <gitgitgadget@gmail.com> writes:

As name-rev is Dscho's brainchild, I think it is benefitial to ask input
from him, so I added an address to the CC: list.

> From: John Cai <johncai86@gmail.com>
>
> Introduce a --annotate-text that is functionally equivalent of --stdin.
> --stdin does not behave as --stdin in other subcommands, such as
> pack-objects whereby it takes one argument per line. Since --stdin can
> be a confusing and misleading name, rename it to --annotate-text.
>
> This change adds a warning to --stdin warning that it will be removed in
> the future.

I know I've suggested the name, but 'text' in --annotate-text is a
low value word in an option name where every byte is precious.
"Annotate" is very good to convey what is done to the object of the
verb, but "text" stresses the wrong thing (we do not annotate
binary,o we annotate text) without saying where the text comes from
(i.e.  standard input).  Perhaps "--annotate-stdin" would be a much
better name.

I agree that letting "--stdin" to deviate so much from an emulation
of "xargs git name-rev" was indeed a mistake that caused the
confusion that led to the other thread.  If the mode had a better
name from the day 1, the thread would have been avoided.

What I am not sure about is how much this transition would hurt
existing users and scripts.

> +	For example:
> ++
> +----------
> +$ cat sample.txt
> +
> +An abbreviated revision 2ae0a9cb82 will not be substituted.
> +The full name after substitution is 2ae0a9cb8298185a94e5998086f380a355dd8907,
> +while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
> +
> +$ git name-rev --annotate-text < sample.txt

Lose SP between the redirection operator '<' and its file 'sample.txt'.

> +
> +An abbreviated revision 2ae0a9cb82 will not be substituted.
> +The full name after substitution is 2ae0a9cb8298185a94e5998086f380a355dd8907
> +(master),
> +while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
> +
> +$ git name-rev --name-only --annotate-text < sample.txt

Ditto.

> +	if (transform_stdin) {
> +		warning("--stdin is deprecated. Please use --annotate-text instead, "
> +					"which is functionally equivalent.\n"
> +					"This option will be removed in a future release.");
> +		annotate_text = 1;

I guess that is sensible.  To squelch the warning, they can switch
to the new option.

> +	}
> +
> +	if (all + annotate_text + !!argc > 1) {
>  		error("Specify either a list, or --all, not both!");
>  		usage_with_options(name_rev_usage, opts);
>  	}
> -	if (all || transform_stdin)
> +	if (all || annotate_text)
>  		cutoff = 0;
>  
>  	for (; argc; argc--, argv++) {
> @@ -613,7 +622,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
>  	for_each_ref(name_ref, &data);
>  	name_tips();
>  
> -	if (transform_stdin) {
> +	if (annotate_text) {
>  		char buffer[2048];
>  
>  		while (!feof(stdin)) {

Not a suggestion to change anything in this patch, but just an
observation.

 - If the mode is useful enough for many users, certainly somebody
   would have rewritten this loop to lift the line-length limit, but
   nobody noticed and complained about this 2k limit for the past 17
   years.  I am not sure if that is an indication that nobody uses
   the option in its current form.

 - A low hanging fruit, if we do not go full strbuf_getline(), at
   least we should narrow the scope of buffer[] array.


^ permalink raw reply	[relevance 4%]

* Re: Bug report - Can create worktrees from bare repo / such worktrees can fool is_bare_repository()
  @ 2021-12-20 16:20  4%         ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2021-12-20 16:20 UTC (permalink / raw)
  To: Derrick Stolee
  Cc: Eric Sunshine, Sean Allred, Git List,
	Nguyễn Thái Ngọc Duy, Derrick Stolee,
	Taylor Blau, Elijah Newren

Derrick Stolee <stolee@gmail.com> writes:

> Thanks for this context of added responsibility. It seems a bit strange
> to require this, since it doesn't make any sense to have a bare worktree
> (at least not to me, feel free to elaborate on the need of such a
> situation).

Stepping back a bit, those who want to have two new worktrees
attached to a single bare repository justify the wish by saying that
neither of these two new worktrees should be the primary thing that
they can lose to make the other inoperable, and having a dedicated
"shared object and ref store" repository makes it more symmetric and
safer by making it obvious which one is the precious thing to keep.

Wanting to create two new "bare repository lookalike" attached to a
single bare repository might be defensible the same way.

Not that the current "git worktree" has readily-available features
to create such a layout.  If people who have worked on "worktree"
did not see the possibility of needing such a layout, it is
understandable that such features wouldn't have been designed yet.

Also not that I think that such a layout necessarily makes sense.

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v3 03/11] read-tree, merge-recursive: overwrite ignored files by default
  @ 2021-12-13 20:10  6%         ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2021-12-13 20:10 UTC (permalink / raw)
  To: Jack O'Connor; +Cc: git, Elijah Newren via GitGitGadget

On Mon, Dec 13, 2021 at 9:12 AM Jack O'Connor <oconnor663@gmail.com> wrote:
>
> > read-tree, merge-recursive: overwrite ignored files by default
>
> When this patch shipped in v1.34, a test broke in a project of mine
> (https://github.com/buildinspace/peru/blob/e9ba6e0024ea08105a8d027f958899cca39aeb9a/tests/test_cache.py#L111-L117)
> that was relying on git read-tree *not* to respect .gitignore files.
> (Obligatory https://xkcd.com/1172.) That peru tool is using git
> plumbing commands to manage trees of files, but it tries to keep this
> implementation detail internal, and behaving differently in the
> presence of a .gitignore file belonging to the user would leak this
> internal implementation detail. I've been trying to figure out a way
> to reproduce the Git 1.33 behavior in Git 1.34, but so far I haven't
> found any flags or configs to do that. (For example, putting !* in
> .git/info/exclude doesn't seem to help, I think because a .gitignore
> file in the working tree takes precedence.) Can anyone suggest another
> workaround?
>
> This is my first mail to this list, so please let me know if I mess up
> the etiquette.

Your email is fine.  :-)  Interesting usage case; thanks for sending it along.

Digging a bit into your repository, it appears this all started
because you noticed that checkout would overwrite ignored files, and
so you switched to reset --keep (in your 637d5c042262 (make cache
export refuse to pave .gitgnored files, 2014-07-22)) and then to
read-tree (in your 057d1af600f9 (Rewrite `export_tree` to allow
deleted files., 2014-08-05)) to avoid having ignored files be
overwritten. You could have stuck with `git checkout` all along, and
just passed it the --no-overwrite-ignore flag.  You probably just
missed the existence of that flag, because Duy forgot to document it
for 8 years (see git.git's commit 9d223d43e5 ("doc: document
--overwrite-ignore", 2019-03-29))  Going back to checkout might
provide you a workaround.  (Also, another random thing I noticed while
looking at your repo: `--diff-filter=d` is a much better way of
checking for not-deleted-changes than using `--diff-filter=ACMRTUXB`.
Note the lowercase 'd' rather than uppercase.)

Your report suggests more places should accept the
--no-overwrite-ignore flag, which I alluded to as a possibility in the
sixth patch in the series ("Remove ignored files by default when they
are in the way"[1]) and the comments in the cover letter about
precious ignored files (under "SIDENOTE about treating ignored files
as precious"[2]).  And perhaps we could have a core.overwriteIgnore
config option for setting a different global default (also as alluded
to in my cover letter).  Doing things would provide additional
workarounds, and finally provide the "precious ignored" concept that
has been discussed occasionally.  I think it's not too hard to do that
on top of my previous patch series.  I'll try to take a look after
some other in-flight series finally land.


[1] https://lore.kernel.org/git/b7fe354effff8da3de53bd9cc40a03b5fd455f67.1632760428.git.gitgitgadget@gmail.com/
[2] https://lore.kernel.org/git/pull.1036.v3.git.1632760428.gitgitgadget@gmail.com/

^ permalink raw reply	[relevance 6%]

* Re: [RFC/PATCH] Makefile: add test-all target
  2021-12-08 20:04  4%           ` [RFC/PATCH] Makefile: add test-all target Junio C Hamano
@ 2021-12-09  3:44  0%             ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-12-09  3:44 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Elijah Newren, Johannes Schindelin via GitGitGadget,
	Git Mailing List, Derrick Stolee, Eric Sunshine, Bagas Sanjaya,
	Theodore Ts'o, Matt Rogers, Johannes Schindelin


On Wed, Dec 08 2021, Junio C Hamano wrote:

> We ship contrib/ stuff within our primary source tree but except for
> the completion scripts that are tested from our primary test suite,
> their test suites are not run in the CI.
>
> Teach the main Makefile a "test-extra" target, which goes into each
> package in contrib/ whose Makefile has its own "test" target and
> runs "make test" there.  Add a "test-all" target to make it easy to
> drive both the primary tests and these contrib tests from CI and use
> it.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
> Junio C Hamano <gitster@pobox.com> writes:
>
>> That is an interesting way to demonstrate how orthogonal the issues
>> are, which in turn means that it is not such a big deal to add back
>> the coverage to the part that goes to contrib/scalar/.  As the actual
>> implementation, it is a bit too icky, though.
>
> So, how about doing it this way?  This is based on 'master' and does
> not cover contrib/scalar, but if we want to go this route, it should
> be trivial to do it on top of a merge of ab/ci-updates and js/scalar
> into 'master'.  Good idea?  Terrible idea?  Not good enough?

With the caveat that I think the greater direction here makes no sense,
i.e. scalar didn't need its own build system etc. in the first place, so
having hack-upon-hack to fix various integration issues is clearly worse
than just having it behave like everything else....

... then yes, adding this to the top-level Makefile makes more sense....

>  Makefile                  | 12 +++++++++++-
>  ci/run-build-and-tests.sh | 10 +++++-----
>  2 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git i/Makefile w/Makefile
> index d56c0e4aad..ca14558e3c 100644
> --- i/Makefile
> +++ w/Makefile
> @@ -2878,10 +2878,20 @@ export TEST_NO_MALLOC_CHECK
>  test: all
>  	$(MAKE) -C t/ all
>  
> +# Additional tests from places in contrib/ that are prepared to take
> +# "make -C $there test", but expects that the primary build is done
> +# already.
> +test-extra: all
> +	$(MAKE) -C contrib/diff-highlight test
> +	$(MAKE) -C contrib/mw-to-git test
> +	$(MAKE) -C contrib/subtree test
> +
> +test-all:: test test-extra
> +
>  perf: all
>  	$(MAKE) -C t/perf/ all
>  
> -.PHONY: test perf
> +.PHONY: test test-extra test-all perf
>  
>  .PRECIOUS: $(TEST_OBJS)

Which, if we're nitpicking this would be better, i.e. it allows them to
run in parallel, as they won't be defined by only one rule, and will be
listede individuall in the test-all and test-extra prereqs:

diff --git a/Makefile b/Makefile
index d892dbc6c6e..3f47c9f58ad 100644
--- a/Makefile
+++ b/Makefile
@@ -2878,15 +2878,25 @@ export TEST_NO_MALLOC_CHECK
 test: all
 	$(MAKE) -C t/ all
 
+define TMPL_test-extra
+TEST_EXTRA_TARGETS += test-$(1)
+.PHONY: test-$(1)
+test-$(1): all
+	$$(MAKE) -C $(1) test
+endef
+
 # Additional tests from places in contrib/ that are prepared to take
 # "make -C $there test", but expects that the primary build is done
 # already.
-test-extra: all
-	$(MAKE) -C contrib/diff-highlight test
-	$(MAKE) -C contrib/mw-to-git test
-	$(MAKE) -C contrib/subtree test
+$(eval $(call TMPL_test-extra,contrib/diff-highlight))
+$(eval $(call TMPL_test-extra,contrib/mw-to-git))
+$(eval $(call TMPL_test-extra,contrib/subtree))
+
+.PHONY: test-extra
+test-extra:: all $(TEST_EXTRA_TARGETS)
 
-test-all:: test test-extra
+.PHONY: test-all
+test-all: test $(TEST_EXTRA_TARGETS)
 
 perf: all
 	$(MAKE) -C t/perf/ all

> diff --git i/ci/run-build-and-tests.sh w/ci/run-build-and-tests.sh
> index cc62616d80..9da0f26665 100755
> --- i/ci/run-build-and-tests.sh
> +++ w/ci/run-build-and-tests.sh
> @@ -19,7 +19,7 @@ make
>  case "$jobname" in
>  linux-gcc)
>  	export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
> -	make test
> +	make test-all
> [...]

But I think we're expanding the scope quite a bit here. The reason we
were talking about testing scalar by default is because it uses
libgit.a, so it's not decoupled at all, whereas the "contrib" programs
are only using the built "git" command.

I think it would probably be good to test these anyway, but it's an
argument beyond that which applies to scalar.

I also share Jeff's general concerns that the other stuff in contrib may
not be all that stable.

But I don't see why we should be pursuing this direction of running
certain tests in CI only, as opposed to just under "make test", that
distinction is something new in js/scalar (before that we run libgit.a
test *modes* in CI, but not a different set of tests).

^ permalink raw reply related	[relevance 0%]

* [RFC/PATCH] Makefile: add test-all target
  @ 2021-12-08 20:04  4%           ` Junio C Hamano
  2021-12-09  3:44  0%             ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2021-12-08 20:04 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Elijah Newren, Johannes Schindelin via GitGitGadget,
	Git Mailing List, Derrick Stolee, Eric Sunshine, Bagas Sanjaya,
	Theodore Ts'o, Matt Rogers, Johannes Schindelin

We ship contrib/ stuff within our primary source tree but except for
the completion scripts that are tested from our primary test suite,
their test suites are not run in the CI.

Teach the main Makefile a "test-extra" target, which goes into each
package in contrib/ whose Makefile has its own "test" target and
runs "make test" there.  Add a "test-all" target to make it easy to
drive both the primary tests and these contrib tests from CI and use
it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
Junio C Hamano <gitster@pobox.com> writes:

> That is an interesting way to demonstrate how orthogonal the issues
> are, which in turn means that it is not such a big deal to add back
> the coverage to the part that goes to contrib/scalar/.  As the actual
> implementation, it is a bit too icky, though.

So, how about doing it this way?  This is based on 'master' and does
not cover contrib/scalar, but if we want to go this route, it should
be trivial to do it on top of a merge of ab/ci-updates and js/scalar
into 'master'.  Good idea?  Terrible idea?  Not good enough?

 Makefile                  | 12 +++++++++++-
 ci/run-build-and-tests.sh | 10 +++++-----
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git i/Makefile w/Makefile
index d56c0e4aad..ca14558e3c 100644
--- i/Makefile
+++ w/Makefile
@@ -2878,10 +2878,20 @@ export TEST_NO_MALLOC_CHECK
 test: all
 	$(MAKE) -C t/ all
 
+# Additional tests from places in contrib/ that are prepared to take
+# "make -C $there test", but expects that the primary build is done
+# already.
+test-extra: all
+	$(MAKE) -C contrib/diff-highlight test
+	$(MAKE) -C contrib/mw-to-git test
+	$(MAKE) -C contrib/subtree test
+
+test-all:: test test-extra
+
 perf: all
 	$(MAKE) -C t/perf/ all
 
-.PHONY: test perf
+.PHONY: test test-extra test-all perf
 
 .PRECIOUS: $(TEST_OBJS)
 
diff --git i/ci/run-build-and-tests.sh w/ci/run-build-and-tests.sh
index cc62616d80..9da0f26665 100755
--- i/ci/run-build-and-tests.sh
+++ w/ci/run-build-and-tests.sh
@@ -19,7 +19,7 @@ make
 case "$jobname" in
 linux-gcc)
 	export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
-	make test
+	make test-all
 	export GIT_TEST_SPLIT_INDEX=yes
 	export GIT_TEST_MERGE_ALGORITHM=recursive
 	export GIT_TEST_FULL_IN_PACK_ARRAY=true
@@ -33,20 +33,20 @@ linux-gcc)
 	export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
 	export GIT_TEST_WRITE_REV_INDEX=1
 	export GIT_TEST_CHECKOUT_WORKERS=2
-	make test
+	make test-all
 	;;
 linux-clang)
 	export GIT_TEST_DEFAULT_HASH=sha1
-	make test
+	make test-all
 	export GIT_TEST_DEFAULT_HASH=sha256
-	make test
+	make test-all
 	;;
 linux-gcc-4.8|pedantic)
 	# Don't run the tests; we only care about whether Git can be
 	# built with GCC 4.8 or with pedantic
 	;;
 *)
-	make test
+	make test-all
 	;;
 esac
 

^ permalink raw reply related	[relevance 4%]

* Re: [PATCH 1/8] t2501: add various tests for removing the current working directory
  @ 2021-11-25 10:04  3%           ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-11-25 10:04 UTC (permalink / raw)
  To: Elijah Newren
  Cc: Elijah Newren via GitGitGadget, Git Mailing List, Jeff King,
	Glen Choo


On Mon, Nov 22 2021, Elijah Newren wrote:

> On Mon, Nov 22, 2021 at 6:27 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>>
>> On Mon, Nov 22 2021, Elijah Newren wrote:
>>
>> > On Sun, Nov 21, 2021 at 9:59 AM Ævar Arnfjörð Bjarmason
>> > <avarab@gmail.com> wrote:
>> >>
>> >> On Sun, Nov 21 2021, Elijah Newren via GitGitGadget wrote:
>> >>
>> >> > From: Elijah Newren <newren@gmail.com>
>> >>
>> >> > +test_expect_failure 'checkout fails if cwd needs to be removed' '
>> >> > +     git checkout foo/bar/baz &&
>> >> > +     test_when_finished "git clean -fdx" &&
>> >> > +
>> >> > +     mkdir dirORfile &&
>> >> > +     (
>> >> > +             cd dirORfile &&
>> >> > +
>> >> > +             test_must_fail git checkout fd_conflict 2>../error &&
>> >> > +             grep "Refusing to remove the current working directory" ../error
>> >> > +     ) &&
>> >> > +
>> >> > +     test_path_is_dir dirORfile
>> >>
>> >>
>> >> I'd find this & the rest of this series much easier to understand if we
>> >> started out by positively asserting the current behavior here, and
>> >> didn't test_cmp/grep for erro r messages that don't exist anymore.
>> >
>> > Yeah, this is my fault for my bad commit message.  I stated I was
>> > adding tests checking for the problems of interest, making it sound
>> > like I was testing existing behavior, but I should have stated I was
>> > adding tests with the behavior we'd prefer to have (i.e. basically a
>> > test-driven-development) setup.
>> >
>> > Also, there really wouldn't need to be so many tests for describing
>> > the existing behavior.  It's basically just `git
>> > $OPERATION_THAT_REMOVES_CWD_AS_SIDE_EFFECT` followed by nearly any
>> > other git command will cause the second and later commands to fail
>> > with:
>> >
>> > ```
>> > shell-init: error retrieving current directory: getcwd: cannot access
>> > parent directories: No such file or directory
>> > fatal: Unable to read current working directory: No such file or directory
>> > ```
>> >
>> > However, we do need a lot of tests for corrected behavior, because
>> > there are so many different codepaths we can follow which will lead to
>> > deletion of the current working directory.
>>
>> Currently if I do e.g.:
>>
>>     git checkout master
>>     git clean -dxf
>>     cd perl
>>     git checkout v0.99
>>     cd ../
>>     git clean -dxfn
>>
>> Nothing breaks and I don't end up with an empty perl/ to remove. With
>> these patches we'd either die on the "checkout" (I think) keep the
>> "perl" and have an empty perl/ to report in the "git clean -dxfn" at the
>> end (I'm not sure which, I forgot and haven't re-read this series just
>> now).
>
> You'd have an empty perl/ left after the checkout, which would be
> cleaned up by your final git clean command.

FWIW that's with a -n, just showing that we've got things left.

I.e. just a demo of the new state, in any case not really applicable
since the end-state behavior is that we die...

>> I think changing it anyway might be justifiable, but changing the
>> behavior of things like that tickles my spidey sense a bit. I.e. I can
>> see people having written scripts like that which would break (it's
>> often easier to cd around after globbing than staying at the top-level,
>> then jump back).
>
> I disagree this would break any user scripts.  If people expect a 'git
> checkout' or 'git rebase' to always work, their script is _already_
> broken.

Broken as in they'll upgrade git and a previously working script or
cronjob stops working.

Maybe it's too obscure to worry about, but saying nothing broke that
wasn't working before seems to be moving goalposts to an odd place.

Anyway, I see from
https://lore.kernel.org/git/CABPp-BETpWU9Rkd6pcxh6+gav2QtYnu_5V8ji_1_3kMnVswp1Q@mail.gmail.com/
that you're not really saying that & that we've partially got a split
thread here. Just replying here...

> The presence of any untracked files within the directory
> already results in a hard error -- we refuse to remove non-empty
> directories (unless all files are tracked and unmodified).  This rule
> deserves a clarification: treat the current working directory as
> non-empty since the parent process is likely still parked there..

I'm not going to make this my hill to die on, and honestly wouldn't care
that much if this were changed, aside from wondering how much is really
the x-y problem of setup.c.

But just in the interest of clarity, what I'm talking about is that git
is a *nix tool, and usually just follows *nix FS semantics.

I think we should have a strong bias towards continuing until the OS
tell us to stop for any FS operations. Rather than aborting early in
anticipation of an eventual error, particularly when as I've shown that
eventual error is fixable.

> Further, our own commands are broken/misbehaving due to us not
> erroring out; see e.g.
> https://lore.kernel.org/git/xmqqv93n7q1v.fsf@gitster.g/ and its
> grandparent.  User scripts likely have lurking problems too.

*Nod*. Not to go on about it, but I think those issues are pointing out
things that would be fixed by the the more narrow WIP patch I've got of
"let's just make setup.c not suck in that case" :)

>> So I wonder (especially with Glen's comment in
>> <20211123003958.3978-1-chooglen@google.com>) if this is being done at
>> the right API level.
>
> Glen's comment was interesting, but provided no specifics about how
> the changes I made could cause any possible harm in his case.
> Further, the fact that others are adding extra places doing cleanup
> sound like additional codepaths that should be protected for the exact
> same reasons.  I think we absolutely want my changes affecting his new
> codepaths.

Again, "not my hill" etc., but I think the harm is pretty much that
every time we start adding any sort of unexpected special-sauce on top
of doing stuff until we get a syscall error we're subverting the default
expectations of users.

I think about this as being in the same category as changing "checkout",
"rm" etc. to error out if we detect the target file is open (Windows),
or refusing to remove an executable that we detect as being in use
(AIX).

If you're not on those platforms having a random tool you're scripting
imposing strictures outside of what the OS would do is just another
thing to explain to users. Let's just try and run into the OS error, or
fix our handling of the subsequent error (if any).

>> E.g. maybe it would be better for some commands to
>> ease into this with an advise() or warning() and not a die() or error(),
>> or have the die() be in the likes of "git switch" but not "reset
>> --hard".
>
> The commands that don't need to remove the current working directory
> but just were as a convenience, no longer do and continue on just
> fine.  Commands that need to remove the current working directory in
> order to place a file there will error out, just as they would have
> when trying to remove a directory with untracked files.  I see no need
> to ease into anything here.

Whatever direction we decide on here, I really don't think it makes
sense to think about tracked and modified local content the same as
untracked and unmodified content.

For "tracked and modified" we clearly "own" it, and erroring out is what
everyone would expect us to do. We don't want git to shred user data.

For "untracked and unmodified" (the part after "and" being redundant
:-)) we've got the "precious" edge-case, i.e. we could shred something
the user cares about (which you've also been working on & I very much
applaud).

But I think by any sane definition we'd still classify such content as
less important (since in those cases of shredding it's matching a
.gitignore).

And surely *way lower* in that foodchain is "untracked and
irrelevant". I.e. it's conceivable that someone is making meaningful use
of an empty directory, but it's very unlikely, and in any case your
argument for this change isn't that the directory is important per-se,
but that 

You note in
https://lore.kernel.org/git/CABPp-BETpWU9Rkd6pcxh6+gav2QtYnu_5V8ji_1_3kMnVswp1Q@mail.gmail.com/
that for "rm -r" we already left the directory behind for a "dir" that
had partially tracked/untracked content, that's correct. I'm referring
to the case where "x" is entirely tracked.

>> Or maybe not, just food for thought...
>
> You may also be interested in reading more of the other thread I
> linked to from my cover letter; all these cases were discussed in good
> detail over there.  For example, look at
> https://lore.kernel.org/git/CABPp-BFmU+RaAjq4_0-PSfRgH1Jc63nN0fMuDWk2+iDbdz7CCA@mail.gmail.com/.
> Peff's previous suggestion was to just make the commands error out if
> they'd normally remove the current working directory and require the
> user to run from a different directory instead.  My version lightened
> that requirement so it only errors out if the current working
> directory needed to be removed in order to place something else there
> (and if nothing else was needed to be placed there, then just leaving
> the directory around).

I've read through those, and might have missed something, but it seems
to all really be discussing the shortcomings of setup.c's handling of
failing getcwd() by proxy.

That and references to other 3rd party commands potentially being
equally confused.

In summary I think we should aim more towards:

    $ grep -m 1 Git ../README.md 
    Git - fast, scalable, distributed revision control system

Than:

    $ git grep --no-index -m 1 . ../README.md 
    fatal: Unable to read current working directory: No such file or directory

Which fails due to the setup.c issue I've noted, but also because we
stupidly really translate that to the equivalent of a (in an x/ that
doesn't exist anymore):

    $ grep -m 1 Git ../x/../README.md 
    grep: ../x/../README.md: No such file or directory



^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 3/3] Makefile: replace most hardcoded object lists with $(wildcard)
  2021-11-01 19:19  1%   ` [PATCH v2 3/3] " Ævar Arnfjörð Bjarmason
@ 2021-11-06 10:57  0%     ` Phillip Wood
  0 siblings, 0 replies; 200+ results
From: Phillip Wood @ 2021-11-06 10:57 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason, git
  Cc: Junio C Hamano, Jeff King, Paul Smith, Sibi Siddharthan

Hi Ævar

On 01/11/2021 19:19, Ævar Arnfjörð Bjarmason wrote:
> Remove the hardcoded lists of objects in favor of using
> $(wildcard). This means that every time a built-in, test tool etc. is
> added we won't need to patch the top-level Makefile, except for the
> few remaining cases where the asset in question would make it onto one
> of our list of exceptions.
> 
> Ever since 81b50f3ce40 (Move 'builtin-*' into a 'builtin/'
> subdirectory, 2010-02-22) this has been relatively easy to do (and
> even before that we could glob builtin-*.c). This pattern of
> exhaustively enumerating files was then carried forward for
> e.g. TEST_BUILTINS_OBJS in efd71f8913a (t/helper: add an empty
> test-tool program, 2018-03-24).
> 
> One reason not to do this is that now a new *.c file at the top-level
> will be immediately picked up, so if a new *.c file is being worked on
> "make" will error if it doesn't compile, whereas before that file
> would need to be explicitly listed in the Makefile. I think than small
> trade-off is worth it.

If I need to split up some uncommitted changes into several commits and 
I know it is going to be fiddly to do so I will sometimes copy the 
original file to foo.safe.c and then edit foo.c to create each commit. 
Then I can easily compile and test each commit and editing the file 
directly is often easier than using add -p and editing the hunks. With 
this patch running make will fail in that case I think.

> We could make this simpler still for the Makefile by moving
> "unix-socket.c" etc. to e.g. a "conditional-src/" directory, likewise
> for $(PROGRAM_OBJS) to e.g. "programs/". If we did that we would not
> need the "$(filter-out)" for LIB_OBJS. I don't think that's worth it,
> e.g. due to "git log -- <path>" on the files now needing a "--follow".
> 
> There's a few small "while we're at it" changes here, since I'm
> touching the code in question:
> 
>   - Start splitting up the the "Guard against the environment" section
>     at the top, but don't move anything that exists there out to avoid
>     merge conflicts
> 
>   - The $(TEST_BUILTINS_OBJS) variable was needlessly complex, because
>     it didn't have the full paths we'd pathsubst it back & forth.
> 
>   - Introduce *_SRC in addition to *_OBJ for the variable I'm
>     touching. Eventually we'll want to do this for all the *.o files,
>     i.e. make the *.c list a source of truth for *.o, which means we can
>     e.g. use that exhaustive list for "make TAGS".
> 
>   - Add a missing "curl-objs" target. See 029bac01a87 (Makefile: add
>     {program,xdiff,test,git,fuzz}-objs & objects targets, 2021-02-23)
>     for the commit that added the rest.
> 
>   - De-indent an "ifndef" block, we don't usually indent their
>     contents.
> 
> On the CMake changes here:
> 
>   - When CMake support was introduced in was introduced
>     061c2240b1b (Introduce CMake support for configuring Git, 2020-06-12)
>     there was a discussion about the maintenance burden of maintaining the
>     top-level Makefile in parallel with CMakeLists.txt[1] where reviewers
>     were assured that doing so would simply be a matter of adding something
>     to a list in the CMake recipe.
> 
>     Between change and some recent changes of mine where the "vs-build"
>     job failed to a divergence between the Makefile and CMakeList.txt I
>     can confidently say that that doesn't at all match reality. Even
>     seemingly trivial changes to the Makefile like this one are forcing
>     us to do a deep-dive into CMake internals to make forward progress
>     with our main build system.

My recollection is that the discussions were about not having to touch 
CMakeList.txt when adding new files to the build and I think that 
largely works. I don't think a lot of the changes you have been making 
recently were anticipated in that discussion.

>   - The promised "We can add a (continue-on-error) to vs-build job to
>     make this process less of a hindrance." in [2] never materialized.
>     Since 4c2c38e800f (ci: modification of main.yml to use cmake for
>     vs-build job, 2020-06-26) got a hard dependency on CMake as far as
>     getting the CI to pass goes.
> 
>   - The "vs-build" CI doesn't actually require that there be no GNU make
>     usage in the job, as it itself has a hard dependency on running a
>     "make -n artifacts-tar" command. So as far as any vs-specific special-sauce
>     goes we don't need a GNU-make free build system for vs-build.

We need GNU-make for the ci job but an individual developer using CMake 
does not need GNU-make installed. On linux it is possible to build git 
without having make installed by using cmake and ninja [1]

>   - The stated goal in 061c2240b1b of avoiding a GNU make dependency
>     for developer because it requires an SDK that "occupies around two
>     gigabytes" and "three quarters of a gigabyte worth of Git objects"
>     hardly seems worthwhile trade-off given the above. Disk space is cheap,
>     developer time required to maintain two parallel build systems isn't.

That rather assumes everyone has plenty of disk space and a decent 
network connection.

> My attempt to amend/revert 4c2c38e800f to have it use the
> pre-4c2c38e800f "make" invocation as a fallback failed, partially
> because I don't have a Windows development environment, so any attempt
> to change it is a painfully slow round-trip to GitHub CI.
> 
> Let's instead have CMake call out to the Makefile asking it what the
> definition of various variables lists is, rather than being forced to
> maintain those lists in a way that CMake can parse with regexes (which
> precludes anything but a giant hardcoded list).
> 
> I could familiarize myself enough with CMake to do this in some
> CMake-native way, but that would take "just as long as adding it to
> the Makefile"[2] (I think that took me <5 minutes, but I'm several
> hours into fighting with CMake)
> 
> So I consider this both a bugfix to the stated aims of this CMake
> integration, and a better way forward for having an alternate build
> system. I.e. If someone really does care about a having a
> GNU-make-less dependency for the "vs-build" I think this change offers
> a much better way forward for that.

I don't see how relying on GNU-make is a step forward for the CMake 
integration when it works without it now.

Overall I'm don't think that moving from a known set of dependencies to 
"build whatever C files are lying around in this directory" is an 
improvement.

Best Wishes

Phillip

[1] The CMake integration is currently broken for non-windows builds, 
I've got some fixes at 
https://github.com/phillipwood/git/tree/wip/cmake-fixes

> Once we invoke the Makefile to spew out e.g. its idea of "LIB_OBJS",
> it's going to be trivial to do that via some wrapper script that lives
> in "contrib/buildsystems". Such a script would either invoke "make
> print-{var,list}-%", or alternatively use an in-tree committed text
> file with the last known result of such a "make print-{var,list}-%"
> run.
> 
> 1. https://lore.kernel.org/git/xmqq8sikblv2.fsf@gitster.c.googlers.com
> 2. https://lore.kernel.org/git/CAKiG+9Xtof8Hj3npsS-M0SnT_dcjtHjP_+avWB4oOHkaMdnSbw@mail.gmail.com/
> 
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> ---
>   Makefile                            | 485 ++++------------------------
>   contrib/buildsystems/CMakeLists.txt |  53 ++-
>   2 files changed, 74 insertions(+), 464 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 4139bcf675c..5d78ab6860a 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -590,6 +590,19 @@ TEST_OBJS =
>   TEST_PROGRAMS_NEED_X =
>   THIRD_PARTY_SOURCES =
>   
> +## Guard against env: programs
> +TEST_PROGRAMS =
> +
> +## Guard against env: sources
> +CURL_SRC =
> +TEST_PROGRAMS_NEED_X_SRC =
> +XDIFF_SRC =
> +
> +## Guard against env: objects
> +CONDITIONAL_OBJS =
> +CURL_OBJS =
> +LIB_OBJS_DIRS =
> +
>   # Utility to dump whatever variables are defined here
>   print-var-%:
>   	@echo $($*)
> @@ -697,87 +710,23 @@ X =
>   
>   PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
>   
> -TEST_BUILTINS_OBJS += test-advise.o
> -TEST_BUILTINS_OBJS += test-bitmap.o
> -TEST_BUILTINS_OBJS += test-bloom.o
> -TEST_BUILTINS_OBJS += test-chmtime.o
> -TEST_BUILTINS_OBJS += test-config.o
> -TEST_BUILTINS_OBJS += test-crontab.o
> -TEST_BUILTINS_OBJS += test-ctype.o
> -TEST_BUILTINS_OBJS += test-date.o
> -TEST_BUILTINS_OBJS += test-delta.o
> -TEST_BUILTINS_OBJS += test-dir-iterator.o
> -TEST_BUILTINS_OBJS += test-drop-caches.o
> -TEST_BUILTINS_OBJS += test-dump-cache-tree.o
> -TEST_BUILTINS_OBJS += test-dump-fsmonitor.o
> -TEST_BUILTINS_OBJS += test-dump-split-index.o
> -TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
> -TEST_BUILTINS_OBJS += test-example-decorate.o
> -TEST_BUILTINS_OBJS += test-fast-rebase.o
> -TEST_BUILTINS_OBJS += test-genrandom.o
> -TEST_BUILTINS_OBJS += test-genzeros.o
> -TEST_BUILTINS_OBJS += test-getcwd.o
> -TEST_BUILTINS_OBJS += test-hash-speed.o
> -TEST_BUILTINS_OBJS += test-hash.o
> -TEST_BUILTINS_OBJS += test-hashmap.o
> -TEST_BUILTINS_OBJS += test-index-version.o
> -TEST_BUILTINS_OBJS += test-json-writer.o
> -TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
> -TEST_BUILTINS_OBJS += test-match-trees.o
> -TEST_BUILTINS_OBJS += test-mergesort.o
> -TEST_BUILTINS_OBJS += test-mktemp.o
> -TEST_BUILTINS_OBJS += test-oid-array.o
> -TEST_BUILTINS_OBJS += test-oidmap.o
> -TEST_BUILTINS_OBJS += test-oidtree.o
> -TEST_BUILTINS_OBJS += test-online-cpus.o
> -TEST_BUILTINS_OBJS += test-parse-options.o
> -TEST_BUILTINS_OBJS += test-parse-pathspec-file.o
> -TEST_BUILTINS_OBJS += test-partial-clone.o
> -TEST_BUILTINS_OBJS += test-path-utils.o
> -TEST_BUILTINS_OBJS += test-pcre2-config.o
> -TEST_BUILTINS_OBJS += test-pkt-line.o
> -TEST_BUILTINS_OBJS += test-prio-queue.o
> -TEST_BUILTINS_OBJS += test-proc-receive.o
> -TEST_BUILTINS_OBJS += test-progress.o
> -TEST_BUILTINS_OBJS += test-reach.o
> -TEST_BUILTINS_OBJS += test-read-cache.o
> -TEST_BUILTINS_OBJS += test-read-graph.o
> -TEST_BUILTINS_OBJS += test-read-midx.o
> -TEST_BUILTINS_OBJS += test-ref-store.o
> -TEST_BUILTINS_OBJS += test-regex.o
> -TEST_BUILTINS_OBJS += test-repository.o
> -TEST_BUILTINS_OBJS += test-revision-walking.o
> -TEST_BUILTINS_OBJS += test-run-command.o
> -TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
> -TEST_BUILTINS_OBJS += test-serve-v2.o
> -TEST_BUILTINS_OBJS += test-sha1.o
> -TEST_BUILTINS_OBJS += test-sha256.o
> -TEST_BUILTINS_OBJS += test-sigchain.o
> -TEST_BUILTINS_OBJS += test-simple-ipc.o
> -TEST_BUILTINS_OBJS += test-strcmp-offset.o
> -TEST_BUILTINS_OBJS += test-string-list.o
> -TEST_BUILTINS_OBJS += test-submodule-config.o
> -TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
> -TEST_BUILTINS_OBJS += test-subprocess.o
> -TEST_BUILTINS_OBJS += test-trace2.o
> -TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
> -TEST_BUILTINS_OBJS += test-userdiff.o
> -TEST_BUILTINS_OBJS += test-wildmatch.o
> -TEST_BUILTINS_OBJS += test-windows-named-pipe.o
> -TEST_BUILTINS_OBJS += test-write-cache.o
> -TEST_BUILTINS_OBJS += test-xml-encode.o
> -
>   # Do not add more tests here unless they have extra dependencies. Add
>   # them in TEST_BUILTINS_OBJS above.
>   TEST_PROGRAMS_NEED_X += test-fake-ssh
>   TEST_PROGRAMS_NEED_X += test-tool
>   
> -TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
> +TEST_PROGRAMS_NEED_X_SRC += $(TEST_PROGRAMS_NEED_X:%=t/helper/%.c)
> +TEST_PROGRAMS += $(TEST_PROGRAMS_NEED_X_SRC:%.c=%$X)
> +TEST_BUILTINS_SRC += $(filter-out $(TEST_PROGRAMS_NEED_X_SRC),$(wildcard t/helper/*.c))
> +TEST_BUILTINS_OBJS += $(TEST_BUILTINS_SRC:%.c=%.o)
>   
> -# List built-in command $C whose implementation cmd_$C() is not in
> -# builtin/$C.o but is linked in as part of some other command.
> +# List built-in command $C whose implementation cmd_$C() is in
> +# builtin/$C.o
> +BUILTIN_OBJS = $(patsubst %.c,%.o,$(wildcard builtin/*.c))
>   BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS))
>   
> +# List built-in command $C whose implementation cmd_$C() is not in
> +# builtin/$C.o but is linked in as part of some other command.
>   BUILT_INS += git-cherry$X
>   BUILT_INS += git-cherry-pick$X
>   BUILT_INS += git-format-patch$X
> @@ -837,355 +786,28 @@ LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentat
>   	-name Documentation -prune -o \
>   	-name '*.h' -print)))
>   
> -LIB_OBJS += abspath.o
> -LIB_OBJS += add-interactive.o
> -LIB_OBJS += add-patch.o
> -LIB_OBJS += advice.o
> -LIB_OBJS += alias.o
> -LIB_OBJS += alloc.o
> -LIB_OBJS += apply.o
> -LIB_OBJS += archive-tar.o
> -LIB_OBJS += archive-zip.o
> -LIB_OBJS += archive.o
> -LIB_OBJS += attr.o
> -LIB_OBJS += base85.o
> -LIB_OBJS += bisect.o
> -LIB_OBJS += blame.o
> -LIB_OBJS += blob.o
> -LIB_OBJS += bloom.o
> -LIB_OBJS += branch.o
> -LIB_OBJS += bulk-checkin.o
> -LIB_OBJS += bundle.o
> -LIB_OBJS += cache-tree.o
> -LIB_OBJS += cbtree.o
> -LIB_OBJS += chdir-notify.o
> -LIB_OBJS += checkout.o
> -LIB_OBJS += chunk-format.o
> -LIB_OBJS += color.o
> -LIB_OBJS += column.o
> -LIB_OBJS += combine-diff.o
> -LIB_OBJS += commit-graph.o
> -LIB_OBJS += commit-reach.o
> -LIB_OBJS += commit.o
> +# LIB_OBJS: compat/* objects that live at the top-level
> +CONDITIONAL_OBJS += unix-socket.o
> +CONDITIONAL_OBJS += unix-stream-server.o
> +CONDITIONAL_OBJS += sha1dc_git.o
> +
> +# LIB_OBJS: Mostly glob *.c at the top-level, with some exlusions
> +LIB_OBJS += $(filter-out \
> +	$(CONDITIONAL_OBJS) \
> +	git.o common-main.o $(PROGRAM_OBJS) \
> +	$(FUZZ_OBJS) $(CURL_OBJS),\
> +	$(patsubst %.c,%.o,$(wildcard *.c)))
> +
> +# LIB_OBJS: Directories that contain only LIB_OBJS
> +LIB_OBJS_DIRS += ewah
> +LIB_OBJS_DIRS += negotiator
> +LIB_OBJS_DIRS += refs
> +LIB_OBJS_DIRS += trace2
> +LIB_OBJS += $(patsubst %.c,%.o,$(wildcard $(addsuffix /*.c,$(LIB_OBJS_DIRS))))
> +
> +# LIB_OBJS: unconditional compat/* objects
>   LIB_OBJS += compat/obstack.o
>   LIB_OBJS += compat/terminal.o
> -LIB_OBJS += config.o
> -LIB_OBJS += connect.o
> -LIB_OBJS += connected.o
> -LIB_OBJS += convert.o
> -LIB_OBJS += copy.o
> -LIB_OBJS += credential.o
> -LIB_OBJS += csum-file.o
> -LIB_OBJS += ctype.o
> -LIB_OBJS += date.o
> -LIB_OBJS += decorate.o
> -LIB_OBJS += delta-islands.o
> -LIB_OBJS += diff-delta.o
> -LIB_OBJS += diff-merges.o
> -LIB_OBJS += diff-lib.o
> -LIB_OBJS += diff-no-index.o
> -LIB_OBJS += diff.o
> -LIB_OBJS += diffcore-break.o
> -LIB_OBJS += diffcore-delta.o
> -LIB_OBJS += diffcore-order.o
> -LIB_OBJS += diffcore-pickaxe.o
> -LIB_OBJS += diffcore-rename.o
> -LIB_OBJS += diffcore-rotate.o
> -LIB_OBJS += dir-iterator.o
> -LIB_OBJS += dir.o
> -LIB_OBJS += editor.o
> -LIB_OBJS += entry.o
> -LIB_OBJS += environment.o
> -LIB_OBJS += ewah/bitmap.o
> -LIB_OBJS += ewah/ewah_bitmap.o
> -LIB_OBJS += ewah/ewah_io.o
> -LIB_OBJS += ewah/ewah_rlw.o
> -LIB_OBJS += exec-cmd.o
> -LIB_OBJS += fetch-negotiator.o
> -LIB_OBJS += fetch-pack.o
> -LIB_OBJS += fmt-merge-msg.o
> -LIB_OBJS += fsck.o
> -LIB_OBJS += fsmonitor.o
> -LIB_OBJS += gettext.o
> -LIB_OBJS += gpg-interface.o
> -LIB_OBJS += graph.o
> -LIB_OBJS += grep.o
> -LIB_OBJS += hash-lookup.o
> -LIB_OBJS += hashmap.o
> -LIB_OBJS += help.o
> -LIB_OBJS += hex.o
> -LIB_OBJS += hook.o
> -LIB_OBJS += ident.o
> -LIB_OBJS += json-writer.o
> -LIB_OBJS += kwset.o
> -LIB_OBJS += levenshtein.o
> -LIB_OBJS += line-log.o
> -LIB_OBJS += line-range.o
> -LIB_OBJS += linear-assignment.o
> -LIB_OBJS += list-objects-filter-options.o
> -LIB_OBJS += list-objects-filter.o
> -LIB_OBJS += list-objects.o
> -LIB_OBJS += ll-merge.o
> -LIB_OBJS += lockfile.o
> -LIB_OBJS += log-tree.o
> -LIB_OBJS += ls-refs.o
> -LIB_OBJS += mailinfo.o
> -LIB_OBJS += mailmap.o
> -LIB_OBJS += match-trees.o
> -LIB_OBJS += mem-pool.o
> -LIB_OBJS += merge-blobs.o
> -LIB_OBJS += merge-ort.o
> -LIB_OBJS += merge-ort-wrappers.o
> -LIB_OBJS += merge-recursive.o
> -LIB_OBJS += merge.o
> -LIB_OBJS += mergesort.o
> -LIB_OBJS += midx.o
> -LIB_OBJS += name-hash.o
> -LIB_OBJS += negotiator/default.o
> -LIB_OBJS += negotiator/noop.o
> -LIB_OBJS += negotiator/skipping.o
> -LIB_OBJS += notes-cache.o
> -LIB_OBJS += notes-merge.o
> -LIB_OBJS += notes-utils.o
> -LIB_OBJS += notes.o
> -LIB_OBJS += object-file.o
> -LIB_OBJS += object-name.o
> -LIB_OBJS += object.o
> -LIB_OBJS += oid-array.o
> -LIB_OBJS += oidmap.o
> -LIB_OBJS += oidset.o
> -LIB_OBJS += oidtree.o
> -LIB_OBJS += pack-bitmap-write.o
> -LIB_OBJS += pack-bitmap.o
> -LIB_OBJS += pack-check.o
> -LIB_OBJS += pack-objects.o
> -LIB_OBJS += pack-revindex.o
> -LIB_OBJS += pack-write.o
> -LIB_OBJS += packfile.o
> -LIB_OBJS += pager.o
> -LIB_OBJS += parallel-checkout.o
> -LIB_OBJS += parse-options-cb.o
> -LIB_OBJS += parse-options.o
> -LIB_OBJS += patch-delta.o
> -LIB_OBJS += patch-ids.o
> -LIB_OBJS += path.o
> -LIB_OBJS += pathspec.o
> -LIB_OBJS += pkt-line.o
> -LIB_OBJS += preload-index.o
> -LIB_OBJS += pretty.o
> -LIB_OBJS += prio-queue.o
> -LIB_OBJS += progress.o
> -LIB_OBJS += promisor-remote.o
> -LIB_OBJS += prompt.o
> -LIB_OBJS += protocol.o
> -LIB_OBJS += protocol-caps.o
> -LIB_OBJS += prune-packed.o
> -LIB_OBJS += quote.o
> -LIB_OBJS += range-diff.o
> -LIB_OBJS += reachable.o
> -LIB_OBJS += read-cache.o
> -LIB_OBJS += rebase-interactive.o
> -LIB_OBJS += rebase.o
> -LIB_OBJS += ref-filter.o
> -LIB_OBJS += reflog-walk.o
> -LIB_OBJS += refs.o
> -LIB_OBJS += refs/debug.o
> -LIB_OBJS += refs/files-backend.o
> -LIB_OBJS += refs/iterator.o
> -LIB_OBJS += refs/packed-backend.o
> -LIB_OBJS += refs/ref-cache.o
> -LIB_OBJS += refspec.o
> -LIB_OBJS += remote.o
> -LIB_OBJS += replace-object.o
> -LIB_OBJS += repo-settings.o
> -LIB_OBJS += repository.o
> -LIB_OBJS += rerere.o
> -LIB_OBJS += reset.o
> -LIB_OBJS += resolve-undo.o
> -LIB_OBJS += revision.o
> -LIB_OBJS += run-command.o
> -LIB_OBJS += send-pack.o
> -LIB_OBJS += sequencer.o
> -LIB_OBJS += serve.o
> -LIB_OBJS += server-info.o
> -LIB_OBJS += setup.o
> -LIB_OBJS += shallow.o
> -LIB_OBJS += sideband.o
> -LIB_OBJS += sigchain.o
> -LIB_OBJS += sparse-index.o
> -LIB_OBJS += split-index.o
> -LIB_OBJS += stable-qsort.o
> -LIB_OBJS += strbuf.o
> -LIB_OBJS += streaming.o
> -LIB_OBJS += string-list.o
> -LIB_OBJS += strmap.o
> -LIB_OBJS += strvec.o
> -LIB_OBJS += sub-process.o
> -LIB_OBJS += submodule-config.o
> -LIB_OBJS += submodule.o
> -LIB_OBJS += symlinks.o
> -LIB_OBJS += tag.o
> -LIB_OBJS += tempfile.o
> -LIB_OBJS += thread-utils.o
> -LIB_OBJS += tmp-objdir.o
> -LIB_OBJS += trace.o
> -LIB_OBJS += trace2.o
> -LIB_OBJS += trace2/tr2_cfg.o
> -LIB_OBJS += trace2/tr2_cmd_name.o
> -LIB_OBJS += trace2/tr2_dst.o
> -LIB_OBJS += trace2/tr2_sid.o
> -LIB_OBJS += trace2/tr2_sysenv.o
> -LIB_OBJS += trace2/tr2_tbuf.o
> -LIB_OBJS += trace2/tr2_tgt_event.o
> -LIB_OBJS += trace2/tr2_tgt_normal.o
> -LIB_OBJS += trace2/tr2_tgt_perf.o
> -LIB_OBJS += trace2/tr2_tls.o
> -LIB_OBJS += trailer.o
> -LIB_OBJS += transport-helper.o
> -LIB_OBJS += transport.o
> -LIB_OBJS += tree-diff.o
> -LIB_OBJS += tree-walk.o
> -LIB_OBJS += tree.o
> -LIB_OBJS += unpack-trees.o
> -LIB_OBJS += upload-pack.o
> -LIB_OBJS += url.o
> -LIB_OBJS += urlmatch.o
> -LIB_OBJS += usage.o
> -LIB_OBJS += userdiff.o
> -LIB_OBJS += utf8.o
> -LIB_OBJS += varint.o
> -LIB_OBJS += version.o
> -LIB_OBJS += versioncmp.o
> -LIB_OBJS += walker.o
> -LIB_OBJS += wildmatch.o
> -LIB_OBJS += worktree.o
> -LIB_OBJS += wrapper.o
> -LIB_OBJS += write-or-die.o
> -LIB_OBJS += ws.o
> -LIB_OBJS += wt-status.o
> -LIB_OBJS += xdiff-interface.o
> -LIB_OBJS += zlib.o
> -
> -BUILTIN_OBJS += builtin/add.o
> -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/blame.o
> -BUILTIN_OBJS += builtin/branch.o
> -BUILTIN_OBJS += builtin/bugreport.o
> -BUILTIN_OBJS += builtin/bundle.o
> -BUILTIN_OBJS += builtin/cat-file.o
> -BUILTIN_OBJS += builtin/check-attr.o
> -BUILTIN_OBJS += builtin/check-ignore.o
> -BUILTIN_OBJS += builtin/check-mailmap.o
> -BUILTIN_OBJS += builtin/check-ref-format.o
> -BUILTIN_OBJS += builtin/checkout--worker.o
> -BUILTIN_OBJS += builtin/checkout-index.o
> -BUILTIN_OBJS += builtin/checkout.o
> -BUILTIN_OBJS += builtin/clean.o
> -BUILTIN_OBJS += builtin/clone.o
> -BUILTIN_OBJS += builtin/column.o
> -BUILTIN_OBJS += builtin/commit-graph.o
> -BUILTIN_OBJS += builtin/commit-tree.o
> -BUILTIN_OBJS += builtin/commit.o
> -BUILTIN_OBJS += builtin/config.o
> -BUILTIN_OBJS += builtin/count-objects.o
> -BUILTIN_OBJS += builtin/credential-cache--daemon.o
> -BUILTIN_OBJS += builtin/credential-cache.o
> -BUILTIN_OBJS += builtin/credential-store.o
> -BUILTIN_OBJS += builtin/credential.o
> -BUILTIN_OBJS += builtin/describe.o
> -BUILTIN_OBJS += builtin/diff-files.o
> -BUILTIN_OBJS += builtin/diff-index.o
> -BUILTIN_OBJS += builtin/diff-tree.o
> -BUILTIN_OBJS += builtin/diff.o
> -BUILTIN_OBJS += builtin/difftool.o
> -BUILTIN_OBJS += builtin/env--helper.o
> -BUILTIN_OBJS += builtin/fast-export.o
> -BUILTIN_OBJS += builtin/fast-import.o
> -BUILTIN_OBJS += builtin/fetch-pack.o
> -BUILTIN_OBJS += builtin/fetch.o
> -BUILTIN_OBJS += builtin/fmt-merge-msg.o
> -BUILTIN_OBJS += builtin/for-each-ref.o
> -BUILTIN_OBJS += builtin/for-each-repo.o
> -BUILTIN_OBJS += builtin/fsck.o
> -BUILTIN_OBJS += builtin/gc.o
> -BUILTIN_OBJS += builtin/get-tar-commit-id.o
> -BUILTIN_OBJS += builtin/grep.o
> -BUILTIN_OBJS += builtin/hash-object.o
> -BUILTIN_OBJS += builtin/help.o
> -BUILTIN_OBJS += builtin/index-pack.o
> -BUILTIN_OBJS += builtin/init-db.o
> -BUILTIN_OBJS += builtin/interpret-trailers.o
> -BUILTIN_OBJS += builtin/log.o
> -BUILTIN_OBJS += builtin/ls-files.o
> -BUILTIN_OBJS += builtin/ls-remote.o
> -BUILTIN_OBJS += builtin/ls-tree.o
> -BUILTIN_OBJS += builtin/mailinfo.o
> -BUILTIN_OBJS += builtin/mailsplit.o
> -BUILTIN_OBJS += builtin/merge-base.o
> -BUILTIN_OBJS += builtin/merge-file.o
> -BUILTIN_OBJS += builtin/merge-index.o
> -BUILTIN_OBJS += builtin/merge-ours.o
> -BUILTIN_OBJS += builtin/merge-recursive.o
> -BUILTIN_OBJS += builtin/merge-tree.o
> -BUILTIN_OBJS += builtin/merge.o
> -BUILTIN_OBJS += builtin/mktag.o
> -BUILTIN_OBJS += builtin/mktree.o
> -BUILTIN_OBJS += builtin/multi-pack-index.o
> -BUILTIN_OBJS += builtin/mv.o
> -BUILTIN_OBJS += builtin/name-rev.o
> -BUILTIN_OBJS += builtin/notes.o
> -BUILTIN_OBJS += builtin/pack-objects.o
> -BUILTIN_OBJS += builtin/pack-redundant.o
> -BUILTIN_OBJS += builtin/pack-refs.o
> -BUILTIN_OBJS += builtin/patch-id.o
> -BUILTIN_OBJS += builtin/prune-packed.o
> -BUILTIN_OBJS += builtin/prune.o
> -BUILTIN_OBJS += builtin/pull.o
> -BUILTIN_OBJS += builtin/push.o
> -BUILTIN_OBJS += builtin/range-diff.o
> -BUILTIN_OBJS += builtin/read-tree.o
> -BUILTIN_OBJS += builtin/rebase.o
> -BUILTIN_OBJS += builtin/receive-pack.o
> -BUILTIN_OBJS += builtin/reflog.o
> -BUILTIN_OBJS += builtin/remote-ext.o
> -BUILTIN_OBJS += builtin/remote-fd.o
> -BUILTIN_OBJS += builtin/remote.o
> -BUILTIN_OBJS += builtin/repack.o
> -BUILTIN_OBJS += builtin/replace.o
> -BUILTIN_OBJS += builtin/rerere.o
> -BUILTIN_OBJS += builtin/reset.o
> -BUILTIN_OBJS += builtin/rev-list.o
> -BUILTIN_OBJS += builtin/rev-parse.o
> -BUILTIN_OBJS += builtin/revert.o
> -BUILTIN_OBJS += builtin/rm.o
> -BUILTIN_OBJS += builtin/send-pack.o
> -BUILTIN_OBJS += builtin/shortlog.o
> -BUILTIN_OBJS += builtin/show-branch.o
> -BUILTIN_OBJS += builtin/show-index.o
> -BUILTIN_OBJS += builtin/show-ref.o
> -BUILTIN_OBJS += builtin/sparse-checkout.o
> -BUILTIN_OBJS += builtin/stash.o
> -BUILTIN_OBJS += builtin/stripspace.o
> -BUILTIN_OBJS += builtin/submodule--helper.o
> -BUILTIN_OBJS += builtin/symbolic-ref.o
> -BUILTIN_OBJS += builtin/tag.o
> -BUILTIN_OBJS += builtin/unpack-file.o
> -BUILTIN_OBJS += builtin/unpack-objects.o
> -BUILTIN_OBJS += builtin/update-index.o
> -BUILTIN_OBJS += builtin/update-ref.o
> -BUILTIN_OBJS += builtin/update-server-info.o
> -BUILTIN_OBJS += builtin/upload-archive.o
> -BUILTIN_OBJS += builtin/upload-pack.o
> -BUILTIN_OBJS += builtin/var.o
> -BUILTIN_OBJS += builtin/verify-commit.o
> -BUILTIN_OBJS += builtin/verify-pack.o
> -BUILTIN_OBJS += builtin/verify-tag.o
> -BUILTIN_OBJS += builtin/worktree.o
> -BUILTIN_OBJS += builtin/write-tree.o
>   
>   # THIRD_PARTY_SOURCES is a list of patterns compatible with the
>   # $(filter) and $(filter-out) family of functions. They specify source
> @@ -2076,6 +1698,7 @@ endif
>   LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS)
>   
>   BASIC_CFLAGS += $(COMPAT_CFLAGS)
> +LIB_OBJS_NO_COMPAT := $(LIB_OBJS)
>   LIB_OBJS += $(COMPAT_OBJS)
>   
>   # Quote for C
> @@ -2436,17 +2059,12 @@ reconfigure config.mak.autogen: config.status
>   .PHONY: reconfigure # This is a convenience target.
>   endif
>   
> -XDIFF_OBJS += xdiff/xdiffi.o
> -XDIFF_OBJS += xdiff/xemit.o
> -XDIFF_OBJS += xdiff/xhistogram.o
> -XDIFF_OBJS += xdiff/xmerge.o
> -XDIFF_OBJS += xdiff/xpatience.o
> -XDIFF_OBJS += xdiff/xprepare.o
> -XDIFF_OBJS += xdiff/xutils.o
> +XDIFF_SRC += $(wildcard xdiff/*.c)
> +XDIFF_OBJS += $(XDIFF_SRC:.c=.o)
>   .PHONY: xdiff-objs
>   xdiff-objs: $(XDIFF_OBJS)
>   
> -TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
> +TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(TEST_BUILTINS_OBJS)
>   .PHONY: test-objs
>   test-objs: $(TEST_OBJS)
>   
> @@ -2457,13 +2075,20 @@ GIT_OBJS += git.o
>   .PHONY: git-objs
>   git-objs: $(GIT_OBJS)
>   
> +CURL_SRC += http.c
> +CURL_SRC += http-walker.c
> +CURL_SRC += remote-curl.c
> +CURL_OBJS += $(CURL_SRC:.c=.o)
> +.PHONY: curl-objs
> +curl-objs: $(CURL_OBJS)
> +
>   OBJECTS += $(GIT_OBJS)
>   OBJECTS += $(PROGRAM_OBJS)
>   OBJECTS += $(TEST_OBJS)
>   OBJECTS += $(XDIFF_OBJS)
>   OBJECTS += $(FUZZ_OBJS)
>   ifndef NO_CURL
> -	OBJECTS += http.o http-walker.o remote-curl.o
> +OBJECTS += $(CURL_OBJS)
>   endif
>   .PHONY: objects
>   objects: $(OBJECTS)
> @@ -2900,7 +2525,7 @@ perf: all
>   
>   .PRECIOUS: $(TEST_OBJS)
>   
> -t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
> +t/helper/test-tool$X: $(TEST_BUILTINS_OBJS)
>   
>   t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
>   	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
> diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
> index fd1399c440f..d57c9203b66 100644
> --- a/contrib/buildsystems/CMakeLists.txt
> +++ b/contrib/buildsystems/CMakeLists.txt
> @@ -111,32 +111,15 @@ project(git
>   #TODO Add pcre support
>   
>   #macros for parsing the Makefile for sources and scripts
> -macro(parse_makefile_for_sources list_var regex)
> -	file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+=(.*)")
> -	string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
> -	string(REPLACE "$(COMPAT_OBJS)" "" ${list_var} ${${list_var}}) #remove "$(COMPAT_OBJS)" This is only for libgit.
> -	string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
> -	string(REPLACE ".o" ".c;" ${list_var} ${${list_var}}) #change .o to .c, ; is for converting the string into a list
> -	list(TRANSFORM ${list_var} STRIP) #remove trailing/leading whitespaces for each element in list
> -	list(REMOVE_ITEM ${list_var} "") #remove empty list elements
> -endmacro()
> -
> -macro(parse_makefile_for_scripts list_var regex lang)
> -	file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+=(.*)")
> -	string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
> -	string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
> -	string(REPLACE " " ";" ${list_var} ${${list_var}}) #convert string to a list
> -	if(NOT ${lang}) #exclude for SCRIPT_LIB
> -		list(TRANSFORM ${list_var} REPLACE "${lang}" "") #do the replacement
> -	endif()
> -endmacro()
> -
> -macro(parse_makefile_for_executables list_var regex)
> -	file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+= git-(.*)")
> -	string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
> +macro(ask_makefile_for_list list_var var_name)
> +	execute_process(COMMAND make print-list-${var_name}
> +			WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
> +			OUTPUT_VARIABLE ${list_var})
> +	string(REGEX REPLACE "\\.o\n" ".c\n" ${list_var} ${${list_var}}) #change .o to .c
>   	string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
> -	string(REPLACE "git-" "" ${list_var} ${${list_var}}) #strip `git-` prefix
> -	string(REPLACE "\$X" ";" ${list_var} ${${list_var}}) #strip $X, ; is for converting the string into a list
> +	## Parse the Makefile print-list-% format
> +	string(REGEX REPLACE "${var_name} =\n" "" ${list_var} ${${list_var}})
> +	string(REGEX REPLACE "${var_name} \\+?= ([^\n]+)" "\\1;" ${list_var} ${${list_var}})
>   	list(TRANSFORM ${list_var} STRIP) #remove trailing/leading whitespaces for each element in list
>   	list(REMOVE_ITEM ${list_var} "") #remove empty list elements
>   endmacro()
> @@ -635,14 +618,14 @@ include_directories(${CMAKE_BINARY_DIR})
>   
>   #build
>   #libgit
> -parse_makefile_for_sources(libgit_SOURCES "LIB_OBJS")
> +ask_makefile_for_list(libgit_SOURCES "LIB_OBJS_NO_COMPAT")
>   
>   list(TRANSFORM libgit_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
>   list(TRANSFORM compat_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
>   add_library(libgit ${libgit_SOURCES} ${compat_SOURCES})
>   
>   #libxdiff
> -parse_makefile_for_sources(libxdiff_SOURCES "XDIFF_OBJS")
> +ask_makefile_for_list(libxdiff_SOURCES "XDIFF_OBJS")
>   
>   list(TRANSFORM libxdiff_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
>   add_library(xdiff STATIC ${libxdiff_SOURCES})
> @@ -693,7 +676,7 @@ elseif(UNIX)
>   endif()
>   
>   #git
> -parse_makefile_for_sources(git_SOURCES "BUILTIN_OBJS")
> +ask_makefile_for_list(git_SOURCES "BUILTIN_OBJS")
>   
>   list(TRANSFORM git_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
>   add_executable(git ${CMAKE_SOURCE_DIR}/git.c ${git_SOURCES})
> @@ -729,7 +712,9 @@ if(CURL_FOUND)
>   	endif()
>   endif()
>   
> -parse_makefile_for_executables(git_builtin_extra "BUILT_INS")
> +ask_makefile_for_list(git_builtin_extra "BUILT_INS")
> +list(TRANSFORM git_builtin_extra REPLACE "^git-(.*)" "\\1") #strip `git-` prefix
> +list(TRANSFORM git_builtin_extra REPLACE "\.exe$" "") #strip $X
>   
>   option(SKIP_DASHED_BUILT_INS "Skip hardlinking the dashed versions of the built-ins")
>   
> @@ -766,8 +751,8 @@ set(GITWEBDIR ${FALLBACK_RUNTIME_PREFIX}/share/locale)
>   set(INSTLIBDIR ${FALLBACK_RUNTIME_PREFIX}/share/perl5)
>   
>   #shell scripts
> -parse_makefile_for_scripts(git_sh_scripts "SCRIPT_SH" ".sh")
> -parse_makefile_for_scripts(git_shlib_scripts "SCRIPT_LIB" "")
> +ask_makefile_for_list(git_sh_scripts "SCRIPT_SH_GEN")
> +ask_makefile_for_list(git_shlib_scripts "SCRIPT_LIB_GEN")
>   set(git_shell_scripts
>   	${git_sh_scripts} ${git_shlib_scripts} git-instaweb)
>   
> @@ -787,7 +772,7 @@ foreach(script ${git_shell_scripts})
>   endforeach()
>   
>   #perl scripts
> -parse_makefile_for_scripts(git_perl_scripts "SCRIPT_PERL" ".perl")
> +ask_makefile_for_list(git_perl_scripts "SCRIPT_PERL_GEN")
>   
>   #create perl header
>   file(STRINGS ${CMAKE_SOURCE_DIR}/perl/header_templates/fixed_prefix.template.pl perl_header )
> @@ -910,9 +895,9 @@ add_executable(test-fake-ssh ${CMAKE_SOURCE_DIR}/t/helper/test-fake-ssh.c)
>   target_link_libraries(test-fake-ssh common-main)
>   
>   #test-tool
> -parse_makefile_for_sources(test-tool_SOURCES "TEST_BUILTINS_OBJS")
> +ask_makefile_for_list(test-tool_SOURCES "TEST_BUILTINS_OBJS")
>   
> -list(TRANSFORM test-tool_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/t/helper/")
> +list(TRANSFORM test-tool_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
>   add_executable(test-tool ${CMAKE_SOURCE_DIR}/t/helper/test-tool.c ${test-tool_SOURCES})
>   target_link_libraries(test-tool common-main)
>   
> 

^ permalink raw reply	[relevance 0%]

* [PATCH v2 3/3] Makefile: replace most hardcoded object lists with $(wildcard)
  @ 2021-11-01 19:19  1%   ` Ævar Arnfjörð Bjarmason
  2021-11-06 10:57  0%     ` Phillip Wood
  0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-11-01 19:19 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Jeff King, Paul Smith, Sibi Siddharthan,
	Ævar Arnfjörð Bjarmason

Remove the hardcoded lists of objects in favor of using
$(wildcard). This means that every time a built-in, test tool etc. is
added we won't need to patch the top-level Makefile, except for the
few remaining cases where the asset in question would make it onto one
of our list of exceptions.

Ever since 81b50f3ce40 (Move 'builtin-*' into a 'builtin/'
subdirectory, 2010-02-22) this has been relatively easy to do (and
even before that we could glob builtin-*.c). This pattern of
exhaustively enumerating files was then carried forward for
e.g. TEST_BUILTINS_OBJS in efd71f8913a (t/helper: add an empty
test-tool program, 2018-03-24).

One reason not to do this is that now a new *.c file at the top-level
will be immediately picked up, so if a new *.c file is being worked on
"make" will error if it doesn't compile, whereas before that file
would need to be explicitly listed in the Makefile. I think than small
trade-off is worth it.

We could make this simpler still for the Makefile by moving
"unix-socket.c" etc. to e.g. a "conditional-src/" directory, likewise
for $(PROGRAM_OBJS) to e.g. "programs/". If we did that we would not
need the "$(filter-out)" for LIB_OBJS. I don't think that's worth it,
e.g. due to "git log -- <path>" on the files now needing a "--follow".

There's a few small "while we're at it" changes here, since I'm
touching the code in question:

 - Start splitting up the the "Guard against the environment" section
   at the top, but don't move anything that exists there out to avoid
   merge conflicts

 - The $(TEST_BUILTINS_OBJS) variable was needlessly complex, because
   it didn't have the full paths we'd pathsubst it back & forth.

 - Introduce *_SRC in addition to *_OBJ for the variable I'm
   touching. Eventually we'll want to do this for all the *.o files,
   i.e. make the *.c list a source of truth for *.o, which means we can
   e.g. use that exhaustive list for "make TAGS".

 - Add a missing "curl-objs" target. See 029bac01a87 (Makefile: add
   {program,xdiff,test,git,fuzz}-objs & objects targets, 2021-02-23)
   for the commit that added the rest.

 - De-indent an "ifndef" block, we don't usually indent their
   contents.

On the CMake changes here:

 - When CMake support was introduced in was introduced
   061c2240b1b (Introduce CMake support for configuring Git, 2020-06-12)
   there was a discussion about the maintenance burden of maintaining the
   top-level Makefile in parallel with CMakeLists.txt[1] where reviewers
   were assured that doing so would simply be a matter of adding something
   to a list in the CMake recipe.

   Between change and some recent changes of mine where the "vs-build"
   job failed to a divergence between the Makefile and CMakeList.txt I
   can confidently say that that doesn't at all match reality. Even
   seemingly trivial changes to the Makefile like this one are forcing
   us to do a deep-dive into CMake internals to make forward progress
   with our main build system.

 - The promised "We can add a (continue-on-error) to vs-build job to
   make this process less of a hindrance." in [2] never materialized.
   Since 4c2c38e800f (ci: modification of main.yml to use cmake for
   vs-build job, 2020-06-26) got a hard dependency on CMake as far as
   getting the CI to pass goes.

 - The "vs-build" CI doesn't actually require that there be no GNU make
   usage in the job, as it itself has a hard dependency on running a
   "make -n artifacts-tar" command. So as far as any vs-specific special-sauce
   goes we don't need a GNU-make free build system for vs-build.

 - The stated goal in 061c2240b1b of avoiding a GNU make dependency
   for developer because it requires an SDK that "occupies around two
   gigabytes" and "three quarters of a gigabyte worth of Git objects"
   hardly seems worthwhile trade-off given the above. Disk space is cheap,
   developer time required to maintain two parallel build systems isn't.

My attempt to amend/revert 4c2c38e800f to have it use the
pre-4c2c38e800f "make" invocation as a fallback failed, partially
because I don't have a Windows development environment, so any attempt
to change it is a painfully slow round-trip to GitHub CI.

Let's instead have CMake call out to the Makefile asking it what the
definition of various variables lists is, rather than being forced to
maintain those lists in a way that CMake can parse with regexes (which
precludes anything but a giant hardcoded list).

I could familiarize myself enough with CMake to do this in some
CMake-native way, but that would take "just as long as adding it to
the Makefile"[2] (I think that took me <5 minutes, but I'm several
hours into fighting with CMake)

So I consider this both a bugfix to the stated aims of this CMake
integration, and a better way forward for having an alternate build
system. I.e. If someone really does care about a having a
GNU-make-less dependency for the "vs-build" I think this change offers
a much better way forward for that.

Once we invoke the Makefile to spew out e.g. its idea of "LIB_OBJS",
it's going to be trivial to do that via some wrapper script that lives
in "contrib/buildsystems". Such a script would either invoke "make
print-{var,list}-%", or alternatively use an in-tree committed text
file with the last known result of such a "make print-{var,list}-%"
run.

1. https://lore.kernel.org/git/xmqq8sikblv2.fsf@gitster.c.googlers.com
2. https://lore.kernel.org/git/CAKiG+9Xtof8Hj3npsS-M0SnT_dcjtHjP_+avWB4oOHkaMdnSbw@mail.gmail.com/

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 Makefile                            | 485 ++++------------------------
 contrib/buildsystems/CMakeLists.txt |  53 ++-
 2 files changed, 74 insertions(+), 464 deletions(-)

diff --git a/Makefile b/Makefile
index 4139bcf675c..5d78ab6860a 100644
--- a/Makefile
+++ b/Makefile
@@ -590,6 +590,19 @@ TEST_OBJS =
 TEST_PROGRAMS_NEED_X =
 THIRD_PARTY_SOURCES =
 
+## Guard against env: programs
+TEST_PROGRAMS =
+
+## Guard against env: sources
+CURL_SRC =
+TEST_PROGRAMS_NEED_X_SRC =
+XDIFF_SRC =
+
+## Guard against env: objects
+CONDITIONAL_OBJS =
+CURL_OBJS =
+LIB_OBJS_DIRS =
+
 # Utility to dump whatever variables are defined here
 print-var-%:
 	@echo $($*)
@@ -697,87 +710,23 @@ X =
 
 PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
 
-TEST_BUILTINS_OBJS += test-advise.o
-TEST_BUILTINS_OBJS += test-bitmap.o
-TEST_BUILTINS_OBJS += test-bloom.o
-TEST_BUILTINS_OBJS += test-chmtime.o
-TEST_BUILTINS_OBJS += test-config.o
-TEST_BUILTINS_OBJS += test-crontab.o
-TEST_BUILTINS_OBJS += test-ctype.o
-TEST_BUILTINS_OBJS += test-date.o
-TEST_BUILTINS_OBJS += test-delta.o
-TEST_BUILTINS_OBJS += test-dir-iterator.o
-TEST_BUILTINS_OBJS += test-drop-caches.o
-TEST_BUILTINS_OBJS += test-dump-cache-tree.o
-TEST_BUILTINS_OBJS += test-dump-fsmonitor.o
-TEST_BUILTINS_OBJS += test-dump-split-index.o
-TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
-TEST_BUILTINS_OBJS += test-example-decorate.o
-TEST_BUILTINS_OBJS += test-fast-rebase.o
-TEST_BUILTINS_OBJS += test-genrandom.o
-TEST_BUILTINS_OBJS += test-genzeros.o
-TEST_BUILTINS_OBJS += test-getcwd.o
-TEST_BUILTINS_OBJS += test-hash-speed.o
-TEST_BUILTINS_OBJS += test-hash.o
-TEST_BUILTINS_OBJS += test-hashmap.o
-TEST_BUILTINS_OBJS += test-index-version.o
-TEST_BUILTINS_OBJS += test-json-writer.o
-TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
-TEST_BUILTINS_OBJS += test-match-trees.o
-TEST_BUILTINS_OBJS += test-mergesort.o
-TEST_BUILTINS_OBJS += test-mktemp.o
-TEST_BUILTINS_OBJS += test-oid-array.o
-TEST_BUILTINS_OBJS += test-oidmap.o
-TEST_BUILTINS_OBJS += test-oidtree.o
-TEST_BUILTINS_OBJS += test-online-cpus.o
-TEST_BUILTINS_OBJS += test-parse-options.o
-TEST_BUILTINS_OBJS += test-parse-pathspec-file.o
-TEST_BUILTINS_OBJS += test-partial-clone.o
-TEST_BUILTINS_OBJS += test-path-utils.o
-TEST_BUILTINS_OBJS += test-pcre2-config.o
-TEST_BUILTINS_OBJS += test-pkt-line.o
-TEST_BUILTINS_OBJS += test-prio-queue.o
-TEST_BUILTINS_OBJS += test-proc-receive.o
-TEST_BUILTINS_OBJS += test-progress.o
-TEST_BUILTINS_OBJS += test-reach.o
-TEST_BUILTINS_OBJS += test-read-cache.o
-TEST_BUILTINS_OBJS += test-read-graph.o
-TEST_BUILTINS_OBJS += test-read-midx.o
-TEST_BUILTINS_OBJS += test-ref-store.o
-TEST_BUILTINS_OBJS += test-regex.o
-TEST_BUILTINS_OBJS += test-repository.o
-TEST_BUILTINS_OBJS += test-revision-walking.o
-TEST_BUILTINS_OBJS += test-run-command.o
-TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
-TEST_BUILTINS_OBJS += test-serve-v2.o
-TEST_BUILTINS_OBJS += test-sha1.o
-TEST_BUILTINS_OBJS += test-sha256.o
-TEST_BUILTINS_OBJS += test-sigchain.o
-TEST_BUILTINS_OBJS += test-simple-ipc.o
-TEST_BUILTINS_OBJS += test-strcmp-offset.o
-TEST_BUILTINS_OBJS += test-string-list.o
-TEST_BUILTINS_OBJS += test-submodule-config.o
-TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
-TEST_BUILTINS_OBJS += test-subprocess.o
-TEST_BUILTINS_OBJS += test-trace2.o
-TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
-TEST_BUILTINS_OBJS += test-userdiff.o
-TEST_BUILTINS_OBJS += test-wildmatch.o
-TEST_BUILTINS_OBJS += test-windows-named-pipe.o
-TEST_BUILTINS_OBJS += test-write-cache.o
-TEST_BUILTINS_OBJS += test-xml-encode.o
-
 # Do not add more tests here unless they have extra dependencies. Add
 # them in TEST_BUILTINS_OBJS above.
 TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-tool
 
-TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
+TEST_PROGRAMS_NEED_X_SRC += $(TEST_PROGRAMS_NEED_X:%=t/helper/%.c)
+TEST_PROGRAMS += $(TEST_PROGRAMS_NEED_X_SRC:%.c=%$X)
+TEST_BUILTINS_SRC += $(filter-out $(TEST_PROGRAMS_NEED_X_SRC),$(wildcard t/helper/*.c))
+TEST_BUILTINS_OBJS += $(TEST_BUILTINS_SRC:%.c=%.o)
 
-# List built-in command $C whose implementation cmd_$C() is not in
-# builtin/$C.o but is linked in as part of some other command.
+# List built-in command $C whose implementation cmd_$C() is in
+# builtin/$C.o
+BUILTIN_OBJS = $(patsubst %.c,%.o,$(wildcard builtin/*.c))
 BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS))
 
+# List built-in command $C whose implementation cmd_$C() is not in
+# builtin/$C.o but is linked in as part of some other command.
 BUILT_INS += git-cherry$X
 BUILT_INS += git-cherry-pick$X
 BUILT_INS += git-format-patch$X
@@ -837,355 +786,28 @@ LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentat
 	-name Documentation -prune -o \
 	-name '*.h' -print)))
 
-LIB_OBJS += abspath.o
-LIB_OBJS += add-interactive.o
-LIB_OBJS += add-patch.o
-LIB_OBJS += advice.o
-LIB_OBJS += alias.o
-LIB_OBJS += alloc.o
-LIB_OBJS += apply.o
-LIB_OBJS += archive-tar.o
-LIB_OBJS += archive-zip.o
-LIB_OBJS += archive.o
-LIB_OBJS += attr.o
-LIB_OBJS += base85.o
-LIB_OBJS += bisect.o
-LIB_OBJS += blame.o
-LIB_OBJS += blob.o
-LIB_OBJS += bloom.o
-LIB_OBJS += branch.o
-LIB_OBJS += bulk-checkin.o
-LIB_OBJS += bundle.o
-LIB_OBJS += cache-tree.o
-LIB_OBJS += cbtree.o
-LIB_OBJS += chdir-notify.o
-LIB_OBJS += checkout.o
-LIB_OBJS += chunk-format.o
-LIB_OBJS += color.o
-LIB_OBJS += column.o
-LIB_OBJS += combine-diff.o
-LIB_OBJS += commit-graph.o
-LIB_OBJS += commit-reach.o
-LIB_OBJS += commit.o
+# LIB_OBJS: compat/* objects that live at the top-level
+CONDITIONAL_OBJS += unix-socket.o
+CONDITIONAL_OBJS += unix-stream-server.o
+CONDITIONAL_OBJS += sha1dc_git.o
+
+# LIB_OBJS: Mostly glob *.c at the top-level, with some exlusions
+LIB_OBJS += $(filter-out \
+	$(CONDITIONAL_OBJS) \
+	git.o common-main.o $(PROGRAM_OBJS) \
+	$(FUZZ_OBJS) $(CURL_OBJS),\
+	$(patsubst %.c,%.o,$(wildcard *.c)))
+
+# LIB_OBJS: Directories that contain only LIB_OBJS
+LIB_OBJS_DIRS += ewah
+LIB_OBJS_DIRS += negotiator
+LIB_OBJS_DIRS += refs
+LIB_OBJS_DIRS += trace2
+LIB_OBJS += $(patsubst %.c,%.o,$(wildcard $(addsuffix /*.c,$(LIB_OBJS_DIRS))))
+
+# LIB_OBJS: unconditional compat/* objects
 LIB_OBJS += compat/obstack.o
 LIB_OBJS += compat/terminal.o
-LIB_OBJS += config.o
-LIB_OBJS += connect.o
-LIB_OBJS += connected.o
-LIB_OBJS += convert.o
-LIB_OBJS += copy.o
-LIB_OBJS += credential.o
-LIB_OBJS += csum-file.o
-LIB_OBJS += ctype.o
-LIB_OBJS += date.o
-LIB_OBJS += decorate.o
-LIB_OBJS += delta-islands.o
-LIB_OBJS += diff-delta.o
-LIB_OBJS += diff-merges.o
-LIB_OBJS += diff-lib.o
-LIB_OBJS += diff-no-index.o
-LIB_OBJS += diff.o
-LIB_OBJS += diffcore-break.o
-LIB_OBJS += diffcore-delta.o
-LIB_OBJS += diffcore-order.o
-LIB_OBJS += diffcore-pickaxe.o
-LIB_OBJS += diffcore-rename.o
-LIB_OBJS += diffcore-rotate.o
-LIB_OBJS += dir-iterator.o
-LIB_OBJS += dir.o
-LIB_OBJS += editor.o
-LIB_OBJS += entry.o
-LIB_OBJS += environment.o
-LIB_OBJS += ewah/bitmap.o
-LIB_OBJS += ewah/ewah_bitmap.o
-LIB_OBJS += ewah/ewah_io.o
-LIB_OBJS += ewah/ewah_rlw.o
-LIB_OBJS += exec-cmd.o
-LIB_OBJS += fetch-negotiator.o
-LIB_OBJS += fetch-pack.o
-LIB_OBJS += fmt-merge-msg.o
-LIB_OBJS += fsck.o
-LIB_OBJS += fsmonitor.o
-LIB_OBJS += gettext.o
-LIB_OBJS += gpg-interface.o
-LIB_OBJS += graph.o
-LIB_OBJS += grep.o
-LIB_OBJS += hash-lookup.o
-LIB_OBJS += hashmap.o
-LIB_OBJS += help.o
-LIB_OBJS += hex.o
-LIB_OBJS += hook.o
-LIB_OBJS += ident.o
-LIB_OBJS += json-writer.o
-LIB_OBJS += kwset.o
-LIB_OBJS += levenshtein.o
-LIB_OBJS += line-log.o
-LIB_OBJS += line-range.o
-LIB_OBJS += linear-assignment.o
-LIB_OBJS += list-objects-filter-options.o
-LIB_OBJS += list-objects-filter.o
-LIB_OBJS += list-objects.o
-LIB_OBJS += ll-merge.o
-LIB_OBJS += lockfile.o
-LIB_OBJS += log-tree.o
-LIB_OBJS += ls-refs.o
-LIB_OBJS += mailinfo.o
-LIB_OBJS += mailmap.o
-LIB_OBJS += match-trees.o
-LIB_OBJS += mem-pool.o
-LIB_OBJS += merge-blobs.o
-LIB_OBJS += merge-ort.o
-LIB_OBJS += merge-ort-wrappers.o
-LIB_OBJS += merge-recursive.o
-LIB_OBJS += merge.o
-LIB_OBJS += mergesort.o
-LIB_OBJS += midx.o
-LIB_OBJS += name-hash.o
-LIB_OBJS += negotiator/default.o
-LIB_OBJS += negotiator/noop.o
-LIB_OBJS += negotiator/skipping.o
-LIB_OBJS += notes-cache.o
-LIB_OBJS += notes-merge.o
-LIB_OBJS += notes-utils.o
-LIB_OBJS += notes.o
-LIB_OBJS += object-file.o
-LIB_OBJS += object-name.o
-LIB_OBJS += object.o
-LIB_OBJS += oid-array.o
-LIB_OBJS += oidmap.o
-LIB_OBJS += oidset.o
-LIB_OBJS += oidtree.o
-LIB_OBJS += pack-bitmap-write.o
-LIB_OBJS += pack-bitmap.o
-LIB_OBJS += pack-check.o
-LIB_OBJS += pack-objects.o
-LIB_OBJS += pack-revindex.o
-LIB_OBJS += pack-write.o
-LIB_OBJS += packfile.o
-LIB_OBJS += pager.o
-LIB_OBJS += parallel-checkout.o
-LIB_OBJS += parse-options-cb.o
-LIB_OBJS += parse-options.o
-LIB_OBJS += patch-delta.o
-LIB_OBJS += patch-ids.o
-LIB_OBJS += path.o
-LIB_OBJS += pathspec.o
-LIB_OBJS += pkt-line.o
-LIB_OBJS += preload-index.o
-LIB_OBJS += pretty.o
-LIB_OBJS += prio-queue.o
-LIB_OBJS += progress.o
-LIB_OBJS += promisor-remote.o
-LIB_OBJS += prompt.o
-LIB_OBJS += protocol.o
-LIB_OBJS += protocol-caps.o
-LIB_OBJS += prune-packed.o
-LIB_OBJS += quote.o
-LIB_OBJS += range-diff.o
-LIB_OBJS += reachable.o
-LIB_OBJS += read-cache.o
-LIB_OBJS += rebase-interactive.o
-LIB_OBJS += rebase.o
-LIB_OBJS += ref-filter.o
-LIB_OBJS += reflog-walk.o
-LIB_OBJS += refs.o
-LIB_OBJS += refs/debug.o
-LIB_OBJS += refs/files-backend.o
-LIB_OBJS += refs/iterator.o
-LIB_OBJS += refs/packed-backend.o
-LIB_OBJS += refs/ref-cache.o
-LIB_OBJS += refspec.o
-LIB_OBJS += remote.o
-LIB_OBJS += replace-object.o
-LIB_OBJS += repo-settings.o
-LIB_OBJS += repository.o
-LIB_OBJS += rerere.o
-LIB_OBJS += reset.o
-LIB_OBJS += resolve-undo.o
-LIB_OBJS += revision.o
-LIB_OBJS += run-command.o
-LIB_OBJS += send-pack.o
-LIB_OBJS += sequencer.o
-LIB_OBJS += serve.o
-LIB_OBJS += server-info.o
-LIB_OBJS += setup.o
-LIB_OBJS += shallow.o
-LIB_OBJS += sideband.o
-LIB_OBJS += sigchain.o
-LIB_OBJS += sparse-index.o
-LIB_OBJS += split-index.o
-LIB_OBJS += stable-qsort.o
-LIB_OBJS += strbuf.o
-LIB_OBJS += streaming.o
-LIB_OBJS += string-list.o
-LIB_OBJS += strmap.o
-LIB_OBJS += strvec.o
-LIB_OBJS += sub-process.o
-LIB_OBJS += submodule-config.o
-LIB_OBJS += submodule.o
-LIB_OBJS += symlinks.o
-LIB_OBJS += tag.o
-LIB_OBJS += tempfile.o
-LIB_OBJS += thread-utils.o
-LIB_OBJS += tmp-objdir.o
-LIB_OBJS += trace.o
-LIB_OBJS += trace2.o
-LIB_OBJS += trace2/tr2_cfg.o
-LIB_OBJS += trace2/tr2_cmd_name.o
-LIB_OBJS += trace2/tr2_dst.o
-LIB_OBJS += trace2/tr2_sid.o
-LIB_OBJS += trace2/tr2_sysenv.o
-LIB_OBJS += trace2/tr2_tbuf.o
-LIB_OBJS += trace2/tr2_tgt_event.o
-LIB_OBJS += trace2/tr2_tgt_normal.o
-LIB_OBJS += trace2/tr2_tgt_perf.o
-LIB_OBJS += trace2/tr2_tls.o
-LIB_OBJS += trailer.o
-LIB_OBJS += transport-helper.o
-LIB_OBJS += transport.o
-LIB_OBJS += tree-diff.o
-LIB_OBJS += tree-walk.o
-LIB_OBJS += tree.o
-LIB_OBJS += unpack-trees.o
-LIB_OBJS += upload-pack.o
-LIB_OBJS += url.o
-LIB_OBJS += urlmatch.o
-LIB_OBJS += usage.o
-LIB_OBJS += userdiff.o
-LIB_OBJS += utf8.o
-LIB_OBJS += varint.o
-LIB_OBJS += version.o
-LIB_OBJS += versioncmp.o
-LIB_OBJS += walker.o
-LIB_OBJS += wildmatch.o
-LIB_OBJS += worktree.o
-LIB_OBJS += wrapper.o
-LIB_OBJS += write-or-die.o
-LIB_OBJS += ws.o
-LIB_OBJS += wt-status.o
-LIB_OBJS += xdiff-interface.o
-LIB_OBJS += zlib.o
-
-BUILTIN_OBJS += builtin/add.o
-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/blame.o
-BUILTIN_OBJS += builtin/branch.o
-BUILTIN_OBJS += builtin/bugreport.o
-BUILTIN_OBJS += builtin/bundle.o
-BUILTIN_OBJS += builtin/cat-file.o
-BUILTIN_OBJS += builtin/check-attr.o
-BUILTIN_OBJS += builtin/check-ignore.o
-BUILTIN_OBJS += builtin/check-mailmap.o
-BUILTIN_OBJS += builtin/check-ref-format.o
-BUILTIN_OBJS += builtin/checkout--worker.o
-BUILTIN_OBJS += builtin/checkout-index.o
-BUILTIN_OBJS += builtin/checkout.o
-BUILTIN_OBJS += builtin/clean.o
-BUILTIN_OBJS += builtin/clone.o
-BUILTIN_OBJS += builtin/column.o
-BUILTIN_OBJS += builtin/commit-graph.o
-BUILTIN_OBJS += builtin/commit-tree.o
-BUILTIN_OBJS += builtin/commit.o
-BUILTIN_OBJS += builtin/config.o
-BUILTIN_OBJS += builtin/count-objects.o
-BUILTIN_OBJS += builtin/credential-cache--daemon.o
-BUILTIN_OBJS += builtin/credential-cache.o
-BUILTIN_OBJS += builtin/credential-store.o
-BUILTIN_OBJS += builtin/credential.o
-BUILTIN_OBJS += builtin/describe.o
-BUILTIN_OBJS += builtin/diff-files.o
-BUILTIN_OBJS += builtin/diff-index.o
-BUILTIN_OBJS += builtin/diff-tree.o
-BUILTIN_OBJS += builtin/diff.o
-BUILTIN_OBJS += builtin/difftool.o
-BUILTIN_OBJS += builtin/env--helper.o
-BUILTIN_OBJS += builtin/fast-export.o
-BUILTIN_OBJS += builtin/fast-import.o
-BUILTIN_OBJS += builtin/fetch-pack.o
-BUILTIN_OBJS += builtin/fetch.o
-BUILTIN_OBJS += builtin/fmt-merge-msg.o
-BUILTIN_OBJS += builtin/for-each-ref.o
-BUILTIN_OBJS += builtin/for-each-repo.o
-BUILTIN_OBJS += builtin/fsck.o
-BUILTIN_OBJS += builtin/gc.o
-BUILTIN_OBJS += builtin/get-tar-commit-id.o
-BUILTIN_OBJS += builtin/grep.o
-BUILTIN_OBJS += builtin/hash-object.o
-BUILTIN_OBJS += builtin/help.o
-BUILTIN_OBJS += builtin/index-pack.o
-BUILTIN_OBJS += builtin/init-db.o
-BUILTIN_OBJS += builtin/interpret-trailers.o
-BUILTIN_OBJS += builtin/log.o
-BUILTIN_OBJS += builtin/ls-files.o
-BUILTIN_OBJS += builtin/ls-remote.o
-BUILTIN_OBJS += builtin/ls-tree.o
-BUILTIN_OBJS += builtin/mailinfo.o
-BUILTIN_OBJS += builtin/mailsplit.o
-BUILTIN_OBJS += builtin/merge-base.o
-BUILTIN_OBJS += builtin/merge-file.o
-BUILTIN_OBJS += builtin/merge-index.o
-BUILTIN_OBJS += builtin/merge-ours.o
-BUILTIN_OBJS += builtin/merge-recursive.o
-BUILTIN_OBJS += builtin/merge-tree.o
-BUILTIN_OBJS += builtin/merge.o
-BUILTIN_OBJS += builtin/mktag.o
-BUILTIN_OBJS += builtin/mktree.o
-BUILTIN_OBJS += builtin/multi-pack-index.o
-BUILTIN_OBJS += builtin/mv.o
-BUILTIN_OBJS += builtin/name-rev.o
-BUILTIN_OBJS += builtin/notes.o
-BUILTIN_OBJS += builtin/pack-objects.o
-BUILTIN_OBJS += builtin/pack-redundant.o
-BUILTIN_OBJS += builtin/pack-refs.o
-BUILTIN_OBJS += builtin/patch-id.o
-BUILTIN_OBJS += builtin/prune-packed.o
-BUILTIN_OBJS += builtin/prune.o
-BUILTIN_OBJS += builtin/pull.o
-BUILTIN_OBJS += builtin/push.o
-BUILTIN_OBJS += builtin/range-diff.o
-BUILTIN_OBJS += builtin/read-tree.o
-BUILTIN_OBJS += builtin/rebase.o
-BUILTIN_OBJS += builtin/receive-pack.o
-BUILTIN_OBJS += builtin/reflog.o
-BUILTIN_OBJS += builtin/remote-ext.o
-BUILTIN_OBJS += builtin/remote-fd.o
-BUILTIN_OBJS += builtin/remote.o
-BUILTIN_OBJS += builtin/repack.o
-BUILTIN_OBJS += builtin/replace.o
-BUILTIN_OBJS += builtin/rerere.o
-BUILTIN_OBJS += builtin/reset.o
-BUILTIN_OBJS += builtin/rev-list.o
-BUILTIN_OBJS += builtin/rev-parse.o
-BUILTIN_OBJS += builtin/revert.o
-BUILTIN_OBJS += builtin/rm.o
-BUILTIN_OBJS += builtin/send-pack.o
-BUILTIN_OBJS += builtin/shortlog.o
-BUILTIN_OBJS += builtin/show-branch.o
-BUILTIN_OBJS += builtin/show-index.o
-BUILTIN_OBJS += builtin/show-ref.o
-BUILTIN_OBJS += builtin/sparse-checkout.o
-BUILTIN_OBJS += builtin/stash.o
-BUILTIN_OBJS += builtin/stripspace.o
-BUILTIN_OBJS += builtin/submodule--helper.o
-BUILTIN_OBJS += builtin/symbolic-ref.o
-BUILTIN_OBJS += builtin/tag.o
-BUILTIN_OBJS += builtin/unpack-file.o
-BUILTIN_OBJS += builtin/unpack-objects.o
-BUILTIN_OBJS += builtin/update-index.o
-BUILTIN_OBJS += builtin/update-ref.o
-BUILTIN_OBJS += builtin/update-server-info.o
-BUILTIN_OBJS += builtin/upload-archive.o
-BUILTIN_OBJS += builtin/upload-pack.o
-BUILTIN_OBJS += builtin/var.o
-BUILTIN_OBJS += builtin/verify-commit.o
-BUILTIN_OBJS += builtin/verify-pack.o
-BUILTIN_OBJS += builtin/verify-tag.o
-BUILTIN_OBJS += builtin/worktree.o
-BUILTIN_OBJS += builtin/write-tree.o
 
 # THIRD_PARTY_SOURCES is a list of patterns compatible with the
 # $(filter) and $(filter-out) family of functions. They specify source
@@ -2076,6 +1698,7 @@ endif
 LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS)
 
 BASIC_CFLAGS += $(COMPAT_CFLAGS)
+LIB_OBJS_NO_COMPAT := $(LIB_OBJS)
 LIB_OBJS += $(COMPAT_OBJS)
 
 # Quote for C
@@ -2436,17 +2059,12 @@ reconfigure config.mak.autogen: config.status
 .PHONY: reconfigure # This is a convenience target.
 endif
 
-XDIFF_OBJS += xdiff/xdiffi.o
-XDIFF_OBJS += xdiff/xemit.o
-XDIFF_OBJS += xdiff/xhistogram.o
-XDIFF_OBJS += xdiff/xmerge.o
-XDIFF_OBJS += xdiff/xpatience.o
-XDIFF_OBJS += xdiff/xprepare.o
-XDIFF_OBJS += xdiff/xutils.o
+XDIFF_SRC += $(wildcard xdiff/*.c)
+XDIFF_OBJS += $(XDIFF_SRC:.c=.o)
 .PHONY: xdiff-objs
 xdiff-objs: $(XDIFF_OBJS)
 
-TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(TEST_BUILTINS_OBJS)
 .PHONY: test-objs
 test-objs: $(TEST_OBJS)
 
@@ -2457,13 +2075,20 @@ GIT_OBJS += git.o
 .PHONY: git-objs
 git-objs: $(GIT_OBJS)
 
+CURL_SRC += http.c
+CURL_SRC += http-walker.c
+CURL_SRC += remote-curl.c
+CURL_OBJS += $(CURL_SRC:.c=.o)
+.PHONY: curl-objs
+curl-objs: $(CURL_OBJS)
+
 OBJECTS += $(GIT_OBJS)
 OBJECTS += $(PROGRAM_OBJS)
 OBJECTS += $(TEST_OBJS)
 OBJECTS += $(XDIFF_OBJS)
 OBJECTS += $(FUZZ_OBJS)
 ifndef NO_CURL
-	OBJECTS += http.o http-walker.o remote-curl.o
+OBJECTS += $(CURL_OBJS)
 endif
 .PHONY: objects
 objects: $(OBJECTS)
@@ -2900,7 +2525,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(TEST_BUILTINS_OBJS)
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
index fd1399c440f..d57c9203b66 100644
--- a/contrib/buildsystems/CMakeLists.txt
+++ b/contrib/buildsystems/CMakeLists.txt
@@ -111,32 +111,15 @@ project(git
 #TODO Add pcre support
 
 #macros for parsing the Makefile for sources and scripts
-macro(parse_makefile_for_sources list_var regex)
-	file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+=(.*)")
-	string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
-	string(REPLACE "$(COMPAT_OBJS)" "" ${list_var} ${${list_var}}) #remove "$(COMPAT_OBJS)" This is only for libgit.
-	string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
-	string(REPLACE ".o" ".c;" ${list_var} ${${list_var}}) #change .o to .c, ; is for converting the string into a list
-	list(TRANSFORM ${list_var} STRIP) #remove trailing/leading whitespaces for each element in list
-	list(REMOVE_ITEM ${list_var} "") #remove empty list elements
-endmacro()
-
-macro(parse_makefile_for_scripts list_var regex lang)
-	file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+=(.*)")
-	string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
-	string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
-	string(REPLACE " " ";" ${list_var} ${${list_var}}) #convert string to a list
-	if(NOT ${lang}) #exclude for SCRIPT_LIB
-		list(TRANSFORM ${list_var} REPLACE "${lang}" "") #do the replacement
-	endif()
-endmacro()
-
-macro(parse_makefile_for_executables list_var regex)
-	file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+= git-(.*)")
-	string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
+macro(ask_makefile_for_list list_var var_name)
+	execute_process(COMMAND make print-list-${var_name}
+			WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+			OUTPUT_VARIABLE ${list_var})
+	string(REGEX REPLACE "\\.o\n" ".c\n" ${list_var} ${${list_var}}) #change .o to .c
 	string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
-	string(REPLACE "git-" "" ${list_var} ${${list_var}}) #strip `git-` prefix
-	string(REPLACE "\$X" ";" ${list_var} ${${list_var}}) #strip $X, ; is for converting the string into a list
+	## Parse the Makefile print-list-% format
+	string(REGEX REPLACE "${var_name} =\n" "" ${list_var} ${${list_var}})
+	string(REGEX REPLACE "${var_name} \\+?= ([^\n]+)" "\\1;" ${list_var} ${${list_var}})
 	list(TRANSFORM ${list_var} STRIP) #remove trailing/leading whitespaces for each element in list
 	list(REMOVE_ITEM ${list_var} "") #remove empty list elements
 endmacro()
@@ -635,14 +618,14 @@ include_directories(${CMAKE_BINARY_DIR})
 
 #build
 #libgit
-parse_makefile_for_sources(libgit_SOURCES "LIB_OBJS")
+ask_makefile_for_list(libgit_SOURCES "LIB_OBJS_NO_COMPAT")
 
 list(TRANSFORM libgit_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
 list(TRANSFORM compat_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
 add_library(libgit ${libgit_SOURCES} ${compat_SOURCES})
 
 #libxdiff
-parse_makefile_for_sources(libxdiff_SOURCES "XDIFF_OBJS")
+ask_makefile_for_list(libxdiff_SOURCES "XDIFF_OBJS")
 
 list(TRANSFORM libxdiff_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
 add_library(xdiff STATIC ${libxdiff_SOURCES})
@@ -693,7 +676,7 @@ elseif(UNIX)
 endif()
 
 #git
-parse_makefile_for_sources(git_SOURCES "BUILTIN_OBJS")
+ask_makefile_for_list(git_SOURCES "BUILTIN_OBJS")
 
 list(TRANSFORM git_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
 add_executable(git ${CMAKE_SOURCE_DIR}/git.c ${git_SOURCES})
@@ -729,7 +712,9 @@ if(CURL_FOUND)
 	endif()
 endif()
 
-parse_makefile_for_executables(git_builtin_extra "BUILT_INS")
+ask_makefile_for_list(git_builtin_extra "BUILT_INS")
+list(TRANSFORM git_builtin_extra REPLACE "^git-(.*)" "\\1") #strip `git-` prefix
+list(TRANSFORM git_builtin_extra REPLACE "\.exe$" "") #strip $X
 
 option(SKIP_DASHED_BUILT_INS "Skip hardlinking the dashed versions of the built-ins")
 
@@ -766,8 +751,8 @@ set(GITWEBDIR ${FALLBACK_RUNTIME_PREFIX}/share/locale)
 set(INSTLIBDIR ${FALLBACK_RUNTIME_PREFIX}/share/perl5)
 
 #shell scripts
-parse_makefile_for_scripts(git_sh_scripts "SCRIPT_SH" ".sh")
-parse_makefile_for_scripts(git_shlib_scripts "SCRIPT_LIB" "")
+ask_makefile_for_list(git_sh_scripts "SCRIPT_SH_GEN")
+ask_makefile_for_list(git_shlib_scripts "SCRIPT_LIB_GEN")
 set(git_shell_scripts
 	${git_sh_scripts} ${git_shlib_scripts} git-instaweb)
 
@@ -787,7 +772,7 @@ foreach(script ${git_shell_scripts})
 endforeach()
 
 #perl scripts
-parse_makefile_for_scripts(git_perl_scripts "SCRIPT_PERL" ".perl")
+ask_makefile_for_list(git_perl_scripts "SCRIPT_PERL_GEN")
 
 #create perl header
 file(STRINGS ${CMAKE_SOURCE_DIR}/perl/header_templates/fixed_prefix.template.pl perl_header )
@@ -910,9 +895,9 @@ add_executable(test-fake-ssh ${CMAKE_SOURCE_DIR}/t/helper/test-fake-ssh.c)
 target_link_libraries(test-fake-ssh common-main)
 
 #test-tool
-parse_makefile_for_sources(test-tool_SOURCES "TEST_BUILTINS_OBJS")
+ask_makefile_for_list(test-tool_SOURCES "TEST_BUILTINS_OBJS")
 
-list(TRANSFORM test-tool_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/t/helper/")
+list(TRANSFORM test-tool_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
 add_executable(test-tool ${CMAKE_SOURCE_DIR}/t/helper/test-tool.c ${test-tool_SOURCES})
 target_link_libraries(test-tool common-main)
 
-- 
2.33.1.1570.g069344fdd45


^ permalink raw reply related	[relevance 1%]

* [PATCH] Makefile: replace most hardcoded object lists with $(wildcard)
@ 2021-10-30 22:32  1% Ævar Arnfjörð Bjarmason
    0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-10-30 22:32 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Jeff King, Ævar Arnfjörð Bjarmason

Remove the hardcoded lists of objects in favor of using
$(wildcard). This means that every time a built-in, test tool etc. is
added we won't need to patch the top-level Makefile, except for the
few remaining cases where the asset in question would make it onto one
of our list of exceptions.

Ever since 81b50f3ce40 (Move 'builtin-*' into a 'builtin/'
subdirectory, 2010-02-22) this has been relatively easy to do (and
even before that we could glob builtin-*.c). This pattern of
exhaustively enumerating files was then carried forward for
e.g. TEST_BUILTINS_OBJS in efd71f8913a (t/helper: add an empty
test-tool program, 2018-03-24).

One reason not to do this is that now a new *.c file at the top-level
will be immediately picked up, so if a new *.c file is being worked on
"make" will error if it doesn't compile, whereas before that file
would need to be explicitly listed in the Makefile. I think than small
trade-off is worth it.

There's a few small "while we're at it" changes here, since I'm
touching the code in question:

 - Start splitting up the the "Guard against the environment" section
   at the top, but don't move anything that exists there out to avoid
   merge conflicts

 - The $(TEST_BUILTINS_OBJS) variable was needlessly complex, because
   it didn't have the full paths we'd pathsubst it back & forth.

 - Introduce *_SRC in addition to *_OBJ for the variable I'm
   touching. Eventually we'll want to do this for all the *.o files,
   i.e. make the *.c list a source of truth for *.o, which means we can
   e.g. use that exhaustive list for "make TAGS".

 - Add a missing "curl-objs" target. See 029bac01a87 (Makefile: add
   {program,xdiff,test,git,fuzz}-objs & objects targets, 2021-02-23)
   for the commit that added the rest.

 - De-indent an "ifndef" block, we don't usually indent their
   contents.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---

There's probably never a good time to submit a change like this,
i.e. it'll likely always conflict with something, perhaps the
around-release period is paradoxically better than most.

This conflicts with some existing topics (including one of my own to
add the "hook" built in), but those merge conflicts are resolvable by
keeping this side of the conflict. I.e. we'll no longer need to
manually maintain these lists in the Makefile for the common cases.

 Makefile | 484 +++++++------------------------------------------------
 1 file changed, 54 insertions(+), 430 deletions(-)

diff --git a/Makefile b/Makefile
index 12be39ac497..2f20fa54940 100644
--- a/Makefile
+++ b/Makefile
@@ -590,6 +590,19 @@ TEST_OBJS =
 TEST_PROGRAMS_NEED_X =
 THIRD_PARTY_SOURCES =
 
+## Guard against env: programs
+TEST_PROGRAMS =
+
+## Guard against env: sources
+CURL_SRC =
+TEST_PROGRAMS_NEED_X_SRC =
+XDIFF_SRC =
+
+## Guard against env: objects
+ALL_COMPAT_OBJS =
+CURL_OBJS =
+LIB_OBJS_DIRS =
+
 # Having this variable in your environment would break pipelines because
 # you cause "cd" to echo its destination to stdout.  It can also take
 # scripts to unexpected places.  If you like CDPATH, define it for your
@@ -688,87 +701,23 @@ X =
 
 PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
 
-TEST_BUILTINS_OBJS += test-advise.o
-TEST_BUILTINS_OBJS += test-bitmap.o
-TEST_BUILTINS_OBJS += test-bloom.o
-TEST_BUILTINS_OBJS += test-chmtime.o
-TEST_BUILTINS_OBJS += test-config.o
-TEST_BUILTINS_OBJS += test-crontab.o
-TEST_BUILTINS_OBJS += test-ctype.o
-TEST_BUILTINS_OBJS += test-date.o
-TEST_BUILTINS_OBJS += test-delta.o
-TEST_BUILTINS_OBJS += test-dir-iterator.o
-TEST_BUILTINS_OBJS += test-drop-caches.o
-TEST_BUILTINS_OBJS += test-dump-cache-tree.o
-TEST_BUILTINS_OBJS += test-dump-fsmonitor.o
-TEST_BUILTINS_OBJS += test-dump-split-index.o
-TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
-TEST_BUILTINS_OBJS += test-example-decorate.o
-TEST_BUILTINS_OBJS += test-fast-rebase.o
-TEST_BUILTINS_OBJS += test-genrandom.o
-TEST_BUILTINS_OBJS += test-genzeros.o
-TEST_BUILTINS_OBJS += test-getcwd.o
-TEST_BUILTINS_OBJS += test-hash-speed.o
-TEST_BUILTINS_OBJS += test-hash.o
-TEST_BUILTINS_OBJS += test-hashmap.o
-TEST_BUILTINS_OBJS += test-index-version.o
-TEST_BUILTINS_OBJS += test-json-writer.o
-TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
-TEST_BUILTINS_OBJS += test-match-trees.o
-TEST_BUILTINS_OBJS += test-mergesort.o
-TEST_BUILTINS_OBJS += test-mktemp.o
-TEST_BUILTINS_OBJS += test-oid-array.o
-TEST_BUILTINS_OBJS += test-oidmap.o
-TEST_BUILTINS_OBJS += test-oidtree.o
-TEST_BUILTINS_OBJS += test-online-cpus.o
-TEST_BUILTINS_OBJS += test-parse-options.o
-TEST_BUILTINS_OBJS += test-parse-pathspec-file.o
-TEST_BUILTINS_OBJS += test-partial-clone.o
-TEST_BUILTINS_OBJS += test-path-utils.o
-TEST_BUILTINS_OBJS += test-pcre2-config.o
-TEST_BUILTINS_OBJS += test-pkt-line.o
-TEST_BUILTINS_OBJS += test-prio-queue.o
-TEST_BUILTINS_OBJS += test-proc-receive.o
-TEST_BUILTINS_OBJS += test-progress.o
-TEST_BUILTINS_OBJS += test-reach.o
-TEST_BUILTINS_OBJS += test-read-cache.o
-TEST_BUILTINS_OBJS += test-read-graph.o
-TEST_BUILTINS_OBJS += test-read-midx.o
-TEST_BUILTINS_OBJS += test-ref-store.o
-TEST_BUILTINS_OBJS += test-regex.o
-TEST_BUILTINS_OBJS += test-repository.o
-TEST_BUILTINS_OBJS += test-revision-walking.o
-TEST_BUILTINS_OBJS += test-run-command.o
-TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
-TEST_BUILTINS_OBJS += test-serve-v2.o
-TEST_BUILTINS_OBJS += test-sha1.o
-TEST_BUILTINS_OBJS += test-sha256.o
-TEST_BUILTINS_OBJS += test-sigchain.o
-TEST_BUILTINS_OBJS += test-simple-ipc.o
-TEST_BUILTINS_OBJS += test-strcmp-offset.o
-TEST_BUILTINS_OBJS += test-string-list.o
-TEST_BUILTINS_OBJS += test-submodule-config.o
-TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
-TEST_BUILTINS_OBJS += test-subprocess.o
-TEST_BUILTINS_OBJS += test-trace2.o
-TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
-TEST_BUILTINS_OBJS += test-userdiff.o
-TEST_BUILTINS_OBJS += test-wildmatch.o
-TEST_BUILTINS_OBJS += test-windows-named-pipe.o
-TEST_BUILTINS_OBJS += test-write-cache.o
-TEST_BUILTINS_OBJS += test-xml-encode.o
-
 # Do not add more tests here unless they have extra dependencies. Add
 # them in TEST_BUILTINS_OBJS above.
 TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-tool
 
-TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
+TEST_PROGRAMS_NEED_X_SRC += $(TEST_PROGRAMS_NEED_X:%=t/helper/%.c)
+TEST_PROGRAMS += $(TEST_PROGRAMS_NEED_X_SRC:%.c=%$X)
+TEST_BUILTINS_SRC += $(filter-out $(TEST_PROGRAMS_NEED_X_SRC),$(wildcard t/helper/*.c))
+TEST_BUILTINS_OBJS += $(TEST_BUILTINS_SRC:%.c=%.o)
 
-# List built-in command $C whose implementation cmd_$C() is not in
-# builtin/$C.o but is linked in as part of some other command.
+# List built-in command $C whose implementation cmd_$C() is in
+# builtin/$C.o
+BUILTIN_OBJS = $(patsubst %.c,%.o,$(wildcard builtin/*.c))
 BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS))
 
+# List built-in command $C whose implementation cmd_$C() is not in
+# builtin/$C.o but is linked in as part of some other command.
 BUILT_INS += git-cherry$X
 BUILT_INS += git-cherry-pick$X
 BUILT_INS += git-format-patch$X
@@ -828,355 +777,28 @@ LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentat
 	-name Documentation -prune -o \
 	-name '*.h' -print)))
 
-LIB_OBJS += abspath.o
-LIB_OBJS += add-interactive.o
-LIB_OBJS += add-patch.o
-LIB_OBJS += advice.o
-LIB_OBJS += alias.o
-LIB_OBJS += alloc.o
-LIB_OBJS += apply.o
-LIB_OBJS += archive-tar.o
-LIB_OBJS += archive-zip.o
-LIB_OBJS += archive.o
-LIB_OBJS += attr.o
-LIB_OBJS += base85.o
-LIB_OBJS += bisect.o
-LIB_OBJS += blame.o
-LIB_OBJS += blob.o
-LIB_OBJS += bloom.o
-LIB_OBJS += branch.o
-LIB_OBJS += bulk-checkin.o
-LIB_OBJS += bundle.o
-LIB_OBJS += cache-tree.o
-LIB_OBJS += cbtree.o
-LIB_OBJS += chdir-notify.o
-LIB_OBJS += checkout.o
-LIB_OBJS += chunk-format.o
-LIB_OBJS += color.o
-LIB_OBJS += column.o
-LIB_OBJS += combine-diff.o
-LIB_OBJS += commit-graph.o
-LIB_OBJS += commit-reach.o
-LIB_OBJS += commit.o
+# LIB_OBJS: compat/* objects that live at the top-level
+ALL_COMPAT_OBJS += unix-socket.o
+ALL_COMPAT_OBJS += unix-stream-server.o
+ALL_COMPAT_OBJS += sha1dc_git.o
+
+# LIB_OBJS: Mostly glob *.c at the top-level, with some exlusions
+LIB_OBJS += $(filter-out \
+	$(ALL_COMPAT_OBJS) \
+	git.o common-main.o $(PROGRAM_OBJS) \
+	$(FUZZ_OBJS) $(CURL_OBJS),\
+	$(patsubst %.c,%.o,$(wildcard *.c)))
+
+# LIB_OBJS: Directories that contain only LIB_OBJS
+LIB_OBJS_DIRS += ewah
+LIB_OBJS_DIRS += negotiator
+LIB_OBJS_DIRS += refs
+LIB_OBJS_DIRS += trace2
+LIB_OBJS += $(patsubst %.c,%.o,$(foreach dir,$(LIB_OBJS_DIRS),$(wildcard $(dir)/*.c)))
+
+# LIB_OBJS: unconditional compat/* objects
 LIB_OBJS += compat/obstack.o
 LIB_OBJS += compat/terminal.o
-LIB_OBJS += config.o
-LIB_OBJS += connect.o
-LIB_OBJS += connected.o
-LIB_OBJS += convert.o
-LIB_OBJS += copy.o
-LIB_OBJS += credential.o
-LIB_OBJS += csum-file.o
-LIB_OBJS += ctype.o
-LIB_OBJS += date.o
-LIB_OBJS += decorate.o
-LIB_OBJS += delta-islands.o
-LIB_OBJS += diff-delta.o
-LIB_OBJS += diff-merges.o
-LIB_OBJS += diff-lib.o
-LIB_OBJS += diff-no-index.o
-LIB_OBJS += diff.o
-LIB_OBJS += diffcore-break.o
-LIB_OBJS += diffcore-delta.o
-LIB_OBJS += diffcore-order.o
-LIB_OBJS += diffcore-pickaxe.o
-LIB_OBJS += diffcore-rename.o
-LIB_OBJS += diffcore-rotate.o
-LIB_OBJS += dir-iterator.o
-LIB_OBJS += dir.o
-LIB_OBJS += editor.o
-LIB_OBJS += entry.o
-LIB_OBJS += environment.o
-LIB_OBJS += ewah/bitmap.o
-LIB_OBJS += ewah/ewah_bitmap.o
-LIB_OBJS += ewah/ewah_io.o
-LIB_OBJS += ewah/ewah_rlw.o
-LIB_OBJS += exec-cmd.o
-LIB_OBJS += fetch-negotiator.o
-LIB_OBJS += fetch-pack.o
-LIB_OBJS += fmt-merge-msg.o
-LIB_OBJS += fsck.o
-LIB_OBJS += fsmonitor.o
-LIB_OBJS += gettext.o
-LIB_OBJS += gpg-interface.o
-LIB_OBJS += graph.o
-LIB_OBJS += grep.o
-LIB_OBJS += hash-lookup.o
-LIB_OBJS += hashmap.o
-LIB_OBJS += help.o
-LIB_OBJS += hex.o
-LIB_OBJS += hook.o
-LIB_OBJS += ident.o
-LIB_OBJS += json-writer.o
-LIB_OBJS += kwset.o
-LIB_OBJS += levenshtein.o
-LIB_OBJS += line-log.o
-LIB_OBJS += line-range.o
-LIB_OBJS += linear-assignment.o
-LIB_OBJS += list-objects-filter-options.o
-LIB_OBJS += list-objects-filter.o
-LIB_OBJS += list-objects.o
-LIB_OBJS += ll-merge.o
-LIB_OBJS += lockfile.o
-LIB_OBJS += log-tree.o
-LIB_OBJS += ls-refs.o
-LIB_OBJS += mailinfo.o
-LIB_OBJS += mailmap.o
-LIB_OBJS += match-trees.o
-LIB_OBJS += mem-pool.o
-LIB_OBJS += merge-blobs.o
-LIB_OBJS += merge-ort.o
-LIB_OBJS += merge-ort-wrappers.o
-LIB_OBJS += merge-recursive.o
-LIB_OBJS += merge.o
-LIB_OBJS += mergesort.o
-LIB_OBJS += midx.o
-LIB_OBJS += name-hash.o
-LIB_OBJS += negotiator/default.o
-LIB_OBJS += negotiator/noop.o
-LIB_OBJS += negotiator/skipping.o
-LIB_OBJS += notes-cache.o
-LIB_OBJS += notes-merge.o
-LIB_OBJS += notes-utils.o
-LIB_OBJS += notes.o
-LIB_OBJS += object-file.o
-LIB_OBJS += object-name.o
-LIB_OBJS += object.o
-LIB_OBJS += oid-array.o
-LIB_OBJS += oidmap.o
-LIB_OBJS += oidset.o
-LIB_OBJS += oidtree.o
-LIB_OBJS += pack-bitmap-write.o
-LIB_OBJS += pack-bitmap.o
-LIB_OBJS += pack-check.o
-LIB_OBJS += pack-objects.o
-LIB_OBJS += pack-revindex.o
-LIB_OBJS += pack-write.o
-LIB_OBJS += packfile.o
-LIB_OBJS += pager.o
-LIB_OBJS += parallel-checkout.o
-LIB_OBJS += parse-options-cb.o
-LIB_OBJS += parse-options.o
-LIB_OBJS += patch-delta.o
-LIB_OBJS += patch-ids.o
-LIB_OBJS += path.o
-LIB_OBJS += pathspec.o
-LIB_OBJS += pkt-line.o
-LIB_OBJS += preload-index.o
-LIB_OBJS += pretty.o
-LIB_OBJS += prio-queue.o
-LIB_OBJS += progress.o
-LIB_OBJS += promisor-remote.o
-LIB_OBJS += prompt.o
-LIB_OBJS += protocol.o
-LIB_OBJS += protocol-caps.o
-LIB_OBJS += prune-packed.o
-LIB_OBJS += quote.o
-LIB_OBJS += range-diff.o
-LIB_OBJS += reachable.o
-LIB_OBJS += read-cache.o
-LIB_OBJS += rebase-interactive.o
-LIB_OBJS += rebase.o
-LIB_OBJS += ref-filter.o
-LIB_OBJS += reflog-walk.o
-LIB_OBJS += refs.o
-LIB_OBJS += refs/debug.o
-LIB_OBJS += refs/files-backend.o
-LIB_OBJS += refs/iterator.o
-LIB_OBJS += refs/packed-backend.o
-LIB_OBJS += refs/ref-cache.o
-LIB_OBJS += refspec.o
-LIB_OBJS += remote.o
-LIB_OBJS += replace-object.o
-LIB_OBJS += repo-settings.o
-LIB_OBJS += repository.o
-LIB_OBJS += rerere.o
-LIB_OBJS += reset.o
-LIB_OBJS += resolve-undo.o
-LIB_OBJS += revision.o
-LIB_OBJS += run-command.o
-LIB_OBJS += send-pack.o
-LIB_OBJS += sequencer.o
-LIB_OBJS += serve.o
-LIB_OBJS += server-info.o
-LIB_OBJS += setup.o
-LIB_OBJS += shallow.o
-LIB_OBJS += sideband.o
-LIB_OBJS += sigchain.o
-LIB_OBJS += sparse-index.o
-LIB_OBJS += split-index.o
-LIB_OBJS += stable-qsort.o
-LIB_OBJS += strbuf.o
-LIB_OBJS += streaming.o
-LIB_OBJS += string-list.o
-LIB_OBJS += strmap.o
-LIB_OBJS += strvec.o
-LIB_OBJS += sub-process.o
-LIB_OBJS += submodule-config.o
-LIB_OBJS += submodule.o
-LIB_OBJS += symlinks.o
-LIB_OBJS += tag.o
-LIB_OBJS += tempfile.o
-LIB_OBJS += thread-utils.o
-LIB_OBJS += tmp-objdir.o
-LIB_OBJS += trace.o
-LIB_OBJS += trace2.o
-LIB_OBJS += trace2/tr2_cfg.o
-LIB_OBJS += trace2/tr2_cmd_name.o
-LIB_OBJS += trace2/tr2_dst.o
-LIB_OBJS += trace2/tr2_sid.o
-LIB_OBJS += trace2/tr2_sysenv.o
-LIB_OBJS += trace2/tr2_tbuf.o
-LIB_OBJS += trace2/tr2_tgt_event.o
-LIB_OBJS += trace2/tr2_tgt_normal.o
-LIB_OBJS += trace2/tr2_tgt_perf.o
-LIB_OBJS += trace2/tr2_tls.o
-LIB_OBJS += trailer.o
-LIB_OBJS += transport-helper.o
-LIB_OBJS += transport.o
-LIB_OBJS += tree-diff.o
-LIB_OBJS += tree-walk.o
-LIB_OBJS += tree.o
-LIB_OBJS += unpack-trees.o
-LIB_OBJS += upload-pack.o
-LIB_OBJS += url.o
-LIB_OBJS += urlmatch.o
-LIB_OBJS += usage.o
-LIB_OBJS += userdiff.o
-LIB_OBJS += utf8.o
-LIB_OBJS += varint.o
-LIB_OBJS += version.o
-LIB_OBJS += versioncmp.o
-LIB_OBJS += walker.o
-LIB_OBJS += wildmatch.o
-LIB_OBJS += worktree.o
-LIB_OBJS += wrapper.o
-LIB_OBJS += write-or-die.o
-LIB_OBJS += ws.o
-LIB_OBJS += wt-status.o
-LIB_OBJS += xdiff-interface.o
-LIB_OBJS += zlib.o
-
-BUILTIN_OBJS += builtin/add.o
-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/blame.o
-BUILTIN_OBJS += builtin/branch.o
-BUILTIN_OBJS += builtin/bugreport.o
-BUILTIN_OBJS += builtin/bundle.o
-BUILTIN_OBJS += builtin/cat-file.o
-BUILTIN_OBJS += builtin/check-attr.o
-BUILTIN_OBJS += builtin/check-ignore.o
-BUILTIN_OBJS += builtin/check-mailmap.o
-BUILTIN_OBJS += builtin/check-ref-format.o
-BUILTIN_OBJS += builtin/checkout--worker.o
-BUILTIN_OBJS += builtin/checkout-index.o
-BUILTIN_OBJS += builtin/checkout.o
-BUILTIN_OBJS += builtin/clean.o
-BUILTIN_OBJS += builtin/clone.o
-BUILTIN_OBJS += builtin/column.o
-BUILTIN_OBJS += builtin/commit-graph.o
-BUILTIN_OBJS += builtin/commit-tree.o
-BUILTIN_OBJS += builtin/commit.o
-BUILTIN_OBJS += builtin/config.o
-BUILTIN_OBJS += builtin/count-objects.o
-BUILTIN_OBJS += builtin/credential-cache--daemon.o
-BUILTIN_OBJS += builtin/credential-cache.o
-BUILTIN_OBJS += builtin/credential-store.o
-BUILTIN_OBJS += builtin/credential.o
-BUILTIN_OBJS += builtin/describe.o
-BUILTIN_OBJS += builtin/diff-files.o
-BUILTIN_OBJS += builtin/diff-index.o
-BUILTIN_OBJS += builtin/diff-tree.o
-BUILTIN_OBJS += builtin/diff.o
-BUILTIN_OBJS += builtin/difftool.o
-BUILTIN_OBJS += builtin/env--helper.o
-BUILTIN_OBJS += builtin/fast-export.o
-BUILTIN_OBJS += builtin/fast-import.o
-BUILTIN_OBJS += builtin/fetch-pack.o
-BUILTIN_OBJS += builtin/fetch.o
-BUILTIN_OBJS += builtin/fmt-merge-msg.o
-BUILTIN_OBJS += builtin/for-each-ref.o
-BUILTIN_OBJS += builtin/for-each-repo.o
-BUILTIN_OBJS += builtin/fsck.o
-BUILTIN_OBJS += builtin/gc.o
-BUILTIN_OBJS += builtin/get-tar-commit-id.o
-BUILTIN_OBJS += builtin/grep.o
-BUILTIN_OBJS += builtin/hash-object.o
-BUILTIN_OBJS += builtin/help.o
-BUILTIN_OBJS += builtin/index-pack.o
-BUILTIN_OBJS += builtin/init-db.o
-BUILTIN_OBJS += builtin/interpret-trailers.o
-BUILTIN_OBJS += builtin/log.o
-BUILTIN_OBJS += builtin/ls-files.o
-BUILTIN_OBJS += builtin/ls-remote.o
-BUILTIN_OBJS += builtin/ls-tree.o
-BUILTIN_OBJS += builtin/mailinfo.o
-BUILTIN_OBJS += builtin/mailsplit.o
-BUILTIN_OBJS += builtin/merge-base.o
-BUILTIN_OBJS += builtin/merge-file.o
-BUILTIN_OBJS += builtin/merge-index.o
-BUILTIN_OBJS += builtin/merge-ours.o
-BUILTIN_OBJS += builtin/merge-recursive.o
-BUILTIN_OBJS += builtin/merge-tree.o
-BUILTIN_OBJS += builtin/merge.o
-BUILTIN_OBJS += builtin/mktag.o
-BUILTIN_OBJS += builtin/mktree.o
-BUILTIN_OBJS += builtin/multi-pack-index.o
-BUILTIN_OBJS += builtin/mv.o
-BUILTIN_OBJS += builtin/name-rev.o
-BUILTIN_OBJS += builtin/notes.o
-BUILTIN_OBJS += builtin/pack-objects.o
-BUILTIN_OBJS += builtin/pack-redundant.o
-BUILTIN_OBJS += builtin/pack-refs.o
-BUILTIN_OBJS += builtin/patch-id.o
-BUILTIN_OBJS += builtin/prune-packed.o
-BUILTIN_OBJS += builtin/prune.o
-BUILTIN_OBJS += builtin/pull.o
-BUILTIN_OBJS += builtin/push.o
-BUILTIN_OBJS += builtin/range-diff.o
-BUILTIN_OBJS += builtin/read-tree.o
-BUILTIN_OBJS += builtin/rebase.o
-BUILTIN_OBJS += builtin/receive-pack.o
-BUILTIN_OBJS += builtin/reflog.o
-BUILTIN_OBJS += builtin/remote-ext.o
-BUILTIN_OBJS += builtin/remote-fd.o
-BUILTIN_OBJS += builtin/remote.o
-BUILTIN_OBJS += builtin/repack.o
-BUILTIN_OBJS += builtin/replace.o
-BUILTIN_OBJS += builtin/rerere.o
-BUILTIN_OBJS += builtin/reset.o
-BUILTIN_OBJS += builtin/rev-list.o
-BUILTIN_OBJS += builtin/rev-parse.o
-BUILTIN_OBJS += builtin/revert.o
-BUILTIN_OBJS += builtin/rm.o
-BUILTIN_OBJS += builtin/send-pack.o
-BUILTIN_OBJS += builtin/shortlog.o
-BUILTIN_OBJS += builtin/show-branch.o
-BUILTIN_OBJS += builtin/show-index.o
-BUILTIN_OBJS += builtin/show-ref.o
-BUILTIN_OBJS += builtin/sparse-checkout.o
-BUILTIN_OBJS += builtin/stash.o
-BUILTIN_OBJS += builtin/stripspace.o
-BUILTIN_OBJS += builtin/submodule--helper.o
-BUILTIN_OBJS += builtin/symbolic-ref.o
-BUILTIN_OBJS += builtin/tag.o
-BUILTIN_OBJS += builtin/unpack-file.o
-BUILTIN_OBJS += builtin/unpack-objects.o
-BUILTIN_OBJS += builtin/update-index.o
-BUILTIN_OBJS += builtin/update-ref.o
-BUILTIN_OBJS += builtin/update-server-info.o
-BUILTIN_OBJS += builtin/upload-archive.o
-BUILTIN_OBJS += builtin/upload-pack.o
-BUILTIN_OBJS += builtin/var.o
-BUILTIN_OBJS += builtin/verify-commit.o
-BUILTIN_OBJS += builtin/verify-pack.o
-BUILTIN_OBJS += builtin/verify-tag.o
-BUILTIN_OBJS += builtin/worktree.o
-BUILTIN_OBJS += builtin/write-tree.o
 
 # THIRD_PARTY_SOURCES is a list of patterns compatible with the
 # $(filter) and $(filter-out) family of functions. They specify source
@@ -2427,17 +2049,12 @@ reconfigure config.mak.autogen: config.status
 .PHONY: reconfigure # This is a convenience target.
 endif
 
-XDIFF_OBJS += xdiff/xdiffi.o
-XDIFF_OBJS += xdiff/xemit.o
-XDIFF_OBJS += xdiff/xhistogram.o
-XDIFF_OBJS += xdiff/xmerge.o
-XDIFF_OBJS += xdiff/xpatience.o
-XDIFF_OBJS += xdiff/xprepare.o
-XDIFF_OBJS += xdiff/xutils.o
+XDIFF_SRC += $(wildcard xdiff/*.c)
+XDIFF_OBJS += $(XDIFF_SRC:.c=.o)
 .PHONY: xdiff-objs
 xdiff-objs: $(XDIFF_OBJS)
 
-TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(TEST_BUILTINS_OBJS)
 .PHONY: test-objs
 test-objs: $(TEST_OBJS)
 
@@ -2448,13 +2065,20 @@ GIT_OBJS += git.o
 .PHONY: git-objs
 git-objs: $(GIT_OBJS)
 
+CURL_SRC += http.c
+CURL_SRC += http-walker.c
+CURL_SRC += remote-curl.c
+CURL_OBJS += $(CURL_SRC:.c=.o)
+.PHONY: curl-objs
+curl-objs: $(CURL_OBJS)
+
 OBJECTS += $(GIT_OBJS)
 OBJECTS += $(PROGRAM_OBJS)
 OBJECTS += $(TEST_OBJS)
 OBJECTS += $(XDIFF_OBJS)
 OBJECTS += $(FUZZ_OBJS)
 ifndef NO_CURL
-	OBJECTS += http.o http-walker.o remote-curl.o
+OBJECTS += $(CURL_OBJS)
 endif
 .PHONY: objects
 objects: $(OBJECTS)
@@ -2891,7 +2515,7 @@ perf: all
 
 .PRECIOUS: $(TEST_OBJS)
 
-t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
+t/helper/test-tool$X: $(TEST_BUILTINS_OBJS)
 
 t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
-- 
2.33.1.1570.g069344fdd45


^ permalink raw reply related	[relevance 1%]

* [Summit topic] Sparse checkout behavior and plans
  @ 2021-10-21 11:56  1% ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2021-10-21 11:56 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 13013 bytes --]

This session was led by Derrick Stolee. Supporting cast: Jonathan
"jrnieder" Nieder, Elijah Newren, Jeff Hostetler, Jeff "Peff" King,
Johannes "Dscho" Schindelin, Ævar Arnfjörð Bjarmason, Emily Shaffer,
Victoria Dye, brian m. carlson, and CB Bailey.

Notes:

 1.  Cone mode has stabilized

 2.  jrnieder: would sparse index without cone mode support be welcome?

     1. Stolee: you’re welcome to try ;-)

     2. Elijah: main theme: performance. Cone mode allows reasonable
        performance due to fewer rules to check

     3. Stolee: directory-level lookups mean lookups can have sublinear cost,
        since you can skip sparse rules (no need to check them in order to
        figure out whether or not a file is excluded or not)

 3.  Elijah: interested in “sparse clones”, i.e. clones that download
     everything related to a specified cone

     1.  Would be nice not having to download extra objects when already having
         specified a cone of interest

     2.  Jeff: the original partial clone had code to restrict to a cone

     3.  Peff: we still have the code, but turned it off, you can have bitmaps
         with that (too heavy on the server)

     4.  Stolee: also, how can the cone be updated if things change? Never
         solved that problem

     5.  Stolee: but the extra blob downloads turned out not to be too big of a
         problem

     6.  Stolee: got a feature request to restrict git log to the current cone,
         git grep already does that (thanks Matheus)

     7.  Elijah: “git grep” without revision arguments is restricted to
         worktree, so it respects the sparse checkout. When you pass a
         revision, though, it searches the whole tree

     8.  Many commands want to examine the whole tree, makes sense to figure
         out the UX (configuration, etc) of them together

     9.  Peff: Is diff code on someone’s radar?

     10. Stolee: I’d view that as part of the same story as “git log”, “git log
         -p”.

     11. Sparse index means we can avoid faulting in trees outside of HEAD, so
         it helps unlock this

 4.  Sparse index: Victoria and Lessley are taking lead on the number of
     commands supporting sparse index

     1. update-index, diff, blame, clean, stash, sparse-checkout itself so far
        supported only in the Microsoft fork of Git

     2. Enabled by default internally so helps us gather data

     3. Elijah: awesome that you’re working on this, sorry I haven’t been as
        responsive as I’d like on reviews

     4. I’m interested in “clean” in particular --- isn’t that about untracked
        files?

     5. Stolee: It uses the index to find what is tracked, want to avoid
        expanding the in-memory index. If there are files outside the sparse
        checkout area then it does expand.

 5.  jrnieder: question about failure modes

     1. When I convert a command, I make sure my code path doesn’t assume the
        cache array contains all entries. Then I turn off
        command_requires_full_index. What happens if I missed a spot?

     2. Stolee: I put ensure_full_index() in front of everything that assumes a
        full index, but if there’s a loop that we missed, there’s no extra
        protection.

     3. Example: cache-tree was calling itself, invalidating points,
        segfaulted.

     4. More worrying failure mode would be if commands proceed with bad data.
        Segfaulting is the good case!

     5. jrnieder is not too worried since we’re pretty far along and soon
        enough we’ll have converted all commands and these questions would be
        moot

        1. Stolee: goal isn’t to get 100% coverage, so point of questions being
           moot isn’t coming soon

        2. jrnieder: Thanks! Okay, I’ll take a look.

     6. http://sweng.the-davies.net/Home/rustys-api-design-manifesto

     7. Stolee is less worried because we have sufficient ensure_full_index
        calls.

 6.  One optimization we’re considering: not expanding the full index when
     anything outside the cone is needed (we’d like to maybe expand just the
     part that needs expanding)

     1. Elijah: we would still keep cone mode, but it’s a bit weird because the
        cone mode does not match what we have in the index

     2. Stolee: we might actually not need this

 7.  Stolee: in the process of this work, found D/F conflict issue, made a test
     illustrating it

 8.  Elijah: atomicitiy

     1.  checkout is a non-atomic operation. ^C makes a mess

     2.  “git sparse-checkout disable” is non-atomic. Takes a while, people ^C,
         and the very last step is updating the sparsity files. Leaves the
         worktree with a bunch of files they don’t need but commands ignore
         them

     3.  We run into problems because then they can check out a different
         branch, do a bunch of other work, then update the sparse-checkout and
         it will see these precious files it doesn’t want to overwrite

     4.  Should “git status” show them?

     5.  Dscho: We could set a flag on disk when you’re about to disable, then
         if we were interrupted print an error message to get the user to sort
         things out

     6.  Peff: I was going to suggest something similar. FS doesn’t make
         transactions easy, but we can at least do a rollback (signal handler),
         not foolproof, but it works pretty well and covers your ^C case.

     7.  Stolee: coming in 2.34: sparse-checkout reapply will delete ignored
         (and tracked?) files. Helps with these leftover files.

     8.  Elijah: no current way to get out of that state, thank you for making
         sparse-checkout reapply do that

     9.  Stolee: noticed during experimental release to people from Office.
         Everything was slow because they had run build and left behind ignored
         files

     10. jrnieder: Piggy-backing on Dscho’s comment, there’s a database
         analogy: record intent (in the database case, that’s a transaction
         journal) before the non-atomic steps the act on that intent. Suggests
         maybe we should be updating the sparsity pattern before the checkout
         step

 9.  That’s it, that’s the status update what’s currently on the list.

 10. We have more plans, though.

 11. Idea: use git.git itself

     1. Tried it, but had to have 97% files to still be workable

     2. Could change the Makefile to accept that, say, po/ is missing

     3. Ævar: creates a lot of complexity for the build

     4. jrnieder: as VCS provider, what is our recommendation to build authors?
        Do we want them querying sparse checkout, do we want builds that Just
        Work in cone mode, do we want to treat sparse checkout as a thing that
        builds don’t need to support?

     5. Stolee: want build system to be able to tell Git about what needs to be
        checked out. “In-tree sparse checkout” (see below)

 12. Emily: we’re interested in sparse-checkout affecting the set of active
     submodules, just mentioning this as a heads-up

 13. [PATCH 00/10] [RFC] In-tree sparse-checkout definitions - Derrick Stolee
     via GitGitGadget
     (https://lore.kernel.org/git/pull.627.git.1588857462.gitgitgadget@gmail.com/)

 14. Victoria: today when you switch gears and work on something else you have
     to update the sparse checkout pattern

 15. Proposal here is to have in-tree sparse checkout definitions, e.g. a
     .gitdependencies file that lists, for the directories you’re working with,
     what other subdirectories they depend on

 16. That way, you get exactly the folders you need

 17. Stolee: office has their own tool “scoper” that figures out dependencies
     and runs “git sparse-checkout set” for the user. Is confusing when you
     rebase and need to remember to run it

 18. Currently lives in a hook, custom and built for one engineering system,
     want to generalize and make a standard feature

 19. Victoria: being built in to Git would make sense because it’s general
     enough to work in most monorepo environments.

 20. Involves two pieces: having git understand the dependencies and assemble
     your sparse checkout cone using them, and having the build system maintain
     and use sparse checkout correctly.

 21. Some build setups tolerate missing directories reasonably well. If we make
     .gitdependencies more of a first-class concept then we could go further
     and make build systems handle missing directories as something that would
     be expected

 22. C# .proj files link to dependencies on other .proj files with relative
     path. But in a solution file collecting all .proj files, it lists all of
     them and you need to have them all present. If a subdirectory isn’t
     present, proposal is to build what is there instead of everything.

 23. Tried another prototype on how to do this in Bazel. It has a rigorous
     definition of inputs and outputs, and based on that you could translate to
     a .gitdependencies file or sparse-checkout pattern.

 24. Microsoft’s buildxl has similar properties

 25. Victoria asks: how general is the above?

 26. brian: Many monorepos has multiple microservices. A cone can represent
     what a particular service needs to run.

 27. If you’re building one coherent product like Windows, you’re going to need
     some prebuilt artifacts that you pull down.

 28. jrnieder: Large monorepos often have strong remote build. Not everything
     you depend on is things that you need to have in source form locally

 29. CB: My team at Bloomberg has a teamwide “monorepo” (not Bloomberg-wide).
     We’re cmake based. Sparse checkout would be interesting for us. We’re
     experimenting with what’s called workspace builds: you have a thing you
     can build (a subdirectory), that you pull into the toplevel CMakeLists.txt
     as a single thing.

 30. With cmake you can declare a dependency with target_link_libraries. A
     dependency name can either be a cmake defined target in the codebase
     you’re building it, or it can be a pre-built library pulled in another
     way, e.g. importing via a pkg-config file.

 31. At build time if I decide I want to change that library, I’ll expand my
     sparse-checkout region, and rerun cmake to have it understand the newly
     available source.

 32. Optionality: I don’t have to have that source checked out, but when it’s
     present I want to use it.

 33. Victoria: sounds like in-tree sparse checkout is more of an intermediate
     step. Sometimes you want the source, sometimes you want to pull in an
     external artifact.

 34. Elijah: we have a monorepo, about the size of the Linux kernel. Multiple
     separate services, interconnected pieces. Using sparse-checkout required
     some code changes, refactoring that wasn’t just around the build system.
     We created a tool before the sparse-checkout command existed, using older
     mechanisms, and then switched to sparse-checkout when it came out. We
     track our dependencies ourselves --- you need this set of modules (3 or 4)
     or the modules relevant to a particular team, and it then computes the
     relevant directories to get. We had to make some changes to adopt cone
     mode but I like it and the changes it led to. Then you run the build
     system --- you have files that declare the dependencies, are they newer
     than .git/info/sparse-checkout? If not then recompute them again.

 35. Potentially would want to rerun the dependency generation after you run a
     rebase as well…

 36. If we track it in-tree, there are some interesting cases we’ll run into
     (merge conflicts on this generated file).

 37. Also, tracking dependencies in two places can result in difficulty, skew.
     Maybe can generate one from the other.

 38. Our sparse checkout tends to be build oriented “what do I need for this
     build”. But testing inverts the dependency graph, want to see what tests
     depend on this code. We encourage them to test in the cloud but not
     everyone does that, leads fewer people to use sparse checkout.

 39. There’s some remote build, mixing-and-matching pieces built remotely and
     locally.

 40. Part of working in a monorepo is you need strong tool hygiene enforcement.
     Without that, you get a ball of mud of dependencies. Adopting sparse
     checkout drove modularity.

 41. Ævar: I’d be interested in a summary

 42. Git’s lack of support for sparse checkout was unusual, so I think this
     topic is well explored by previous version control systems

^ permalink raw reply	[relevance 1%]

* Re: [RFC PATCH v4 00/10] Fix various issues around removal of untracked files/directories
  @ 2021-10-04 16:08  3%         ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-10-04 16:08 UTC (permalink / raw)
  To: Elijah Newren
  Cc: Git Mailing List, Junio C Hamano,
	Nguyễn Thái Ngọc Duy, Martin Ågren,
	Andrzej Hunt, Jeff King, Fedor Biryukov, Philip Oakley,
	Phillip Wood


On Mon, Oct 04 2021, Elijah Newren wrote:

> On Sun, Oct 3, 2021 at 6:12 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
>>
>> This is an RFC proposed v4 of Elijah's en/removing-untracked-fixes
>> series[1] based on top of my memory leak fixes in the "unpack-trees" &
>> "dir" APIs[2].
>>
>> As noted in [2] Elijah and I have been having a back & forth about the
>> approach his series takes to fixing memory leaks in those APIs. I
>> think submitting working code is more productive than continuing that
>> point-by-point discussion, so here we are.
>>
>> I've avoided making any changes to this series except those narrowly
>> required to rebase it on top of mine, and to those parts of Elijah's
>> commit messages that became outdated as a result. In particular
>> 3/10[3]'s is significantly changed, as much of its commit message
>> dicusses complexities that have gone away due to my preceding
>> series[2].
>>
>> The "make dir an internal-only struct" has been replaced by a commit
>> that renames that struct member from "dir" to "private_dir". I think
>> even that is unnecessary as argued in [4], but I think the judgement
>> that something must be done to address that is Elijah's design
>> decision, so I did my best to retain it.
>>
>> I did drop the dynamic allocation & it being a pointer, since with my
>> preceding [2] and subsequent unsubmitted memory leak fixes I've got on
>> top having it be embedded in "struct unpack_trees_options" makes
>> things easier to manage.
>>
>> Havingn read through all this code quite thoroughly at this point I do
>> have other comments on it, but I'll reserve those until we've found
>> out what direction we're going forward with vis-a-vis what this will
>> be based on top of.
>>
>> I'm (obviously) hoping for an answer of either on top of my series[2],
>> or alternatively that Elijah's series can stick to introducing the
>> "preserve_ignored" flag, but not change how the memory
>> management/name/type of the embedded "dir" happens (and we could thus
>> proceed in parallel).
>
> ???
>
> This really bothers me.  I'm not quite sure how to put this into
> words, so let me just try my best.  Let me start out by saying that I
> think you often provide good feedback and ideas.  Sure, I sometimes
> don't agree with some of the feedback or ideas, but overall your
> feedback and contributions are definitely valuable.  I also think your
> other series you rebased this on has some good ideas and some good
> bugfixes.  There is something that seems off here, though.

Just for Junio / anyone else following along: let's drop this RFC & the
relateded/proposed "unpack-trees & dir APIs: fix memory
leaks". Point-by-point commentary below (probably not needed/interesting
for those just interested in the state of those two serieses).

> In this particular case, to start with, Junio already said let's take
> v3 as-is[1].  So your series should be rebased on mine, not
> vice-versa.

I understand your annoyance at that, I wouldn't have submitted this if
I'd seen that before, I somehow managed to miss that mail in my mail
queue. I believed the status was at "Will merge to 'next'?" upthread of
[1].

We've then been having an extended back & forth about how to manage
"private" data/structs/leak patterns starting at
https://lore.kernel.org/git/87ilyjviiy.fsf@evledraar.gmail.com/.

At least some of which has been confused by my having quoted a working
but out of context diff from what I ended up submitting as
https://lore.kernel.org/git/cover-00.10-00000000000-20211004T002226Z-avarab@gmail.com/

So, sorry about stepping on your toes. I figured having a discussion
with working patches would be more productive, and that it would help
focus on the important changes in your series.

E.g. your 2nd and 3rd patch setup a "dir_clear()" that your 4th
consolidates, which as shown in this series are intermediate steps that
can be skipped. So perhaps there's some added churn, but also reduced
churn in your resulting series on top...

> Further while your other series that you are basing this on has some
> memory leak fixes; to me, it mostly looks like refactorings for
> stylistic code changes. [...]

Are you referring to the s/memset/UNPACK_TREES_OPTIONS_INIT/ bulk change
at the start?

I agree that it's not strictly necessary, but it's pretty much the same
as your earlier eceba532141 (dir: fix problematic API to avoid memory
leaks, 2020-08-18), and makes e.g. a later change you seemed to like
possible:
https://lore.kernel.org/git/CABPp-BFpyyJ-e8p5fbmCvyaEsfUow=RP45Nw0ckiwNEvVC4zrg@mail.gmail.com/

> Even though some of those stylistic changes
> are good, making a series such as mine that includes bugfixes (to a
> user reported bug no less), after multiple rounds and most reviewers
> are fine with it, suddenly depend on a new big and unrelated treewide
> stylistic refactoring series feels very off to me.  But that doesn't
> quite fully explain my misgivings either; there's a bit more:

[...]

>   * Junio has referred to several of your series as "Meh" and "code
> churn".  That makes me think we'd have a higher than normal chance of
> a user-reported bug ending up blocked on unrelated stylistic changes.
> (Two of them actually, since I have another series depending on this
> one that I've waited to submit until this merges to next.)

I'll stay out of this area for a while. Sorry about that.

> [...]
>   * You misrepresent my changes in multiple ways, including ways I had
> pointed out corrections for in our previous discussions (including
> some of which you acknowledged and agreed with), and you do so even
> after you have rebased my patches and added your signed-off-by to them
> suggesting you ought to be familiar with them[7].

You're absolutely right about that, and the comment starting at "*Sigh*"
in your linked [7] is entirely accurate. I'd like to apologize for that.

If I was in your shoes I'd be *very* annoyed at that chain from [7] to
the upthread cover-letter here making that false claim again.

For what it's worth I do know that your patches aren't allocating the
"struct dir_struct" on the heap, having rebased them etc. But through
some combination of a brainfart and it being late when I wrote that CL
last night I falsely claimed that they did, PBCAK.

What I *meant* to say was some summary that the your series's end state
has a pointer to a dir struct that's dynamically set up v.s. mine of
just initializing it via the macro from the start.

> So, I guess trying to distill what bugs me, I'd say: it seems to me
> that you have ignored what Junio said about taking my series, and then
> you rebased my series on top of unrelated stylistic churn, with that
> churn containing three issues that trigger ongoing misgivings I have
> about the care being put behind these refactorings, especially
> considering their value compared to the features and bugfixes we are
> getting, and you seem to fail to try to understand my changes and
> misrepresent them in the process.  I hope I'm not overreacting but
> something feels wrong to me here.

I don't think you're overreacting, and sorry again. Hopefully it helps
somewhat that I for the "ignoring Junio [and charging ahead with this]"
and the 2nd false claim about about heap allocation I was (believe it or
not) just honestly mistaken instead of trying to get on your nerves.

As some of my early feedback on the whole topic of gitignore
related-shredding/precious etc. should hopefully indicate I'm really
happy that you've picked up this topic.

I thought this would help it along, but that's clearly not the
case. Sorry again.

^ permalink raw reply	[relevance 3%]

* [RFC PATCH v4 01/10] t2500: add various tests for nuking untracked files
  @ 2021-10-04  1:11  9%       ` Ævar Arnfjörð Bjarmason
    1 sibling, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-10-04  1:11 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Elijah Newren,
	Nguyễn Thái Ngọc Duy, Martin Ågren,
	Andrzej Hunt, Jeff King, Fedor Biryukov, Philip Oakley,
	Phillip Wood, Ævar Arnfjörð Bjarmason

From: Elijah Newren <newren@gmail.com>

Noting that unpack_trees treats reset=1 & update=1 as license to nuke
untracked files, I looked for code paths that use this combination and
tried to generate testcases which demonstrated unintentional loss of
untracked files and directories.  I found several.

I also include testcases for `git reset --{hard,merge,keep}`.  A hard
reset is perhaps the most direct test of unpack_tree's reset=1 behavior,
but we cannot make `git reset --hard` preserve untracked files without
some migration work.

Also, the two commands `checkout --force` (because of the --force) and
`read-tree --reset` (because it's plumbing and we need to keep it
backward compatible) were left out as we expect those to continue
removing untracked files and directories.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100755 t/t2500-untracked-overwriting.sh

diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
new file mode 100755
index 00000000000..2412d121ea8
--- /dev/null
+++ b/t/t2500-untracked-overwriting.sh
@@ -0,0 +1,244 @@
+#!/bin/sh
+
+test_description='Test handling of overwriting untracked files'
+
+. ./test-lib.sh
+
+test_setup_reset () {
+	git init reset_$1 &&
+	(
+		cd reset_$1 &&
+		test_commit init &&
+
+		git branch stable &&
+		git branch work &&
+
+		git checkout work &&
+		test_commit foo &&
+
+		git checkout stable
+	)
+}
+
+test_expect_success 'reset --hard will nuke untracked files/dirs' '
+	test_setup_reset hard &&
+	(
+		cd reset_hard &&
+		git ls-tree -r stable &&
+		git log --all --name-status --oneline &&
+		git ls-tree -r work &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		echo foo >expect &&
+
+		git reset --hard work &&
+
+		# check that untracked directory foo.t/ was nuked
+		test_path_is_file foo.t &&
+		test_cmp expect foo.t
+	)
+'
+
+test_expect_success 'reset --merge will preserve untracked files/dirs' '
+	test_setup_reset merge &&
+	(
+		cd reset_merge &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating .foo.t. would lose untracked files" error
+	)
+'
+
+test_expect_success 'reset --keep will preserve untracked files/dirs' '
+	test_setup_reset keep &&
+	(
+		cd reset_keep &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating.*foo.t.*would lose untracked files" error
+	)
+'
+
+test_setup_checkout_m () {
+	git init checkout &&
+	(
+		cd checkout &&
+		test_commit init &&
+
+		test_write_lines file has some >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		git branch stable &&
+
+		git switch -c work &&
+		echo stuff >notes.txt &&
+		test_write_lines file has some words >filler &&
+		git add notes.txt filler &&
+		git commit -m filler &&
+
+		git checkout stable
+	)
+}
+
+test_expect_failure 'checkout -m does not nuke untracked file' '
+	test_setup_checkout_m &&
+	(
+		cd checkout &&
+
+		# Tweak filler
+		test_write_lines this file has some >filler &&
+		# Make an untracked file, save its contents in "expect"
+		echo precious >notes.txt &&
+		cp notes.txt expect &&
+
+		test_must_fail git checkout -m work &&
+		test_cmp expect notes.txt
+	)
+'
+
+test_setup_sequencing () {
+	git init sequencing_$1 &&
+	(
+		cd sequencing_$1 &&
+		test_commit init &&
+
+		test_write_lines this file has some words >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		mkdir -p foo/bar &&
+		test_commit foo/bar/baz &&
+
+		git branch simple &&
+		git branch fooey &&
+
+		git checkout fooey &&
+		git rm foo/bar/baz.t &&
+		echo stuff >>filler &&
+		git add -u &&
+		git commit -m "changes" &&
+
+		git checkout simple &&
+		echo items >>filler &&
+		echo newstuff >>newfile &&
+		git add filler newfile &&
+		git commit -m another
+	)
+}
+
+test_expect_failure 'git rebase --abort and untracked files' '
+	test_setup_sequencing rebase_abort_and_untracked &&
+	(
+		cd sequencing_rebase_abort_and_untracked &&
+		git checkout fooey &&
+		test_must_fail git rebase simple &&
+
+		cat init.t &&
+		git rm init.t &&
+		echo precious >init.t &&
+		cp init.t expect &&
+		git status --porcelain &&
+		test_must_fail git rebase --abort &&
+		test_cmp expect init.t
+	)
+'
+
+test_expect_failure 'git rebase fast forwarding and untracked files' '
+	test_setup_sequencing rebase_fast_forward_and_untracked &&
+	(
+		cd sequencing_rebase_fast_forward_and_untracked &&
+		git checkout init &&
+		echo precious >filler &&
+		cp filler expect &&
+		test_must_fail git rebase init simple &&
+		test_cmp expect filler
+	)
+'
+
+test_expect_failure 'git rebase --autostash and untracked files' '
+	test_setup_sequencing rebase_autostash_and_untracked &&
+	(
+		cd sequencing_rebase_autostash_and_untracked &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git rebase --autostash init &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git stash and untracked files' '
+	test_setup_sequencing stash_and_untracked_files &&
+	(
+		cd sequencing_stash_and_untracked_files &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git status --porcelain &&
+		git stash push &&
+		git status --porcelain &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git am --abort and untracked dir vs. unmerged file' '
+	test_setup_sequencing am_abort_and_untracked &&
+	(
+		cd sequencing_am_abort_and_untracked &&
+		git format-patch -1 --stdout fooey >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete the conflicted file; we will stage and commit it later
+		rm filler &&
+
+		# Put an unrelated untracked directory there
+		mkdir filler &&
+		echo foo >filler/file1 &&
+		echo bar >filler/file2 &&
+
+		test_must_fail git am --abort 2>errors &&
+		test_path_is_dir filler &&
+		grep "Updating .filler. would lose untracked files in it" errors
+	)
+'
+
+test_expect_failure 'git am --skip and untracked dir vs deleted file' '
+	test_setup_sequencing am_skip_and_untracked &&
+	(
+		cd sequencing_am_skip_and_untracked &&
+		git checkout fooey &&
+		git format-patch -1 --stdout simple >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete newfile
+		rm newfile &&
+
+		# Put an unrelated untracked directory there
+		mkdir newfile &&
+		echo foo >newfile/file1 &&
+		echo bar >newfile/file2 &&
+
+		# Change our mind about resolutions, just skip this patch
+		test_must_fail git am --skip 2>errors &&
+		test_path_is_dir newfile &&
+		grep "Updating .newfile. would lose untracked files in it" errors
+	)
+'
+
+test_done
-- 
2.33.0.1404.g83021034c5d


^ permalink raw reply related	[relevance 9%]

* Re: Should help.autocorrect be on by default?
  2021-09-30 17:15  4% Should help.autocorrect be on by default? Brian Bartels
@ 2021-09-30 23:16  0% ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-09-30 23:16 UTC (permalink / raw)
  To: Brian Bartels; +Cc: git


On Thu, Sep 30 2021, Brian Bartels wrote:

> This would save developers precious inner loop time. I looked at the
> code and it already handles cases where the environment isn't
> interactive. So this should be a pretty minor configuration change.
>
> Let me know what you think,
> Brian

I haven't looked myself, but it's very informative to browse the list
archives at https://lore.kernel.org/git/ (search for help.autocorrect)
to see if this has been brought up before, whether there were any
arguments for/against, or if it was just an arbitrary (or careful due to
a new feature) default at the time.

That and trying your hand at flipping the default via a patch, running
the tests, seeing if any fail & fixing them is also a good way to both
get the ball rolling, and to discover any past opinions about what
should/shouldn't be the default added as code/tests at the time.

^ permalink raw reply	[relevance 0%]

* Should help.autocorrect be on by default?
@ 2021-09-30 17:15  4% Brian Bartels
  2021-09-30 23:16  0% ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Brian Bartels @ 2021-09-30 17:15 UTC (permalink / raw)
  To: git

This would save developers precious inner loop time. I looked at the
code and it already handles cases where the environment isn't
interactive. So this should be a pretty minor configuration change.

Let me know what you think,
Brian

^ permalink raw reply	[relevance 4%]

* [PATCH v3 01/11] t2500: add various tests for nuking untracked files
  2021-09-27 16:33  4%   ` [PATCH v3 00/11] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
@ 2021-09-27 16:33  9%     ` Elijah Newren via GitGitGadget
      2 siblings, 0 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-27 16:33 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Philip Oakley, Phillip Wood, Elijah Newren, Eric Sunshine,
	Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

Noting that unpack_trees treats reset=1 & update=1 as license to nuke
untracked files, I looked for code paths that use this combination and
tried to generate testcases which demonstrated unintentional loss of
untracked files and directories.  I found several.

I also include testcases for `git reset --{hard,merge,keep}`.  A hard
reset is perhaps the most direct test of unpack_tree's reset=1 behavior,
but we cannot make `git reset --hard` preserve untracked files without
some migration work.

Also, the two commands `checkout --force` (because of the --force) and
`read-tree --reset` (because it's plumbing and we need to keep it
backward compatible) were left out as we expect those to continue
removing untracked files and directories.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100755 t/t2500-untracked-overwriting.sh

diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
new file mode 100755
index 00000000000..2412d121ea8
--- /dev/null
+++ b/t/t2500-untracked-overwriting.sh
@@ -0,0 +1,244 @@
+#!/bin/sh
+
+test_description='Test handling of overwriting untracked files'
+
+. ./test-lib.sh
+
+test_setup_reset () {
+	git init reset_$1 &&
+	(
+		cd reset_$1 &&
+		test_commit init &&
+
+		git branch stable &&
+		git branch work &&
+
+		git checkout work &&
+		test_commit foo &&
+
+		git checkout stable
+	)
+}
+
+test_expect_success 'reset --hard will nuke untracked files/dirs' '
+	test_setup_reset hard &&
+	(
+		cd reset_hard &&
+		git ls-tree -r stable &&
+		git log --all --name-status --oneline &&
+		git ls-tree -r work &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		echo foo >expect &&
+
+		git reset --hard work &&
+
+		# check that untracked directory foo.t/ was nuked
+		test_path_is_file foo.t &&
+		test_cmp expect foo.t
+	)
+'
+
+test_expect_success 'reset --merge will preserve untracked files/dirs' '
+	test_setup_reset merge &&
+	(
+		cd reset_merge &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating .foo.t. would lose untracked files" error
+	)
+'
+
+test_expect_success 'reset --keep will preserve untracked files/dirs' '
+	test_setup_reset keep &&
+	(
+		cd reset_keep &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating.*foo.t.*would lose untracked files" error
+	)
+'
+
+test_setup_checkout_m () {
+	git init checkout &&
+	(
+		cd checkout &&
+		test_commit init &&
+
+		test_write_lines file has some >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		git branch stable &&
+
+		git switch -c work &&
+		echo stuff >notes.txt &&
+		test_write_lines file has some words >filler &&
+		git add notes.txt filler &&
+		git commit -m filler &&
+
+		git checkout stable
+	)
+}
+
+test_expect_failure 'checkout -m does not nuke untracked file' '
+	test_setup_checkout_m &&
+	(
+		cd checkout &&
+
+		# Tweak filler
+		test_write_lines this file has some >filler &&
+		# Make an untracked file, save its contents in "expect"
+		echo precious >notes.txt &&
+		cp notes.txt expect &&
+
+		test_must_fail git checkout -m work &&
+		test_cmp expect notes.txt
+	)
+'
+
+test_setup_sequencing () {
+	git init sequencing_$1 &&
+	(
+		cd sequencing_$1 &&
+		test_commit init &&
+
+		test_write_lines this file has some words >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		mkdir -p foo/bar &&
+		test_commit foo/bar/baz &&
+
+		git branch simple &&
+		git branch fooey &&
+
+		git checkout fooey &&
+		git rm foo/bar/baz.t &&
+		echo stuff >>filler &&
+		git add -u &&
+		git commit -m "changes" &&
+
+		git checkout simple &&
+		echo items >>filler &&
+		echo newstuff >>newfile &&
+		git add filler newfile &&
+		git commit -m another
+	)
+}
+
+test_expect_failure 'git rebase --abort and untracked files' '
+	test_setup_sequencing rebase_abort_and_untracked &&
+	(
+		cd sequencing_rebase_abort_and_untracked &&
+		git checkout fooey &&
+		test_must_fail git rebase simple &&
+
+		cat init.t &&
+		git rm init.t &&
+		echo precious >init.t &&
+		cp init.t expect &&
+		git status --porcelain &&
+		test_must_fail git rebase --abort &&
+		test_cmp expect init.t
+	)
+'
+
+test_expect_failure 'git rebase fast forwarding and untracked files' '
+	test_setup_sequencing rebase_fast_forward_and_untracked &&
+	(
+		cd sequencing_rebase_fast_forward_and_untracked &&
+		git checkout init &&
+		echo precious >filler &&
+		cp filler expect &&
+		test_must_fail git rebase init simple &&
+		test_cmp expect filler
+	)
+'
+
+test_expect_failure 'git rebase --autostash and untracked files' '
+	test_setup_sequencing rebase_autostash_and_untracked &&
+	(
+		cd sequencing_rebase_autostash_and_untracked &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git rebase --autostash init &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git stash and untracked files' '
+	test_setup_sequencing stash_and_untracked_files &&
+	(
+		cd sequencing_stash_and_untracked_files &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git status --porcelain &&
+		git stash push &&
+		git status --porcelain &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git am --abort and untracked dir vs. unmerged file' '
+	test_setup_sequencing am_abort_and_untracked &&
+	(
+		cd sequencing_am_abort_and_untracked &&
+		git format-patch -1 --stdout fooey >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete the conflicted file; we will stage and commit it later
+		rm filler &&
+
+		# Put an unrelated untracked directory there
+		mkdir filler &&
+		echo foo >filler/file1 &&
+		echo bar >filler/file2 &&
+
+		test_must_fail git am --abort 2>errors &&
+		test_path_is_dir filler &&
+		grep "Updating .filler. would lose untracked files in it" errors
+	)
+'
+
+test_expect_failure 'git am --skip and untracked dir vs deleted file' '
+	test_setup_sequencing am_skip_and_untracked &&
+	(
+		cd sequencing_am_skip_and_untracked &&
+		git checkout fooey &&
+		git format-patch -1 --stdout simple >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete newfile
+		rm newfile &&
+
+		# Put an unrelated untracked directory there
+		mkdir newfile &&
+		echo foo >newfile/file1 &&
+		echo bar >newfile/file2 &&
+
+		# Change our mind about resolutions, just skip this patch
+		test_must_fail git am --skip 2>errors &&
+		test_path_is_dir newfile &&
+		grep "Updating .newfile. would lose untracked files in it" errors
+	)
+'
+
+test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 9%]

* [PATCH v3 00/11] Fix various issues around removal of untracked files/directories
  2021-09-24  6:37  4% ` [PATCH v2 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
  2021-09-24  6:37  9%   ` [PATCH v2 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
  @ 2021-09-27 16:33  4%   ` Elijah Newren via GitGitGadget
  2021-09-27 16:33  9%     ` [PATCH v3 01/11] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
                       ` (2 more replies)
  2 siblings, 3 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-27 16:33 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Philip Oakley, Phillip Wood, Elijah Newren, Eric Sunshine,
	Elijah Newren

We have multiple codepaths that delete untracked files/directories but
shouldn't. There are also some codepaths where we delete untracked
files/directories intentionally (based on mailing list discussion), but
where that intent is not documented. We also have some codepaths that
preserve ignored files, which shouldn't. Fix the documentation, add several
new (mostly failing) testcases, fix some of the new testcases, and add
comments about some potential remaining problems. (I found these as a
side-effect of looking at [1], though [2] pointed out one explicitly while I
was working on it.)

Note that I'm using Junio's declaration about checkout -f and reset --hard
(and also presuming that since read-tree --reset is porcelain that its
behavior should be left alone)[3] in this series.

Changes since v2 (all due to Junio's request to consolidate
unpack_trees_options.dir handling):

 * fix some (pre-existing) memory leaks, in preparation for consolidating
   some common code (new patch 2)
 * New patches (3 & 6) to make a few more commands remove ignored files by
   default -- which also fixes an existing testcase
 * New patches (4 & 5) to consolidate the various places handling
   unpack_trees_options.dir and default to treating ignored files as
   expendable within unpack_trees(). These change also make it very easy to
   add --no-overwrite-ignore options in the future to additional commands
   (checkout and merge already have such an option, though merge only passes
   that along to the fast-forwarding backend)

Changes since v1:

 * Various small cleanups (suggested by Ævar)
 * Fixed memory leaks of unpack_trees_opts->dir (also suggested by Ævar)
 * Use an enum for unpack_trees_options->reset, instead of multiple fields
   (suggested by Phillip)
 * Avoid changing behavior for cases not setting unpack_trees_options.reset
   > 0 (even if it may make sense to nuke ignored files when running either
   read-tree -m -u or the various reset flavors run internally by
   rebase/sequencer); we can revisit that later.

SIDENOTE about treating ignored files as precious:

The patches are now getting pretty close to being able to handle ignored
files as precious. The only things left would be making merge pass the
--no-overwrite-ignore option along to more backends, and adding the
--no-overwrite-ignore option that both checkout and merge take to more
commands. There's already comments in the code about what boolean would need
to be set by that flag. And then perhaps also make a global
core.overwrite_ignored config option to affect all of these. Granted, doing
this would globally treat ignored files as precious rather than allowing
them to be configured on a per-path basis, but honestly I think the idea of
configuring ignored files as precious on a per-path basis sounds like
insanity. (We have enough bugs with untracked and ignored files without
adding yet another type. And, of course, configuring per-path rules sounds
like lots of work for end users to configure. There may be additional
reasons against it.) So, if someone wants to pursue the precious-ignored
concept then I'd much rather see it done as a global setting. Just my $0.02.

[1] https://lore.kernel.org/git/xmqqv93n7q1v.fsf@gitster.g/ [2]
https://lore.kernel.org/git/C357A648-8B13-45C3-9388-C0C7F7D40DAE@gmail.com/
[3] https://lore.kernel.org/git/xmqqr1e2ejs9.fsf@gitster.g/

Elijah Newren (11):
  t2500: add various tests for nuking untracked files
  checkout, read-tree: fix leak of unpack_trees_options.dir
  read-tree, merge-recursive: overwrite ignored files by default
  unpack-trees: introduce preserve_ignored to unpack_trees_options
  unpack-trees: make dir an internal-only struct
  Remove ignored files by default when they are in the way
  Change unpack_trees' 'reset' flag into an enum
  unpack-trees: avoid nuking untracked dir in way of unmerged file
  unpack-trees: avoid nuking untracked dir in way of locally deleted
    file
  Comment important codepaths regarding nuking untracked files/dirs
  Documentation: call out commands that nuke untracked files/directories

 Documentation/git-checkout.txt   |   5 +-
 Documentation/git-read-tree.txt  |  23 +--
 Documentation/git-reset.txt      |   3 +-
 builtin/am.c                     |   3 +-
 builtin/checkout.c               |  10 +-
 builtin/clone.c                  |   1 +
 builtin/merge.c                  |   1 +
 builtin/read-tree.c              |  26 ++--
 builtin/reset.c                  |  10 +-
 builtin/stash.c                  |   5 +-
 builtin/submodule--helper.c      |   4 +
 contrib/rerere-train.sh          |   2 +-
 merge-ort.c                      |   8 +-
 merge-recursive.c                |   5 +-
 merge.c                          |   8 +-
 reset.c                          |   3 +-
 sequencer.c                      |   1 +
 submodule.c                      |   1 +
 t/t1013-read-tree-submodule.sh   |   1 -
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 t/t7112-reset-submodule.sh       |   1 -
 unpack-trees.c                   |  61 +++++++-
 unpack-trees.h                   |  14 +-
 23 files changed, 366 insertions(+), 74 deletions(-)
 create mode 100755 t/t2500-untracked-overwriting.sh


base-commit: ddb1055343948e0d0bc81f8d20245f1ada6430a0
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1036%2Fnewren%2Funtracked_removal-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1036/newren/untracked_removal-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1036

Range-diff vs v2:

  1:  9460a49c7ed =  1:  66270ffc74e t2500: add various tests for nuking untracked files
  -:  ----------- >  2:  0c74285b253 checkout, read-tree: fix leak of unpack_trees_options.dir
  -:  ----------- >  3:  2501a0c552a read-tree, merge-recursive: overwrite ignored files by default
  -:  ----------- >  4:  f1a0700e598 unpack-trees: introduce preserve_ignored to unpack_trees_options
  -:  ----------- >  5:  0d119142778 unpack-trees: make dir an internal-only struct
  -:  ----------- >  6:  b7fe354efff Remove ignored files by default when they are in the way
  2:  b77692b8f49 !  7:  9eb20121fc3 Change unpack_trees' 'reset' flag into an enum
     @@ Commit message
          (i.e. "true") can be split into two:
             UNPACK_RESET_PROTECT_UNTRACKED,
             UNPACK_RESET_OVERWRITE_UNTRACKED
     -    In order to catch accidental misuses, define with the enum a special
     -    value of
     +    In order to catch accidental misuses (i.e. where folks call it the way
     +    they traditionally used to), define the special enum value of
             UNPACK_RESET_INVALID = 1
          which will trigger a BUG().
      
     @@ Commit message
             numerous callers from rebase/sequencer to reset_head()
          will use the new UNPACK_RESET_PROTECT_UNTRACKED value.
      
     -    In order to protect untracked files but still allow deleting of ignored
     -    files, we also have to setup unpack_trees_opt.dir.  It may make sense to
     -    set up unpack_trees_opt.dir in more cases, but here I tried to only do
     -    so in cases where we switched from deleting all untracked files to
     -    avoiding doing so (i.e. where we now use
     -    UNPACK_RESET_PROTECT_UNTRACKED).
     +    Also, note that it has been reported that 'git checkout <treeish>
     +    <pathspec>' currently also allows overwriting untracked files[1].  That
     +    case should also be fixed, but it does not use unpack_trees() and thus
     +    is outside the scope of the current changes.
      
     -    Also, note that 'git checkout <pathspec>' currently also allows
     -    overwriting untracked files.  That case should also be fixed, but it
     -    does not use unpack_trees() and thus is outside the scope of the current
     -    changes.
     +    [1] https://lore.kernel.org/git/15dad590-087e-5a48-9238-5d2826950506@gmail.com/
      
          Signed-off-by: Elijah Newren <newren@gmail.com>
      
     @@ builtin/am.c: static int fast_forward_to(struct tree *head, struct tree *remote,
       	opts.update = 1;
       	opts.merge = 1;
      -	opts.reset = reset;
     +-	if (!reset)
     +-		opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
      +	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
     ++	opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
       	opts.fn = twoway_merge;
     -+	if (opts.reset) {
     -+		/* Allow ignored files in the way to get overwritten */
     -+		opts.dir = xcalloc(1, sizeof(*opts.dir));
     -+		opts.dir->flags |= DIR_SHOW_IGNORED;
     -+		setup_standard_excludes(opts.dir);
     -+	}
       	init_tree_desc(&t[0], head->buffer, head->size);
       	init_tree_desc(&t[1], remote->buffer, remote->size);
     - 
     -@@ builtin/am.c: static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
     - 		return -1;
     - 	}
     - 
     -+	if (opts.reset) {
     -+		dir_clear(opts.dir);
     -+		FREE_AND_NULL(opts.dir);
     -+	}
     -+
     - 	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
     - 		die(_("unable to write new index file"));
     - 
      
       ## builtin/checkout.c ##
      @@ builtin/checkout.c: static int reset_tree(struct tree *tree, const struct checkout_opts *o,
     - {
     - 	struct unpack_trees_options opts;
     - 	struct tree_desc tree_desc;
     -+	int unpack_trees_ret;
     - 
     - 	memset(&opts, 0, sizeof(opts));
       	opts.head_idx = -1;
       	opts.update = worktree;
       	opts.skip_unmerged = !worktree;
      -	opts.reset = 1;
      +	opts.reset = o->force ? UNPACK_RESET_OVERWRITE_UNTRACKED :
      +				UNPACK_RESET_PROTECT_UNTRACKED;
     ++	opts.preserve_ignored = (!o->force && !o->overwrite_ignore);
       	opts.merge = 1;
     +-	opts.preserve_ignored = 0;
       	opts.fn = oneway_merge;
       	opts.verbose_update = o->show_progress;
       	opts.src_index = &the_index;
     - 	opts.dst_index = &the_index;
     -+	if (o->overwrite_ignore) {
     -+		opts.dir = xcalloc(1, sizeof(*opts.dir));
     -+		opts.dir->flags |= DIR_SHOW_IGNORED;
     -+		setup_standard_excludes(opts.dir);
     -+	}
     - 	init_checkout_metadata(&opts.meta, info->refname,
     - 			       info->commit ? &info->commit->object.oid : null_oid(),
     - 			       NULL);
     - 	parse_tree(tree);
     - 	init_tree_desc(&tree_desc, tree->buffer, tree->size);
     --	switch (unpack_trees(1, &tree_desc, &opts)) {
     -+	unpack_trees_ret = unpack_trees(1, &tree_desc, &opts);
     -+
     -+	if (o->overwrite_ignore) {
     -+		dir_clear(opts.dir);
     -+		FREE_AND_NULL(opts.dir);
     -+	}
     -+
     -+	switch (unpack_trees_ret) {
     - 	case -2:
     - 		*writeout_error = 1;
     - 		/*
      
       ## builtin/read-tree.c ##
      @@ builtin/read-tree.c: int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
     @@ builtin/read-tree.c: int cmd_read_tree(int argc, const char **argv, const char *
       	 *
      
       ## builtin/reset.c ##
     -@@
     - #define USE_THE_INDEX_COMPATIBILITY_MACROS
     - #include "builtin.h"
     - #include "config.h"
     -+#include "dir.h"
     - #include "lockfile.h"
     - #include "tag.h"
     - #include "object.h"
      @@ builtin/reset.c: static int reset_index(const char *ref, const struct object_id *oid, int reset_t
       		break;
       	case HARD:
     @@ builtin/reset.c: static int reset_index(const char *ref, const struct object_id
       	default:
      -		opts.reset = 1;
      +		BUG("invalid reset_type passed to reset_index");
     -+	}
     -+	if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
     -+		/* Setup opts.dir so we can overwrite ignored files */
     -+		opts.dir = xcalloc(1, sizeof(*opts.dir));
     -+		opts.dir->flags |= DIR_SHOW_IGNORED;
     -+		setup_standard_excludes(opts.dir);
       	}
       
       	read_cache_unmerged();
     -@@ builtin/reset.c: static int reset_index(const char *ref, const struct object_id *oid, int reset_t
     - 	ret = 0;
     - 
     - out:
     -+	if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
     -+		dir_clear(opts.dir);
     -+		FREE_AND_NULL(opts.dir);
     -+	}
     - 	for (i = 0; i < nr; i++)
     - 		free((void *)desc[i].buffer);
     - 	return ret;
      
       ## builtin/stash.c ##
     -@@ builtin/stash.c: static int reset_tree(struct object_id *i_tree, int update, int reset)
     - 	struct tree_desc t[MAX_UNPACK_TREES];
     - 	struct tree *tree;
     - 	struct lock_file lock_file = LOCK_INIT;
     -+	int unpack_trees_ret;
     - 
     - 	read_cache_preload(NULL);
     - 	if (refresh_cache(REFRESH_QUIET))
      @@ builtin/stash.c: static int reset_tree(struct object_id *i_tree, int update, int reset)
       	opts.src_index = &the_index;
       	opts.dst_index = &the_index;
       	opts.merge = 1;
      -	opts.reset = reset;
      +	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
     -+	if (opts.reset) {
     -+		opts.dir = xcalloc(1, sizeof(*opts.dir));
     -+		opts.dir->flags |= DIR_SHOW_IGNORED;
     -+		setup_standard_excludes(opts.dir);
     -+	}
       	opts.update = update;
     +-	if (update && !reset)
     ++	if (update)
     + 		opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
       	opts.fn = oneway_merge;
       
     --	if (unpack_trees(nr_trees, t, &opts))
     -+	unpack_trees_ret = unpack_trees(nr_trees, t, &opts);
     -+
     -+	if (opts.reset) {
     -+		dir_clear(opts.dir);
     -+		FREE_AND_NULL(opts.dir);
     -+	}
     -+
     -+	if (unpack_trees_ret)
     - 		return -1;
     - 
     - 	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
      
       ## reset.c ##
     -@@
     - #include "git-compat-util.h"
     - #include "cache-tree.h"
     -+#include "dir.h"
     - #include "lockfile.h"
     - #include "refs.h"
     - #include "reset.h"
      @@ reset.c: int reset_head(struct repository *r, struct object_id *oid, const char *action,
     - 	unpack_tree_opts.update = 1;
     - 	unpack_tree_opts.merge = 1;
     + 	unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
       	init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL);
     --	if (!detach_head)
     + 	if (!detach_head)
      -		unpack_tree_opts.reset = 1;
     -+	if (!detach_head) {
      +		unpack_tree_opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
     -+		unpack_tree_opts.dir = xcalloc(1, sizeof(*unpack_tree_opts.dir));
     -+		unpack_tree_opts.dir->flags |= DIR_SHOW_IGNORED;
     -+		setup_standard_excludes(unpack_tree_opts.dir);
     -+	}
       
       	if (repo_read_index_unmerged(r) < 0) {
       		ret = error(_("could not read index"));
     -@@ reset.c: reset_head_refs:
     - 			    oid_to_hex(oid), "1", NULL);
     - 
     - leave_reset_head:
     -+	if (unpack_tree_opts.dir) {
     -+		dir_clear(unpack_tree_opts.dir);
     -+		FREE_AND_NULL(unpack_tree_opts.dir);
     -+	}
     - 	strbuf_release(&msg);
     - 	rollback_lock_file(&lock);
     - 	clear_unpack_trees_porcelain(&unpack_tree_opts);
      
       ## t/t2500-untracked-overwriting.sh ##
      @@ t/t2500-untracked-overwriting.sh: test_setup_checkout_m () {
     @@ t/t2500-untracked-overwriting.sh: test_expect_failure 'git rebase --abort and un
      
       ## unpack-trees.c ##
      @@ unpack-trees.c: int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
     - 	struct pattern_list pl;
       	int free_pattern_list = 0;
     + 	struct dir_struct dir = DIR_INIT;
       
      +	if (o->reset == UNPACK_RESET_INVALID)
      +		BUG("o->reset had a value of 1; should be UNPACK_TREES_*_UNTRACKED");
      +
       	if (len > MAX_UNPACK_TREES)
       		die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
     + 	if (o->dir)
     +@@ unpack-trees.c: int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
     + 		ensure_full_index(o->dst_index);
     + 	}
       
     ++	if (o->reset == UNPACK_RESET_OVERWRITE_UNTRACKED &&
     ++	    o->preserve_ignored)
     ++		BUG("UNPACK_RESET_OVERWRITE_UNTRACKED incompatible with preserved ignored files");
     ++
     + 	if (!o->preserve_ignored) {
     + 		o->dir = &dir;
     + 		o->dir->flags |= DIR_SHOW_IGNORED;
      @@ unpack-trees.c: static int verify_absent_1(const struct cache_entry *ce,
       	int len;
       	struct stat st;
     @@ unpack-trees.h: void setup_unpack_trees_porcelain(struct unpack_trees_options *o
      -		     merge,
      +	unsigned int merge,
       		     update,
     + 		     preserve_ignored,
       		     clone,
     - 		     index_only,
      @@ unpack-trees.h: struct unpack_trees_options {
       		     exiting_early,
       		     show_all_errors,
     @@ unpack-trees.h: struct unpack_trees_options {
      +	enum unpack_trees_reset_type reset;
       	const char *prefix;
       	int cache_bottom;
     - 	struct dir_struct *dir;
     + 	struct pathspec *pathspec;
  3:  208f3b3ebe5 =  8:  e4c42d43b09 unpack-trees: avoid nuking untracked dir in way of unmerged file
  4:  0a0997d081b =  9:  1a770681704 unpack-trees: avoid nuking untracked dir in way of locally deleted file
  5:  4b78a526d2a ! 10:  6b42a80bf3d Comment important codepaths regarding nuking untracked files/dirs
     @@ Commit message
            * git-archimport.perl: Don't care; arch is long since dead
            * git-cvs*.perl: Don't care; cvs is long since dead
      
     +    Also, the reset --hard in builtin/worktree.c looks safe, due to only
     +    running in an empty directory.
     +
          Signed-off-by: Elijah Newren <newren@gmail.com>
      
       ## builtin/stash.c ##
     @@ builtin/submodule--helper.c: static int add_submodule(const struct add_data *add
       
       		if (add_data->branch) {
      
     - ## builtin/worktree.c ##
     -@@ builtin/worktree.c: static int add_worktree(const char *path, const char *refname,
     - 	if (opts->checkout) {
     - 		cp.argv = NULL;
     - 		strvec_clear(&cp.args);
     -+		/*
     -+		 * NOTE: reset --hard is okay here, because 'worktree add'
     -+		 * refuses to work in an extant non-empty directory, so there
     -+		 * is no risk of deleting untracked files.
     -+		 */
     - 		strvec_pushl(&cp.args, "reset", "--hard", "--no-recurse-submodules", NULL);
     - 		if (opts->quiet)
     - 			strvec_push(&cp.args, "--quiet");
     -
       ## contrib/rerere-train.sh ##
      @@ contrib/rerere-train.sh: do
       		git checkout -q $commit -- .
  6:  993451a8036 = 11:  de416f887d7 Documentation: call out commands that nuke untracked files/directories

-- 
gitgitgadget

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2 2/6] Change unpack_trees' 'reset' flag into an enum
  2021-09-24 17:35  5%     ` Junio C Hamano
@ 2021-09-26  6:50  0%       ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2021-09-26  6:50 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Elijah Newren via GitGitGadget, git,
	Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Philip Oakley, Phillip Wood

On Fri, Sep 24, 2021 at 10:35 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > Also, note that 'git checkout <pathspec>' currently also allows
> > overwriting untracked files.  That case should also be fixed, ...
>
> I wasted a few minutes wondering about the example.  Please make it
> clear that you are checking out of a tree-ish that is different from
> HEAD, as there will by definition no "overwriting untracked" if you
> are checking out of the index.
>
> E.g. "git checkout <tree-ish> -- <pathspec>".
>
> With this command line:
>
>    $ git checkout HEAD~24 -- path
>
> where path used to be there as late as 24 revisions ago, but since
> then we removed, and the user wants to materialize the file out of
> the old version, path, be it tracked, untracked, or even a
> directory, should be made identical to the copy from the given
> version, no?  Where does the "should also be fixed" come from?

Sorry, I should have been more careful.  Phillip noted this other case
that overwrote untracked files and suggested mentioning it; see
https://lore.kernel.org/git/acef3628-9542-d777-2534-577de9707e15@gmail.com/
and the links from there.  Perhaps I would have been better off
mentioning that link and the other links in it.

> > diff --git a/builtin/am.c b/builtin/am.c
> > index c79e0167e98..b17baa67ad8 100644
> > --- a/builtin/am.c
> > +++ b/builtin/am.c
> > @@ -1918,8 +1918,14 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
> >       opts.dst_index = &the_index;
> >       opts.update = 1;
> >       opts.merge = 1;
> > -     opts.reset = reset;
> > +     opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
> >       opts.fn = twoway_merge;
> > +     if (opts.reset) {
> > +             /* Allow ignored files in the way to get overwritten */
> > +             opts.dir = xcalloc(1, sizeof(*opts.dir));
> > +             opts.dir->flags |= DIR_SHOW_IGNORED;
> > +             setup_standard_excludes(opts.dir);
>
> Do these three lines make a recurring pattern when opts.reset is set?
> I am wondering if this can be done more centrally by the unpack-trees
> machinery (i.e. "gee this one has o->reset set to X, so let's set up
> the o->dir before doing anything").

It's a very common pattern...but not universal due to some prevailing
weirdness and differences in how commands handle ignored files.  But,
it looks like that can be fixed up, and then this can be centralized.
I've got some patches doing this.

> > diff --git a/builtin/checkout.c b/builtin/checkout.c
> > index b5d477919a7..52826e0d145 100644
> > --- a/builtin/checkout.c
> > +++ b/builtin/checkout.c
> > @@ -641,23 +641,37 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
> >  {
> >       struct unpack_trees_options opts;
> >       struct tree_desc tree_desc;
> > +     int unpack_trees_ret;
> >
> >       memset(&opts, 0, sizeof(opts));
> >       opts.head_idx = -1;
> >       opts.update = worktree;
> >       opts.skip_unmerged = !worktree;
> > -     opts.reset = 1;
> > +     opts.reset = o->force ? UNPACK_RESET_OVERWRITE_UNTRACKED :
> > +                             UNPACK_RESET_PROTECT_UNTRACKED;
> >       opts.merge = 1;
> >       opts.fn = oneway_merge;
> >       opts.verbose_update = o->show_progress;
> >       opts.src_index = &the_index;
> >       opts.dst_index = &the_index;
> > +     if (o->overwrite_ignore) {
> > +             opts.dir = xcalloc(1, sizeof(*opts.dir));
> > +             opts.dir->flags |= DIR_SHOW_IGNORED;
> > +             setup_standard_excludes(opts.dir);
> > +     }
>
> If our longer term goal is to decide classification of files not in
> the index (currently, "ignored" and "untracked", but we may want to
> add a new "precious" class) and (across various commands that build
> on the unpack-trees infrastructure) to protect the "untracked" and
> "precious" ones, with --[no-]overwrite-{ignore,untracked} options as
> escape hatches, uniformly, perhaps the --[no-]-overwrite-ignore
> option may be stolen from here and shifted to unpack_tree_options to
> help us going in that direction?  This is just an observation for
> longer term, not a suggestion to include the first step for such a
> move in this series.

I had thought about that, but I was already pretty deep down the
rabbit hole of trying to avoid removing the current working directory
as a side effect of other commands.  I noted in my cover letter the
--no-overwrite-ignore options and how they could be used building on
this series, and now you bring it up too.  And your previous comment
about the common pattern for unpack_trees_options.dir forces me to go
further down this hole a bit.  So, I've got patches that implement a
fair amount of this, but doesn't actually add the new
--no-overwrite-ignore options or plumb them through.  They do,
however, add a FIXME comment where a single boolean value could be set
in order to make such options work.

>
> >       init_checkout_metadata(&opts.meta, info->refname,
> >                              info->commit ? &info->commit->object.oid : null_oid(),
> >                              NULL);
> >       parse_tree(tree);
> >       init_tree_desc(&tree_desc, tree->buffer, tree->size);
> > -     switch (unpack_trees(1, &tree_desc, &opts)) {
> > +     unpack_trees_ret = unpack_trees(1, &tree_desc, &opts);
> > +
> > +     if (o->overwrite_ignore) {
> > +             dir_clear(opts.dir);
> > +             FREE_AND_NULL(opts.dir);
>
> This dir_clear() is also a recurring theme.  See below.
>
> > +     }
> > +
> > +     switch (unpack_trees_ret) {
> >       case -2:
> >               *writeout_error = 1;
> >               /*
> > diff --git a/builtin/read-tree.c b/builtin/read-tree.c
> > index 485e7b04794..740fc0335af 100644
> > --- a/builtin/read-tree.c
> > +++ b/builtin/read-tree.c
> > @@ -174,6 +174,9 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
> >       if (1 < opts.merge + opts.reset + prefix_set)
> >               die("Which one? -m, --reset, or --prefix?");
> >
> > +     if (opts.reset)
> > +             opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED;
> > +
>
> We do not do anything about opts.dir here by default, which means we
> by default do not overwrite ignored, but that's OK, because this old
> command explicitly takes --exclude-per-directory to tell it what the
> command should consider "ignored" and with the option given we do
> prepare opts.dir just fine.
>
> > diff --git a/builtin/reset.c b/builtin/reset.c
> > index 43e855cb887..a12ee986e9f 100644
> > --- a/builtin/reset.c
> > +++ b/builtin/reset.c
> > @@ -10,6 +10,7 @@
> >  #define USE_THE_INDEX_COMPATIBILITY_MACROS
> >  #include "builtin.h"
> >  #include "config.h"
> > +#include "dir.h"
> >  #include "lockfile.h"
> >  #include "tag.h"
> >  #include "object.h"
> > @@ -70,9 +71,20 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t
> >               break;
> >       case HARD:
> >               opts.update = 1;
> > -             /* fallthrough */
> > +             opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED;
> > +             break;
> > +     case MIXED:
> > +             opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
> > +             /* but opts.update=0, so working tree not updated */
> > +             break;
> >       default:
> > -             opts.reset = 1;
> > +             BUG("invalid reset_type passed to reset_index");
> > +     }
> > +     if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
>
> Unlike the one in "am", this cares .reset being a particular value,
> not just being non-zero.  Puzzling.
>
> It is a bit counter-intuitive in that we do not allow overwrite
> ignored (which is currently a synonym for "expendable") when .reset
> is set to allow us to ovewrite untracked.

No, when opts.reset == UNPACK_RESET_NUKE_UNTRACKED, unpack_trees() has
no way to differentiate between untracked and ignored and thus just
deletes them all.  Setting up unpack_trees_options.dir so that we can
differentiate between untracked and ignored files when we are just
going to treat them the same (delete them both) is wasted effort.  So
the check for a certain type of reset value was merely an
optimization.  (And that optimization didn't apply in the am case,
since it doesn't use UNPACK_RESET_NUKE_UNTRACKED.)

However, consolidating the unpack_trees_options.dir handling into
unpack_trees() allows me to better document the optimization and only
worry about it in one place, which seems to make the code much
clearer.

>
> > +             /* Setup opts.dir so we can overwrite ignored files */
> > +             opts.dir = xcalloc(1, sizeof(*opts.dir));
> > +             opts.dir->flags |= DIR_SHOW_IGNORED;
> > +             setup_standard_excludes(opts.dir);
>
> > @@ -104,6 +116,10 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t
> >       ret = 0;
> >
> >  out:
> > +     if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
> > +             dir_clear(opts.dir);
> > +             FREE_AND_NULL(opts.dir);
>
> This dir_clear() is also a recurring theme.  See below.
>
> > diff --git a/builtin/stash.c b/builtin/stash.c
> > index 8f42360ca91..563f590afbd 100644
> > --- a/builtin/stash.c
> > +++ b/builtin/stash.c
> > @@ -237,6 +237,7 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
> >       struct tree_desc t[MAX_UNPACK_TREES];
> >       struct tree *tree;
> >       struct lock_file lock_file = LOCK_INIT;
> > +     int unpack_trees_ret;
> >
> >       read_cache_preload(NULL);
> >       if (refresh_cache(REFRESH_QUIET))
> > @@ -256,11 +257,23 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
> >       opts.src_index = &the_index;
> >       opts.dst_index = &the_index;
> >       opts.merge = 1;
> > -     opts.reset = reset;
> > +     opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
> > +     if (opts.reset) {
> > +             opts.dir = xcalloc(1, sizeof(*opts.dir));
> > +             opts.dir->flags |= DIR_SHOW_IGNORED;
> > +             setup_standard_excludes(opts.dir);
> > +     }
> >       opts.update = update;
> >       opts.fn = oneway_merge;
> >
> > -     if (unpack_trees(nr_trees, t, &opts))
> > +     unpack_trees_ret = unpack_trees(nr_trees, t, &opts);
> > +
> > +     if (opts.reset) {
> > +             dir_clear(opts.dir);
> > +             FREE_AND_NULL(opts.dir);
>
> This dir_clear() is also a recurring theme.  Why aren't their guards
> uniformly "if (opts.dir)"?  The logic to decide if we set up opts.dir
> or not may be far from here and may be different from code path to
> code path, but the need to clear opts.dir should not have to care
> why opts.dir was populated, no?

Yeah, you're right; I should have used "if (opts.dir)" for all these cases.

> > +     }
> > +
> > +     if (unpack_trees_ret)
> >               return -1;
> >
> >       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
> > diff --git a/reset.c b/reset.c
> > index 79310ae071b..1695f3828c5 100644
> > --- a/reset.c
> > +++ b/reset.c
> > @@ -1,5 +1,6 @@
> >  #include "git-compat-util.h"
> >  #include "cache-tree.h"
> > +#include "dir.h"
> >  #include "lockfile.h"
> >  #include "refs.h"
> >  #include "reset.h"
> > @@ -57,8 +58,12 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action,
> >       unpack_tree_opts.update = 1;
> >       unpack_tree_opts.merge = 1;
> >       init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL);
> > -     if (!detach_head)
> > -             unpack_tree_opts.reset = 1;
> > +     if (!detach_head) {
> > +             unpack_tree_opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
> > +             unpack_tree_opts.dir = xcalloc(1, sizeof(*unpack_tree_opts.dir));
> > +             unpack_tree_opts.dir->flags |= DIR_SHOW_IGNORED;
> > +             setup_standard_excludes(unpack_tree_opts.dir);
> > +     }
> >
> >       if (repo_read_index_unmerged(r) < 0) {
> >               ret = error(_("could not read index"));
> > @@ -131,6 +136,10 @@ reset_head_refs:
> >                           oid_to_hex(oid), "1", NULL);
> >
> >  leave_reset_head:
> > +     if (unpack_tree_opts.dir) {
> > +             dir_clear(unpack_tree_opts.dir);
> > +             FREE_AND_NULL(unpack_tree_opts.dir);
>
> Yes, I think this is the right way to decide if we call dir_clear(),
> and all other hunks in this patch should do the same.

Will fix, though the consolidation ends up making it just one place anyway.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 2/6] Change unpack_trees' 'reset' flag into an enum
  @ 2021-09-24 17:35  5%     ` Junio C Hamano
  2021-09-26  6:50  0%       ` Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2021-09-24 17:35 UTC (permalink / raw)
  To: Elijah Newren via GitGitGadget
  Cc: git, Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Philip Oakley, Phillip Wood, Elijah Newren

"Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:

> Also, note that 'git checkout <pathspec>' currently also allows
> overwriting untracked files.  That case should also be fixed, ...

I wasted a few minutes wondering about the example.  Please make it
clear that you are checking out of a tree-ish that is different from
HEAD, as there will by definition no "overwriting untracked" if you
are checking out of the index.

E.g. "git checkout <tree-ish> -- <pathspec>".

With this command line:

   $ git checkout HEAD~24 -- path

where path used to be there as late as 24 revisions ago, but since
then we removed, and the user wants to materialize the file out of
the old version, path, be it tracked, untracked, or even a
directory, should be made identical to the copy from the given
version, no?  Where does the "should also be fixed" come from?

> diff --git a/builtin/am.c b/builtin/am.c
> index c79e0167e98..b17baa67ad8 100644
> --- a/builtin/am.c
> +++ b/builtin/am.c
> @@ -1918,8 +1918,14 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
>  	opts.dst_index = &the_index;
>  	opts.update = 1;
>  	opts.merge = 1;
> -	opts.reset = reset;
> +	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
>  	opts.fn = twoway_merge;
> +	if (opts.reset) {
> +		/* Allow ignored files in the way to get overwritten */
> +		opts.dir = xcalloc(1, sizeof(*opts.dir));
> +		opts.dir->flags |= DIR_SHOW_IGNORED;
> +		setup_standard_excludes(opts.dir);

Do these three lines make a recurring pattern when opts.reset is set?
I am wondering if this can be done more centrally by the unpack-trees
machinery (i.e. "gee this one has o->reset set to X, so let's set up
the o->dir before doing anything").

> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index b5d477919a7..52826e0d145 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -641,23 +641,37 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
>  {
>  	struct unpack_trees_options opts;
>  	struct tree_desc tree_desc;
> +	int unpack_trees_ret;
>  
>  	memset(&opts, 0, sizeof(opts));
>  	opts.head_idx = -1;
>  	opts.update = worktree;
>  	opts.skip_unmerged = !worktree;
> -	opts.reset = 1;
> +	opts.reset = o->force ? UNPACK_RESET_OVERWRITE_UNTRACKED :
> +				UNPACK_RESET_PROTECT_UNTRACKED;
>  	opts.merge = 1;
>  	opts.fn = oneway_merge;
>  	opts.verbose_update = o->show_progress;
>  	opts.src_index = &the_index;
>  	opts.dst_index = &the_index;
> +	if (o->overwrite_ignore) {
> +		opts.dir = xcalloc(1, sizeof(*opts.dir));
> +		opts.dir->flags |= DIR_SHOW_IGNORED;
> +		setup_standard_excludes(opts.dir);
> +	}

If our longer term goal is to decide classification of files not in
the index (currently, "ignored" and "untracked", but we may want to
add a new "precious" class) and (across various commands that build
on the unpack-trees infrastructure) to protect the "untracked" and
"precious" ones, with --[no-]overwrite-{ignore,untracked} options as
escape hatches, uniformly, perhaps the --[no-]-overwrite-ignore
option may be stolen from here and shifted to unpack_tree_options to
help us going in that direction?  This is just an observation for
longer term, not a suggestion to include the first step for such a
move in this series.

>  	init_checkout_metadata(&opts.meta, info->refname,
>  			       info->commit ? &info->commit->object.oid : null_oid(),
>  			       NULL);
>  	parse_tree(tree);
>  	init_tree_desc(&tree_desc, tree->buffer, tree->size);
> -	switch (unpack_trees(1, &tree_desc, &opts)) {
> +	unpack_trees_ret = unpack_trees(1, &tree_desc, &opts);
> +
> +	if (o->overwrite_ignore) {
> +		dir_clear(opts.dir);
> +		FREE_AND_NULL(opts.dir);

This dir_clear() is also a recurring theme.  See below.

> +	}
> +
> +	switch (unpack_trees_ret) {
>  	case -2:
>  		*writeout_error = 1;
>  		/*
> diff --git a/builtin/read-tree.c b/builtin/read-tree.c
> index 485e7b04794..740fc0335af 100644
> --- a/builtin/read-tree.c
> +++ b/builtin/read-tree.c
> @@ -174,6 +174,9 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
>  	if (1 < opts.merge + opts.reset + prefix_set)
>  		die("Which one? -m, --reset, or --prefix?");
>  
> +	if (opts.reset)
> +		opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED;
> +

We do not do anything about opts.dir here by default, which means we
by default do not overwrite ignored, but that's OK, because this old
command explicitly takes --exclude-per-directory to tell it what the
command should consider "ignored" and with the option given we do
prepare opts.dir just fine.

> diff --git a/builtin/reset.c b/builtin/reset.c
> index 43e855cb887..a12ee986e9f 100644
> --- a/builtin/reset.c
> +++ b/builtin/reset.c
> @@ -10,6 +10,7 @@
>  #define USE_THE_INDEX_COMPATIBILITY_MACROS
>  #include "builtin.h"
>  #include "config.h"
> +#include "dir.h"
>  #include "lockfile.h"
>  #include "tag.h"
>  #include "object.h"
> @@ -70,9 +71,20 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t
>  		break;
>  	case HARD:
>  		opts.update = 1;
> -		/* fallthrough */
> +		opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED;
> +		break;
> +	case MIXED:
> +		opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
> +		/* but opts.update=0, so working tree not updated */
> +		break;
>  	default:
> -		opts.reset = 1;
> +		BUG("invalid reset_type passed to reset_index");
> +	}
> +	if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {

Unlike the one in "am", this cares .reset being a particular value,
not just being non-zero.  Puzzling.

It is a bit counter-intuitive in that we do not allow overwrite
ignored (which is currently a synonym for "expendable") when .reset
is set to allow us to ovewrite untracked.

> +		/* Setup opts.dir so we can overwrite ignored files */
> +		opts.dir = xcalloc(1, sizeof(*opts.dir));
> +		opts.dir->flags |= DIR_SHOW_IGNORED;
> +		setup_standard_excludes(opts.dir);

> @@ -104,6 +116,10 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t
>  	ret = 0;
>  
>  out:
> +	if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
> +		dir_clear(opts.dir);
> +		FREE_AND_NULL(opts.dir);

This dir_clear() is also a recurring theme.  See below.

> diff --git a/builtin/stash.c b/builtin/stash.c
> index 8f42360ca91..563f590afbd 100644
> --- a/builtin/stash.c
> +++ b/builtin/stash.c
> @@ -237,6 +237,7 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
>  	struct tree_desc t[MAX_UNPACK_TREES];
>  	struct tree *tree;
>  	struct lock_file lock_file = LOCK_INIT;
> +	int unpack_trees_ret;
>  
>  	read_cache_preload(NULL);
>  	if (refresh_cache(REFRESH_QUIET))
> @@ -256,11 +257,23 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
>  	opts.src_index = &the_index;
>  	opts.dst_index = &the_index;
>  	opts.merge = 1;
> -	opts.reset = reset;
> +	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
> +	if (opts.reset) {
> +		opts.dir = xcalloc(1, sizeof(*opts.dir));
> +		opts.dir->flags |= DIR_SHOW_IGNORED;
> +		setup_standard_excludes(opts.dir);
> +	}
>  	opts.update = update;
>  	opts.fn = oneway_merge;
>  
> -	if (unpack_trees(nr_trees, t, &opts))
> +	unpack_trees_ret = unpack_trees(nr_trees, t, &opts);
> +
> +	if (opts.reset) {
> +		dir_clear(opts.dir);
> +		FREE_AND_NULL(opts.dir);

This dir_clear() is also a recurring theme.  Why aren't their guards
uniformly "if (opts.dir)"?  The logic to decide if we set up opts.dir
or not may be far from here and may be different from code path to
code path, but the need to clear opts.dir should not have to care
why opts.dir was populated, no?


> +	}
> +
> +	if (unpack_trees_ret)
>  		return -1;
>  
>  	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
> diff --git a/reset.c b/reset.c
> index 79310ae071b..1695f3828c5 100644
> --- a/reset.c
> +++ b/reset.c
> @@ -1,5 +1,6 @@
>  #include "git-compat-util.h"
>  #include "cache-tree.h"
> +#include "dir.h"
>  #include "lockfile.h"
>  #include "refs.h"
>  #include "reset.h"
> @@ -57,8 +58,12 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action,
>  	unpack_tree_opts.update = 1;
>  	unpack_tree_opts.merge = 1;
>  	init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL);
> -	if (!detach_head)
> -		unpack_tree_opts.reset = 1;
> +	if (!detach_head) {
> +		unpack_tree_opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
> +		unpack_tree_opts.dir = xcalloc(1, sizeof(*unpack_tree_opts.dir));
> +		unpack_tree_opts.dir->flags |= DIR_SHOW_IGNORED;
> +		setup_standard_excludes(unpack_tree_opts.dir);
> +	}
>  
>  	if (repo_read_index_unmerged(r) < 0) {
>  		ret = error(_("could not read index"));
> @@ -131,6 +136,10 @@ reset_head_refs:
>  			    oid_to_hex(oid), "1", NULL);
>  
>  leave_reset_head:
> +	if (unpack_tree_opts.dir) {
> +		dir_clear(unpack_tree_opts.dir);
> +		FREE_AND_NULL(unpack_tree_opts.dir);

Yes, I think this is the right way to decide if we call dir_clear(),
and all other hunks in this patch should do the same.

> +	}
>  	strbuf_release(&msg);
>  	rollback_lock_file(&lock);
>  	clear_unpack_trees_porcelain(&unpack_tree_opts);
> diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
> index 2412d121ea8..18604360df8 100755
> --- a/t/t2500-untracked-overwriting.sh
> +++ b/t/t2500-untracked-overwriting.sh
> @@ -92,7 +92,7 @@ test_setup_checkout_m () {
>  	)
>  }
>  
> -test_expect_failure 'checkout -m does not nuke untracked file' '
> +test_expect_success 'checkout -m does not nuke untracked file' '
>  	test_setup_checkout_m &&
>  	(
>  		cd checkout &&
> @@ -138,7 +138,7 @@ test_setup_sequencing () {
>  	)
>  }
>  
> -test_expect_failure 'git rebase --abort and untracked files' '
> +test_expect_success 'git rebase --abort and untracked files' '
>  	test_setup_sequencing rebase_abort_and_untracked &&
>  	(
>  		cd sequencing_rebase_abort_and_untracked &&
> @@ -155,7 +155,7 @@ test_expect_failure 'git rebase --abort and untracked files' '
>  	)
>  '
>  
> -test_expect_failure 'git rebase fast forwarding and untracked files' '
> +test_expect_success 'git rebase fast forwarding and untracked files' '
>  	test_setup_sequencing rebase_fast_forward_and_untracked &&
>  	(
>  		cd sequencing_rebase_fast_forward_and_untracked &&
> diff --git a/unpack-trees.c b/unpack-trees.c
> index 5786645f315..fcbe63bbed9 100644
> --- a/unpack-trees.c
> +++ b/unpack-trees.c
> @@ -1693,6 +1693,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
>  	struct pattern_list pl;
>  	int free_pattern_list = 0;
>  
> +	if (o->reset == UNPACK_RESET_INVALID)
> +		BUG("o->reset had a value of 1; should be UNPACK_TREES_*_UNTRACKED");
> +
>  	if (len > MAX_UNPACK_TREES)
>  		die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
>  
> @@ -2218,7 +2221,8 @@ static int verify_absent_1(const struct cache_entry *ce,
>  	int len;
>  	struct stat st;
>  
> -	if (o->index_only || o->reset || !o->update)
> +	if (o->index_only || !o->update ||
> +	    o->reset == UNPACK_RESET_OVERWRITE_UNTRACKED)
>  		return 0;
>  
>  	len = check_leading_path(ce->name, ce_namelen(ce), 0);
> diff --git a/unpack-trees.h b/unpack-trees.h
> index 2d88b19dca7..1f386fb16cc 100644
> --- a/unpack-trees.h
> +++ b/unpack-trees.h
> @@ -45,9 +45,15 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
>   */
>  void clear_unpack_trees_porcelain(struct unpack_trees_options *opts);
>  
> +enum unpack_trees_reset_type {
> +	UNPACK_RESET_NONE = 0,    /* traditional "false" value; still valid */
> +	UNPACK_RESET_INVALID = 1, /* "true" no longer valid; use below values */
> +	UNPACK_RESET_PROTECT_UNTRACKED,
> +	UNPACK_RESET_OVERWRITE_UNTRACKED
> +};
> +
>  struct unpack_trees_options {
> -	unsigned int reset,
> -		     merge,
> +	unsigned int merge,
>  		     update,
>  		     clone,
>  		     index_only,
> @@ -64,6 +70,7 @@ struct unpack_trees_options {
>  		     exiting_early,
>  		     show_all_errors,
>  		     dry_run;
> +	enum unpack_trees_reset_type reset;
>  	const char *prefix;
>  	int cache_bottom;
>  	struct dir_struct *dir;

^ permalink raw reply	[relevance 5%]

* [PATCH v2 1/6] t2500: add various tests for nuking untracked files
  2021-09-24  6:37  4% ` [PATCH v2 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
@ 2021-09-24  6:37  9%   ` Elijah Newren via GitGitGadget
    2021-09-27 16:33  4%   ` [PATCH v3 00/11] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
  2 siblings, 0 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-24  6:37 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Philip Oakley, Phillip Wood, Elijah Newren, Elijah Newren,
	Elijah Newren

From: Elijah Newren <newren@gmail.com>

Noting that unpack_trees treats reset=1 & update=1 as license to nuke
untracked files, I looked for code paths that use this combination and
tried to generate testcases which demonstrated unintentional loss of
untracked files and directories.  I found several.

I also include testcases for `git reset --{hard,merge,keep}`.  A hard
reset is perhaps the most direct test of unpack_tree's reset=1 behavior,
but we cannot make `git reset --hard` preserve untracked files without
some migration work.

Also, the two commands `checkout --force` (because of the --force) and
`read-tree --reset` (because it's plumbing and we need to keep it
backward compatible) were left out as we expect those to continue
removing untracked files and directories.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100755 t/t2500-untracked-overwriting.sh

diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
new file mode 100755
index 00000000000..2412d121ea8
--- /dev/null
+++ b/t/t2500-untracked-overwriting.sh
@@ -0,0 +1,244 @@
+#!/bin/sh
+
+test_description='Test handling of overwriting untracked files'
+
+. ./test-lib.sh
+
+test_setup_reset () {
+	git init reset_$1 &&
+	(
+		cd reset_$1 &&
+		test_commit init &&
+
+		git branch stable &&
+		git branch work &&
+
+		git checkout work &&
+		test_commit foo &&
+
+		git checkout stable
+	)
+}
+
+test_expect_success 'reset --hard will nuke untracked files/dirs' '
+	test_setup_reset hard &&
+	(
+		cd reset_hard &&
+		git ls-tree -r stable &&
+		git log --all --name-status --oneline &&
+		git ls-tree -r work &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		echo foo >expect &&
+
+		git reset --hard work &&
+
+		# check that untracked directory foo.t/ was nuked
+		test_path_is_file foo.t &&
+		test_cmp expect foo.t
+	)
+'
+
+test_expect_success 'reset --merge will preserve untracked files/dirs' '
+	test_setup_reset merge &&
+	(
+		cd reset_merge &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating .foo.t. would lose untracked files" error
+	)
+'
+
+test_expect_success 'reset --keep will preserve untracked files/dirs' '
+	test_setup_reset keep &&
+	(
+		cd reset_keep &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating.*foo.t.*would lose untracked files" error
+	)
+'
+
+test_setup_checkout_m () {
+	git init checkout &&
+	(
+		cd checkout &&
+		test_commit init &&
+
+		test_write_lines file has some >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		git branch stable &&
+
+		git switch -c work &&
+		echo stuff >notes.txt &&
+		test_write_lines file has some words >filler &&
+		git add notes.txt filler &&
+		git commit -m filler &&
+
+		git checkout stable
+	)
+}
+
+test_expect_failure 'checkout -m does not nuke untracked file' '
+	test_setup_checkout_m &&
+	(
+		cd checkout &&
+
+		# Tweak filler
+		test_write_lines this file has some >filler &&
+		# Make an untracked file, save its contents in "expect"
+		echo precious >notes.txt &&
+		cp notes.txt expect &&
+
+		test_must_fail git checkout -m work &&
+		test_cmp expect notes.txt
+	)
+'
+
+test_setup_sequencing () {
+	git init sequencing_$1 &&
+	(
+		cd sequencing_$1 &&
+		test_commit init &&
+
+		test_write_lines this file has some words >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		mkdir -p foo/bar &&
+		test_commit foo/bar/baz &&
+
+		git branch simple &&
+		git branch fooey &&
+
+		git checkout fooey &&
+		git rm foo/bar/baz.t &&
+		echo stuff >>filler &&
+		git add -u &&
+		git commit -m "changes" &&
+
+		git checkout simple &&
+		echo items >>filler &&
+		echo newstuff >>newfile &&
+		git add filler newfile &&
+		git commit -m another
+	)
+}
+
+test_expect_failure 'git rebase --abort and untracked files' '
+	test_setup_sequencing rebase_abort_and_untracked &&
+	(
+		cd sequencing_rebase_abort_and_untracked &&
+		git checkout fooey &&
+		test_must_fail git rebase simple &&
+
+		cat init.t &&
+		git rm init.t &&
+		echo precious >init.t &&
+		cp init.t expect &&
+		git status --porcelain &&
+		test_must_fail git rebase --abort &&
+		test_cmp expect init.t
+	)
+'
+
+test_expect_failure 'git rebase fast forwarding and untracked files' '
+	test_setup_sequencing rebase_fast_forward_and_untracked &&
+	(
+		cd sequencing_rebase_fast_forward_and_untracked &&
+		git checkout init &&
+		echo precious >filler &&
+		cp filler expect &&
+		test_must_fail git rebase init simple &&
+		test_cmp expect filler
+	)
+'
+
+test_expect_failure 'git rebase --autostash and untracked files' '
+	test_setup_sequencing rebase_autostash_and_untracked &&
+	(
+		cd sequencing_rebase_autostash_and_untracked &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git rebase --autostash init &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git stash and untracked files' '
+	test_setup_sequencing stash_and_untracked_files &&
+	(
+		cd sequencing_stash_and_untracked_files &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git status --porcelain &&
+		git stash push &&
+		git status --porcelain &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git am --abort and untracked dir vs. unmerged file' '
+	test_setup_sequencing am_abort_and_untracked &&
+	(
+		cd sequencing_am_abort_and_untracked &&
+		git format-patch -1 --stdout fooey >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete the conflicted file; we will stage and commit it later
+		rm filler &&
+
+		# Put an unrelated untracked directory there
+		mkdir filler &&
+		echo foo >filler/file1 &&
+		echo bar >filler/file2 &&
+
+		test_must_fail git am --abort 2>errors &&
+		test_path_is_dir filler &&
+		grep "Updating .filler. would lose untracked files in it" errors
+	)
+'
+
+test_expect_failure 'git am --skip and untracked dir vs deleted file' '
+	test_setup_sequencing am_skip_and_untracked &&
+	(
+		cd sequencing_am_skip_and_untracked &&
+		git checkout fooey &&
+		git format-patch -1 --stdout simple >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete newfile
+		rm newfile &&
+
+		# Put an unrelated untracked directory there
+		mkdir newfile &&
+		echo foo >newfile/file1 &&
+		echo bar >newfile/file2 &&
+
+		# Change our mind about resolutions, just skip this patch
+		test_must_fail git am --skip 2>errors &&
+		test_path_is_dir newfile &&
+		grep "Updating .newfile. would lose untracked files in it" errors
+	)
+'
+
+test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 9%]

* [PATCH v2 0/6] Fix various issues around removal of untracked files/directories
  2021-09-18 23:15  6% [PATCH 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
  2021-09-18 23:15  9% ` [PATCH 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
@ 2021-09-24  6:37  4% ` Elijah Newren via GitGitGadget
  2021-09-24  6:37  9%   ` [PATCH v2 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
                     ` (2 more replies)
  1 sibling, 3 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-24  6:37 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Philip Oakley, Phillip Wood, Elijah Newren, Elijah Newren

This series depends on en/am-abort-fix.

We have multiple codepaths that delete untracked files/directories but
shouldn't. There are also some codepaths where we delete untracked
files/directories intentionally (based on mailing list discussion), but
where that intent is not documented. Fix the documentation, add several new
(mostly failing) testcases, fix some of the new testcases, and add comments
about some potential remaining problems. (I found these as a side-effect of
looking at [1], though [2] pointed out one explicitly while I was working on
it.)

Note that I'm using Junio's declaration about checkout -f and reset --hard
(and also presuming that since read-tree --reset is porcelain that its
behavior should be left alone)[3] in this series.

Changes since v1:

 * Various small cleanups (suggested by Ævar)
 * Fixed memory leaks of unpack_trees_opts->dir (also suggested by Ævar)
 * Use an enum for unpack_trees_options->reset, instead of multiple fields
   (suggested by Phillip)
 * Avoid changing behavior for cases not setting unpack_trees_options.reset
   > 0 (even if it may make sense to nuke ignored files when running either
   read-tree -m -u or the various reset flavors run internally by
   rebase/sequencer); we can revisit that later.

SIDENOTE about treating (some) ignored files as precious:

There's another related topic here that came up in the mailing list threads
that is separate even if similar: namely, treating ignored files as precious
instead of deleting them. I do not try to handle that here, but I believe
that would actually be relatively easy to handle. If you leave
unpack_trees_options->dir as NULL, then ignored files are treated as
precious (my original patch 2 made that mistake). There's a few other
locations that already optionally set up unpack_trees_options->dir (a quick
search for "overwrite_ignore" and "overwrite-ignore" will find them), so
we'd just need to implement that option flag in more places corresponding to
the new callsites (and perhaps make a global core.overwrite_ignored config
option to affect all of these). Of course, doing so would globally treat
ignored files as precious rather than allowing them to be configured on a
per-path basis, but honestly I think the idea of configuring ignored files
as precious on a per-path basis sounds like insanity. (We have enough bugs
with untracked and ignored files without adding yet another type. Also,
tla/baz was excessively confusing to me due in part to the number of types
of files and I'd rather not see such ideas ported to git. And, of course,
configuring per-path rules sounds like lots of work for end users to
configure. There may be additional reasons against it.) So, if someone wants
to pursue the precious-ignored concept then I'd much rather see it done as a
global setting. Just my $0.02.

[1] https://lore.kernel.org/git/xmqqv93n7q1v.fsf@gitster.g/ [2]
https://lore.kernel.org/git/C357A648-8B13-45C3-9388-C0C7F7D40DAE@gmail.com/
[3] https://lore.kernel.org/git/xmqqr1e2ejs9.fsf@gitster.g/

Elijah Newren (6):
  t2500: add various tests for nuking untracked files
  Change unpack_trees' 'reset' flag into an enum
  unpack-trees: avoid nuking untracked dir in way of unmerged file
  unpack-trees: avoid nuking untracked dir in way of locally deleted
    file
  Comment important codepaths regarding nuking untracked files/dirs
  Documentation: call out commands that nuke untracked files/directories

 Documentation/git-checkout.txt   |   5 +-
 Documentation/git-read-tree.txt  |   5 +-
 Documentation/git-reset.txt      |   3 +-
 builtin/am.c                     |  13 +-
 builtin/checkout.c               |  18 ++-
 builtin/read-tree.c              |   3 +
 builtin/reset.c                  |  20 ++-
 builtin/stash.c                  |  18 ++-
 builtin/submodule--helper.c      |   4 +
 builtin/worktree.c               |   5 +
 contrib/rerere-train.sh          |   2 +-
 reset.c                          |  13 +-
 submodule.c                      |   1 +
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 unpack-trees.c                   |  44 +++++-
 unpack-trees.h                   |  11 +-
 16 files changed, 387 insertions(+), 22 deletions(-)
 create mode 100755 t/t2500-untracked-overwriting.sh


base-commit: c5ead19ea282a288e01d86536349a4ae4a093e4b
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1036%2Fnewren%2Funtracked_removal-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1036/newren/untracked_removal-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1036

Range-diff vs v1:

 1:  b634136a74b ! 1:  9460a49c7ed t2500: add various tests for nuking untracked files
     @@ t/t2500-untracked-overwriting.sh (new)
      +. ./test-lib.sh
      +
      +test_setup_reset () {
     -+	test_create_repo reset_$1 &&
     ++	git init reset_$1 &&
      +	(
      +		cd reset_$1 &&
      +		test_commit init &&
     @@ t/t2500-untracked-overwriting.sh (new)
      +
      +		test_must_fail git reset --merge work 2>error &&
      +		test_cmp expect foo.t/file &&
     -+		grep "Updating.*foo.t.*would lose untracked files" error
     ++		grep "Updating .foo.t. would lose untracked files" error
      +	)
      +'
      +
     @@ t/t2500-untracked-overwriting.sh (new)
      +'
      +
      +test_setup_checkout_m () {
     -+	test_create_repo checkout &&
     ++	git init checkout &&
      +	(
      +		cd checkout &&
      +		test_commit init &&
     @@ t/t2500-untracked-overwriting.sh (new)
      +'
      +
      +test_setup_sequencing () {
     -+	test_create_repo sequencing_$1 &&
     ++	git init sequencing_$1 &&
      +	(
      +		cd sequencing_$1 &&
      +		test_commit init &&
 2:  45bd05a945f ! 2:  b77692b8f49 Split unpack_trees 'reset' flag into two for untracked handling
     @@ Metadata
      Author: Elijah Newren <newren@gmail.com>
      
       ## Commit message ##
     -    Split unpack_trees 'reset' flag into two for untracked handling
     +    Change unpack_trees' 'reset' flag into an enum
      
          Traditionally, unpack_trees_options->reset was used to signal that it
          was okay to delete any untracked files in the way.  This was used by
          `git read-tree --reset`, but then started appearing in other places as
          well.  However, many of the other uses should not be deleting untracked
     -    files in the way.  Split this into two separate fields:
     -       reset_nuke_untracked
     -       reset_keep_untracked
     -    and, since many code paths in unpack_trees need to be followed for both
     -    of these flags, introduce a third one for convenience:
     -       reset_either
     -    which is simply an or-ing of the other two.
     +    files in the way.  Change this value to an enum so that a value of 1
     +    (i.e. "true") can be split into two:
     +       UNPACK_RESET_PROTECT_UNTRACKED,
     +       UNPACK_RESET_OVERWRITE_UNTRACKED
     +    In order to catch accidental misuses, define with the enum a special
     +    value of
     +       UNPACK_RESET_INVALID = 1
     +    which will trigger a BUG().
      
          Modify existing callers so that
             read-tree --reset
             reset --hard
             checkout --force
     -    continue using reset_nuke_untracked, but so that other callers,
     -    including
     +    continue using the UNPACK_RESET_OVERWRITE_UNTRACKED logic, while other
     +    callers, including
             am
             checkout without --force
             stash  (though currently dead code; reset always had a value of 0)
             numerous callers from rebase/sequencer to reset_head()
     -    will use the new reset_keep_untracked field.
     +    will use the new UNPACK_RESET_PROTECT_UNTRACKED value.
     +
     +    In order to protect untracked files but still allow deleting of ignored
     +    files, we also have to setup unpack_trees_opt.dir.  It may make sense to
     +    set up unpack_trees_opt.dir in more cases, but here I tried to only do
     +    so in cases where we switched from deleting all untracked files to
     +    avoiding doing so (i.e. where we now use
     +    UNPACK_RESET_PROTECT_UNTRACKED).
     +
     +    Also, note that 'git checkout <pathspec>' currently also allows
     +    overwriting untracked files.  That case should also be fixed, but it
     +    does not use unpack_trees() and thus is outside the scope of the current
     +    changes.
      
          Signed-off-by: Elijah Newren <newren@gmail.com>
      
     @@ builtin/am.c: static int fast_forward_to(struct tree *head, struct tree *remote,
       	opts.update = 1;
       	opts.merge = 1;
      -	opts.reset = reset;
     -+	opts.reset_keep_untracked = reset;
     ++	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
       	opts.fn = twoway_merge;
     -+	/* Setup opts.dir so that ignored files in the way get overwritten */
     -+	opts.dir = xcalloc(1, sizeof(*opts.dir));
     -+	opts.dir->flags |= DIR_SHOW_IGNORED;
     -+	setup_standard_excludes(opts.dir);
     ++	if (opts.reset) {
     ++		/* Allow ignored files in the way to get overwritten */
     ++		opts.dir = xcalloc(1, sizeof(*opts.dir));
     ++		opts.dir->flags |= DIR_SHOW_IGNORED;
     ++		setup_standard_excludes(opts.dir);
     ++	}
       	init_tree_desc(&t[0], head->buffer, head->size);
       	init_tree_desc(&t[1], remote->buffer, remote->size);
       
     +@@ builtin/am.c: static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
     + 		return -1;
     + 	}
     + 
     ++	if (opts.reset) {
     ++		dir_clear(opts.dir);
     ++		FREE_AND_NULL(opts.dir);
     ++	}
     ++
     + 	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
     + 		die(_("unable to write new index file"));
     + 
      
       ## builtin/checkout.c ##
      @@ builtin/checkout.c: static int reset_tree(struct tree *tree, const struct checkout_opts *o,
     + {
     + 	struct unpack_trees_options opts;
     + 	struct tree_desc tree_desc;
     ++	int unpack_trees_ret;
     + 
     + 	memset(&opts, 0, sizeof(opts));
       	opts.head_idx = -1;
       	opts.update = worktree;
       	opts.skip_unmerged = !worktree;
      -	opts.reset = 1;
     -+	if (o->force)
     -+		opts.reset_nuke_untracked = 1;
     -+	else
     -+		opts.reset_keep_untracked = 1;
     ++	opts.reset = o->force ? UNPACK_RESET_OVERWRITE_UNTRACKED :
     ++				UNPACK_RESET_PROTECT_UNTRACKED;
       	opts.merge = 1;
       	opts.fn = oneway_merge;
       	opts.verbose_update = o->show_progress;
     @@ builtin/checkout.c: static int reset_tree(struct tree *tree, const struct checko
       	init_checkout_metadata(&opts.meta, info->refname,
       			       info->commit ? &info->commit->object.oid : null_oid(),
       			       NULL);
     + 	parse_tree(tree);
     + 	init_tree_desc(&tree_desc, tree->buffer, tree->size);
     +-	switch (unpack_trees(1, &tree_desc, &opts)) {
     ++	unpack_trees_ret = unpack_trees(1, &tree_desc, &opts);
     ++
     ++	if (o->overwrite_ignore) {
     ++		dir_clear(opts.dir);
     ++		FREE_AND_NULL(opts.dir);
     ++	}
     ++
     ++	switch (unpack_trees_ret) {
     + 	case -2:
     + 		*writeout_error = 1;
     + 		/*
      
       ## builtin/read-tree.c ##
      @@ builtin/read-tree.c: int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
     - 			 N_("3-way merge if no file level merging required")),
     - 		OPT_BOOL(0, "aggressive", &opts.aggressive,
     - 			 N_("3-way merge in presence of adds and removes")),
     --		OPT_BOOL(0, "reset", &opts.reset,
     -+		OPT_BOOL(0, "reset", &opts.reset_keep_untracked,
     - 			 N_("same as -m, but discard unmerged entries")),
     - 		{ OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"),
     - 		  N_("read the tree into the index under <subdirectory>/"),
     -@@ builtin/read-tree.c: int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
     - 	opts.head_idx = -1;
     - 	opts.src_index = &the_index;
     - 	opts.dst_index = &the_index;
     -+	if (opts.reset_keep_untracked) {
     -+		opts.dir = xcalloc(1, sizeof(*opts.dir));
     -+		opts.dir->flags |= DIR_SHOW_IGNORED;
     -+		setup_standard_excludes(opts.dir);
     -+	}
     - 
     - 	git_config(git_read_tree_config, NULL);
     - 
     -@@ builtin/read-tree.c: int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
     - 	hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
     - 
     - 	prefix_set = opts.prefix ? 1 : 0;
     --	if (1 < opts.merge + opts.reset + prefix_set)
     -+	if (1 < opts.merge + opts.reset_keep_untracked + prefix_set)
     + 	if (1 < opts.merge + opts.reset + prefix_set)
       		die("Which one? -m, --reset, or --prefix?");
       
     ++	if (opts.reset)
     ++		opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED;
     ++
       	/*
     -@@ builtin/read-tree.c: int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
     - 	 * mode.
     - 	 */
     - 
     --	if (opts.reset || opts.merge || opts.prefix) {
     -+	if (opts.reset_keep_untracked || opts.merge || opts.prefix) {
     - 		if (read_cache_unmerged() && (opts.prefix || opts.merge))
     - 			die(_("You need to resolve your current index first"));
     - 		stage = opts.merge = 1;
     + 	 * NEEDSWORK
     + 	 *
      
       ## builtin/reset.c ##
      @@
     @@ builtin/reset.c: static int reset_index(const char *ref, const struct object_id
       	case HARD:
       		opts.update = 1;
      -		/* fallthrough */
     -+		opts.reset_nuke_untracked = 1;
     ++		opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED;
      +		break;
      +	case MIXED:
     -+		opts.reset_keep_untracked = 1; /* but opts.update=0, so untracked left alone */
     ++		opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
     ++		/* but opts.update=0, so working tree not updated */
      +		break;
       	default:
      -		opts.reset = 1;
      +		BUG("invalid reset_type passed to reset_index");
      +	}
     -+	if (opts.reset_keep_untracked) {
     ++	if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
      +		/* Setup opts.dir so we can overwrite ignored files */
      +		opts.dir = xcalloc(1, sizeof(*opts.dir));
      +		opts.dir->flags |= DIR_SHOW_IGNORED;
     @@ builtin/reset.c: static int reset_index(const char *ref, const struct object_id
       	}
       
       	read_cache_unmerged();
     +@@ builtin/reset.c: static int reset_index(const char *ref, const struct object_id *oid, int reset_t
     + 	ret = 0;
     + 
     + out:
     ++	if (opts.reset == UNPACK_RESET_PROTECT_UNTRACKED) {
     ++		dir_clear(opts.dir);
     ++		FREE_AND_NULL(opts.dir);
     ++	}
     + 	for (i = 0; i < nr; i++)
     + 		free((void *)desc[i].buffer);
     + 	return ret;
      
       ## builtin/stash.c ##
     +@@ builtin/stash.c: static int reset_tree(struct object_id *i_tree, int update, int reset)
     + 	struct tree_desc t[MAX_UNPACK_TREES];
     + 	struct tree *tree;
     + 	struct lock_file lock_file = LOCK_INIT;
     ++	int unpack_trees_ret;
     + 
     + 	read_cache_preload(NULL);
     + 	if (refresh_cache(REFRESH_QUIET))
      @@ builtin/stash.c: static int reset_tree(struct object_id *i_tree, int update, int reset)
       	opts.src_index = &the_index;
       	opts.dst_index = &the_index;
       	opts.merge = 1;
      -	opts.reset = reset;
     -+	opts.reset_keep_untracked = reset;
     ++	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
     ++	if (opts.reset) {
     ++		opts.dir = xcalloc(1, sizeof(*opts.dir));
     ++		opts.dir->flags |= DIR_SHOW_IGNORED;
     ++		setup_standard_excludes(opts.dir);
     ++	}
       	opts.update = update;
       	opts.fn = oneway_merge;
       
     +-	if (unpack_trees(nr_trees, t, &opts))
     ++	unpack_trees_ret = unpack_trees(nr_trees, t, &opts);
     ++
     ++	if (opts.reset) {
     ++		dir_clear(opts.dir);
     ++		FREE_AND_NULL(opts.dir);
     ++	}
     ++
     ++	if (unpack_trees_ret)
     + 		return -1;
     + 
     + 	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
      
       ## reset.c ##
      @@
     @@ reset.c: int reset_head(struct repository *r, struct object_id *oid, const char
      -	if (!detach_head)
      -		unpack_tree_opts.reset = 1;
      +	if (!detach_head) {
     -+		unpack_tree_opts.reset_keep_untracked = 1;
     ++		unpack_tree_opts.reset = UNPACK_RESET_PROTECT_UNTRACKED;
      +		unpack_tree_opts.dir = xcalloc(1, sizeof(*unpack_tree_opts.dir));
      +		unpack_tree_opts.dir->flags |= DIR_SHOW_IGNORED;
      +		setup_standard_excludes(unpack_tree_opts.dir);
     @@ reset.c: int reset_head(struct repository *r, struct object_id *oid, const char
       
       	if (repo_read_index_unmerged(r) < 0) {
       		ret = error(_("could not read index"));
     -
     - ## t/t1013-read-tree-submodule.sh ##
     -@@ t/t1013-read-tree-submodule.sh: KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED=1
     - 
     - test_submodule_switch_recursing_with_args "read-tree -u -m"
     - 
     --test_submodule_forced_switch_recursing_with_args "read-tree -u --reset"
     -+test_submodule_switch_recursing_with_args "read-tree -u --reset"
     +@@ reset.c: reset_head_refs:
     + 			    oid_to_hex(oid), "1", NULL);
       
     - test_submodule_switch "read-tree -u -m"
     - 
     --test_submodule_forced_switch "read-tree -u --reset"
     -+test_submodule_switch "read-tree -u --reset"
     - 
     - test_done
     + leave_reset_head:
     ++	if (unpack_tree_opts.dir) {
     ++		dir_clear(unpack_tree_opts.dir);
     ++		FREE_AND_NULL(unpack_tree_opts.dir);
     ++	}
     + 	strbuf_release(&msg);
     + 	rollback_lock_file(&lock);
     + 	clear_unpack_trees_porcelain(&unpack_tree_opts);
      
       ## t/t2500-untracked-overwriting.sh ##
      @@ t/t2500-untracked-overwriting.sh: test_setup_checkout_m () {
     @@ t/t2500-untracked-overwriting.sh: test_expect_failure 'git rebase --abort and un
       		cd sequencing_rebase_fast_forward_and_untracked &&
      
       ## unpack-trees.c ##
     -@@ unpack-trees.c: static int check_submodule_move_head(const struct cache_entry *ce,
     - 	if (!sub)
     - 		return 0;
     - 
     --	if (o->reset)
     -+	if (o->reset_nuke_untracked)
     - 		flags |= SUBMODULE_MOVE_HEAD_FORCE;
     - 
     - 	if (submodule_move_head(ce->name, old_id, new_id, flags))
      @@ unpack-trees.c: int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
     - 	if (len > MAX_UNPACK_TREES)
     - 		die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
     + 	struct pattern_list pl;
     + 	int free_pattern_list = 0;
       
     -+	if (o->reset_nuke_untracked && o->reset_keep_untracked)
     -+		BUG("reset_nuke_untracked and reset_keep_untracked are incompatible");
     ++	if (o->reset == UNPACK_RESET_INVALID)
     ++		BUG("o->reset had a value of 1; should be UNPACK_TREES_*_UNTRACKED");
      +
     -+	o->reset_either = 0;
     -+	if (o->reset_nuke_untracked || o->reset_keep_untracked)
     -+		o->reset_either = 1;
     -+
     - 	trace_performance_enter();
     - 	trace2_region_enter("unpack_trees", "unpack_trees", the_repository);
     - 
     -@@ unpack-trees.c: static int verify_uptodate_1(const struct cache_entry *ce,
     - 	 */
     - 	if ((ce->ce_flags & CE_VALID) || ce_skip_worktree(ce))
     - 		; /* keep checking */
     --	else if (o->reset || ce_uptodate(ce))
     -+	else if (o->reset_either || ce_uptodate(ce))
     - 		return 0;
     + 	if (len > MAX_UNPACK_TREES)
     + 		die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
       
     - 	if (!lstat(ce->name, &st)) {
      @@ unpack-trees.c: static int verify_absent_1(const struct cache_entry *ce,
       	int len;
       	struct stat st;
       
      -	if (o->index_only || o->reset || !o->update)
     -+	if (o->index_only || o->reset_nuke_untracked || !o->update)
     ++	if (o->index_only || !o->update ||
     ++	    o->reset == UNPACK_RESET_OVERWRITE_UNTRACKED)
       		return 0;
       
       	len = check_leading_path(ce->name, ce_namelen(ce), 0);
     -@@ unpack-trees.c: int twoway_merge(const struct cache_entry * const *src,
     - 
     - 	if (current) {
     - 		if (current->ce_flags & CE_CONFLICTED) {
     --			if (same(oldtree, newtree) || o->reset) {
     -+			if (same(oldtree, newtree) || o->reset_either) {
     - 				if (!newtree)
     - 					return deleted_entry(current, current, o);
     - 				else
     -@@ unpack-trees.c: int oneway_merge(const struct cache_entry * const *src,
     - 
     - 	if (old && same(old, a)) {
     - 		int update = 0;
     --		if (o->reset && o->update && !ce_uptodate(old) && !ce_skip_worktree(old) &&
     -+		if (o->reset_either && o->update && !ce_uptodate(old) && !ce_skip_worktree(old) &&
     - 			!(old->ce_flags & CE_FSMONITOR_VALID)) {
     - 			struct stat st;
     - 			if (lstat(old->name, &st) ||
      
       ## unpack-trees.h ##
      @@ unpack-trees.h: void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
     +  */
       void clear_unpack_trees_porcelain(struct unpack_trees_options *opts);
       
     ++enum unpack_trees_reset_type {
     ++	UNPACK_RESET_NONE = 0,    /* traditional "false" value; still valid */
     ++	UNPACK_RESET_INVALID = 1, /* "true" no longer valid; use below values */
     ++	UNPACK_RESET_PROTECT_UNTRACKED,
     ++	UNPACK_RESET_OVERWRITE_UNTRACKED
     ++};
     ++
       struct unpack_trees_options {
      -	unsigned int reset,
     -+	unsigned int reset_nuke_untracked,
     -+		     reset_keep_untracked,
     -+		     reset_either, /* internal use only */
     - 		     merge,
     +-		     merge,
     ++	unsigned int merge,
       		     update,
       		     clone,
     + 		     index_only,
     +@@ unpack-trees.h: struct unpack_trees_options {
     + 		     exiting_early,
     + 		     show_all_errors,
     + 		     dry_run;
     ++	enum unpack_trees_reset_type reset;
     + 	const char *prefix;
     + 	int cache_bottom;
     + 	struct dir_struct *dir;
 3:  a69117a1c9e = 3:  208f3b3ebe5 unpack-trees: avoid nuking untracked dir in way of unmerged file
 4:  01bf850bb0f ! 4:  0a0997d081b unpack-trees: avoid nuking untracked dir in way of locally deleted file
     @@ unpack-trees.c: static int deleted_entry(const struct cache_entry *ce,
       		if (verify_absent(ce, ERROR_WOULD_LOSE_UNTRACKED_REMOVED, o))
       			return -1;
       		return 0;
     -+	} else {
     -+		if (verify_absent_if_directory(ce, ERROR_WOULD_LOSE_UNTRACKED_REMOVED, o))
     -+			return -1;
     ++	} else if (verify_absent_if_directory(ce, ERROR_WOULD_LOSE_UNTRACKED_REMOVED, o)) {
     ++		return -1;
       	}
      +
       	if (!(old->ce_flags & CE_CONFLICTED) && verify_uptodate(old, o))
 5:  60c5d6b4615 = 5:  4b78a526d2a Comment important codepaths regarding nuking untracked files/dirs
 6:  6ea23d165cf = 6:  993451a8036 Documentation: call out commands that nuke untracked files/directories

-- 
gitgitgadget

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 1/6] t2500: add various tests for nuking untracked files
  2021-09-19 13:44  0%   ` Ævar Arnfjörð Bjarmason
@ 2021-09-20 14:48  0%     ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2021-09-20 14:48 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Elijah Newren via GitGitGadget, Git Mailing List, Fedor Biryukov

On Sun, Sep 19, 2021 at 6:47 AM Ævar Arnfjörð Bjarmason
<avarab@gmail.com> wrote:
>
> On Sat, Sep 18 2021, Elijah Newren via GitGitGadget wrote:
>
> > +     test_create_repo reset_$1 &&
>
> s/test_create_repo/git init/ these days (also for the rest).

Ah, from your f0d4d398e2 ("test-lib: split up and deprecate
test_create_repo()", 2021-05-10).  Interesting history; I'll
switchover to git init.

> > +             mkdir foo.t &&
> > +             echo precious >foo.t/file &&
> > +             cp foo.t/file expect &&
> > +
> > +             test_must_fail git reset --merge work 2>error &&
> > +             test_cmp expect foo.t/file &&
> > +             grep "Updating.*foo.t.*would lose untracked files" error
>
> The test is ambiguous about whether we complain about foo.t/file, or
> foo.t, if there was foo.t{file,file-two} would we complain just once or
> twice?
>
> I think it's just the directory, but probably worthwhile for the test to
> make the distinction. If it's a "a/sub/dir/file" do we complain about
> "a/" or "a/sub/dir/" ?

Yeah, I'll switch it to grep "Updating .foo.t. would lose untracked files" error

to make it clearer (where I'm using '.' instead of attempting to
escape single quote characters appropriately).

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/6] t2500: add various tests for nuking untracked files
  2021-09-18 23:15  9% ` [PATCH 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
@ 2021-09-19 13:44  0%   ` Ævar Arnfjörð Bjarmason
  2021-09-20 14:48  0%     ` Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-09-19 13:44 UTC (permalink / raw)
  To: Elijah Newren via GitGitGadget; +Cc: git, Fedor Biryukov, Elijah Newren


On Sat, Sep 18 2021, Elijah Newren via GitGitGadget wrote:

> +	test_create_repo reset_$1 &&

s/test_create_repo/git init/ these days (also for the rest).

> +		mkdir foo.t &&
> +		echo precious >foo.t/file &&
> +		cp foo.t/file expect &&
> +
> +		test_must_fail git reset --merge work 2>error &&
> +		test_cmp expect foo.t/file &&
> +		grep "Updating.*foo.t.*would lose untracked files" error

The test is ambiguous about whether we complain about foo.t/file, or
foo.t, if there was foo.t{file,file-two} would we complain just once or
twice?

I think it's just the directory, but probably worthwhile for the test to
make the distinction. If it's a "a/sub/dir/file" do we complain about
"a/" or "a/sub/dir/" ?

^ permalink raw reply	[relevance 0%]

* [PATCH 1/6] t2500: add various tests for nuking untracked files
  2021-09-18 23:15  6% [PATCH 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
@ 2021-09-18 23:15  9% ` Elijah Newren via GitGitGadget
  2021-09-19 13:44  0%   ` Ævar Arnfjörð Bjarmason
  2021-09-24  6:37  4% ` [PATCH v2 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
  1 sibling, 1 reply; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-18 23:15 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

Noting that unpack_trees treats reset=1 & update=1 as license to nuke
untracked files, I looked for code paths that use this combination and
tried to generate testcases which demonstrated unintentional loss of
untracked files and directories.  I found several.

I also include testcases for `git reset --{hard,merge,keep}`.  A hard
reset is perhaps the most direct test of unpack_tree's reset=1 behavior,
but we cannot make `git reset --hard` preserve untracked files without
some migration work.

Also, the two commands `checkout --force` (because of the --force) and
`read-tree --reset` (because it's plumbing and we need to keep it
backward compatible) were left out as we expect those to continue
removing untracked files and directories.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100755 t/t2500-untracked-overwriting.sh

diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
new file mode 100755
index 00000000000..a1a6dfa671e
--- /dev/null
+++ b/t/t2500-untracked-overwriting.sh
@@ -0,0 +1,244 @@
+#!/bin/sh
+
+test_description='Test handling of overwriting untracked files'
+
+. ./test-lib.sh
+
+test_setup_reset () {
+	test_create_repo reset_$1 &&
+	(
+		cd reset_$1 &&
+		test_commit init &&
+
+		git branch stable &&
+		git branch work &&
+
+		git checkout work &&
+		test_commit foo &&
+
+		git checkout stable
+	)
+}
+
+test_expect_success 'reset --hard will nuke untracked files/dirs' '
+	test_setup_reset hard &&
+	(
+		cd reset_hard &&
+		git ls-tree -r stable &&
+		git log --all --name-status --oneline &&
+		git ls-tree -r work &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		echo foo >expect &&
+
+		git reset --hard work &&
+
+		# check that untracked directory foo.t/ was nuked
+		test_path_is_file foo.t &&
+		test_cmp expect foo.t
+	)
+'
+
+test_expect_success 'reset --merge will preserve untracked files/dirs' '
+	test_setup_reset merge &&
+	(
+		cd reset_merge &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating.*foo.t.*would lose untracked files" error
+	)
+'
+
+test_expect_success 'reset --keep will preserve untracked files/dirs' '
+	test_setup_reset keep &&
+	(
+		cd reset_keep &&
+
+		mkdir foo.t &&
+		echo precious >foo.t/file &&
+		cp foo.t/file expect &&
+
+		test_must_fail git reset --merge work 2>error &&
+		test_cmp expect foo.t/file &&
+		grep "Updating.*foo.t.*would lose untracked files" error
+	)
+'
+
+test_setup_checkout_m () {
+	test_create_repo checkout &&
+	(
+		cd checkout &&
+		test_commit init &&
+
+		test_write_lines file has some >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		git branch stable &&
+
+		git switch -c work &&
+		echo stuff >notes.txt &&
+		test_write_lines file has some words >filler &&
+		git add notes.txt filler &&
+		git commit -m filler &&
+
+		git checkout stable
+	)
+}
+
+test_expect_failure 'checkout -m does not nuke untracked file' '
+	test_setup_checkout_m &&
+	(
+		cd checkout &&
+
+		# Tweak filler
+		test_write_lines this file has some >filler &&
+		# Make an untracked file, save its contents in "expect"
+		echo precious >notes.txt &&
+		cp notes.txt expect &&
+
+		test_must_fail git checkout -m work &&
+		test_cmp expect notes.txt
+	)
+'
+
+test_setup_sequencing () {
+	test_create_repo sequencing_$1 &&
+	(
+		cd sequencing_$1 &&
+		test_commit init &&
+
+		test_write_lines this file has some words >filler &&
+		git add filler &&
+		git commit -m filler &&
+
+		mkdir -p foo/bar &&
+		test_commit foo/bar/baz &&
+
+		git branch simple &&
+		git branch fooey &&
+
+		git checkout fooey &&
+		git rm foo/bar/baz.t &&
+		echo stuff >>filler &&
+		git add -u &&
+		git commit -m "changes" &&
+
+		git checkout simple &&
+		echo items >>filler &&
+		echo newstuff >>newfile &&
+		git add filler newfile &&
+		git commit -m another
+	)
+}
+
+test_expect_failure 'git rebase --abort and untracked files' '
+	test_setup_sequencing rebase_abort_and_untracked &&
+	(
+		cd sequencing_rebase_abort_and_untracked &&
+		git checkout fooey &&
+		test_must_fail git rebase simple &&
+
+		cat init.t &&
+		git rm init.t &&
+		echo precious >init.t &&
+		cp init.t expect &&
+		git status --porcelain &&
+		test_must_fail git rebase --abort &&
+		test_cmp expect init.t
+	)
+'
+
+test_expect_failure 'git rebase fast forwarding and untracked files' '
+	test_setup_sequencing rebase_fast_forward_and_untracked &&
+	(
+		cd sequencing_rebase_fast_forward_and_untracked &&
+		git checkout init &&
+		echo precious >filler &&
+		cp filler expect &&
+		test_must_fail git rebase init simple &&
+		test_cmp expect filler
+	)
+'
+
+test_expect_failure 'git rebase --autostash and untracked files' '
+	test_setup_sequencing rebase_autostash_and_untracked &&
+	(
+		cd sequencing_rebase_autostash_and_untracked &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git rebase --autostash init &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git stash and untracked files' '
+	test_setup_sequencing stash_and_untracked_files &&
+	(
+		cd sequencing_stash_and_untracked_files &&
+		git checkout simple &&
+		git rm filler &&
+		mkdir filler &&
+		echo precious >filler/file &&
+		cp filler/file expect &&
+		git status --porcelain &&
+		git stash push &&
+		git status --porcelain &&
+		test_path_is_file filler/file
+	)
+'
+
+test_expect_failure 'git am --abort and untracked dir vs. unmerged file' '
+	test_setup_sequencing am_abort_and_untracked &&
+	(
+		cd sequencing_am_abort_and_untracked &&
+		git format-patch -1 --stdout fooey >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete the conflicted file; we will stage and commit it later
+		rm filler &&
+
+		# Put an unrelated untracked directory there
+		mkdir filler &&
+		echo foo >filler/file1 &&
+		echo bar >filler/file2 &&
+
+		test_must_fail git am --abort 2>errors &&
+		test_path_is_dir filler &&
+		grep "Updating .filler. would lose untracked files in it" errors
+	)
+'
+
+test_expect_failure 'git am --skip and untracked dir vs deleted file' '
+	test_setup_sequencing am_skip_and_untracked &&
+	(
+		cd sequencing_am_skip_and_untracked &&
+		git checkout fooey &&
+		git format-patch -1 --stdout simple >changes.mbox &&
+		test_must_fail git am --3way changes.mbox &&
+
+		# Delete newfile
+		rm newfile &&
+
+		# Put an unrelated untracked directory there
+		mkdir newfile &&
+		echo foo >newfile/file1 &&
+		echo bar >newfile/file2 &&
+
+		# Change our mind about resolutions, just skip this patch
+		test_must_fail git am --skip 2>errors &&
+		test_path_is_dir newfile &&
+		grep "Updating .newfile. would lose untracked files in it" errors
+	)
+'
+
+test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 9%]

* [PATCH 0/6] Fix various issues around removal of untracked files/directories
@ 2021-09-18 23:15  6% Elijah Newren via GitGitGadget
  2021-09-18 23:15  9% ` [PATCH 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
  2021-09-24  6:37  4% ` [PATCH v2 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
  0 siblings, 2 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-18 23:15 UTC (permalink / raw)
  To: git; +Cc: Ævar Arnfjörð Bjarmason, Fedor Biryukov,
	Elijah Newren

This series depends on en/am-abort-fix.

We have multiple codepaths that delete untracked files/directories but
shouldn't. There are also some codepaths where we delete untracked
files/directories intentionally (based on mailing list discussion), but
where that intent is not documented. Fix the documentation, add several new
(mostly failing) testcases, fix some of the new testcases, and add comments
about some potential remaining problems. (I found these as a side-effect of
looking at [1], though [2] pointed out one explicitly while I was working on
it.)

Note that I'm using Junio's declaration about checkout -f and reset --hard
(and also presuming that since read-tree --reset is porcelain that its
behavior should be left alone)[3] in this series.

SIDENOTE about treating (some) ignored files as precious:

There's another related topic here that came up in the mailing list threads
that is separate even if similar: namely, treating ignored files as precious
instead of deleting them. I do not try to handle that here, but I believe
that would actually be relatively easy to handle. If you leave
unpack_trees_options->dir as NULL, then ignored files are treated as
precious (my original patch 2 made that mistake). There's a few other
locations that already optionally set up unpack_trees_options->dir (a quick
search for "overwrite_ignore" and "overwrite-ignore" will find them), so
we'd just need to implement that option flag in more places corresponding to
the new callsites (and perhaps make a global core.overwrite_ignored config
option to affect all of these). Of course, doing so would globally treat
ignored files as precious rather than allowing them to be configured on a
per-path basis, but honestly I think the idea of configuring ignored files
as precious on a per-path basis sounds like insanity. (We have enough bugs
with untracked and ignored files without adding yet another type. Also,
tla/baz was excessively confusing to me due in part to the number of types
of files and I'd rather not see such ideas ported to git. And, of course,
configuring per-path rules sounds like lots of work for end users to
configure. There may be additional reasons against it.) So, if someone wants
to pursue the precious-ignored concept then I'd much rather see it done as a
global setting. Just my $0.02.

[1] https://lore.kernel.org/git/xmqqv93n7q1v.fsf@gitster.g/ [2]
https://lore.kernel.org/git/C357A648-8B13-45C3-9388-C0C7F7D40DAE@gmail.com/
[3] https://lore.kernel.org/git/xmqqr1e2ejs9.fsf@gitster.g/

Elijah Newren (6):
  t2500: add various tests for nuking untracked files
  Split unpack_trees 'reset' flag into two for untracked handling
  unpack-trees: avoid nuking untracked dir in way of unmerged file
  unpack-trees: avoid nuking untracked dir in way of locally deleted
    file
  Comment important codepaths regarding nuking untracked files/dirs
  Documentation: call out commands that nuke untracked files/directories

 Documentation/git-checkout.txt   |   5 +-
 Documentation/git-read-tree.txt  |   5 +-
 Documentation/git-reset.txt      |   3 +-
 builtin/am.c                     |   6 +-
 builtin/checkout.c               |  10 +-
 builtin/read-tree.c              |  11 +-
 builtin/reset.c                  |  15 +-
 builtin/stash.c                  |   3 +-
 builtin/submodule--helper.c      |   4 +
 builtin/worktree.c               |   5 +
 contrib/rerere-train.sh          |   2 +-
 reset.c                          |   9 +-
 submodule.c                      |   1 +
 t/t1013-read-tree-submodule.sh   |   4 +-
 t/t2500-untracked-overwriting.sh | 244 +++++++++++++++++++++++++++++++
 unpack-trees.c                   |  56 +++++--
 unpack-trees.h                   |   4 +-
 17 files changed, 359 insertions(+), 28 deletions(-)
 create mode 100755 t/t2500-untracked-overwriting.sh


base-commit: c5ead19ea282a288e01d86536349a4ae4a093e4b
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1036%2Fnewren%2Funtracked_removal-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1036/newren/untracked_removal-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1036
-- 
gitgitgadget

^ permalink raw reply	[relevance 6%]

* [PATCH v2 2/3] t4151: add a few am --abort tests
  @ 2021-09-10 10:31  5%   ` Elijah Newren via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-10 10:31 UTC (permalink / raw)
  To: git
  Cc: Bagas Sanjaya, Elijah Newren, Johannes Schindelin, Elijah Newren,
	Elijah Newren

From: Elijah Newren <newren@gmail.com>

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t4151-am-abort.sh | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh
index 9d8d3c72e7e..15f2f92cd76 100755
--- a/t/t4151-am-abort.sh
+++ b/t/t4151-am-abort.sh
@@ -23,7 +23,13 @@ test_expect_success setup '
 		test_tick &&
 		git commit -a -m $i || return 1
 	done &&
+	git branch changes &&
 	git format-patch --no-numbered initial &&
+	git checkout -b conflicting initial &&
+	echo different >>file-1 &&
+	echo whatever >new-file &&
+	git add file-1 new-file &&
+	git commit -m different &&
 	git checkout -b side initial &&
 	echo local change >file-2-expect
 '
@@ -191,4 +197,37 @@ test_expect_success 'am --abort leaves index stat info alone' '
 	git diff-files --exit-code --quiet
 '
 
+test_expect_failure 'git am --abort return failed exit status when it fails' '
+	test_when_finished "rm -rf file-2/ && git reset --hard && git am --abort" &&
+	git checkout changes &&
+	git format-patch -1 --stdout conflicting >changes.mbox &&
+	test_must_fail git am --3way changes.mbox &&
+
+	git rm file-2 &&
+	mkdir file-2 &&
+	echo precious >file-2/somefile &&
+	test_must_fail git am --abort &&
+	test_path_is_dir file-2/
+'
+
+test_expect_success 'git am --abort cleans relevant files' '
+	git checkout changes &&
+	git format-patch -1 --stdout conflicting >changes.mbox &&
+	test_must_fail git am --3way changes.mbox &&
+
+	test_path_is_file new-file &&
+	echo further changes >>file-1 &&
+	echo change other file >>file-2 &&
+
+	# Abort, and expect the files touched by am to be reverted
+	git am --abort &&
+
+	test_path_is_missing new-file &&
+
+	# Files not involved in am operation are left modified
+	git diff --name-only changes >actual &&
+	test_write_lines file-2 >expect &&
+	test_cmp expect actual
+'
+
 test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 5%]

* Re: [PATCH 1/2] t4151: document a pair of am --abort bugs
  2021-09-08  5:13  0%   ` Bagas Sanjaya
@ 2021-09-08  5:24  0%     ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2021-09-08  5:24 UTC (permalink / raw)
  To: Bagas Sanjaya; +Cc: Elijah Newren via GitGitGadget, Git Mailing List

On Tue, Sep 7, 2021 at 10:13 PM Bagas Sanjaya <bagasdotme@gmail.com> wrote:
>
> On 08/09/21 09.17, Elijah Newren via GitGitGadget wrote:
> > From: Elijah Newren <newren@gmail.com>
> >
> > Signed-off-by: Elijah Newren <newren@gmail.com>
> > ---
> >   t/t4151-am-abort.sh | 31 +++++++++++++++++++++++++++++++
> >   1 file changed, 31 insertions(+)
> >
> > diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh
> > index 9d8d3c72e7e..501a7a9d211 100755
> > --- a/t/t4151-am-abort.sh
> > +++ b/t/t4151-am-abort.sh
> > @@ -23,7 +23,11 @@ test_expect_success setup '
> >               test_tick &&
> >               git commit -a -m $i || return 1
> >       done &&
> > +     git branch changes &&
> >       git format-patch --no-numbered initial &&
> > +     git checkout -b conflicting initial &&
> > +     echo different >>file-1 &&
> > +     git commit -a -m different &&
> >       git checkout -b side initial &&
> >       echo local change >file-2-expect
> >   '
> > @@ -191,4 +195,31 @@ test_expect_success 'am --abort leaves index stat info alone' '
> >       git diff-files --exit-code --quiet
> >   '
> >
> > +test_expect_failure 'git am --abort return failed exit status when it fails' '
> > +     test_when_finished "rm -rf file-2/ && git reset --hard" &&
> > +     git checkout changes &&
> > +     git format-patch -1 --stdout conflicting >changes.mbox &&
> > +     test_must_fail git am --3way changes.mbox &&
> > +
> > +     git rm file-2 &&
> > +     mkdir file-2 &&
> > +     echo precious >file-2/somefile &&
> > +     test_must_fail git am --abort &&
> > +     test_path_is_dir file-2/
> > +'
> > +
> > +test_expect_failure 'git am --abort returns us to a clean state' '
> > +     git checkout changes &&
> > +     git format-patch -1 --stdout conflicting >changes.mbox &&
> > +     test_must_fail git am --3way changes.mbox &&
> > +
> > +     # Make a change related to the rest of the am work
> > +     echo related change >>file-2 &&
> > +
> > +     # Abort, and expect the related change to go away too
> > +     git am --abort &&
> > +     git status --porcelain -uno >actual &&
> > +     test_must_be_empty actual
> > +'
> > +
> >   test_done
> >
>
> I expect BUGS section in git-am(1) to be added to describe known bugs
> you demonstrated above, judging from the patch subject.

There's no point documenting the first one since it'll be fixed by the
next patch.  As for the second, as I noted in my cover letter, I'm not
quite sure that it really is a bug.  If it isn't, the second testcase
should be dropped.  However, if the second testcase represents an
actual bug rather than me just misjudging the intent, then your
suggestion certainly makes sense.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/2] t4151: document a pair of am --abort bugs
  2021-09-08  2:17  5% ` [PATCH 1/2] t4151: document a pair of am --abort bugs Elijah Newren via GitGitGadget
@ 2021-09-08  5:13  0%   ` Bagas Sanjaya
  2021-09-08  5:24  0%     ` Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Bagas Sanjaya @ 2021-09-08  5:13 UTC (permalink / raw)
  To: Elijah Newren via GitGitGadget, git; +Cc: Elijah Newren

On 08/09/21 09.17, Elijah Newren via GitGitGadget wrote:
> From: Elijah Newren <newren@gmail.com>
> 
> Signed-off-by: Elijah Newren <newren@gmail.com>
> ---
>   t/t4151-am-abort.sh | 31 +++++++++++++++++++++++++++++++
>   1 file changed, 31 insertions(+)
> 
> diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh
> index 9d8d3c72e7e..501a7a9d211 100755
> --- a/t/t4151-am-abort.sh
> +++ b/t/t4151-am-abort.sh
> @@ -23,7 +23,11 @@ test_expect_success setup '
>   		test_tick &&
>   		git commit -a -m $i || return 1
>   	done &&
> +	git branch changes &&
>   	git format-patch --no-numbered initial &&
> +	git checkout -b conflicting initial &&
> +	echo different >>file-1 &&
> +	git commit -a -m different &&
>   	git checkout -b side initial &&
>   	echo local change >file-2-expect
>   '
> @@ -191,4 +195,31 @@ test_expect_success 'am --abort leaves index stat info alone' '
>   	git diff-files --exit-code --quiet
>   '
>   
> +test_expect_failure 'git am --abort return failed exit status when it fails' '
> +	test_when_finished "rm -rf file-2/ && git reset --hard" &&
> +	git checkout changes &&
> +	git format-patch -1 --stdout conflicting >changes.mbox &&
> +	test_must_fail git am --3way changes.mbox &&
> +
> +	git rm file-2 &&
> +	mkdir file-2 &&
> +	echo precious >file-2/somefile &&
> +	test_must_fail git am --abort &&
> +	test_path_is_dir file-2/
> +'
> +
> +test_expect_failure 'git am --abort returns us to a clean state' '
> +	git checkout changes &&
> +	git format-patch -1 --stdout conflicting >changes.mbox &&
> +	test_must_fail git am --3way changes.mbox &&
> +
> +	# Make a change related to the rest of the am work
> +	echo related change >>file-2 &&
> +
> +	# Abort, and expect the related change to go away too
> +	git am --abort &&
> +	git status --porcelain -uno >actual &&
> +	test_must_be_empty actual
> +'
> +
>   test_done
> 

I expect BUGS section in git-am(1) to be added to describe known bugs 
you demonstrated above, judging from the patch subject.

-- 
An old man doll... just what I always wanted! - Clara

^ permalink raw reply	[relevance 0%]

* [PATCH 1/2] t4151: document a pair of am --abort bugs
  @ 2021-09-08  2:17  5% ` Elijah Newren via GitGitGadget
  2021-09-08  5:13  0%   ` Bagas Sanjaya
    1 sibling, 1 reply; 200+ results
From: Elijah Newren via GitGitGadget @ 2021-09-08  2:17 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren, Elijah Newren

From: Elijah Newren <newren@gmail.com>

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t4151-am-abort.sh | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh
index 9d8d3c72e7e..501a7a9d211 100755
--- a/t/t4151-am-abort.sh
+++ b/t/t4151-am-abort.sh
@@ -23,7 +23,11 @@ test_expect_success setup '
 		test_tick &&
 		git commit -a -m $i || return 1
 	done &&
+	git branch changes &&
 	git format-patch --no-numbered initial &&
+	git checkout -b conflicting initial &&
+	echo different >>file-1 &&
+	git commit -a -m different &&
 	git checkout -b side initial &&
 	echo local change >file-2-expect
 '
@@ -191,4 +195,31 @@ test_expect_success 'am --abort leaves index stat info alone' '
 	git diff-files --exit-code --quiet
 '
 
+test_expect_failure 'git am --abort return failed exit status when it fails' '
+	test_when_finished "rm -rf file-2/ && git reset --hard" &&
+	git checkout changes &&
+	git format-patch -1 --stdout conflicting >changes.mbox &&
+	test_must_fail git am --3way changes.mbox &&
+
+	git rm file-2 &&
+	mkdir file-2 &&
+	echo precious >file-2/somefile &&
+	test_must_fail git am --abort &&
+	test_path_is_dir file-2/
+'
+
+test_expect_failure 'git am --abort returns us to a clean state' '
+	git checkout changes &&
+	git format-patch -1 --stdout conflicting >changes.mbox &&
+	test_must_fail git am --3way changes.mbox &&
+
+	# Make a change related to the rest of the am work
+	echo related change >>file-2 &&
+
+	# Abort, and expect the related change to go away too
+	git am --abort &&
+	git status --porcelain -uno >actual &&
+	test_must_be_empty actual
+'
+
 test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 5%]

* Re: Aborting 'rebase main feat' removes unversioned files
  @ 2021-09-08  0:41  0%               ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2021-09-08  0:41 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jeff King, Fedor Biryukov, Bagas Sanjaya, Git Mailing List

On Sun, Sep 5, 2021 at 3:31 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Elijah Newren <newren@gmail.com> writes:
>
> > unpack_trees.  In fact, it traces back to (and before)
> >     fcc387db9b ("read-tree -m -u: do not overwrite or remove untracked
> > working tree files.", 2006-05-17)
> > which has additional commentary over at
> > https://lore.kernel.org/git/7v8xp1jc9h.fsf_-_@assigned-by-dhcp.cox.net/.
> > It appears that before this time, git happily nuked untracked files
> > and considered them expendable, in basically all cases.  However, this
> > patch continued considering them as expendable whenever opts->reset
> > was true.
>
> Thanks for digging.  Yes, the 'reset' bit was treated as the license
> to kill untracked working tree files and directories that get in the
> way in order to carry out the unpack_trees operation.
>
> > So, then...should we preserve untracked (and non-ignored) files in all
> > these cases?  This rebase case seems clear, but others might be less
> > clear....
>
> In short, the guiding principle ought to be that "checkout --force"
> and anything that is given "force" as a stronger override should be
> allowed to do whatever minimally necessary to match the end result
> in the working tree to what the command wants to show in the absense
> of these untracked paths.  And without being forced, untracked and
> unignored paths are precious and should cause commands to fail, if
> they need to be touched for the commands to complete what they are
> asked to do [*].
>
> "reset --hard HEAD" is an oddball.
>
> Naïvely, because it is often used as the way to tell Git to "no
> matter what, match the working tree to HEAD", even though it does
> not have an explicit "--force" on the command line, it feels that it
> also should be allowed to do whatever necessary to the working tree
> files.  And historically, that is what we wanted to implement.  If
> we suddenly made it "safer", I am sure a lot of existing things will
> break.
>
> But unfortunately, "--hard" means a bit more than that in the
> context of "reset", in that we want to reset in a way that is
> different from "--mixed" (reset the index only without touching the
> working tree) and "--soft" (do not touch the index or the working
> tree), more specifically, with "--hard", we want to reset both the
> index and the working tree to match the given committish (often
> "HEAD").  From that point of view, "reset --hard" that tries to
> preserve untracked and unignored paths, and "reset --force --hard"
> that does whatever necessary to untracked and unignored paths to
> match the working tree files, when they reset the index and the
> working tree to the named committish, may have made sense.  If we
> were designing the feature without any existing users, it is no
> brainer to imagine that our design would: (1) call the three 'reset'
> modes as "both", "index-only" and "neither", instead of "hard",
> "mixed" and "soft", and (2) require "--force" to touch untracked and
> unignored paths.
>
> And I think that may be a reasonable longer-term goal, but since we
> have existing users and scripts, we cannot go there overnight without
> devising a migration path.

Sounds reasonable.  I'm presuming that `read-tree --reset` is also an
oddball, but as plumbing it's better to keep its behavior as-is, i.e.
let it nuke untracked files/directories too.  Let me know if you would
prefer otherwise.

I have a bunch of relatively small patches
(https://github.com/git/git/pull/1085, if you want a preview), which
fix most of the problems I found.  I'm going to split it up into five
patch series, the first three of which are independent and shorter
than the remaining two.

^ permalink raw reply	[relevance 0%]

* Re: Aborting 'rebase main feat' removes unversioned files
  @ 2021-09-08  0:40  5%               ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2021-09-08  0:40 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Jeff King, Fedor Biryukov, Bagas Sanjaya, Git Mailing List

On Sun, Sep 5, 2021 at 12:44 AM Ævar Arnfjörð Bjarmason
<avarab@gmail.com> wrote:
>
> On Sat, Sep 04 2021, Elijah Newren wrote:
>
> > On Sat, Sep 4, 2021 at 3:19 AM Jeff King <peff@peff.net> wrote:
> >>
> >> On Sat, Sep 04, 2021 at 11:51:19AM +0200, Fedor Biryukov wrote:
> >>
> >> > There is no way this could be the intended behavior, but the good news
> >> > is that I cannot reproduce it...
> >> > Looks like it occurs only in one git version (2.31.0.windows.1, IIRC).
> >> > And it does not occur in the latest git version: git version 2.33.0.windows.2.
> >>
> >> I think it is a bug, and it seems to reproduce easily for me (with both
> >> the current tip of master, and with v2.33.0). Here's the recipe you
> >> showed, with a little debugging at the end:
> >>
> >>   set -x
> >>   git init repo
> >>   cd repo
> >>   git commit -m base --allow-empty
> >>   git checkout -b feat
> >>   echo feat >readme.txt
> >>   git add readme.txt
> >>   git commit -m txt=feat
> >>   git checkout main
> >>   echo precious >readme.txt
> >>
> >>   cat readme.txt
> >>   git checkout feat
> >>   cat readme.txt
> >>   git rebase main feat
> >>   cat readme.txt
> >>
> >> This produces:
> >>
> >>   + cat readme.txt
> >>   precious
> >>   + git checkout feat
> >>   error: The following untracked working tree files would be overwritten by checkout:
> >>         readme.txt
> >>   Please move or remove them before you switch branches.
> >>   Aborting
> >>   + cat readme.txt
> >>   precious
> >>   + git rebase main feat
> >>   Current branch feat is up to date.
> >>   + cat readme.txt
> >>   feat
> >>
> >> So git-checkout was not willing to overwrite the untracked content, but
> >> rebase was happy to obliterate it.
> >>
> >> It does the right thing in very old versions. Bisecting, it looks like
> >> the problem arrived in 5541bd5b8f (rebase: default to using the builtin
> >> rebase, 2018-08-08). So the bug is in the conversion from the legacy
> >> shell script to C (which makes sense; the shell version was just calling
> >> "git checkout", which we know does the right thing).
> >>
> >> -Peff
> >
> > Turns out this is quite a mess.  It's also related to the "don't
> > remove empty working directories" discussion we had earlier this
> > week[1], because we assumed all relevant codepaths correctly avoided
> > deleting untracked files and directories in the way.  But they don't.
> > And rebase isn't the only offender, because this is buried in
> > unpack_trees.  In fact, it traces back to (and before)
> >     fcc387db9b ("read-tree -m -u: do not overwrite or remove untracked
> > working tree files.", 2006-05-17)
> > which has additional commentary over at
> > https://lore.kernel.org/git/7v8xp1jc9h.fsf_-_@assigned-by-dhcp.cox.net/.
> > It appears that before this time, git happily nuked untracked files
> > and considered them expendable, in basically all cases.  However, this
> > patch continued considering them as expendable whenever opts->reset
> > was true.  There wasn't much comment about it at the time for the
> > reasoning of how opts->reset was handled, though trying to read
> > between the lines perhaps Junio was trying to limit the backward
> > compatibility concerns of introducing new errors to fewer code paths?
> > Anyway, Junio did mention `read-tree --reset` explicitly, but this
> > opts->reset usage also occurs in am, checkout, reset -- and anything
> > that calls the reset_head() function including: rebase, stash,
> > sequencer.c, and add-patch.c.
> >
> > So, then...should we preserve untracked (and non-ignored) files in all
> > these cases?  This rebase case seems clear, but others might be less
> > clear.  For example, should "git reset --hard" nuke untracked files
> > (what if it's a directory of untracked files getting nuked just to
> > place a single file in the location of the directory)?  The
> > documentation isn't explicit, but after reading it I would assume that
> > untracked files should be preserved.  Since we've had bugs in "git
> > reset --hard" before, such as requiring two invocations in order to
> > clear out unmerged entries (see [2] and [3]), that also suggests that
> > this is just another bug in the same area.  But the bug has been
> > around so long that people might be expecting it; our testsuite has
> > several cases that incidentally do.  Granted, it's better to throw an
> > error and require explicit extra steps than to nuke potentially
> > important work, but some folks might be unhappy with a change here.
> > Similarly with "git checkout -f".
> >
> > And stash.c, which operates in that edge case area has tests with
> > files nuked from the cache without nuking it from the working tree
> > (causing the working tree file to be considered untracked), and then
> > attempts to have multiple tests operate on that kind of case.  Those
> > cases look a bit buggy to me for other reasons (I'm still digging),
> > but those bugs are kind of hidden by the untracked file nuking bugs,
> > so fixing the latter requires fixing the former.  And stash.c is a
> > mess of shelling out to subcommands.  Ick.
> >
> > I have some partial patches, but don't know if I'll have anything to
> > post until I figure out the stash mess...
>
> I'd just like to applaud this effort, and also suggest that the most
> useful result of any such findings would be for us to produce some new
> test in t/ showing these various cases of nuking/clobbering and other
> "non-precious" edge cases in this logic. See[1] and its linked [2] for
> references to some of the past discussions around these cases.

Yeah, I discovered the problems by making some testcases for the
avoid-removing-current-working-directory case, and then when I was
surprised by some behaviors I saw I started adding tests for the
(mistaken?) nuking of untracked files...and then saw this bug report.
While I've also been trying to add fixes for the issues I've found,
making the testcases (trying to figure out which commands had bugs and
how to trigger them) was definitely the hardest part of the effort so
far, and likely the most valuable.

> 1. https://lore.kernel.org/git/87a6q9kacx.fsf@evledraar.gmail.com/
> 2. https://lore.kernel.org/git/87ftsi68ke.fsf@evledraar.gmail.com/

The first item, preserving ignored files, is related but different (I
was specifically discussing non-ignored untracked files above).
However on the topic of precious ignored files...both checkout and
merge have a --[no-]overwriite-ignore flag to select this behavior.
Unfortunately, the merge command only passes that flag along to the
fast-forwarding code path and ignores it for all other merge backends.
But merge-ort could trivially be made to handle it (search for the
line of code that reads "if (1/* FIXME: opts->overwrite_ignore*/)" and
note opts->overwrite_ignore isn't a flag that exists, yet), and then
it'd just need to be threaded through merge/rebase/cherry-pick/revert
toplevel commands down to that line of code.  Also, my preliminary
patches touch on the ignore handling for other codepaths and make it
clear how one could support such a flag for those other cases; I'll
leave some comments in the cover letter when I submit it.  Anyway, if
we were to get those other codepaths all hooked up, perhaps we could
add a core.overwrite_ignored option defaulting to true and giving
people a place to just configure this once.  I would much rather a
global option than attempting to provide another class of file that
users have to configure (ignored but precious), especially as we have
had plenty of bugs and problems just dealing with the two classes of
'untracked' and 'ignored' already.

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v2 0/7] Drop support for git rebase --preserve-merges
  @ 2021-09-07 17:33  0%         ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2021-09-07 17:33 UTC (permalink / raw)
  To: Johannes Sixt
  Cc: Junio C Hamano, Johannes Schindelin via GitGitGadget, git,
	Eric Wong

Hi Hannes,

On Thu, 2 Sep 2021, Johannes Sixt wrote:

> Am 02.09.21 um 16:18 schrieb Johannes Schindelin:
> > On Wed, 1 Sep 2021, Junio C Hamano wrote:
> >> A good goal.  There is no remaining use case where (a fictitious and
> >> properly working version of) "--preserve-merges" option cannot be
> >> replaced by "--rebase-merges", is it?  I somehow had a feeling that
> >> the other Johannes (sorry if it weren't you, j6t) had cases that the
> >> former worked better, but perhaps I am mis-remembering things.
> >
> > I think that I managed to address whatever concerns there were about the
> > `--rebase-merges` backend in the meantime.
>
> That was either my suggestion/desire to make no-rebase-cousins the
> default. That has been settled.
>
> Or my wish not to redo the merge, but to replay the first-parent
> difference. The idea never got traction, and I've long since abandoned
> my implementation of it.

Thank you for clarifying.

Yes, I remember how that idea came up, and I even tried that strategy for
a couple of merging rebases of Git for Windows' branch thicket. Sadly, it
did not work half as well as I had hoped.

The best idea I had back then still is in want of being implemented: sort
of a "four-way merge". It is basically the same as a three-way merge, but
allows for the pre-images to differ in the context (and yes, this cannot
be represented using the current conflict markers). Definitely not
trivial.

> > To be honest, I developed one (minor) concern in the meantime... Should we
> > maybe try to be nicer to our users and keep handling the
> > `--preserve-merges` option by explicitly erroring out with the suggestion
> > to use `--rebase-merges` instead? Not everybody reads release notes, after
> > all. In fact, it is my experience that preciously few users have the time
> > to even skim release notes...
>
> A valid concern, I would think.

Good. Since you concur with my hunch, I implemented that change.

Thank you for reviewing,
Dscho

^ permalink raw reply	[relevance 0%]

Results 1-200 of ~1300   | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2019-11-23 20:50     [PATCH 0/8] Drop support for git rebase --preserve-merges Johannes Schindelin via GitGitGadget
2021-09-01 11:57     ` [PATCH v2 0/7] " Johannes Schindelin via GitGitGadget
2021-09-01 22:25       ` Junio C Hamano
2021-09-02 14:18         ` Johannes Schindelin
2021-09-02 20:06           ` Johannes Sixt
2021-09-07 17:33  0%         ` Johannes Schindelin
2021-03-17 20:49     [PATCH v7 00/15] Rewrite the remaining merge strategies from shell to C Alban Gruin
2022-08-09 18:54     ` [PATCH v8 00/14] " Alban Gruin
2022-08-09 18:54  1%   ` [PATCH v8 07/14] merge-one-file: rewrite in C Alban Gruin
     [not found]     <CAG2t84Uaw-Kdp+EXU8CY1QYfykFQj-hGLJnTSH8MYO8Vi_yqgA@mail.gmail.com>
2021-09-03 20:33     ` Aborting 'rebase main feat' removes unversioned files Fedor Biryukov
2021-09-04  6:57       ` Bagas Sanjaya
2021-09-04  9:48         ` Jeff King
2021-09-04  9:51           ` Fedor Biryukov
2021-09-04 10:18             ` Jeff King
2021-09-05  5:32               ` Elijah Newren
2021-09-05  7:43                 ` Ævar Arnfjörð Bjarmason
2021-09-08  0:40  5%               ` Elijah Newren
2021-09-05 22:31                 ` Junio C Hamano
2021-09-08  0:41  0%               ` Elijah Newren
2021-09-08  2:17     [PATCH 0/2] A pair of git am --abort issues Elijah Newren via GitGitGadget
2021-09-08  2:17  5% ` [PATCH 1/2] t4151: document a pair of am --abort bugs Elijah Newren via GitGitGadget
2021-09-08  5:13  0%   ` Bagas Sanjaya
2021-09-08  5:24  0%     ` Elijah Newren
2021-09-10 10:31     ` [PATCH v2 0/3] A pair of git am --abort issues Elijah Newren via GitGitGadget
2021-09-10 10:31  5%   ` [PATCH v2 2/3] t4151: add a few am --abort tests Elijah Newren via GitGitGadget
2021-09-18 23:15  6% [PATCH 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
2021-09-18 23:15  9% ` [PATCH 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
2021-09-19 13:44  0%   ` Ævar Arnfjörð Bjarmason
2021-09-20 14:48  0%     ` Elijah Newren
2021-09-24  6:37  4% ` [PATCH v2 0/6] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
2021-09-24  6:37  9%   ` [PATCH v2 1/6] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
2021-09-24  6:37       ` [PATCH v2 2/6] Change unpack_trees' 'reset' flag into an enum Elijah Newren via GitGitGadget
2021-09-24 17:35  5%     ` Junio C Hamano
2021-09-26  6:50  0%       ` Elijah Newren
2021-09-27 16:33  4%   ` [PATCH v3 00/11] Fix various issues around removal of untracked files/directories Elijah Newren via GitGitGadget
2021-09-27 16:33  9%     ` [PATCH v3 01/11] t2500: add various tests for nuking untracked files Elijah Newren via GitGitGadget
2021-09-27 16:33         ` [PATCH v3 03/11] read-tree, merge-recursive: overwrite ignored files by default Elijah Newren via GitGitGadget
2021-12-13 17:12           ` Jack O'Connor
2021-12-13 20:10  6%         ` Elijah Newren
2021-10-04  1:11         ` [RFC PATCH v4 00/10] Fix various issues around removal of untracked files/directories Ævar Arnfjörð Bjarmason
2021-10-04  1:11  9%       ` [RFC PATCH v4 01/10] t2500: add various tests for nuking untracked files Ævar Arnfjörð Bjarmason
2021-10-04 14:38           ` [RFC PATCH v4 00/10] Fix various issues around removal of untracked files/directories Elijah Newren
2021-10-04 16:08  3%         ` Ævar Arnfjörð Bjarmason
2021-09-30 17:15  4% Should help.autocorrect be on by default? Brian Bartels
2021-09-30 23:16  0% ` Ævar Arnfjörð Bjarmason
2021-10-21 11:55     Notes from the Git Contributors' Summit 2021, virtual, Oct 19/20 Johannes Schindelin
2021-10-21 11:56  1% ` [Summit topic] Sparse checkout behavior and plans Johannes Schindelin
2021-10-30 22:32  1% [PATCH] Makefile: replace most hardcoded object lists with $(wildcard) Ævar Arnfjörð Bjarmason
2021-11-01 19:19     ` [PATCH v2 0/3] " Ævar Arnfjörð Bjarmason
2021-11-01 19:19  1%   ` [PATCH v2 3/3] " Ævar Arnfjörð Bjarmason
2021-11-06 10:57  0%     ` Phillip Wood
2021-11-21  0:46     [PATCH 0/8] Avoid removing the current working directory, even if it becomes empty Elijah Newren via GitGitGadget
2021-11-21  0:46     ` [PATCH 1/8] t2501: add various tests for removing the current working directory Elijah Newren via GitGitGadget
2021-11-21 17:57       ` Ævar Arnfjörð Bjarmason
2021-11-23  1:45         ` Elijah Newren
2021-11-23  2:19           ` Ævar Arnfjörð Bjarmason
2021-11-23  3:11             ` Elijah Newren
2021-11-25 10:04  3%           ` Ævar Arnfjörð Bjarmason
2021-11-30 11:54     [PATCH v9 00/17] Upstreaming the Scalar command Johannes Schindelin via GitGitGadget
2021-12-03 13:34     ` [PATCH v10 00/15] " Johannes Schindelin via GitGitGadget
2021-12-03 15:48       ` Elijah Newren
2021-12-05 10:02         ` Junio C Hamano
2021-12-07 20:05           ` Ævar Arnfjörð Bjarmason
2021-12-08 19:55             ` Junio C Hamano
2021-12-08 20:04  4%           ` [RFC/PATCH] Makefile: add test-all target Junio C Hamano
2021-12-09  3:44  0%             ` Ævar Arnfjörð Bjarmason
2021-12-09  0:57     [PATCH v3 0/4] A design for future-proofing fsync() configuration Neeraj K. Singh via GitGitGadget
2022-02-01  3:33     ` [PATCH v4 " Neeraj K. Singh via GitGitGadget
2022-02-01  3:33       ` [PATCH v4 2/4] core.fsync: introduce granular fsync control Neeraj Singh via GitGitGadget
2022-02-02  0:51  7%     ` Junio C Hamano
2022-02-02  1:42  0%       ` Junio C Hamano
2022-02-11 21:18  5%         ` Neeraj Singh
2022-02-11 20:38  0%       ` Neeraj Singh
2021-12-18 16:46     Bug report - Can create worktrees from bare repo / such worktrees can fool is_bare_repository() Sean Allred
2021-12-19 20:16     ` Eric Sunshine
2021-12-19 20:46       ` Sean Allred
2021-12-20  0:58         ` Eric Sunshine
2021-12-20 14:11           ` Derrick Stolee
2021-12-20 16:20  4%         ` Junio C Hamano
2021-12-26  4:28     [PATCH] name-rev: deprecate --stdin in favor of --annotate-text John Cai via GitGitGadget
2021-12-27 19:49  4% ` Junio C Hamano
2021-12-28  5:13  0%   ` John Cai
2022-01-01 22:59  0%   ` Johannes Schindelin
2022-03-09 23:03     [PATCH v5 0/5] A design for future-proofing fsync() configuration Neeraj K. Singh via GitGitGadget
2022-03-10  9:53     ` [PATCH 7/8] core.fsync: new option to harden loose references Patrick Steinhardt
2022-03-10 22:54  4%   ` Neeraj Singh
2022-04-28 10:33     [PATCH v1 0/2] Be nicer to the user on tracked/untracked merge conflicts Jonathan Bressat
2022-05-27 19:55  2% ` [PATCH v2 0/4] " Jonathan Bressat
2022-05-27 19:55  2%   ` [PATCH v2 2/4] merge with untracked file that are the same without failure Jonathan Bressat
2022-05-03 13:23     [PATCH 0/9] Incremental po/git.pot update and new l10n workflow Jiang Xin
2022-05-03 13:23  1% ` [PATCH 6/9] po/git.pot: remove this now generated file, see preceding commit Jiang Xin
2022-05-19  8:15     ` [PATCH v2 3/9] Makefile: have "make pot" not "reset --hard" Jiang Xin
2022-05-19  9:43       ` Ævar Arnfjörð Bjarmason
2022-05-19 13:19         ` Jiang Xin
2022-05-19 14:06  3%       ` Ævar Arnfjörð Bjarmason
2022-05-19  8:15  1% ` [PATCH v2 5/9] po/git.pot: this is now a generated file Jiang Xin
2022-05-19  8:15     [PATCH v2 0/9] Incremental po/git.pot update and new l10n workflow Jiang Xin
2022-05-23  1:25  1% ` [PATCH v3 5/9] po/git.pot: this is now a generated file Jiang Xin
2022-05-19 16:26     [PATCH 0/2] Fix merge restore state Elijah Newren via GitGitGadget
2022-06-19  6:50     ` [PATCH v2 0/6] " Elijah Newren via GitGitGadget
2022-06-19  6:50  3%   ` [PATCH v2 1/6] t6424: make sure a failed merge preserves local changes Junio C Hamano via GitGitGadget
2022-05-19 18:59  3% [PATCH] " Junio C Hamano
2022-05-23  1:25     [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow Jiang Xin
2022-05-23 15:21  1% ` [PATCH v4 5/9] po/git.pot: this is now a generated file Jiang Xin
2022-05-23  6:12     [PATCH v2 0/2] stash clear: added safety flag for stash clear subcommand Nadav Goldstein via GitGitGadget
2023-06-20  0:03     ` [PATCH v3] Introduced force flag to the git " Nadav Goldstein via GitGitGadget
2023-06-20  6:25  3%   ` Junio C Hamano
2023-06-20 19:54  0%     ` Nadav Goldstein
2023-06-20 21:01  0%       ` Eric Sunshine
2023-06-20 21:42  0%         ` Nadav Goldstein
2022-07-09 16:56     [PATCH 0/4] Add some Glossary terms, and extra renormalize information Philip Oakley via GitGitGadget
2022-10-22 22:25     ` [PATCH v2 0/3] Add some Glossary of terms information Philip Oakley
2022-10-22 22:25       ` [PATCH v2 3/3] glossary: add reachability bitmap description Philip Oakley
2022-10-24  7:43         ` Abhradeep Chakraborty
2022-10-24 16:39           ` Junio C Hamano
2022-10-24 21:23             ` Philip Oakley
2022-10-25 12:34               ` Derrick Stolee
2022-10-25 15:53  4%             ` Junio C Hamano
2022-08-18 18:51     [PATCH v4 1/3] hide-refs: add hook to force hide refs Calvin Wan
2022-08-19 15:30  4% ` 孙超
2022-08-20 22:33  1% [PATCH] t64??: convert 'test_create_repo' to 'git init' Elijah Newren via GitGitGadget
2022-08-26  3:49  1% ` [PATCH v2] t64xx: " Elijah Newren via GitGitGadget
2022-09-01  9:11     [PATCH 2/8] scalar: include in standard Git build & installation Johannes Schindelin
2022-09-01 13:17     ` [PATCH 0/5] Makefile: split up $(test_bindir_programs) Ævar Arnfjörð Bjarmason
2022-09-01 13:17 11%   ` [PATCH 2/5] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier Ævar Arnfjörð Bjarmason
2022-10-26 14:42       ` [PATCH v2 0/3] Makefile: fix issues with bin-wrappers/% rule Ævar Arnfjörð Bjarmason
2022-10-26 14:42 11%     ` [PATCH v2 2/3] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier Ævar Arnfjörð Bjarmason
2022-10-26 16:47  0%       ` Junio C Hamano
2022-10-31 22:28         ` [PATCH v3 0/4] Makefile: untangle bin-wrappers/% rule complexity Ævar Arnfjörð Bjarmason
2022-10-31 22:28 11%       ` [PATCH v3 2/4] Makefile: define "TEST_{PROGRAM,OBJS}" variables earlier Ævar Arnfjörð Bjarmason
2022-10-06 15:01     [PATCH 0/3] [RFC] tests: add test_todo() for known failures Phillip Wood via GitGitGadget
2022-10-06 19:28  2% ` Ævar Arnfjörð Bjarmason
2022-10-07 13:26  0%   ` Phillip Wood
2022-10-15 18:09     [suggestion] Fail cherry-pick if it overwrites untracked files with the matching file names Rupinderjeet Singh
2022-10-15 18:35  4% ` Junio C Hamano
2022-10-15 19:09  0%   ` Rupinderjeet Singh
2022-10-16 17:08  4%     ` Junio C Hamano
2022-10-16  2:07       ` Elijah Newren
2022-10-16 16:57  6%     ` Junio C Hamano
2022-11-09 22:46  3% [PATCH] Makefile: fix cygwin build failure Ramsay Jones
2022-12-19 14:50     [PATCH] ci: only run win+VS build & tests in Git for Windows' fork Johannes Schindelin via GitGitGadget
2022-12-19 17:49     ` Ævar Arnfjörð Bjarmason
2022-12-20  9:35  3%   ` Johannes Schindelin
2023-02-05 16:24     [PATCH] pull: conflict hint pull.rebase suggestion should offer "merges" vs "true" Tao Klerks via GitGitGadget
2023-02-16  3:22     ` Alex Henrie
2023-02-16 12:31       ` Tao Klerks
2023-02-17  3:15         ` Alex Henrie
2023-02-18  3:17           ` Elijah Newren
2023-02-18 16:39             ` Phillip Wood
2023-02-20  8:03               ` Tao Klerks
2023-02-22 14:27                 ` Sergey Organov
2023-02-24  7:06                   ` Elijah Newren
2023-02-24 22:06  5%                 ` Sergey Organov
2023-02-24 23:59  0%                   ` Elijah Newren
2023-02-18  9:38  4% Bug: fsck and repack don't agree when a worktree index extension is "broken" Johannes Sixt
2023-02-24  8:05  0% ` [PATCH 0/3] fsck index files from all worktrees Jeff King
2023-02-26 21:49  0%   ` Johannes Sixt
2023-03-08 22:39     Fetching everything in another bare repo Paul Smith
2023-03-09  6:41     ` Jeff King
2023-03-09 13:55       ` Paul Smith
2023-03-09 15:35  5%     ` Jeff King
2023-03-09 17:57  0%       ` Konstantin Ryabitsev
2023-03-19  6:27     [PATCH 00/16] Header cleanups Elijah Newren via GitGitGadget
2023-03-19  6:27  2% ` [PATCH 13/16] setup.h: move declarations for setup.c functions from cache.h Elijah Newren via GitGitGadget
2023-03-21  6:25     ` [PATCH v2 00/16] Header cleanups Elijah Newren via GitGitGadget
2023-03-21  6:26  2%   ` [PATCH v2 13/16] setup.h: move declarations for setup.c functions from cache.h Elijah Newren via GitGitGadget
2023-03-23 16:22     [PATCH 0/8] sequencer refactoring Oswald Buddenhagen
2023-03-23 16:22     ` [PATCH 5/8] rebase: preserve interactive todo file on checkout failure Oswald Buddenhagen
2023-03-23 20:16  6%   ` Junio C Hamano
2023-03-23 23:23  4%     ` Oswald Buddenhagen
2023-03-24  4:31  0%       ` Junio C Hamano
2023-04-01 20:50  4% Add a way to disable «git clean» per repo Guillem Jover
2023-05-11 23:20     [PATCH v3 0/2] pack-objects: introduce `pack.extraRecentObjectsHook` Taylor Blau
2023-05-11 23:20     ` [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook` Taylor Blau
2023-05-12 21:24  3%   ` Jeff King
2023-05-12 21:36  0%     ` Taylor Blau
2023-05-12 21:45  0%     ` Jeff King
2023-05-15 20:49  0%       ` Taylor Blau
2023-05-15 20:38  7%     ` Taylor Blau
2023-05-16  0:23  5% ` [PATCH v4 0/2] gc: introduce `gc.recentObjectsHook` Taylor Blau
2023-05-16  0:24  8%   ` [PATCH v4 2/2] " Taylor Blau
2023-05-24 23:21  6%     ` Glen Choo
2023-06-07 22:56  5%       ` Taylor Blau
2023-06-07 22:58  5% ` [PATCH v5 0/2] " Taylor Blau
2023-06-07 22:58  8%   ` [PATCH v5 2/2] " Taylor Blau
2023-05-23 23:17     [PATCH 0/2] Fix behavior of worktree config in submodules Victoria Dye via GitGitGadget
2023-05-26  1:32     ` [PATCH v2 0/3] " Victoria Dye via GitGitGadget
2023-05-26  1:33       ` [PATCH v2 3/3] repository: move 'repository_format_worktree_config' to repo scope Victoria Dye via GitGitGadget
2023-05-31 22:17         ` Glen Choo
2023-06-01  4:43  4%       ` Junio C Hamano
2023-05-26 18:43     [PATCH 0/3] Create stronger guard rails on replace refs Derrick Stolee via GitGitGadget
2023-05-26 18:43  3% ` [PATCH 1/3] repository: create disable_replace_refs() Derrick Stolee via GitGitGadget
2023-05-31  4:41  0%   ` Elijah Newren
2023-06-02 14:29  2% ` [PATCH v2 0/3] Create stronger guard rails on replace refs Derrick Stolee via GitGitGadget
2023-06-14 19:25     [PATCH 0/9] Repack objects into separate packfiles based on a filter Christian Couder
2023-06-14 19:25  2% ` [PATCH 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-06-16  0:43  5%   ` Junio C Hamano
2023-06-21 14:40  0%     ` Christian Couder
2023-06-21 16:53           ` Junio C Hamano
2023-06-22  8:39  3%         ` Christian Couder
2023-07-05  6:08     ` [PATCH v2 0/8] Repack objects into separate packfiles based on a filter Christian Couder
2023-07-05  6:08  2%   ` [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-07-05 17:53  0%     ` Junio C Hamano
2023-07-24  9:01  0%       ` Christian Couder
2023-07-24  8:59  1%   ` [PATCH v3 0/8] Repack objects into separate packfiles based on a filter Christian Couder
2023-07-24  8:59  2%     ` [PATCH v3 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-08-08  8:26  1%     ` [PATCH v4 0/8] Repack objects into separate packfiles based on a filter Christian Couder
2023-08-08  8:26  2%       ` [PATCH v4 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-08-12  0:00           ` [PATCH v5 0/8] Repack objects into separate packfiles based on a filter Christian Couder
2023-08-12  0:00  2%         ` [PATCH v5 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-09-11 15:06             ` [PATCH v6 0/9] Repack objects into separate packfiles based on a filter Christian Couder
2023-09-11 15:06  2%           ` [PATCH v6 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-09-25 15:25               ` [PATCH v7 0/9] Repack objects into separate packfiles based on a filter Christian Couder
2023-09-25 15:25  2%             ` [PATCH v7 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-10-02 16:54                 ` [PATCH v8 0/9] Repack objects into separate packfiles based on a filter Christian Couder
2023-10-02 16:55  2%               ` [PATCH v8 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-06-21 10:21  4% [PATCH] t7701: make annotated tag unreachable Taylor Blau
2023-06-24  4:38     Jeff King
2023-06-24 14:33  4% ` [PATCH v2] " Taylor Blau
2023-07-18 22:29     [PATCH] short help: allow multi-line opthelp Junio C Hamano
2023-07-18 22:54     ` [PATCH v2] " Junio C Hamano
2023-07-18 22:58  3%   ` [RFC] short help: allow a gap smaller than USAGE_GAP Junio C Hamano
2023-07-21 17:31     Lost files after git stash && git stash pop Till Friebe
2023-07-22 21:44  4% ` Torsten Bögershausen
2023-07-23 10:01  0%   ` Phillip Wood
2023-08-03  3:23     .gitignore is not enough Aleem Zaki
2023-08-03  5:35     ` Hilco Wijbenga
2023-08-03 17:17       ` Johannes Sixt
2023-08-03 21:38  4%     ` brian m. carlson
2023-08-03 21:47  0%       ` Aleem Zaki
2023-09-14  9:54     skip-worktree autostash on pull Blake Campbell
2023-09-14 21:37  4% ` brian m. carlson
2023-10-03  0:30     What's cooking in git.git (Oct 2023, #01; Mon, 2) Junio C Hamano
2023-10-03  7:01     ` Sergey Organov
2023-10-03 16:33       ` Junio C Hamano
2023-10-03 17:59         ` Sergey Organov
2023-10-04  8:20           ` Junio C Hamano
2023-10-04 11:18             ` Sergey Organov
2023-10-05 10:25               ` Junio C Hamano
2023-10-05 20:59  4%             ` Sergey Organov
2023-10-10 12:37 20% [RFC] Define "precious" attribute and support it in `git clean` Sebastian Thiel
2023-10-10 13:38 12% ` Kristoffer Haugsbakk
2023-10-10 14:10 12%   ` Josh Triplett
2023-10-10 17:07 13%     ` Junio C Hamano
2023-10-12  8:47 13%       ` Josh Triplett
2023-10-10 19:10 13%     ` Kristoffer Haugsbakk
2023-10-12  9:04 13%       ` Josh Triplett
2023-10-10 17:02 12% ` Junio C Hamano
2023-10-11 10:06 12%   ` Richard Kerry
2023-10-11 22:40 12%     ` Jeff King
2023-10-11 23:35 13%     ` Junio C Hamano
2023-10-12 10:55 11%   ` Sebastian Thiel
2023-10-12 16:58 12%     ` Junio C Hamano
2023-10-13  9:09 12%       ` Sebastian Thiel
2023-10-13 16:39 11%         ` Junio C Hamano
2023-10-14  7:30 10%           ` Sebastian Thiel
2023-10-13 10:06 12%       ` Phillip Wood
2023-10-14 16:10  6%         ` Junio C Hamano
2023-10-13 11:25 11%       ` Oswald Buddenhagen
2023-10-14  5:59 12%   ` Josh Triplett
2023-10-14 17:41 12%     ` Junio C Hamano
2023-10-15  6:44 11%     ` Elijah Newren
2023-10-15  7:33 12%       ` Sebastian Thiel
2023-10-15 16:31 12%         ` Junio C Hamano
2023-10-16  6:02 12%           ` Sebastian Thiel
2023-10-23  7:15 12%           ` Sebastian Thiel
2023-10-29  6:44  9%             ` Elijah Newren
2023-10-11 21:41 10% ` Kristoffer Haugsbakk
2023-10-26 23:16     [PATCH 2/2] pretty: add '%aA' to show domain-part of email addresses Liam Beguin
2023-10-27 18:40     ` Kousik Sanagavarapu
2023-10-28  0:12       ` Junio C Hamano
2023-10-28  2:13         ` Jeff King
2023-10-29 23:53  4%       ` Junio C Hamano
2023-11-20 20:21  4%         ` Junio C Hamano
2023-12-10 21:07  0%           ` Liam Beguin
2023-10-30 14:11     [PATCH v3] bugreport: reject positional arguments Phillip Wood
2023-10-31  5:23     ` [PATCH 0/2] Deprecate test_i18ngrep further Junio C Hamano
2023-10-31  5:23  1%   ` [PATCH 2/2] tests: teach callers of test_i18ngrep to use test_grep Junio C Hamano
2023-12-06 11:51     [PATCH 0/7] standardize incompatibility messages René Scharfe
2023-12-06 11:51  5% ` [PATCH 2/7] repack: use die_for_incompatible_opt3() for -A/-k/--cruft René Scharfe
2023-12-06 19:18  0%   ` Taylor Blau
2023-12-27  2:25 19% [PATCH] precious-files.txt: new document proposing new precious file type Elijah Newren via GitGitGadget
2023-12-27  5:28 12% ` Junio C Hamano
2023-12-27  6:54 14%   ` Elijah Newren
2023-12-27 22:15 15%     ` Junio C Hamano
2024-01-18  7:51 14%       ` Sebastian Thiel
2024-01-18 19:14 13%         ` Junio C Hamano
2024-01-18 21:33 12%           ` Sebastian Thiel
2024-01-19  2:37 10%             ` Elijah Newren
2024-01-19  7:51 13%               ` Sebastian Thiel
2024-01-19 18:45  7%                 ` Junio C Hamano
2024-01-19  2:58 11%           ` Elijah Newren
2024-01-19 16:53 12%             ` Phillip Wood
2024-01-19 17:17 12%               ` Junio C Hamano
2024-01-24  6:50  7%               ` Elijah Newren
2024-02-11 22:08 12%   ` Sebastian Thiel
2024-01-09 12:17     [PATCH 0/6] t: mark "files"-backend specific tests Patrick Steinhardt
2024-01-09 12:17  5% ` [PATCH 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
2024-01-09 18:43  0%   ` Taylor Blau
2024-01-10  9:01  3% ` [PATCH v2 0/6] t: mark "files"-backend specific tests Patrick Steinhardt
2024-01-10  9:01  5%   ` [PATCH v2 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
2024-01-24  8:45     ` [PATCH v3 0/6] t: mark "files"-backend specific tests Patrick Steinhardt
2024-01-24  8:45  4%   ` [PATCH v3 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
2024-01-29 11:07     ` [PATCH v4 0/6] t: mark "files"-backend specific tests Patrick Steinhardt
2024-01-29 11:07  4%   ` [PATCH v4 3/6] t1302: make tests more robust with new extensions Patrick Steinhardt
2024-01-09 20:20     what should "git clean -n -f [-d] [-x] <pattern>" do? Junio C Hamano
2024-01-19  2:07     ` Elijah Newren
2024-01-23 15:10       ` Sergey Organov
2024-01-23 18:34         ` Junio C Hamano
2024-01-24  8:23           ` Sergey Organov
2024-01-24 17:21  4%         ` Junio C Hamano
2024-01-25 17:11  0%           ` Sergey Organov
2024-01-25 17:46                 ` Junio C Hamano
2024-01-25 20:27                   ` Sergey Organov
2024-01-25 20:31                     ` Sergey Organov
2024-01-26  7:44                       ` Junio C Hamano
2024-01-26 12:09                         ` Sergey Organov
2024-01-27 10:00  5%                       ` Junio C Hamano
2024-01-16 22:22     [RFC PATCH 0/4] test-tool: add unit test suite runner Josh Steadmon
2024-02-03  0:50     ` [RFC PATCH v2 0/6] " Josh Steadmon
2024-02-03  0:50  3%   ` [RFC PATCH v2 1/6] t0080: turn t-basic unit test into a helper Josh Steadmon
2024-02-23 23:33     ` [PATCH v3 0/7] test-tool: add unit test suite runner Josh Steadmon
2024-02-23 23:33  3%   ` [PATCH v3 1/7] t0080: turn t-basic unit test into a helper Josh Steadmon
2024-04-24 19:14     ` [PATCH v4 0/7] test-tool: add unit test suite runner Josh Steadmon
2024-04-24 19:14  3%   ` [PATCH v4 1/7] t0080: turn t-basic unit test into a helper Josh Steadmon
2024-04-30 19:55     ` [PATCH v5 0/7] test-tool: add unit test suite runner Josh Steadmon
2024-04-30 19:55  3%   ` [PATCH v5 1/7] t0080: turn t-basic unit test into a helper Josh Steadmon
2024-05-06 19:57     ` [PATCH v6 0/7] test-tool: add unit test suite runner Josh Steadmon
2024-05-06 19:57  3%   ` [PATCH v6 1/7] t0080: turn t-basic unit test into a helper Josh Steadmon
2024-01-19  5:59     [PATCH 1/4] sequencer: Do not require `allow_empty` for redundant commit options brianmlyles
2024-02-10  7:43     ` [PATCH v2 6/8] cherry-pick: decouple `--allow-empty` and `--keep-redundant-commits` Brian Lyles
2024-02-22 16:35       ` Phillip Wood
2024-02-22 18:41  4%     ` Junio C Hamano
     [not found]     <CAGF1KhWNaO_TUuCPo2L_HzNnR+FnB1Q4H6_xQ2owoH+SnynzEg@mail.gmail.com>
2024-01-22 20:45     ` Fwd: Unexpected behavior of ls-files command when using --others --exclude-from, and a .gitignore file which resides in a subdirectory Raúl Núñez de Arenas Coronado
2024-01-22 20:52       ` Junio C Hamano
2024-01-22 21:07         ` Raúl Núñez de Arenas Coronado
2024-01-22 21:42  6%       ` Junio C Hamano
2024-01-23  6:08  0%         ` Raúl Núñez de Arenas Coronado
2024-01-22 21:34       ` Jeff King
2024-01-23  5:40  5%     ` Raúl Núñez de Arenas Coronado
2024-01-24  1:09           ` Jeff King
2024-01-24 14:22  4%         ` Raúl Núñez de Arenas Coronado
2024-02-25 16:57     [PATCH v2 8/8] cherry-pick: add `--empty` for more robust redundant commit handling phillip.wood123
2024-02-26  3:32  0% ` Brian Lyles
2024-02-27 10:39  0%   ` phillip.wood123
2024-02-27 17:33  0%     ` Junio C Hamano
2024-02-29 20:57     [PATCH 0/1] Documentation/user-manual.txt: try to clarify on object hashes Dirk Gouders
2024-02-29 13:05     ` [PATCH 1/1] Documentation/user-manual.txt: example for generating " Dirk Gouders
2024-02-29 21:37  3%   ` Junio C Hamano
2024-02-29 22:35  0%     ` Dirk Gouders
2024-03-28  7:46     Ignore specific changes but not the entire file Mohammad Al Zouabi
2024-03-28 22:20  4% ` brian m. carlson
2024-04-07  5:10     [RFC PATCH 0/1] Add lines to `git log --graph` to separate connected regions Lê Duy Quang
2024-04-07  5:30     ` Eric Sunshine
2024-04-07  5:37  4%   ` Junio C Hamano
2024-04-07  6:40  4%     ` Quang Lê Duy
2024-04-07  8:34  0%       ` Dragan Simic
2024-04-08 15:49  0%     ` Junio C Hamano
2024-05-02  6:51     [PATCH 00/11] reftable: expose write options as config Patrick Steinhardt
2024-05-02  6:52  3% ` [PATCH 09/11] refs/reftable: allow disabling writing the object index Patrick Steinhardt
2024-05-10 10:29     ` [PATCH v2 00/11] reftable: expose write options as config Patrick Steinhardt
2024-05-10 10:30  3%   ` [PATCH v2 09/11] refs/reftable: allow disabling writing the object index Patrick Steinhardt

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).