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 v4 08/14] builtin/config: introduce "get" subcommand
  @ 2024-05-03  9:57  3%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-05-03  9:57 UTC (permalink / raw)
  To: git
  Cc: Kristoffer Haugsbakk, Taylor Blau, Jean-Noël AVILA,
	Eric Sunshine, Junio C Hamano

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

Introduce a new "get" subcommand to git-config(1). Please refer to
preceding commits regarding the motivation behind this change.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/git-config.txt |  93 ++++++++++++-------------
 builtin/config.c             |  69 +++++++++++++++---
 t/t1300-config.sh            | 131 ++++++++++++++++++++++++-----------
 3 files changed, 194 insertions(+), 99 deletions(-)

diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index c83c97cb7e..d0878663db 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -10,18 +10,14 @@ SYNOPSIS
 --------
 [verse]
 'git config list' [<file-option>] [<display-option>] [--includes]
+'git config get' [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>
 'git config' [<file-option>] [--type=<type>] [--comment=<message>] [--fixed-value] [--show-origin] [--show-scope] [-z|--null] <name> [<value> [<value-pattern>]]
 'git config' [<file-option>] [--type=<type>] [--comment=<message>] --add <name> <value>
 'git config' [<file-option>] [--type=<type>] [--comment=<message>] [--fixed-value] --replace-all <name> <value> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get-all <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] --get-regexp <name-regex> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [-z|--null] --get-urlmatch <name> <URL>
 'git config' [<file-option>] [--fixed-value] --unset <name> [<value-pattern>]
 'git config' [<file-option>] [--fixed-value] --unset-all <name> [<value-pattern>]
 'git config' [<file-option>] --rename-section <old-name> <new-name>
 'git config' [<file-option>] --remove-section <name>
-'git config' [<file-option>] --get-color <name> [<default>]
 'git config' [<file-option>] --get-colorbool <name> [<stdout-is-tty>]
 'git config' [<file-option>] -e | --edit
 
@@ -80,6 +76,12 @@ COMMANDS
 list::
 	List all variables set in config file, along with their values.
 
+get::
+	Emits the value of the specified key. If key is present multiple times
+	in the configuration, emits the last value. If `--all` is specified,
+	emits all values associated with key. Returns error code 1 if key is
+	not present.
+
 [[OPTIONS]]
 OPTIONS
 -------
@@ -105,22 +107,16 @@ OPTIONS
 	not contain linefeed characters (no multi-line comments are
 	permitted).
 
---get::
-	Get the value for a given key (optionally filtered by a regex
-	matching the value). Returns error code 1 if the key was not
-	found and the last value if multiple key values were found.
-
---get-all::
-	Like get, but returns all values for a multi-valued key.
+--all::
+	With `get`, return all values for a multi-valued key.
 
---get-regexp::
-	Like --get-all, but interprets the name as a regular expression and
-	writes out the key names.  Regular expression matching is currently
-	case-sensitive and done against a canonicalized version of the key
-	in which section and variable names are lowercased, but subsection
-	names are not.
+---regexp::
+	With `get`, interpret the name as a regular expression. Regular
+	expression matching is currently case-sensitive and done against a
+	canonicalized version of the key in which section and variable names
+	are lowercased, but subsection names are not.
 
---get-urlmatch <name> <URL>::
+--url=<URL>::
 	When given a two-part <name> as <section>.<key>, the value for
 	<section>.<URL>.<key> whose <URL> part matches the best to the
 	given URL is returned (if no such key exists, the value for
@@ -251,7 +247,7 @@ Valid `<type>`'s include:
 
 --name-only::
 	Output only the names of config variables for `list` or
-	`--get-regexp`.
+	`get`.
 
 --show-origin::
 	Augment the output of all queried config options with the
@@ -275,17 +271,6 @@ Valid `<type>`'s include:
 	When the color setting for `name` is undefined, the command uses
 	`color.ui` as fallback.
 
---get-color <name> [<default>]::
-
-	Find the color configured for `name` (e.g. `color.diff.new`) and
-	output it as the ANSI color escape sequence to the standard
-	output.  The optional `default` parameter is used instead, if
-	there is no color configured for `name`.
-+
-`--type=color [--default=<default>]` is preferred over `--get-color`
-(but note that `--get-color` will omit the trailing newline printed by
-`--type=color`).
-
 -e::
 --edit::
 	Opens an editor to modify the specified config file; either
@@ -299,7 +284,7 @@ Valid `<type>`'s include:
 	config files.
 
 --default <value>::
-  When using `--get`, and the requested variable is not found, behave as if
+  When using `get`, and the requested variable is not found, behave as if
   <value> were the value assigned to that variable.
 
 DEPRECATED MODES
@@ -308,15 +293,33 @@ DEPRECATED MODES
 The following modes have been deprecated in favor of subcommands. It is
 recommended to migrate to the new syntax.
 
+'git config <name>'::
+	Replaced by `git config get <name>`.
+
 -l::
 --list::
 	Replaced by `git config list`.
 
+--get <name> [<value-pattern>]::
+	Replaced by `git config get [--value=<pattern>] <name>`.
+
+--get-all <name> [<value-pattern>]::
+	Replaced by `git config get [--value=<pattern>] --all --show-names <name>`.
+
+--get-regexp <name-regexp>::
+	Replaced by `git config get --all --show-names --regexp <name-regexp>`.
+
+--get-urlmatch <name> <URL>::
+	Replaced by `git config get --all --show-names --url=<URL> <name>`.
+
+--get-color <name> [<default>]::
+	Replaced by `git config get --type=color [--default=<default>] <name>`.
+
 CONFIGURATION
 -------------
 `pager.config` is only respected when listing configuration, i.e., when
-using `list` or any of the `--get-*` which may return multiple results.
-The default is to use a pager.
+using `list` or `get` which may return multiple results. The default is to use
+a pager.
 
 [[FILES]]
 FILES
@@ -519,25 +522,19 @@ you have to provide a regex matching the value of exactly one line.
 To query the value for a given key, do
 
 ------------
-% git config --get core.filemode
-------------
-
-or
-
-------------
-% git config core.filemode
+% git config get core.filemode
 ------------
 
 or, to query a multivar:
 
 ------------
-% git config --get core.gitproxy "for kernel.org$"
+% git config get --value="for kernel.org$" core.gitproxy
 ------------
 
 If you want to know all the values for a multivar, do:
 
 ------------
-% git config --get-all core.gitproxy
+% git config get --all --show-names core.gitproxy
 ------------
 
 If you like to live dangerously, you can replace *all* core.gitproxy by a
@@ -571,8 +568,8 @@ script:
 
 ------------
 #!/bin/sh
-WS=$(git config --get-color color.diff.whitespace "blue reverse")
-RESET=$(git config --get-color "" "reset")
+WS=$(git config get --type=color --default="blue reverse" color.diff.whitespace)
+RESET=$(git config get --type=color --default="reset" "")
 echo "${WS}your whitespace color or blue reverse${RESET}"
 ------------
 
@@ -580,11 +577,11 @@ For URLs in `https://weak.example.com`, `http.sslVerify` is set to
 false, while it is set to `true` for all others:
 
 ------------
-% git config --type=bool --get-urlmatch http.sslverify https://good.example.com
+% git config get --type=bool --url=https://good.example.com http.sslverify
 true
-% git config --type=bool --get-urlmatch http.sslverify https://weak.example.com
+% git config get --type=bool --url=https://weak.example.com http.sslverify
 false
-% git config --get-urlmatch http https://weak.example.com
+% git config get --url=https://weak.example.com http
 http.cookieFile /tmp/cookie.txt
 http.sslverify false
 ------------
diff --git a/builtin/config.c b/builtin/config.c
index f89ddce8da..9e7ae49c02 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -17,7 +17,7 @@
 
 static const char *const builtin_config_usage[] = {
 	N_("git config list [<file-option>] [<display-option>] [--includes]"),
-	N_("git config [<options>]"),
+	N_("git config get [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>"),
 	NULL
 };
 
@@ -26,6 +26,11 @@ static const char *const builtin_config_list_usage[] = {
 	NULL
 };
 
+static const char *const builtin_config_get_usage[] = {
+	N_("git config get [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>"),
+	NULL
+};
+
 static char *key;
 static regex_t *key_regexp;
 static const char *value_pattern;
@@ -722,6 +727,16 @@ static void handle_nul(void) {
 	OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given config file")), \
 	OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"), N_("read config from given blob object"))
 
+#define CONFIG_TYPE_OPTIONS \
+	OPT_GROUP(N_("Type")), \
+	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type), \
+	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL), \
+	OPT_CALLBACK_VALUE(0, "int", &type, N_("value is decimal number"), TYPE_INT), \
+	OPT_CALLBACK_VALUE(0, "bool-or-int", &type, N_("value is --bool or --int"), TYPE_BOOL_OR_INT), \
+	OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or string"), TYPE_BOOL_OR_STR), \
+	OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or directory name)"), TYPE_PATH), \
+	OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry date"), TYPE_EXPIRY_DATE)
+
 #define CONFIG_DISPLAY_OPTIONS \
 	OPT_GROUP(N_("Display options")), \
 	OPT_BOOL('z', "null", &end_nul, N_("terminate values with NUL byte")), \
@@ -746,14 +761,7 @@ static struct option builtin_config_options[] = {
 	OPT_CMDMODE('e', "edit", &actions, N_("open an editor"), ACTION_EDIT),
 	OPT_CMDMODE(0, "get-color", &actions, N_("find the color configured: slot [<default>]"), ACTION_GET_COLOR),
 	OPT_CMDMODE(0, "get-colorbool", &actions, N_("find the color setting: slot [<stdout-is-tty>]"), ACTION_GET_COLORBOOL),
-	OPT_GROUP(N_("Type")),
-	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type),
-	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL),
-	OPT_CALLBACK_VALUE(0, "int", &type, N_("value is decimal number"), TYPE_INT),
-	OPT_CALLBACK_VALUE(0, "bool-or-int", &type, N_("value is --bool or --int"), TYPE_BOOL_OR_INT),
-	OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or string"), TYPE_BOOL_OR_STR),
-	OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or directory name)"), TYPE_PATH),
-	OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry date"), TYPE_EXPIRY_DATE),
+	CONFIG_TYPE_OPTIONS,
 	CONFIG_DISPLAY_OPTIONS,
 	OPT_GROUP(N_("Other")),
 	OPT_STRING(0, "default", &default_value, N_("value"), N_("with --get, use default value when missing entry")),
@@ -799,8 +807,51 @@ static int cmd_config_list(int argc, const char **argv, const char *prefix)
 	return 0;
 }
 
+static int cmd_config_get(int argc, const char **argv, const char *prefix)
+{
+	const char *value_pattern = NULL, *url = NULL;
+	int flags = 0;
+	struct option opts[] = {
+		CONFIG_LOCATION_OPTIONS,
+		CONFIG_TYPE_OPTIONS,
+		OPT_GROUP(N_("Filter options")),
+		OPT_BOOL(0, "all", &do_all, N_("return all values for multi-valued config options")),
+		OPT_BOOL(0, "regexp", &use_key_regexp, N_("interpret the name as a regular expression")),
+		OPT_STRING(0, "value", &value_pattern, N_("pattern"), N_("show config with values matching the pattern")),
+		OPT_BIT(0, "fixed-value", &flags, N_("use string equality when comparing values to value pattern"), CONFIG_FLAGS_FIXED_VALUE),
+		OPT_STRING(0, "url", &url, N_("URL"), N_("show config matching the given URL")),
+		CONFIG_DISPLAY_OPTIONS,
+		OPT_BOOL(0, "show-names", &show_keys, N_("show config keys in addition to their values")),
+		OPT_GROUP(N_("Other")),
+		OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect include directives on lookup")),
+		OPT_STRING(0, "default", &default_value, N_("value"), N_("use default value when missing entry")),
+		OPT_END(),
+	};
+
+	argc = parse_options(argc, argv, prefix, opts, builtin_config_get_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	check_argc(argc, 1, 1);
+
+	if ((flags & CONFIG_FLAGS_FIXED_VALUE) && !value_pattern)
+		die(_("--fixed-value only applies with 'value-pattern'"));
+	if (default_value && (do_all || url))
+		die(_("--default= cannot be used with --all or --url="));
+	if (url && (do_all || use_key_regexp || value_pattern))
+		die(_("--url= cannot be used with --all, --regexp or --value"));
+
+	handle_config_location(prefix);
+	handle_nul();
+
+	setup_auto_pager("config", 1);
+
+	if (url)
+		return get_urlmatch(argv[0], url);
+	return get_value(argv[0], value_pattern, flags);
+}
+
 static struct option builtin_subcommand_options[] = {
 	OPT_SUBCOMMAND("list", &subcommand, cmd_config_list),
+	OPT_SUBCOMMAND("get", &subcommand, cmd_config_get),
 	OPT_END(),
 };
 
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index f77d2f7847..7ce13ed6cd 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -17,9 +17,15 @@ do
 case "$mode" in
 legacy)
 	mode_prefix="--"
+	mode_get=""
+	mode_get_all="--get-all"
+	mode_get_regexp="--get-regexp"
 	;;
 subcommands)
 	mode_prefix=""
+	mode_get="get"
+	mode_get_all="get --all"
+	mode_get_regexp="get --regexp --all --show-names"
 	;;
 *)
 	BUG "unknown mode $mode";;
@@ -398,7 +404,7 @@ test_expect_success 'multi-valued get-all returns all' '
 	wow
 	wow2 for me
 	EOF
-	git config --get-all nextsection.nonewline >actual &&
+	git config ${mode_get_all} nextsection.nonewline >actual &&
 	test_cmp expect actual
 '
 
@@ -500,7 +506,7 @@ nextsection.nonewline wow2 for me
 EOF
 
 test_expect_success '--get-regexp' '
-	git config --get-regexp in >output &&
+	git config ${mode_get_regexp} in >output &&
 	test_cmp expect output
 '
 
@@ -510,7 +516,7 @@ nextsection.nonewline
 EOF
 
 test_expect_success '--name-only --get-regexp' '
-	git config --name-only --get-regexp in >output &&
+	git config ${mode_get_regexp} --name-only in >output &&
 	test_cmp expect output
 '
 
@@ -521,7 +527,7 @@ EOF
 
 test_expect_success '--add' '
 	git config --add nextsection.nonewline "wow4 for you" &&
-	git config --get-all nextsection.nonewline > output &&
+	git config ${mode_get_all} nextsection.nonewline > output &&
 	test_cmp expect output
 '
 
@@ -543,21 +549,21 @@ test_expect_success 'get variable with empty value' '
 echo novalue.variable > expect
 
 test_expect_success 'get-regexp variable with no value' '
-	git config --get-regexp novalue > output &&
+	git config ${mode_get_regexp} novalue > output &&
 	test_cmp expect output
 '
 
 echo 'novalue.variable true' > expect
 
 test_expect_success 'get-regexp --bool variable with no value' '
-	git config --bool --get-regexp novalue > output &&
+	git config ${mode_get_regexp} --bool novalue > output &&
 	test_cmp expect output
 '
 
 echo 'emptyvalue.variable ' > expect
 
 test_expect_success 'get-regexp variable with empty value' '
-	git config --get-regexp emptyvalue > output &&
+	git config ${mode_get_regexp} emptyvalue > output &&
 	test_cmp expect output
 '
 
@@ -1131,7 +1137,7 @@ test_expect_success 'quoting' '
 '
 
 test_expect_success 'key with newline' '
-	test_must_fail git config "key.with
+	test_must_fail git config ${mode_get} "key.with
 newline" 123'
 
 test_expect_success 'value with newline' 'git config key.sub value.with\\\
@@ -1185,7 +1191,7 @@ test_expect_success '--null --list' '
 '
 
 test_expect_success '--null --get-regexp' '
-	git config --null --get-regexp "val[0-9]" >result.raw &&
+	git config ${mode_get_regexp} --null "val[0-9]" >result.raw &&
 	nul_to_q <result.raw >result &&
 	echo >>result &&
 	test_cmp expect result
@@ -1194,21 +1200,21 @@ test_expect_success '--null --get-regexp' '
 test_expect_success 'inner whitespace kept verbatim, spaces only' '
 	echo "foo   bar" >expect &&
 	git config section.val "foo   bar" &&
-	git config --get section.val >actual &&
+	git config ${mode_get} section.val >actual &&
 	test_cmp expect actual
 '
 
 test_expect_success 'inner whitespace kept verbatim, horizontal tabs only' '
 	echo "fooQQbar" | q_to_tab >expect &&
 	git config section.val "$(cat expect)" &&
-	git config --get section.val >actual &&
+	git config ${mode_get} section.val >actual &&
 	test_cmp expect actual
 '
 
 test_expect_success 'inner whitespace kept verbatim, horizontal tabs and spaces' '
 	echo "foo Q  bar" | q_to_tab >expect &&
 	git config section.val "$(cat expect)" &&
-	git config --get section.val >actual &&
+	git config ${mode_get} section.val >actual &&
 	test_cmp expect actual
 '
 
@@ -1283,11 +1289,11 @@ test_expect_success 'git -c can represent empty string' '
 '
 
 test_expect_success 'key sanity-checking' '
-	test_must_fail git config foo=bar &&
-	test_must_fail git config foo=.bar &&
-	test_must_fail git config foo.ba=r &&
-	test_must_fail git config foo.1bar &&
-	test_must_fail git config foo."ba
+	test_must_fail git config ${mode_get} foo=bar &&
+	test_must_fail git config ${mode_get} foo=.bar &&
+	test_must_fail git config ${mode_get} foo.ba=r &&
+	test_must_fail git config ${mode_get} foo.1bar &&
+	test_must_fail git config ${mode_get} foo."ba
 				z".bar &&
 	test_must_fail git config . false &&
 	test_must_fail git config .foo false &&
@@ -1336,7 +1342,7 @@ test_expect_success 'git -c complains about empty key and value' '
 '
 
 test_expect_success 'multiple git -c appends config' '
-	test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
+	test_config alias.x "!git -c x.two=2 config ${mode_get_regexp} ^x\.*" &&
 	cat >expect <<-\EOF &&
 	x.one 1
 	x.two 2
@@ -1502,7 +1508,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles old-style entries' '
 	v="${SQ}key.one=foo${SQ}" &&
 	v="$v  ${SQ}key.two=bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever=value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1515,7 +1521,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles new-style entries' '
 	v="${SQ}key.one${SQ}=${SQ}foo${SQ}" &&
 	v="$v  ${SQ}key.two${SQ}=${SQ}bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever${SQ}=${SQ}value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1529,7 +1535,7 @@ test_expect_success 'old and new-style entries can mix' '
 	v="$v ${SQ}key.newone${SQ}=${SQ}newfoo${SQ}" &&
 	v="$v ${SQ}key.oldtwo=oldbar${SQ}" &&
 	v="$v ${SQ}key.newtwo${SQ}=${SQ}newbar${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.oldone oldfoo
 	key.newone newfoo
@@ -1542,7 +1548,7 @@ test_expect_success 'old and new-style entries can mix' '
 test_expect_success 'old and new bools with ambiguous subsection' '
 	v="${SQ}key.with=equals.oldbool${SQ}" &&
 	v="$v ${SQ}key.with=equals.newbool${SQ}=" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.with equals.oldbool
 	key.with=equals.newbool
@@ -1556,7 +1562,7 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ} ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_get_regexp} "env.*" >actual &&
 	test_cmp expect actual &&
 
 	cat >expect <<-EOF &&
@@ -1564,12 +1570,12 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ$SQ$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_get_regexp} "env.*" >actual &&
 	test_cmp expect actual &&
 
 	test_must_fail env \
 		GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*"
+		git config ${mode_get_regexp} "env.*"
 '
 
 test_expect_success 'git --config-env=key=envvar support' '
@@ -1617,7 +1623,7 @@ test_expect_success 'git -c and --config-env work together' '
 	ENVVAR=env-value git \
 		-c bar.cmd=cmd-value \
 		--config-env=bar.env=ENVVAR \
-		config --get-regexp "^bar.*" >actual &&
+		config ${mode_get_regexp} "^bar.*" >actual &&
 	test_cmp expect actual
 '
 
@@ -1645,7 +1651,7 @@ test_expect_success 'git config handles environment config pairs' '
 	GIT_CONFIG_COUNT=2 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \
-		git config --get-regexp "pair.*" >actual &&
+		git config ${mode_get_regexp} "pair.*" >actual &&
 	cat >expect <<-EOF &&
 	pair.one foo
 	pair.two bar
@@ -1655,7 +1661,7 @@ test_expect_success 'git config handles environment config pairs' '
 
 test_expect_success 'git config ignores pairs without count' '
 	test_must_fail env GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
@@ -1663,7 +1669,7 @@ test_expect_success 'git config ignores pairs exceeding count' '
 	GIT_CONFIG_COUNT=1 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="value" \
-		git config --get-regexp "pair.*" >actual 2>error &&
+		git config ${mode_get_regexp} "pair.*" >actual 2>error &&
 	cat >expect <<-EOF &&
 	pair.one value
 	EOF
@@ -1674,14 +1680,14 @@ test_expect_success 'git config ignores pairs exceeding count' '
 test_expect_success 'git config ignores pairs with zero count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT=0 GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
 test_expect_success 'git config ignores pairs with empty count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT= GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
@@ -1720,7 +1726,7 @@ test_expect_success 'environment overrides config file' '
 	one = value
 	EOF
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=override \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1730,7 +1736,7 @@ test_expect_success 'environment overrides config file' '
 test_expect_success 'GIT_CONFIG_PARAMETERS overrides environment config' '
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \
 		GIT_CONFIG_PARAMETERS="${SQ}pair.one=override${SQ}" \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1805,20 +1811,28 @@ test_expect_success 'urlmatch' '
 
 	test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
 	test_must_be_empty actual &&
+	test_expect_code 1 git config get --url=https://good.example.com --bool doesnt.exist >actual &&
+	test_must_be_empty actual &&
 
 	echo true >expect &&
 	git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --bool --url=https://good.example.com http.SSLverify >actual &&
+	test_cmp expect actual &&
 
 	echo false >expect &&
 	git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --bool --url=https://weak.example.com http.sslverify >actual &&
+	test_cmp expect actual &&
 
 	{
 		echo http.cookiefile /tmp/cookie.txt &&
 		echo http.sslverify false
 	} >expect &&
 	git config --get-urlmatch HTTP https://weak.example.com >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://weak.example.com HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1834,6 +1848,8 @@ test_expect_success 'urlmatch with --show-scope' '
 	local	http.sslverify false
 	EOF
 	git config --get-urlmatch --show-scope HTTP https://weak.example.com >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://weak.example.com --show-scope HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1866,45 +1882,67 @@ test_expect_success 'urlmatch favors more specific URLs' '
 	echo http.cookiefile /tmp/root.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com/subdirectory HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com/subdirectory/nested HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/user.txt >expect &&
 	git config --get-urlmatch HTTP https://user@example.com/ >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://user@example.com/ HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://averylonguser@example.com/subdirectory HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/preceding.txt >expect &&
 	git config --get-urlmatch HTTP https://preceding.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://preceding.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/wildcard.txt >expect &&
 	git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://wildcard.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
 	git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://sub.example.com/wildcardwithsubdomain HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/trailing.txt >expect &&
 	git config --get-urlmatch HTTP https://trailing.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://trailing.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
 	git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://user@sub.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/multiwildcard.txt >expect &&
 	git config --get-urlmatch HTTP https://wildcard.example.org >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://wildcard.example.org HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -2027,7 +2065,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[one]
 	EOF
 	git config --unset two.subsection.key &&
-	test "not [two subsection]" = "$(git config one.key)" &&
+	test "not [two subsection]" = "$(git config ${mode_get} one.key)" &&
 	test_line_count = 3 .git/config
 '
 
@@ -2150,7 +2188,7 @@ test_expect_success '--show-origin with --get-regexp' '
 	file:$HOME/.gitconfig	user.global true
 	file:.git/config	user.local true
 	EOF
-	git config --show-origin --get-regexp "user\.[g|l].*" >output &&
+	git config ${mode_get_regexp} --show-origin "user\.[g|l].*" >output &&
 	test_cmp expect output
 '
 
@@ -2158,7 +2196,7 @@ test_expect_success '--show-origin getting a single key' '
 	cat >expect <<-\EOF &&
 	file:.git/config	local
 	EOF
-	git config --show-origin user.override >output &&
+	git config ${mode_get} --show-origin user.override >output &&
 	test_cmp expect output
 '
 
@@ -2290,7 +2328,7 @@ test_expect_success '--show-scope getting a single value' '
 	cat >expect <<-\EOF &&
 	local	true
 	EOF
-	git config --show-scope --get user.local >output &&
+	git config ${mode_get} --show-scope user.local >output &&
 	test_cmp expect output
 '
 
@@ -2559,9 +2597,9 @@ test_expect_success 'refuse --fixed-value for incompatible actions' '
 	# These modes complain when --fixed-value has no value-pattern
 	test_must_fail git config --file=config --fixed-value dev.null bogus &&
 	test_must_fail git config --file=config --fixed-value --replace-all dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --get dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-all dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-regexp "dev.*" &&
+	test_must_fail git config ${mode_prefix}get --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_get_all} --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_get_regexp} --file=config --fixed-value "dev.*" &&
 	test_must_fail git config --file=config --fixed-value --unset dev.null &&
 	test_must_fail git config --file=config --fixed-value --unset-all dev.null
 '
@@ -2591,12 +2629,12 @@ test_expect_success '--fixed-value uses exact string matching' '
 	cp initial config &&
 	test_must_fail git config --file=config --unset fixed.test "$META" &&
 	git config --file=config --fixed-value --unset fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
 	test_must_fail git config --file=config --unset-all fixed.test "$META" &&
 	git config --file=config --fixed-value --unset-all fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
 	git config --file=config --replace-all fixed.test bogus "$META" &&
@@ -2623,18 +2661,27 @@ test_expect_success '--get and --get-all with --fixed-value' '
 	git config --file=config --add fixed.test "$META" &&
 
 	git config --file=config --get fixed.test bogus &&
+	git config get --file=config --value=bogus fixed.test &&
 	test_must_fail git config --file=config --get fixed.test "$META" &&
+	test_must_fail git config get --file=config --value="$META" fixed.test &&
 	git config --file=config --get --fixed-value fixed.test "$META" &&
+	git config get --file=config --fixed-value --value="$META" fixed.test &&
 	test_must_fail git config --file=config --get --fixed-value fixed.test non-existent &&
 
 	git config --file=config --get-all fixed.test bogus &&
+	git config get --all --file=config --value=bogus fixed.test &&
 	test_must_fail git config --file=config --get-all fixed.test "$META" &&
+	test_must_fail git config get --all --file=config --value="$META" fixed.test &&
 	git config --file=config --get-all --fixed-value fixed.test "$META" &&
+	git config get --all --file=config --value="$META" --fixed-value fixed.test &&
 	test_must_fail git config --file=config --get-all --fixed-value fixed.test non-existent &&
 
 	git config --file=config --get-regexp fixed+ bogus &&
+	git config get --regexp --file=config --value=bogus fixed+ &&
 	test_must_fail git config --file=config --get-regexp fixed+ "$META" &&
+	test_must_fail git config get --regexp --file=config --value="$META" fixed+ &&
 	git config --file=config --get-regexp --fixed-value fixed+ "$META" &&
+	git config get --regexp --file=config --fixed-value --value="$META" fixed+ &&
 	test_must_fail git config --file=config --get-regexp --fixed-value fixed+ non-existent
 '
 
-- 
2.45.0


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

^ permalink raw reply related	[relevance 3%]

* [PATCH v3 07/13] builtin/config: introduce "get" subcommand
  2024-03-27  8:46  2% ` [PATCH v3 00/13] builtin/config: introduce subcommands Patrick Steinhardt
@ 2024-03-27  8:46  3%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-03-27  8:46 UTC (permalink / raw)
  To: git
  Cc: Kristoffer Haugsbakk, Taylor Blau, Jean-Noël AVILA,
	Eric Sunshine, Junio C Hamano

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

Introduce a new "get" subcommand to git-config(1). Please refer to
preceding commits regarding the motivation behind this change.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/git-config.txt |  93 +++++++++++++-------------
 builtin/config.c             |  69 ++++++++++++++++---
 t/t1300-config.sh            | 125 ++++++++++++++++++++++++-----------
 3 files changed, 191 insertions(+), 96 deletions(-)

diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 485e84cd0f..4a7d6b7543 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -10,18 +10,14 @@ SYNOPSIS
 --------
 [verse]
 'git config list' [<file-option>] [<display-option>] [--includes]
+'git config get' [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>
 'git config' [<file-option>] [--type=<type>] [--fixed-value] [--show-origin] [--show-scope] [-z|--null] <name> [<value> [<value-pattern>]]
 'git config' [<file-option>] [--type=<type>] --add <name> <value>
 'git config' [<file-option>] [--type=<type>] [--fixed-value] --replace-all <name> <value> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get-all <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] --get-regexp <name-regex> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [-z|--null] --get-urlmatch <name> <URL>
 'git config' [<file-option>] [--fixed-value] --unset <name> [<value-pattern>]
 'git config' [<file-option>] [--fixed-value] --unset-all <name> [<value-pattern>]
 'git config' [<file-option>] --rename-section <old-name> <new-name>
 'git config' [<file-option>] --remove-section <name>
-'git config' [<file-option>] --get-color <name> [<default>]
 'git config' [<file-option>] --get-colorbool <name> [<stdout-is-tty>]
 'git config' [<file-option>] -e | --edit
 
@@ -80,6 +76,12 @@ COMMANDS
 list::
 	List all variables set in config file, along with their values.
 
+get::
+	Emits the value of the specified key. If key is present multiple times
+	in the configuration, emits the last value. If `--all` is specified,
+	emits all values associated with key. Returns error code 1 if key is
+	not present.
+
 [[OPTIONS]]
 OPTIONS
 -------
@@ -93,22 +95,16 @@ OPTIONS
 	values.  This is the same as providing '^$' as the `value-pattern`
 	in `--replace-all`.
 
---get::
-	Get the value for a given key (optionally filtered by a regex
-	matching the value). Returns error code 1 if the key was not
-	found and the last value if multiple key values were found.
-
---get-all::
-	Like get, but returns all values for a multi-valued key.
+--all::
+	With `get`, Return all values for a multi-valued key.
 
---get-regexp::
-	Like --get-all, but interprets the name as a regular expression and
-	writes out the key names.  Regular expression matching is currently
-	case-sensitive and done against a canonicalized version of the key
-	in which section and variable names are lowercased, but subsection
-	names are not.
+---regexp::
+	With `get`, interpret the name as a regular expression. Regular
+	expression matching is currently case-sensitive and done against a
+	canonicalized version of the key in which section and variable names
+	are lowercased, but subsection names are not.
 
---get-urlmatch <name> <URL>::
+--url=<URL>::
 	When given a two-part <name> as <section>.<key>, the value for
 	<section>.<URL>.<key> whose <URL> part matches the best to the
 	given URL is returned (if no such key exists, the value for
@@ -239,7 +235,7 @@ Valid `<type>`'s include:
 
 --name-only::
 	Output only the names of config variables for `list` or
-	`--get-regexp`.
+	`get`.
 
 --show-origin::
 	Augment the output of all queried config options with the
@@ -263,17 +259,6 @@ Valid `<type>`'s include:
 	When the color setting for `name` is undefined, the command uses
 	`color.ui` as fallback.
 
---get-color <name> [<default>]::
-
-	Find the color configured for `name` (e.g. `color.diff.new`) and
-	output it as the ANSI color escape sequence to the standard
-	output.  The optional `default` parameter is used instead, if
-	there is no color configured for `name`.
-+
-`--type=color [--default=<default>]` is preferred over `--get-color`
-(but note that `--get-color` will omit the trailing newline printed by
-`--type=color`).
-
 -e::
 --edit::
 	Opens an editor to modify the specified config file; either
@@ -287,7 +272,7 @@ Valid `<type>`'s include:
 	config files.
 
 --default <value>::
-  When using `--get`, and the requested variable is not found, behave as if
+  When using `get`, and the requested variable is not found, behave as if
   <value> were the value assigned to that variable.
 
 DEPRECATED MODES
@@ -296,15 +281,33 @@ DEPRECATED MODES
 The following modes have been deprecated in favor of subcommands. It is
 recommended to migrate to the new syntax.
 
+'git config <name>'::
+	Replaced by `git config get <name>`.
+
 -l::
 --list::
 	Replaced by `git config list`.
 
+--get <name> [<value-pattern>]::
+	Replaced by `git config get [--value=<pattern>] <name>`.
+
+--get-all <name> [<value-pattern>]::
+	Replaced by `git config get [--value=<pattern>] --all --show-names <name>`.
+
+--get-regexp <name-regexp>::
+	Replaced by `git config get --all --show-names --regexp <name-regexp>`.
+
+--get-urlmatch <name> <URL>::
+	Replaced by `git config get --all --show-names --url=<URL> <name>`.
+
+--get-color <name> [<default>]::
+	Replaced by `git config get --type=color [--default=<default>] <name>`.
+
 CONFIGURATION
 -------------
 `pager.config` is only respected when listing configuration, i.e., when
-using `list` or any of the `--get-*` which may return multiple results.
-The default is to use a pager.
+using `list` or `get` which may return multiple results. The default is to use
+a pager.
 
 [[FILES]]
 FILES
@@ -507,25 +510,19 @@ you have to provide a regex matching the value of exactly one line.
 To query the value for a given key, do
 
 ------------
-% git config --get core.filemode
-------------
-
-or
-
-------------
-% git config core.filemode
+% git config get core.filemode
 ------------
 
 or, to query a multivar:
 
 ------------
-% git config --get core.gitproxy "for kernel.org$"
+% git config get --value="for kernel.org$" core.gitproxy
 ------------
 
 If you want to know all the values for a multivar, do:
 
 ------------
-% git config --get-all core.gitproxy
+% git config get --all --show-names core.gitproxy
 ------------
 
 If you like to live dangerously, you can replace *all* core.gitproxy by a
@@ -559,8 +556,8 @@ script:
 
 ------------
 #!/bin/sh
-WS=$(git config --get-color color.diff.whitespace "blue reverse")
-RESET=$(git config --get-color "" "reset")
+WS=$(git config get --type=color --default="blue reverse" color.diff.whitespace)
+RESET=$(git config get --type=color --default="reset" "")
 echo "${WS}your whitespace color or blue reverse${RESET}"
 ------------
 
@@ -568,11 +565,11 @@ For URLs in `https://weak.example.com`, `http.sslVerify` is set to
 false, while it is set to `true` for all others:
 
 ------------
-% git config --type=bool --get-urlmatch http.sslverify https://good.example.com
+% git config get --type=bool --url=https://good.example.com http.sslverify
 true
-% git config --type=bool --get-urlmatch http.sslverify https://weak.example.com
+% git config get --type=bool --url=https://weak.example.com http.sslverify
 false
-% git config --get-urlmatch http https://weak.example.com
+% git config get --url=https://weak.example.com http
 http.cookieFile /tmp/cookie.txt
 http.sslverify false
 ------------
diff --git a/builtin/config.c b/builtin/config.c
index 7dd588a622..447500dbd2 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -17,7 +17,7 @@
 
 static const char *const builtin_config_usage[] = {
 	N_("git config list [<file-option>] [<display-option>] [--includes]"),
-	N_("git config [<options>]"),
+	N_("git config get [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>"),
 	NULL
 };
 
@@ -26,6 +26,11 @@ static const char *const builtin_config_list_usage[] = {
 	NULL
 };
 
+static const char *const builtin_config_get_usage[] = {
+	N_("git config get [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>"),
+	NULL
+};
+
 static char *key;
 static regex_t *key_regexp;
 static const char *value_pattern;
@@ -721,6 +726,16 @@ static void handle_nul(void) {
 	OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given config file")), \
 	OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"), N_("read config from given blob object"))
 
+#define CONFIG_TYPE_OPTIONS \
+	OPT_GROUP(N_("Type")), \
+	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type), \
+	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL), \
+	OPT_CALLBACK_VALUE(0, "int", &type, N_("value is decimal number"), TYPE_INT), \
+	OPT_CALLBACK_VALUE(0, "bool-or-int", &type, N_("value is --bool or --int"), TYPE_BOOL_OR_INT), \
+	OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or string"), TYPE_BOOL_OR_STR), \
+	OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or directory name)"), TYPE_PATH), \
+	OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry date"), TYPE_EXPIRY_DATE)
+
 #define CONFIG_DISPLAY_OPTIONS \
 	OPT_GROUP(N_("Display options")), \
 	OPT_BOOL('z', "null", &end_nul, N_("terminate values with NUL byte")), \
@@ -745,14 +760,7 @@ static struct option builtin_config_options[] = {
 	OPT_CMDMODE('e', "edit", &actions, N_("open an editor"), ACTION_EDIT),
 	OPT_CMDMODE(0, "get-color", &actions, N_("find the color configured: slot [<default>]"), ACTION_GET_COLOR),
 	OPT_CMDMODE(0, "get-colorbool", &actions, N_("find the color setting: slot [<stdout-is-tty>]"), ACTION_GET_COLORBOOL),
-	OPT_GROUP(N_("Type")),
-	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type),
-	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL),
-	OPT_CALLBACK_VALUE(0, "int", &type, N_("value is decimal number"), TYPE_INT),
-	OPT_CALLBACK_VALUE(0, "bool-or-int", &type, N_("value is --bool or --int"), TYPE_BOOL_OR_INT),
-	OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or string"), TYPE_BOOL_OR_STR),
-	OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or directory name)"), TYPE_PATH),
-	OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry date"), TYPE_EXPIRY_DATE),
+	CONFIG_TYPE_OPTIONS,
 	CONFIG_DISPLAY_OPTIONS,
 	OPT_GROUP(N_("Other")),
 	OPT_STRING(0, "default", &default_value, N_("value"), N_("with --get, use default value when missing entry")),
@@ -797,8 +805,51 @@ static int cmd_config_list(int argc, const char **argv, const char *prefix)
 	return 0;
 }
 
+static int cmd_config_get(int argc, const char **argv, const char *prefix)
+{
+	const char *value_pattern = NULL, *url = NULL;
+	int flags = 0;
+	struct option opts[] = {
+		CONFIG_LOCATION_OPTIONS,
+		CONFIG_TYPE_OPTIONS,
+		OPT_GROUP(N_("Filter options")),
+		OPT_BOOL(0, "all", &do_all, N_("return all values for multi-valued config options")),
+		OPT_BOOL(0, "regexp", &use_key_regexp, N_("interpret the name as a regular expression")),
+		OPT_STRING(0, "value", &value_pattern, N_("pattern"), N_("show config with values matching the pattern")),
+		OPT_BIT(0, "fixed-value", &flags, N_("use string equality when comparing values to value pattern"), CONFIG_FLAGS_FIXED_VALUE),
+		OPT_STRING(0, "url", &url, N_("URL"), N_("show config matching the given URL")),
+		CONFIG_DISPLAY_OPTIONS,
+		OPT_BOOL(0, "show-names", &show_keys, N_("show config keys in addition to their values")),
+		OPT_GROUP(N_("Other")),
+		OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect include directives on lookup")),
+		OPT_STRING(0, "default", &default_value, N_("value"), N_("use default value when missing entry")),
+		OPT_END(),
+	};
+
+	argc = parse_options(argc, argv, prefix, opts, builtin_config_get_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	check_argc(argc, 1, 1);
+
+	if ((flags & CONFIG_FLAGS_FIXED_VALUE) && !value_pattern)
+		die(_("--fixed-value only applies with 'value-pattern'"));
+	if (default_value && (do_all || url))
+		die(_("--default= cannot be used with --all or --url="));
+	if (url && (do_all || use_key_regexp || value_pattern))
+		die(_("--url= cannot be used with --all, --regexp or --value"));
+
+	handle_config_location(prefix);
+	handle_nul();
+
+	setup_auto_pager("config", 1);
+
+	if (url)
+		return get_urlmatch(argv[0], url);
+	return get_value(argv[0], value_pattern, flags);
+}
+
 static struct option builtin_subcommand_options[] = {
 	OPT_SUBCOMMAND("list", &subcommand, cmd_config_list),
+	OPT_SUBCOMMAND("get", &subcommand, cmd_config_get),
 	OPT_END(),
 };
 
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index b140674293..f1547921c6 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -17,9 +17,15 @@ do
 case "$mode" in
 legacy)
 	mode_prefix="--"
+	mode_get=""
+	mode_get_all="--get-all"
+	mode_get_regexp="--get-regexp"
 	;;
 subcommands)
 	mode_prefix=""
+	mode_get="get"
+	mode_get_all="get --all"
+	mode_get_regexp="get --regexp --all --show-names"
 	;;
 *)
 	BUG "unknown mode $mode";;
@@ -288,7 +294,7 @@ test_expect_success 'multi-valued get-all returns all' '
 	wow
 	wow2 for me
 	EOF
-	git config --get-all nextsection.nonewline >actual &&
+	git config ${mode_get_all} nextsection.nonewline >actual &&
 	test_cmp expect actual
 '
 
@@ -390,7 +396,7 @@ nextsection.nonewline wow2 for me
 EOF
 
 test_expect_success '--get-regexp' '
-	git config --get-regexp in >output &&
+	git config ${mode_get_regexp} in >output &&
 	test_cmp expect output
 '
 
@@ -400,7 +406,7 @@ nextsection.nonewline
 EOF
 
 test_expect_success '--name-only --get-regexp' '
-	git config --name-only --get-regexp in >output &&
+	git config ${mode_get_regexp} --name-only in >output &&
 	test_cmp expect output
 '
 
@@ -411,7 +417,7 @@ EOF
 
 test_expect_success '--add' '
 	git config --add nextsection.nonewline "wow4 for you" &&
-	git config --get-all nextsection.nonewline > output &&
+	git config ${mode_get_all} nextsection.nonewline > output &&
 	test_cmp expect output
 '
 
@@ -433,21 +439,21 @@ test_expect_success 'get variable with empty value' '
 echo novalue.variable > expect
 
 test_expect_success 'get-regexp variable with no value' '
-	git config --get-regexp novalue > output &&
+	git config ${mode_get_regexp} novalue > output &&
 	test_cmp expect output
 '
 
 echo 'novalue.variable true' > expect
 
 test_expect_success 'get-regexp --bool variable with no value' '
-	git config --bool --get-regexp novalue > output &&
+	git config ${mode_get_regexp} --bool novalue > output &&
 	test_cmp expect output
 '
 
 echo 'emptyvalue.variable ' > expect
 
 test_expect_success 'get-regexp variable with empty value' '
-	git config --get-regexp emptyvalue > output &&
+	git config ${mode_get_regexp} emptyvalue > output &&
 	test_cmp expect output
 '
 
@@ -1021,7 +1027,7 @@ test_expect_success 'quoting' '
 '
 
 test_expect_success 'key with newline' '
-	test_must_fail git config "key.with
+	test_must_fail git config ${mode_get} "key.with
 newline" 123'
 
 test_expect_success 'value with newline' 'git config key.sub value.with\\\
@@ -1075,7 +1081,7 @@ test_expect_success '--null --list' '
 '
 
 test_expect_success '--null --get-regexp' '
-	git config --null --get-regexp "val[0-9]" >result.raw &&
+	git config ${mode_get_regexp} --null "val[0-9]" >result.raw &&
 	nul_to_q <result.raw >result &&
 	echo >>result &&
 	test_cmp expect result
@@ -1157,11 +1163,11 @@ test_expect_success 'git -c can represent empty string' '
 '
 
 test_expect_success 'key sanity-checking' '
-	test_must_fail git config foo=bar &&
-	test_must_fail git config foo=.bar &&
-	test_must_fail git config foo.ba=r &&
-	test_must_fail git config foo.1bar &&
-	test_must_fail git config foo."ba
+	test_must_fail git config ${mode_get} foo=bar &&
+	test_must_fail git config ${mode_get} foo=.bar &&
+	test_must_fail git config ${mode_get} foo.ba=r &&
+	test_must_fail git config ${mode_get} foo.1bar &&
+	test_must_fail git config ${mode_get} foo."ba
 				z".bar &&
 	test_must_fail git config . false &&
 	test_must_fail git config .foo false &&
@@ -1210,7 +1216,7 @@ test_expect_success 'git -c complains about empty key and value' '
 '
 
 test_expect_success 'multiple git -c appends config' '
-	test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
+	test_config alias.x "!git -c x.two=2 config ${mode_get_regexp} ^x\.*" &&
 	cat >expect <<-\EOF &&
 	x.one 1
 	x.two 2
@@ -1376,7 +1382,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles old-style entries' '
 	v="${SQ}key.one=foo${SQ}" &&
 	v="$v  ${SQ}key.two=bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever=value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1389,7 +1395,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles new-style entries' '
 	v="${SQ}key.one${SQ}=${SQ}foo${SQ}" &&
 	v="$v  ${SQ}key.two${SQ}=${SQ}bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever${SQ}=${SQ}value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1403,7 +1409,7 @@ test_expect_success 'old and new-style entries can mix' '
 	v="$v ${SQ}key.newone${SQ}=${SQ}newfoo${SQ}" &&
 	v="$v ${SQ}key.oldtwo=oldbar${SQ}" &&
 	v="$v ${SQ}key.newtwo${SQ}=${SQ}newbar${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.oldone oldfoo
 	key.newone newfoo
@@ -1416,7 +1422,7 @@ test_expect_success 'old and new-style entries can mix' '
 test_expect_success 'old and new bools with ambiguous subsection' '
 	v="${SQ}key.with=equals.oldbool${SQ}" &&
 	v="$v ${SQ}key.with=equals.newbool${SQ}=" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.with equals.oldbool
 	key.with=equals.newbool
@@ -1430,7 +1436,7 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ} ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_get_regexp} "env.*" >actual &&
 	test_cmp expect actual &&
 
 	cat >expect <<-EOF &&
@@ -1438,12 +1444,12 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ$SQ$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_get_regexp} "env.*" >actual &&
 	test_cmp expect actual &&
 
 	test_must_fail env \
 		GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*"
+		git config ${mode_get_regexp} "env.*"
 '
 
 test_expect_success 'git --config-env=key=envvar support' '
@@ -1491,7 +1497,7 @@ test_expect_success 'git -c and --config-env work together' '
 	ENVVAR=env-value git \
 		-c bar.cmd=cmd-value \
 		--config-env=bar.env=ENVVAR \
-		config --get-regexp "^bar.*" >actual &&
+		config ${mode_get_regexp} "^bar.*" >actual &&
 	test_cmp expect actual
 '
 
@@ -1519,7 +1525,7 @@ test_expect_success 'git config handles environment config pairs' '
 	GIT_CONFIG_COUNT=2 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \
-		git config --get-regexp "pair.*" >actual &&
+		git config ${mode_get_regexp} "pair.*" >actual &&
 	cat >expect <<-EOF &&
 	pair.one foo
 	pair.two bar
@@ -1529,7 +1535,7 @@ test_expect_success 'git config handles environment config pairs' '
 
 test_expect_success 'git config ignores pairs without count' '
 	test_must_fail env GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
@@ -1537,7 +1543,7 @@ test_expect_success 'git config ignores pairs exceeding count' '
 	GIT_CONFIG_COUNT=1 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="value" \
-		git config --get-regexp "pair.*" >actual 2>error &&
+		git config ${mode_get_regexp} "pair.*" >actual 2>error &&
 	cat >expect <<-EOF &&
 	pair.one value
 	EOF
@@ -1548,14 +1554,14 @@ test_expect_success 'git config ignores pairs exceeding count' '
 test_expect_success 'git config ignores pairs with zero count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT=0 GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
 test_expect_success 'git config ignores pairs with empty count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT= GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
@@ -1594,7 +1600,7 @@ test_expect_success 'environment overrides config file' '
 	one = value
 	EOF
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=override \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1604,7 +1610,7 @@ test_expect_success 'environment overrides config file' '
 test_expect_success 'GIT_CONFIG_PARAMETERS overrides environment config' '
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \
 		GIT_CONFIG_PARAMETERS="${SQ}pair.one=override${SQ}" \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1679,20 +1685,28 @@ test_expect_success 'urlmatch' '
 
 	test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
 	test_must_be_empty actual &&
+	test_expect_code 1 git config get --url=https://good.example.com --bool doesnt.exist >actual &&
+	test_must_be_empty actual &&
 
 	echo true >expect &&
 	git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --bool --url=https://good.example.com http.SSLverify >actual &&
+	test_cmp expect actual &&
 
 	echo false >expect &&
 	git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --bool --url=https://weak.example.com http.sslverify >actual &&
+	test_cmp expect actual &&
 
 	{
 		echo http.cookiefile /tmp/cookie.txt &&
 		echo http.sslverify false
 	} >expect &&
 	git config --get-urlmatch HTTP https://weak.example.com >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://weak.example.com HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1708,6 +1722,8 @@ test_expect_success 'urlmatch with --show-scope' '
 	local	http.sslverify false
 	EOF
 	git config --get-urlmatch --show-scope HTTP https://weak.example.com >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://weak.example.com --show-scope HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1740,45 +1756,67 @@ test_expect_success 'urlmatch favors more specific URLs' '
 	echo http.cookiefile /tmp/root.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com/subdirectory HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com/subdirectory/nested HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/user.txt >expect &&
 	git config --get-urlmatch HTTP https://user@example.com/ >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://user@example.com/ HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://averylonguser@example.com/subdirectory HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/preceding.txt >expect &&
 	git config --get-urlmatch HTTP https://preceding.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://preceding.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/wildcard.txt >expect &&
 	git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://wildcard.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
 	git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://sub.example.com/wildcardwithsubdomain HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/trailing.txt >expect &&
 	git config --get-urlmatch HTTP https://trailing.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://trailing.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
 	git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://user@sub.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/multiwildcard.txt >expect &&
 	git config --get-urlmatch HTTP https://wildcard.example.org >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://wildcard.example.org HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1901,7 +1939,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[one]
 	EOF
 	git config --unset two.subsection.key &&
-	test "not [two subsection]" = "$(git config one.key)" &&
+	test "not [two subsection]" = "$(git config ${mode_get} one.key)" &&
 	test_line_count = 3 .git/config
 '
 
@@ -2024,7 +2062,7 @@ test_expect_success '--show-origin with --get-regexp' '
 	file:$HOME/.gitconfig	user.global true
 	file:.git/config	user.local true
 	EOF
-	git config --show-origin --get-regexp "user\.[g|l].*" >output &&
+	git config ${mode_get_regexp} --show-origin "user\.[g|l].*" >output &&
 	test_cmp expect output
 '
 
@@ -2032,7 +2070,7 @@ test_expect_success '--show-origin getting a single key' '
 	cat >expect <<-\EOF &&
 	file:.git/config	local
 	EOF
-	git config --show-origin user.override >output &&
+	git config ${mode_get} --show-origin user.override >output &&
 	test_cmp expect output
 '
 
@@ -2164,7 +2202,7 @@ test_expect_success '--show-scope getting a single value' '
 	cat >expect <<-\EOF &&
 	local	true
 	EOF
-	git config --show-scope --get user.local >output &&
+	git config ${mode_get} --show-scope user.local >output &&
 	test_cmp expect output
 '
 
@@ -2433,9 +2471,9 @@ test_expect_success 'refuse --fixed-value for incompatible actions' '
 	# These modes complain when --fixed-value has no value-pattern
 	test_must_fail git config --file=config --fixed-value dev.null bogus &&
 	test_must_fail git config --file=config --fixed-value --replace-all dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --get dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-all dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-regexp "dev.*" &&
+	test_must_fail git config ${mode_prefix}get --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_get_all} --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_get_regexp} --file=config --fixed-value "dev.*" &&
 	test_must_fail git config --file=config --fixed-value --unset dev.null &&
 	test_must_fail git config --file=config --fixed-value --unset-all dev.null
 '
@@ -2465,12 +2503,12 @@ test_expect_success '--fixed-value uses exact string matching' '
 	cp initial config &&
 	test_must_fail git config --file=config --unset fixed.test "$META" &&
 	git config --file=config --fixed-value --unset fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
 	test_must_fail git config --file=config --unset-all fixed.test "$META" &&
 	git config --file=config --fixed-value --unset-all fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
 	git config --file=config --replace-all fixed.test bogus "$META" &&
@@ -2497,18 +2535,27 @@ test_expect_success '--get and --get-all with --fixed-value' '
 	git config --file=config --add fixed.test "$META" &&
 
 	git config --file=config --get fixed.test bogus &&
+	git config get --file=config --value=bogus fixed.test &&
 	test_must_fail git config --file=config --get fixed.test "$META" &&
+	test_must_fail git config get --file=config --value="$META" fixed.test &&
 	git config --file=config --get --fixed-value fixed.test "$META" &&
+	git config get --file=config --fixed-value --value="$META" fixed.test &&
 	test_must_fail git config --file=config --get --fixed-value fixed.test non-existent &&
 
 	git config --file=config --get-all fixed.test bogus &&
+	git config get --all --file=config --value=bogus fixed.test &&
 	test_must_fail git config --file=config --get-all fixed.test "$META" &&
+	test_must_fail git config get --all --file=config --value="$META" fixed.test &&
 	git config --file=config --get-all --fixed-value fixed.test "$META" &&
+	git config get --all --file=config --value="$META" --fixed-value fixed.test &&
 	test_must_fail git config --file=config --get-all --fixed-value fixed.test non-existent &&
 
 	git config --file=config --get-regexp fixed+ bogus &&
+	git config get --regexp --file=config --value=bogus fixed+ &&
 	test_must_fail git config --file=config --get-regexp fixed+ "$META" &&
+	test_must_fail git config get --regexp --file=config --value="$META" fixed+ &&
 	git config --file=config --get-regexp --fixed-value fixed+ "$META" &&
+	git config get --regexp --file=config --fixed-value --value="$META" fixed+ &&
 	test_must_fail git config --file=config --get-regexp --fixed-value fixed+ non-existent
 '
 
-- 
2.44.GIT


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

^ permalink raw reply related	[relevance 3%]

* [PATCH v3 00/13] builtin/config: introduce subcommands
                     ` (2 preceding siblings ...)
  @ 2024-03-27  8:46  2% ` Patrick Steinhardt
  2024-03-27  8:46  3%   ` [PATCH v3 07/13] builtin/config: introduce "get" subcommand Patrick Steinhardt
    4 siblings, 1 reply; 200+ results
From: Patrick Steinhardt @ 2024-03-27  8:46 UTC (permalink / raw)
  To: git
  Cc: Kristoffer Haugsbakk, Taylor Blau, Jean-Noël AVILA,
	Eric Sunshine, Junio C Hamano

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

Hi,

this is the third version of my patch series that aims to add
subcommands to git-config(1) in a backwards-compatible manner.

There's only been a few changes compared to v2 based on Eric's comments:

    - Touched up a commit message to explain why I had to add cleanups
      to tests.

    - Reformulate "implicit modes" in a comment to clarify that this
      refers to the legacy-style modes.

    - Reformulated documentation of the "get" subcommand.

    - Use `BUG` instead of `echo >&2 && exit 1`.

    - Removed duplicate example in the documentation.

    - Fixed conflicts with 86f9ce7dd6 (docs: fix typo in git-config
      `--default`, 2024-03-16) and 7823a51203 (docs: clarify file
      options in git-config `--edit`, 2024-03-16) by rebasing onto
      latest `master`.

Thanks!

Patrick

Patrick Steinhardt (13):
  builtin/config: move option array around
  builtin/config: move "fixed-value" option to correct group
  builtin/config: use `OPT_CMDMODE()` to specify modes
  builtin/config: pull out function to handle config location
  builtin/config: pull out function to handle `--null`
  builtin/config: introduce "list" subcommand
  builtin/config: introduce "get" subcommand
  builtin/config: introduce "set" subcommand
  builtin/config: introduce "unset" subcommand
  builtin/config: introduce "rename-section" subcommand
  builtin/config: introduce "remove-section" subcommand
  builtin/config: introduce "edit" subcommand
  builtin/config: display subcommand help

 Documentation/git-config.txt | 219 +++++++++-------
 builtin/config.c             | 496 ++++++++++++++++++++++++++++-------
 t/t0450/txt-help-mismatches  |   1 -
 t/t1300-config.sh            | 416 ++++++++++++++++++-----------
 4 files changed, 785 insertions(+), 347 deletions(-)

Range-diff against v2:
 1:  1f21e7fa0d =  1:  bfcb50e393 builtin/config: move option array around
 2:  54e536394a =  2:  ff428d8a22 builtin/config: move "fixed-value" option to correct group
 3:  49d190ac24 =  3:  e049c05713 builtin/config: use `OPT_CMDMODE()` to specify modes
 4:  80093f3908 =  4:  41585803bf builtin/config: pull out function to handle config location
 5:  283a199578 =  5:  95f661f267 builtin/config: pull out function to handle `--null`
 6:  53401299fa !  6:  b50f32d074 builtin/config: introduce "list" subcommand
    @@ Commit message
         ensure that there really is no change in behaviour for the old syntax.
     
         Amend tests such that we run them both with old and new style syntax.
    +    As tests are now run twice, state from the first run may be still be
    +    around in the second run and thus cause tests to fail. Add cleanup logic
    +    as required to fix such tests.
     
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
     
    @@ Documentation/git-config.txt: Valid `<type>`'s include:
      --show-origin::
     @@ Documentation/git-config.txt: Valid `<type>`'s include:
        When using `--get`, and the requested variable is not found, behave as if
    -   <value> were the value assigned to the that variable.
    +   <value> were the value assigned to that variable.
      
     +DEPRECATED MODES
     +----------------
    @@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix
     +	 * has been specified. If so, we re-parse it a second time, but this
     +	 * time we drop KEEP_ARGV0. This is so that we don't munge the command
     +	 * line in case no subcommand was given, which would otherwise confuse
    -+	 * us when parsing the implicit modes.
    ++	 * us when parsing the legacy-style modes that don't use subcommands.
     +	 */
     +	argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
     +			     PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_NO_INTERNAL_HELP|PARSE_OPT_KEEP_ARGV0|PARSE_OPT_KEEP_UNKNOWN_OPT);
    @@ t/t1300-config.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
     +	mode_prefix=""
     +	;;
     +*)
    -+	echo "unknown mode $mode" >&2
    -+	exit 1;;
    ++	BUG "unknown mode $mode";;
     +esac
     +
      test_expect_success 'clear default config' '
 7:  8ceced0fc5 !  7:  eee1fae50c builtin/config: introduce "get" subcommand
    @@ Documentation/git-config.txt: COMMANDS
      	List all variables set in config file, along with their values.
      
     +get::
    -+	Get value for one or more config options. Values can be filtered by
    -+	regexes and URLs.Returns error code 1 if the key was not found and the
    -+	last value if multiple key values were found. If `--all` is set, then
    -+	all values will be shown.
    ++	Emits the value of the specified key. If key is present multiple times
    ++	in the configuration, emits the last value. If `--all` is specified,
    ++	emits all values associated with key. Returns error code 1 if key is
    ++	not present.
     +
      [[OPTIONS]]
      OPTIONS
    @@ Documentation/git-config.txt: OPTIONS
     ---get-all::
     -	Like get, but returns all values for a multi-valued key.
     +--all::
    -+	With "get", Return all values for a multi-valued key.
    ++	With `get`, Return all values for a multi-valued key.
      
     ---get-regexp::
     -	Like --get-all, but interprets the name as a regular expression and
    @@ Documentation/git-config.txt: OPTIONS
     -	in which section and variable names are lowercased, but subsection
     -	names are not.
     +---regexp::
    -+	With "get", interpret the name as a regular expression. Regular
    ++	With `get`, interpret the name as a regular expression. Regular
     +	expression matching is currently case-sensitive and done against a
     +	canonicalized version of the key in which section and variable names
     +	are lowercased, but subsection names are not.
    @@ Documentation/git-config.txt: Valid `<type>`'s include:
      --default <value>::
     -  When using `--get`, and the requested variable is not found, behave as if
     +  When using `get`, and the requested variable is not found, behave as if
    -   <value> were the value assigned to the that variable.
    +   <value> were the value assigned to that variable.
      
      DEPRECATED MODES
     @@ Documentation/git-config.txt: DEPRECATED MODES
    @@ Documentation/git-config.txt: you have to provide a regex matching the value of
      
      ------------
     -% git config --get core.filemode
    -+% git config get core.filemode
    - ------------
    - 
    - or
    - 
    - ------------
    +-------------
    +-
    +-or
    +-
    +-------------
     -% git config core.filemode
     +% git config get core.filemode
      ------------
    @@ t/t1300-config.sh: do
     +	mode_get_regexp="get --regexp --all --show-names"
      	;;
      *)
    - 	echo "unknown mode $mode" >&2
    + 	BUG "unknown mode $mode";;
     @@ t/t1300-config.sh: test_expect_success 'multi-valued get-all returns all' '
      	wow
      	wow2 for me
 8:  aa5c9743ad !  8:  e2815affab builtin/config: introduce "set" subcommand
    @@ Documentation/git-config.txt: You can query/set/replace/unset options with this
      lines, a `value-pattern` (which is an extended regular expression,
      unless the `--fixed-value` option is given) needs to be given.  Only the
     @@ Documentation/git-config.txt: get::
    - 	last value if multiple key values were found. If `--all` is set, then
    - 	all values will be shown.
    + 	emits all values associated with key. Returns error code 1 if key is
    + 	not present.
      
     +set::
     +	Set value for one or more config options. By default, this command
    @@ Documentation/git-config.txt: OPTIONS
     +	values. This is the same as providing '--value=^$' in `set`.
      
      --all::
    - 	With "get", Return all values for a multi-valued key.
    + 	With `get`, Return all values for a multi-valued key.
     @@ Documentation/git-config.txt: recommended to migrate to the new syntax.
      'git config <name>'::
      	Replaced by `git config get <name>`.
    @@ t/t1300-config.sh: legacy)
     +	mode_replace_all="set --all"
      	;;
      *)
    - 	echo "unknown mode $mode" >&2
    + 	BUG "unknown mode $mode";;
     @@ t/t1300-config.sh: cat > expect << EOF
      	penguin = little blue
      EOF
 9:  c8a44b6189 !  9:  90f055ae1d builtin/config: introduce "unset" subcommand
    @@ t/t1300-config.sh: subcommands)
     +	mode_unset_all="unset --all"
      	;;
      *)
    - 	echo "unknown mode $mode" >&2
    + 	BUG "unknown mode $mode";;
     @@ t/t1300-config.sh: foo = bar
      EOF
      
10:  a3c66431b0 = 10:  3e360b1f47 builtin/config: introduce "rename-section" subcommand
11:  6314d51cec = 11:  d610b5fda1 builtin/config: introduce "remove-section" subcommand
12:  12011714e3 ! 12:  4a6512c88a builtin/config: introduce "edit" subcommand
    @@ Documentation/git-config.txt: rename-section::
      
     +edit::
     +	Opens an editor to modify the specified config file; either
    -+	`--system`, `--global`, or repository (default).
    ++	`--system`, `--global`, `--local` (default), `--worktree`, or
    ++	`--file <config-file>`.
     +
      [[OPTIONS]]
      OPTIONS
    @@ Documentation/git-config.txt: Valid `<type>`'s include:
     --e::
     ---edit::
     -	Opens an editor to modify the specified config file; either
    --	`--system`, `--global`, or repository (default).
    +-	`--system`, `--global`, `--local` (default), `--worktree`, or
    +-	`--file <config-file>`.
     -
      --[no-]includes::
      	Respect `include.*` directives in config files when looking up
13:  2046f6652a ! 13:  657d1355b5 builtin/config: display subcommand help
    @@ builtin/config.c: static const char *const builtin_config_usage[] = {
      };
      
     @@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix)
    - 	 * us when parsing the implicit modes.
    + 	 * us when parsing the legacy-style modes that don't use subcommands.
      	 */
      	argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
     -			     PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_NO_INTERNAL_HELP|PARSE_OPT_KEEP_ARGV0|PARSE_OPT_KEEP_UNKNOWN_OPT);

base-commit: c75fd8d8150afdf836b63a8e0534d9b9e3e111ba
-- 
2.44.GIT


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

^ permalink raw reply	[relevance 2%]

* Re: [PATCH v2 07/13] builtin/config: introduce "get" subcommand
  2024-03-13  3:11  0%     ` Eric Sunshine
@ 2024-03-27  8:42  0%       ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-03-27  8:42 UTC (permalink / raw)
  To: Eric Sunshine
  Cc: git, Kristoffer Haugsbakk, Taylor Blau, Jean-Noël AVILA,
	Junio C Hamano

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

On Tue, Mar 12, 2024 at 11:11:07PM -0400, Eric Sunshine wrote:
> On Mon, Mar 11, 2024 at 7:20 PM Patrick Steinhardt <ps@pks.im> wrote:
> > Introduce a new "get" subcommand to git-config(1). Please refer to
> > preceding commits regarding the motivation behind this change.
> >
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> > diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
> > @@ -80,6 +76,12 @@ COMMANDS
> > +get::
> > +       Get value for one or more config options. Values can be filtered by
> > +       regexes and URLs.Returns error code 1 if the key was not found and the
> > +       last value if multiple key values were found. If `--all` is set, then
> > +       all values will be shown.
> 
> s/URLs.Returns/URLs. Returns/
> 
> It's not a new problem with this description (since you're mostly just
> relocating existing text), but I find the discussion of what is
> returned quite confusing and difficult to interpret. Breaking it down
> into simpler sentences might help:
> 
>     Emits the value of the specified key. If key is present
>     multiple times in the configuration, emits the last
>     value. If `--all` is specified, emits all values
>     associated with key. Returns error code 1 if key
>     is not present.
> 
> But, doing so may be outside the scope of this patch series and can be
> tackled at a later date (or not at all).

I like this description, so let's just go with it.

> > @@ -93,22 +95,16 @@ OPTIONS
> > +--all::
> > +       With "get", Return all values for a multi-valued key.
> 
> s/Return/return/
> s/"get"/`get`/
> 
> > +---regexp::
> > +       With "get", interpret the name as a regular expression. Regular
> > +       expression matching is currently case-sensitive and done against a
> > +       canonicalized version of the key in which section and variable names
> > +       are lowercased, but subsection names are not.
> 
> s/"get"/`get`/
> 
> > @@ -286,7 +271,7 @@ Valid `<type>`'s include:
> >  --default <value>::
> > -  When using `--get`, and the requested variable is not found, behave as if
> > +  When using `get`, and the requested variable is not found, behave as if
> >    <value> were the value assigned to the that variable.
> 
> Not a fault of this patch (and need not be fixed by this series): "to
> the that" should be either "to the" or "to that".

This was fixed via 86f9ce7dd6 (docs: fix typo in git-config `--default`,
2024-03-16).

> > @@ -506,25 +509,25 @@ you have to provide a regex matching the value of exactly one line.
> >  To query the value for a given key, do
> >
> >  ------------
> > -% git config --get core.filemode
> > +% git config get core.filemode
> >  ------------
> >
> >  or
> >
> >  ------------
> > -% git config core.filemode
> > +% git config get core.filemode
> >  ------------
> 
> Meh. We only need to retain one of these examples now, not both, right?

Oh, of course.

Patrick

> > diff --git a/t/t1300-config.sh b/t/t1300-config.sh
> > @@ -17,9 +17,15 @@ do
> >  case "$mode" in
> >  legacy)
> >         mode_prefix="--"
> > +       mode_get=""
> > +       mode_get_all="--get-all"
> > +       mode_get_regexp="--get-regexp"
> >         ;;
> >  subcommands)
> >         mode_prefix=""
> > +       mode_get="get"
> > +       mode_get_all="get --all"
> > +       mode_get_regexp="get --regexp --all --show-names"
> >         ;;
> >  *)
> >         echo "unknown mode $mode" >&2
> 
> The variables added by this patch to the `case` arms invalidate the
> suggested simplification in my review of [6/13].

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

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 07/13] builtin/config: introduce "get" subcommand
  2024-03-11 23:20  3%   ` [PATCH v2 07/13] builtin/config: introduce "get" subcommand Patrick Steinhardt
@ 2024-03-13  3:11  0%     ` Eric Sunshine
  2024-03-27  8:42  0%       ` Patrick Steinhardt
  0 siblings, 1 reply; 200+ results
From: Eric Sunshine @ 2024-03-13  3:11 UTC (permalink / raw)
  To: Patrick Steinhardt
  Cc: git, Kristoffer Haugsbakk, Taylor Blau, Jean-Noël AVILA,
	Junio C Hamano

On Mon, Mar 11, 2024 at 7:20 PM Patrick Steinhardt <ps@pks.im> wrote:
> Introduce a new "get" subcommand to git-config(1). Please refer to
> preceding commits regarding the motivation behind this change.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
> @@ -80,6 +76,12 @@ COMMANDS
> +get::
> +       Get value for one or more config options. Values can be filtered by
> +       regexes and URLs.Returns error code 1 if the key was not found and the
> +       last value if multiple key values were found. If `--all` is set, then
> +       all values will be shown.

s/URLs.Returns/URLs. Returns/

It's not a new problem with this description (since you're mostly just
relocating existing text), but I find the discussion of what is
returned quite confusing and difficult to interpret. Breaking it down
into simpler sentences might help:

    Emits the value of the specified key. If key is present
    multiple times in the configuration, emits the last
    value. If `--all` is specified, emits all values
    associated with key. Returns error code 1 if key
    is not present.

But, doing so may be outside the scope of this patch series and can be
tackled at a later date (or not at all).

> @@ -93,22 +95,16 @@ OPTIONS
> +--all::
> +       With "get", Return all values for a multi-valued key.

s/Return/return/
s/"get"/`get`/

> +---regexp::
> +       With "get", interpret the name as a regular expression. Regular
> +       expression matching is currently case-sensitive and done against a
> +       canonicalized version of the key in which section and variable names
> +       are lowercased, but subsection names are not.

s/"get"/`get`/

> @@ -286,7 +271,7 @@ Valid `<type>`'s include:
>  --default <value>::
> -  When using `--get`, and the requested variable is not found, behave as if
> +  When using `get`, and the requested variable is not found, behave as if
>    <value> were the value assigned to the that variable.

Not a fault of this patch (and need not be fixed by this series): "to
the that" should be either "to the" or "to that".

> @@ -506,25 +509,25 @@ you have to provide a regex matching the value of exactly one line.
>  To query the value for a given key, do
>
>  ------------
> -% git config --get core.filemode
> +% git config get core.filemode
>  ------------
>
>  or
>
>  ------------
> -% git config core.filemode
> +% git config get core.filemode
>  ------------

Meh. We only need to retain one of these examples now, not both, right?

> diff --git a/t/t1300-config.sh b/t/t1300-config.sh
> @@ -17,9 +17,15 @@ do
>  case "$mode" in
>  legacy)
>         mode_prefix="--"
> +       mode_get=""
> +       mode_get_all="--get-all"
> +       mode_get_regexp="--get-regexp"
>         ;;
>  subcommands)
>         mode_prefix=""
> +       mode_get="get"
> +       mode_get_all="get --all"
> +       mode_get_regexp="get --regexp --all --show-names"
>         ;;
>  *)
>         echo "unknown mode $mode" >&2

The variables added by this patch to the `case` arms invalidate the
suggested simplification in my review of [6/13].


^ permalink raw reply	[relevance 0%]

* [PATCH v2 07/13] builtin/config: introduce "get" subcommand
  @ 2024-03-11 23:20  3%   ` Patrick Steinhardt
  2024-03-13  3:11  0%     ` Eric Sunshine
  0 siblings, 1 reply; 200+ results
From: Patrick Steinhardt @ 2024-03-11 23:20 UTC (permalink / raw)
  To: git
  Cc: Kristoffer Haugsbakk, Taylor Blau, Jean-Noël AVILA,
	Eric Sunshine, Junio C Hamano

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

Introduce a new "get" subcommand to git-config(1). Please refer to
preceding commits regarding the motivation behind this change.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/git-config.txt |  89 +++++++++++++------------
 builtin/config.c             |  69 ++++++++++++++++---
 t/t1300-config.sh            | 125 ++++++++++++++++++++++++-----------
 3 files changed, 192 insertions(+), 91 deletions(-)

diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 976ba26757..f3d5e3e613 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -10,18 +10,14 @@ SYNOPSIS
 --------
 [verse]
 'git config list' [<file-option>] [<display-option>] [--includes]
+'git config get' [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>
 'git config' [<file-option>] [--type=<type>] [--fixed-value] [--show-origin] [--show-scope] [-z|--null] <name> [<value> [<value-pattern>]]
 'git config' [<file-option>] [--type=<type>] --add <name> <value>
 'git config' [<file-option>] [--type=<type>] [--fixed-value] --replace-all <name> <value> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get-all <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] --get-regexp <name-regex> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [-z|--null] --get-urlmatch <name> <URL>
 'git config' [<file-option>] [--fixed-value] --unset <name> [<value-pattern>]
 'git config' [<file-option>] [--fixed-value] --unset-all <name> [<value-pattern>]
 'git config' [<file-option>] --rename-section <old-name> <new-name>
 'git config' [<file-option>] --remove-section <name>
-'git config' [<file-option>] --get-color <name> [<default>]
 'git config' [<file-option>] --get-colorbool <name> [<stdout-is-tty>]
 'git config' [<file-option>] -e | --edit
 
@@ -80,6 +76,12 @@ COMMANDS
 list::
 	List all variables set in config file, along with their values.
 
+get::
+	Get value for one or more config options. Values can be filtered by
+	regexes and URLs.Returns error code 1 if the key was not found and the
+	last value if multiple key values were found. If `--all` is set, then
+	all values will be shown.
+
 [[OPTIONS]]
 OPTIONS
 -------
@@ -93,22 +95,16 @@ OPTIONS
 	values.  This is the same as providing '^$' as the `value-pattern`
 	in `--replace-all`.
 
---get::
-	Get the value for a given key (optionally filtered by a regex
-	matching the value). Returns error code 1 if the key was not
-	found and the last value if multiple key values were found.
-
---get-all::
-	Like get, but returns all values for a multi-valued key.
+--all::
+	With "get", Return all values for a multi-valued key.
 
---get-regexp::
-	Like --get-all, but interprets the name as a regular expression and
-	writes out the key names.  Regular expression matching is currently
-	case-sensitive and done against a canonicalized version of the key
-	in which section and variable names are lowercased, but subsection
-	names are not.
+---regexp::
+	With "get", interpret the name as a regular expression. Regular
+	expression matching is currently case-sensitive and done against a
+	canonicalized version of the key in which section and variable names
+	are lowercased, but subsection names are not.
 
---get-urlmatch <name> <URL>::
+--url=<URL>::
 	When given a two-part <name> as <section>.<key>, the value for
 	<section>.<URL>.<key> whose <URL> part matches the best to the
 	given URL is returned (if no such key exists, the value for
@@ -239,7 +235,7 @@ Valid `<type>`'s include:
 
 --name-only::
 	Output only the names of config variables for `list` or
-	`--get-regexp`.
+	`get`.
 
 --show-origin::
 	Augment the output of all queried config options with the
@@ -263,17 +259,6 @@ Valid `<type>`'s include:
 	When the color setting for `name` is undefined, the command uses
 	`color.ui` as fallback.
 
---get-color <name> [<default>]::
-
-	Find the color configured for `name` (e.g. `color.diff.new`) and
-	output it as the ANSI color escape sequence to the standard
-	output.  The optional `default` parameter is used instead, if
-	there is no color configured for `name`.
-+
-`--type=color [--default=<default>]` is preferred over `--get-color`
-(but note that `--get-color` will omit the trailing newline printed by
-`--type=color`).
-
 -e::
 --edit::
 	Opens an editor to modify the specified config file; either
@@ -286,7 +271,7 @@ Valid `<type>`'s include:
 	config files.
 
 --default <value>::
-  When using `--get`, and the requested variable is not found, behave as if
+  When using `get`, and the requested variable is not found, behave as if
   <value> were the value assigned to the that variable.
 
 DEPRECATED MODES
@@ -295,15 +280,33 @@ DEPRECATED MODES
 The following modes have been deprecated in favor of subcommands. It is
 recommended to migrate to the new syntax.
 
+'git config <name>'::
+	Replaced by `git config get <name>`.
+
 -l::
 --list::
 	Replaced by `git config list`.
 
+--get <name> [<value-pattern>]::
+	Replaced by `git config get [--value=<pattern>] <name>`.
+
+--get-all <name> [<value-pattern>]::
+	Replaced by `git config get [--value=<pattern>] --all --show-names <name>`.
+
+--get-regexp <name-regexp>::
+	Replaced by `git config get --all --show-names --regexp <name-regexp>`.
+
+--get-urlmatch <name> <URL>::
+	Replaced by `git config get --all --show-names --url=<URL> <name>`.
+
+--get-color <name> [<default>]::
+	Replaced by `git config get --type=color [--default=<default>] <name>`.
+
 CONFIGURATION
 -------------
 `pager.config` is only respected when listing configuration, i.e., when
-using `list` or any of the `--get-*` which may return multiple results.
-The default is to use a pager.
+using `list` or `get` which may return multiple results. The default is to use
+a pager.
 
 [[FILES]]
 FILES
@@ -506,25 +509,25 @@ you have to provide a regex matching the value of exactly one line.
 To query the value for a given key, do
 
 ------------
-% git config --get core.filemode
+% git config get core.filemode
 ------------
 
 or
 
 ------------
-% git config core.filemode
+% git config get core.filemode
 ------------
 
 or, to query a multivar:
 
 ------------
-% git config --get core.gitproxy "for kernel.org$"
+% git config get --value="for kernel.org$" core.gitproxy
 ------------
 
 If you want to know all the values for a multivar, do:
 
 ------------
-% git config --get-all core.gitproxy
+% git config get --all --show-names core.gitproxy
 ------------
 
 If you like to live dangerously, you can replace *all* core.gitproxy by a
@@ -558,8 +561,8 @@ script:
 
 ------------
 #!/bin/sh
-WS=$(git config --get-color color.diff.whitespace "blue reverse")
-RESET=$(git config --get-color "" "reset")
+WS=$(git config get --type=color --default="blue reverse" color.diff.whitespace)
+RESET=$(git config get --type=color --default="reset" "")
 echo "${WS}your whitespace color or blue reverse${RESET}"
 ------------
 
@@ -567,11 +570,11 @@ For URLs in `https://weak.example.com`, `http.sslVerify` is set to
 false, while it is set to `true` for all others:
 
 ------------
-% git config --type=bool --get-urlmatch http.sslverify https://good.example.com
+% git config get --type=bool --url=https://good.example.com http.sslverify
 true
-% git config --type=bool --get-urlmatch http.sslverify https://weak.example.com
+% git config get --type=bool --url=https://weak.example.com http.sslverify
 false
-% git config --get-urlmatch http https://weak.example.com
+% git config get --url=https://weak.example.com http
 http.cookieFile /tmp/cookie.txt
 http.sslverify false
 ------------
diff --git a/builtin/config.c b/builtin/config.c
index ee7ac9381e..aaa8b15e86 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -17,7 +17,7 @@
 
 static const char *const builtin_config_usage[] = {
 	N_("git config list [<file-option>] [<display-option>] [--includes]"),
-	N_("git config [<options>]"),
+	N_("git config get [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>"),
 	NULL
 };
 
@@ -26,6 +26,11 @@ static const char *const builtin_config_list_usage[] = {
 	NULL
 };
 
+static const char *const builtin_config_get_usage[] = {
+	N_("git config get [<file-option>] [<display-option>] [--includes] [--all] [--regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] <name>"),
+	NULL
+};
+
 static char *key;
 static regex_t *key_regexp;
 static const char *value_pattern;
@@ -721,6 +726,16 @@ static void handle_nul(void) {
 	OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given config file")), \
 	OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"), N_("read config from given blob object"))
 
+#define CONFIG_TYPE_OPTIONS \
+	OPT_GROUP(N_("Type")), \
+	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type), \
+	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL), \
+	OPT_CALLBACK_VALUE(0, "int", &type, N_("value is decimal number"), TYPE_INT), \
+	OPT_CALLBACK_VALUE(0, "bool-or-int", &type, N_("value is --bool or --int"), TYPE_BOOL_OR_INT), \
+	OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or string"), TYPE_BOOL_OR_STR), \
+	OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or directory name)"), TYPE_PATH), \
+	OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry date"), TYPE_EXPIRY_DATE)
+
 #define CONFIG_DISPLAY_OPTIONS \
 	OPT_GROUP(N_("Display options")), \
 	OPT_BOOL('z', "null", &end_nul, N_("terminate values with NUL byte")), \
@@ -745,14 +760,7 @@ static struct option builtin_config_options[] = {
 	OPT_CMDMODE('e', "edit", &actions, N_("open an editor"), ACTION_EDIT),
 	OPT_CMDMODE(0, "get-color", &actions, N_("find the color configured: slot [<default>]"), ACTION_GET_COLOR),
 	OPT_CMDMODE(0, "get-colorbool", &actions, N_("find the color setting: slot [<stdout-is-tty>]"), ACTION_GET_COLORBOOL),
-	OPT_GROUP(N_("Type")),
-	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type),
-	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL),
-	OPT_CALLBACK_VALUE(0, "int", &type, N_("value is decimal number"), TYPE_INT),
-	OPT_CALLBACK_VALUE(0, "bool-or-int", &type, N_("value is --bool or --int"), TYPE_BOOL_OR_INT),
-	OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or string"), TYPE_BOOL_OR_STR),
-	OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or directory name)"), TYPE_PATH),
-	OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry date"), TYPE_EXPIRY_DATE),
+	CONFIG_TYPE_OPTIONS,
 	CONFIG_DISPLAY_OPTIONS,
 	OPT_GROUP(N_("Other")),
 	OPT_STRING(0, "default", &default_value, N_("value"), N_("with --get, use default value when missing entry")),
@@ -797,8 +805,51 @@ static int cmd_config_list(int argc, const char **argv, const char *prefix)
 	return 0;
 }
 
+static int cmd_config_get(int argc, const char **argv, const char *prefix)
+{
+	const char *value_pattern = NULL, *url = NULL;
+	int flags = 0;
+	struct option opts[] = {
+		CONFIG_LOCATION_OPTIONS,
+		CONFIG_TYPE_OPTIONS,
+		OPT_GROUP(N_("Filter options")),
+		OPT_BOOL(0, "all", &do_all, N_("return all values for multi-valued config options")),
+		OPT_BOOL(0, "regexp", &use_key_regexp, N_("interpret the name as a regular expression")),
+		OPT_STRING(0, "value", &value_pattern, N_("pattern"), N_("show config with values matching the pattern")),
+		OPT_BIT(0, "fixed-value", &flags, N_("use string equality when comparing values to value pattern"), CONFIG_FLAGS_FIXED_VALUE),
+		OPT_STRING(0, "url", &url, N_("URL"), N_("show config matching the given URL")),
+		CONFIG_DISPLAY_OPTIONS,
+		OPT_BOOL(0, "show-names", &show_keys, N_("show config keys in addition to their values")),
+		OPT_GROUP(N_("Other")),
+		OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect include directives on lookup")),
+		OPT_STRING(0, "default", &default_value, N_("value"), N_("use default value when missing entry")),
+		OPT_END(),
+	};
+
+	argc = parse_options(argc, argv, prefix, opts, builtin_config_get_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	check_argc(argc, 1, 1);
+
+	if ((flags & CONFIG_FLAGS_FIXED_VALUE) && !value_pattern)
+		die(_("--fixed-value only applies with 'value-pattern'"));
+	if (default_value && (do_all || url))
+		die(_("--default= cannot be used with --all or --url="));
+	if (url && (do_all || use_key_regexp || value_pattern))
+		die(_("--url= cannot be used with --all, --regexp or --value"));
+
+	handle_config_location(prefix);
+	handle_nul();
+
+	setup_auto_pager("config", 1);
+
+	if (url)
+		return get_urlmatch(argv[0], url);
+	return get_value(argv[0], value_pattern, flags);
+}
+
 static struct option builtin_subcommand_options[] = {
 	OPT_SUBCOMMAND("list", &subcommand, cmd_config_list),
+	OPT_SUBCOMMAND("get", &subcommand, cmd_config_get),
 	OPT_END(),
 };
 
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index 720f0ee929..7f6746936e 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -17,9 +17,15 @@ do
 case "$mode" in
 legacy)
 	mode_prefix="--"
+	mode_get=""
+	mode_get_all="--get-all"
+	mode_get_regexp="--get-regexp"
 	;;
 subcommands)
 	mode_prefix=""
+	mode_get="get"
+	mode_get_all="get --all"
+	mode_get_regexp="get --regexp --all --show-names"
 	;;
 *)
 	echo "unknown mode $mode" >&2
@@ -289,7 +295,7 @@ test_expect_success 'multi-valued get-all returns all' '
 	wow
 	wow2 for me
 	EOF
-	git config --get-all nextsection.nonewline >actual &&
+	git config ${mode_get_all} nextsection.nonewline >actual &&
 	test_cmp expect actual
 '
 
@@ -391,7 +397,7 @@ nextsection.nonewline wow2 for me
 EOF
 
 test_expect_success '--get-regexp' '
-	git config --get-regexp in >output &&
+	git config ${mode_get_regexp} in >output &&
 	test_cmp expect output
 '
 
@@ -401,7 +407,7 @@ nextsection.nonewline
 EOF
 
 test_expect_success '--name-only --get-regexp' '
-	git config --name-only --get-regexp in >output &&
+	git config ${mode_get_regexp} --name-only in >output &&
 	test_cmp expect output
 '
 
@@ -412,7 +418,7 @@ EOF
 
 test_expect_success '--add' '
 	git config --add nextsection.nonewline "wow4 for you" &&
-	git config --get-all nextsection.nonewline > output &&
+	git config ${mode_get_all} nextsection.nonewline > output &&
 	test_cmp expect output
 '
 
@@ -434,21 +440,21 @@ test_expect_success 'get variable with empty value' '
 echo novalue.variable > expect
 
 test_expect_success 'get-regexp variable with no value' '
-	git config --get-regexp novalue > output &&
+	git config ${mode_get_regexp} novalue > output &&
 	test_cmp expect output
 '
 
 echo 'novalue.variable true' > expect
 
 test_expect_success 'get-regexp --bool variable with no value' '
-	git config --bool --get-regexp novalue > output &&
+	git config ${mode_get_regexp} --bool novalue > output &&
 	test_cmp expect output
 '
 
 echo 'emptyvalue.variable ' > expect
 
 test_expect_success 'get-regexp variable with empty value' '
-	git config --get-regexp emptyvalue > output &&
+	git config ${mode_get_regexp} emptyvalue > output &&
 	test_cmp expect output
 '
 
@@ -1022,7 +1028,7 @@ test_expect_success 'quoting' '
 '
 
 test_expect_success 'key with newline' '
-	test_must_fail git config "key.with
+	test_must_fail git config ${mode_get} "key.with
 newline" 123'
 
 test_expect_success 'value with newline' 'git config key.sub value.with\\\
@@ -1076,7 +1082,7 @@ test_expect_success '--null --list' '
 '
 
 test_expect_success '--null --get-regexp' '
-	git config --null --get-regexp "val[0-9]" >result.raw &&
+	git config ${mode_get_regexp} --null "val[0-9]" >result.raw &&
 	nul_to_q <result.raw >result &&
 	echo >>result &&
 	test_cmp expect result
@@ -1158,11 +1164,11 @@ test_expect_success 'git -c can represent empty string' '
 '
 
 test_expect_success 'key sanity-checking' '
-	test_must_fail git config foo=bar &&
-	test_must_fail git config foo=.bar &&
-	test_must_fail git config foo.ba=r &&
-	test_must_fail git config foo.1bar &&
-	test_must_fail git config foo."ba
+	test_must_fail git config ${mode_get} foo=bar &&
+	test_must_fail git config ${mode_get} foo=.bar &&
+	test_must_fail git config ${mode_get} foo.ba=r &&
+	test_must_fail git config ${mode_get} foo.1bar &&
+	test_must_fail git config ${mode_get} foo."ba
 				z".bar &&
 	test_must_fail git config . false &&
 	test_must_fail git config .foo false &&
@@ -1211,7 +1217,7 @@ test_expect_success 'git -c complains about empty key and value' '
 '
 
 test_expect_success 'multiple git -c appends config' '
-	test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
+	test_config alias.x "!git -c x.two=2 config ${mode_get_regexp} ^x\.*" &&
 	cat >expect <<-\EOF &&
 	x.one 1
 	x.two 2
@@ -1377,7 +1383,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles old-style entries' '
 	v="${SQ}key.one=foo${SQ}" &&
 	v="$v  ${SQ}key.two=bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever=value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1390,7 +1396,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles new-style entries' '
 	v="${SQ}key.one${SQ}=${SQ}foo${SQ}" &&
 	v="$v  ${SQ}key.two${SQ}=${SQ}bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever${SQ}=${SQ}value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1404,7 +1410,7 @@ test_expect_success 'old and new-style entries can mix' '
 	v="$v ${SQ}key.newone${SQ}=${SQ}newfoo${SQ}" &&
 	v="$v ${SQ}key.oldtwo=oldbar${SQ}" &&
 	v="$v ${SQ}key.newtwo${SQ}=${SQ}newbar${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.oldone oldfoo
 	key.newone newfoo
@@ -1417,7 +1423,7 @@ test_expect_success 'old and new-style entries can mix' '
 test_expect_success 'old and new bools with ambiguous subsection' '
 	v="${SQ}key.with=equals.oldbool${SQ}" &&
 	v="$v ${SQ}key.with=equals.newbool${SQ}=" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_get_regexp} "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.with equals.oldbool
 	key.with=equals.newbool
@@ -1431,7 +1437,7 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ} ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_get_regexp} "env.*" >actual &&
 	test_cmp expect actual &&
 
 	cat >expect <<-EOF &&
@@ -1439,12 +1445,12 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ$SQ$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_get_regexp} "env.*" >actual &&
 	test_cmp expect actual &&
 
 	test_must_fail env \
 		GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*"
+		git config ${mode_get_regexp} "env.*"
 '
 
 test_expect_success 'git --config-env=key=envvar support' '
@@ -1492,7 +1498,7 @@ test_expect_success 'git -c and --config-env work together' '
 	ENVVAR=env-value git \
 		-c bar.cmd=cmd-value \
 		--config-env=bar.env=ENVVAR \
-		config --get-regexp "^bar.*" >actual &&
+		config ${mode_get_regexp} "^bar.*" >actual &&
 	test_cmp expect actual
 '
 
@@ -1520,7 +1526,7 @@ test_expect_success 'git config handles environment config pairs' '
 	GIT_CONFIG_COUNT=2 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \
-		git config --get-regexp "pair.*" >actual &&
+		git config ${mode_get_regexp} "pair.*" >actual &&
 	cat >expect <<-EOF &&
 	pair.one foo
 	pair.two bar
@@ -1530,7 +1536,7 @@ test_expect_success 'git config handles environment config pairs' '
 
 test_expect_success 'git config ignores pairs without count' '
 	test_must_fail env GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
@@ -1538,7 +1544,7 @@ test_expect_success 'git config ignores pairs exceeding count' '
 	GIT_CONFIG_COUNT=1 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="value" \
-		git config --get-regexp "pair.*" >actual 2>error &&
+		git config ${mode_get_regexp} "pair.*" >actual 2>error &&
 	cat >expect <<-EOF &&
 	pair.one value
 	EOF
@@ -1549,14 +1555,14 @@ test_expect_success 'git config ignores pairs exceeding count' '
 test_expect_success 'git config ignores pairs with zero count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT=0 GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
 test_expect_success 'git config ignores pairs with empty count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT= GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${mode_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
@@ -1595,7 +1601,7 @@ test_expect_success 'environment overrides config file' '
 	one = value
 	EOF
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=override \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1605,7 +1611,7 @@ test_expect_success 'environment overrides config file' '
 test_expect_success 'GIT_CONFIG_PARAMETERS overrides environment config' '
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \
 		GIT_CONFIG_PARAMETERS="${SQ}pair.one=override${SQ}" \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1680,20 +1686,28 @@ test_expect_success 'urlmatch' '
 
 	test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
 	test_must_be_empty actual &&
+	test_expect_code 1 git config get --url=https://good.example.com --bool doesnt.exist >actual &&
+	test_must_be_empty actual &&
 
 	echo true >expect &&
 	git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --bool --url=https://good.example.com http.SSLverify >actual &&
+	test_cmp expect actual &&
 
 	echo false >expect &&
 	git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --bool --url=https://weak.example.com http.sslverify >actual &&
+	test_cmp expect actual &&
 
 	{
 		echo http.cookiefile /tmp/cookie.txt &&
 		echo http.sslverify false
 	} >expect &&
 	git config --get-urlmatch HTTP https://weak.example.com >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://weak.example.com HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1709,6 +1723,8 @@ test_expect_success 'urlmatch with --show-scope' '
 	local	http.sslverify false
 	EOF
 	git config --get-urlmatch --show-scope HTTP https://weak.example.com >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://weak.example.com --show-scope HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1741,45 +1757,67 @@ test_expect_success 'urlmatch favors more specific URLs' '
 	echo http.cookiefile /tmp/root.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com/subdirectory HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://example.com/subdirectory/nested HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/user.txt >expect &&
 	git config --get-urlmatch HTTP https://user@example.com/ >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://user@example.com/ HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
 	git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://averylonguser@example.com/subdirectory HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/preceding.txt >expect &&
 	git config --get-urlmatch HTTP https://preceding.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://preceding.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/wildcard.txt >expect &&
 	git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://wildcard.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
 	git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://sub.example.com/wildcardwithsubdomain HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/trailing.txt >expect &&
 	git config --get-urlmatch HTTP https://trailing.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://trailing.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
 	git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
 	test_cmp expect actual &&
+	git config get --url=https://user@sub.example.com HTTP >actual &&
+	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/multiwildcard.txt >expect &&
 	git config --get-urlmatch HTTP https://wildcard.example.org >actual &&
+	test_cmp expect actual &&
+	git config get --url=https://wildcard.example.org HTTP >actual &&
 	test_cmp expect actual
 '
 
@@ -1902,7 +1940,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[one]
 	EOF
 	git config --unset two.subsection.key &&
-	test "not [two subsection]" = "$(git config one.key)" &&
+	test "not [two subsection]" = "$(git config ${mode_get} one.key)" &&
 	test_line_count = 3 .git/config
 '
 
@@ -2025,7 +2063,7 @@ test_expect_success '--show-origin with --get-regexp' '
 	file:$HOME/.gitconfig	user.global true
 	file:.git/config	user.local true
 	EOF
-	git config --show-origin --get-regexp "user\.[g|l].*" >output &&
+	git config ${mode_get_regexp} --show-origin "user\.[g|l].*" >output &&
 	test_cmp expect output
 '
 
@@ -2033,7 +2071,7 @@ test_expect_success '--show-origin getting a single key' '
 	cat >expect <<-\EOF &&
 	file:.git/config	local
 	EOF
-	git config --show-origin user.override >output &&
+	git config ${mode_get} --show-origin user.override >output &&
 	test_cmp expect output
 '
 
@@ -2165,7 +2203,7 @@ test_expect_success '--show-scope getting a single value' '
 	cat >expect <<-\EOF &&
 	local	true
 	EOF
-	git config --show-scope --get user.local >output &&
+	git config ${mode_get} --show-scope user.local >output &&
 	test_cmp expect output
 '
 
@@ -2434,9 +2472,9 @@ test_expect_success 'refuse --fixed-value for incompatible actions' '
 	# These modes complain when --fixed-value has no value-pattern
 	test_must_fail git config --file=config --fixed-value dev.null bogus &&
 	test_must_fail git config --file=config --fixed-value --replace-all dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --get dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-all dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-regexp "dev.*" &&
+	test_must_fail git config ${mode_prefix}get --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_get_all} --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_get_regexp} --file=config --fixed-value "dev.*" &&
 	test_must_fail git config --file=config --fixed-value --unset dev.null &&
 	test_must_fail git config --file=config --fixed-value --unset-all dev.null
 '
@@ -2466,12 +2504,12 @@ test_expect_success '--fixed-value uses exact string matching' '
 	cp initial config &&
 	test_must_fail git config --file=config --unset fixed.test "$META" &&
 	git config --file=config --fixed-value --unset fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
 	test_must_fail git config --file=config --unset-all fixed.test "$META" &&
 	git config --file=config --fixed-value --unset-all fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
 	git config --file=config --replace-all fixed.test bogus "$META" &&
@@ -2498,18 +2536,27 @@ test_expect_success '--get and --get-all with --fixed-value' '
 	git config --file=config --add fixed.test "$META" &&
 
 	git config --file=config --get fixed.test bogus &&
+	git config get --file=config --value=bogus fixed.test &&
 	test_must_fail git config --file=config --get fixed.test "$META" &&
+	test_must_fail git config get --file=config --value="$META" fixed.test &&
 	git config --file=config --get --fixed-value fixed.test "$META" &&
+	git config get --file=config --fixed-value --value="$META" fixed.test &&
 	test_must_fail git config --file=config --get --fixed-value fixed.test non-existent &&
 
 	git config --file=config --get-all fixed.test bogus &&
+	git config get --all --file=config --value=bogus fixed.test &&
 	test_must_fail git config --file=config --get-all fixed.test "$META" &&
+	test_must_fail git config get --all --file=config --value="$META" fixed.test &&
 	git config --file=config --get-all --fixed-value fixed.test "$META" &&
+	git config get --all --file=config --value="$META" --fixed-value fixed.test &&
 	test_must_fail git config --file=config --get-all --fixed-value fixed.test non-existent &&
 
 	git config --file=config --get-regexp fixed+ bogus &&
+	git config get --regexp --file=config --value=bogus fixed+ &&
 	test_must_fail git config --file=config --get-regexp fixed+ "$META" &&
+	test_must_fail git config get --regexp --file=config --value="$META" fixed+ &&
 	git config --file=config --get-regexp --fixed-value fixed+ "$META" &&
+	git config get --regexp --file=config --fixed-value --value="$META" fixed+ &&
 	test_must_fail git config --file=config --get-regexp --fixed-value fixed+ non-existent
 '
 
-- 
2.44.0


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

^ permalink raw reply related	[relevance 3%]

* Re: [PATCH v3 14/14] fsmonitor: support case-insensitive events
  2024-02-26 21:39  3%     ` [PATCH v3 14/14] fsmonitor: support case-insensitive events Jeff Hostetler via GitGitGadget
@ 2024-03-06 12:58  0%       ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-03-06 12:58 UTC (permalink / raw)
  To: Jeff Hostetler via GitGitGadget
  Cc: git, Jeff Hostetler, Torsten Bögershausen, Jeff Hostetler

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

On Mon, Feb 26, 2024 at 09:39:25PM +0000, Jeff Hostetler via GitGitGadget wrote:
> From: Jeff Hostetler <jeffhostetler@github.com>
> 
> Teach fsmonitor_refresh_callback() to handle case-insensitive
> lookups if case-sensitive lookups fail on case-insensitive systems.
> This can cause 'git status' to report stale status for files if there
> are case issues/errors in the worktree.
> 
> The FSMonitor daemon sends FSEvents using the observed spelling
> of each pathname.  On case-insensitive file systems this may be
> different than the expected case spelling.
> 
> The existing code uses index_name_pos() to find the cache-entry for
> the pathname in the FSEvent and clear the CE_FSMONITOR_VALID bit so
> that the worktree scan/index refresh will revisit and revalidate the
> path.
> 
> On a case-insensitive file system, the exact match lookup may fail
> to find the associated cache-entry. This causes status to think that
> the cached CE flags are correct and skip over the file.
> 
> Update event handling to optionally use the name-hash and dir-name-hash
> if necessary.
> 
> Also update t7527 to convert the "test_expect_failure" to "_success"
> now that we have fixed the bug.
> 
> Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
> ---
>  fsmonitor.c                  | 121 +++++++++++++++++++++++++++++++++++
>  t/t7527-builtin-fsmonitor.sh |  26 +++++---
>  2 files changed, 137 insertions(+), 10 deletions(-)
> 
> diff --git a/fsmonitor.c b/fsmonitor.c
> index 3c87449be87..2b17d60bbbe 100644
> --- a/fsmonitor.c
> +++ b/fsmonitor.c
> @@ -5,6 +5,7 @@
>  #include "ewah/ewok.h"
>  #include "fsmonitor.h"
>  #include "fsmonitor-ipc.h"
> +#include "name-hash.h"
>  #include "run-command.h"
>  #include "strbuf.h"
>  #include "trace2.h"
> @@ -202,6 +203,113 @@ static void invalidate_ce_fsm(struct cache_entry *ce)
>  static size_t handle_path_with_trailing_slash(
>  	struct index_state *istate, const char *name, int pos);
>  
> +/*
> + * Use the name-hash to do a case-insensitive cache-entry lookup with
> + * the pathname and invalidate the cache-entry.
> + *
> + * Returns the number of cache-entries that we invalidated.
> + */
> +static size_t handle_using_name_hash_icase(
> +	struct index_state *istate, const char *name)
> +{
> +	struct cache_entry *ce = NULL;
> +
> +	ce = index_file_exists(istate, name, strlen(name), 1);
> +	if (!ce)
> +		return 0;
> +
> +	/*
> +	 * A case-insensitive search in the name-hash using the
> +	 * observed pathname found a cache-entry, so the observed path
> +	 * is case-incorrect.  Invalidate the cache-entry and use the
> +	 * correct spelling from the cache-entry to invalidate the
> +	 * untracked-cache.  Since we now have sparse-directories in
> +	 * the index, the observed pathname may represent a regular
> +	 * file or a sparse-index directory.
> +	 *
> +	 * Note that we should not have seen FSEvents for a
> +	 * sparse-index directory, but we handle it just in case.
> +	 *
> +	 * Either way, we know that there are not any cache-entries for
> +	 * children inside the cone of the directory, so we don't need to
> +	 * do the usual scan.
> +	 */
> +	trace_printf_key(&trace_fsmonitor,
> +			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
> +			 name, ce->name);
> +
> +	/*
> +	 * NEEDSWORK: We used the name-hash to find the correct
> +	 * case-spelling of the pathname in the cache-entry[], so
> +	 * technically this is a tracked file or a sparse-directory.
> +	 * It should not have any entries in the untracked-cache, so
> +	 * we should not need to use the case-corrected spelling to
> +	 * invalidate the the untracked-cache.  So we may not need to
> +	 * do this.  For now, I'm going to be conservative and always
> +	 * do it; we can revisit this later.
> +	 */
> +	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
> +
> +	invalidate_ce_fsm(ce);
> +	return 1;
> +}
> +
> +/*
> + * Use the dir-name-hash to find the correct-case spelling of the
> + * directory.  Use the canonical spelling to invalidate all of the
> + * cache-entries within the matching cone.
> + *
> + * Returns the number of cache-entries that we invalidated.
> + */
> +static size_t handle_using_dir_name_hash_icase(
> +	struct index_state *istate, const char *name)
> +{
> +	struct strbuf canonical_path = STRBUF_INIT;
> +	int pos;
> +	size_t len = strlen(name);
> +	size_t nr_in_cone;
> +
> +	if (name[len - 1] == '/')
> +		len--;

Nit: this could use `strip_suffix()`.

> +
> +	if (!index_dir_find(istate, name, len, &canonical_path))
> +		return 0; /* name is untracked */
> +
> +	if (!memcmp(name, canonical_path.buf, canonical_path.len)) {
> +		strbuf_release(&canonical_path);
> +		/*
> +		 * NEEDSWORK: Our caller already tried an exact match
> +		 * and failed to find one.  They called us to do an
> +		 * ICASE match, so we should never get an exact match,
> +		 * so we could promote this to a BUG() here if we
> +		 * wanted to.  It doesn't hurt anything to just return

Nit: this comment is stale as this has been promoted to a BUG already.

Patrick

> +		 * 0 and go on because we should never get here.  Or we
> +		 * could just get rid of the memcmp() and this "if"
> +		 * clause completely.
> +		 */
> +		BUG("handle_using_dir_name_hash_icase(%s) did not exact match",
> +		    name);
> +	}
> +
> +	trace_printf_key(&trace_fsmonitor,
> +			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
> +			 name, canonical_path.buf);
> +
> +	/*
> +	 * The dir-name-hash only tells us the corrected spelling of
> +	 * the prefix.  We have to use this canonical path to do a
> +	 * lookup in the cache-entry array so that we repeat the
> +	 * original search using the case-corrected spelling.
> +	 */
> +	strbuf_addch(&canonical_path, '/');
> +	pos = index_name_pos(istate, canonical_path.buf,
> +			     canonical_path.len);
> +	nr_in_cone = handle_path_with_trailing_slash(
> +		istate, canonical_path.buf, pos);
> +	strbuf_release(&canonical_path);
> +	return nr_in_cone;
> +}
> +
>  /*
>   * The daemon sent an observed pathname without a trailing slash.
>   * (This is the normal case.)  We do not know if it is a tracked or
> @@ -335,6 +443,19 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
>  	else
>  		nr_in_cone = handle_path_without_trailing_slash(istate, name, pos);
>  
> +	/*
> +	 * If we did not find an exact match for this pathname or any
> +	 * cache-entries with this directory prefix and we're on a
> +	 * case-insensitive file system, try again using the name-hash
> +	 * and dir-name-hash.
> +	 */
> +	if (!nr_in_cone && ignore_case) {
> +		nr_in_cone = handle_using_name_hash_icase(istate, name);
> +		if (!nr_in_cone)
> +			nr_in_cone = handle_using_dir_name_hash_icase(
> +				istate, name);
> +	}
> +
>  	if (nr_in_cone)
>  		trace_printf_key(&trace_fsmonitor,
>  				 "fsmonitor_refresh_callback CNT: %d",
> diff --git a/t/t7527-builtin-fsmonitor.sh b/t/t7527-builtin-fsmonitor.sh
> index 830f2d9de33..730f3c7f810 100755
> --- a/t/t7527-builtin-fsmonitor.sh
> +++ b/t/t7527-builtin-fsmonitor.sh
> @@ -1051,7 +1051,7 @@ test_expect_success 'split-index and FSMonitor work well together' '
>  #
>  # The setup is a little contrived.
>  #
> -test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
> +test_expect_success CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
>  	test_when_finished "stop_daemon_delete_repo subdir_case_wrong" &&
>  
>  	git init subdir_case_wrong &&
> @@ -1116,19 +1116,19 @@ test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
>  
>  	grep -q "dir1/DIR2/dir3/file3.*pos -3" "$PWD/subdir_case_wrong.log1" &&
>  
> +	# Verify that we get a mapping event to correct the case.
> +	grep -q "MAP:.*dir1/DIR2/dir3/file3.*dir1/dir2/dir3/file3" \
> +		"$PWD/subdir_case_wrong.log1" &&
> +
>  	# The refresh-callbacks should have caused "git status" to clear
>  	# the CE_FSMONITOR_VALID bit on each of those files and caused
>  	# the worktree scan to visit them and mark them as modified.
>  	grep -q " M AAA" "$PWD/subdir_case_wrong.out" &&
>  	grep -q " M zzz" "$PWD/subdir_case_wrong.out" &&
> -
> -	# Expect Breakage: with the case confusion, the "(pos -3)" causes
> -	# the client to not clear the CE_FSMONITOR_VALID bit and therefore
> -	# status will not rescan the file and therefore not report it as dirty.
>  	grep -q " M dir1/dir2/dir3/file3" "$PWD/subdir_case_wrong.out"
>  '
>  
> -test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
> +test_expect_success CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
>  	test_when_finished "stop_daemon_delete_repo file_case_wrong" &&
>  
>  	git init file_case_wrong &&
> @@ -1242,14 +1242,20 @@ test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
>  	GIT_TRACE_FSMONITOR="$PWD/file_case_wrong-try3.log" \
>  		git -C file_case_wrong --no-optional-locks status --short \
>  			>"$PWD/file_case_wrong-try3.out" &&
> +
> +	# Verify that we get a mapping event to correct the case.
> +	grep -q "fsmonitor_refresh_callback MAP:.*dir1/dir2/dir3/FILE-3-A.*dir1/dir2/dir3/file-3-a" \
> +		"$PWD/file_case_wrong-try3.log" &&
> +	grep -q "fsmonitor_refresh_callback MAP:.*dir1/dir2/dir4/file-4-a.*dir1/dir2/dir4/FILE-4-A" \
> +		"$PWD/file_case_wrong-try3.log" &&
> +
>  	# FSEvents are in observed case.
>  	grep -q "fsmonitor_refresh_callback.*FILE-3-A.*pos -3" "$PWD/file_case_wrong-try3.log" &&
>  	grep -q "fsmonitor_refresh_callback.*file-4-a.*pos -9" "$PWD/file_case_wrong-try3.log" &&
>  
> -	# Expect Breakage: with the case confusion, the "(pos-3)" and
> -	# "(pos -9)" causes the client to not clear the CE_FSMONITOR_VALID
> -	# bit and therefore status will not rescan the files and therefore
> -	# not report them as dirty.
> +	# The refresh-callbacks should have caused "git status" to clear
> +	# the CE_FSMONITOR_VALID bit on each of those files and caused
> +	# the worktree scan to visit them and mark them as modified.
>  	grep -q " M dir1/dir2/dir3/file-3-a" "$PWD/file_case_wrong-try3.out" &&
>  	grep -q " M dir1/dir2/dir4/FILE-4-A" "$PWD/file_case_wrong-try3.out"
>  '
> -- 
> gitgitgadget

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

^ permalink raw reply	[relevance 0%]

* [PATCH 8/8] Documentation/git-config: update to new-style syntax
    2024-03-06 11:31  3% ` [PATCH 7/8] t1300: exercise both old- and new-style modes Patrick Steinhardt
@ 2024-03-06 11:32  2% ` Patrick Steinhardt
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-03-06 11:32 UTC (permalink / raw)
  To: git

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

Update our documentation of git-config(1) to stop mentioning the old
syntax while starting to mention the new syntax. Remove the help
mismatch in t0450 so that we start to ensure that the manpage and
builtin synopsis match.

Note that there will still be lots of mentions of the old style syntax
of git-config(1) throughout our documentation. This documentation will
be updated over time.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/git-config.txt | 204 ++++++++++++++++++-----------------
 builtin/config.c             |  46 +++++---
 t/t0450/txt-help-mismatches  |   1 -
 3 files changed, 137 insertions(+), 114 deletions(-)

diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index dff39093b5..edf67c85f7 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -9,21 +9,22 @@ git-config - Get and set repository or global options
 SYNOPSIS
 --------
 [verse]
-'git config' [<file-option>] [--type=<type>] [--fixed-value] [--show-origin] [--show-scope] [-z|--null] <name> [<value> [<value-pattern>]]
-'git config' [<file-option>] [--type=<type>] --add <name> <value>
-'git config' [<file-option>] [--type=<type>] [--fixed-value] --replace-all <name> <value> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get-all <name> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] --get-regexp <name-regex> [<value-pattern>]
-'git config' [<file-option>] [--type=<type>] [-z|--null] --get-urlmatch <name> <URL>
-'git config' [<file-option>] [--fixed-value] --unset <name> [<value-pattern>]
-'git config' [<file-option>] [--fixed-value] --unset-all <name> [<value-pattern>]
-'git config' [<file-option>] --rename-section <old-name> <new-name>
-'git config' [<file-option>] --remove-section <name>
-'git config' [<file-option>] [--show-origin] [--show-scope] [-z|--null] [--name-only] -l | --list
-'git config' [<file-option>] --get-color <name> [<default>]
-'git config' [<file-option>] --get-colorbool <name> [<stdout-is-tty>]
-'git config' [<file-option>] -e | --edit
+'git config list' [<file-option>] [--show-origin] [--show-scope] [-z|--null] [--name-only]
+'git config get' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] <name> [<value-pattern>]
+'git config get-all' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] <name> [<value-pattern>]
+'git config get-color' [<file-option>] <name> [<default>]
+'git config get-colorbool' [<file-option>] <name> [<stdout-is-tty>]
+'git config get-regexp' [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] <name-regex> [<value-pattern>]
+'git config get-urlmatch' [<file-option>] [--type=<type>] [-z|--null] <name> <URL>
+'git config add' [<file-option>] [--type=<type>] <name> <value>
+'git config set' [<file-option>] [--type=<type>] <name> <value>
+'git config set-all' [<file-option>] [--type=<type>] [--fixed-value] <name> <value> [<value-pattern>]
+'git config unset' [<file-option>] [--fixed-value] <name> [<value-pattern>]
+'git config unset-all' [<file-option>] [--fixed-value] <name> [<value-pattern>]
+'git config replace-all' [<file-option>] [--type=<type>] [--fixed-value] <name> <value> [<value-pattern>]
+'git config rename-section' [<file-option>] <old-name> <new-name>
+'git config remove-section' [<file-option>] <name>
+'git config edit' [<file-option>]
 
 DESCRIPTION
 -----------
@@ -74,35 +75,50 @@ On success, the command returns the exit code 0.
 A list of all available configuration variables can be obtained using the
 `git help --config` command.
 
-[[OPTIONS]]
-OPTIONS
--------
-
---replace-all::
-	Default behavior is to replace at most one line. This replaces
-	all lines matching the key (and optionally the `value-pattern`).
+COMMANDS
+--------
 
---add::
-	Adds a new line to the option without altering any existing
-	values.  This is the same as providing '^$' as the `value-pattern`
-	in `--replace-all`.
+list::
+	List all variables set in config file, along with their values.
 
---get::
+get <name> [<value-pattern>]::
 	Get the value for a given key (optionally filtered by a regex
 	matching the value). Returns error code 1 if the key was not
 	found and the last value if multiple key values were found.
 
---get-all::
+get-all <name> [<value-pattern>]::
 	Like get, but returns all values for a multi-valued key.
 
---get-regexp::
-	Like --get-all, but interprets the name as a regular expression and
+get-color <name> [<default>]::
+
+	Find the color configured for `name` (e.g. `color.diff.new`) and
+	output it as the ANSI color escape sequence to the standard
+	output.  The optional `default` parameter is used instead, if
+	there is no color configured for `name`.
++
+`--type=color [--default=<default>]` is preferred over `get-color`
+(but note that `get-color` will omit the trailing newline printed by
+`--type=color`).
+
+get-colorbool <name> [<stdout-is-tty>]::
+
+	Find the color setting for `<name>` (e.g. `color.diff`) and output
+	"true" or "false".  `<stdout-is-tty>` should be either "true" or
+	"false", and is taken into account when configuration says
+	"auto".  If `<stdout-is-tty>` is missing, then checks the standard
+	output of the command itself, and exits with status 0 if color
+	is to be used, or exits with status 1 otherwise.
+	When the color setting for `name` is undefined, the command uses
+	`color.ui` as fallback.
+
+get-regex <name-regex> [<value-pattern>]::
+	Like `get-all`, but interprets the name as a regular expression and
 	writes out the key names.  Regular expression matching is currently
 	case-sensitive and done against a canonicalized version of the key
 	in which section and variable names are lowercased, but subsection
 	names are not.
 
---get-urlmatch <name> <URL>::
+get-urlmatch <name> <URL>::
 	When given a two-part <name> as <section>.<key>, the value for
 	<section>.<URL>.<key> whose <URL> part matches the best to the
 	given URL is returned (if no such key exists, the value for
@@ -110,6 +126,43 @@ OPTIONS
 	<section> as name, do so for all the keys in the section and
 	list them.  Returns error code 1 if no value is found.
 
+add <name> <value>::
+	Adds a new line to the option without altering any existing
+	values.  This is the same as providing '^$' as the `value-pattern`
+	in `--replace-all`.
+
+set <name> <value>::
+	Set the config key to the given value. Adds a new key to the
+	configuration in case it does not yet exist. This subcommand fails when
+	the key has multiple values.
+
+set-all <name> <value> [<value-pattern>]::
+	Set all config keys to the given value.
+
+unset <name> [<value-pattern>]::
+	Remove the line matching the key from config file.
+
+unset-all <name> [<value-pattern>]::
+	Remove all lines matching the key from config file.
+
+replace-all <name> <value> [<value-pattern>]::
+	Default behavior is to replace at most one line. This replaces
+	all lines matching the key (and optionally the `value-pattern`).
+
+remove-section <name>::
+	Remove the given section from the configuration file.
+
+rename-section <old-name> <new-name>::
+	Rename the given section to a new name.
+
+edit::
+	Opens an editor to modify the specified config file; either
+	`--system`, `--global`, or repository (default).
+
+[[OPTIONS]]
+OPTIONS
+-------
+
 --global::
 	For writing options: write to global `~/.gitconfig` file
 	rather than the repository `.git/config`, write to
@@ -166,22 +219,6 @@ See also <<FILES>>.
 	section in linkgit:gitrevisions[7] for a more complete list of
 	ways to spell blob names.
 
---remove-section::
-	Remove the given section from the configuration file.
-
---rename-section::
-	Rename the given section to a new name.
-
---unset::
-	Remove the line matching the key from config file.
-
---unset-all::
-	Remove all lines matching the key from config file.
-
--l::
---list::
-	List all variables set in config file, along with their values.
-
 --fixed-value::
 	When used with the `value-pattern` argument, treat `value-pattern` as
 	an exact string instead of a regular expression. This will restrict
@@ -236,8 +273,8 @@ Valid `<type>`'s include:
 	contain line breaks.
 
 --name-only::
-	Output only the names of config variables for `--list` or
-	`--get-regexp`.
+	Output only the names of config variables for `list` or
+	`get-regexp`.
 
 --show-origin::
 	Augment the output of all queried config options with the
@@ -250,33 +287,6 @@ Valid `<type>`'s include:
 	all queried config options with the scope of that value
 	(worktree, local, global, system, command).
 
---get-colorbool <name> [<stdout-is-tty>]::
-
-	Find the color setting for `<name>` (e.g. `color.diff`) and output
-	"true" or "false".  `<stdout-is-tty>` should be either "true" or
-	"false", and is taken into account when configuration says
-	"auto".  If `<stdout-is-tty>` is missing, then checks the standard
-	output of the command itself, and exits with status 0 if color
-	is to be used, or exits with status 1 otherwise.
-	When the color setting for `name` is undefined, the command uses
-	`color.ui` as fallback.
-
---get-color <name> [<default>]::
-
-	Find the color configured for `name` (e.g. `color.diff.new`) and
-	output it as the ANSI color escape sequence to the standard
-	output.  The optional `default` parameter is used instead, if
-	there is no color configured for `name`.
-+
-`--type=color [--default=<default>]` is preferred over `--get-color`
-(but note that `--get-color` will omit the trailing newline printed by
-`--type=color`).
-
--e::
---edit::
-	Opens an editor to modify the specified config file; either
-	`--system`, `--global`, or repository (default).
-
 --[no-]includes::
 	Respect `include.*` directives in config files when looking up
 	values. Defaults to `off` when a specific file is given (e.g.,
@@ -284,13 +294,13 @@ Valid `<type>`'s include:
 	config files.
 
 --default <value>::
-  When using `--get`, and the requested variable is not found, behave as if
+  When using `get`, and the requested variable is not found, behave as if
   <value> were the value assigned to the that variable.
 
 CONFIGURATION
 -------------
 `pager.config` is only respected when listing configuration, i.e., when
-using `--list` or any of the `--get-*` which may return multiple results.
+using `list` or any of the `get-*` subcommands which may return multiple results.
 The default is to use a pager.
 
 [[FILES]]
@@ -333,8 +343,8 @@ precedence over values read earlier.  When multiple values are taken then all
 values of a key from all files will be used.
 
 By default, options are only written to the repository specific
-configuration file. Note that this also affects options like `--replace-all`
-and `--unset`. *'git config' will only ever change one file at a time*.
+configuration file. Note that this also affects subcommands like `replace-all`
+and `unset`. *'git config' will only ever change one file at a time*.
 
 You can limit which configuration sources are read from or written to by
 specifying the path of a file with the `--file` option, or by specifying a
@@ -469,7 +479,7 @@ Given a .git/config like this:
 you can set the filemode to true with
 
 ------------
-% git config core.filemode true
+% git config set core.filemode true
 ------------
 
 The hypothetical proxy command entries actually have a postfix to discern
@@ -477,7 +487,7 @@ what URL they apply to. Here is how to change the entry for kernel.org
 to "ssh".
 
 ------------
-% git config core.gitproxy '"ssh" for kernel.org' 'for kernel.org$'
+% git config set core.gitproxy '"ssh" for kernel.org' 'for kernel.org$'
 ------------
 
 This makes sure that only the key/value pair for kernel.org is replaced.
@@ -485,7 +495,7 @@ This makes sure that only the key/value pair for kernel.org is replaced.
 To delete the entry for renames, do
 
 ------------
-% git config --unset diff.renames
+% git config unset diff.renames
 ------------
 
 If you want to delete an entry for a multivar (like core.gitproxy above),
@@ -494,51 +504,51 @@ you have to provide a regex matching the value of exactly one line.
 To query the value for a given key, do
 
 ------------
-% git config --get core.filemode
+% git config get core.filemode
 ------------
 
 or
 
 ------------
-% git config core.filemode
+% git config get core.filemode
 ------------
 
 or, to query a multivar:
 
 ------------
-% git config --get core.gitproxy "for kernel.org$"
+% git config get core.gitproxy "for kernel.org$"
 ------------
 
 If you want to know all the values for a multivar, do:
 
 ------------
-% git config --get-all core.gitproxy
+% git config get-all core.gitproxy
 ------------
 
 If you like to live dangerously, you can replace *all* core.gitproxy by a
 new one with
 
 ------------
-% git config --replace-all core.gitproxy ssh
+% git config replace-all core.gitproxy ssh
 ------------
 
 However, if you really only want to replace the line for the default proxy,
 i.e. the one without a "for ..." postfix, do something like this:
 
 ------------
-% git config core.gitproxy ssh '! for '
+% git config get core.gitproxy ssh '! for '
 ------------
 
 To actually match only values with an exclamation mark, you have to
 
 ------------
-% git config section.key value '[!]'
+% git config get section.key value '[!]'
 ------------
 
 To add a new proxy, without altering any of the existing ones, use
 
 ------------
-% git config --add core.gitproxy '"proxy-command" for example.com'
+% git config add core.gitproxy '"proxy-command" for example.com'
 ------------
 
 An example to use customized color from the configuration in your
@@ -546,8 +556,8 @@ script:
 
 ------------
 #!/bin/sh
-WS=$(git config --get-color color.diff.whitespace "blue reverse")
-RESET=$(git config --get-color "" "reset")
+WS=$(git config get-color color.diff.whitespace "blue reverse")
+RESET=$(git config get-color "" "reset")
 echo "${WS}your whitespace color or blue reverse${RESET}"
 ------------
 
@@ -555,11 +565,11 @@ For URLs in `https://weak.example.com`, `http.sslVerify` is set to
 false, while it is set to `true` for all others:
 
 ------------
-% git config --type=bool --get-urlmatch http.sslverify https://good.example.com
+% git config get-urlmatch --type=bool http.sslverify https://good.example.com
 true
-% git config --type=bool --get-urlmatch http.sslverify https://weak.example.com
+% git config get-urlmatch --type=bool http.sslverify https://weak.example.com
 false
-% git config --get-urlmatch http https://weak.example.com
+% git config get-urlmatch http https://weak.example.com
 http.cookieFile /tmp/cookie.txt
 http.sslverify false
 ------------
@@ -578,7 +588,7 @@ looks like
     key = value1
 --------
 
-and running `git config section.Subsection.key value2` will result in
+and running `git config add section.Subsection.key value2` will result in
 
 --------
   [section.subsection]
diff --git a/builtin/config.c b/builtin/config.c
index 10fa933931..61a9ad3eaa 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -16,7 +16,22 @@
 #include "worktree.h"
 
 static const char *const builtin_config_usage[] = {
-	N_("git config [<options>]"),
+	N_("git config list [<file-option>] [--show-origin] [--show-scope] [-z|--null] [--name-only]"),
+	N_("git config get [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] <name> [<value-pattern>]"),
+	N_("git config get-all [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] <name> [<value-pattern>]"),
+	N_("git config get-color [<file-option>] <name> [<default>]"),
+	N_("git config get-colorbool [<file-option>] <name> [<stdout-is-tty>]"),
+	N_("git config get-regexp [<file-option>] [--type=<type>] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] <name-regex> [<value-pattern>]"),
+	N_("git config get-urlmatch [<file-option>] [--type=<type>] [-z|--null] <name> <URL>"),
+	N_("git config add [<file-option>] [--type=<type>] <name> <value>"),
+	N_("git config set [<file-option>] [--type=<type>] <name> <value>"),
+	N_("git config set-all [<file-option>] [--type=<type>] [--fixed-value] <name> <value> [<value-pattern>]"),
+	N_("git config unset [<file-option>] [--fixed-value] <name> [<value-pattern>]"),
+	N_("git config unset-all [<file-option>] [--fixed-value] <name> [<value-pattern>]"),
+	N_("git config replace-all [<file-option>] [--type=<type>] [--fixed-value] <name> <value> [<value-pattern>]"),
+	N_("git config rename-section [<file-option>] <old-name> <new-name>"),
+	N_("git config remove-section [<file-option>] <name>"),
+	N_("git config edit [<file-option>]"),
 	NULL
 };
 
@@ -887,21 +902,20 @@ static struct option builtin_config_options[] = {
 	OPT_BOOL(0, "worktree", &use_worktree_config, N_("use per-worktree config file")),
 	OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given config file")),
 	OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"), N_("read config from given blob object")),
-	OPT_GROUP(N_("Action")),
-	OPT_CMDMODE(0, "get", &action, N_("get value: name [value-pattern]"), ACTION_GET),
-	OPT_CMDMODE(0, "get-all", &action, N_("get all values: key [value-pattern]"), ACTION_GET_ALL),
-	OPT_CMDMODE(0, "get-regexp", &action, N_("get values for regexp: name-regex [value-pattern]"), ACTION_GET_REGEXP),
-	OPT_CMDMODE(0, "get-urlmatch", &action, N_("get value specific for the URL: section[.var] URL"), ACTION_GET_URLMATCH),
-	OPT_CMDMODE(0, "replace-all", &action, N_("replace all matching variables: name value [value-pattern]"), ACTION_REPLACE_ALL),
-	OPT_CMDMODE(0, "add", &action, N_("add a new variable: name value"), ACTION_ADD),
-	OPT_CMDMODE(0, "unset", &action, N_("remove a variable: name [value-pattern]"), ACTION_UNSET),
-	OPT_CMDMODE(0, "unset-all", &action, N_("remove all matches: name [value-pattern]"), ACTION_UNSET_ALL),
-	OPT_CMDMODE(0, "rename-section", &action, N_("rename section: old-name new-name"), ACTION_RENAME_SECTION),
-	OPT_CMDMODE(0, "remove-section", &action, N_("remove a section: name"), ACTION_REMOVE_SECTION),
-	OPT_CMDMODE('l', "list", &action, N_("list all"), ACTION_LIST),
-	OPT_CMDMODE('e', "edit", &action, N_("open an editor"), ACTION_EDIT),
-	OPT_CMDMODE(0, "get-color", &action, N_("find the color configured: slot [default]"), ACTION_GET_COLOR),
-	OPT_CMDMODE(0, "get-colorbool", &action, N_("find the color setting: slot [stdout-is-tty]"), ACTION_GET_COLORBOOL),
+	OPT_CMDMODE_F(0, "get", &action, N_("get value: name [value-pattern]"), ACTION_GET, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "get-all", &action, N_("get all values: key [value-pattern]"), ACTION_GET_ALL, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "get-regexp", &action, N_("get values for regexp: name-regex [value-pattern]"), ACTION_GET_REGEXP, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "get-urlmatch", &action, N_("get value specific for the URL: section[.var] URL"), ACTION_GET_URLMATCH, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "replace-all", &action, N_("replace all matching variables: name value [value-pattern]"), ACTION_REPLACE_ALL, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "add", &action, N_("add a new variable: name value"), ACTION_ADD, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "unset", &action, N_("remove a variable: name [value-pattern]"), ACTION_UNSET, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "unset-all", &action, N_("remove all matches: name [value-pattern]"), ACTION_UNSET_ALL, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "rename-section", &action, N_("rename section: old-name new-name"), ACTION_RENAME_SECTION, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "remove-section", &action, N_("remove a section: name"), ACTION_REMOVE_SECTION, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F('l', "list", &action, N_("list all"), ACTION_LIST, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F('e', "edit", &action, N_("open an editor"), ACTION_EDIT, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "get-color", &action, N_("find the color configured: slot [default]"), ACTION_GET_COLOR, PARSE_OPT_HIDDEN),
+	OPT_CMDMODE_F(0, "get-colorbool", &action, N_("find the color setting: slot [stdout-is-tty]"), ACTION_GET_COLORBOOL, PARSE_OPT_HIDDEN),
 	OPT_GROUP(N_("Type")),
 	OPT_CALLBACK('t', "type", &type, N_("type"), N_("value is given this type"), option_parse_type),
 	OPT_CALLBACK_VALUE(0, "bool", &type, N_("value is \"true\" or \"false\""), TYPE_BOOL),
diff --git a/t/t0450/txt-help-mismatches b/t/t0450/txt-help-mismatches
index a0777acd66..28003f18c9 100644
--- a/t/t0450/txt-help-mismatches
+++ b/t/t0450/txt-help-mismatches
@@ -10,7 +10,6 @@ checkout
 checkout-index
 clone
 column
-config
 credential
 credential-cache
 credential-store
-- 
2.44.0


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

^ permalink raw reply related	[relevance 2%]

* [PATCH 7/8] t1300: exercise both old- and new-style modes
  @ 2024-03-06 11:31  3% ` Patrick Steinhardt
  2024-03-06 11:32  2% ` [PATCH 8/8] Documentation/git-config: update to new-style syntax Patrick Steinhardt
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-03-06 11:31 UTC (permalink / raw)
  To: git

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

Convert t1300 so that tests exercise both the old and new-style way to
specify the mode.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t1300-config.sh | 721 ++++++++++++++++++++++++----------------------
 1 file changed, 375 insertions(+), 346 deletions(-)

diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index 2d1bc1e27e..705c17a1fb 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -11,6 +11,24 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
+for style in old new
+do
+
+case "$style" in
+old)
+	mode_prefix="--"
+	mode_get=""
+	mode_set=""
+	mode_set_all=""
+	;;
+new)
+	mode_prefix=""
+	mode_get="get"
+	mode_set="set"
+	mode_set_all="set-all"
+	;;
+esac
+
 test_expect_success 'clear default config' '
 	rm -f .git/config
 '
@@ -20,7 +38,7 @@ cat > expect << EOF
 	penguin = little blue
 EOF
 test_expect_success 'initial' '
-	git config section.penguin "little blue" &&
+	git config ${mode_set} section.penguin "little blue" &&
 	test_cmp expect .git/config
 '
 
@@ -30,7 +48,7 @@ cat > expect << EOF
 	Movie = BadPhysics
 EOF
 test_expect_success 'mixed case' '
-	git config Section.Movie BadPhysics &&
+	git config ${mode_set} Section.Movie BadPhysics &&
 	test_cmp expect .git/config
 '
 
@@ -42,7 +60,7 @@ cat > expect << EOF
 	WhatEver = Second
 EOF
 test_expect_success 'similar section' '
-	git config Sections.WhatEver Second &&
+	git config ${mode_set} Sections.WhatEver Second &&
 	test_cmp expect .git/config
 '
 
@@ -55,16 +73,16 @@ cat > expect << EOF
 	WhatEver = Second
 EOF
 test_expect_success 'uppercase section' '
-	git config SECTION.UPPERCASE true &&
+	git config ${mode_set} SECTION.UPPERCASE true &&
 	test_cmp expect .git/config
 '
 
 test_expect_success 'replace with non-match' '
-	git config section.penguin kingpin !blue
+	git config ${mode_set_all} section.penguin kingpin !blue
 '
 
 test_expect_success 'replace with non-match (actually matching)' '
-	git config section.penguin "very blue" !kingpin
+	git config ${mode_set_all} section.penguin "very blue" !kingpin
 '
 
 cat > expect << EOF
@@ -102,7 +120,7 @@ test_missing_key () {
 	local key="$1" &&
 	local title="$2" &&
 	test_expect_success "value for $title is not printed" '
-		test_must_fail git config "$key" >out 2>err &&
+		test_must_fail git config ${mode_get} "$key" >out 2>err &&
 		test_must_be_empty out &&
 		test_must_be_empty err
 	'
@@ -125,7 +143,7 @@ foo = bar
 EOF
 
 test_expect_success 'unset with cont. lines' '
-	git config --unset beta.baz
+	git config ${mode_prefix}unset beta.baz
 '
 
 cat > expect <<\EOF
@@ -152,7 +170,7 @@ EOF
 cp .git/config .git/config2
 
 test_expect_success 'multiple unset' '
-	git config --unset-all beta.haha
+	git config ${mode_prefix}unset-all beta.haha
 '
 
 cat > expect << EOF
@@ -178,7 +196,7 @@ test_expect_success '--replace-all missing value' '
 rm .git/config2
 
 test_expect_success '--replace-all' '
-	git config --replace-all beta.haha gamma
+	git config ${mode_prefix}replace-all beta.haha gamma
 '
 
 cat > expect << EOF
@@ -220,7 +238,7 @@ noIndent= sillyValue ; 'nother silly comment
 	nonewline = wow
 EOF
 test_expect_success 'really really mean test' '
-	git config nextsection.nonewline wow &&
+	git config ${mode_set} nextsection.nonewline wow &&
 	test_cmp expect .git/config
 '
 
@@ -238,7 +256,7 @@ noIndent= sillyValue ; 'nother silly comment
 	nonewline = wow
 EOF
 test_expect_success 'unset' '
-	git config --unset beta.haha &&
+	git config ${mode_prefix}unset beta.haha &&
 	test_cmp expect .git/config
 '
 
@@ -258,15 +276,15 @@ test_expect_success 'multivar' '
 '
 
 test_expect_success 'non-match' '
-	git config --get nextsection.nonewline !for
+	git config ${mode_prefix}get nextsection.nonewline !for
 '
 
 test_expect_success 'non-match value' '
-	test_cmp_config wow --get nextsection.nonewline !for
+	test_cmp_config wow ${mode_prefix}get nextsection.nonewline !for
 '
 
 test_expect_success 'multi-valued get returns final one' '
-	test_cmp_config "wow2 for me" --get nextsection.nonewline
+	test_cmp_config "wow2 for me" ${mode_prefix}get nextsection.nonewline
 '
 
 test_expect_success 'multi-valued get-all returns all' '
@@ -274,7 +292,7 @@ test_expect_success 'multi-valued get-all returns all' '
 	wow
 	wow2 for me
 	EOF
-	git config --get-all nextsection.nonewline >actual &&
+	git config ${mode_prefix}get-all nextsection.nonewline >actual &&
 	test_cmp expect actual
 '
 
@@ -289,16 +307,16 @@ noIndent= sillyValue ; 'nother silly comment
 	NoNewLine = wow2 for me
 EOF
 test_expect_success 'multivar replace' '
-	git config nextsection.nonewline "wow3" "wow$" &&
+	git config ${mode_set_all} nextsection.nonewline "wow3" "wow$" &&
 	test_cmp expect .git/config
 '
 
 test_expect_success 'ambiguous unset' '
-	test_must_fail git config --unset nextsection.nonewline
+	test_must_fail git config ${mode_prefix}unset nextsection.nonewline
 '
 
 test_expect_success 'invalid unset' '
-	test_must_fail git config --unset somesection.nonewline
+	test_must_fail git config ${mode_prefix}unset somesection.nonewline
 '
 
 cat > expect << EOF
@@ -312,16 +330,16 @@ noIndent= sillyValue ; 'nother silly comment
 EOF
 
 test_expect_success 'multivar unset' '
-	git config --unset nextsection.nonewline "wow3$" &&
+	git config ${mode_prefix}unset nextsection.nonewline "wow3$" &&
 	test_cmp expect .git/config
 '
 
-test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
+test_expect_success 'invalid key' 'test_must_fail git config ${mode_set} inval.2key blabla'
 
-test_expect_success 'correct key' 'git config 123456.a123 987'
+test_expect_success 'correct key' 'git config ${mode_set} 123456.a123 987'
 
 test_expect_success 'hierarchical section' '
-	git config Version.1.2.3eX.Alpha beta
+	git config ${mode_set} Version.1.2.3eX.Alpha beta
 '
 
 cat > expect << EOF
@@ -350,11 +368,11 @@ version.1.2.3eX.alpha=beta
 EOF
 
 test_expect_success 'working --list' '
-	git config --list > output &&
+	git config ${mode_prefix}list > output &&
 	test_cmp expect output
 '
 test_expect_success '--list without repo produces empty output' '
-	git --git-dir=nonexistent config --list >output &&
+	git --git-dir=nonexistent config ${mode_prefix}list >output &&
 	test_must_be_empty output
 '
 
@@ -366,7 +384,7 @@ version.1.2.3eX.alpha
 EOF
 
 test_expect_success '--name-only --list' '
-	git config --name-only --list >output &&
+	git config ${mode_prefix}list --name-only >output &&
 	test_cmp expect output
 '
 
@@ -376,7 +394,7 @@ nextsection.nonewline wow2 for me
 EOF
 
 test_expect_success '--get-regexp' '
-	git config --get-regexp in >output &&
+	git config ${mode_prefix}get-regexp in >output &&
 	test_cmp expect output
 '
 
@@ -386,7 +404,7 @@ nextsection.nonewline
 EOF
 
 test_expect_success '--name-only --get-regexp' '
-	git config --name-only --get-regexp in >output &&
+	git config ${mode_prefix}get-regexp --name-only in >output &&
 	test_cmp expect output
 '
 
@@ -396,8 +414,8 @@ wow4 for you
 EOF
 
 test_expect_success '--add' '
-	git config --add nextsection.nonewline "wow4 for you" &&
-	git config --get-all nextsection.nonewline > output &&
+	git config ${mode_prefix}add nextsection.nonewline "wow4 for you" &&
+	git config ${mode_prefix}get-all nextsection.nonewline > output &&
 	test_cmp expect output
 '
 
@@ -409,45 +427,45 @@ cat > .git/config << EOF
 EOF
 
 test_expect_success 'get variable with no value' '
-	git config --get novalue.variable ^$
+	git config ${mode_prefix}get novalue.variable ^$
 '
 
 test_expect_success 'get variable with empty value' '
-	git config --get emptyvalue.variable ^$
+	git config ${mode_prefix}get emptyvalue.variable ^$
 '
 
 echo novalue.variable > expect
 
 test_expect_success 'get-regexp variable with no value' '
-	git config --get-regexp novalue > output &&
+	git config ${mode_prefix}get-regexp novalue > output &&
 	test_cmp expect output
 '
 
 echo 'novalue.variable true' > expect
 
 test_expect_success 'get-regexp --bool variable with no value' '
-	git config --bool --get-regexp novalue > output &&
+	git config ${mode_prefix}get-regexp --bool novalue > output &&
 	test_cmp expect output
 '
 
 echo 'emptyvalue.variable ' > expect
 
 test_expect_success 'get-regexp variable with empty value' '
-	git config --get-regexp emptyvalue > output &&
+	git config ${mode_prefix}get-regexp emptyvalue > output &&
 	test_cmp expect output
 '
 
 echo true > expect
 
 test_expect_success 'get bool variable with no value' '
-	git config --bool novalue.variable > output &&
+	git config ${mode_get} --bool novalue.variable > output &&
 	test_cmp expect output
 '
 
 echo false > expect
 
 test_expect_success 'get bool variable with empty value' '
-	git config --bool emptyvalue.variable > output &&
+	git config ${mode_get} --bool emptyvalue.variable > output &&
 	test_cmp expect output
 '
 
@@ -469,7 +487,7 @@ cat > expect << EOF
 EOF
 
 test_expect_success 'new section is partial match of another' '
-	git config a.x y &&
+	git config ${mode_set} a.x y &&
 	test_cmp expect .git/config
 '
 
@@ -484,14 +502,14 @@ cat > expect << EOF
 EOF
 
 test_expect_success 'new variable inserts into proper section' '
-	git config b.x y &&
-	git config a.b c &&
+	git config ${mode_set} b.x y &&
+	git config ${mode_set} a.b c &&
 	test_cmp expect .git/config
 '
 
 test_expect_success 'alternative --file (non-existing file should fail)' '
-	test_must_fail git config --file non-existing-config -l &&
-	test_must_fail git config --file non-existing-config test.xyzzy
+	test_must_fail git config ${mode_prefix}list --file non-existing-config &&
+	test_must_fail git config ${mode_get} --file non-existing-config test.xyzzy
 '
 
 cat > other-config << EOF
@@ -504,29 +522,30 @@ ein.bahn=strasse
 EOF
 
 test_expect_success 'alternative GIT_CONFIG' '
-	GIT_CONFIG=other-config git config --list >output &&
+	GIT_CONFIG=other-config git config ${mode_prefix}list >output &&
 	test_cmp expect output
 '
 
 test_expect_success 'alternative GIT_CONFIG (--file)' '
-	git config --file other-config --list >output &&
+	git config ${mode_prefix}list --file other-config >output &&
 	test_cmp expect output
 '
 
 test_expect_success 'alternative GIT_CONFIG (--file=-)' '
-	git config --file - --list <other-config >output &&
+	git config ${mode_prefix}list --file - <other-config >output &&
 	test_cmp expect output
 '
 
 test_expect_success 'setting a value in stdin is an error' '
-	test_must_fail git config --file - some.value foo
+	test_must_fail git config ${mode_set} --file - some.value foo
 '
 
 test_expect_success 'editing stdin is an error' '
-	test_must_fail git config --file - --edit
+	test_must_fail git config ${mode_prefix}edit --file -
 '
 
 test_expect_success 'refer config from subdirectory' '
+	test_when_finished "rm -r x" &&
 	mkdir x &&
 	test_cmp_config -C x strasse --file=../other-config --get ein.bahn
 '
@@ -539,7 +558,7 @@ cat > expect << EOF
 EOF
 
 test_expect_success '--set in alternative file' '
-	git config --file=other-config anwohner.park ausweis &&
+	git config ${mode_set} --file=other-config anwohner.park ausweis &&
 	test_cmp expect other-config
 '
 
@@ -555,7 +574,7 @@ weird
 EOF
 
 test_expect_success 'rename section' '
-	git config --rename-section branch.eins branch.zwei
+	git config ${mode_prefix}rename-section branch.eins branch.zwei
 '
 
 cat > expect << EOF
@@ -574,7 +593,7 @@ test_expect_success 'rename succeeded' '
 '
 
 test_expect_success 'rename non-existing section' '
-	test_must_fail git config --rename-section \
+	test_must_fail git config ${mode_prefix}rename-section \
 		branch."world domination" branch.drei
 '
 
@@ -583,7 +602,7 @@ test_expect_success 'rename succeeded' '
 '
 
 test_expect_success 'rename another section' '
-	git config --rename-section branch."1 234 blabl/a" branch.drei
+	git config ${mode_prefix}rename-section branch."1 234 blabl/a" branch.drei
 '
 
 cat > expect << EOF
@@ -606,7 +625,7 @@ cat >> .git/config << EOF
 EOF
 
 test_expect_success 'rename a section with a var on the same line' '
-	git config --rename-section branch.vier branch.zwei
+	git config ${mode_prefix}rename-section branch.vier branch.zwei
 '
 
 cat > expect << EOF
@@ -627,11 +646,11 @@ test_expect_success 'rename succeeded' '
 '
 
 test_expect_success 'renaming empty section name is rejected' '
-	test_must_fail git config --rename-section branch.zwei ""
+	test_must_fail git config ${mode_prefix}rename-section branch.zwei ""
 '
 
 test_expect_success 'renaming to bogus section is rejected' '
-	test_must_fail git config --rename-section branch.zwei "bogus name"
+	test_must_fail git config ${mode_prefix}rename-section branch.zwei "bogus name"
 '
 
 test_expect_success 'renaming a section with a long line' '
@@ -640,7 +659,7 @@ test_expect_success 'renaming a section with a long line' '
 		printf "  c = d %1024s [a] e = f\\n" " " &&
 		printf "[a] g = h\\n"
 	} >y &&
-	git config -f y --rename-section a xyz &&
+	git config ${mode_prefix}rename-section -f y a xyz &&
 	test_must_fail git config -f y b.e
 '
 
@@ -650,7 +669,7 @@ test_expect_success 'renaming an embedded section with a long line' '
 		printf "  c = d %1024s [a] [foo] e = f\\n" " " &&
 		printf "[a] g = h\\n"
 	} >y &&
-	git config -f y --rename-section a xyz &&
+	git config ${mode_prefix}rename-section -f y a xyz &&
 	test_must_fail git config -f y foo.e
 '
 
@@ -660,7 +679,7 @@ test_expect_success 'renaming a section with an overly-long line' '
 		printf "  c = d %525000s e" " " &&
 		printf "[a] g = h\\n"
 	} >y &&
-	test_must_fail git config -f y --rename-section a xyz 2>err &&
+	test_must_fail git config ${mode_prefix}rename-section -f y a xyz 2>err &&
 	grep "refusing to work with overly long line in .y. on line 2" err
 '
 
@@ -669,7 +688,7 @@ cat >> .git/config << EOF
 EOF
 
 test_expect_success 'remove section' '
-	git config --remove-section branch.zwei
+	git config ${mode_prefix}remove-section branch.zwei
 '
 
 cat > expect << EOF
@@ -693,20 +712,20 @@ EOF
 
 test_expect_success 'section ending' '
 	rm -f .git/config &&
-	git config gitcvs.enabled true &&
-	git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
-	git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
+	git config ${mode_set} gitcvs.enabled true &&
+	git config ${mode_set} gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
+	git config ${mode_set} gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 	test_cmp expect .git/config
 
 '
 
 test_expect_success numbers '
-	git config kilo.gram 1k &&
-	git config mega.ton 1m &&
+	git config ${mode_set} kilo.gram 1k &&
+	git config ${mode_set} mega.ton 1m &&
 	echo 1024 >expect &&
 	echo 1048576 >>expect &&
-	git config --int --get kilo.gram >actual &&
-	git config --int --get mega.ton >>actual &&
+	git config ${mode_prefix}get --int kilo.gram >actual &&
+	git config ${mode_prefix}get --int mega.ton >>actual &&
 	test_cmp expect actual
 '
 
@@ -719,25 +738,25 @@ test_expect_success '--int is at least 64 bits' '
 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_must_fail git config ${mode_prefix}get --int aninvalid.unit 2>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_must_fail git config ${mode_prefix}get --bool commit.gpgsign 2>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_must_fail git config ${mode_get} -f invalid --path bool.var 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 &&
+	echo "[broken" | test_must_fail git config ${mode_prefix}list --file - >output 2>&1 &&
 	test_grep "bad config line 1 in standard input" output
 '
 
@@ -765,19 +784,19 @@ test_expect_success bool '
 	rm -f result &&
 	for i in 1 2 3 4
 	do
-	    git config --bool --get bool.true$i >>result &&
-	    git config --bool --get bool.false$i >>result || return 1
+	    git config ${mode_prefix}get --bool bool.true$i >>result &&
+	    git config ${mode_prefix}get --bool bool.false$i >>result || return 1
 	done &&
 	test_cmp expect result'
 
 test_expect_success 'invalid bool (--get)' '
 
 	git config bool.nobool foobar &&
-	test_must_fail git config --bool --get bool.nobool'
+	test_must_fail git config ${mode_prefix}get --bool bool.nobool'
 
 test_expect_success 'invalid bool (set)' '
 
-	test_must_fail git config --bool bool.nobool foobar'
+	test_must_fail git config ${mode_set} --bool bool.nobool foobar'
 
 cat > expect <<\EOF
 [bool]
@@ -794,14 +813,14 @@ EOF
 test_expect_success 'set --bool' '
 
 	rm -f .git/config &&
-	git config --bool bool.true1 01 &&
-	git config --bool bool.true2 -1 &&
-	git config --bool bool.true3 YeS &&
-	git config --bool bool.true4 true &&
-	git config --bool bool.false1 000 &&
-	git config --bool bool.false2 "" &&
-	git config --bool bool.false3 nO &&
-	git config --bool bool.false4 FALSE &&
+	git config ${mode_set} --bool bool.true1 01 &&
+	git config ${mode_set} --bool bool.true2 -1 &&
+	git config ${mode_set} --bool bool.true3 YeS &&
+	git config ${mode_set} --bool bool.true4 true &&
+	git config ${mode_set} --bool bool.false1 000 &&
+	git config ${mode_set} --bool bool.false2 "" &&
+	git config ${mode_set} --bool bool.false3 nO &&
+	git config ${mode_set} --bool bool.false4 FALSE &&
 	test_cmp expect .git/config'
 
 cat > expect <<\EOF
@@ -814,9 +833,9 @@ EOF
 test_expect_success 'set --int' '
 
 	rm -f .git/config &&
-	git config --int int.val1 01 &&
-	git config --int int.val2 -1 &&
-	git config --int int.val3 5m &&
+	git config ${mode_set} --int int.val1 01 &&
+	git config ${mode_set} --int int.val2 -1 &&
+	git config ${mode_set} --int int.val3 5m &&
 	test_cmp expect .git/config
 '
 
@@ -840,12 +859,12 @@ test_expect_success 'get --bool-or-int' '
 	-1
 	EOF
 	{
-		git config --bool-or-int bool.true1 &&
-		git config --bool-or-int bool.true2 &&
-		git config --bool-or-int bool.false &&
-		git config --bool-or-int int.int1 &&
-		git config --bool-or-int int.int2 &&
-		git config --bool-or-int int.int3
+		git config ${mode_get} --bool-or-int bool.true1 &&
+		git config ${mode_get} --bool-or-int bool.true2 &&
+		git config ${mode_get} --bool-or-int bool.false &&
+		git config ${mode_get} --bool-or-int int.int1 &&
+		git config ${mode_get} --bool-or-int int.int2 &&
+		git config ${mode_get} --bool-or-int int.int3
 	} >actual &&
 	test_cmp expect actual
 '
@@ -864,13 +883,13 @@ EOF
 
 test_expect_success 'set --bool-or-int' '
 	rm -f .git/config &&
-	git config --bool-or-int bool.true1 true &&
-	git config --bool-or-int bool.false1 false &&
-	git config --bool-or-int bool.true2 yes &&
-	git config --bool-or-int bool.false2 no &&
-	git config --bool-or-int int.int1 0 &&
-	git config --bool-or-int int.int2 1 &&
-	git config --bool-or-int int.int3 -1 &&
+	git config ${mode_set} --bool-or-int bool.true1 true &&
+	git config ${mode_set} --bool-or-int bool.false1 false &&
+	git config ${mode_set} --bool-or-int bool.true2 yes &&
+	git config ${mode_set} --bool-or-int bool.false2 no &&
+	git config ${mode_set} --bool-or-int int.int1 0 &&
+	git config ${mode_set} --bool-or-int int.int2 1 &&
+	git config ${mode_set} --bool-or-int int.int3 -1 &&
 	test_cmp expect .git/config
 '
 
@@ -883,9 +902,9 @@ EOF
 
 test_expect_success !MINGW 'set --path' '
 	rm -f .git/config &&
-	git config --path path.home "~/" &&
-	git config --path path.normal "/dev/null" &&
-	git config --path path.trailingtilde "foo~" &&
+	git config ${mode_set} --path path.home "~/" &&
+	git config ${mode_set} --path path.normal "/dev/null" &&
+	git config ${mode_set} --path path.trailingtilde "foo~" &&
 	test_cmp expect .git/config'
 
 if test_have_prereq !MINGW && test "${HOME+set}"
@@ -900,9 +919,9 @@ foo~
 EOF
 
 test_expect_success HOMEVAR 'get --path' '
-	git config --get --path path.home > result &&
-	git config --get --path path.normal >> result &&
-	git config --get --path path.trailingtilde >> result &&
+	git config ${mode_prefix}get --path path.home > result &&
+	git config ${mode_prefix}get --path path.normal >> result &&
+	git config ${mode_prefix}get --path path.trailingtilde >> result &&
 	test_cmp expect result
 '
 
@@ -914,10 +933,10 @@ EOF
 test_expect_success !MINGW 'get --path copes with unset $HOME' '
 	(
 		sane_unset HOME &&
-		test_must_fail git config --get --path path.home \
+		test_must_fail git config ${mode_prefix}get --path path.home \
 			>result 2>msg &&
-		git config --get --path path.normal >>result &&
-		git config --get --path path.trailingtilde >>result
+		git config ${mode_prefix}get --path path.normal >>result &&
+		git config ${mode_prefix}get --path path.trailingtilde >>result
 	) &&
 	test_grep "[Ff]ailed to expand.*~/" msg &&
 	test_cmp expect result
@@ -925,7 +944,7 @@ test_expect_success !MINGW 'get --path copes with unset $HOME' '
 
 test_expect_success 'get --path barfs on boolean variable' '
 	echo "[path]bool" >.git/config &&
-	test_must_fail git config --get --path path.bool
+	test_must_fail git config ${mode_prefix}get --path path.bool
 '
 
 test_expect_success 'get --expiry-date' '
@@ -949,20 +968,20 @@ test_expect_success 'get --expiry-date' '
 	EOF
 	: "work around heredoc parsing bug fixed in dash 0.5.7 (in ec2c84d)" &&
 	{
-		echo "$rel_out $(git config --expiry-date date.valid1)" &&
-		git config --expiry-date date.valid2 &&
-		git config --expiry-date date.valid3 &&
-		git config --expiry-date date.valid4 &&
-		git config --expiry-date date.valid5
+		echo "$rel_out $(git config ${mode_get} --expiry-date date.valid1)" &&
+		git config ${mode_get} --expiry-date date.valid2 &&
+		git config ${mode_get} --expiry-date date.valid3 &&
+		git config ${mode_get} --expiry-date date.valid4 &&
+		git config ${mode_get} --expiry-date date.valid5
 	} >actual &&
 	test_cmp expect actual &&
-	test_must_fail git config --expiry-date date.invalid1
+	test_must_fail git config ${mode_get} --expiry-date date.invalid1
 '
 
 test_expect_success 'get --type=color' '
 	rm .git/config &&
 	git config foo.color "red" &&
-	git config --get --type=color foo.color >actual.raw &&
+	git config ${mode_prefix}get --type=color foo.color >actual.raw &&
 	test_decode_color <actual.raw >actual &&
 	echo "<RED>" >expect &&
 	test_cmp expect actual
@@ -975,17 +994,17 @@ EOF
 
 test_expect_success 'set --type=color' '
 	rm .git/config &&
-	git config --type=color foo.color "red" &&
+	git config ${mode_set} --type=color foo.color "red" &&
 	test_cmp expect .git/config
 '
 
 test_expect_success 'get --type=color barfs on non-color' '
 	echo "[foo]bar=not-a-color" >.git/config &&
-	test_must_fail git config --get --type=color foo.bar
+	test_must_fail git config ${mode_prefix}get --type=color foo.bar
 '
 
 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_must_fail git config ${mode_set} --type=color foo.color "not-a-color" 2>error &&
 	test_grep "cannot parse color" error
 '
 
@@ -998,18 +1017,18 @@ cat > expect << EOF
 EOF
 test_expect_success 'quoting' '
 	rm -f .git/config &&
-	git config quote.leading " test" &&
-	git config quote.ending "test " &&
-	git config quote.semicolon "test;test" &&
-	git config quote.hash "test#test" &&
+	git config ${mode_set} quote.leading " test" &&
+	git config ${mode_set} quote.ending "test " &&
+	git config ${mode_set} quote.semicolon "test;test" &&
+	git config ${mode_set} quote.hash "test#test" &&
 	test_cmp expect .git/config
 '
 
 test_expect_success 'key with newline' '
-	test_must_fail git config "key.with
+	test_must_fail git config ${mode_set} "key.with
 newline" 123'
 
-test_expect_success 'value with newline' 'git config key.sub value.with\\\
+test_expect_success 'value with newline' 'git config ${mode_set} key.sub value.with\\\
 newline'
 
 cat > .git/config <<\EOF
@@ -1029,7 +1048,7 @@ section.quotecont=cont;inued
 EOF
 
 test_expect_success 'value continued on next line' '
-	git config --list > result &&
+	git config ${mode_prefix}list > result &&
 	test_cmp expect result
 '
 
@@ -1053,14 +1072,14 @@ Qsection.sub=section.val4
 Qsection.sub=section.val5Q
 EOF
 test_expect_success '--null --list' '
-	git config --null --list >result.raw &&
+	git config ${mode_prefix}list --null >result.raw &&
 	nul_to_q <result.raw >result &&
 	echo >>result &&
 	test_cmp expect result
 '
 
 test_expect_success '--null --get-regexp' '
-	git config --null --get-regexp "val[0-9]" >result.raw &&
+	git config ${mode_prefix}get-regexp --null "val[0-9]" >result.raw &&
 	nul_to_q <result.raw >result &&
 	echo >>result &&
 	test_cmp expect result
@@ -1072,12 +1091,13 @@ test_expect_success 'inner whitespace kept verbatim' '
 '
 
 test_expect_success SYMLINKS 'symlinked configuration' '
+	test_when_finished "rm myconfig" &&
 	ln -s notyet myconfig &&
-	git config --file=myconfig test.frotz nitfol &&
+	git config ${mode_set} --file=myconfig test.frotz nitfol &&
 	test -h myconfig &&
 	test -f notyet &&
-	test "z$(git config --file=notyet test.frotz)" = znitfol &&
-	git config --file=myconfig test.xyzzy rezrov &&
+	test "z$(git config ${mode_get} --file=notyet test.frotz)" = znitfol &&
+	git config ${mode_set} --file=myconfig test.xyzzy rezrov &&
 	test -h myconfig &&
 	test -f notyet &&
 	cat >expect <<-\EOF &&
@@ -1085,17 +1105,18 @@ test_expect_success SYMLINKS 'symlinked configuration' '
 	rezrov
 	EOF
 	{
-		git config --file=notyet test.frotz &&
-		git config --file=notyet test.xyzzy
+		git config ${mode_get} --file=notyet test.frotz &&
+		git config ${mode_get} --file=notyet test.xyzzy
 	} >actual &&
 	test_cmp expect actual
 '
 
 test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
+	test_when_finished "rm linktonada linktolinktonada" &&
 	ln -s doesnotexist linktonada &&
 	ln -s linktonada linktolinktonada &&
-	test_must_fail git config --file=linktonada --list &&
-	test_must_fail git config --file=linktolinktonada --list
+	test_must_fail git config ${mode_prefix}list --file=linktonada &&
+	test_must_fail git config ${mode_prefix}list --file=linktolinktonada
 '
 
 test_expect_success 'check split_cmdline return' '
@@ -1103,12 +1124,12 @@ test_expect_success 'check split_cmdline return' '
 	git init repo &&
 	(
 		cd repo &&
-		git config alias.split-cmdline-fix "echo \"" &&
+		git config ${mode_set} alias.split-cmdline-fix "echo \"" &&
 		test_must_fail git split-cmdline-fix &&
 		echo foo >foo &&
 		git add foo &&
 		git commit -m "initial commit" &&
-		git config branch.main.mergeoptions "echo \"" &&
+		git config ${mode_set} branch.main.mergeoptions "echo \"" &&
 		test_must_fail git merge main
 	)
 '
@@ -1122,10 +1143,10 @@ test_expect_success 'git -c "key=value" support' '
 	{
 		git -c section.name=value config section.name &&
 		git -c foo.CamelCase=value config foo.camelcase &&
-		git -c foo.flag config --bool foo.flag
+		git -c foo.flag config ${mode_get} --bool foo.flag
 	} >actual &&
 	test_cmp expect actual &&
-	test_must_fail git -c name=value config section.name
+	test_must_fail git -c name=value config ${mode_get} section.name
 '
 
 # We just need a type-specifier here that cares about the
@@ -1135,27 +1156,27 @@ test_expect_success 'git -c "key=value" support' '
 # its semantics.
 test_expect_success 'git -c can represent empty string' '
 	echo >expect &&
-	git -c foo.empty= config --path foo.empty >actual &&
+	git -c foo.empty= config ${mode_get} --path foo.empty >actual &&
 	test_cmp expect actual
 '
 
 test_expect_success 'key sanity-checking' '
-	test_must_fail git config foo=bar &&
-	test_must_fail git config foo=.bar &&
-	test_must_fail git config foo.ba=r &&
-	test_must_fail git config foo.1bar &&
-	test_must_fail git config foo."ba
+	test_must_fail git config ${mode_get} foo=bar &&
+	test_must_fail git config ${mode_get} foo=.bar &&
+	test_must_fail git config ${mode_get} foo.ba=r &&
+	test_must_fail git config ${mode_get} foo.1bar &&
+	test_must_fail git config ${mode_get} foo."ba
 				z".bar &&
-	test_must_fail git config . false &&
-	test_must_fail git config .foo false &&
-	test_must_fail git config foo. false &&
-	test_must_fail git config .foo. false &&
-	git config foo.bar true &&
-	git config foo."ba =z".bar false
+	test_must_fail git config ${mode_set} . false &&
+	test_must_fail git config ${mode_set} .foo false &&
+	test_must_fail git config ${mode_set} foo. false &&
+	test_must_fail git config ${mode_set} .foo. false &&
+	git config ${mode_set} foo.bar true &&
+	git config ${mode_set} foo."ba =z".bar false
 '
 
 test_expect_success 'git -c works with aliases of builtins' '
-	git config alias.checkconfig "-c foo.check=bar config foo.check" &&
+	git config ${mode_set} alias.checkconfig "-c foo.check=bar config foo.check" &&
 	echo bar >expect &&
 	git checkconfig >actual &&
 	test_cmp expect actual
@@ -1167,7 +1188,7 @@ test_expect_success 'aliases can be CamelCased' '
 	(
 		cd repo &&
 		test_commit A &&
-		git config alias.CamelCased "rev-parse HEAD" &&
+		git config ${mode_set} alias.CamelCased "rev-parse HEAD" &&
 		git CamelCased >out &&
 		git rev-parse HEAD >expect &&
 		test_cmp expect out
@@ -1176,7 +1197,7 @@ test_expect_success 'aliases can be CamelCased' '
 
 test_expect_success 'git -c does not split values on equals' '
 	echo "value with = in it" >expect &&
-	git -c section.foo="value with = in it" config section.foo >actual &&
+	git -c section.foo="value with = in it" config ${mode_get} section.foo >actual &&
 	test_cmp expect actual
 '
 
@@ -1193,7 +1214,7 @@ test_expect_success 'git -c complains about empty key and value' '
 '
 
 test_expect_success 'multiple git -c appends config' '
-	test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
+	test_config alias.x "!git -c x.two=2 config ${mode_prefix}get-regexp ^x\.*" &&
 	cat >expect <<-\EOF &&
 	x.one 1
 	x.two 2
@@ -1210,14 +1231,14 @@ test_expect_success 'last one wins: two level vars' '
 
 	echo VAL >expect &&
 
-	git -c sec.var=val -c sec.VAR=VAL config --get sec.var >actual &&
+	git -c sec.var=val -c sec.VAR=VAL config ${mode_prefix}get sec.var >actual &&
 	test_cmp expect actual &&
-	git -c SEC.var=val -c sec.var=VAL config --get sec.var >actual &&
+	git -c SEC.var=val -c sec.var=VAL config ${mode_prefix}get sec.var >actual &&
 	test_cmp expect actual &&
 
-	git -c sec.var=val -c sec.VAR=VAL config --get SEC.var >actual &&
+	git -c sec.var=val -c sec.VAR=VAL config ${mode_prefix}get SEC.var >actual &&
 	test_cmp expect actual &&
-	git -c SEC.var=val -c sec.var=VAL config --get sec.VAR >actual &&
+	git -c SEC.var=val -c sec.var=VAL config ${mode_prefix}get sec.VAR >actual &&
 	test_cmp expect actual
 '
 
@@ -1228,9 +1249,9 @@ test_expect_success 'last one wins: three level vars' '
 	# case sensitive.
 
 	echo val >expect &&
-	git -c v.a.r=val -c v.A.r=VAL config --get v.a.r >actual &&
+	git -c v.a.r=val -c v.A.r=VAL config ${mode_prefix}get v.a.r >actual &&
 	test_cmp expect actual &&
-	git -c v.a.r=val -c v.A.r=VAL config --get V.a.R >actual &&
+	git -c v.a.r=val -c v.A.r=VAL config ${mode_prefix}get V.a.R >actual &&
 	test_cmp expect actual &&
 
 	# v.a.r and V.a.R are the same variable, as the first
@@ -1238,13 +1259,13 @@ test_expect_success 'last one wins: three level vars' '
 	# case insensitive.
 
 	echo VAL >expect &&
-	git -c v.a.r=val -c v.a.R=VAL config --get v.a.r >actual &&
+	git -c v.a.r=val -c v.a.R=VAL config ${mode_prefix}get v.a.r >actual &&
 	test_cmp expect actual &&
-	git -c v.a.r=val -c V.a.r=VAL config --get v.a.r >actual &&
+	git -c v.a.r=val -c V.a.r=VAL config ${mode_prefix}get v.a.r >actual &&
 	test_cmp expect actual &&
-	git -c v.a.r=val -c v.a.R=VAL config --get V.a.R >actual &&
+	git -c v.a.r=val -c v.a.R=VAL config ${mode_prefix}get V.a.R >actual &&
 	test_cmp expect actual &&
-	git -c v.a.r=val -c V.a.r=VAL config --get V.a.R >actual &&
+	git -c v.a.r=val -c V.a.r=VAL config ${mode_prefix}get V.a.R >actual &&
 	test_cmp expect actual
 '
 
@@ -1259,7 +1280,7 @@ test_expect_success 'old-fashioned settings are case insensitive' '
 	[V.A]
 	Qr = value2
 	EOF
-	git config -f testConfig_actual "v.a.r" value2 &&
+	git config ${mode_set} -f testConfig_actual "v.a.r" value2 &&
 	test_cmp testConfig_expect testConfig_actual &&
 
 	cat >testConfig_actual <<-EOF &&
@@ -1270,7 +1291,7 @@ test_expect_success 'old-fashioned settings are case insensitive' '
 	[V.A]
 	QR = value2
 	EOF
-	git config -f testConfig_actual "V.a.R" value2 &&
+	git config ${mode_set} -f testConfig_actual "V.a.R" value2 &&
 	test_cmp testConfig_expect testConfig_actual &&
 
 	cat >testConfig_actual <<-EOF &&
@@ -1282,7 +1303,7 @@ test_expect_success 'old-fashioned settings are case insensitive' '
 	r = value1
 	Qr = value2
 	EOF
-	git config -f testConfig_actual "V.A.r" value2 &&
+	git config ${mode_set} -f testConfig_actual "V.A.r" value2 &&
 	test_cmp testConfig_expect testConfig_actual &&
 
 	cat >testConfig_actual <<-EOF &&
@@ -1294,7 +1315,7 @@ test_expect_success 'old-fashioned settings are case insensitive' '
 	r = value1
 	Qr = value2
 	EOF
-	git config -f testConfig_actual "v.A.r" value2 &&
+	git config ${mode_set} -f testConfig_actual "v.A.r" value2 &&
 	test_cmp testConfig_expect testConfig_actual
 '
 
@@ -1324,21 +1345,21 @@ test_expect_success 'setting different case sensitive subsections ' '
 	Qf = v2
 	EOF
 	# exact match
-	git config -f testConfig_actual a.b.c v2 &&
+	git config ${mode_set} -f testConfig_actual a.b.c v2 &&
 	# match section and subsection, key is cased differently.
-	git config -f testConfig_actual K.E.y v2 &&
+	git config ${mode_set} -f testConfig_actual K.E.y v2 &&
 	# section and key are matched case insensitive, but subsection needs
 	# to match; When writing out new values only the key is adjusted
-	git config -f testConfig_actual v.A.r v2 &&
+	git config ${mode_set} -f testConfig_actual v.A.r v2 &&
 	# subsection is not matched:
-	git config -f testConfig_actual d.E.f v2 &&
+	git config ${mode_set} -f testConfig_actual d.E.f v2 &&
 	test_cmp testConfig_expect testConfig_actual
 '
 
 for VAR in a .a a. a.0b a."b c". a."b c".0d
 do
 	test_expect_success "git -c $VAR=VAL rejects invalid '$VAR'" '
-		test_must_fail git -c "$VAR=VAL" config -l
+		test_must_fail git -c "$VAR=VAL" config ${mode_prefix}list
 	'
 done
 
@@ -1346,20 +1367,20 @@ for VAR in a.b a."b c".d
 do
 	test_expect_success "git -c $VAR=VAL works with valid '$VAR'" '
 		echo VAL >expect &&
-		git -c "$VAR=VAL" config --get "$VAR" >actual &&
+		git -c "$VAR=VAL" config ${mode_prefix}get "$VAR" >actual &&
 		test_cmp expect actual
 	'
 done
 
 test_expect_success 'git -c is not confused by empty environment' '
-	GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
+	GIT_CONFIG_PARAMETERS="" git -c x.one=1 config ${mode_prefix}list
 '
 
 test_expect_success 'GIT_CONFIG_PARAMETERS handles old-style entries' '
 	v="${SQ}key.one=foo${SQ}" &&
 	v="$v  ${SQ}key.two=bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever=value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_prefix}get-regexp "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1372,7 +1393,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS handles new-style entries' '
 	v="${SQ}key.one${SQ}=${SQ}foo${SQ}" &&
 	v="$v  ${SQ}key.two${SQ}=${SQ}bar${SQ}" &&
 	v="$v ${SQ}key.ambiguous=section.whatever${SQ}=${SQ}value${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_prefix}get-regexp "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.one foo
 	key.two bar
@@ -1386,7 +1407,7 @@ test_expect_success 'old and new-style entries can mix' '
 	v="$v ${SQ}key.newone${SQ}=${SQ}newfoo${SQ}" &&
 	v="$v ${SQ}key.oldtwo=oldbar${SQ}" &&
 	v="$v ${SQ}key.newtwo${SQ}=${SQ}newbar${SQ}" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_prefix}get-regexp "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.oldone oldfoo
 	key.newone newfoo
@@ -1399,7 +1420,7 @@ test_expect_success 'old and new-style entries can mix' '
 test_expect_success 'old and new bools with ambiguous subsection' '
 	v="${SQ}key.with=equals.oldbool${SQ}" &&
 	v="$v ${SQ}key.with=equals.newbool${SQ}=" &&
-	GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual &&
+	GIT_CONFIG_PARAMETERS=$v git config ${mode_prefix}get-regexp "key.*" >actual &&
 	cat >expect <<-EOF &&
 	key.with equals.oldbool
 	key.with=equals.newbool
@@ -1413,7 +1434,7 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ} ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_prefix}get-regexp "env.*" >actual &&
 	test_cmp expect actual &&
 
 	cat >expect <<-EOF &&
@@ -1421,12 +1442,12 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
 	env.two two
 	EOF
 	GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ$SQ$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*" >actual &&
+		git config ${mode_prefix}get-regexp "env.*" >actual &&
 	test_cmp expect actual &&
 
 	test_must_fail env \
 		GIT_CONFIG_PARAMETERS="${SQ}env.one=one${SQ}\\$SQ ${SQ}env.two=two${SQ}" \
-		git config --get-regexp "env.*"
+		git config ${mode_prefix}get-regexp "env.*"
 '
 
 test_expect_success 'git --config-env=key=envvar support' '
@@ -1439,12 +1460,12 @@ test_expect_success 'git --config-env=key=envvar support' '
 	false
 	EOF
 	{
-		ENVVAR=value git --config-env=core.name=ENVVAR config core.name &&
-		ENVVAR=value git --config-env core.name=ENVVAR config core.name &&
-		ENVVAR=value git --config-env=foo.CamelCase=ENVVAR config foo.camelcase &&
-		ENVVAR=value git --config-env foo.CamelCase=ENVVAR config foo.camelcase &&
-		ENVVAR= git --config-env=foo.flag=ENVVAR config --bool foo.flag &&
-		ENVVAR= git --config-env foo.flag=ENVVAR config --bool foo.flag
+		ENVVAR=value git --config-env=core.name=ENVVAR config ${mode_get} core.name &&
+		ENVVAR=value git --config-env core.name=ENVVAR config ${mode_get} core.name &&
+		ENVVAR=value git --config-env=foo.CamelCase=ENVVAR config ${mode_get} foo.camelcase &&
+		ENVVAR=value git --config-env foo.CamelCase=ENVVAR config ${mode_get} foo.camelcase &&
+		ENVVAR= git --config-env=foo.flag=ENVVAR config ${mode_get} --bool foo.flag &&
+		ENVVAR= git --config-env foo.flag=ENVVAR config ${mode_get} --bool foo.flag
 	} >actual &&
 	test_cmp expect actual
 '
@@ -1452,17 +1473,17 @@ test_expect_success 'git --config-env=key=envvar support' '
 test_expect_success 'git --config-env with missing value' '
 	test_must_fail env ENVVAR=value git --config-env 2>error &&
 	grep "no config key given for --config-env" error &&
-	test_must_fail env ENVVAR=value git --config-env config core.name 2>error &&
+	test_must_fail env ENVVAR=value git --config-env config ${mode_get} core.name 2>error &&
 	grep "invalid config format: config" error
 '
 
 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_must_fail git --config-env=foo.flag config ${mode_get} --bool foo.flag 2>error &&
 	test_grep "invalid config format: foo.flag" error &&
-	test_must_fail git --config-env=foo.flag= config --bool foo.flag 2>error &&
+	test_must_fail git --config-env=foo.flag= config ${mode_get} --bool foo.flag 2>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_must_fail git --config-env=foo.flag=NONEXISTENT config ${mode_get} --bool foo.flag 2>error &&
 	test_grep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error
 '
 
@@ -1474,7 +1495,7 @@ test_expect_success 'git -c and --config-env work together' '
 	ENVVAR=env-value git \
 		-c bar.cmd=cmd-value \
 		--config-env=bar.env=ENVVAR \
-		config --get-regexp "^bar.*" >actual &&
+		config ${mode_prefix}get-regexp "^bar.*" >actual &&
 	test_cmp expect actual
 '
 
@@ -1484,8 +1505,8 @@ test_expect_success 'git -c and --config-env override each other' '
 	cmd
 	EOF
 	{
-		ENVVAR=env git -c bar.bar=cmd --config-env=bar.bar=ENVVAR config bar.bar &&
-		ENVVAR=env git --config-env=bar.bar=ENVVAR -c bar.bar=cmd config bar.bar
+		ENVVAR=env git -c bar.bar=cmd --config-env=bar.bar=ENVVAR config ${config_get} bar.bar &&
+		ENVVAR=env git --config-env=bar.bar=ENVVAR -c bar.bar=cmd config ${config_get} bar.bar
 	} >actual &&
 	test_cmp expect actual
 '
@@ -1494,7 +1515,7 @@ test_expect_success '--config-env handles keys with equals' '
 	echo value=with=equals >expect &&
 	ENVVAR=value=with=equals git \
 		--config-env=section.subsection=with=equals.key=ENVVAR \
-		config section.subsection=with=equals.key >actual &&
+		config ${config_get} section.subsection=with=equals.key >actual &&
 	test_cmp expect actual
 '
 
@@ -1502,7 +1523,7 @@ test_expect_success 'git config handles environment config pairs' '
 	GIT_CONFIG_COUNT=2 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \
-		git config --get-regexp "pair.*" >actual &&
+		git config ${mode_prefix}get-regexp "pair.*" >actual &&
 	cat >expect <<-EOF &&
 	pair.one foo
 	pair.two bar
@@ -1520,7 +1541,7 @@ test_expect_success 'git config ignores pairs exceeding count' '
 	GIT_CONFIG_COUNT=1 \
 		GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
 		GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="value" \
-		git config --get-regexp "pair.*" >actual 2>error &&
+		git config ${mode_prefix}get-regexp "pair.*" >actual 2>error &&
 	cat >expect <<-EOF &&
 	pair.one value
 	EOF
@@ -1531,43 +1552,43 @@ test_expect_success 'git config ignores pairs exceeding count' '
 test_expect_success 'git config ignores pairs with zero count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT=0 GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${config_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
 test_expect_success 'git config ignores pairs with empty count' '
 	test_must_fail env \
 		GIT_CONFIG_COUNT= GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \
-		git config pair.one 2>error &&
+		git config ${config_get} pair.one 2>error &&
 	test_must_be_empty error
 '
 
 test_expect_success 'git config fails with invalid count' '
-	test_must_fail env GIT_CONFIG_COUNT=10a git config --list 2>error &&
+	test_must_fail env GIT_CONFIG_COUNT=10a git config ${mode_prefix}list 2>error &&
 	test_grep "bogus count" error &&
-	test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config --list 2>error &&
+	test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config ${mode_prefix}list 2>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 &&
+		git config ${mode_prefix}list 2>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 &&
+		git config ${mode_prefix}list 2>error &&
 	test_grep "missing config value" error
 '
 
 test_expect_success 'git config fails with invalid config pair key' '
 	test_must_fail env GIT_CONFIG_COUNT=1 \
 		GIT_CONFIG_KEY_0= GIT_CONFIG_VALUE_0=value \
-		git config --list &&
+		git config ${mode_prefix}list &&
 	test_must_fail env GIT_CONFIG_COUNT=1 \
 		GIT_CONFIG_KEY_0=missing-section GIT_CONFIG_VALUE_0=value \
-		git config --list
+		git config ${mode_prefix}list
 '
 
 test_expect_success 'environment overrides config file' '
@@ -1577,7 +1598,7 @@ test_expect_success 'environment overrides config file' '
 	one = value
 	EOF
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=override \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1587,7 +1608,7 @@ test_expect_success 'environment overrides config file' '
 test_expect_success 'GIT_CONFIG_PARAMETERS overrides environment config' '
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \
 		GIT_CONFIG_PARAMETERS="${SQ}pair.one=override${SQ}" \
-		git config pair.one >actual &&
+		git config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1596,7 +1617,7 @@ test_expect_success 'GIT_CONFIG_PARAMETERS overrides environment config' '
 
 test_expect_success 'command line overrides environment config' '
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \
-		git -c pair.one=override config pair.one >actual &&
+		git -c pair.one=override config ${mode_get} pair.one >actual &&
 	cat >expect <<-EOF &&
 	override
 	EOF
@@ -1606,8 +1627,8 @@ test_expect_success 'command line overrides environment config' '
 test_expect_success 'git config --edit works' '
 	git config -f tmp test.value no &&
 	echo test.value=yes >expect &&
-	GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
-	git config -f tmp --list >actual &&
+	GIT_EDITOR="echo [test]value=yes >" git config ${mode_prefix}edit -f tmp &&
+	git config ${mode_prefix}list -f tmp >actual &&
 	test_cmp expect actual
 '
 
@@ -1615,8 +1636,8 @@ test_expect_success 'git config --edit respects core.editor' '
 	git config -f tmp test.value no &&
 	echo test.value=yes >expect &&
 	test_config core.editor "echo [test]value=yes >" &&
-	git config -f tmp --edit &&
-	git config -f tmp --list >actual &&
+	git config ${mode_prefix}edit -f tmp &&
+	git config ${mode_prefix}list -f tmp >actual &&
 	test_cmp expect actual
 '
 
@@ -1627,7 +1648,7 @@ test_expect_success 'barf on syntax error' '
 	[section]
 	key garbage
 	EOF
-	test_must_fail git config --get section.key 2>error &&
+	test_must_fail git config ${mode_prefix}get section.key 2>error &&
 	test_grep " line 3 " error
 '
 
@@ -1637,7 +1658,7 @@ test_expect_success 'barf on incomplete section header' '
 	[section
 	key = value
 	EOF
-	test_must_fail git config --get section.key 2>error &&
+	test_must_fail git config ${mode_prefix}get section.key 2>error &&
 	test_grep " line 2 " error
 '
 
@@ -1647,7 +1668,7 @@ test_expect_success 'barf on incomplete string' '
 	[section]
 	key = "value string
 	EOF
-	test_must_fail git config --get section.key 2>error &&
+	test_must_fail git config ${mode_prefix}get section.key 2>error &&
 	test_grep " line 3 " error
 '
 
@@ -1660,22 +1681,22 @@ test_expect_success 'urlmatch' '
 		cookieFile = /tmp/cookie.txt
 	EOF
 
-	test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
+	test_expect_code 1 git config ${mode_prefix}get-urlmatch --bool doesnt.exist https://good.example.com >actual &&
 	test_must_be_empty actual &&
 
 	echo true >expect &&
-	git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --bool http.SSLverify https://good.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo false >expect &&
-	git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --bool http.sslverify https://weak.example.com >actual &&
 	test_cmp expect actual &&
 
 	{
 		echo http.cookiefile /tmp/cookie.txt &&
 		echo http.sslverify false
 	} >expect &&
-	git config --get-urlmatch HTTP https://weak.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://weak.example.com >actual &&
 	test_cmp expect actual
 '
 
@@ -1690,7 +1711,7 @@ test_expect_success 'urlmatch with --show-scope' '
 	local	http.cookiefile /tmp/cookie.txt
 	local	http.sslverify false
 	EOF
-	git config --get-urlmatch --show-scope HTTP https://weak.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --show-scope HTTP https://weak.example.com >actual &&
 	test_cmp expect actual
 '
 
@@ -1721,47 +1742,47 @@ test_expect_success 'urlmatch favors more specific URLs' '
 	EOF
 
 	echo http.cookiefile /tmp/root.txt >expect &&
-	git config --get-urlmatch HTTP https://example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://example.com >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
-	git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://example.com/subdirectory >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
-	git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/user.txt >expect &&
-	git config --get-urlmatch HTTP https://user@example.com/ >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://user@example.com/ >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/subdirectory.txt >expect &&
-	git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/preceding.txt >expect &&
-	git config --get-urlmatch HTTP https://preceding.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://preceding.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/wildcard.txt >expect &&
-	git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://wildcard.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
-	git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/trailing.txt >expect &&
-	git config --get-urlmatch HTTP https://trailing.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://trailing.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/sub.txt >expect &&
-	git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://user@sub.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo http.cookiefile /tmp/multiwildcard.txt >expect &&
-	git config --get-urlmatch HTTP https://wildcard.example.org >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://wildcard.example.org >actual &&
 	test_cmp expect actual
 '
 
@@ -1774,34 +1795,34 @@ test_expect_success 'urlmatch with wildcard' '
 		cookieFile = /tmp/cookie.txt
 	EOF
 
-	test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
+	test_expect_code 1 git config ${mode_prefix}get-urlmatch --bool doesnt.exist https://good.example.com >actual &&
 	test_must_be_empty actual &&
 
 	echo true >expect &&
-	git config --bool --get-urlmatch http.SSLverify https://example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --bool http.SSLverify https://example.com >actual &&
 	test_cmp expect actual &&
 
 	echo true >expect &&
-	git config --bool --get-urlmatch http.SSLverify https://good-example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --bool http.SSLverify https://good-example.com >actual &&
 	test_cmp expect actual &&
 
 	echo true >expect &&
-	git config --bool --get-urlmatch http.sslverify https://deep.nested.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --bool http.sslverify https://deep.nested.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo false >expect &&
-	git config --bool --get-urlmatch http.sslverify https://good.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch --bool http.sslverify https://good.example.com >actual &&
 	test_cmp expect actual &&
 
 	{
 		echo http.cookiefile /tmp/cookie.txt &&
 		echo http.sslverify false
 	} >expect &&
-	git config --get-urlmatch HTTP https://good.example.com >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://good.example.com >actual &&
 	test_cmp expect actual &&
 
 	echo http.sslverify >expect &&
-	git config --get-urlmatch HTTP https://more.example.com.au >actual &&
+	git config ${mode_prefix}get-urlmatch HTTP https://more.example.com.au >actual &&
 	test_cmp expect actual
 '
 
@@ -1828,7 +1849,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	# please be careful when you update the above variable
 	EOF
 
-	git config --unset section.key &&
+	git config ${mode_prefix}unset section.key &&
 	test_cmp expect .git/config &&
 
 	cat >.git/config <<-\EOF &&
@@ -1841,7 +1862,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[next-section]
 	EOF
 
-	git config --unset section.key &&
+	git config ${mode_prefix}unset section.key &&
 	test_cmp expect .git/config &&
 
 	q_to_tab >.git/config <<-\EOF &&
@@ -1851,7 +1872,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[two]
 	key = true
 	EOF
-	git config --unset two.key &&
+	git config ${mode_prefix}unset two.key &&
 	! grep two .git/config &&
 
 	q_to_tab >.git/config <<-\EOF &&
@@ -1861,7 +1882,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[one]
 	key = true
 	EOF
-	git config --unset-all one.key &&
+	git config ${mode_prefix}unset-all one.key &&
 	test_line_count = 0 .git/config &&
 
 	q_to_tab >.git/config <<-\EOF &&
@@ -1871,7 +1892,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[two]
 	Qkey = true
 	EOF
-	git config --unset two.key &&
+	git config ${mode_prefix}unset two.key &&
 	grep two .git/config &&
 
 	q_to_tab >.git/config <<-\EOF &&
@@ -1883,7 +1904,7 @@ test_expect_success '--unset last key removes section (except if commented)' '
 	[TWO "subsection"]
 	[one]
 	EOF
-	git config --unset two.subsection.key &&
+	git config ${mode_prefix}unset two.subsection.key &&
 	test "not [two subsection]" = "$(git config one.key)" &&
 	test_line_count = 3 .git/config
 '
@@ -1895,7 +1916,7 @@ test_expect_success '--unset-all removes section if empty & uncommented' '
 	key = value2
 	EOF
 
-	git config --unset-all section.key &&
+	git config ${mode_prefix}unset-all section.key &&
 	test_line_count = 0 .git/config
 '
 
@@ -1909,7 +1930,7 @@ test_expect_success 'adding a key into an empty section reuses header' '
 	Qkey = value
 	EOF
 
-	git config section.key value &&
+	git config ${mode_set} section.key value &&
 	test_cmp expect .git/config
 '
 
@@ -1918,7 +1939,7 @@ test_expect_success POSIXPERM,PERL 'preserves existing permissions' '
 	git config imap.pass Hunter2 &&
 	perl -e \
 	  "die q(badset) if ((stat(q(.git/config)))[2] & 07777) != 0600" &&
-	git config --rename-section imap pop &&
+	git config ${mode_prefix}rename-section imap pop &&
 	perl -e \
 	  "die q(badrename) if ((stat(q(.git/config)))[2] & 07777) != 0600"
 '
@@ -1967,7 +1988,7 @@ test_expect_success '--show-origin with --list' '
 	command line:	user.cmdline=true
 	EOF
 	GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=user.environ GIT_CONFIG_VALUE_0=true\
-		git -c user.cmdline=true config --list --show-origin >output &&
+		git -c user.cmdline=true config ${mode_prefix}list --show-origin >output &&
 	test_cmp expect output
 '
 
@@ -1984,7 +2005,7 @@ test_expect_success '--show-origin with --list --null' '
 	includeQcommand line:Quser.cmdline
 	trueQ
 	EOF
-	git -c user.cmdline=true config --null --list --show-origin >output.raw &&
+	git -c user.cmdline=true config ${mode_prefix}list --null --show-origin >output.raw &&
 	nul_to_q <output.raw >output &&
 	# The here-doc above adds a newline that the --null output would not
 	# include. Add it here to make the two comparable.
@@ -1998,7 +2019,7 @@ test_expect_success '--show-origin with single file' '
 	file:.git/config	user.override=local
 	file:.git/config	include.path=../include/relative.include
 	EOF
-	git config --local --list --show-origin >output &&
+	git config ${mode_prefix}list --local --show-origin >output &&
 	test_cmp expect output
 '
 
@@ -2007,7 +2028,7 @@ test_expect_success '--show-origin with --get-regexp' '
 	file:$HOME/.gitconfig	user.global true
 	file:.git/config	user.local true
 	EOF
-	git config --show-origin --get-regexp "user\.[g|l].*" >output &&
+	git config ${mode_prefix}get-regexp --show-origin "user\.[g|l].*" >output &&
 	test_cmp expect output
 '
 
@@ -2015,7 +2036,7 @@ test_expect_success '--show-origin getting a single key' '
 	cat >expect <<-\EOF &&
 	file:.git/config	local
 	EOF
-	git config --show-origin user.override >output &&
+	git config ${mode_get} --show-origin user.override >output &&
 	test_cmp expect output
 '
 
@@ -2036,7 +2057,7 @@ test_expect_success !MINGW '--show-origin escape special file name characters' '
 	cat >expect <<-\EOF &&
 	file:"file\" (dq) and spaces.conf"	user.custom=true
 	EOF
-	git config --file "$WEIRDLY_NAMED_FILE" --show-origin --list >output &&
+	git config ${mode_prefix}list --file "$WEIRDLY_NAMED_FILE" --show-origin >output &&
 	test_cmp expect output
 '
 
@@ -2044,7 +2065,7 @@ test_expect_success '--show-origin stdin' '
 	cat >expect <<-\EOF &&
 	standard input:	user.custom=true
 	EOF
-	git config --file - --show-origin --list <"$CUSTOM_CONFIG_FILE" >output &&
+	git config ${mode_prefix}list --file - --show-origin <"$CUSTOM_CONFIG_FILE" >output &&
 	test_cmp expect output
 '
 
@@ -2057,7 +2078,7 @@ test_expect_success '--show-origin stdin with file include' '
 	file:$INCLUDE_DIR/stdin.include	include
 	EOF
 	echo "[include]path=\"$INCLUDE_DIR\"/stdin.include" |
-	git config --show-origin --includes --file - user.stdin >output &&
+	git config ${mode_get} --show-origin --includes --file - user.stdin >output &&
 
 	test_cmp expect output
 '
@@ -2071,7 +2092,7 @@ test_expect_success '--show-origin blob' '
 		cat >expect <<-EOF &&
 		blob:$blob	user.custom=true
 		EOF
-		git config --blob=$blob --show-origin --list >output &&
+		git config ${mode_prefix}list --blob=$blob --show-origin >output &&
 		test_cmp expect output
 	)
 '
@@ -2087,13 +2108,13 @@ test_expect_success '--show-origin blob ref' '
 		cp "$CUSTOM_CONFIG_FILE" custom.conf &&
 		git add custom.conf &&
 		git commit -m "new config file" &&
-		git config --blob=main:custom.conf --show-origin --list >output &&
+		git config ${mode_prefix}list --blob=main:custom.conf --show-origin >output &&
 		test_cmp expect output
 	)
 '
 
 test_expect_success '--show-origin with --default' '
-	git config --show-origin --default foo some.key >actual &&
+	git config ${mode_get} --show-origin --default foo some.key >actual &&
 	echo "command line:	foo" >expect &&
 	test_cmp expect actual
 '
@@ -2113,13 +2134,14 @@ test_expect_success '--show-scope with --list' '
 	worktree	user.worktree=true
 	command	user.cmdline=true
 	EOF
+	test_when_finished "git worktree remove wt1" &&
 	git worktree add wt1 &&
 	# We need these to test for worktree scope, but outside of this
 	# test, this is just noise
 	test_config core.repositoryformatversion 1 &&
 	test_config extensions.worktreeConfig true &&
-	git config --worktree user.worktree true &&
-	git -c user.cmdline=true config --list --show-scope >output &&
+	git config ${mode_get} --worktree user.worktree true &&
+	git -c user.cmdline=true config ${mode_prefix}list --show-scope >output &&
 	test_cmp expect output
 '
 
@@ -2128,7 +2150,7 @@ test_expect_success !MINGW '--show-scope with --blob' '
 	cat >expect <<-EOF &&
 	command	user.custom=true
 	EOF
-	git config --blob=$blob --show-scope --list >output &&
+	git config ${mode_prefix}list --blob=$blob --show-scope >output &&
 	test_cmp expect output
 '
 
@@ -2138,7 +2160,7 @@ test_expect_success '--show-scope with --local' '
 	local	user.override=local
 	local	include.path=../include/relative.include
 	EOF
-	git config --local --list --show-scope >output &&
+	git config ${mode_prefix}list --local --show-scope >output &&
 	test_cmp expect output
 '
 
@@ -2146,7 +2168,7 @@ test_expect_success '--show-scope getting a single value' '
 	cat >expect <<-\EOF &&
 	local	true
 	EOF
-	git config --show-scope --get user.local >output &&
+	git config ${mode_prefix}get --show-scope user.local >output &&
 	test_cmp expect output
 '
 
@@ -2162,12 +2184,12 @@ test_expect_success '--show-scope with --show-origin' '
 	local	file:.git/../include/relative.include	user.relative=include
 	command	command line:	user.cmdline=true
 	EOF
-	git -c user.cmdline=true config --list --show-origin --show-scope >output &&
+	git -c user.cmdline=true config ${mode_prefix}list --show-origin --show-scope >output &&
 	test_cmp expect output
 '
 
 test_expect_success '--show-scope with --default' '
-	git config --show-scope --default foo some.key >actual &&
+	git config ${mode_get} --show-scope --default foo some.key >actual &&
 	echo "command	foo" >expect &&
 	test_cmp expect actual
 '
@@ -2203,7 +2225,7 @@ test_expect_success 'override global and system config' '
 	global	home.config=true
 	local	local.config=true
 	EOF
-	git config --show-scope --list >output &&
+	git config ${mode_prefix}list --show-scope >output &&
 	test_cmp expect output &&
 
 	cat >expect <<-EOF &&
@@ -2212,20 +2234,20 @@ test_expect_success 'override global and system config' '
 	local	local.config=true
 	EOF
 	GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=custom-system-config GIT_CONFIG_GLOBAL=custom-global-config \
-		git config --show-scope --list >output &&
+		git config ${mode_prefix}list --show-scope >output &&
 	test_cmp expect output &&
 
 	cat >expect <<-EOF &&
 	local	local.config=true
 	EOF
 	GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=/dev/null GIT_CONFIG_GLOBAL=/dev/null \
-		git config --show-scope --list >output &&
+		git config ${mode_prefix}list --show-scope >output &&
 	test_cmp expect output
 '
 
 test_expect_success 'override global and system config with missing file' '
-	test_must_fail env GIT_CONFIG_GLOBAL=does-not-exist GIT_CONFIG_SYSTEM=/dev/null git config --global --list &&
-	test_must_fail env GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=does-not-exist git config --system --list &&
+	test_must_fail env GIT_CONFIG_GLOBAL=does-not-exist GIT_CONFIG_SYSTEM=/dev/null git config ${mode_prefix}list --global &&
+	test_must_fail env GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=does-not-exist git config ${mode_prefix}list --system &&
 	GIT_CONFIG_GLOBAL=does-not-exist GIT_CONFIG_SYSTEM=does-not-exist git version
 '
 
@@ -2251,10 +2273,10 @@ test_expect_success 'write to overridden global and system config' '
 	key = value
 EOF
 
-	GIT_CONFIG_GLOBAL=write-to-global git config --global config.key value &&
+	GIT_CONFIG_GLOBAL=write-to-global git config ${mode_set} --global config.key value &&
 	test_cmp expect write-to-global &&
 
-	GIT_CONFIG_SYSTEM=write-to-system git config --system config.key value &&
+	GIT_CONFIG_SYSTEM=write-to-system git config ${mode_set} --system config.key value &&
 	test_cmp expect write-to-system
 '
 
@@ -2263,7 +2285,7 @@ do
 	test_expect_success "$opt requires a repo" '
 		# we expect 128 to ensure that we do not simply
 		# fail to find anything and return code "1"
-		test_expect_code 128 nongit git config $opt foo.bar
+		test_expect_code 128 nongit git config ${mode_get} $opt foo.bar
 	'
 done
 
@@ -2287,17 +2309,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_must_fail git config ${mode_get} --type=int --type=bool section.big 2>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_must_fail git config ${mode_get} --int --bool section.big 2>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_must_fail git config ${mode_get} --type=int --bool section.big 2>error &&
 	test_grep "only one type at a time" error
 '
 
@@ -2314,12 +2336,12 @@ 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_must_fail git config ${mode_get} --type=nonsense section.foo 2>error &&
 	test_grep "unrecognized --type argument" error
 '
 
 test_expect_success '--type=int requires at least one digit' '
-	test_must_fail git config --type int --default m some.key >out 2>error &&
+	test_must_fail git config ${mode_get} --type int --default m some.key >out 2>error &&
 	grep "bad numeric config value" error &&
 	test_must_be_empty out
 '
@@ -2341,18 +2363,18 @@ test_expect_success '--replace-all does not invent newlines' '
 	[abc]
 	Qkey = b
 	EOF
-	git config --replace-all abc.key b &&
+	git config ${mode_prefix}replace-all abc.key b &&
 	test_cmp expect .git/config
 '
 
 test_expect_success 'set all config with value-pattern' '
 	test_when_finished rm -f config initial &&
-	git config --file=initial abc.key one &&
+	git config ${mode_set} --file=initial abc.key one &&
 
 	# no match => add new entry
 	cp initial config &&
-	git config --file=config abc.key two a+ &&
-	git config --file=config --list >actual &&
+	git config ${mode_set_all} --file=config abc.key two a+ &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-\EOF &&
 	abc.key=one
 	abc.key=two
@@ -2360,12 +2382,12 @@ test_expect_success 'set all config with value-pattern' '
 	test_cmp expect actual &&
 
 	# multiple matches => failure
-	test_must_fail git config --file=config abc.key three o+ 2>err &&
+	test_must_fail git config ${mode_set_all} --file=config abc.key three o+ 2>err &&
 	test_grep "has multiple values" err &&
 
 	# multiple values, no match => add
-	git config --file=config abc.key three a+ &&
-	git config --file=config --list >actual &&
+	git config ${mode_set_all} --file=config abc.key three a+ &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-\EOF &&
 	abc.key=one
 	abc.key=two
@@ -2374,8 +2396,8 @@ test_expect_success 'set all config with value-pattern' '
 	test_cmp expect actual &&
 
 	# single match => replace
-	git config --file=config abc.key four h+ &&
-	git config --file=config --list >actual &&
+	git config ${mode_set_all} --file=config abc.key four h+ &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-\EOF &&
 	abc.key=one
 	abc.key=two
@@ -2386,11 +2408,11 @@ test_expect_success 'set all config with value-pattern' '
 
 test_expect_success '--replace-all and value-pattern' '
 	test_when_finished rm -f config &&
-	git config --file=config --add abc.key one &&
-	git config --file=config --add abc.key two &&
-	git config --file=config --add abc.key three &&
-	git config --file=config --replace-all abc.key four "o+" &&
-	git config --file=config --list >actual &&
+	git config ${mode_prefix}add --file=config abc.key one &&
+	git config ${mode_prefix}add --file=config abc.key two &&
+	git config ${mode_prefix}add --file=config abc.key three &&
+	git config ${mode_prefix}replace-all --file=config abc.key four "o+" &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-\EOF &&
 	abc.key=four
 	abc.key=three
@@ -2403,33 +2425,33 @@ test_expect_success 'refuse --fixed-value for incompatible actions' '
 	git config --file=config dev.null bogus &&
 
 	# These modes do not allow --fixed-value at all
-	test_must_fail git config --file=config --fixed-value --add dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --rename-section dev null &&
-	test_must_fail git config --file=config --fixed-value --remove-section dev &&
-	test_must_fail git config --file=config --fixed-value --list &&
-	test_must_fail git config --file=config --fixed-value --get-color dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-colorbool dev.null &&
+	test_must_fail git config ${mode_prefix}add --file=config --fixed-value dev.null bogus &&
+	test_must_fail git config ${mode_prefix}get-urlmatch --file=config --fixed-value dev.null bogus &&
+	test_must_fail git config ${mode_prefix}get-urlmatch --file=config --fixed-value dev.null bogus &&
+	test_must_fail git config ${mode_prefix}rename-section --file=config --fixed-value dev null &&
+	test_must_fail git config ${mode_prefix}remove-section --file=config --fixed-value dev &&
+	test_must_fail git config ${mode_prefix}list --file=config --fixed-value &&
+	test_must_fail git config ${mode_prefix}get-color --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_prefix}get-colorbool --file=config --fixed-value dev.null &&
 
 	# These modes complain when --fixed-value has no value-pattern
-	test_must_fail git config --file=config --fixed-value dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --replace-all dev.null bogus &&
-	test_must_fail git config --file=config --fixed-value --get dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-all dev.null &&
-	test_must_fail git config --file=config --fixed-value --get-regexp "dev.*" &&
-	test_must_fail git config --file=config --fixed-value --unset dev.null &&
-	test_must_fail git config --file=config --fixed-value --unset-all dev.null
+	test_must_fail git config ${mode_set} --file=config --fixed-value dev.null bogus &&
+	test_must_fail git config ${mode_prefix}replace-all --file=config --fixed-value dev.null bogus &&
+	test_must_fail git config ${mode_prefix}get --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_prefix}get-all --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_prefix}get-regexp --file=config --fixed-value "dev.*" &&
+	test_must_fail git config ${mode_prefix}unset --file=config --fixed-value dev.null &&
+	test_must_fail git config ${mode_prefix}unset-all --file=config --fixed-value dev.null
 '
 
 test_expect_success '--fixed-value uses exact string matching' '
 	test_when_finished rm -f config initial &&
 	META="a+b*c?d[e]f.g" &&
-	git config --file=initial fixed.test "$META" &&
+	git config ${mode_set} --file=initial fixed.test "$META" &&
 
 	cp initial config &&
-	git config --file=config fixed.test bogus "$META" &&
-	git config --file=config --list >actual &&
+	git config ${mode_set_all} --file=config fixed.test bogus "$META" &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-EOF &&
 	fixed.test=$META
 	fixed.test=bogus
@@ -2437,34 +2459,34 @@ test_expect_success '--fixed-value uses exact string matching' '
 	test_cmp expect actual &&
 
 	cp initial config &&
-	git config --file=config --fixed-value fixed.test bogus "$META" &&
-	git config --file=config --list >actual &&
+	git config ${mode_set_all} --file=config --fixed-value fixed.test bogus "$META" &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-\EOF &&
 	fixed.test=bogus
 	EOF
 	test_cmp expect actual &&
 
 	cp initial config &&
-	test_must_fail git config --file=config --unset fixed.test "$META" &&
-	git config --file=config --fixed-value --unset fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_prefix}unset --file=config fixed.test "$META" &&
+	git config ${mode_prefix}unset --file=config --fixed-value fixed.test "$META" &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
-	test_must_fail git config --file=config --unset-all fixed.test "$META" &&
-	git config --file=config --fixed-value --unset-all fixed.test "$META" &&
-	test_must_fail git config --file=config fixed.test &&
+	test_must_fail git config ${mode_prefix}unset-all --file=config fixed.test "$META" &&
+	git config ${mode_prefix}unset-all --file=config --fixed-value fixed.test "$META" &&
+	test_must_fail git config ${mode_get} --file=config fixed.test &&
 
 	cp initial config &&
-	git config --file=config --replace-all fixed.test bogus "$META" &&
-	git config --file=config --list >actual &&
+	git config ${mode_prefix}replace-all --file=config fixed.test bogus "$META" &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-EOF &&
 	fixed.test=$META
 	fixed.test=bogus
 	EOF
 	test_cmp expect actual &&
 
-	git config --file=config --fixed-value --replace-all fixed.test bogus "$META" &&
-	git config --file=config --list >actual &&
+	git config ${mode_prefix}replace-all --file=config --fixed-value fixed.test bogus "$META" &&
+	git config ${mode_prefix}list --file=config >actual &&
 	cat >expect <<-EOF &&
 	fixed.test=bogus
 	fixed.test=bogus
@@ -2475,23 +2497,23 @@ test_expect_success '--fixed-value uses exact string matching' '
 test_expect_success '--get and --get-all with --fixed-value' '
 	test_when_finished rm -f config &&
 	META="a+b*c?d[e]f.g" &&
-	git config --file=config fixed.test bogus &&
-	git config --file=config --add fixed.test "$META" &&
+	git config ${mode_set} --file=config fixed.test bogus &&
+	git config ${mode_prefix}add --file=config fixed.test "$META" &&
 
-	git config --file=config --get fixed.test bogus &&
-	test_must_fail git config --file=config --get fixed.test "$META" &&
-	git config --file=config --get --fixed-value fixed.test "$META" &&
-	test_must_fail git config --file=config --get --fixed-value fixed.test non-existent &&
+	git config ${mode_prefix}get --file=config fixed.test bogus &&
+	test_must_fail git config ${mode_prefix}get --file=config fixed.test "$META" &&
+	git config ${mode_prefix}get --file=config --fixed-value fixed.test "$META" &&
+	test_must_fail git config ${mode_prefix}get --file=config --fixed-value fixed.test non-existent &&
 
-	git config --file=config --get-all fixed.test bogus &&
-	test_must_fail git config --file=config --get-all fixed.test "$META" &&
-	git config --file=config --get-all --fixed-value fixed.test "$META" &&
-	test_must_fail git config --file=config --get-all --fixed-value fixed.test non-existent &&
+	git config ${mode_prefix}get-all --file=config fixed.test bogus &&
+	test_must_fail git config ${mode_prefix}get-all --file=config fixed.test "$META" &&
+	git config ${mode_prefix}get-all --file=config --fixed-value fixed.test "$META" &&
+	test_must_fail git config ${mode_prefix}get-all --file=config --fixed-value fixed.test non-existent &&
 
-	git config --file=config --get-regexp fixed+ bogus &&
-	test_must_fail git config --file=config --get-regexp fixed+ "$META" &&
-	git config --file=config --get-regexp --fixed-value fixed+ "$META" &&
-	test_must_fail git config --file=config --get-regexp --fixed-value fixed+ non-existent
+	git config ${mode_prefix}get-regexp --file=config fixed+ bogus &&
+	test_must_fail git config ${mode_prefix}get-regexp --file=config fixed+ "$META" &&
+	git config ${mode_prefix}get-regexp --file=config --fixed-value fixed+ "$META" &&
+	test_must_fail git config ${mode_prefix}get-regexp --file=config --fixed-value fixed+ non-existent
 '
 
 test_expect_success 'includeIf.hasconfig:remote.*.url' '
@@ -2516,10 +2538,10 @@ test_expect_success 'includeIf.hasconfig:remote.*.url' '
 	EOF
 
 	echo this-is-included >expect-this &&
-	git -C hasremoteurlTest config --get user.this >actual-this &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.this >actual-this &&
 	test_cmp expect-this actual-this &&
 
-	test_must_fail git -C hasremoteurlTest config --get user.that
+	test_must_fail git -C hasremoteurlTest config ${mode_prefix}get user.that
 '
 
 test_expect_success 'includeIf.hasconfig:remote.*.url respects last-config-wins' '
@@ -2546,13 +2568,13 @@ test_expect_success 'includeIf.hasconfig:remote.*.url respects last-config-wins'
 	echo main-config >expect-main-config &&
 	echo included-config >expect-included-config &&
 
-	git -C hasremoteurlTest config --get user.one >actual &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.one >actual &&
 	test_cmp expect-main-config actual &&
 
-	git -C hasremoteurlTest config --get user.two >actual &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.two >actual &&
 	test_cmp expect-included-config actual &&
 
-	git -C hasremoteurlTest config --get user.three >actual &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.three >actual &&
 	test_cmp expect-main-config actual
 '
 
@@ -2587,11 +2609,11 @@ test_expect_success 'includeIf.hasconfig:remote.*.url globs' '
 		path = "$(pwd)/no"
 	EOF
 
-	git -C hasremoteurlTest config --get user.dss &&
-	git -C hasremoteurlTest config --get user.dse &&
-	git -C hasremoteurlTest config --get user.dsm &&
-	git -C hasremoteurlTest config --get user.ssm &&
-	test_must_fail git -C hasremoteurlTest config --get user.no
+	git -C hasremoteurlTest config ${mode_prefix}get user.dss &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.dse &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.dsm &&
+	git -C hasremoteurlTest config ${mode_prefix}get user.ssm &&
+	test_must_fail git -C hasremoteurlTest config ${mode_prefix}get user.no
 '
 
 test_expect_success 'includeIf.hasconfig:remote.*.url forbids remote url in such included files' '
@@ -2625,4 +2647,11 @@ test_expect_success 'specifying multiple modes causes failure' '
 	test_cmp expect err
 '
 
+test_expect_success 'specifying mode and subcommand causes failure' '
+	test_must_fail git config get --get 2>err &&
+	grep "subcommand and action modes are incompatible" err
+'
+
+done
+
 test_done
-- 
2.44.0


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

^ permalink raw reply related	[relevance 3%]

* [PATCH v3 14/14] fsmonitor: support case-insensitive events
  @ 2024-02-26 21:39  3%     ` Jeff Hostetler via GitGitGadget
  2024-03-06 12:58  0%       ` Patrick Steinhardt
  0 siblings, 1 reply; 200+ results
From: Jeff Hostetler via GitGitGadget @ 2024-02-26 21:39 UTC (permalink / raw)
  To: git
  Cc: Patrick Steinhardt, Jeff Hostetler, Torsten Bögershausen,
	Jeff Hostetler, Jeff Hostetler

From: Jeff Hostetler <jeffhostetler@github.com>

Teach fsmonitor_refresh_callback() to handle case-insensitive
lookups if case-sensitive lookups fail on case-insensitive systems.
This can cause 'git status' to report stale status for files if there
are case issues/errors in the worktree.

The FSMonitor daemon sends FSEvents using the observed spelling
of each pathname.  On case-insensitive file systems this may be
different than the expected case spelling.

The existing code uses index_name_pos() to find the cache-entry for
the pathname in the FSEvent and clear the CE_FSMONITOR_VALID bit so
that the worktree scan/index refresh will revisit and revalidate the
path.

On a case-insensitive file system, the exact match lookup may fail
to find the associated cache-entry. This causes status to think that
the cached CE flags are correct and skip over the file.

Update event handling to optionally use the name-hash and dir-name-hash
if necessary.

Also update t7527 to convert the "test_expect_failure" to "_success"
now that we have fixed the bug.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
---
 fsmonitor.c                  | 121 +++++++++++++++++++++++++++++++++++
 t/t7527-builtin-fsmonitor.sh |  26 +++++---
 2 files changed, 137 insertions(+), 10 deletions(-)

diff --git a/fsmonitor.c b/fsmonitor.c
index 3c87449be87..2b17d60bbbe 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -5,6 +5,7 @@
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
 #include "fsmonitor-ipc.h"
+#include "name-hash.h"
 #include "run-command.h"
 #include "strbuf.h"
 #include "trace2.h"
@@ -202,6 +203,113 @@ static void invalidate_ce_fsm(struct cache_entry *ce)
 static size_t handle_path_with_trailing_slash(
 	struct index_state *istate, const char *name, int pos);
 
+/*
+ * Use the name-hash to do a case-insensitive cache-entry lookup with
+ * the pathname and invalidate the cache-entry.
+ *
+ * Returns the number of cache-entries that we invalidated.
+ */
+static size_t handle_using_name_hash_icase(
+	struct index_state *istate, const char *name)
+{
+	struct cache_entry *ce = NULL;
+
+	ce = index_file_exists(istate, name, strlen(name), 1);
+	if (!ce)
+		return 0;
+
+	/*
+	 * A case-insensitive search in the name-hash using the
+	 * observed pathname found a cache-entry, so the observed path
+	 * is case-incorrect.  Invalidate the cache-entry and use the
+	 * correct spelling from the cache-entry to invalidate the
+	 * untracked-cache.  Since we now have sparse-directories in
+	 * the index, the observed pathname may represent a regular
+	 * file or a sparse-index directory.
+	 *
+	 * Note that we should not have seen FSEvents for a
+	 * sparse-index directory, but we handle it just in case.
+	 *
+	 * Either way, we know that there are not any cache-entries for
+	 * children inside the cone of the directory, so we don't need to
+	 * do the usual scan.
+	 */
+	trace_printf_key(&trace_fsmonitor,
+			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
+			 name, ce->name);
+
+	/*
+	 * NEEDSWORK: We used the name-hash to find the correct
+	 * case-spelling of the pathname in the cache-entry[], so
+	 * technically this is a tracked file or a sparse-directory.
+	 * It should not have any entries in the untracked-cache, so
+	 * we should not need to use the case-corrected spelling to
+	 * invalidate the the untracked-cache.  So we may not need to
+	 * do this.  For now, I'm going to be conservative and always
+	 * do it; we can revisit this later.
+	 */
+	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
+
+	invalidate_ce_fsm(ce);
+	return 1;
+}
+
+/*
+ * Use the dir-name-hash to find the correct-case spelling of the
+ * directory.  Use the canonical spelling to invalidate all of the
+ * cache-entries within the matching cone.
+ *
+ * Returns the number of cache-entries that we invalidated.
+ */
+static size_t handle_using_dir_name_hash_icase(
+	struct index_state *istate, const char *name)
+{
+	struct strbuf canonical_path = STRBUF_INIT;
+	int pos;
+	size_t len = strlen(name);
+	size_t nr_in_cone;
+
+	if (name[len - 1] == '/')
+		len--;
+
+	if (!index_dir_find(istate, name, len, &canonical_path))
+		return 0; /* name is untracked */
+
+	if (!memcmp(name, canonical_path.buf, canonical_path.len)) {
+		strbuf_release(&canonical_path);
+		/*
+		 * NEEDSWORK: Our caller already tried an exact match
+		 * and failed to find one.  They called us to do an
+		 * ICASE match, so we should never get an exact match,
+		 * so we could promote this to a BUG() here if we
+		 * wanted to.  It doesn't hurt anything to just return
+		 * 0 and go on because we should never get here.  Or we
+		 * could just get rid of the memcmp() and this "if"
+		 * clause completely.
+		 */
+		BUG("handle_using_dir_name_hash_icase(%s) did not exact match",
+		    name);
+	}
+
+	trace_printf_key(&trace_fsmonitor,
+			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
+			 name, canonical_path.buf);
+
+	/*
+	 * The dir-name-hash only tells us the corrected spelling of
+	 * the prefix.  We have to use this canonical path to do a
+	 * lookup in the cache-entry array so that we repeat the
+	 * original search using the case-corrected spelling.
+	 */
+	strbuf_addch(&canonical_path, '/');
+	pos = index_name_pos(istate, canonical_path.buf,
+			     canonical_path.len);
+	nr_in_cone = handle_path_with_trailing_slash(
+		istate, canonical_path.buf, pos);
+	strbuf_release(&canonical_path);
+	return nr_in_cone;
+}
+
 /*
  * The daemon sent an observed pathname without a trailing slash.
  * (This is the normal case.)  We do not know if it is a tracked or
@@ -335,6 +443,19 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
 	else
 		nr_in_cone = handle_path_without_trailing_slash(istate, name, pos);
 
+	/*
+	 * If we did not find an exact match for this pathname or any
+	 * cache-entries with this directory prefix and we're on a
+	 * case-insensitive file system, try again using the name-hash
+	 * and dir-name-hash.
+	 */
+	if (!nr_in_cone && ignore_case) {
+		nr_in_cone = handle_using_name_hash_icase(istate, name);
+		if (!nr_in_cone)
+			nr_in_cone = handle_using_dir_name_hash_icase(
+				istate, name);
+	}
+
 	if (nr_in_cone)
 		trace_printf_key(&trace_fsmonitor,
 				 "fsmonitor_refresh_callback CNT: %d",
diff --git a/t/t7527-builtin-fsmonitor.sh b/t/t7527-builtin-fsmonitor.sh
index 830f2d9de33..730f3c7f810 100755
--- a/t/t7527-builtin-fsmonitor.sh
+++ b/t/t7527-builtin-fsmonitor.sh
@@ -1051,7 +1051,7 @@ test_expect_success 'split-index and FSMonitor work well together' '
 #
 # The setup is a little contrived.
 #
-test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
+test_expect_success CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
 	test_when_finished "stop_daemon_delete_repo subdir_case_wrong" &&
 
 	git init subdir_case_wrong &&
@@ -1116,19 +1116,19 @@ test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
 
 	grep -q "dir1/DIR2/dir3/file3.*pos -3" "$PWD/subdir_case_wrong.log1" &&
 
+	# Verify that we get a mapping event to correct the case.
+	grep -q "MAP:.*dir1/DIR2/dir3/file3.*dir1/dir2/dir3/file3" \
+		"$PWD/subdir_case_wrong.log1" &&
+
 	# The refresh-callbacks should have caused "git status" to clear
 	# the CE_FSMONITOR_VALID bit on each of those files and caused
 	# the worktree scan to visit them and mark them as modified.
 	grep -q " M AAA" "$PWD/subdir_case_wrong.out" &&
 	grep -q " M zzz" "$PWD/subdir_case_wrong.out" &&
-
-	# Expect Breakage: with the case confusion, the "(pos -3)" causes
-	# the client to not clear the CE_FSMONITOR_VALID bit and therefore
-	# status will not rescan the file and therefore not report it as dirty.
 	grep -q " M dir1/dir2/dir3/file3" "$PWD/subdir_case_wrong.out"
 '
 
-test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
+test_expect_success CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
 	test_when_finished "stop_daemon_delete_repo file_case_wrong" &&
 
 	git init file_case_wrong &&
@@ -1242,14 +1242,20 @@ test_expect_failure CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
 	GIT_TRACE_FSMONITOR="$PWD/file_case_wrong-try3.log" \
 		git -C file_case_wrong --no-optional-locks status --short \
 			>"$PWD/file_case_wrong-try3.out" &&
+
+	# Verify that we get a mapping event to correct the case.
+	grep -q "fsmonitor_refresh_callback MAP:.*dir1/dir2/dir3/FILE-3-A.*dir1/dir2/dir3/file-3-a" \
+		"$PWD/file_case_wrong-try3.log" &&
+	grep -q "fsmonitor_refresh_callback MAP:.*dir1/dir2/dir4/file-4-a.*dir1/dir2/dir4/FILE-4-A" \
+		"$PWD/file_case_wrong-try3.log" &&
+
 	# FSEvents are in observed case.
 	grep -q "fsmonitor_refresh_callback.*FILE-3-A.*pos -3" "$PWD/file_case_wrong-try3.log" &&
 	grep -q "fsmonitor_refresh_callback.*file-4-a.*pos -9" "$PWD/file_case_wrong-try3.log" &&
 
-	# Expect Breakage: with the case confusion, the "(pos-3)" and
-	# "(pos -9)" causes the client to not clear the CE_FSMONITOR_VALID
-	# bit and therefore status will not rescan the files and therefore
-	# not report them as dirty.
+	# The refresh-callbacks should have caused "git status" to clear
+	# the CE_FSMONITOR_VALID bit on each of those files and caused
+	# the worktree scan to visit them and mark them as modified.
 	grep -q " M dir1/dir2/dir3/file-3-a" "$PWD/file_case_wrong-try3.out" &&
 	grep -q " M dir1/dir2/dir4/FILE-4-A" "$PWD/file_case_wrong-try3.out"
 '
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH v2 14/16] fsmonitor: support case-insensitive events
  @ 2024-02-26 20:41  4%       ` Jeff Hostetler
  0 siblings, 0 replies; 200+ results
From: Jeff Hostetler @ 2024-02-26 20:41 UTC (permalink / raw)
  To: Junio C Hamano, Jeff Hostetler via GitGitGadget
  Cc: git, Patrick Steinhardt, Jeff Hostetler



On 2/23/24 1:14 PM, Junio C Hamano wrote:
> "Jeff Hostetler via GitGitGadget" <gitgitgadget@gmail.com> writes:
> 
>> +/*
>> + * Use the name-hash to do a case-insensitive cache-entry lookup with
>> + * the pathname and invalidate the cache-entry.
>> + *
>> + * Returns the number of cache-entries that we invalidated.
>> + */
>> +static size_t handle_using_name_hash_icase(
>> +	struct index_state *istate, const char *name)
>> +{
>> +	struct cache_entry *ce = NULL;
>> +
>> +	ce = index_file_exists(istate, name, strlen(name), 1);
>> +	if (!ce)
>> +		return 0;
>> +
>> +	/*
>> +	 * A case-insensitive search in the name-hash using the
>> +	 * observed pathname found a cache-entry, so the observed path
>> +	 * is case-incorrect.  Invalidate the cache-entry and use the
>> +	 * correct spelling from the cache-entry to invalidate the
>> +	 * untracked-cache.  Since we now have sparse-directories in
>> +	 * the index, the observed pathname may represent a regular
>> +	 * file or a sparse-index directory.
>> +	 *
>> +	 * Note that we should not have seen FSEvents for a
>> +	 * sparse-index directory, but we handle it just in case.
>> +	 *
>> +	 * Either way, we know that there are not any cache-entries for
>> +	 * children inside the cone of the directory, so we don't need to
>> +	 * do the usual scan.
>> +	 */
>> +	trace_printf_key(&trace_fsmonitor,
>> +			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
>> +			 name, ce->name);
>> +
>> +	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
>> +	ce->ce_flags &= ~CE_FSMONITOR_VALID;
>> +	return 1;
>> +}
> 
> You first ask the name-hash to turn the incoming "name" into the
> case variant that we know about, i.e. ce->name, and use that to
> access the untracked cache.  Clever and makes sense.  But if we have
> ce->name, doesn't it mean the name is tracked?  Do we find anything
> useful to do in the untracked cache invalidation codepath in that
> case?
> 
> An FSmonitor event with case-incorrect pathname for a directory may
> not be this trivial, I presume, and I expect that is what the
> remainder of this patch is about.

We're going to use "handle_using_name_hash_icase()" to lookup both
qualified (with trailing slash provided by the daemon) paths and
unqualified paths (either a file or a directory on a platform that
can't tell), so there are 3 cases to worry about.

If we fail to find a cache-entry in the name-hash, we know nothing
about the path and we still have the three cases to worry about and
we let the caller deal with that.

If we DO find a matching cache-entry, then it is either a tracked
file or one of the new sparse-directories cache-entries.  We now know
the correct case-spelling.  I don't think it is possible for the UC
to have an entry for this spelling, so you're right, we may not need
to explicitly invalidate the UC here.  I'll add a comment to the code
about this.


> 
>> +
>> +/*
>> + * Use the dir-name-hash to find the correct-case spelling of the
>> + * directory.  Use the canonical spelling to invalidate all of the
>> + * cache-entries within the matching cone.
>> + *
>> + * Returns the number of cache-entries that we invalidated.
>> + */
>> +static size_t handle_using_dir_name_hash_icase(
>> +	struct index_state *istate, const char *name)
> 
> It is a bit unfortunate that here on the name-hash side we contrast
> the two helper function variants as "dir-name" vs "name", while the
> original handle_path side use "without_slash" vs "with_slash".
> 
> If I understand correctly, it is not like there are two distinct
> hashes, "name-hash" vs "dir-name-hash".  Both of these helpers use
> the same "name-hash" mechanism, and this function differs from the
> previous one in that it is about a directory, which is why it has
> "dir" in its name.  I wonder if we renamed the other one with
> "nondir" in its name, and the other without_slash and with_slash
> pair to match, e.g., handle_nondir_path() vs handle_dir_path(), or
> something like that, the resulting names for these four functions
> become easier to contrast and understand?

name-hash.[ch] has 2 distinct hash-maps inside it. The "name-hash"
that we typically think about. And a well-hidden "dir-name-hash"
in the same source file.

The "name-hash" maps each cache-entry's pathname to its ce* in
the cache-entry[] (case-insensitively).

The "dir-name-hash" maps each unique directory prefix over all
of the cache-entries to the case-correct prefix.  That is, if the
index contains "dir1/Dir2/DIR3/file1" and "dir1/dir4/file2", the
dir hash will have 4 entries
     { "dir1", "dir1/Dir2", "dir1/Dir2/DIR3", "dir1/dir4" }.
This lets us do lookups without having to do a linear search on
the entire cache-entry[] every time.

These 2 hashes are demand-loaded only when needed (and usually only
when ignore_case is set IIRC).

When "handle_using_dir_name_hash_icase()" is called we still don't
know if the pathname is actually a file or directory, all we know
is that we did not find a case-sensitive exact match nor a
case-insensitive match against the cache-entry[] using the name-hash.
The pathname could be a (unqualified) directory or just a plain
untracked file.  So here, if we find it in the dir-name-hash, we now
know that it is a directory and that there was a case-error and we now
know the directory's correct case-spelling.

So we use that discovered case-correct spelling to invalidate the
untracked-cache.

> 
>> +{
>> +	struct strbuf canonical_path = STRBUF_INIT;
>> +	int pos;
>> +	size_t len = strlen(name);
>> +	size_t nr_in_cone;
>> +
>> +	if (name[len - 1] == '/')
>> +		len--;
>> +
>> +	if (!index_dir_find(istate, name, len, &canonical_path))
>> +		return 0; /* name is untracked */
>> +
>> +	if (!memcmp(name, canonical_path.buf, canonical_path.len)) {
>> +		strbuf_release(&canonical_path);
>> +		/*
>> +		 * NEEDSWORK: Our caller already tried an exact match
>> +		 * and failed to find one.  They called us to do an
>> +		 * ICASE match, so we should never get an exact match,
>> +		 * so we could promote this to a BUG() here if we
>> +		 * wanted to.  It doesn't hurt anything to just return
>> +		 * 0 and go on becaus we should never get here.  Or we
>> +		 * could just get rid of the memcmp() and this "if"
>> +		 * clause completely.
>> +		 */
>> +		return 0; /* should not happen */
>> +	}
> 
> "becaus" -> "because".
> 
> If we should never get here, having BUG("we should never get here")
> would not hurt anything, either.  On the other hand, silently
> returning 0 will hide the bug under the carpet, and I am not sure it
> is fair to call it "doesn't hurt anything".

I'll make it a BUG().

> 
>> +
>> +	trace_printf_key(&trace_fsmonitor,
>> +			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
>> +			 name, canonical_path.buf);
>> +
>> +	/*
>> +	 * The dir-name-hash only tells us the corrected spelling of
>> +	 * the prefix.  We have to use this canonical path to do a
>> +	 * lookup in the cache-entry array so that we repeat the
>> +	 * original search using the case-corrected spelling.
>> +	 */
>> +	strbuf_addch(&canonical_path, '/');
>> +	pos = index_name_pos(istate, canonical_path.buf,
>> +			     canonical_path.len);
>> +	nr_in_cone = handle_path_with_trailing_slash(
>> +		istate, canonical_path.buf, pos);
>> +	strbuf_release(&canonical_path);
>> +	return nr_in_cone;
>> +}
> 
> Nice.  Do we need to give this corrected name to help untracked
> cache invalidation from the caller that called us?

In an earlier commit, I moved the call to invalidate the untracked-cache
into the two handle_path_with[out]_trailing_slash() functions so that
we wouldn't have to worry about it here.

> 
>> @@ -319,6 +416,19 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
>>   	else
>>   		nr_in_cone = handle_path_without_trailing_slash(istate, name, pos);
>>   
>> +	/*
>> +	 * If we did not find an exact match for this pathname or any
>> +	 * cache-entries with this directory prefix and we're on a
>> +	 * case-insensitive file system, try again using the name-hash
>> +	 * and dir-name-hash.
>> +	 */
>> +	if (!nr_in_cone && ignore_case) {
>> +		nr_in_cone = handle_using_name_hash_icase(istate, name);
>> +		if (!nr_in_cone)
>> +			nr_in_cone = handle_using_dir_name_hash_icase(
>> +				istate, name);
>> +	}
> 
> It might be interesting to learn how often we go through these
> "fallback" code paths by tracing.  Maybe it will become too noisy?
> I dunno.

I'm afraid it will be very noisy. On Windows and Mac we'll probably end
up falling back for anything that is untracked, unfortunately.  That is,
if there is no cache-entry for "foo.obj", then we'll look for a
case-error (maybe there is a tracked "FOO.OBJ" file in the index or a
"Foo.Obj" directory), before we can say it is untracked.

I'm not happy about this (and no, I haven't had time to measure the
perf hit we'll take), but right now I'm just worried about the
correctness -- I've had several reports of stale/incomplete status
when IDE tools change file/directory case in unexpected ways....

Thanks
Jeff


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2 14/16] fsmonitor: support case-insensitive events
  2024-02-23  3:18  4%   ` [PATCH v2 14/16] fsmonitor: support case-insensitive events Jeff Hostetler via GitGitGadget
  @ 2024-02-25 13:10  0%     ` Torsten Bögershausen
  1 sibling, 0 replies; 200+ results
From: Torsten Bögershausen @ 2024-02-25 13:10 UTC (permalink / raw)
  To: Jeff Hostetler via GitGitGadget
  Cc: git, Patrick Steinhardt, Jeff Hostetler, Jeff Hostetler

On Fri, Feb 23, 2024 at 03:18:18AM +0000, Jeff Hostetler via GitGitGadget wrote:
> From: Jeff Hostetler <jeffhostetler@github.com>
>
> Teach fsmonitor_refresh_callback() to handle case-insensitive
> lookups if case-sensitive lookups fail on case-insensitive systems.
> This can cause 'git status' to report stale status for files if there
> are case issues/errors in the worktree.
>
> The FSMonitor daemon sends FSEvents using the observed spelling
> of each pathname.  On case-insensitive file systems this may be
> different than the expected case spelling.
>
> The existing code uses index_name_pos() to find the cache-entry for
> the pathname in the FSEvent and clear the CE_FSMONITOR_VALID bit so
> that the worktree scan/index refresh will revisit and revalidate the
> path.
>
> On a case-insensitive file system, the exact match lookup may fail
> to find the associated cache-entry. This causes status to think that
> the cached CE flags are correct and skip over the file.
>
> Update event handling to optionally use the name-hash and dir-name-hash
> if necessary.
>
> Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
> ---
>  fsmonitor.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 110 insertions(+)
>
> diff --git a/fsmonitor.c b/fsmonitor.c
> index 739ddbf7aca..ac638a61c00 100644
> --- a/fsmonitor.c
> +++ b/fsmonitor.c
> @@ -5,6 +5,7 @@
>  #include "ewah/ewok.h"
>  #include "fsmonitor.h"
>  #include "fsmonitor-ipc.h"
> +#include "name-hash.h"
>  #include "run-command.h"
>  #include "strbuf.h"
>  #include "trace2.h"
> @@ -186,6 +187,102 @@ static int query_fsmonitor_hook(struct repository *r,
>  static size_t handle_path_with_trailing_slash(
>  	struct index_state *istate, const char *name, int pos);
>
> +/*
> + * Use the name-hash to do a case-insensitive cache-entry lookup with
> + * the pathname and invalidate the cache-entry.
> + *
> + * Returns the number of cache-entries that we invalidated.
> + */
> +static size_t handle_using_name_hash_icase(
> +	struct index_state *istate, const char *name)
> +{
> +	struct cache_entry *ce = NULL;
> +
> +	ce = index_file_exists(istate, name, strlen(name), 1);
> +	if (!ce)
> +		return 0;
> +
> +	/*
> +	 * A case-insensitive search in the name-hash using the
> +	 * observed pathname found a cache-entry, so the observed path
> +	 * is case-incorrect.  Invalidate the cache-entry and use the
> +	 * correct spelling from the cache-entry to invalidate the
> +	 * untracked-cache.  Since we now have sparse-directories in
> +	 * the index, the observed pathname may represent a regular
> +	 * file or a sparse-index directory.
> +	 *
> +	 * Note that we should not have seen FSEvents for a
> +	 * sparse-index directory, but we handle it just in case.
> +	 *
> +	 * Either way, we know that there are not any cache-entries for
> +	 * children inside the cone of the directory, so we don't need to
> +	 * do the usual scan.
> +	 */
> +	trace_printf_key(&trace_fsmonitor,
> +			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
> +			 name, ce->name);
> +
> +	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
> +
> +	ce->ce_flags &= ~CE_FSMONITOR_VALID;
> +	return 1;
> +}
> +
> +/*
> + * Use the dir-name-hash to find the correct-case spelling of the
> + * directory.  Use the canonical spelling to invalidate all of the
> + * cache-entries within the matching cone.
> + *
> + * Returns the number of cache-entries that we invalidated.
> + */
> +static size_t handle_using_dir_name_hash_icase(
> +	struct index_state *istate, const char *name)
> +{
> +	struct strbuf canonical_path = STRBUF_INIT;
> +	int pos;
> +	size_t len = strlen(name);
> +	size_t nr_in_cone;
> +
> +	if (name[len - 1] == '/')
> +		len--;
> +
> +	if (!index_dir_find(istate, name, len, &canonical_path))
> +		return 0; /* name is untracked */
> +
> +	if (!memcmp(name, canonical_path.buf, canonical_path.len)) {
> +		strbuf_release(&canonical_path);
> +		/*
> +		 * NEEDSWORK: Our caller already tried an exact match
> +		 * and failed to find one.  They called us to do an
> +		 * ICASE match, so we should never get an exact match,
> +		 * so we could promote this to a BUG() here if we
> +		 * wanted to.  It doesn't hurt anything to just return
> +		 * 0 and go on becaus we should never get here.  Or we
> +		 * could just get rid of the memcmp() and this "if"
> +		 * clause completely.
> +		 */
> +		return 0; /* should not happen */

In very very theory, there may be a race-condition,
when a directory is renamed very fast, more than once.
I don't think, that the "it did not match exactly, but
now it matches" is a problem.
Question: Does it make sense to just remove this ?
And, may be, find out that the "corrected spelling (tm)"
of "DIR1" is not "dir1", neither "Dir1", but, exactly, "DIR1" ?
Would that be a problem ?


> +	}
> +
> +	trace_printf_key(&trace_fsmonitor,
> +			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
> +			 name, canonical_path.buf);
> +
> +	/*
> +	 * The dir-name-hash only tells us the corrected spelling of
> +	 * the prefix.  We have to use this canonical path to do a
> +	 * lookup in the cache-entry array so that we repeat the
> +	 * original search using the case-corrected spelling.
> +	 */
> +	strbuf_addch(&canonical_path, '/');
> +	pos = index_name_pos(istate, canonical_path.buf,
> +			     canonical_path.len);
> +	nr_in_cone = handle_path_with_trailing_slash(
> +		istate, canonical_path.buf, pos);
> +	strbuf_release(&canonical_path);
> +	return nr_in_cone;
> +}
> +
>  /*
>   * The daemon sent an observed pathname without a trailing slash.
>   * (This is the normal case.)  We do not know if it is a tracked or
> @@ -319,6 +416,19 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
>  	else
>  		nr_in_cone = handle_path_without_trailing_slash(istate, name, pos);
>
> +	/*
> +	 * If we did not find an exact match for this pathname or any
> +	 * cache-entries with this directory prefix and we're on a
> +	 * case-insensitive file system, try again using the name-hash
> +	 * and dir-name-hash.
> +	 */
> +	if (!nr_in_cone && ignore_case) {
> +		nr_in_cone = handle_using_name_hash_icase(istate, name);
> +		if (!nr_in_cone)
> +			nr_in_cone = handle_using_dir_name_hash_icase(
> +				istate, name);
> +	}
> +
>  	if (nr_in_cone)
>  		trace_printf_key(&trace_fsmonitor,
>  				 "fsmonitor_refresh_callback CNT: %d",
> --
> gitgitgadget
>
>


^ permalink raw reply	[relevance 0%]

* [PATCH v2 14/16] fsmonitor: support case-insensitive events
  2024-02-23  3:18  2% ` [PATCH v2 00/16] FSMonitor edge cases on case-insensitive file systems Jeff Hostetler via GitGitGadget
@ 2024-02-23  3:18  4%   ` Jeff Hostetler via GitGitGadget
    2024-02-25 13:10  0%     ` Torsten Bögershausen
    1 sibling, 2 replies; 200+ results
From: Jeff Hostetler via GitGitGadget @ 2024-02-23  3:18 UTC (permalink / raw)
  To: git; +Cc: Patrick Steinhardt, Jeff Hostetler, Jeff Hostetler,
	Jeff Hostetler

From: Jeff Hostetler <jeffhostetler@github.com>

Teach fsmonitor_refresh_callback() to handle case-insensitive
lookups if case-sensitive lookups fail on case-insensitive systems.
This can cause 'git status' to report stale status for files if there
are case issues/errors in the worktree.

The FSMonitor daemon sends FSEvents using the observed spelling
of each pathname.  On case-insensitive file systems this may be
different than the expected case spelling.

The existing code uses index_name_pos() to find the cache-entry for
the pathname in the FSEvent and clear the CE_FSMONITOR_VALID bit so
that the worktree scan/index refresh will revisit and revalidate the
path.

On a case-insensitive file system, the exact match lookup may fail
to find the associated cache-entry. This causes status to think that
the cached CE flags are correct and skip over the file.

Update event handling to optionally use the name-hash and dir-name-hash
if necessary.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
---
 fsmonitor.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)

diff --git a/fsmonitor.c b/fsmonitor.c
index 739ddbf7aca..ac638a61c00 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -5,6 +5,7 @@
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
 #include "fsmonitor-ipc.h"
+#include "name-hash.h"
 #include "run-command.h"
 #include "strbuf.h"
 #include "trace2.h"
@@ -186,6 +187,102 @@ static int query_fsmonitor_hook(struct repository *r,
 static size_t handle_path_with_trailing_slash(
 	struct index_state *istate, const char *name, int pos);
 
+/*
+ * Use the name-hash to do a case-insensitive cache-entry lookup with
+ * the pathname and invalidate the cache-entry.
+ *
+ * Returns the number of cache-entries that we invalidated.
+ */
+static size_t handle_using_name_hash_icase(
+	struct index_state *istate, const char *name)
+{
+	struct cache_entry *ce = NULL;
+
+	ce = index_file_exists(istate, name, strlen(name), 1);
+	if (!ce)
+		return 0;
+
+	/*
+	 * A case-insensitive search in the name-hash using the
+	 * observed pathname found a cache-entry, so the observed path
+	 * is case-incorrect.  Invalidate the cache-entry and use the
+	 * correct spelling from the cache-entry to invalidate the
+	 * untracked-cache.  Since we now have sparse-directories in
+	 * the index, the observed pathname may represent a regular
+	 * file or a sparse-index directory.
+	 *
+	 * Note that we should not have seen FSEvents for a
+	 * sparse-index directory, but we handle it just in case.
+	 *
+	 * Either way, we know that there are not any cache-entries for
+	 * children inside the cone of the directory, so we don't need to
+	 * do the usual scan.
+	 */
+	trace_printf_key(&trace_fsmonitor,
+			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
+			 name, ce->name);
+
+	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
+
+	ce->ce_flags &= ~CE_FSMONITOR_VALID;
+	return 1;
+}
+
+/*
+ * Use the dir-name-hash to find the correct-case spelling of the
+ * directory.  Use the canonical spelling to invalidate all of the
+ * cache-entries within the matching cone.
+ *
+ * Returns the number of cache-entries that we invalidated.
+ */
+static size_t handle_using_dir_name_hash_icase(
+	struct index_state *istate, const char *name)
+{
+	struct strbuf canonical_path = STRBUF_INIT;
+	int pos;
+	size_t len = strlen(name);
+	size_t nr_in_cone;
+
+	if (name[len - 1] == '/')
+		len--;
+
+	if (!index_dir_find(istate, name, len, &canonical_path))
+		return 0; /* name is untracked */
+
+	if (!memcmp(name, canonical_path.buf, canonical_path.len)) {
+		strbuf_release(&canonical_path);
+		/*
+		 * NEEDSWORK: Our caller already tried an exact match
+		 * and failed to find one.  They called us to do an
+		 * ICASE match, so we should never get an exact match,
+		 * so we could promote this to a BUG() here if we
+		 * wanted to.  It doesn't hurt anything to just return
+		 * 0 and go on becaus we should never get here.  Or we
+		 * could just get rid of the memcmp() and this "if"
+		 * clause completely.
+		 */
+		return 0; /* should not happen */
+	}
+
+	trace_printf_key(&trace_fsmonitor,
+			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
+			 name, canonical_path.buf);
+
+	/*
+	 * The dir-name-hash only tells us the corrected spelling of
+	 * the prefix.  We have to use this canonical path to do a
+	 * lookup in the cache-entry array so that we repeat the
+	 * original search using the case-corrected spelling.
+	 */
+	strbuf_addch(&canonical_path, '/');
+	pos = index_name_pos(istate, canonical_path.buf,
+			     canonical_path.len);
+	nr_in_cone = handle_path_with_trailing_slash(
+		istate, canonical_path.buf, pos);
+	strbuf_release(&canonical_path);
+	return nr_in_cone;
+}
+
 /*
  * The daemon sent an observed pathname without a trailing slash.
  * (This is the normal case.)  We do not know if it is a tracked or
@@ -319,6 +416,19 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
 	else
 		nr_in_cone = handle_path_without_trailing_slash(istate, name, pos);
 
+	/*
+	 * If we did not find an exact match for this pathname or any
+	 * cache-entries with this directory prefix and we're on a
+	 * case-insensitive file system, try again using the name-hash
+	 * and dir-name-hash.
+	 */
+	if (!nr_in_cone && ignore_case) {
+		nr_in_cone = handle_using_name_hash_icase(istate, name);
+		if (!nr_in_cone)
+			nr_in_cone = handle_using_dir_name_hash_icase(
+				istate, name);
+	}
+
 	if (nr_in_cone)
 		trace_printf_key(&trace_fsmonitor,
 				 "fsmonitor_refresh_callback CNT: %d",
-- 
gitgitgadget



^ permalink raw reply related	[relevance 4%]

* [PATCH v2 00/16] FSMonitor edge cases on case-insensitive file systems
    2024-02-13 20:52  4% ` [PATCH 08/12] fsmonitor: support case-insensitive directory events Jeff Hostetler via GitGitGadget
@ 2024-02-23  3:18  2% ` Jeff Hostetler via GitGitGadget
  2024-02-23  3:18  4%   ` [PATCH v2 14/16] fsmonitor: support case-insensitive events Jeff Hostetler via GitGitGadget
    1 sibling, 2 replies; 200+ results
From: Jeff Hostetler via GitGitGadget @ 2024-02-23  3:18 UTC (permalink / raw)
  To: git; +Cc: Patrick Steinhardt, Jeff Hostetler, Jeff Hostetler

Here is version 2. I think I have addressed all of the comments on the first
version and have greatly consolidated/streamlined the "icase" code.

============== Fix FSMonitor client code to detect case-incorrect FSEvents
and map them to the canonical case expected by the index.

FSEvents are delivered to the FSMonitor daemon using the observed case which
may or may not match the expected case stored in the index for tracked files
and/or directories. This caused index_name_pos() to report a negative index
position (defined as the suggested insertion point). Since the value was
negative, the FSMonitor refresh lookup would not invalidate the
CE_FSMONITOR_VALID bit on the "expected" (case-insensitive-equivalent)
cache-entries. Therefore, git status would not report them as modified.

This was a fairly obscure problem and only happened when the case of a
sub-directory or a file was artificially changed.

This first runs the original lookup using the observed case. If that fails,
it assumes that the observed pathname refers to a file and uses the
case-insensitive name-hash hashmap to find an equivalent path (cache-entry)
in the index. If that fails, it assumes the pathname refers to a directory
and uses the case-insensitive dir-name-hash to find the equivalent directory
and then repeats the index_name_pos() lookup to find a directory or
suggested insertion point with the expected case.

Two new test cases were added to t7527 to demonstrate this.

Since this was rather obscure, I also added some additional tracing under
the GIT_TRACE_FSMONITOR key.

I also did considerable refactoring of the original code before adding the
new lookups.

Finally, I made more explicit the relationship between the FSEvents and the
(new) sparse-index directory cache-entries, since sparse-index was added
slightly after the FSMonitor feature.

Jeff Hostetler (16):
  name-hash: add index_dir_find()
  t7527: add case-insensitve test for FSMonitor
  t7527: temporarily disable case-insensitive tests
  fsmonitor: refactor refresh callback on directory events
  fsmonitor: clarify handling of directory events in callback helper
  fsmonitor: refactor refresh callback for non-directory events
  dir: create untracked_cache_invalidate_trimmed_path()
  fsmonitor: refactor untracked-cache invalidation
  fsmonitor: move untracked invalidation into helper functions
  fsmonitor: return invalidated cache-entry count on directory event
  fsmonitor: remove custom loop from non-directory path handler
  fsmonitor: return invalided cache-entry count on non-directory event
  fsmonitor: trace the new invalidated cache-entry count
  fsmonitor: support case-insensitive events
  fsmonitor: refactor bit invalidation in refresh callback
  t7527: update case-insenstive fsmonitor test

 dir.c                        |  20 +++
 dir.h                        |   7 +
 fsmonitor.c                  | 299 ++++++++++++++++++++++++++++-------
 name-hash.c                  |   9 +-
 name-hash.h                  |   7 +-
 t/t7527-builtin-fsmonitor.sh | 220 ++++++++++++++++++++++++++
 6 files changed, 506 insertions(+), 56 deletions(-)


base-commit: f41f85c9ec8d4d46de0fd5fded88db94d3ec8c11
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1662%2Fjeffhostetler%2Ffsmonitor-ignore-case-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1662/jeffhostetler/fsmonitor-ignore-case-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1662

Range-diff vs v1:

  1:  6f81e2e3060 <  -:  ----------- sparse-index: pass string length to index_file_exists()
  2:  3464545fe3f !  1:  03b07d9c25e name-hash: add index_dir_exists2()
     @@ Metadata
      Author: Jeff Hostetler <jeffhostetler@github.com>
      
       ## Commit message ##
     -    name-hash: add index_dir_exists2()
     +    name-hash: add index_dir_find()
      
     -    Create a new version of index_dir_exists() to return the canonical
     +    Replace the index_dir_exists() function with index_dir_find() and
     +    change the API to take an optional strbuf to return the canonical
          spelling of the matched directory prefix.
      
     +    Create an index_dir_exists() wrapper macro for existing callers.
     +
          The existing index_dir_exists() returns a boolean to indicate if
          there is a case-insensitive match in the directory name-hash, but
          it doesn't tell the caller the exact spelling of that match.
     @@ Commit message
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## name-hash.c ##
     -@@ name-hash.c: int index_dir_exists(struct index_state *istate, const char *name, int namelen)
     - 	dir = find_dir_entry(istate, name, namelen);
     - 	return dir && dir->nr;
     +@@ name-hash.c: static int same_name(const struct cache_entry *ce, const char *name, int namelen
     + 	return slow_same_name(name, namelen, ce->name, len);
       }
     -+int index_dir_exists2(struct index_state *istate, const char *name, int namelen,
     -+		      struct strbuf *canonical_path)
     -+{
     -+	struct dir_entry *dir;
     -+
     -+	strbuf_init(canonical_path, namelen+1);
     -+
     -+	lazy_init_name_hash(istate);
     -+	expand_to_path(istate, name, namelen, 0);
     -+	dir = find_dir_entry(istate, name, namelen);
     + 
     +-int index_dir_exists(struct index_state *istate, const char *name, int namelen)
     ++int index_dir_find(struct index_state *istate, const char *name, int namelen,
     ++		   struct strbuf *canonical_path)
     + {
     + 	struct dir_entry *dir;
     + 
     + 	lazy_init_name_hash(istate);
     + 	expand_to_path(istate, name, namelen, 0);
     + 	dir = find_dir_entry(istate, name, namelen);
      +
     -+	if (dir && dir->nr)
     ++	if (canonical_path && dir && dir->nr) {
     ++		strbuf_reset(canonical_path);
      +		strbuf_add(canonical_path, dir->name, dir->namelen);
     ++	}
      +
     -+	return dir && dir->nr;
     -+}
     + 	return dir && dir->nr;
     + }
       
     - void adjust_dirname_case(struct index_state *istate, char *name)
     - {
      
       ## name-hash.h ##
     -@@ name-hash.h: struct cache_entry;
     +@@
     + struct cache_entry;
       struct index_state;
       
     - int index_dir_exists(struct index_state *istate, const char *name, int namelen);
     -+int index_dir_exists2(struct index_state *istate, const char *name, int namelen,
     -+		      struct strbuf *canonical_path);
     +-int index_dir_exists(struct index_state *istate, const char *name, int namelen);
     ++
     ++int index_dir_find(struct index_state *istate, const char *name, int namelen,
     ++		   struct strbuf *canonical_path);
     ++
     ++#define index_dir_exists(i, n, l) index_dir_find((i), (n), (l), NULL)
     ++
       void adjust_dirname_case(struct index_state *istate, char *name);
       struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase);
       
  3:  272d7805f47 =  2:  7778cee1c10 t7527: add case-insensitve test for FSMonitor
  -:  ----------- >  3:  dad079ade7f t7527: temporarily disable case-insensitive tests
  4:  3fb8e0d0a7c !  4:  5516670e30e fsmonitor: refactor refresh callback on directory events
     @@ Metadata
       ## Commit message ##
          fsmonitor: refactor refresh callback on directory events
      
     +    Move the code to handle directory FSEvents (containing pathnames with
     +    a trailing slash) into a helper function.
     +
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     @@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
       	return result;
       }
       
     -+static void fsmonitor_refresh_callback_slash(
     -+	struct index_state *istate, const char *name, int len, int pos)
     ++static void handle_path_with_trailing_slash(
     ++	struct index_state *istate, const char *name, int pos)
      +{
      +	int i;
      +
     @@ fsmonitor.c: static void fsmonitor_refresh_callback(struct index_state *istate,
      -				break;
      -			istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
      -		}
     -+		fsmonitor_refresh_callback_slash(istate, name, len, pos);
     ++		handle_path_with_trailing_slash(istate, name, pos);
       
       		/*
       		 * We need to remove the traling "/" from the path
  6:  5b6f8bd1fe7 !  5:  c04fd4eae94 fsmonitor: clarify handling of directory events in callback
     @@ Metadata
      Author: Jeff Hostetler <jeffhostetler@github.com>
      
       ## Commit message ##
     -    fsmonitor: clarify handling of directory events in callback
     +    fsmonitor: clarify handling of directory events in callback helper
     +
     +    Improve documentation of the refresh callback helper function
     +    used for directory FSEvents.
      
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     -@@ fsmonitor.c: static void fsmonitor_refresh_callback_unqualified(
     - 	}
     +@@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
     + 	return result;
       }
       
     --static void fsmonitor_refresh_callback_slash(
      +/*
      + * The daemon can decorate directory events, such as a move or rename,
      + * by adding a trailing slash to the observed name.  Use this to
     @@ fsmonitor.c: static void fsmonitor_refresh_callback_unqualified(
      + * same way and just invalidate the cache-entry and the untracked
      + * cache (and in this case, the forward cache-entry scan won't find
      + * anything and it doesn't hurt to let it run).
     -+ *
     -+ * Return the number of cache-entries that we invalidated.  We will
     -+ * use this later to determine if we need to attempt a second
     -+ * case-insensitive search.
      + */
     -+static int fsmonitor_refresh_callback_slash(
     - 	struct index_state *istate, const char *name, int len, int pos)
     + static void handle_path_with_trailing_slash(
     + 	struct index_state *istate, const char *name, int pos)
       {
       	int i;
     -+	int nr_in_cone = 0;
       
      -	/*
      -	 * The daemon can decorate directory events, such as
     @@ fsmonitor.c: static void fsmonitor_refresh_callback_unqualified(
       	if (pos < 0)
       		pos = -pos - 1;
       
     -@@ fsmonitor.c: static void fsmonitor_refresh_callback_slash(
     - 		if (!starts_with(istate->cache[i]->name, name))
     - 			break;
     - 		istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
     -+		nr_in_cone++;
     - 	}
     -+
     -+	return nr_in_cone;
     - }
     - 
     - static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
  5:  0896d4af907 !  6:  7ee6ca1aefd fsmonitor: refactor refresh callback for non-directory events
     @@ Metadata
       ## Commit message ##
          fsmonitor: refactor refresh callback for non-directory events
      
     +    Move the code handle unqualified FSEvents (without a trailing slash)
     +    into a helper function.
     +
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     @@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
       	return result;
       }
       
     -+static void fsmonitor_refresh_callback_unqualified(
     -+	struct index_state *istate, const char *name, int len, int pos)
     ++static void handle_path_without_trailing_slash(
     ++	struct index_state *istate, const char *name, int pos)
      +{
      +	int i;
      +
     @@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
      +		 * between "name" and "name/", such as "name-" and
      +		 * "name.".
      +		 */
     ++		int len = strlen(name);
      +		pos = -pos - 1;
      +
      +		for (i = pos; i < istate->cache_nr; i++) {
     @@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
      +	}
      +}
      +
     - static void fsmonitor_refresh_callback_slash(
     - 	struct index_state *istate, const char *name, int len, int pos)
     - {
     -@@ fsmonitor.c: static void fsmonitor_refresh_callback_slash(
     + /*
     +  * The daemon can decorate directory events, such as a move or rename,
     +  * by adding a trailing slash to the observed name.  Use this to
     +@@ fsmonitor.c: static void handle_path_with_trailing_slash(
       
       static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
       {
     @@ fsmonitor.c: static void fsmonitor_refresh_callback(struct index_state *istate,
      -			if (istate->cache[i]->name[len] == '/')
      -				istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
      -		}
     -+		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
     ++		handle_path_without_trailing_slash(istate, name, pos);
       	}
       
       	/*
  -:  ----------- >  7:  99c0d3e0742 dir: create untracked_cache_invalidate_trimmed_path()
  -:  ----------- >  8:  f2d6765d84f fsmonitor: refactor untracked-cache invalidation
  7:  1df4019931c !  9:  af6f57ab3e6 fsmonitor: refactor untracked-cache invalidation
     @@ Metadata
      Author: Jeff Hostetler <jeffhostetler@github.com>
      
       ## Commit message ##
     -    fsmonitor: refactor untracked-cache invalidation
     +    fsmonitor: move untracked invalidation into helper functions
     +
     +    Move the call to invalidate the untracked cache for the FSEvent
     +    pathname into the two helper functions.
     +
     +    In a later commit in this series, we will call these helpers
     +    from other contexts and it safer to include the UC invalidation
     +    in the helper than to remember to also add it to each helper
     +    call-site.
      
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     -@@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
     - 	return result;
     - }
     - 
     -+/*
     -+ * Invalidate the untracked cache for the given pathname.  Copy the
     -+ * buffer to a proper null-terminated string (since the untracked
     -+ * cache code does not use (buf, len) style argument).  Also strip any
     -+ * trailing slash.
     -+ */
     -+static void my_invalidate_untracked_cache(
     -+	struct index_state *istate, const char *name, int len)
     -+{
     -+	struct strbuf work_path = STRBUF_INIT;
     -+
     -+	if (!len)
     -+		return;
     -+
     -+	if (name[len-1] == '/')
     -+		len--;
     -+
     -+	strbuf_add(&work_path, name, len);
     -+	untracked_cache_invalidate_path(istate, work_path.buf, 0);
     -+	strbuf_release(&work_path);
     -+}
     -+
     - static void fsmonitor_refresh_callback_unqualified(
     - 	struct index_state *istate, const char *name, int len, int pos)
     +@@ fsmonitor.c: static void handle_path_without_trailing_slash(
       {
       	int i;
       
     -+	my_invalidate_untracked_cache(istate, name, len);
     ++	/*
     ++	 * Mark the untracked cache dirty for this path (regardless of
     ++	 * whether or not we find an exact match for it in the index).
     ++	 * Since the path is unqualified (no trailing slash hint in the
     ++	 * FSEvent), it may refer to a file or directory. So we should
     ++	 * not assume one or the other and should always let the untracked
     ++	 * cache decide what needs to invalidated.
     ++	 */
     ++	untracked_cache_invalidate_trimmed_path(istate, name, 0);
      +
       	if (pos >= 0) {
       		/*
       		 * We have an exact match for this path and can just
     -@@ fsmonitor.c: static int fsmonitor_refresh_callback_slash(
     +@@ fsmonitor.c: static void handle_path_with_trailing_slash(
     + {
       	int i;
     - 	int nr_in_cone = 0;
       
     -+	my_invalidate_untracked_cache(istate, name, len);
     ++	/*
     ++	 * Mark the untracked cache dirty for this directory path
     ++	 * (regardless of whether or not we find an exact match for it
     ++	 * in the index or find it to be proper prefix of one or more
     ++	 * files in the index), since the FSEvent is hinting that
     ++	 * there may be changes on or within the directory.
     ++	 */
     ++	untracked_cache_invalidate_trimmed_path(istate, name, 0);
      +
       	if (pos < 0)
       		pos = -pos - 1;
       
      @@ fsmonitor.c: static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
     - 
     - 	if (name[len - 1] == '/') {
     - 		fsmonitor_refresh_callback_slash(istate, name, len, pos);
     --
     --		/*
     --		 * We need to remove the traling "/" from the path
     --		 * for the untracked cache.
     --		 */
     --		name[len - 1] = '\0';
       	} else {
     - 		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
     + 		handle_path_without_trailing_slash(istate, name, pos);
       	}
      -
      -	/*
      -	 * Mark the untracked cache dirty even if it wasn't found in the index
     --	 * as it could be a new untracked file.
     +-	 * as it could be a new untracked file.  (Let the untracked cache
     +-	 * layer silently deal with any trailing slash.)
      -	 */
     --	untracked_cache_invalidate_path(istate, name, 0);
     +-	untracked_cache_invalidate_trimmed_path(istate, name, 0);
       }
       
       /*
  -:  ----------- > 10:  623c6f06e21 fsmonitor: return invalidated cache-entry count on directory event
  9:  a0cc4c8274c ! 11:  1853f77d333 fsmonitor: refactor non-directory callback
     @@ Metadata
      Author: Jeff Hostetler <jeffhostetler@github.com>
      
       ## Commit message ##
     -    fsmonitor: refactor non-directory callback
     +    fsmonitor: remove custom loop from non-directory path handler
      
     -    Refactor the fsmonitor_refresh_callback_unqualified() code
     -    to try to use the _callback_slash() code and avoid having
     -    a custom filter in the child cache-entry scanner.
     +    Refactor the code that handles refresh events for pathnames that do
     +    not contain a trailing slash.  Instead of using a custom loop to try
     +    to scan the index and detect if the FSEvent named a file or might be a
     +    directory prefix, use the recently created helper function to do that.
     +
     +    Also update the comments to describe what and why we are doing this.
      
          On platforms that DO NOT annotate FS events with a trailing
          slash, if we fail to find an exact match for the pathname
     @@ Commit message
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     -@@ fsmonitor.c: static int my_callback_dir_name_hash(
     - 	return nr_in_cone;
     +@@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
     + 	return result;
       }
       
     --static void fsmonitor_refresh_callback_unqualified(
     ++static size_t handle_path_with_trailing_slash(
     ++	struct index_state *istate, const char *name, int pos);
     ++
      +/*
      + * The daemon sent an observed pathname without a trailing slash.
      + * (This is the normal case.)  We do not know if it is a tracked or
     @@ fsmonitor.c: static int my_callback_dir_name_hash(
      + * do not know it is case-correct or -incorrect.
      + *
      + * Assume it is case-correct and try an exact match.
     -+ *
     -+ * Return the number of cache-entries that we invalidated.
      + */
     -+static int fsmonitor_refresh_callback_unqualified(
     - 	struct index_state *istate, const char *name, int len, int pos)
     + static void handle_path_without_trailing_slash(
     + 	struct index_state *istate, const char *name, int pos)
       {
      -	int i;
      -
     - 	my_invalidate_untracked_cache(istate, name, len);
     + 	/*
     + 	 * Mark the untracked cache dirty for this path (regardless of
     + 	 * whether or not we find an exact match for it in the index).
     +@@ fsmonitor.c: static void handle_path_without_trailing_slash(
       
       	if (pos >= 0) {
       		/*
     @@ fsmonitor.c: static int my_callback_dir_name_hash(
      +		 * at that directory. (That is, assume no D/F conflicts.)
       		 */
       		istate->cache[pos]->ce_flags &= ~CE_FSMONITOR_VALID;
     -+		return 1;
       	} else {
     -+		int nr_in_cone;
      +		struct strbuf work_path = STRBUF_INIT;
      +
       		/*
     @@ fsmonitor.c: static int my_callback_dir_name_hash(
      +		 * "foo" and "foo/" like "foo-" or "foo-bar", so we
      +		 * don't want to do our own scan.
       		 */
     +-		int len = strlen(name);
      -		pos = -pos - 1;
      -
      -		for (i = pos; i < istate->cache_nr; i++) {
     @@ fsmonitor.c: static int my_callback_dir_name_hash(
      -			if (istate->cache[i]->name[len] == '/')
      -				istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
      -		}
     -+		strbuf_add(&work_path, name, len);
     ++		strbuf_add(&work_path, name, strlen(name));
      +		strbuf_addch(&work_path, '/');
      +		pos = index_name_pos(istate, work_path.buf, work_path.len);
     -+		nr_in_cone = fsmonitor_refresh_callback_slash(
     -+			istate, work_path.buf, work_path.len, pos);
     ++		handle_path_with_trailing_slash(istate, work_path.buf, pos);
      +		strbuf_release(&work_path);
     -+		return nr_in_cone;
       	}
       }
       
 10:  bf18401f56c ! 12:  f77d68c78ad fsmonitor: support case-insensitive non-directory events
     @@ Metadata
      Author: Jeff Hostetler <jeffhostetler@github.com>
      
       ## Commit message ##
     -    fsmonitor: support case-insensitive non-directory events
     +    fsmonitor: return invalided cache-entry count on non-directory event
     +
     +    Teah the refresh callback helper function for unqualified FSEvents
     +    (pathnames without a trailing slash) to return the number of
     +    cache-entries that were invalided in response to the event.
     +
     +    This will be used in a later commit to help determine if the observed
     +    pathname was (possibly) case-incorrect when (on a case-insensitive
     +    file system).
      
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     -@@ fsmonitor.c: static int fsmonitor_refresh_callback_unqualified(
     - 	}
     - }
     - 
     -+/*
     -+ * On a case-insensitive FS, use the name-hash to map the case of
     -+ * the observed path to the canonical case expected by the index.
     -+ *
     -+ * The given pathname DOES NOT include the trailing slash.
     +@@ fsmonitor.c: static size_t handle_path_with_trailing_slash(
     +  * do not know it is case-correct or -incorrect.
     +  *
     +  * Assume it is case-correct and try an exact match.
      + *
      + * Return the number of cache-entries that we invalidated.
     -+ */
     -+static int fsmonitor_refresh_callback_unqualified_icase(
     -+	struct index_state *istate, const char *name, int len)
     -+{
     -+	int nr_in_cone;
     -+
     -+	/*
     -+	 * Look for a case-incorrect match for this non-directory
     -+	 * pathname.
     -+	 */
     -+	nr_in_cone = my_callback_name_hash(istate, name, len);
     -+	if (nr_in_cone)
     -+		return nr_in_cone;
     -+
     -+	/*
     -+	 * Try the directory name-hash and see if there is a
     -+	 * case-incorrect directory with this pathanme.
     -+	 * (len) because we don't have a trailing slash.
     -+	 */
     -+	nr_in_cone = my_callback_dir_name_hash(istate, name, len);
     -+	return nr_in_cone;
     -+}
     -+
     - /*
     -  * The daemon can decorate directory events, such as a move or rename,
     -  * by adding a trailing slash to the observed name.  Use this to
     -@@ fsmonitor.c: static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
     - 		if (ignore_case && !nr_in_cone)
     - 			fsmonitor_refresh_callback_slash_icase(istate, name, len);
     +  */
     +-static void handle_path_without_trailing_slash(
     ++static size_t handle_path_without_trailing_slash(
     + 	struct index_state *istate, const char *name, int pos)
     + {
     + 	/*
     +@@ fsmonitor.c: static void handle_path_without_trailing_slash(
     + 		 * at that directory. (That is, assume no D/F conflicts.)
     + 		 */
     + 		istate->cache[pos]->ce_flags &= ~CE_FSMONITOR_VALID;
     ++		return 1;
       	} else {
     --		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
     -+		nr_in_cone = fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
     -+		if (ignore_case && !nr_in_cone)
     -+			fsmonitor_refresh_callback_unqualified_icase(istate, name, len);
     ++		size_t nr_in_cone;
     + 		struct strbuf work_path = STRBUF_INIT;
     + 
     + 		/*
     +@@ fsmonitor.c: static void handle_path_without_trailing_slash(
     + 		strbuf_add(&work_path, name, strlen(name));
     + 		strbuf_addch(&work_path, '/');
     + 		pos = index_name_pos(istate, work_path.buf, work_path.len);
     +-		handle_path_with_trailing_slash(istate, work_path.buf, pos);
     ++		nr_in_cone = handle_path_with_trailing_slash(
     ++			istate, work_path.buf, pos);
     + 		strbuf_release(&work_path);
     ++		return nr_in_cone;
       	}
       }
       
  -:  ----------- > 13:  58b36673e15 fsmonitor: trace the new invalidated cache-entry count
  8:  e0029a2aad6 ! 14:  288f3f4e54e fsmonitor: support case-insensitive directory events
     @@ Metadata
      Author: Jeff Hostetler <jeffhostetler@github.com>
      
       ## Commit message ##
     -    fsmonitor: support case-insensitive directory events
     +    fsmonitor: support case-insensitive events
      
          Teach fsmonitor_refresh_callback() to handle case-insensitive
          lookups if case-sensitive lookups fail on case-insensitive systems.
     @@ Commit message
          to find the associated cache-entry. This causes status to think that
          the cached CE flags are correct and skip over the file.
      
     -    Update the handling of directory-style FSEvents (ones containing a
     -    path with a trailing slash) to optionally use the name-hash if the
     -    case-correct search does not find a match.
     -
     -    (The FSMonitor daemon can send directory FSEvents if the OS provides
     -    that information.)
     +    Update event handling to optionally use the name-hash and dir-name-hash
     +    if necessary.
      
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
     @@ fsmonitor.c
       #include "strbuf.h"
       #include "trace2.h"
      @@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
     - 	return result;
     - }
     - 
     -+static int fsmonitor_refresh_callback_slash(
     -+	struct index_state *istate, const char *name, int len, int pos);
     -+
     - /*
     -  * Invalidate the untracked cache for the given pathname.  Copy the
     -  * buffer to a proper null-terminated string (since the untracked
     -@@ fsmonitor.c: static void my_invalidate_untracked_cache(
     - 	strbuf_release(&work_path);
     - }
     + static size_t handle_path_with_trailing_slash(
     + 	struct index_state *istate, const char *name, int pos);
       
      +/*
     -+ * Use the name-hash to lookup the pathname.
     ++ * Use the name-hash to do a case-insensitive cache-entry lookup with
     ++ * the pathname and invalidate the cache-entry.
      + *
      + * Returns the number of cache-entries that we invalidated.
      + */
     -+static int my_callback_name_hash(
     -+	struct index_state *istate, const char *name, int len)
     ++static size_t handle_using_name_hash_icase(
     ++	struct index_state *istate, const char *name)
      +{
      +	struct cache_entry *ce = NULL;
      +
     -+	ce = index_file_exists(istate, name, len, 1);
     ++	ce = index_file_exists(istate, name, strlen(name), 1);
      +	if (!ce)
      +		return 0;
      +
      +	/*
     -+	 * The index contains a case-insensitive match for the pathname.
     -+	 * This could either be a regular file or a sparse-index directory.
     ++	 * A case-insensitive search in the name-hash using the
     ++	 * observed pathname found a cache-entry, so the observed path
     ++	 * is case-incorrect.  Invalidate the cache-entry and use the
     ++	 * correct spelling from the cache-entry to invalidate the
     ++	 * untracked-cache.  Since we now have sparse-directories in
     ++	 * the index, the observed pathname may represent a regular
     ++	 * file or a sparse-index directory.
      +	 *
     -+	 * We should not have seen FSEvents for a sparse-index directory,
     -+	 * but we handle it just in case.
     ++	 * Note that we should not have seen FSEvents for a
     ++	 * sparse-index directory, but we handle it just in case.
      +	 *
      +	 * Either way, we know that there are not any cache-entries for
      +	 * children inside the cone of the directory, so we don't need to
      +	 * do the usual scan.
      +	 */
      +	trace_printf_key(&trace_fsmonitor,
     -+			 "fsmonitor_refresh_callback map '%s' '%s'",
     ++			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
      +			 name, ce->name);
      +
     -+	my_invalidate_untracked_cache(istate, ce->name, ce->ce_namelen);
     ++	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
      +
      +	ce->ce_flags &= ~CE_FSMONITOR_VALID;
      +	return 1;
      +}
      +
      +/*
     -+ * Use the directory name-hash to find the correct-case spelling
     -+ * of the directory.  Use the canonical spelling to invalidate all
     -+ * of the cache-entries within the matching cone.
     -+ *
     -+ * The pathname MUST NOT have a trailing slash.
     ++ * Use the dir-name-hash to find the correct-case spelling of the
     ++ * directory.  Use the canonical spelling to invalidate all of the
     ++ * cache-entries within the matching cone.
      + *
      + * Returns the number of cache-entries that we invalidated.
      + */
     -+static int my_callback_dir_name_hash(
     -+	struct index_state *istate, const char *name, int len)
     ++static size_t handle_using_dir_name_hash_icase(
     ++	struct index_state *istate, const char *name)
      +{
      +	struct strbuf canonical_path = STRBUF_INIT;
      +	int pos;
     -+	int nr_in_cone;
     ++	size_t len = strlen(name);
     ++	size_t nr_in_cone;
     ++
     ++	if (name[len - 1] == '/')
     ++		len--;
      +
     -+	if (!index_dir_exists2(istate, name, len, &canonical_path))
     ++	if (!index_dir_find(istate, name, len, &canonical_path))
      +		return 0; /* name is untracked */
     -+	if (!memcmp(name, canonical_path.buf, len)) {
     ++
     ++	if (!memcmp(name, canonical_path.buf, canonical_path.len)) {
      +		strbuf_release(&canonical_path);
     ++		/*
     ++		 * NEEDSWORK: Our caller already tried an exact match
     ++		 * and failed to find one.  They called us to do an
     ++		 * ICASE match, so we should never get an exact match,
     ++		 * so we could promote this to a BUG() here if we
     ++		 * wanted to.  It doesn't hurt anything to just return
     ++		 * 0 and go on becaus we should never get here.  Or we
     ++		 * could just get rid of the memcmp() and this "if"
     ++		 * clause completely.
     ++		 */
      +		return 0; /* should not happen */
      +	}
      +
      +	trace_printf_key(&trace_fsmonitor,
     -+			 "fsmonitor_refresh_callback map '%s' '%s'",
     ++			 "fsmonitor_refresh_callback MAP: '%s' '%s'",
      +			 name, canonical_path.buf);
      +
      +	/*
     -+	 * The directory name-hash only tells us the corrected
     -+	 * spelling of the prefix.  We have to use this canonical
     -+	 * path to do a lookup in the cache-entry array so that we
     -+	 * we repeat the original search using the case-corrected
     -+	 * spelling.
     ++	 * The dir-name-hash only tells us the corrected spelling of
     ++	 * the prefix.  We have to use this canonical path to do a
     ++	 * lookup in the cache-entry array so that we repeat the
     ++	 * original search using the case-corrected spelling.
      +	 */
      +	strbuf_addch(&canonical_path, '/');
      +	pos = index_name_pos(istate, canonical_path.buf,
      +			     canonical_path.len);
     -+	nr_in_cone = fsmonitor_refresh_callback_slash(
     -+		istate, canonical_path.buf, canonical_path.len, pos);
     ++	nr_in_cone = handle_path_with_trailing_slash(
     ++		istate, canonical_path.buf, pos);
      +	strbuf_release(&canonical_path);
      +	return nr_in_cone;
      +}
      +
     - static void fsmonitor_refresh_callback_unqualified(
     - 	struct index_state *istate, const char *name, int len, int pos)
     - {
     -@@ fsmonitor.c: static void fsmonitor_refresh_callback_unqualified(
     -  *
     -  * Return the number of cache-entries that we invalidated.  We will
     -  * use this later to determine if we need to attempt a second
     -- * case-insensitive search.
     -+ * case-insensitive search.  That is, if a observed-case search yields
     -+ * any results, we assume the prefix is case-correct.  If there are
     -+ * no matches, we still don't know if the observed path is simply
     -+ * untracked or case-incorrect.
     -  */
     - static int fsmonitor_refresh_callback_slash(
     - 	struct index_state *istate, const char *name, int len, int pos)
     -@@ fsmonitor.c: static int fsmonitor_refresh_callback_slash(
     - 	return nr_in_cone;
     - }
     + /*
     +  * The daemon sent an observed pathname without a trailing slash.
     +  * (This is the normal case.)  We do not know if it is a tracked or
     +@@ fsmonitor.c: static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
     + 	else
     + 		nr_in_cone = handle_path_without_trailing_slash(istate, name, pos);
       
     -+/*
     -+ * On a case-insensitive FS, use the name-hash and directory name-hash
     -+ * to map the case of the observed path to the canonical case expected
     -+ * by the index.
     -+ *
     -+ * The given pathname includes the trailing slash.
     -+ *
     -+ * Return the number of cache-entries that we invalidated.
     -+ */
     -+static int fsmonitor_refresh_callback_slash_icase(
     -+	struct index_state *istate, const char *name, int len)
     -+{
     -+	int nr_in_cone;
     -+
     -+	/*
     -+	 * Look for a case-incorrect sparse-index directory.
     -+	 */
     -+	nr_in_cone = my_callback_name_hash(istate, name, len);
     -+	if (nr_in_cone)
     -+		return nr_in_cone;
     -+
      +	/*
     -+	 * (len-1) because we do not include the trailing slash in the
     -+	 * pathname.
     ++	 * If we did not find an exact match for this pathname or any
     ++	 * cache-entries with this directory prefix and we're on a
     ++	 * case-insensitive file system, try again using the name-hash
     ++	 * and dir-name-hash.
      +	 */
     -+	nr_in_cone = my_callback_dir_name_hash(istate, name, len-1);
     -+	return nr_in_cone;
     -+}
     -+
     - static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
     - {
     - 	int len = strlen(name);
     - 	int pos = index_name_pos(istate, name, len);
     -+	int nr_in_cone;
     ++	if (!nr_in_cone && ignore_case) {
     ++		nr_in_cone = handle_using_name_hash_icase(istate, name);
     ++		if (!nr_in_cone)
     ++			nr_in_cone = handle_using_dir_name_hash_icase(
     ++				istate, name);
     ++	}
      +
     - 
     - 	trace_printf_key(&trace_fsmonitor,
     - 			 "fsmonitor_refresh_callback '%s' (pos %d)",
     - 			 name, pos);
     - 
     - 	if (name[len - 1] == '/') {
     --		fsmonitor_refresh_callback_slash(istate, name, len, pos);
     -+		nr_in_cone = fsmonitor_refresh_callback_slash(istate, name, len, pos);
     -+		if (ignore_case && !nr_in_cone)
     -+			fsmonitor_refresh_callback_slash_icase(istate, name, len);
     - 	} else {
     - 		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
     - 	}
     + 	if (nr_in_cone)
     + 		trace_printf_key(&trace_fsmonitor,
     + 				 "fsmonitor_refresh_callback CNT: %d",
 11:  7775de735f4 ! 15:  3a20065dbf8 fsmonitor: refactor bit invalidation in refresh callback
     @@ Commit message
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## fsmonitor.c ##
     -@@ fsmonitor.c: static void my_invalidate_untracked_cache(
     - 	strbuf_release(&work_path);
     - }
     +@@ fsmonitor.c: static int query_fsmonitor_hook(struct repository *r,
     + static size_t handle_path_with_trailing_slash(
     + 	struct index_state *istate, const char *name, int pos);
       
      +/*
      + * Invalidate the FSM bit on this CE.  This is like mark_fsmonitor_invalid()
      + * but we've already handled the untracked-cache and I want a different
      + * trace message.
      + */
     -+static void my_invalidate_ce_fsm(struct cache_entry *ce)
     ++static void invalidate_ce_fsm(struct cache_entry *ce)
      +{
      +	if (ce->ce_flags & CE_FSMONITOR_VALID)
      +		trace_printf_key(&trace_fsmonitor,
     -+				 "fsmonitor_refresh_cb_invalidate '%s'",
     ++				 "fsmonitor_refresh_callback INV: '%s'",
      +				 ce->name);
      +	ce->ce_flags &= ~CE_FSMONITOR_VALID;
      +}
      +
       /*
     -  * Use the name-hash to lookup the pathname.
     -  *
     -@@ fsmonitor.c: static int my_callback_name_hash(
     +  * Use the name-hash to do a case-insensitive cache-entry lookup with
     +  * the pathname and invalidate the cache-entry.
     +@@ fsmonitor.c: static size_t handle_using_name_hash_icase(
       
     - 	my_invalidate_untracked_cache(istate, ce->name, ce->ce_namelen);
     + 	untracked_cache_invalidate_trimmed_path(istate, ce->name, 0);
       
      -	ce->ce_flags &= ~CE_FSMONITOR_VALID;
     -+	my_invalidate_ce_fsm(ce);
     ++	invalidate_ce_fsm(ce);
       	return 1;
       }
       
     -@@ fsmonitor.c: static int fsmonitor_refresh_callback_unqualified(
     +@@ fsmonitor.c: static size_t handle_path_without_trailing_slash(
       		 * cache-entry with the same pathname, nor for a cone
       		 * at that directory. (That is, assume no D/F conflicts.)
       		 */
      -		istate->cache[pos]->ce_flags &= ~CE_FSMONITOR_VALID;
     -+		my_invalidate_ce_fsm(istate->cache[pos]);
     ++		invalidate_ce_fsm(istate->cache[pos]);
       		return 1;
       	} else {
     - 		int nr_in_cone;
     -@@ fsmonitor.c: static int fsmonitor_refresh_callback_slash(
     + 		size_t nr_in_cone;
     +@@ fsmonitor.c: static size_t handle_path_with_trailing_slash(
       	for (i = pos; i < istate->cache_nr; i++) {
       		if (!starts_with(istate->cache[i]->name, name))
       			break;
      -		istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
     -+		my_invalidate_ce_fsm(istate->cache[i]);
     ++		invalidate_ce_fsm(istate->cache[i]);
       		nr_in_cone++;
       	}
       
 12:  63edb68303f ! 16:  467d3c1fe2c t7527: update case-insenstive fsmonitor test
     @@ Commit message
      
          Now that the FSMonitor client has been updated to better
          handle events on case-insenstive file systems, update the
     -    two tests that demonstrated the bug.
     +    two tests that demonstrated the bug and remove the temporary
     +    SKIPME prereq.
      
          Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
      
       ## t/t7527-builtin-fsmonitor.sh ##
     -@@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
     +@@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'split-index and FSMonitor work well together' '
     + #
     + # The setup is a little contrived.
     + #
     +-test_expect_success SKIPME,CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
     ++test_expect_success CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on disk' '
     + 	test_when_finished "stop_daemon_delete_repo subdir_case_wrong" &&
     + 
     + 	git init subdir_case_wrong &&
     +@@ t/t7527-builtin-fsmonitor.sh: test_expect_success SKIPME,CASE_INSENSITIVE_FS 'fsmonitor subdir case wrong on d
       
       	grep -q "dir1/DIR2/dir3/file3.*pos -3" "$PWD/subdir_case_wrong.log1" &&
       
      +	# Also verify that we get a mapping event to correct the case.
     -+	grep -q "map.*dir1/DIR2/dir3/file3.*dir1/dir2/dir3/file3" \
     ++	grep -q "MAP:.*dir1/DIR2/dir3/file3.*dir1/dir2/dir3/file3" \
      +		"$PWD/subdir_case_wrong.log1" &&
      +
       	# The refresh-callbacks should have caused "git status" to clear
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'fsmonitor
      +	grep -q " M dir1/dir2/dir3/file3" "$PWD/subdir_case_wrong.out"
       '
       
     - test_expect_success CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
     -@@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
     +-test_expect_success SKIPME,CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
     ++test_expect_success CASE_INSENSITIVE_FS 'fsmonitor file case wrong on disk' '
     + 	test_when_finished "stop_daemon_delete_repo file_case_wrong" &&
     + 
     + 	git init file_case_wrong &&
     +@@ t/t7527-builtin-fsmonitor.sh: test_expect_success SKIPME,CASE_INSENSITIVE_FS 'fsmonitor file case wrong on dis
       	grep -q "fsmonitor_refresh_callback.*FILE-3-A.*pos -3" "$PWD/file_case_wrong-try3.log" &&
       	grep -q "fsmonitor_refresh_callback.*file-4-a.*pos -9" "$PWD/file_case_wrong-try3.log" &&
       
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'fsmonitor
      -	! grep -q " M dir1/dir2/dir3/file-3-a" "$PWD/file_case_wrong-try3.out" &&
      -	! grep -q " M dir1/dir2/dir4/FILE-4-A" "$PWD/file_case_wrong-try3.out"
      +	# Also verify that we get a mapping event to correct the case.
     -+	grep -q "fsmonitor_refresh_callback map.*dir1/dir2/dir3/FILE-3-A.*dir1/dir2/dir3/file-3-a" \
     ++	grep -q "fsmonitor_refresh_callback MAP:.*dir1/dir2/dir3/FILE-3-A.*dir1/dir2/dir3/file-3-a" \
      +		"$PWD/file_case_wrong-try3.log" &&
     -+	grep -q "fsmonitor_refresh_callback map.*dir1/dir2/dir4/file-4-a.*dir1/dir2/dir4/FILE-4-A" \
     ++	grep -q "fsmonitor_refresh_callback MAP:.*dir1/dir2/dir4/file-4-a.*dir1/dir2/dir4/FILE-4-A" \
      +		"$PWD/file_case_wrong-try3.log" &&
      +
      +	grep -q " M dir1/dir2/dir3/file-3-a" "$PWD/file_case_wrong-try3.out" &&

-- 
gitgitgadget


^ permalink raw reply	[relevance 2%]

* Re: [PATCH 08/12] fsmonitor: support case-insensitive directory events
  2024-02-13 20:52  4% ` [PATCH 08/12] fsmonitor: support case-insensitive directory events Jeff Hostetler via GitGitGadget
@ 2024-02-15  9:32  4%   ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2024-02-15  9:32 UTC (permalink / raw)
  To: Jeff Hostetler via GitGitGadget; +Cc: git, Jeff Hostetler

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

On Tue, Feb 13, 2024 at 08:52:17PM +0000, Jeff Hostetler via GitGitGadget wrote:
> From: Jeff Hostetler <jeffhostetler@github.com>
> 
> Teach fsmonitor_refresh_callback() to handle case-insensitive
> lookups if case-sensitive lookups fail on case-insensitive systems.
> This can cause 'git status' to report stale status for files if there
> are case issues/errors in the worktree.
> 
> The FSMonitor daemon sends FSEvents using the observed spelling
> of each pathname.  On case-insensitive file systems this may be
> different than the expected case spelling.
> 
> The existing code uses index_name_pos() to find the cache-entry for
> the pathname in the FSEvent and clear the CE_FSMONITOR_VALID bit so
> that the worktree scan/index refresh will revisit and revalidate the
> path.
> 
> On a case-insensitive file system, the exact match lookup may fail
> to find the associated cache-entry. This causes status to think that
> the cached CE flags are correct and skip over the file.
> 
> Update the handling of directory-style FSEvents (ones containing a
> path with a trailing slash) to optionally use the name-hash if the
> case-correct search does not find a match.
> 
> (The FSMonitor daemon can send directory FSEvents if the OS provides
> that information.)
> 
> Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
> ---
>  fsmonitor.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 120 insertions(+), 2 deletions(-)
> 
> diff --git a/fsmonitor.c b/fsmonitor.c
> index 14585b6c516..73e6ac82af7 100644
> --- a/fsmonitor.c
> +++ b/fsmonitor.c
> @@ -5,6 +5,7 @@
>  #include "ewah/ewok.h"
>  #include "fsmonitor.h"
>  #include "fsmonitor-ipc.h"
> +#include "name-hash.h"
>  #include "run-command.h"
>  #include "strbuf.h"
>  #include "trace2.h"
> @@ -183,6 +184,9 @@ static int query_fsmonitor_hook(struct repository *r,
>  	return result;
>  }
>  
> +static int fsmonitor_refresh_callback_slash(
> +	struct index_state *istate, const char *name, int len, int pos);
> +
>  /*
>   * Invalidate the untracked cache for the given pathname.  Copy the
>   * buffer to a proper null-terminated string (since the untracked
> @@ -205,6 +209,84 @@ static void my_invalidate_untracked_cache(
>  	strbuf_release(&work_path);
>  }
>  
> +/*
> + * Use the name-hash to lookup the pathname.
> + *
> + * Returns the number of cache-entries that we invalidated.
> + */

The function not only looks up the path name, but also invalidates the
corresponding cache entry. You imply this with the second sentence, but
this could be a bit more explicit.

> +static int my_callback_name_hash(
> +	struct index_state *istate, const char *name, int len)

I find the naming conventions here to be weird with the `my_` prefix.

> +{
> +	struct cache_entry *ce = NULL;
> +
> +	ce = index_file_exists(istate, name, len, 1);
> +	if (!ce)
> +		return 0;

Okay, `index_file_exists()` is called with `icase == 1` here. But is
that the correct thing to do on case-sensitive platforms? I would have
expected us to honor `core.ignoreCase` here.

Turns out, we only end up calling this function when `ignore_case` is
set, so we already do. I think this can be clarified both by giving the
function a better name and by documenting this in the comment. Also,
neither of this or the next function really are callbacks -- they only
happen to be called by a callback function.

I'd think something like `lookup_and_invalidate_path_icase()` and
`lookup_and_invalidate_dir_icase()` could help to clarify intent.

> +	/*
> +	 * The index contains a case-insensitive match for the pathname.
> +	 * This could either be a regular file or a sparse-index directory.
> +	 *
> +	 * We should not have seen FSEvents for a sparse-index directory,
> +	 * but we handle it just in case.
> +	 *
> +	 * Either way, we know that there are not any cache-entries for
> +	 * children inside the cone of the directory, so we don't need to
> +	 * do the usual scan.
> +	 */
> +	trace_printf_key(&trace_fsmonitor,
> +			 "fsmonitor_refresh_callback map '%s' '%s'",
> +			 name, ce->name);
> +
> +	my_invalidate_untracked_cache(istate, ce->name, ce->ce_namelen);
> +
> +	ce->ce_flags &= ~CE_FSMONITOR_VALID;
> +	return 1;
> +}
> +
> +/*
> + * Use the directory name-hash to find the correct-case spelling
> + * of the directory.  Use the canonical spelling to invalidate all
> + * of the cache-entries within the matching cone.
> + *
> + * The pathname MUST NOT have a trailing slash.
> + *
> + * Returns the number of cache-entries that we invalidated.
> + */
> +static int my_callback_dir_name_hash(
> +	struct index_state *istate, const char *name, int len)
> +{
> +	struct strbuf canonical_path = STRBUF_INIT;
> +	int pos;
> +	int nr_in_cone;
> +
> +	if (!index_dir_exists2(istate, name, len, &canonical_path))
> +		return 0; /* name is untracked */
> +	if (!memcmp(name, canonical_path.buf, len)) {
> +		strbuf_release(&canonical_path);
> +		return 0; /* should not happen */
> +	}

So in other words, this function should only be called when we know that
casing differs, and thus the passed-in name and the canonical name
should never be the same? If this case shouldn't ever happen, shouldn't
we report this as an error or use `BUG()` instead of silently ignoring
this mismatch of expectations?

Patrick

> +	trace_printf_key(&trace_fsmonitor,
> +			 "fsmonitor_refresh_callback map '%s' '%s'",
> +			 name, canonical_path.buf);
> +
> +	/*
> +	 * The directory name-hash only tells us the corrected
> +	 * spelling of the prefix.  We have to use this canonical
> +	 * path to do a lookup in the cache-entry array so that we
> +	 * we repeat the original search using the case-corrected
> +	 * spelling.
> +	 */
> +	strbuf_addch(&canonical_path, '/');
> +	pos = index_name_pos(istate, canonical_path.buf,
> +			     canonical_path.len);
> +	nr_in_cone = fsmonitor_refresh_callback_slash(
> +		istate, canonical_path.buf, canonical_path.len, pos);
> +	strbuf_release(&canonical_path);
> +	return nr_in_cone;
> +}
> +
>  static void fsmonitor_refresh_callback_unqualified(
>  	struct index_state *istate, const char *name, int len, int pos)
>  {
> @@ -269,7 +351,10 @@ static void fsmonitor_refresh_callback_unqualified(
>   *
>   * Return the number of cache-entries that we invalidated.  We will
>   * use this later to determine if we need to attempt a second
> - * case-insensitive search.
> + * case-insensitive search.  That is, if a observed-case search yields
> + * any results, we assume the prefix is case-correct.  If there are
> + * no matches, we still don't know if the observed path is simply
> + * untracked or case-incorrect.
>   */
>  static int fsmonitor_refresh_callback_slash(
>  	struct index_state *istate, const char *name, int len, int pos)
> @@ -293,17 +378,50 @@ static int fsmonitor_refresh_callback_slash(
>  	return nr_in_cone;
>  }
>  
> +/*
> + * On a case-insensitive FS, use the name-hash and directory name-hash
> + * to map the case of the observed path to the canonical case expected
> + * by the index.
> + *
> + * The given pathname includes the trailing slash.
> + *
> + * Return the number of cache-entries that we invalidated.
> + */
> +static int fsmonitor_refresh_callback_slash_icase(
> +	struct index_state *istate, const char *name, int len)
> +{
> +	int nr_in_cone;
> +
> +	/*
> +	 * Look for a case-incorrect sparse-index directory.
> +	 */
> +	nr_in_cone = my_callback_name_hash(istate, name, len);
> +	if (nr_in_cone)
> +		return nr_in_cone;
> +
> +	/*
> +	 * (len-1) because we do not include the trailing slash in the
> +	 * pathname.
> +	 */
> +	nr_in_cone = my_callback_dir_name_hash(istate, name, len-1);
> +	return nr_in_cone;
> +}
> +
>  static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
>  {
>  	int len = strlen(name);
>  	int pos = index_name_pos(istate, name, len);
> +	int nr_in_cone;
> +
>  
>  	trace_printf_key(&trace_fsmonitor,
>  			 "fsmonitor_refresh_callback '%s' (pos %d)",
>  			 name, pos);
>  
>  	if (name[len - 1] == '/') {
> -		fsmonitor_refresh_callback_slash(istate, name, len, pos);
> +		nr_in_cone = fsmonitor_refresh_callback_slash(istate, name, len, pos);
> +		if (ignore_case && !nr_in_cone)
> +			fsmonitor_refresh_callback_slash_icase(istate, name, len);
>  	} else {
>  		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
>  	}
> -- 
> gitgitgadget
> 
> 

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

^ permalink raw reply	[relevance 4%]

* [PATCH 08/12] fsmonitor: support case-insensitive directory events
  @ 2024-02-13 20:52  4% ` Jeff Hostetler via GitGitGadget
  2024-02-15  9:32  4%   ` Patrick Steinhardt
  2024-02-23  3:18  2% ` [PATCH v2 00/16] FSMonitor edge cases on case-insensitive file systems Jeff Hostetler via GitGitGadget
  1 sibling, 1 reply; 200+ results
From: Jeff Hostetler via GitGitGadget @ 2024-02-13 20:52 UTC (permalink / raw)
  To: git; +Cc: Jeff Hostetler, Jeff Hostetler

From: Jeff Hostetler <jeffhostetler@github.com>

Teach fsmonitor_refresh_callback() to handle case-insensitive
lookups if case-sensitive lookups fail on case-insensitive systems.
This can cause 'git status' to report stale status for files if there
are case issues/errors in the worktree.

The FSMonitor daemon sends FSEvents using the observed spelling
of each pathname.  On case-insensitive file systems this may be
different than the expected case spelling.

The existing code uses index_name_pos() to find the cache-entry for
the pathname in the FSEvent and clear the CE_FSMONITOR_VALID bit so
that the worktree scan/index refresh will revisit and revalidate the
path.

On a case-insensitive file system, the exact match lookup may fail
to find the associated cache-entry. This causes status to think that
the cached CE flags are correct and skip over the file.

Update the handling of directory-style FSEvents (ones containing a
path with a trailing slash) to optionally use the name-hash if the
case-correct search does not find a match.

(The FSMonitor daemon can send directory FSEvents if the OS provides
that information.)

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
---
 fsmonitor.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 120 insertions(+), 2 deletions(-)

diff --git a/fsmonitor.c b/fsmonitor.c
index 14585b6c516..73e6ac82af7 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -5,6 +5,7 @@
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
 #include "fsmonitor-ipc.h"
+#include "name-hash.h"
 #include "run-command.h"
 #include "strbuf.h"
 #include "trace2.h"
@@ -183,6 +184,9 @@ static int query_fsmonitor_hook(struct repository *r,
 	return result;
 }
 
+static int fsmonitor_refresh_callback_slash(
+	struct index_state *istate, const char *name, int len, int pos);
+
 /*
  * Invalidate the untracked cache for the given pathname.  Copy the
  * buffer to a proper null-terminated string (since the untracked
@@ -205,6 +209,84 @@ static void my_invalidate_untracked_cache(
 	strbuf_release(&work_path);
 }
 
+/*
+ * Use the name-hash to lookup the pathname.
+ *
+ * Returns the number of cache-entries that we invalidated.
+ */
+static int my_callback_name_hash(
+	struct index_state *istate, const char *name, int len)
+{
+	struct cache_entry *ce = NULL;
+
+	ce = index_file_exists(istate, name, len, 1);
+	if (!ce)
+		return 0;
+
+	/*
+	 * The index contains a case-insensitive match for the pathname.
+	 * This could either be a regular file or a sparse-index directory.
+	 *
+	 * We should not have seen FSEvents for a sparse-index directory,
+	 * but we handle it just in case.
+	 *
+	 * Either way, we know that there are not any cache-entries for
+	 * children inside the cone of the directory, so we don't need to
+	 * do the usual scan.
+	 */
+	trace_printf_key(&trace_fsmonitor,
+			 "fsmonitor_refresh_callback map '%s' '%s'",
+			 name, ce->name);
+
+	my_invalidate_untracked_cache(istate, ce->name, ce->ce_namelen);
+
+	ce->ce_flags &= ~CE_FSMONITOR_VALID;
+	return 1;
+}
+
+/*
+ * Use the directory name-hash to find the correct-case spelling
+ * of the directory.  Use the canonical spelling to invalidate all
+ * of the cache-entries within the matching cone.
+ *
+ * The pathname MUST NOT have a trailing slash.
+ *
+ * Returns the number of cache-entries that we invalidated.
+ */
+static int my_callback_dir_name_hash(
+	struct index_state *istate, const char *name, int len)
+{
+	struct strbuf canonical_path = STRBUF_INIT;
+	int pos;
+	int nr_in_cone;
+
+	if (!index_dir_exists2(istate, name, len, &canonical_path))
+		return 0; /* name is untracked */
+	if (!memcmp(name, canonical_path.buf, len)) {
+		strbuf_release(&canonical_path);
+		return 0; /* should not happen */
+	}
+
+	trace_printf_key(&trace_fsmonitor,
+			 "fsmonitor_refresh_callback map '%s' '%s'",
+			 name, canonical_path.buf);
+
+	/*
+	 * The directory name-hash only tells us the corrected
+	 * spelling of the prefix.  We have to use this canonical
+	 * path to do a lookup in the cache-entry array so that we
+	 * we repeat the original search using the case-corrected
+	 * spelling.
+	 */
+	strbuf_addch(&canonical_path, '/');
+	pos = index_name_pos(istate, canonical_path.buf,
+			     canonical_path.len);
+	nr_in_cone = fsmonitor_refresh_callback_slash(
+		istate, canonical_path.buf, canonical_path.len, pos);
+	strbuf_release(&canonical_path);
+	return nr_in_cone;
+}
+
 static void fsmonitor_refresh_callback_unqualified(
 	struct index_state *istate, const char *name, int len, int pos)
 {
@@ -269,7 +351,10 @@ static void fsmonitor_refresh_callback_unqualified(
  *
  * Return the number of cache-entries that we invalidated.  We will
  * use this later to determine if we need to attempt a second
- * case-insensitive search.
+ * case-insensitive search.  That is, if a observed-case search yields
+ * any results, we assume the prefix is case-correct.  If there are
+ * no matches, we still don't know if the observed path is simply
+ * untracked or case-incorrect.
  */
 static int fsmonitor_refresh_callback_slash(
 	struct index_state *istate, const char *name, int len, int pos)
@@ -293,17 +378,50 @@ static int fsmonitor_refresh_callback_slash(
 	return nr_in_cone;
 }
 
+/*
+ * On a case-insensitive FS, use the name-hash and directory name-hash
+ * to map the case of the observed path to the canonical case expected
+ * by the index.
+ *
+ * The given pathname includes the trailing slash.
+ *
+ * Return the number of cache-entries that we invalidated.
+ */
+static int fsmonitor_refresh_callback_slash_icase(
+	struct index_state *istate, const char *name, int len)
+{
+	int nr_in_cone;
+
+	/*
+	 * Look for a case-incorrect sparse-index directory.
+	 */
+	nr_in_cone = my_callback_name_hash(istate, name, len);
+	if (nr_in_cone)
+		return nr_in_cone;
+
+	/*
+	 * (len-1) because we do not include the trailing slash in the
+	 * pathname.
+	 */
+	nr_in_cone = my_callback_dir_name_hash(istate, name, len-1);
+	return nr_in_cone;
+}
+
 static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
 {
 	int len = strlen(name);
 	int pos = index_name_pos(istate, name, len);
+	int nr_in_cone;
+
 
 	trace_printf_key(&trace_fsmonitor,
 			 "fsmonitor_refresh_callback '%s' (pos %d)",
 			 name, pos);
 
 	if (name[len - 1] == '/') {
-		fsmonitor_refresh_callback_slash(istate, name, len, pos);
+		nr_in_cone = fsmonitor_refresh_callback_slash(istate, name, len, pos);
+		if (ignore_case && !nr_in_cone)
+			fsmonitor_refresh_callback_slash_icase(istate, name, len);
 	} else {
 		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
 	}
-- 
gitgitgadget



^ permalink raw reply related	[relevance 4%]

* Re: [PATCH] setup: allow cwd=.git w/ bareRepository=explicit
  @ 2024-01-22 20:50  5%   ` Kyle Lippincott
  0 siblings, 0 replies; 200+ results
From: Kyle Lippincott @ 2024-01-22 20:50 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Kyle Lippincott via GitGitGadget, git

On Sat, Jan 20, 2024 at 2:26 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Kyle Lippincott via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > From: Kyle Lippincott <spectral@google.com>
> >
> > The safe.bareRepository setting can be set to 'explicit' to disallow
> > implicit uses of bare repositories, preventing an attack [1] where an
> > artificial and malicious bare repository is embedded in another git
> > repository. Unfortunately, some tooling uses myrepo/.git/ as the cwd
> > when executing commands, and this is blocked when
> > safe.bareRepository=explicit. Blocking is unnecessary, as git already
> > prevents nested .git directories.
>
> In other words, if the directory $D that is the top level of the
> working tree of a non-bare repository, you should be able to chdir
> to "$D/.git" and run your git command without explicitly saying that
> you are inside $GIT_DIR (e.g. "git --git-dir=$(pwd) cmd")?

Correct.

>
> It makes very good sense.
>
> I briefly wondered if this would give us a great usability
> improvement especially for hook scripts, but they are given GIT_DIR
> when called already so that is not a big upside, I guess.
>
> > Teach git to not reject uses of git inside of the .git directory: check
> > if cwd is .git (or a subdirectory of it) and allow it even if
> > safe.bareRepository=explicit.
>
>
> >     My primary concern with this patch is that I'm unsure if we need to
> >     worry about case-insensitive filesystems (ex: cwd=my_repo/.GIT instead
> >     of my_repo/.git, it might not trigger this logic and end up allowed).
>
> You are additionally allowing ".git" so even if somebody has ".GIT"
> that won't be allowed by this change, no?

My concern was what happens if someone on a case-insensitive
filesystem does `cd .GIT` and then attempts to use it. If the cwd path
isn't case-normalized at some point, we'll have a string like
/path/to/my-repo/.GIT from getcwd() and it won't be allowed by this
code, since this code is checking for `.git` in a case sensitive
fashion.

>
> >     I'm assuming this isn't a significant concern, for two reasons:
> >
> >      * most filesystems/OSes in use today (by number of users) are at least
> >        case-preserving, so users/tools will have had to type out .GIT
> >        instead of getting it from readdir/wherever.
> >      * this is primarily a "quality of life" change to the feature, and if
> >        we get it wrong we still fail closed.
>
> Yup.
>
> If we really cared (which I doubt), we could resort to checking with
> is_ntfs_dotgit() and is_hfs_dotgit(), but that would work in the
> direction of loosening the check even further, which I do not know
> is needed.

Agreed, it's not worth the additional complexity.

>
> > -                     if (get_allowed_bare_repo() == ALLOWED_BARE_REPO_EXPLICIT)
> > +                     if (get_allowed_bare_repo() == ALLOWED_BARE_REPO_EXPLICIT &&
> > +                         !ends_with_path_components(dir->buf, ".git"))
> >                               return GIT_DIR_DISALLOWED_BARE;
>
> Thanks.


^ permalink raw reply	[relevance 5%]

* Re: git bisect stuck - --force flag required for checkout
  @ 2023-12-21 12:22  5% ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2023-12-21 12:22 UTC (permalink / raw)
  To: Devste Devste; +Cc: git

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

On 2023-12-21 at 10:47:57, Devste Devste 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)
> add file Foo.txt to .git and commit
> add some commits with any changes to other files, as this is needed
> for reproduction
> run: git config core.ignorecase false

`core.ignorecase` is specifically designed for this case.  It's set
internally by Git when the repository is created, and it's not supposed
to be changed by the user.

If you want a repository where there's no case sensitivity, then I'd
recommend WSL.  It's also possible to make some directories case
sensitive in Windows 10 and newer and allegedly that works recursively,
so you could use `fsutil` to do that, then run `git init`, then add
data.

> rename Foo.txt to foo.txt and commit
> add some commits with any changes to other files, as this is needed
> for reproduction
> run: git bisect start && git bisect bad
> eventually, when running "git bisect good" (or bad) you will get an error:
> >error: The following untracked working tree files would be overwritten by checkout:
> >Foo.php
> 
> Anything else you want to add:
> git bisect good/bad needs to have support for a "--force" flag, which
> is passed to the git checkout it runs internally
> At the moment git bisect cannot be used on Windows, as there is no way
> to continue the bisect from here.
> Changing the "git config core.ignorecase true" temporarily is not an
> option, as this will introduce a variety of other bugs,
> which, on Windows, eventually will require you to completely delete
> and reclone the repo, as Windows file paths are case-insensitive

Could you share what those problems are?  `core.ignorecase` is
specifically designed to deal with case-insensitive file systems, and
that's why Git sets it to true.
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

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

^ permalink raw reply	[relevance 5%]

* Re: [PATCH 3/4] refs: complete list of special refs
  2023-11-29 21:59  5%   ` Taylor Blau
@ 2023-11-30  7:44  0%     ` Patrick Steinhardt
  0 siblings, 0 replies; 200+ results
From: Patrick Steinhardt @ 2023-11-30  7:44 UTC (permalink / raw)
  To: Taylor Blau; +Cc: git, hanwenn

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

On Wed, Nov 29, 2023 at 04:59:35PM -0500, Taylor Blau wrote:
> On Wed, Nov 29, 2023 at 09:14:20AM +0100, Patrick Steinhardt wrote:
> > We have some references that are more special than others. The reason
> > for them being special is that they either do not follow the usual
> > format of references, or that they are written to the filesystem
> > directly by the respective owning subsystem and thus circumvent the
> > reference backend.
> >
> > This works perfectly fine right now because the reffiles backend will
> > know how to read those refs just fine. But with the prospect of gaining
> > a new reference backend implementation we need to be a lot more careful
> > here:
> >
> >   - We need to make sure that we are consistent about how those refs are
> >     written. They must either always be written via the filesystem, or
> >     they must always be written via the reference backend. Any mixture
> >     will lead to inconsistent state.
> >
> >   - We need to make sure that such special refs are always handled
> >     specially when reading them.
> >
> > We're already mostly good with regard to the first item, except for
> > `BISECT_EXPECTED_REV` which will be addressed in a subsequent commit.
> > But the current list of special refs is missing a lot of refs that
> > really should be treated specially. Right now, we only treat
> > `FETCH_HEAD` and `MERGE_HEAD` specially here.
> >
> > Introduce a new function `is_special_ref()` that contains all current
> > instances of special refs to fix the reading path.
> >
> > Based-on-patch-by: Han-Wen Nienhuys <hanwenn@gmail.com>
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> >  refs.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 56 insertions(+), 2 deletions(-)
> >
> > diff --git a/refs.c b/refs.c
> > index 7d4a057f36..2d39d3fe80 100644
> > --- a/refs.c
> > +++ b/refs.c
> > @@ -1822,15 +1822,69 @@ static int refs_read_special_head(struct ref_store *ref_store,
> >  	return result;
> >  }
> >
> > +static int is_special_ref(const char *refname)
> > +{
> > +	/*
> > +	 * Special references get written and read directly via the filesystem
> > +	 * by the subsystems that create them. Thus, they must not go through
> > +	 * the reference backend but must instead be read directly. It is
> > +	 * arguable whether this behaviour is sensible, or whether it's simply
> > +	 * a leaky abstraction enabled by us only having a single reference
> > +	 * backend implementation. But at least for a subset of references it
> > +	 * indeed does make sense to treat them specially:
> > +	 *
> > +	 * - FETCH_HEAD may contain multiple object IDs, and each one of them
> > +	 *   carries additional metadata like where it came from.
> > +	 *
> > +	 * - MERGE_HEAD may contain multiple object IDs when merging multiple
> > +	 *   heads.
> > +	 *
> > +	 * - "rebase-apply/" and "rebase-merge/" contain all of the state for
> > +	 *   rebases, where keeping it closely together feels sensible.
> > +	 *
> > +	 * There are some exceptions that you might expect to see on this list
> > +	 * but which are handled exclusively via the reference backend:
> > +	 *
> > +	 * - CHERRY_PICK_HEAD
> > +	 * - HEAD
> > +	 * - ORIG_HEAD
> > +	 *
> > +	 * Writing or deleting references must consistently go either through
> > +	 * the filesystem (special refs) or through the reference backend
> > +	 * (normal ones).
> > +	 */
> > +	const char * const special_refs[] = {
> > +		"AUTO_MERGE",
> > +		"BISECT_EXPECTED_REV",
> > +		"FETCH_HEAD",
> > +		"MERGE_AUTOSTASH",
> > +		"MERGE_HEAD",
> > +	};
> 
> Is there a reason that we don't want to declare this statically? If we
> did, I think we could drop one const, since the strings would instead
> reside in the .rodata section.

Not really, no.

> > +	int i;
> 
> Not that it matters for this case, but it may be worth declaring i to be
> an unsigned type, since it's used as an index into an array. size_t
> seems like an appropriate choice there.

Hm. We do use `int` almost everywhere when iterating through an array
via `ARRAY_SIZE`, but ultimately I don't mind whether it's `int`,
`unsigned` or `size_t`.

> > +	for (i = 0; i < ARRAY_SIZE(special_refs); i++)
> > +		if (!strcmp(refname, special_refs[i]))
> > +			return 1;
> > +
> > +	/*
> > +	 * git-rebase(1) stores its state in `rebase-apply/` or
> > +	 * `rebase-merge/`, including various reference-like bits.
> > +	 */
> > +	if (starts_with(refname, "rebase-apply/") ||
> > +	    starts_with(refname, "rebase-merge/"))
> 
> Do we care about case sensitivity here? Definitely not on case-sensitive
> filesystems, but I'm not sure about case-insensitive ones. For instance,
> on macOS, I can do:
> 
>     $ git rev-parse hEAd
> 
> and get the same value as "git rev-parse HEAD" (on my Linux workstation,
> this fails as expected).
> 
> I doubt that there are many users in the wild asking to resolve
> reBASe-APPLY/xyz, but I think that after this patch that would no longer
> work as-is, so we may want to replace this with istarts_with() instead.

In practice I'd argue that nobody is ever going to ask for something in
`rebase-apply/` outside of Git internals or scripts, and I'd expect
these to always use proper casing. So I rather lean towards a "no, we
don't care about case sensitivity".

Patrick

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

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 3/4] refs: complete list of special refs
  @ 2023-11-29 21:59  5%   ` Taylor Blau
  2023-11-30  7:44  0%     ` Patrick Steinhardt
  0 siblings, 1 reply; 200+ results
From: Taylor Blau @ 2023-11-29 21:59 UTC (permalink / raw)
  To: Patrick Steinhardt; +Cc: git, hanwenn

On Wed, Nov 29, 2023 at 09:14:20AM +0100, Patrick Steinhardt wrote:
> We have some references that are more special than others. The reason
> for them being special is that they either do not follow the usual
> format of references, or that they are written to the filesystem
> directly by the respective owning subsystem and thus circumvent the
> reference backend.
>
> This works perfectly fine right now because the reffiles backend will
> know how to read those refs just fine. But with the prospect of gaining
> a new reference backend implementation we need to be a lot more careful
> here:
>
>   - We need to make sure that we are consistent about how those refs are
>     written. They must either always be written via the filesystem, or
>     they must always be written via the reference backend. Any mixture
>     will lead to inconsistent state.
>
>   - We need to make sure that such special refs are always handled
>     specially when reading them.
>
> We're already mostly good with regard to the first item, except for
> `BISECT_EXPECTED_REV` which will be addressed in a subsequent commit.
> But the current list of special refs is missing a lot of refs that
> really should be treated specially. Right now, we only treat
> `FETCH_HEAD` and `MERGE_HEAD` specially here.
>
> Introduce a new function `is_special_ref()` that contains all current
> instances of special refs to fix the reading path.
>
> Based-on-patch-by: Han-Wen Nienhuys <hanwenn@gmail.com>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  refs.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 56 insertions(+), 2 deletions(-)
>
> diff --git a/refs.c b/refs.c
> index 7d4a057f36..2d39d3fe80 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -1822,15 +1822,69 @@ static int refs_read_special_head(struct ref_store *ref_store,
>  	return result;
>  }
>
> +static int is_special_ref(const char *refname)
> +{
> +	/*
> +	 * Special references get written and read directly via the filesystem
> +	 * by the subsystems that create them. Thus, they must not go through
> +	 * the reference backend but must instead be read directly. It is
> +	 * arguable whether this behaviour is sensible, or whether it's simply
> +	 * a leaky abstraction enabled by us only having a single reference
> +	 * backend implementation. But at least for a subset of references it
> +	 * indeed does make sense to treat them specially:
> +	 *
> +	 * - FETCH_HEAD may contain multiple object IDs, and each one of them
> +	 *   carries additional metadata like where it came from.
> +	 *
> +	 * - MERGE_HEAD may contain multiple object IDs when merging multiple
> +	 *   heads.
> +	 *
> +	 * - "rebase-apply/" and "rebase-merge/" contain all of the state for
> +	 *   rebases, where keeping it closely together feels sensible.
> +	 *
> +	 * There are some exceptions that you might expect to see on this list
> +	 * but which are handled exclusively via the reference backend:
> +	 *
> +	 * - CHERRY_PICK_HEAD
> +	 * - HEAD
> +	 * - ORIG_HEAD
> +	 *
> +	 * Writing or deleting references must consistently go either through
> +	 * the filesystem (special refs) or through the reference backend
> +	 * (normal ones).
> +	 */
> +	const char * const special_refs[] = {
> +		"AUTO_MERGE",
> +		"BISECT_EXPECTED_REV",
> +		"FETCH_HEAD",
> +		"MERGE_AUTOSTASH",
> +		"MERGE_HEAD",
> +	};

Is there a reason that we don't want to declare this statically? If we
did, I think we could drop one const, since the strings would instead
reside in the .rodata section.

> +	int i;

Not that it matters for this case, but it may be worth declaring i to be
an unsigned type, since it's used as an index into an array. size_t
seems like an appropriate choice there.

> +	for (i = 0; i < ARRAY_SIZE(special_refs); i++)
> +		if (!strcmp(refname, special_refs[i]))
> +			return 1;
> +
> +	/*
> +	 * git-rebase(1) stores its state in `rebase-apply/` or
> +	 * `rebase-merge/`, including various reference-like bits.
> +	 */
> +	if (starts_with(refname, "rebase-apply/") ||
> +	    starts_with(refname, "rebase-merge/"))

Do we care about case sensitivity here? Definitely not on case-sensitive
filesystems, but I'm not sure about case-insensitive ones. For instance,
on macOS, I can do:

    $ git rev-parse hEAd

and get the same value as "git rev-parse HEAD" (on my Linux workstation,
this fails as expected).

I doubt that there are many users in the wild asking to resolve
reBASe-APPLY/xyz, but I think that after this patch that would no longer
work as-is, so we may want to replace this with istarts_with() instead.

Thanks,
Taylor


^ permalink raw reply	[relevance 5%]

* Re: [PATCH 04/11] t: convert tests to not write references via the filesystem
  @ 2023-10-23 19:10  5%       ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-10-23 19:10 UTC (permalink / raw)
  To: Patrick Steinhardt; +Cc: git, Han-Wen Nienhuys

Patrick Steinhardt <ps@pks.im> writes:

>> OK, the original checks "if a random garbage file, which may not
>> necessarily be a ref, exists at $n_dir, we cannot create a ref at
>> $n_dir/fixes, due to D/F conflict" more directly, but as long as our
>> intention is to enforce the D/F restriction across different ref
>> backends [*], creating a ref at $n_dir and making sure $n_dir/fixes
>> cannot be created is an equivalent check that is better (because it
>> can be applied for other backends).
>> 
>>     Side note: there is no fundamental need to, though, and there
>>          are cases where being able to have the 'seen' branch and
>>          'seen/ps/ref-test-tools' branches at the same time is
>>          beneficial---packed-refs and ref-table backends would not
>>          have such an inherent limitation, but they can of course be
>>          castrated to match what files-backend can(not) do.
>
> I think initially it is beneficial to keep any such restriction and cut
> back new backends to match them, even though it's more work.

Note that the same thing can be said for "Can I have Main and main
branches?".  Loose refs on systems with case-sensitive filesystem
are not penalized, though.

In any case, I think we are in agreement.

>> I trust that this will be corrected to use some wrapper around "git
>> symbolic-ref" (or an equivalent for it as a test-tool subcommand) in
>> some future patch, if not in this series?
>
> Yup, this is getting fixed in a subsequent patch. I had two different
> options to structure this series:
> ...
> There were two reasons why I didn't like the first iteration:

Yup.  I tend to agree with the choice and criteria you made and used
here.


^ permalink raw reply	[relevance 5%]

* [PATCH 2/3] Revert "send-email: extract email-parsing code into a subroutine"
  @ 2023-10-20 10:13  2% ` Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2023-10-20 10:13 UTC (permalink / raw)
  To: Michael Strawbridge; +Cc: Junio C Hamano, Bagas Sanjaya, Git Mailing List

This reverts commit b6049542b97e7b135e0e82bf996084d461224d32.

Prior to that commit, we read the results of the user editing the
"--compose" message in a loop, picking out parts we cared about, and
streaming the result out to a ".final" file. That commit split the
reading/interpreting into two phases; we'd now read into a hash, and
then pick things out of the hash.

The goal was making the code more readable. And in some ways it did,
because the ugly regexes are confined to the reading phase. But it also
introduced several bugs, because now the two phases need to match each
other. In particular:

  - we pick out headers like "Subject: foo" with a case-insensitive
    regex, and then use the user-provided header name as the key in a
    case-sensitive hash. So if the user wrote "subject: foo", we'd no
    longer recognize it as a subject.

  - the namespace for the hash keys conflates header names with meta
    information like "body". If you put "body: foo" in your message, it
    would be misinterpreted as the actual message body (nobody is likely
    to do that in practice, but it seems like an unnecessary danger).

  - the handling for to/cc/bcc is totally broken. The behavior before
    that commit is to recognize and skip those headers, with a note to
    the user that they are not yet handled. Not great, but OK. But
    after the patch, the reading side now splits the addresses into a
    perl array-ref. But the interpreting side doesn't handle this at
    all, and blindly prints the stringified array-ref value. This leads
    to garbage like:

      (mbox) Adding to: ARRAY (0x555b4345c428) from line 'To: ARRAY(0x555b4345c428)'
      error: unable to extract a valid address from: ARRAY (0x555b4345c428)
      What to do with this address? ([q]uit|[d]rop|[e]dit):

    Probably not a huge deal, since nobody should even try to use those
    headers in the first place (since they were not implemented). But
    the new behavior is worse, and indicative of the sorts of problems
    that come from having the two layers.

The revert had a few conflicts, due to later work in this area from
15dc3b9161 (send-email: rename variable for clarity, 2018-03-04) and
d11c943c78 (send-email: support separate Reply-To address, 2018-03-04).
I've ported the changes from those commits over as part of the conflict
resolution.

The new tests show the bugs. Note the use of GIT_SEND_EMAIL_NOTTY in the
second one. Without it, the test is happy to reach outside the test
harness to the developer's actual terminal (when run with the buggy
state before this patch).

Signed-off-by: Jeff King <peff@peff.net>
---
I guess "readable" is up for debate here, but I find the inline handling
a lot easier to follow (and it's half as many lines; most of the
diffstat is the new tests).

But one thing that gives me pause is that the neither before or after
this patch do we handle continuation lines like:

  Subject: this is the beginning
    and this is more subject

And it would probably be a lot easier to add when storing the headers in
a hash (it's not impossible to do it the other way, but you basically
have to delay processing each line with a small state machine).

So another option is to just fix the individual bugs separately.

 git-send-email.perl   | 120 ++++++++++++++----------------------------
 t/t9001-send-email.sh |  35 ++++++++++++
 2 files changed, 75 insertions(+), 80 deletions(-)

diff --git a/git-send-email.perl b/git-send-email.perl
index 288ea1ae80..bbda2a931b 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -888,73 +888,59 @@ sub get_patch_subject {
 		do_edit($compose_filename);
 	}
 
+	open my $c2, ">", $compose_filename . ".final"
+		or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);
+
 	open $c, "<", $compose_filename
 		or die sprintf(__("Failed to open %s: %s"), $compose_filename, $!);
 
+	my $need_8bit_cte = file_has_nonascii($compose_filename);
+	my $in_body = 0;
+	my $summary_empty = 1;
 	if (!defined $compose_encoding) {
 		$compose_encoding = "UTF-8";
 	}
-
-	my %parsed_email;
-	while (my $line = <$c>) {
-		next if $line =~ m/^GIT:/;
-		parse_header_line($line, \%parsed_email);
-		if ($line =~ /^$/) {
-			$parsed_email{'body'} = filter_body($c);
+	while(<$c>) {
+		next if m/^GIT:/;
+		if ($in_body) {
+			$summary_empty = 0 unless (/^\n$/);
+		} elsif (/^\n$/) {
+			$in_body = 1;
+			if ($need_8bit_cte) {
+				print $c2 "MIME-Version: 1.0\n",
+					 "Content-Type: text/plain; ",
+					   "charset=$compose_encoding\n",
+					 "Content-Transfer-Encoding: 8bit\n";
+			}
+		} elsif (/^MIME-Version:/i) {
+			$need_8bit_cte = 0;
+		} elsif (/^Subject:\s*(.+)\s*$/i) {
+			$initial_subject = $1;
+			my $subject = $initial_subject;
+			$_ = "Subject: " .
+				quote_subject($subject, $compose_encoding) .
+				"\n";
+		} elsif (/^In-Reply-To:\s*(.+)\s*$/i) {
+			$initial_in_reply_to = $1;
+			next;
+		} elsif (/^Reply-To:\s*(.+)\s*$/i) {
+			$reply_to = $1;
+		} elsif (/^From:\s*(.+)\s*$/i) {
+			$sender = $1;
+			next;
+		} elsif (/^(?:To|Cc|Bcc):/i) {
+			print __("To/Cc/Bcc fields are not interpreted yet, they have been ignored\n");
+			next;
 		}
+		print $c2 $_;
 	}
 	close $c;
+	close $c2;
 
-	open my $c2, ">", $compose_filename . ".final"
-	or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);
-
-
-	if ($parsed_email{'From'}) {
-		$sender = delete($parsed_email{'From'});
-	}
-	if ($parsed_email{'In-Reply-To'}) {
-		$initial_in_reply_to = delete($parsed_email{'In-Reply-To'});
-	}
-	if ($parsed_email{'Reply-To'}) {
-		$reply_to = delete($parsed_email{'Reply-To'});
-	}
-	if ($parsed_email{'Subject'}) {
-		$initial_subject = delete($parsed_email{'Subject'});
-		print $c2 "Subject: " .
-			quote_subject($initial_subject, $compose_encoding) .
-			"\n";
-	}
-
-	if ($parsed_email{'MIME-Version'}) {
-		print $c2 "MIME-Version: $parsed_email{'MIME-Version'}\n",
-				"Content-Type: $parsed_email{'Content-Type'};\n",
-				"Content-Transfer-Encoding: $parsed_email{'Content-Transfer-Encoding'}\n";
-		delete($parsed_email{'MIME-Version'});
-		delete($parsed_email{'Content-Type'});
-		delete($parsed_email{'Content-Transfer-Encoding'});
-	} elsif (file_has_nonascii($compose_filename)) {
-		my $content_type = (delete($parsed_email{'Content-Type'}) or
-			"text/plain; charset=$compose_encoding");
-		print $c2 "MIME-Version: 1.0\n",
-			"Content-Type: $content_type\n",
-			"Content-Transfer-Encoding: 8bit\n";
-	}
-	# Preserve unknown headers
-	foreach my $key (keys %parsed_email) {
-		next if $key eq 'body';
-		print $c2 "$key: $parsed_email{$key}";
-	}
-
-	if ($parsed_email{'body'}) {
-		print $c2 "\n$parsed_email{'body'}\n";
-		delete($parsed_email{'body'});
-	} else {
+	if ($summary_empty) {
 		print __("Summary email is empty, skipping it\n");
 		$compose = -1;
 	}
-
-	close $c2;
-
 } elsif ($annotate) {
 	do_edit(@files);
 }
@@ -1009,32 +995,6 @@ sub ask {
 	return;
 }
 
-sub parse_header_line {
-	my $lines = shift;
-	my $parsed_line = shift;
-	my $addr_pat = join "|", qw(To Cc Bcc);
-
-	foreach (split(/\n/, $lines)) {
-		if (/^($addr_pat):\s*(.+)$/i) {
-		        $parsed_line->{$1} = [ parse_address_line($2) ];
-		} elsif (/^([^:]*):\s*(.+)\s*$/i) {
-		        $parsed_line->{$1} = $2;
-		}
-	}
-}
-
-sub filter_body {
-	my $c = shift;
-	my $body = "";
-	while (my $body_line = <$c>) {
-		if ($body_line !~ m/^GIT:/) {
-			$body .= $body_line;
-		}
-	}
-	return $body;
-}
-
-
 my %broken_encoding;
 
 sub file_declares_8bit_cte {
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 263db3ad17..9644ff5793 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -2505,4 +2505,39 @@ test_expect_success $PREREQ 'test forbidSendmailVariables behavior override' '
 		HEAD^
 '
 
+test_expect_success $PREREQ '--compose handles lowercase headers' '
+	write_script fake-editor <<-\EOF &&
+	sed "s/^From:.*/from: edited-from@example.com/i" "$1" >"$1.tmp" &&
+	mv "$1.tmp" "$1"
+	EOF
+	clean_fake_sendmail &&
+	git send-email \
+		--compose \
+		--from="Example <from@example.com>" \
+		--to=nobody@example.com \
+		--smtp-server="$(pwd)/fake.sendmail" \
+		HEAD^ &&
+	grep "From: edited-from@example.com" msgtxt1
+'
+
+test_expect_success $PREREQ '--compose handles to headers' '
+	write_script fake-editor <<-\EOF &&
+	sed "s/^$/To: edited-to@example.com\n/" <"$1" >"$1.tmp" &&
+	echo this is the body >>"$1.tmp" &&
+	mv "$1.tmp" "$1"
+	EOF
+	clean_fake_sendmail &&
+	GIT_SEND_EMAIL_NOTTY=1 \
+	git send-email \
+		--compose \
+		--from="Example <from@example.com>" \
+		--to=nobody@example.com \
+		--smtp-server="$(pwd)/fake.sendmail" \
+		HEAD^ &&
+	# Ideally the "to" header we specified would be used,
+	# but the program explicitly warns that these are
+	# ignored. For now, just make sure we did not abort.
+	grep "To:" msgtxt1
+'
+
 test_done
-- 
2.42.0.980.g8b5f6199be



^ permalink raw reply related	[relevance 2%]

* [ANNOUNCE] Git v2.42.0
@ 2023-08-21 18:12  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-08-21 18:12 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel, git-packagers

The latest feature release Git v2.42.0 is now available at the
usual places.  It is comprised of 453 non-merge commits since
v2.41.0, contributed by 78 people, 17 of which are new faces [*].

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/

The following public repositories all have a copy of the 'v2.42.0'
tag and the 'master' branch that the tag points at:

  url = https://git.kernel.org/pub/scm/git/git
  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.41.0 are as follows.
Welcome to the Git development community!

  Adam Majer, Andreas Herrmann, Greg Alexander, Han Young, Jacob
  Abel, Jan Klötzke, Jim Pryor, Johan Ruokangas, Josh Sref,
  Josip Sokcevic, Louis Strous, Lumynous, Petar Vutov, Premek
  Vysoky, Sebastian Thiel, Tribo Dar, and Vinayak Dev.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  , Alejandro R. Sedeño, Alex Henrie, Arkadii Yakovets, Bagas
  Sanjaya, Beat Bolli, brian m. carlson, Calvin Wan, Carlo Marcelo
  Arenas Belón, Christian Couder, D. Ben Knoble, Derrick Stolee,
  Dimitriy Ryazantcev, Elijah Newren, Emir SARI, Eric Sunshine,
  Eric Wong, Glen Choo, Hariom Verma, Jacob Keller, Jaydeep Das,
  Jean-Noël Avila, Jeff King, Johannes Schindelin, John Cai,
  Jonathan Nieder, Jonathan Tan, Jordi Mas, Junio C Hamano,
  Kate Golovanova, Kousik Sanagavarapu, Kristoffer Haugsbakk,
  Linus Arver, Martin Ågren, Matthew Hughes, Matthias Aßhauer, M
  Hickford, Michael Haggerty, Mike Hommey, Nsengiyumva Wilberforce,
  Oswald Buddenhagen, Patrick Steinhardt, Peter Krefting,
  Philippe Blain, Phillip Wood, Ralf Thielow, Randall S. Becker,
  René Scharfe, Rubén Justo, Sean Allred, Shuqi Liang, SZEDER
  Gábor, Taylor Blau, Teng Long, Todd Zullinger, Toon Claes,
  Torsten Bögershausen, Victoria Dye, Yi-Jyun Pan, Yuyi Wang,
  and ZheNing Hu.

[*] We are counting not just the authorship contribution but issue
    reporting, mentoring, helping and reviewing that are recorded in
    the commit trailers.

----------------------------------------------------------------

Git v2.42 Release Notes
=======================

UI, Workflows & Features

 * "git pack-refs" learns "--include" and "--exclude" to tweak the ref
   hierarchy to be packed using pattern matching.

 * 'git worktree add' learned how to create a worktree based on an
   orphaned branch with `--orphan`.

 * "git pack-objects" learned to invoke a new hook program that
   enumerates extra objects to be used as anchoring points to keep
   otherwise unreachable objects in cruft packs.

 * Add more "git var" for toolsmiths to learn various locations Git is
   configured with either via the configuration or hard-coded defaults.

 * 'git notes append' was taught '--separator' to specify string to insert
   between paragraphs.

 * The "git for-each-ref" family of commands learned placeholders
   related to GPG signature verification.

 * "git diff --no-index" learned to read from named pipes as if they
   were regular files, to allow "git diff <(process) <(substitution)"
   some shells support.

 * Help newbies by suggesting that there are cases where force-pushing
   is a valid and sensible thing to update a branch at a remote
   repository, rather than reconciling with merge/rebase.

 * "git blame --contents=file" has been taught to work in a bare
   repository.

 * "git branch -f X" to repoint the branch X said that X was "checked
   out" in another worktree, even when branch X was not and instead
   being bisected or rebased.  The message was reworded to say the
   branch was "in use".

 * Tone down the warning on SHA-256 repositories being an experimental
   curiosity.  We do not have support for them to interoperate with
   traditional SHA-1 repositories, but at this point, we do not plan
   to make breaking changes to SHA-256 repositories and there is no
   longer need for such a strongly phrased warning.


Performance, Internal Implementation, Development Support etc.

 * "git diff-tree" has been taught to take advantage of the
   sparse-index feature.

 * Clang's sanitizer implementation seems to work better than GCC's.
   (merge d88d727143 jk/ci-use-clang-for-sanitizer-jobs later to maint).

 * The object traversal using reachability bitmap done by
   "pack-object" has been tweaked to take advantage of the fact that
   using "boundary" commits as representative of all the uninteresting
   ones can save quite a lot of object enumeration.

 * discover_git_directory() no longer touches the_repository.

 * "git worktree" learned to work better with sparse index feature.

 * When the external merge driver is killed by a signal, its output
   should not be trusted as a resolution with conflicts that is
   proposed by the driver, but the code did.

 * The set-up code for the get_revision() API now allows feeding
   options like --all and --not in the --stdin mode.

 * Move functions that are not about pure string manipulation out of
   strbuf.[ch]

 * "imap-send" codepaths got cleaned up to get rid of unused
   parameters.

 * Enumerating refs in the packed-refs file, while excluding refs that
   match certain patterns, has been optimized.

 * Mark-up unused parameters in the code so that we can eventually
   enable -Wunused-parameter by default.

 * Instead of inventing a custom counter variables for debugging,
   use existing trace2 facility in the fsync customization codepath.

 * "git branch --list --format=<format>" and friends are taught
   a new "%(describe)" placeholder.

 * Clarify how to choose the starting point for a new topic in
   developer guidance document.

 * The implementation of "get_sha1_hex()" that reads a hexadecimal
   string that spells a full object name has been extended to cope
   with any hash function used in the repository, but the "sha1" in
   its name survived.  Rename it to get_hash_hex(), a name that is
   more consistent within its friends like get_hash_hex_algop().

 * Command line parser fix, and a small parse-options API update.


Fixes since v2.41
-----------------

 * "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the
   command failed, so that the user can salvage what they typed.
   (merge 08c12ec1d0 kh/keep-tag-editmsg-upon-failure later to maint).

 * The "-s" (silent, squelch) option of the "diff" family of commands
   did not interact with other options that specify the output format
   well.  This has been cleaned up so that it will clear all the
   formatting options given before.
   (merge 9d484b92ed jc/diff-s-with-other-options later to maint).

 * Update documentation regarding Coccinelle patches.
   (merge 3bd0097cfc gc/doc-cocci-updates later to maint).

 * Some atoms that can be used in "--format=<format>" for "git ls-tree"
   were not supported by "git ls-files", even though they were relevant
   in the context of the latter.
   (merge 4d28c4f75f zh/ls-files-format-atoms later to maint).

 * Document more pseudo-refs and teach the command line completion
   machinery to complete AUTO_MERGE.
   (merge 982ff3a649 pb/complete-and-document-auto-merge-and-friends later to maint).

 * "git submodule" code trusted the data coming from the config (and
   the in-tree .gitmodules file) too much without validating, leading
   to NULL dereference if the user mucks with a repository (e.g.
   submodule.<name>.url is removed).  This has been corrected.
   (merge fbc806acd1 tb/submodule-null-deref-fix later to maint).

 * The value of config.worktree is per-repository, but has been kept
   in a singleton global variable per process. This has been OK as
   most Git operations interacted with a single repository at a time,
   but not right for operations like recursive "grep" that want to
   access multiple repositories from a single process without forking.

   The global variable has been eliminated and made into a member in
   the per-repository data structure.
   (merge 3867f6d650 vd/worktree-config-is-per-repository later to maint).

 * "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.
   (merge 8260bc5902 jk/log-follow-with-non-literal-pathspec later to maint).

 * Introduce a mechanism to disable replace refs globally and per
   repository.
   (merge 9c7d1b057f ds/disable-replace-refs later to maint).

 * "git cat-file --batch" and friends learned "-Z" that uses NUL
   delimiter for both input and output.
   (merge f79e18849b ps/cat-file-null-output later to maint).

 * The reimplemented "git add -i" did not honor color.ui configuration.
   (merge 6f74648cea ds/add-i-color-configuration-fix later to maint).

 * Compilation fix for platforms without D_TYPE in struct dirent.
   (merge 03bf92b9bf as/dtype-compilation-fix later to maint).

 * Suggest to refrain from using hex literals that are non-portable
   when writing printf(1) format strings.
   (merge f0b68f0546 jt/doc-use-octal-with-printf later to maint).

 * Simplify error message when run-command fails to start a command.
   (merge 6d224ac286 rs/run-command-exec-error-on-noent later to maint).

 * Gracefully deal with a stale MIDX file that lists a packfile that
   no longer exists.
   (merge 06f3867865 tb/open-midx-bitmap-fallback later to maint).

 * Even when diff.ignoreSubmodules tells us to ignore submodule
   changes, "git commit" with an index that already records changes to
   submodules should include the submodule changes in the resulting
   commit, but it did not.
   (merge 5768478edc js/defeat-ignore-submodules-config-with-explicit-addition later to maint).

 * When "git commit --trailer=..." invokes the interpret-trailers
   machinery, it knows what it feeds to interpret-trailers is a full
   log message without any patch, but failed to express that by
   passing the "--no-divider" option, which has been corrected.
   (merge be3d654343 jk/commit-use-no-divider-with-interpret-trailers later to maint).

 * Avoid breakage of "git pack-objects --cruft" due to inconsistency
   between the way the code enumerates packfiles in the repository.
   (merge 73320e49ad tb/collect-pack-filenames-fix later to maint).

 * We create .pack and then .idx, we consider only packfiles that have
   .idx usable (those with only .pack are not ready yet), so we should
   remove .idx before removing .pack for consistency.
   (merge 0dd1324a73 ds/remove-idx-before-pack later to maint).

 * Partially revert a sanity check that the rest of the config code
   was not ready, to avoid triggering it in a corner case.
   (merge a53f43f900 gc/config-partial-submodule-kvi-fix later to maint).

 * "git apply" punts when it is fed too large a patch input; the error
   message it gives when it happens has been clarified.
   (merge 42612e18d2 pw/apply-too-large later to maint).

 * During a cherry-pick or revert session that works on multiple
   commits, "git status" did not give correct information, which has
   been corrected.
   (merge a096a889f4 jk/cherry-pick-revert-status later to maint).

 * A few places failed to differentiate the case where the index is
   truly empty (nothing added) and we haven't yet read from the
   on-disk index file, which have been corrected.
   (merge 2ee045eea1 js/empty-index-fixes later to maint).

 * "git bugreport" tests did not test what it wanted to test, which
   has been corrected.
   (merge 1aa92b8500 ma/t0091-fixup later to maint).

 * Code snippets in a tutorial document no longer compiled after
   recent header shuffling, which have been corrected.
   (merge bbd7c7b7c0 vd/adjust-mfow-doc-to-updated-headers later to maint).

 * "git ls-files '(attr:X)D/'" that triggers the common prefix
   optimization codepath failed to read from "D/.gitattributes",
   which has been corrected.
   (merge f4a8fde057 jc/pathspec-match-with-common-prefix later to maint).

 * "git fsck --no-progress" still spewed noise from the commit-graph
   subsystem, which has been corrected.
   (merge 9281cd07f0 tb/fsck-no-progress later to maint).

 * Various offset computation in the code that accesses the packfiles
   and other data in the object layer has been hardened against
   arithmetic overflow, especially on 32-bit systems.
   (merge 9a25cad7e0 tb/object-access-overflow-protection later to maint).

 * Names of MinGW header files are spelled in mixed case in some
   source files, but the build host can be using case sensitive
   filesystem with header files with their name spelled in all
   lowercase.
   (merge 4a53d0d0bc mh/mingw-case-sensitive-build later to maint).

 * Update message mark-up for i18n in "git bundle".
   (merge bbb6acd998 dk/bundle-i18n-more later to maint).

 * "git tag --list --points-at X" showed tags that directly refers to
   object X, but did not list a tag that points at such a tag, which
   has been corrected.

 * "./configure --with-expat=no" did not work as a way to refuse use
   of the expat library on a system with the library installed, which
   has been corrected.
   (merge fb8f7269c2 ah/autoconf-fixes later to maint).

 * When the user edits "rebase -i" todo file so that it starts with a
   "fixup", which would make it invalid, the command truncated the
   rest of the file before giving an error and returning the control
   back to the user.  Stop truncating to make it easier to correct
   such a malformed todo file.
   (merge 9645a087c2 ah/sequencer-rewrite-todo-fix later to maint).

 * Rewrite the description of giving a custom command to the
   submodule.<name>.update configuration variable.
   (merge 7cebc5bd78 pv/doc-submodule-update-settings later to maint).

 * Adjust to OpenSSL 3+, which deprecates its SHA-1 functions based on
   its traditional API, by using its EVP API instead.
   (merge bda9c12073 ew/hash-with-openssl-evp later to maint).

 * Exclude "." from the set of characters to be removed from the
   beginning and the end of the human-readable name.
   (merge 1c04cb0744 bc/ident-dot-is-no-longer-crud-letter later to maint).

 * "git bisect visualize" stopped running "gitk" on Git for Windows
   when the command was reimplemented in C around Git 2.34 timeframe.
   This has been corrected.
   (merge fff1594fa7 ma/locate-in-path-for-windows later to maint).

 * "git rebase -i" with a series of squash/fixup, when one of the
   steps stopped in conflicts and ended up getting skipped, did not
   handle the accumulated commit log messages, which has been
   corrected.
   (merge 6ce7afe163 pw/rebase-skip-commit-message-fix later to maint).

 * Adjust to newer Term::ReadLine to prevent it from breaking
   the interactive prompt code in send-email.
   (merge c016726c2d jk/send-email-with-new-readline later to maint).

 * Windows updates.
   (merge 0050f8e401 ds/maintenance-on-windows-fix later to maint).

 * Correct use of lstat() that assumed a failing call would not
   clobber the statbuf.
   (merge 72695d8214 st/mv-lstat-fix later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge 51f9d2e563 sa/doc-ls-remote later to maint).
   (merge c6d26a9dda jk/format-patch-message-id-unleak later to maint).
   (merge f7e063f326 ps/fetch-cleanups later to maint).
   (merge e4cf013468 tl/quote-problematic-arg-for-clarity later to maint).
   (merge 20025fdfc7 tz/test-ssh-verifytime-fix later to maint).
   (merge e48a21df65 tz/test-fix-pthreads-prereq later to maint).
   (merge 68b51172e3 mh/commit-reach-get-reachable-plug-leak later to maint).
   (merge aeee1408ce kh/use-default-notes-doc later to maint).
   (merge 3b8724bce6 jc/test-modernization later to maint).
   (merge 447a3b7331 jc/test-modernization-2 later to maint).
   (merge d57fa7fc73 la/doc-interpret-trailers later to maint).
   (merge 548afb0d9a la/docs-typofixes later to maint).
   (merge 3744ffcbcd rs/doc-ls-tree-hex-literal later to maint).
   (merge 6c26da8404 mh/credential-erase-improvements later to maint).
   (merge 78e56cff69 tz/lib-gpg-prereq-fix later to maint).
   (merge 80d32e84b5 rj/leakfixes later to maint).
   (merge 0a868031ed pb/complete-diff-options later to maint).
   (merge d4f28279ad jc/doc-hash-object-types later to maint).
   (merge 1876a5ae15 ks/t4205-test-describe-with-abbrev-fix later to maint).
   (merge 6e6a529b57 jk/fsck-indices-in-worktrees later to maint).
   (merge 3e81b896f7 rs/packet-length-simplify later to maint).
   (merge 4c9cb51fe7 mh/doc-credential-helpers later to maint).
   (merge 3437f549dd jr/gitignore-doc-example-markup later to maint).
   (merge 947ebd62a0 jc/am-parseopt-fix later to maint).
   (merge e12cb98e1e jc/branch-parseopt-fix later to maint).
   (merge d6f598e443 jc/gitignore-doc-pattern-markup later to maint).
   (merge a2dad4868b jc/transport-parseopt-fix later to maint).
   (merge 68cbb20e73 jc/parse-options-show-branch later to maint).
   (merge 3821eb6c3d jc/parse-options-reset later to maint).
   (merge c48af99a3e bb/trace2-comment-fix later to maint).
   (merge c95ae3ff9c rs/describe-parseopt-fix later to maint).
   (merge 36f76d2a25 rs/pack-objects-parseopt-fix later to maint).
   (merge 30c8c55cbf jc/tree-walk-drop-base-offset later to maint).
   (merge d089a06421 rs/bundle-parseopt-cleanup later to maint).
   (merge 823839bda1 ew/sha256-gcrypt-leak-fixes later to maint).
   (merge a5c01603b3 bc/ignore-clangd-cache later to maint).
   (merge 12009a182b js/allow-t4000-to-be-indented-with-spaces later to maint).
   (merge b3dcd24b8a jc/send-email-pre-process-fix later to maint).

----------------------------------------------------------------

Changes since v2.41.0 are as follows:

Adam Majer (1):
      doc: sha256 is no longer experimental

Alejandro R. Sedeño (1):
      statinfo.h: move DTYPE defines from dir.h

Alex Henrie (4):
      wt-status: don't show divergence advice when committing
      remote: don't imply that integration is always required before pushing
      push: don't imply that integration is always required before pushing
      sequencer: finish parsing the todo list despite an invalid first line

Andreas Herrmann (3):
      configure.ac: don't overwrite NO_EXPAT option
      configure.ac: don't overwrite NO_CURL option
      configure.ac: always save NO_ICONV to config.status

Arkadii Yakovets (1):
      l10n: uk: update translation (2.42.0)

Bagas Sanjaya (1):
      l10n: po-id for 2.42 (round 1)

Beat Bolli (2):
      trace2: fix a comment
      wrapper: use trace2 counters to collect fsync stats

Calvin Wan (13):
      strbuf: clarify API boundary
      strbuf: clarify dependency
      abspath: move related functions to abspath
      credential-store: move related functions to credential-store file
      object-name: move related functions to object-name
      path: move related function to path
      strbuf: remove global variable
      git-compat-util: move strbuf.c funcs to its header
      git-compat-util: move wrapper.c funcs to its header
      sane-ctype.h: create header for sane-ctype macros
      kwset: move translation table from ctype
      treewide: remove unnecessary includes for wrapper.h
      git-compat-util: move alloc macros to git-compat-util.h

D. Ben Knoble (2):
      i18n: mark more bundle.c strings for translation
      t4002: fix "diff can read from stdin" syntax

Derrick Stolee (7):
      add: check color.ui for interactive add
      add: test use of brackets when color is disabled
      repository: create disable_replace_refs()
      replace-objects: create wrapper around setting
      repository: create read_replace_refs setting
      packfile: delete .idx files before .pack files
      builtin/repack.c: only repack `.pack`s that exist

Dimitriy Ryazantcev (1):
      l10n: ru.po: update Russian translation

Elijah Newren (28):
      init-db: document existing bug with core.bare in template config
      init-db: remove unnecessary global variable
      init-db, clone: change unnecessary global into passed parameter
      setup: adopt shared init-db & clone code
      read-cache: move shared commit and ls-files code
      add: modify add_files_to_cache() to avoid globals
      read-cache: move shared add/checkout/commit code
      statinfo: move stat_{data,validity} functions from cache/read-cache
      run-command.h: move declarations for run-command.c from cache.h
      name-hash.h: move declarations for name-hash.c from cache.h
      sparse-index.h: move declarations for sparse-index.c from cache.h
      preload-index.h: move declarations for preload-index.c from elsewhere
      diff.h: move declaration for global in diff.c from cache.h
      merge.h: move declarations for merge.c from cache.h
      repository.h: move declaration of the_index from cache.h
      read-cache*.h: move declarations for read-cache.c functions from cache.h
      cache.h: remove this no-longer-used header
      log-tree: replace include of revision.h with simple forward declaration
      repository: remove unnecessary include of path.h
      diff.h: remove unnecessary include of oidset.h
      list-objects-filter-options.h: remove unneccessary include
      builtin.h: remove unneccessary includes
      git-compat-util.h: remove unneccessary include of wildmatch.h
      merge-ll: rename from ll-merge
      khash: name the structs that khash declares
      object-store-ll.h: split this header out of object-store.h
      hash-ll, hashmap: move oidhash() to hash-ll
      fsmonitor-ll.h: split this header out of fsmonitor.h

Emir SARI (1):
      l10n: tr: git 2.42.0

Eric Sunshine (1):
      fsck: avoid misleading variable name

Eric Wong (5):
      sha256/gcrypt: fix build with SANITIZE=leak
      sha256/gcrypt: fix memory leak with SHA-256 repos
      sha256/gcrypt: die on gcry_md_open failures
      sha256: avoid functions deprecated in OpenSSL 3+
      avoid SHA-1 functions deprecated in OpenSSL 3+

Glen Choo (16):
      cocci: add headings to and reword README
      cocci: codify authoring and reviewing practices
      setup.c: don't setup in discover_git_directory()
      config: don't BUG when both kvi and source are set
      config: inline git_color_default_config
      urlmatch.h: use config_fn_t type
      config: add ctx arg to config_fn_t
      config.c: pass ctx in configsets
      config: pass ctx with config files
      config.c: pass ctx with CLI config
      trace2: plumb config kvi
      config: pass kvi to die_bad_number()
      config.c: remove config_reader from configsets
      config: add kvi.path, use it to evaluate includes
      config: pass source to config_parser_event_fn_t
      mailmap: change primary address for Glen Choo

Han Young (1):
      blame: allow --contents to work with bare repo

Jacob Abel (11):
      worktree add: include -B in usage docs
      t2400: cleanup created worktree in test
      t2400: refactor "worktree add" opt exclusion tests
      t2400: add tests to verify --quiet
      worktree add: add --orphan flag
      worktree add: introduce "try --orphan" hint
      worktree add: extend DWIM to infer --orphan
      worktree add: emit warn when there is a bad HEAD
      t2400: drop no-op `--sq` from rev-parse call
      builtin/worktree.c: convert tab in advice to space
      t2400: rewrite regex to avoid unintentional PCRE

Jacob Keller (1):
      fix cherry-pick/revert status when doing multiple commits

Jan Klötzke (1):
      ref-filter: handle nested tags in --points-at option

Jean-Noël Avila (2):
      l10n: fr v2.42.0 rnd 1
      l10n: fr v2.42.0 rnd 2

Jeff King (41):
      format-patch: free rev.message_id when exiting
      format-patch: free elements of rev.ref_message_ids list
      pathspec: factor out magic-to-name function
      diff: factor out --follow pathspec check
      diff: detect pathspec magic not supported by --follow
      ci: use clang for ASan/UBSan checks
      ci: run ASan/UBSan in a single job
      ci: drop linux-clang job
      commit: pass --no-divider to interpret-trailers
      http: handle both "h2" and "h2h3" in curl info lines
      var: mark unused parameters in git_var callbacks
      imap-send: use server conf argument in setup_curl()
      imap-send: drop unused parameter from imap_cmd_cb callback
      imap-send: drop unused fields from imap_cmd_cb
      refs.c: rename `ref_filter`
      ref-filter.h: provide `REF_FILTER_INIT`
      ref-filter: clear reachable list pointers after freeing
      ref-filter: add `ref_filter_clear()`
      ref-filter.c: parameterize match functions over patterns
      test-ref-store: drop unimplemented reflog-expire command
      do_for_each_ref_helper(): mark unused repository parameter
      http: mark unused parameters in curl callbacks
      http-push: mark unused parameter in xml callback
      am: mark unused keep_cr parameters
      count-objects: mark unused parameter in alternates callback
      revisions: drop unused "opt" parameter in "tweak" callbacks
      fsck: mark unused parameters in various fsck callbacks
      merge-tree: mark unused parameter in traverse callback
      replace: mark unused parameter in ref callback
      replace: mark unused parameter in each_mergetag_fn callback
      rev-parse: mark unused parameter in for_each_abbrev callback
      tag: mark unused parameters in each_tag_name_fn callbacks
      t/helper: mark unused callback void data parameters
      ref-filter: avoid parsing tagged objects in match_points_at()
      ref-filter: avoid parsing non-tags in match_points_at()
      ref-filter: simplify return type of match_points_at
      send-email: drop FakeTerm hack
      send-email: avoid creating more than one Term::ReadLine object
      repack: free geometry struct
      t4053: avoid writing to unopened pipe
      fsck: use enum object_type for fsck_walk callback

Johan Ruokangas (1):
      gitignore.txt: use backticks instead of double quotes

Johannes Schindelin (6):
      do_read_index(): always mark index as initialized unless erroring out
      split-index: accept that a base index can be empty
      commit -a -m: allow the top-level tree to become empty again
      t0040: declare non-tab indentation to be okay in this script
      win32: add a helper to run `git.exe` without a foreground window
      git maintenance: avoid console window in scheduled tasks on Windows

John Cai (34):
      docs: clarify git-pack-refs --all will pack all refs
      pack-refs: teach --exclude option to exclude refs from being packed
      pack-refs: teach pack-refs --include option
      t0000-basic: modernize test format
      t0030-stripspace: modernize test format
      t3210-pack-refs: modernize test format
      t1001-read-tree-m-2way: modernize test format
      t1002-read-tree-m-u-2way: modernize test format
      t1006-cat-file: modernize test format
      t3500-cherry: modernize test format
      t3700-add: modernize test format
      t3903-stash: modernize test format
      t4002-diff-basic: modernize test format
      t4003-diff-rename-1: modernize test format
      t4004-diff-rename-symlink: modernize test format
      t4202-log: modernize test format
      t4206-log-follow-harder-copies: modernize test format
      t5300-pack-object: modernize test format
      t5301-sliding-window: modernize test format
      t5303-pack-corruption-resilience: modernize test format
      t5306-pack-nobase: modernize test format
      t6050-replace: modernize test format
      t7101-reset-empty-subdirs: modernize test format
      t7110-reset-merge: modernize test format
      t7111-reset-table: modernize test format
      t7201-co: modernize test format
      t7508-status: modernize test format
      t7600-merge: modernize test format
      t7700-repack: modernize test format
      t9100-git-svn-basic: modernize test format
      t9104-git-svn-follow-parent: modernize test format
      t9200-git-cvsexportcommit: modernize test format
      t9400-git-cvsserver-server: modernize test format
      docs: add git hash-object -t option's possible values

Jonathan Tan (1):
      CodingGuidelines: use octal escapes, not hex

Jordi Mas (1):
      l10n: Update Catalan translation

Josip Sokcevic (1):
      diff-lib: honor override_submodule_config flag bit

Junio C Hamano (48):
      diff: fix interaction between the "-s" option and other options
      show-branch doc: say <ref>, not <reference>
      Start the 2.42 cycle
      The second batch for 2.42
      The third batch
      ll-merge: killing the external merge driver aborts the merge
      The fourth batch
      t6406: skip "external merge driver getting killed by a signal" test on Windows
      The fifth batch
      The sixth batch
      The seventh batch
      The eighth batch
      t6135: attr magic with path pattern
      tree-walk: lose base_offset that is never used in tree_entry_interesting
      tree-walk: drop unused base_offset from do_match()
      The ninth batch
      dir: match "attr" pathspec magic with correct paths
      The tenth batch
      The eleventh batch
      The twelfth batch
      gitignore.txt: mark up explanation of patterns consistently
      am: simplify parsing of "--[no-]keep-cr"
      branch: reject "--no-all" and "--no-remotes" early
      parse-options: introduce OPT_IPVERSION()
      fetch: reject --no-ipv[46]
      show-branch: --no-sparse should give dense output
      short help: allow multi-line opthelp
      remote: simplify "remote add --tags" help text
      short help: allow a gap smaller than USAGE_GAP
      show-branch: reject --[no-](topo|date)-order
      reset: reject --no-(mixed|soft|hard|merge|keep) option
      The thirteenth batch
      branch: update the message to refuse touching a branch in-use
      hex: retire get_sha1_hex()
      The fourteenth batch
      SubmittingPatches: choice of base for fixing an older maintenance track
      The fifteenth batch
      SubmittingPatches: explain why 'next' and above are inappropriate base
      SubmittingPatches: use of older maintenance tracks is an exception
      The sixteenth batch
      MyFirstContribution: refrain from self-iterating too much
      The seventeenth batch
      The eighteenth batch
      Git 2.42-rc0
      A few more topics before -rc1
      Git 2.42-rc1
      Git 2.42-rc2
      Git 2.42

Kousik Sanagavarapu (5):
      t/lib-gpg: introduce new prereq GPG2
      ref-filter: add new "signature" atom
      t4205: correctly test %(describe:abbrev=...)
      ref-filter: add multiple-option parsing functions
      ref-filter: add new "describe" atom

Kristoffer Haugsbakk (5):
      doc: tag: document `TAG_EDITMSG`
      t/t7004-tag: add regression test for successful tag creation
      tag: keep the message file in case ref transaction fails
      notes: update documentation for `use_default_notes`
      notes: move the documentation to the struct

Linus Arver (15):
      docs: typofixes
      doc: trailer: fix grammar
      doc: trailer: swap verb order
      doc: trailer: drop "commit message part" phrasing
      doc: trailer: examples: avoid the word "message" by itself
      doc: trailer: remove redundant phrasing
      doc: trailer: use angle brackets for <token> and <value>
      doc: trailer.<token>.command: emphasize deprecation
      doc: trailer: mention 'key' in DESCRIPTION
      doc: trailer: add more examples in DESCRIPTION
      SubmittingPatches: reword awkward phrasing
      SubmittingPatches: discuss subsystems separately from git.git
      SubmittingPatches: de-emphasize branches as starting points
      SubmittingPatches: emphasize need to communicate non-default starting points
      SubmittingPatches: simplify guidance for choosing a starting point

M Hickford (3):
      credential: avoid erasing distinct password
      credential: erase all matching credentials
      doc: gitcredentials: link to helper list

Martin Ågren (5):
      t0091-bugreport.sh: actually verify some content of report
      notes doc: split up run-on sentences
      notes doc: tidy up `--no-stripspace` paragraph
      show-ref doc: fix carets in monospace
      rev-list-options: fix typo in `--stdin` documentation

Matthias Aßhauer (3):
      run-command: conditionally define locate_in_PATH()
      compat/mingw: implement a native locate_in_PATH()
      docs: update when `git bisect visualize` uses `gitk`

Mike Hommey (2):
      commit-reach: fix memory leak in get_reachable_subset()
      mingw: use lowercase includes for some Windows headers

Oswald Buddenhagen (2):
      advice: handle "rebase" in error_resolve_conflict()
      t9001: remove excessive GIT_SEND_EMAIL_NOTTY=1

Patrick Steinhardt (17):
      fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value
      fetch: drop unneeded NULL-check for `remote_ref`
      fetch: pass through `fetch_config` directly
      fetch: use `fetch_config` to store "fetch.prune" value
      fetch: use `fetch_config` to store "fetch.pruneTags" value
      fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
      fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
      fetch: use `fetch_config` to store "fetch.parallel" value
      fetch: use `fetch_config` to store "submodule.fetchJobs" value
      t1006: don't strip timestamps from expected results
      t1006: modernize test style to use `test_cmp`
      strbuf: provide CRLF-aware helper to read until a specified delimiter
      cat-file: simplify reading from standard input
      cat-file: add option '-Z' that delimits input and output with NUL
      revision: reorder `read_revisions_from_stdin()`
      revision: small readability improvement for reading from stdin
      revision: handle pseudo-opts in `--stdin` mode

Petar Vutov (1):
      doc: highlight that .gitmodules does not support !command

Peter Krefting (1):
      l10n: sv.po: Update Swedish translation 5549t0f0u

Philippe Blain (30):
      revisions.txt: use description list for special refs
      revisions.txt: document more special refs
      completion: complete REVERT_HEAD and BISECT_HEAD
      git-merge.txt: modernize word choice in "True merge" section
      Documentation: document AUTO_MERGE
      completion: complete AUTO_MERGE
      completion: add comments describing __git_diff_* globals
      completion: complete --break-rewrites
      completion: complete --cc
      completion: complete --combined-all-paths
      completion: complete --compact-summary
      completion: complete --default-prefix
      completion: complete --find-copies
      completion: complete --find-object
      completion: complete --find-renames
      completion: complete --function-context
      completion: complete --ignore-matching-lines
      completion: complete --irreversible-delete
      completion: complete --ita-invisible-in-index and --ita-visible-in-index
      completion: complete --line-prefix
      completion: complete --no-relative
      completion: complete --no-stat
      completion: complete --output
      completion: complete --output-indicator-{context,new,old}
      completion: complete --unified
      completion: complete --ws-error-highlight
      completion: move --pickaxe-{all,regex} to __git_diff_common_options
      completion: complete --diff-merges, its options and --no-diff-merges
      completion: complete --remerge-diff
      diff.c: mention completion above add_diff_options

Phillip Wood (7):
      apply: improve error messages when reading patch
      diff --no-index: refuse to compare stdin to a directory
      diff --no-index: die on error reading stdin
      t4054: test diff --no-index with stdin
      diff --no-index: support reading from named pipes
      rebase --skip: fix commit message clean up when skipping squash
      t4053: avoid race when killing background processes

Ralf Thielow (1):
      l10n: Update German translation

René Scharfe (20):
      t1800: loosen matching of error message for bad shebang
      run-command: report exec error even on ENOENT
      ls-tree: fix documentation of %x format placeholder
      pretty: factor out expand_separator()
      strbuf: factor out strbuf_expand_step()
      replace strbuf_expand_dict_cb() with strbuf_expand_step()
      replace strbuf_expand() with strbuf_expand_step()
      strbuf: simplify strbuf_expand_literal_cb()
      ls-tree: simplify prefix handling
      pretty: avoid double negative in format_commit_item()
      pkt-line: add size parameter to packet_length()
      pretty: use strchr(3) in userformat_find_requirements()
      t6300: fix setup with GPGSSH but without GPG
      strbuf: use skip_prefix() in strbuf_addftime()
      ls-tree: fix --no-full-name
      describe: fix --no-exact-match
      pack-objects: fix --no-keep-true-parents
      pack-objects: fix --no-quiet
      bundle: use OPT_PASSTHRU_ARGV
      parse-options: disallow negating OPTION_SET_INT 0

Rubén Justo (11):
      config: fix a leak in git_config_copy_or_rename_section_in_file
      remote: fix a leak in query_matches_negative_refspec
      branch: fix a leak in dwim_and_setup_tracking
      branch: fix a leak in inherit_tracking
      branch: fix a leak in check_tracking_branch
      branch: fix a leak in setup_tracking
      rev-parse: fix a leak with --abbrev-ref
      branch: fix a leak in setup_tracking
      branch: fix a leak in cmd_branch
      config: fix a leak in git_config_copy_or_rename_section_in_file
      tests: mark as passing with SANITIZE=leak

Sean Allred (5):
      show-ref doc: update for internal consistency
      ls-remote doc: remove redundant --tags example
      ls-remote doc: show peeled tags in examples
      ls-remote doc: explain what each example does
      ls-remote doc: document the output format

Sebastian Thiel (1):
      mv: handle lstat() failure correctly

Shuqi Liang (2):
      diff-tree: integrate with sparse index
      worktree: integrate with sparse-index

Taylor Blau (53):
      object: add object_array initializer helper function
      pack-bitmap.c: extract `fill_in_bitmap()`
      pack-bitmap.c: use commit boundary during bitmap traversal
      builtin/submodule--helper.c: handle missing submodule URLs
      builtin/repack.c: only collect fully-formed packs
      reachable.c: extract `obj_is_recent()`
      gc: introduce `gc.recentObjectsHook`
      pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack
      t7701: make annotated tag unreachable
      fsck: suppress commit-graph output with `--no-progress`
      fsck: suppress MIDX output with `--no-progress`
      commit-graph.c: extract `verify_one_commit_graph()`
      commit-graph.c: iteratively verify commit-graph chains
      commit-graph.c: pass progress to `verify_one_commit_graph()`
      commit-graph.c: avoid duplicated progress output during `verify`
      builtin/for-each-ref.c: add `--exclude` option
      refs: plumb `exclude_patterns` argument throughout
      refs/packed-backend.c: refactor `find_reference_location()`
      refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
      refs/packed-backend.c: add trace2 counters for jump list
      revision.h: store hidden refs in a `strvec`
      refs.h: let `for_each_namespaced_ref()` take excluded patterns
      refs.h: implement `hidden_refs_to_excludes()`
      builtin/receive-pack.c: avoid enumerating hidden references
      upload-pack.c: avoid enumerating hidden refs where possible
      ls-refs.c: avoid enumerating hidden refs where possible
      builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
      packfile.c: prevent overflow in `nth_packed_object_id()`
      packfile.c: prevent overflow in `load_idx()`
      packfile.c: use checked arithmetic in `nth_packed_object_offset()`
      midx.c: use `size_t`'s for fanout nr and alloc
      midx.c: prevent overflow in `nth_midxed_object_oid()`
      midx.c: prevent overflow in `nth_midxed_offset()`
      midx.c: store `nr`, `alloc` variables as `size_t`'s
      midx.c: prevent overflow in `write_midx_internal()`
      midx.c: prevent overflow in `fill_included_packs_batch()`
      pack-bitmap.c: ensure that eindex lookups don't overflow
      commit-graph.c: prevent overflow in `write_commit_graph_file()`
      commit-graph.c: prevent overflow in add_graph_to_chain()
      commit-graph.c: prevent overflow in `load_oid_from_graph()`
      commit-graph.c: prevent overflow in `fill_commit_graph_info()`
      commit-graph.c: prevent overflow in `fill_commit_in_graph()`
      commit-graph.c: prevent overflow in `load_tree_for_commit()`
      commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
      commit-graph.c: prevent overflow in `merge_commit_graph()`
      commit-graph.c: prevent overflow in `write_commit_graph()`
      commit-graph.c: prevent overflow in `verify_commit_graph()`
      t/lib-commit-graph.sh: allow `graph_read_expect()` in sub-directories
      t/lib-commit-graph.sh: avoid directory change in `graph_git_behavior()`
      t5318: avoid top-level directory changes
      t5328: avoid top-level directory changes
      t/lib-commit-graph.sh: avoid sub-shell in `graph_git_behavior()`
      Documentation/RelNotes/2.42.0.txt: typofix

Teng Long (10):
      surround %s with quotes when failed to lookup commit
      notes.c: cleanup 'strbuf_grow' call in 'append_edit'
      notes.c: use designated initializers for clarity
      t3321: add test cases about the notes stripspace behavior
      notes.c: introduce '--separator=<paragraph-break>' option
      notes.c: append separator instead of insert by pos
      notes.c: introduce "--[no-]stripspace" option
      notes: introduce "--no-separator" option
      l10n: zh_CN: v2.42.0 round 1
      l10n: zh_CN: 2.42.0 round 2

Todd Zullinger (3):
      trace2 tests: fix PTHREADS prereq
      t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0
      t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

Victoria Dye (3):
      config: use gitdir to get worktree config
      config: pass 'repo' directly to 'config_with_options()'
      repository: move 'repository_format_worktree_config' to repo scope

Vinayak Dev (1):
      docs: add necessary headers to Documentation/MFOW.txt

Yi-Jyun Pan (1):
      l10n: zh_TW.po: Git 2.42

ZheNing Hu (1):
      ls-files: align format atoms with ls-tree

brian m. carlson (9):
      t: add a function to check executable bit
      var: add support for listing the shell
      var: format variable structure with C99 initializers
      var: adjust memory allocation for strings
      attr: expose and rename accessor functions
      var: add attributes files locations
      var: add config file locations
      ident: don't consider '.' a crud
      gitignore: ignore clangd .cache directory


^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.42.0-rc2
@ 2023-08-15 21:22  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-08-15 21:22 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel, git-packagers

A release candidate Git v2.42.0-rc2 is now available for testing at
the usual places.  It is comprised of 435 non-merge commits since
v2.41.0, contributed by 67 people, 16 of which are new faces [*].

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.42.0-rc2' tag and the 'master' branch that the tag points at:

  url = https://git.kernel.org/pub/scm/git/git
  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.41.0 are as follows.
Welcome to the Git development community!

  Adam Majer, Andreas Herrmann, Greg Alexander, Han Young, Jacob
  Abel, Jan Klötzke, Jim Pryor, Johan Ruokangas, Josh Sref, Josip
  Sokcevic, Louis Strous, Petar Vutov, Premek Vysoky, Sebastian
  Thiel, Tribo Dar, and Vinayak Dev.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alejandro R. Sedeño, Alex Henrie, Beat Bolli, brian m. carlson,
  Calvin Wan, Carlo Marcelo Arenas Belón, Christian Couder, D. Ben
  Knoble, Derrick Stolee, Elijah Newren, Eric Sunshine, Eric Wong,
  Glen Choo, Hariom Verma, Jacob Keller, Jaydeep Das, Jeff King,
  Johannes Schindelin, John Cai, Jonathan Nieder, Jonathan Tan,
  Junio C Hamano, Kousik Sanagavarapu, Kristoffer Haugsbakk, Linus
  Arver, Martin Ågren, Matthew Hughes, Matthias Aßhauer, M Hickford,
  Michael Haggerty, Mike Hommey, Nsengiyumva Wilberforce, Oswald
  Buddenhagen, Patrick Steinhardt, Philippe Blain, Phillip Wood,
  Randall S. Becker, René Scharfe, Rubén Justo, Sean Allred, Shuqi
  Liang, SZEDER Gábor, Taylor Blau, Teng Long, Todd Zullinger, Toon
  Claes, Torsten Bögershausen, Victoria Dye, Yuyi Wang, and ZheNing
  Hu.

[*] We are counting not just the authorship contribution but issue
    reporting, mentoring, helping and reviewing that are recorded in
    the commit trailers.

----------------------------------------------------------------

Git v2.42 Release Notes (draft)
===============================

UI, Workflows & Features

 * "git pack-refs" learns "--include" and "--exclude" to tweak the ref
   hierarchy to be packed using pattern matching.

 * 'git worktree add' learned how to create a worktree based on an
   orphaned branch with `--orphan`.

 * "git pack-objects" learned to invoke a new hook program that
   enumerates extra objects to be used as anchoring points to keep
   otherwise unreachable objects in cruft packs.

 * Add more "git var" for toolsmiths to learn various locations Git is
   configured with either via the configuration or hardcoded defaults.

 * 'git notes append' was taught '--separator' to specify string to insert
   between paragraphs.

 * The "git for-each-ref" family of commands learned placeholders
   related to GPG signature verification.

 * "git diff --no-index" learned to read from named pipes as if they
   were regular files, to allow "git diff <(process) <(substitution)"
   some shells support.

 * Help newbies by suggesting that there are cases where force-pushing
   is a valid and sensible thing to update a branch at a remote
   repository, rather than reconciling with merge/rebase.

 * "git blame --contents=file" has been taught to work in a bare
   repository.

 * "git branch -f X" to repoint the branch X said that X was "checked
   out" in another worktree, even when branch X was not and instead
   being bisected or rebased.  The message was reworded to say the
   branch was "in use".

 * Tone down the warning on SHA-256 repositories being an experimental
   curiosity.  We do not have support for them to interoperate with
   traditional SHA-1 repositories, but at this point, we do not plan
   to make breaking changes to SHA-256 repositories and there is no
   longer need for such a strongly phrased warning.


Performance, Internal Implementation, Development Support etc.

 * "git diff-tree" has been taught to take advantage of the
   sparse-index feature.

 * Clang's sanitizer implementation seems to work better than GCC's.
   (merge d88d727143 jk/ci-use-clang-for-sanitizer-jobs later to maint).

 * The object traversal using reachability bitmap done by
   "pack-object" has been tweaked to take advantage of the fact that
   using "boundary" commits as representative of all the uninteresting
   ones can save quite a lot of object enumeration.

 * discover_git_directory() no longer touches the_repository.

 * "git worktree" learned to work better with sparse index feature.

 * When the external merge driver is killed by a signal, its output
   should not be trusted as a resolution with conflicts that is
   proposed by the driver, but the code did.

 * The set-up code for the get_revision() API now allows feeding
   options like --all and --not in the --stdin mode.

 * Move functions that are not about pure string manipulation out of
   strbuf.[ch]

 * "imap-send" codepaths got cleaned up to get rid of unused
   parameters.

 * Enumerating refs in the packed-refs file, while excluding refs that
   match certain patterns, has been optimized.

 * Mark-up unused parameters in the code so that we can eventually
   enable -Wunused-parameter by default.

 * Instead of inventing a custom counter variables for debugging,
   use existing trace2 facility in the fsync customization codepath.

 * "git branch --list --format=<format>" and friends are taught
   a new "%(describe)" placeholder.

 * Clarify how to choose the starting point for a new topic in
   developer guidance document.

 * The implementation of "get_sha1_hex()" that reads a hexadecimal
   string that spells a full object name has been extended to cope
   with any hash function used in the repository, but the "sha1" in
   its name survived.  Rename it to get_hash_hex(), a name that is
   more consistent within its friends like get_hash_hex_algop().

 * Command line parser fix, and a small parse-options API update.


Fixes since v2.41
-----------------

 * "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the
   command failed, so that the user can salvage what they typed.
   (merge 08c12ec1d0 kh/keep-tag-editmsg-upon-failure later to maint).

 * The "-s" (silent, squelch) option of the "diff" family of commands
   did not interact with other options that specify the output format
   well.  This has been cleaned up so that it will clear all the
   formatting options given before.
   (merge 9d484b92ed jc/diff-s-with-other-options later to maint).

 * Update documentation regarding Coccinelle patches.
   (merge 3bd0097cfc gc/doc-cocci-updates later to maint).

 * Some atoms that can be used in "--format=<format>" for "git ls-tree"
   were not supported by "git ls-files", even though they were relevant
   in the context of the latter.
   (merge 4d28c4f75f zh/ls-files-format-atoms later to maint).

 * Document more pseudo-refs and teach the command line completion
   machinery to complete AUTO_MERGE.
   (merge 982ff3a649 pb/complete-and-document-auto-merge-and-friends later to maint).

 * "git submodule" code trusted the data coming from the config (and
   the in-tree .gitmodules file) too much without validating, leading
   to NULL dereference if the user mucks with a repository (e.g.
   submodule.<name>.url is removed).  This has been corrected.
   (merge fbc806acd1 tb/submodule-null-deref-fix later to maint).

 * The value of config.worktree is per-repository, but has been kept
   in a singleton global variable per process. This has been OK as
   most Git operations interacted with a single repository at a time,
   but not right for operations like recursive "grep" that want to
   access multiple repositories from a single process without forking.

   The global variable has been eliminated and made into a member in
   the per-repository data structure.
   (merge 3867f6d650 vd/worktree-config-is-per-repository later to maint).

 * "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.
   (merge 8260bc5902 jk/log-follow-with-non-literal-pathspec later to maint).

 * Introduce a mechanism to disable replace refs globally and per
   repository.
   (merge 9c7d1b057f ds/disable-replace-refs later to maint).

 * "git cat-file --batch" and friends learned "-Z" that uses NUL
   delimiter for both input and output.
   (merge f79e18849b ps/cat-file-null-output later to maint).

 * The reimplemented "git add -i" did not honor color.ui configuration.
   (merge 6f74648cea ds/add-i-color-configuration-fix later to maint).

 * Compilation fix for platforms without D_TYPE in struct dirent.
   (merge 03bf92b9bf as/dtype-compilation-fix later to maint).

 * Suggest to refrain from using hex literals that are non-portable
   when writing printf(1) format strings.
   (merge f0b68f0546 jt/doc-use-octal-with-printf later to maint).

 * Simplify error message when run-command fails to start a command.
   (merge 6d224ac286 rs/run-command-exec-error-on-noent later to maint).

 * Gracefully deal with a stale MIDX file that lists a packfile that
   no longer exists.
   (merge 06f3867865 tb/open-midx-bitmap-fallback later to maint).

 * Even when diff.ignoreSubmodules tells us to ignore submodule
   changes, "git commit" with an index that already records changes to
   submodules should include the submodule changes in the resulting
   commit, but it did not.
   (merge 5768478edc js/defeat-ignore-submodules-config-with-explicit-addition later to maint).

 * When "git commit --trailer=..." invokes the interpret-trailers
   machinery, it knows what it feeds to interpret-trailers is a full
   log message without any patch, but failed to express that by
   passing the "--no-divider" option, which has been corrected.
   (merge be3d654343 jk/commit-use-no-divider-with-interpret-trailers later to maint).

 * Avoid breakage of "git pack-objects --cruft" due to inconsistency
   between the way the code enumerates packfiles in the repository.
   (merge 73320e49ad tb/collect-pack-filenames-fix later to maint).

 * We create .pack and then .idx, we consider only packfiles that have
   .idx usable (those with only .pack are not ready yet), so we should
   remove .idx before removing .pack for consistency.
   (merge 0dd1324a73 ds/remove-idx-before-pack later to maint).

 * Partially revert a sanity check that the rest of the config code
   was not ready, to avoid triggering it in a corner case.
   (merge a53f43f900 gc/config-partial-submodule-kvi-fix later to maint).

 * "git apply" punts when it is fed too large a patch input; the error
   message it gives when it happens has been clarified.
   (merge 42612e18d2 pw/apply-too-large later to maint).

 * During a cherry-pick or revert session that works on multiple
   commits, "git status" did not give correct information, which has
   been corrected.
   (merge a096a889f4 jk/cherry-pick-revert-status later to maint).

 * A few places failed to differentiate the case where the index is
   truly empty (nothing added) and we haven't yet read from the
   on-disk index file, which have been corrected.
   (merge 2ee045eea1 js/empty-index-fixes later to maint).

 * "git bugreport" tests did not test what it wanted to test, which
   has been corrected.
   (merge 1aa92b8500 ma/t0091-fixup later to maint).

 * Code snippets in a tutorial document no longer compiled after
   recent header shuffling, which have been corrected.
   (merge bbd7c7b7c0 vd/adjust-mfow-doc-to-updated-headers later to maint).

 * "git ls-files '(attr:X)D/'" that triggers the common prefix
   optimization codepath failed to read from "D/.gitattributes",
   which has been corrected.
   (merge f4a8fde057 jc/pathspec-match-with-common-prefix later to maint).

 * "git fsck --no-progress" still spewed noise from the commit-graph
   subsystem, which has been corrected.
   (merge 9281cd07f0 tb/fsck-no-progress later to maint).

 * Various offset computation in the code that accesses the packfiles
   and other data in the object layer has been hardened against
   arithmetic overflow, especially on 32-bit systems.
   (merge 9a25cad7e0 tb/object-access-overflow-protection later to maint).

 * Names of MinGW header files are spelled in mixed case in some
   source files, but the build host can be using case sensitive
   filesystem with header files with their name spelled in all
   lowercase.
   (merge 4a53d0d0bc mh/mingw-case-sensitive-build later to maint).

 * Update message mark-up for i18n in "git bundle".
   (merge bbb6acd998 dk/bundle-i18n-more later to maint).

 * "git tag --list --points-at X" showed tags that directly refers to
   object X, but did not list a tag that points at such a tag, which
   has been corrected.

 * "./configure --with-expat=no" did not work as a way to refuse use
   of the expat library on a system with the library installed, which
   has been corrected.
   (merge fb8f7269c2 ah/autoconf-fixes later to maint).

 * When the user edits "rebase -i" todo file so that it starts with a
   "fixup", which would make it invalid, the command truncated the
   rest of the file before giving an error and returning the control
   back to the user.  Stop truncating to make it easier to correct
   such a malformed todo file.
   (merge 9645a087c2 ah/sequencer-rewrite-todo-fix later to maint).

 * Rewrite the description of giving a custom command to the
   submodule.<name>.update configuration variable.
   (merge 7cebc5bd78 pv/doc-submodule-update-settings later to maint).

 * Adjust to OpenSSL 3+, which deprecates its SHA-1 functions based on
   its traditional API, by using its EVP API instead.
   (merge bda9c12073 ew/hash-with-openssl-evp later to maint).

 * Exclude "." from the set of characters to be removed from the
   beginning and the end of the human-readable name.
   (merge 1c04cb0744 bc/ident-dot-is-no-longer-crud-letter later to maint).

 * "git bisect visualize" stopped running "gitk" on Git for Windows
   when the command was reimplemented in C around Git 2.34 timeframe.
   This has been corrected.
   (merge fff1594fa7 ma/locate-in-path-for-windows later to maint).

 * "git rebase -i" with a series of squash/fixup, when one of the
   steps stopped in conflicts and ended up getting skipped, did not
   handle the accumulated commit log messages, which has been
   corrected.
   (merge 6ce7afe163 pw/rebase-skip-commit-message-fix later to maint).

 * Adjust to newer Term::ReadLine to prevent it from breaking
   the interactive prompt code in send-email.
   (merge c016726c2d jk/send-email-with-new-readline later to maint).

 * Windows updates.
   (merge 0050f8e401 ds/maintenance-on-windows-fix later to maint).

 * Correct use of lstat() that assumed a failing call would not
   clobber the statbuf.
   (merge 72695d8214 st/mv-lstat-fix later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge 51f9d2e563 sa/doc-ls-remote later to maint).
   (merge c6d26a9dda jk/format-patch-message-id-unleak later to maint).
   (merge f7e063f326 ps/fetch-cleanups later to maint).
   (merge e4cf013468 tl/quote-problematic-arg-for-clarity later to maint).
   (merge 20025fdfc7 tz/test-ssh-verifytime-fix later to maint).
   (merge e48a21df65 tz/test-fix-pthreads-prereq later to maint).
   (merge 68b51172e3 mh/commit-reach-get-reachable-plug-leak later to maint).
   (merge aeee1408ce kh/use-default-notes-doc later to maint).
   (merge 3b8724bce6 jc/test-modernization later to maint).
   (merge 447a3b7331 jc/test-modernization-2 later to maint).
   (merge d57fa7fc73 la/doc-interpret-trailers later to maint).
   (merge 548afb0d9a la/docs-typofixes later to maint).
   (merge 3744ffcbcd rs/doc-ls-tree-hex-literal later to maint).
   (merge 6c26da8404 mh/credential-erase-improvements later to maint).
   (merge 78e56cff69 tz/lib-gpg-prereq-fix later to maint).
   (merge 80d32e84b5 rj/leakfixes later to maint).
   (merge 0a868031ed pb/complete-diff-options later to maint).
   (merge d4f28279ad jc/doc-hash-object-types later to maint).
   (merge 1876a5ae15 ks/t4205-test-describe-with-abbrev-fix later to maint).
   (merge 6e6a529b57 jk/fsck-indices-in-worktrees later to maint).
   (merge 3e81b896f7 rs/packet-length-simplify later to maint).
   (merge 4c9cb51fe7 mh/doc-credential-helpers later to maint).
   (merge 3437f549dd jr/gitignore-doc-example-markup later to maint).
   (merge 947ebd62a0 jc/am-parseopt-fix later to maint).
   (merge e12cb98e1e jc/branch-parseopt-fix later to maint).
   (merge d6f598e443 jc/gitignore-doc-pattern-markup later to maint).
   (merge a2dad4868b jc/transport-parseopt-fix later to maint).
   (merge 68cbb20e73 jc/parse-options-show-branch later to maint).
   (merge 3821eb6c3d jc/parse-options-reset later to maint).
   (merge c48af99a3e bb/trace2-comment-fix later to maint).
   (merge c95ae3ff9c rs/describe-parseopt-fix later to maint).
   (merge 36f76d2a25 rs/pack-objects-parseopt-fix later to maint).
   (merge 30c8c55cbf jc/tree-walk-drop-base-offset later to maint).
   (merge d089a06421 rs/bundle-parseopt-cleanup later to maint).
   (merge 823839bda1 ew/sha256-gcrypt-leak-fixes later to maint).
   (merge a5c01603b3 bc/ignore-clangd-cache later to maint).
   (merge 12009a182b js/allow-t4000-to-be-indented-with-spaces later to maint).
   (merge b3dcd24b8a jc/send-email-pre-process-fix later to maint).

----------------------------------------------------------------

Changes since v2.41.0 are as follows:

Adam Majer (1):
      doc: sha256 is no longer experimental

Alejandro R. Sedeño (1):
      statinfo.h: move DTYPE defines from dir.h

Alex Henrie (4):
      wt-status: don't show divergence advice when committing
      remote: don't imply that integration is always required before pushing
      push: don't imply that integration is always required before pushing
      sequencer: finish parsing the todo list despite an invalid first line

Andreas Herrmann (3):
      configure.ac: don't overwrite NO_EXPAT option
      configure.ac: don't overwrite NO_CURL option
      configure.ac: always save NO_ICONV to config.status

Beat Bolli (2):
      trace2: fix a comment
      wrapper: use trace2 counters to collect fsync stats

Calvin Wan (13):
      strbuf: clarify API boundary
      strbuf: clarify dependency
      abspath: move related functions to abspath
      credential-store: move related functions to credential-store file
      object-name: move related functions to object-name
      path: move related function to path
      strbuf: remove global variable
      git-compat-util: move strbuf.c funcs to its header
      git-compat-util: move wrapper.c funcs to its header
      sane-ctype.h: create header for sane-ctype macros
      kwset: move translation table from ctype
      treewide: remove unnecessary includes for wrapper.h
      git-compat-util: move alloc macros to git-compat-util.h

D. Ben Knoble (2):
      i18n: mark more bundle.c strings for translation
      t4002: fix "diff can read from stdin" syntax

Derrick Stolee (7):
      add: check color.ui for interactive add
      add: test use of brackets when color is disabled
      repository: create disable_replace_refs()
      replace-objects: create wrapper around setting
      repository: create read_replace_refs setting
      packfile: delete .idx files before .pack files
      builtin/repack.c: only repack `.pack`s that exist

Elijah Newren (28):
      init-db: document existing bug with core.bare in template config
      init-db: remove unnecessary global variable
      init-db, clone: change unnecessary global into passed parameter
      setup: adopt shared init-db & clone code
      read-cache: move shared commit and ls-files code
      add: modify add_files_to_cache() to avoid globals
      read-cache: move shared add/checkout/commit code
      statinfo: move stat_{data,validity} functions from cache/read-cache
      run-command.h: move declarations for run-command.c from cache.h
      name-hash.h: move declarations for name-hash.c from cache.h
      sparse-index.h: move declarations for sparse-index.c from cache.h
      preload-index.h: move declarations for preload-index.c from elsewhere
      diff.h: move declaration for global in diff.c from cache.h
      merge.h: move declarations for merge.c from cache.h
      repository.h: move declaration of the_index from cache.h
      read-cache*.h: move declarations for read-cache.c functions from cache.h
      cache.h: remove this no-longer-used header
      log-tree: replace include of revision.h with simple forward declaration
      repository: remove unnecessary include of path.h
      diff.h: remove unnecessary include of oidset.h
      list-objects-filter-options.h: remove unneccessary include
      builtin.h: remove unneccessary includes
      git-compat-util.h: remove unneccessary include of wildmatch.h
      merge-ll: rename from ll-merge
      khash: name the structs that khash declares
      object-store-ll.h: split this header out of object-store.h
      hash-ll, hashmap: move oidhash() to hash-ll
      fsmonitor-ll.h: split this header out of fsmonitor.h

Eric Sunshine (1):
      fsck: avoid misleading variable name

Eric Wong (5):
      sha256/gcrypt: fix build with SANITIZE=leak
      sha256/gcrypt: fix memory leak with SHA-256 repos
      sha256/gcrypt: die on gcry_md_open failures
      sha256: avoid functions deprecated in OpenSSL 3+
      avoid SHA-1 functions deprecated in OpenSSL 3+

Glen Choo (16):
      cocci: add headings to and reword README
      cocci: codify authoring and reviewing practices
      setup.c: don't setup in discover_git_directory()
      config: don't BUG when both kvi and source are set
      config: inline git_color_default_config
      urlmatch.h: use config_fn_t type
      config: add ctx arg to config_fn_t
      config.c: pass ctx in configsets
      config: pass ctx with config files
      config.c: pass ctx with CLI config
      trace2: plumb config kvi
      config: pass kvi to die_bad_number()
      config.c: remove config_reader from configsets
      config: add kvi.path, use it to evaluate includes
      config: pass source to config_parser_event_fn_t
      mailmap: change primary address for Glen Choo

Han Young (1):
      blame: allow --contents to work with bare repo

Jacob Abel (11):
      worktree add: include -B in usage docs
      t2400: cleanup created worktree in test
      t2400: refactor "worktree add" opt exclusion tests
      t2400: add tests to verify --quiet
      worktree add: add --orphan flag
      worktree add: introduce "try --orphan" hint
      worktree add: extend DWIM to infer --orphan
      worktree add: emit warn when there is a bad HEAD
      t2400: drop no-op `--sq` from rev-parse call
      builtin/worktree.c: convert tab in advice to space
      t2400: rewrite regex to avoid unintentional PCRE

Jacob Keller (1):
      fix cherry-pick/revert status when doing multiple commits

Jan Klötzke (1):
      ref-filter: handle nested tags in --points-at option

Jeff King (40):
      format-patch: free rev.message_id when exiting
      format-patch: free elements of rev.ref_message_ids list
      pathspec: factor out magic-to-name function
      diff: factor out --follow pathspec check
      diff: detect pathspec magic not supported by --follow
      ci: use clang for ASan/UBSan checks
      ci: run ASan/UBSan in a single job
      ci: drop linux-clang job
      commit: pass --no-divider to interpret-trailers
      http: handle both "h2" and "h2h3" in curl info lines
      var: mark unused parameters in git_var callbacks
      imap-send: use server conf argument in setup_curl()
      imap-send: drop unused parameter from imap_cmd_cb callback
      imap-send: drop unused fields from imap_cmd_cb
      refs.c: rename `ref_filter`
      ref-filter.h: provide `REF_FILTER_INIT`
      ref-filter: clear reachable list pointers after freeing
      ref-filter: add `ref_filter_clear()`
      ref-filter.c: parameterize match functions over patterns
      test-ref-store: drop unimplemented reflog-expire command
      do_for_each_ref_helper(): mark unused repository parameter
      http: mark unused parameters in curl callbacks
      http-push: mark unused parameter in xml callback
      am: mark unused keep_cr parameters
      count-objects: mark unused parameter in alternates callback
      revisions: drop unused "opt" parameter in "tweak" callbacks
      fsck: mark unused parameters in various fsck callbacks
      merge-tree: mark unused parameter in traverse callback
      replace: mark unused parameter in ref callback
      replace: mark unused parameter in each_mergetag_fn callback
      rev-parse: mark unused parameter in for_each_abbrev callback
      tag: mark unused parameters in each_tag_name_fn callbacks
      t/helper: mark unused callback void data parameters
      ref-filter: avoid parsing tagged objects in match_points_at()
      ref-filter: avoid parsing non-tags in match_points_at()
      ref-filter: simplify return type of match_points_at
      send-email: drop FakeTerm hack
      send-email: avoid creating more than one Term::ReadLine object
      repack: free geometry struct
      t4053: avoid writing to unopened pipe

Johan Ruokangas (1):
      gitignore.txt: use backticks instead of double quotes

Johannes Schindelin (6):
      do_read_index(): always mark index as initialized unless erroring out
      split-index: accept that a base index can be empty
      commit -a -m: allow the top-level tree to become empty again
      t0040: declare non-tab indentation to be okay in this script
      win32: add a helper to run `git.exe` without a foreground window
      git maintenance: avoid console window in scheduled tasks on Windows

John Cai (34):
      docs: clarify git-pack-refs --all will pack all refs
      pack-refs: teach --exclude option to exclude refs from being packed
      pack-refs: teach pack-refs --include option
      t0000-basic: modernize test format
      t0030-stripspace: modernize test format
      t3210-pack-refs: modernize test format
      t1001-read-tree-m-2way: modernize test format
      t1002-read-tree-m-u-2way: modernize test format
      t1006-cat-file: modernize test format
      t3500-cherry: modernize test format
      t3700-add: modernize test format
      t3903-stash: modernize test format
      t4002-diff-basic: modernize test format
      t4003-diff-rename-1: modernize test format
      t4004-diff-rename-symlink: modernize test format
      t4202-log: modernize test format
      t4206-log-follow-harder-copies: modernize test format
      t5300-pack-object: modernize test format
      t5301-sliding-window: modernize test format
      t5303-pack-corruption-resilience: modernize test format
      t5306-pack-nobase: modernize test format
      t6050-replace: modernize test format
      t7101-reset-empty-subdirs: modernize test format
      t7110-reset-merge: modernize test format
      t7111-reset-table: modernize test format
      t7201-co: modernize test format
      t7508-status: modernize test format
      t7600-merge: modernize test format
      t7700-repack: modernize test format
      t9100-git-svn-basic: modernize test format
      t9104-git-svn-follow-parent: modernize test format
      t9200-git-cvsexportcommit: modernize test format
      t9400-git-cvsserver-server: modernize test format
      docs: add git hash-object -t option's possible values

Jonathan Tan (1):
      CodingGuidelines: use octal escapes, not hex

Josip Sokcevic (1):
      diff-lib: honor override_submodule_config flag bit

Junio C Hamano (47):
      diff: fix interaction between the "-s" option and other options
      show-branch doc: say <ref>, not <reference>
      Start the 2.42 cycle
      The second batch for 2.42
      The third batch
      ll-merge: killing the external merge driver aborts the merge
      The fourth batch
      t6406: skip "external merge driver getting killed by a signal" test on Windows
      The fifth batch
      The sixth batch
      The seventh batch
      The eighth batch
      t6135: attr magic with path pattern
      tree-walk: lose base_offset that is never used in tree_entry_interesting
      tree-walk: drop unused base_offset from do_match()
      The ninth batch
      dir: match "attr" pathspec magic with correct paths
      The tenth batch
      The eleventh batch
      The twelfth batch
      gitignore.txt: mark up explanation of patterns consistently
      am: simplify parsing of "--[no-]keep-cr"
      branch: reject "--no-all" and "--no-remotes" early
      parse-options: introduce OPT_IPVERSION()
      fetch: reject --no-ipv[46]
      show-branch: --no-sparse should give dense output
      short help: allow multi-line opthelp
      remote: simplify "remote add --tags" help text
      short help: allow a gap smaller than USAGE_GAP
      show-branch: reject --[no-](topo|date)-order
      reset: reject --no-(mixed|soft|hard|merge|keep) option
      The thirteenth batch
      branch: update the message to refuse touching a branch in-use
      hex: retire get_sha1_hex()
      The fourteenth batch
      SubmittingPatches: choice of base for fixing an older maintenance track
      The fifteenth batch
      SubmittingPatches: explain why 'next' and above are inappropriate base
      SubmittingPatches: use of older maintenance tracks is an exception
      The sixteenth batch
      MyFirstContribution: refrain from self-iterating too much
      The seventeenth batch
      The eighteenth batch
      Git 2.42-rc0
      A few more topics before -rc1
      Git 2.42-rc1
      Git 2.42-rc2

Kousik Sanagavarapu (5):
      t/lib-gpg: introduce new prereq GPG2
      ref-filter: add new "signature" atom
      t4205: correctly test %(describe:abbrev=...)
      ref-filter: add multiple-option parsing functions
      ref-filter: add new "describe" atom

Kristoffer Haugsbakk (5):
      doc: tag: document `TAG_EDITMSG`
      t/t7004-tag: add regression test for successful tag creation
      tag: keep the message file in case ref transaction fails
      notes: update documentation for `use_default_notes`
      notes: move the documentation to the struct

Linus Arver (15):
      docs: typofixes
      doc: trailer: fix grammar
      doc: trailer: swap verb order
      doc: trailer: drop "commit message part" phrasing
      doc: trailer: examples: avoid the word "message" by itself
      doc: trailer: remove redundant phrasing
      doc: trailer: use angle brackets for <token> and <value>
      doc: trailer.<token>.command: emphasize deprecation
      doc: trailer: mention 'key' in DESCRIPTION
      doc: trailer: add more examples in DESCRIPTION
      SubmittingPatches: reword awkward phrasing
      SubmittingPatches: discuss subsystems separately from git.git
      SubmittingPatches: de-emphasize branches as starting points
      SubmittingPatches: emphasize need to communicate non-default starting points
      SubmittingPatches: simplify guidance for choosing a starting point

M Hickford (3):
      credential: avoid erasing distinct password
      credential: erase all matching credentials
      doc: gitcredentials: link to helper list

Martin Ågren (1):
      t0091-bugreport.sh: actually verify some content of report

Matthias Aßhauer (3):
      run-command: conditionally define locate_in_PATH()
      compat/mingw: implement a native locate_in_PATH()
      docs: update when `git bisect visualize` uses `gitk`

Mike Hommey (2):
      commit-reach: fix memory leak in get_reachable_subset()
      mingw: use lowercase includes for some Windows headers

Oswald Buddenhagen (2):
      advice: handle "rebase" in error_resolve_conflict()
      t9001: remove excessive GIT_SEND_EMAIL_NOTTY=1

Patrick Steinhardt (17):
      fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value
      fetch: drop unneeded NULL-check for `remote_ref`
      fetch: pass through `fetch_config` directly
      fetch: use `fetch_config` to store "fetch.prune" value
      fetch: use `fetch_config` to store "fetch.pruneTags" value
      fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
      fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
      fetch: use `fetch_config` to store "fetch.parallel" value
      fetch: use `fetch_config` to store "submodule.fetchJobs" value
      t1006: don't strip timestamps from expected results
      t1006: modernize test style to use `test_cmp`
      strbuf: provide CRLF-aware helper to read until a specified delimiter
      cat-file: simplify reading from standard input
      cat-file: add option '-Z' that delimits input and output with NUL
      revision: reorder `read_revisions_from_stdin()`
      revision: small readability improvement for reading from stdin
      revision: handle pseudo-opts in `--stdin` mode

Petar Vutov (1):
      doc: highlight that .gitmodules does not support !command

Philippe Blain (30):
      revisions.txt: use description list for special refs
      revisions.txt: document more special refs
      completion: complete REVERT_HEAD and BISECT_HEAD
      git-merge.txt: modernize word choice in "True merge" section
      Documentation: document AUTO_MERGE
      completion: complete AUTO_MERGE
      completion: add comments describing __git_diff_* globals
      completion: complete --break-rewrites
      completion: complete --cc
      completion: complete --combined-all-paths
      completion: complete --compact-summary
      completion: complete --default-prefix
      completion: complete --find-copies
      completion: complete --find-object
      completion: complete --find-renames
      completion: complete --function-context
      completion: complete --ignore-matching-lines
      completion: complete --irreversible-delete
      completion: complete --ita-invisible-in-index and --ita-visible-in-index
      completion: complete --line-prefix
      completion: complete --no-relative
      completion: complete --no-stat
      completion: complete --output
      completion: complete --output-indicator-{context,new,old}
      completion: complete --unified
      completion: complete --ws-error-highlight
      completion: move --pickaxe-{all,regex} to __git_diff_common_options
      completion: complete --diff-merges, its options and --no-diff-merges
      completion: complete --remerge-diff
      diff.c: mention completion above add_diff_options

Phillip Wood (7):
      apply: improve error messages when reading patch
      diff --no-index: refuse to compare stdin to a directory
      diff --no-index: die on error reading stdin
      t4054: test diff --no-index with stdin
      diff --no-index: support reading from named pipes
      rebase --skip: fix commit message clean up when skipping squash
      t4053: avoid race when killing background processes

René Scharfe (20):
      t1800: loosen matching of error message for bad shebang
      run-command: report exec error even on ENOENT
      ls-tree: fix documentation of %x format placeholder
      pretty: factor out expand_separator()
      strbuf: factor out strbuf_expand_step()
      replace strbuf_expand_dict_cb() with strbuf_expand_step()
      replace strbuf_expand() with strbuf_expand_step()
      strbuf: simplify strbuf_expand_literal_cb()
      ls-tree: simplify prefix handling
      pretty: avoid double negative in format_commit_item()
      pkt-line: add size parameter to packet_length()
      pretty: use strchr(3) in userformat_find_requirements()
      t6300: fix setup with GPGSSH but without GPG
      strbuf: use skip_prefix() in strbuf_addftime()
      ls-tree: fix --no-full-name
      describe: fix --no-exact-match
      pack-objects: fix --no-keep-true-parents
      pack-objects: fix --no-quiet
      bundle: use OPT_PASSTHRU_ARGV
      parse-options: disallow negating OPTION_SET_INT 0

Rubén Justo (11):
      config: fix a leak in git_config_copy_or_rename_section_in_file
      remote: fix a leak in query_matches_negative_refspec
      branch: fix a leak in dwim_and_setup_tracking
      branch: fix a leak in inherit_tracking
      branch: fix a leak in check_tracking_branch
      branch: fix a leak in setup_tracking
      rev-parse: fix a leak with --abbrev-ref
      branch: fix a leak in setup_tracking
      branch: fix a leak in cmd_branch
      config: fix a leak in git_config_copy_or_rename_section_in_file
      tests: mark as passing with SANITIZE=leak

Sean Allred (5):
      show-ref doc: update for internal consistency
      ls-remote doc: remove redundant --tags example
      ls-remote doc: show peeled tags in examples
      ls-remote doc: explain what each example does
      ls-remote doc: document the output format

Sebastian Thiel (1):
      mv: handle lstat() failure correctly

Shuqi Liang (2):
      diff-tree: integrate with sparse index
      worktree: integrate with sparse-index

Taylor Blau (53):
      object: add object_array initializer helper function
      pack-bitmap.c: extract `fill_in_bitmap()`
      pack-bitmap.c: use commit boundary during bitmap traversal
      builtin/submodule--helper.c: handle missing submodule URLs
      builtin/repack.c: only collect fully-formed packs
      reachable.c: extract `obj_is_recent()`
      gc: introduce `gc.recentObjectsHook`
      pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack
      t7701: make annotated tag unreachable
      fsck: suppress commit-graph output with `--no-progress`
      fsck: suppress MIDX output with `--no-progress`
      commit-graph.c: extract `verify_one_commit_graph()`
      commit-graph.c: iteratively verify commit-graph chains
      commit-graph.c: pass progress to `verify_one_commit_graph()`
      commit-graph.c: avoid duplicated progress output during `verify`
      builtin/for-each-ref.c: add `--exclude` option
      refs: plumb `exclude_patterns` argument throughout
      refs/packed-backend.c: refactor `find_reference_location()`
      refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
      refs/packed-backend.c: add trace2 counters for jump list
      revision.h: store hidden refs in a `strvec`
      refs.h: let `for_each_namespaced_ref()` take excluded patterns
      refs.h: implement `hidden_refs_to_excludes()`
      builtin/receive-pack.c: avoid enumerating hidden references
      upload-pack.c: avoid enumerating hidden refs where possible
      ls-refs.c: avoid enumerating hidden refs where possible
      builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
      packfile.c: prevent overflow in `nth_packed_object_id()`
      packfile.c: prevent overflow in `load_idx()`
      packfile.c: use checked arithmetic in `nth_packed_object_offset()`
      midx.c: use `size_t`'s for fanout nr and alloc
      midx.c: prevent overflow in `nth_midxed_object_oid()`
      midx.c: prevent overflow in `nth_midxed_offset()`
      midx.c: store `nr`, `alloc` variables as `size_t`'s
      midx.c: prevent overflow in `write_midx_internal()`
      midx.c: prevent overflow in `fill_included_packs_batch()`
      pack-bitmap.c: ensure that eindex lookups don't overflow
      commit-graph.c: prevent overflow in `write_commit_graph_file()`
      commit-graph.c: prevent overflow in add_graph_to_chain()
      commit-graph.c: prevent overflow in `load_oid_from_graph()`
      commit-graph.c: prevent overflow in `fill_commit_graph_info()`
      commit-graph.c: prevent overflow in `fill_commit_in_graph()`
      commit-graph.c: prevent overflow in `load_tree_for_commit()`
      commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
      commit-graph.c: prevent overflow in `merge_commit_graph()`
      commit-graph.c: prevent overflow in `write_commit_graph()`
      commit-graph.c: prevent overflow in `verify_commit_graph()`
      t/lib-commit-graph.sh: allow `graph_read_expect()` in sub-directories
      t/lib-commit-graph.sh: avoid directory change in `graph_git_behavior()`
      t5318: avoid top-level directory changes
      t5328: avoid top-level directory changes
      t/lib-commit-graph.sh: avoid sub-shell in `graph_git_behavior()`
      Documentation/RelNotes/2.42.0.txt: typofix

Teng Long (8):
      surround %s with quotes when failed to lookup commit
      notes.c: cleanup 'strbuf_grow' call in 'append_edit'
      notes.c: use designated initializers for clarity
      t3321: add test cases about the notes stripspace behavior
      notes.c: introduce '--separator=<paragraph-break>' option
      notes.c: append separator instead of insert by pos
      notes.c: introduce "--[no-]stripspace" option
      notes: introduce "--no-separator" option

Todd Zullinger (3):
      trace2 tests: fix PTHREADS prereq
      t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0
      t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

Victoria Dye (3):
      config: use gitdir to get worktree config
      config: pass 'repo' directly to 'config_with_options()'
      repository: move 'repository_format_worktree_config' to repo scope

Vinayak Dev (1):
      docs: add necessary headers to Documentation/MFOW.txt

ZheNing Hu (1):
      ls-files: align format atoms with ls-tree

brian m. carlson (9):
      t: add a function to check executable bit
      var: add support for listing the shell
      var: format variable structure with C99 initializers
      var: adjust memory allocation for strings
      attr: expose and rename accessor functions
      var: add attributes files locations
      var: add config file locations
      ident: don't consider '.' a crud
      gitignore: ignore clangd .cache directory


^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.42.0-rc1
@ 2023-08-10 16:45  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-08-10 16:45 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel, git-packagers

A release candidate Git v2.42.0-rc1 is now available for testing at
the usual places.  It is comprised of 422 non-merge commits since
v2.41.0, contributed by 63 people, 15 of which are new faces [*].

There are still some corners to be rounded before everything is
ready to go, but I've already extended -rc1 by a day, so let's not
wait for the regression fixes we already know of but haven't got
around to.  They will be in 'master' before -rc2 is tagged.  On the
other hand, changes that are not about fixing new regressions
introduced during this cycle are to be postponed until the next
cycle.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.42.0-rc1' tag and the 'master' branch that the tag points at:

  url = https://git.kernel.org/pub/scm/git/git
  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.41.0 are as follows.
Welcome to the Git development community!

  Adam Majer, Andreas Herrmann, Greg Alexander, Han Young, Jacob
  Abel, Jan Klötzke, Jim Pryor, Johan Ruokangas, Josh Sref,
  Josip Sokcevic, Louis Strous, Petar Vutov, Premek Vysoky,
  Tribo Dar, and Vinayak Dev.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alejandro R. Sedeño, Alex Henrie, Beat Bolli, brian m. carlson,
  Calvin Wan, Christian Couder, D. Ben Knoble, Derrick Stolee,
  Elijah Newren, Eric Sunshine, Eric Wong, Glen Choo, Hariom Verma,
  Jacob Keller, Jaydeep Das, Jeff King, Johannes Schindelin, John
  Cai, Jonathan Nieder, Jonathan Tan, Junio C Hamano, Kousik
  Sanagavarapu, Kristoffer Haugsbakk, Linus Arver, Martin Ågren,
  Matthew Hughes, Matthias Aßhauer, M Hickford, Michael Haggerty,
  Mike Hommey, Nsengiyumva Wilberforce, Patrick Steinhardt, Philippe
  Blain, Phillip Wood, Randall S. Becker, René Scharfe, Rubén Justo,
  Sean Allred, Shuqi Liang, SZEDER Gábor, Taylor Blau, Teng Long,
  Todd Zullinger, Toon Claes, Torsten Bögershausen, Victoria Dye,
  and ZheNing Hu.

[*] We are counting not just the authorship contribution but issue
    reporting, mentoring, helping and reviewing that are recorded in
    the commit trailers.

----------------------------------------------------------------

Git v2.42 Release Notes (draft)
===============================

UI, Workflows & Features

 * "git pack-refs" learns "--include" and "--exclude" to tweak the ref
   hierarchy to be packed using pattern matching.

 * 'git worktree add' learned how to create a worktree based on an
   orphaned branch with `--orphan`.

 * "git pack-objects" learned to invoke a new hook program that
   enumerates extra objects to be used as anchoring points to keep
   otherwise unreachable objects in cruft packs.

 * Add more "git var" for toolsmiths to learn various locations Git is
   configured with either via the configuration or hardcoded defaults.

 * 'git notes append' was taught '--separator' to specify string to insert
   between paragraphs.

 * The "git for-each-ref" family of commands learned placeholders
   related to GPG signature verification.

 * "git diff --no-index" learned to read from named pipes as if they
   were regular files, to allow "git diff <(process) <(substitution)"
   some shells support.

 * Help newbies by suggesting that there are cases where force-pushing
   is a valid and sensible thing to update a branch at a remote
   repository, rather than reconciling with merge/rebase.

 * "git blame --contents=file" has been taught to work in a bare
   repository.

 * "git branch -f X" to repoint the branch X said that X was "checked
   out" in another worktree, even when branch X was not and instead
   being bisected or rebased.  The message was reworded to say the
   branch was "in use".

 * Tone down the warning on SHA-256 repositories being an experimental
   curiosity.  We do not have support for them to interoperate with
   traditional SHA-1 repositories, but at this point, we do not plan
   to make breaking changes to SHA-256 repositories and there is no
   longer need for such a strongly phrased warning.


Performance, Internal Implementation, Development Support etc.

 * "git diff-tree" has been taught to take advantage of the
   sparse-index feature.

 * Clang's sanitizer implementation seems to work better than GCC's.
   (merge d88d727143 jk/ci-use-clang-for-sanitizer-jobs later to maint).

 * The object traversal using reachability bitmap done by
   "pack-object" has been tweaked to take advantage of the fact that
   using "boundary" commits as representative of all the uninteresting
   ones can save quite a lot of object enumeration.

 * discover_git_directory() no longer touches the_repository.

 * "git worktree" learned to work better with sparse index feature.

 * When the external merge driver is killed by a signal, its output
   should not be trusted as a resolution with conflicts that is
   proposed by the driver, but the code did.

 * The set-up code for the get_revision() API now allows feeding
   options like --all and --not in the --stdin mode.

 * Move functions that are not about pure string manipulation out of
   strbuf.[ch]

 * "imap-send" codepaths got cleaned up to get rid of unused
   parameters.

 * Enumerating refs in the packed-refs file, while excluding refs that
   match certain patterns, has been optimized.

 * Mark-up unused parameters in the code so that we can eventually
   enable -Wunused-parameter by default.

 * Instead of inventing a custom counter variables for debugging,
   use existing trace2 facility in the fsync customization codepath.

 * "git branch --list --format=<format>" and friends are taught
   a new "%(describe)" placeholder.

 * Clarify how to choose the starting point for a new topic in
   developer guidance document.

 * The implementation of "get_sha1_hex()" that reads a hexadecimal
   string that spells a full object name has been extended to cope
   with any hash function used in the repository, but the "sha1" in
   its name survived.  Rename it to get_hash_hex(), a name that is
   more consistent within its friends like get_hash_hex_algop().

 * Command line parser fix, and a small parse-options API update.


Fixes since v2.41
-----------------

 * "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the
   command failed, so that the user can salvage what they typed.
   (merge 08c12ec1d0 kh/keep-tag-editmsg-upon-failure later to maint).

 * The "-s" (silent, squelch) option of the "diff" family of commands
   did not interact with other options that specify the output format
   well.  This has been cleaned up so that it will clear all the
   formatting options given before.
   (merge 9d484b92ed jc/diff-s-with-other-options later to maint).

 * Update documentation regarding Coccinelle patches.
   (merge 3bd0097cfc gc/doc-cocci-updates later to maint).

 * Some atoms that can be used in "--format=<format>" for "git ls-tree"
   were not supported by "git ls-files", even though they were relevant
   in the context of the latter.
   (merge 4d28c4f75f zh/ls-files-format-atoms later to maint).

 * Document more pseudo-refs and teach the command line completion
   machinery to complete AUTO_MERGE.
   (merge 982ff3a649 pb/complete-and-document-auto-merge-and-friends later to maint).

 * "git submodule" code trusted the data coming from the config (and
   the in-tree .gitmodules file) too much without validating, leading
   to NULL dereference if the user mucks with a repository (e.g.
   submodule.<name>.url is removed).  This has been corrected.
   (merge fbc806acd1 tb/submodule-null-deref-fix later to maint).

 * The value of config.worktree is per-repository, but has been kept
   in a singleton global variable per process. This has been OK as
   most Git operations interacted with a single repository at a time,
   but not right for operations like recursive "grep" that want to
   access multiple repositories from a single process without forking.

   The global variable has been eliminated and made into a member in
   the per-repository data structure.
   (merge 3867f6d650 vd/worktree-config-is-per-repository later to maint).

 * "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.
   (merge 8260bc5902 jk/log-follow-with-non-literal-pathspec later to maint).

 * Introduce a mechanism to disable replace refs globally and per
   repository.
   (merge 9c7d1b057f ds/disable-replace-refs later to maint).

 * "git cat-file --batch" and friends learned "-Z" that uses NUL
   delimiter for both input and output.
   (merge f79e18849b ps/cat-file-null-output later to maint).

 * The reimplemented "git add -i" did not honor color.ui configuration.
   (merge 6f74648cea ds/add-i-color-configuration-fix later to maint).

 * Compilation fix for platforms without D_TYPE in struct dirent.
   (merge 03bf92b9bf as/dtype-compilation-fix later to maint).

 * Suggest to refrain from using hex literals that are non-portable
   when writing printf(1) format strings.
   (merge f0b68f0546 jt/doc-use-octal-with-printf later to maint).

 * Simplify error message when run-command fails to start a command.
   (merge 6d224ac286 rs/run-command-exec-error-on-noent later to maint).

 * Gracefully deal with a stale MIDX file that lists a packfile that
   no longer exists.
   (merge 06f3867865 tb/open-midx-bitmap-fallback later to maint).

 * Even when diff.ignoreSubmodules tells us to ignore submodule
   changes, "git commit" with an index that already records changes to
   submodules should include the submodule changes in the resulting
   commit, but it did not.
   (merge 5768478edc js/defeat-ignore-submodules-config-with-explicit-addition later to maint).

 * When "git commit --trailer=..." invokes the interpret-trailers
   machinery, it knows what it feeds to interpret-trailers is a full
   log message without any patch, but failed to express that by
   passing the "--no-divider" option, which has been corrected.
   (merge be3d654343 jk/commit-use-no-divider-with-interpret-trailers later to maint).

 * Avoid breakage of "git pack-objects --cruft" due to inconsistency
   between the way the code enumerates packfiles in the repository.
   (merge 73320e49ad tb/collect-pack-filenames-fix later to maint).

 * We create .pack and then .idx, we consider only packfiles that have
   .idx usable (those with only .pack are not ready yet), so we should
   remove .idx before removing .pack for consistency.
   (merge 0dd1324a73 ds/remove-idx-before-pack later to maint).

 * Partially revert a sanity check that the rest of the config code
   was not ready, to avoid triggering it in a corner case.
   (merge a53f43f900 gc/config-partial-submodule-kvi-fix later to maint).

 * "git apply" punts when it is fed too large a patch input; the error
   message it gives when it happens has been clarified.
   (merge 42612e18d2 pw/apply-too-large later to maint).

 * During a cherry-pick or revert session that works on multiple
   commits, "git status" did not give correct information, which has
   been corrected.
   (merge a096a889f4 jk/cherry-pick-revert-status later to maint).

 * A few places failed to differentiate the case where the index is
   truly empty (nothing added) and we haven't yet read from the
   on-disk index file, which have been corrected.
   (merge 2ee045eea1 js/empty-index-fixes later to maint).

 * "git bugreport" tests did not test what it wanted to test, which
   has been corrected.
   (merge 1aa92b8500 ma/t0091-fixup later to maint).

 * Code snippets in a tutorial document no longer compiled after
   recent header shuffling, which have been corrected.
   (merge bbd7c7b7c0 vd/adjust-mfow-doc-to-updated-headers later to maint).

 * "git ls-files '(attr:X)D/'" that triggers the common prefix
   optimization codepath failed to read from "D/.gitattributes",
   which has been corrected.
   (merge f4a8fde057 jc/pathspec-match-with-common-prefix later to maint).

 * "git fsck --no-progress" still spewed noise from the commit-graph
   subsystem, which has been corrected.
   (merge 9281cd07f0 tb/fsck-no-progress later to maint).

 * Various offset computation in the code that accesses the packfiles
   and other data in the object layer has been hardened against
   arithmetic overflow, especially on 32-bit systems.
   (merge 9a25cad7e0 tb/object-access-overflow-protection later to maint).

 * Names of MinGW header files are spelled in mixed case in some
   source files, but the build host can be using case sensitive
   filesystem with header files with their name spelled in all
   lowercase.
   (merge 4a53d0d0bc mh/mingw-case-sensitive-build later to maint).

 * Update message mark-up for i18n in "git bundle".
   (merge bbb6acd998 dk/bundle-i18n-more later to maint).

 * "git tag --list --points-at X" showed tags that directly refers to
   object X, but did not list a tag that points at such a tag, which
   has been corrected.

 * "./configure --with-expat=no" did not work as a way to refuse use
   of the expat library on a system with the library installed, which
   has been corrected.
   (merge fb8f7269c2 ah/autoconf-fixes later to maint).

 * When the user edits "rebase -i" todo file so that it starts with a
   "fixup", which would make it invalid, the command truncated the
   rest of the file before giving an error and returning the control
   back to the user.  Stop truncating to make it easier to correct
   such a malformed todo file.
   (merge 9645a087c2 ah/sequencer-rewrite-todo-fix later to maint).

 * Rewrite the description of giving a custom command to the
   submodule.<name>.update configuration variable.
   (merge 7cebc5bd78 pv/doc-submodule-update-settings later to maint).

 * Adjust to OpenSSL 3+, which deprecates its SHA-1 functions based on
   its traditional API, by using its EVP API instead.
   (merge bda9c12073 ew/hash-with-openssl-evp later to maint).

 * Exclude "." from the set of characters to be removed from the
   beginning and the end of the human-readable name.
   (merge 1c04cb0744 bc/ident-dot-is-no-longer-crud-letter later to maint).

 * "git bisect visualize" stopped running "gitk" on Git for Windows
   when the command was reimplemented in C around Git 2.34 timeframe.
   This has been corrected.
   (merge fff1594fa7 ma/locate-in-path-for-windows later to maint).

 * "git rebase -i" with a series of squash/fixup, when one of the
   steps stopped in conflicts and ended up getting skipped, did not
   handle the accumulated commit log messages, which has been
   corrected.
   (merge 6ce7afe163 pw/rebase-skip-commit-message-fix later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge 51f9d2e563 sa/doc-ls-remote later to maint).
   (merge c6d26a9dda jk/format-patch-message-id-unleak later to maint).
   (merge f7e063f326 ps/fetch-cleanups later to maint).
   (merge e4cf013468 tl/quote-problematic-arg-for-clarity later to maint).
   (merge 20025fdfc7 tz/test-ssh-verifytime-fix later to maint).
   (merge e48a21df65 tz/test-fix-pthreads-prereq later to maint).
   (merge 68b51172e3 mh/commit-reach-get-reachable-plug-leak later to maint).
   (merge aeee1408ce kh/use-default-notes-doc later to maint).
   (merge 3b8724bce6 jc/test-modernization later to maint).
   (merge 447a3b7331 jc/test-modernization-2 later to maint).
   (merge d57fa7fc73 la/doc-interpret-trailers later to maint).
   (merge 548afb0d9a la/docs-typofixes later to maint).
   (merge 3744ffcbcd rs/doc-ls-tree-hex-literal later to maint).
   (merge 6c26da8404 mh/credential-erase-improvements later to maint).
   (merge 78e56cff69 tz/lib-gpg-prereq-fix later to maint).
   (merge 80d32e84b5 rj/leakfixes later to maint).
   (merge 0a868031ed pb/complete-diff-options later to maint).
   (merge d4f28279ad jc/doc-hash-object-types later to maint).
   (merge 1876a5ae15 ks/t4205-test-describe-with-abbrev-fix later to maint).
   (merge 6e6a529b57 jk/fsck-indices-in-worktrees later to maint).
   (merge 3e81b896f7 rs/packet-length-simplify later to maint).
   (merge 4c9cb51fe7 mh/doc-credential-helpers later to maint).
   (merge 3437f549dd jr/gitignore-doc-example-markup later to maint).
   (merge 947ebd62a0 jc/am-parseopt-fix later to maint).
   (merge e12cb98e1e jc/branch-parseopt-fix later to maint).
   (merge d6f598e443 jc/gitignore-doc-pattern-markup later to maint).
   (merge a2dad4868b jc/transport-parseopt-fix later to maint).
   (merge 68cbb20e73 jc/parse-options-show-branch later to maint).
   (merge 3821eb6c3d jc/parse-options-reset later to maint).
   (merge c48af99a3e bb/trace2-comment-fix later to maint).
   (merge c95ae3ff9c rs/describe-parseopt-fix later to maint).
   (merge 36f76d2a25 rs/pack-objects-parseopt-fix later to maint).
   (merge 30c8c55cbf jc/tree-walk-drop-base-offset later to maint).
   (merge d089a06421 rs/bundle-parseopt-cleanup later to maint).
   (merge 823839bda1 ew/sha256-gcrypt-leak-fixes later to maint).
   (merge a5c01603b3 bc/ignore-clangd-cache later to maint).

----------------------------------------------------------------

Changes since v2.41.0 are as follows:

Adam Majer (1):
      doc: sha256 is no longer experimental

Alejandro R. Sedeño (1):
      statinfo.h: move DTYPE defines from dir.h

Alex Henrie (4):
      wt-status: don't show divergence advice when committing
      remote: don't imply that integration is always required before pushing
      push: don't imply that integration is always required before pushing
      sequencer: finish parsing the todo list despite an invalid first line

Andreas Herrmann (3):
      configure.ac: don't overwrite NO_EXPAT option
      configure.ac: don't overwrite NO_CURL option
      configure.ac: always save NO_ICONV to config.status

Beat Bolli (2):
      trace2: fix a comment
      wrapper: use trace2 counters to collect fsync stats

Calvin Wan (13):
      strbuf: clarify API boundary
      strbuf: clarify dependency
      abspath: move related functions to abspath
      credential-store: move related functions to credential-store file
      object-name: move related functions to object-name
      path: move related function to path
      strbuf: remove global variable
      git-compat-util: move strbuf.c funcs to its header
      git-compat-util: move wrapper.c funcs to its header
      sane-ctype.h: create header for sane-ctype macros
      kwset: move translation table from ctype
      treewide: remove unnecessary includes for wrapper.h
      git-compat-util: move alloc macros to git-compat-util.h

D. Ben Knoble (2):
      i18n: mark more bundle.c strings for translation
      t4002: fix "diff can read from stdin" syntax

Derrick Stolee (7):
      add: check color.ui for interactive add
      add: test use of brackets when color is disabled
      repository: create disable_replace_refs()
      replace-objects: create wrapper around setting
      repository: create read_replace_refs setting
      packfile: delete .idx files before .pack files
      builtin/repack.c: only repack `.pack`s that exist

Elijah Newren (28):
      init-db: document existing bug with core.bare in template config
      init-db: remove unnecessary global variable
      init-db, clone: change unnecessary global into passed parameter
      setup: adopt shared init-db & clone code
      read-cache: move shared commit and ls-files code
      add: modify add_files_to_cache() to avoid globals
      read-cache: move shared add/checkout/commit code
      statinfo: move stat_{data,validity} functions from cache/read-cache
      run-command.h: move declarations for run-command.c from cache.h
      name-hash.h: move declarations for name-hash.c from cache.h
      sparse-index.h: move declarations for sparse-index.c from cache.h
      preload-index.h: move declarations for preload-index.c from elsewhere
      diff.h: move declaration for global in diff.c from cache.h
      merge.h: move declarations for merge.c from cache.h
      repository.h: move declaration of the_index from cache.h
      read-cache*.h: move declarations for read-cache.c functions from cache.h
      cache.h: remove this no-longer-used header
      log-tree: replace include of revision.h with simple forward declaration
      repository: remove unnecessary include of path.h
      diff.h: remove unnecessary include of oidset.h
      list-objects-filter-options.h: remove unneccessary include
      builtin.h: remove unneccessary includes
      git-compat-util.h: remove unneccessary include of wildmatch.h
      merge-ll: rename from ll-merge
      khash: name the structs that khash declares
      object-store-ll.h: split this header out of object-store.h
      hash-ll, hashmap: move oidhash() to hash-ll
      fsmonitor-ll.h: split this header out of fsmonitor.h

Eric Sunshine (1):
      fsck: avoid misleading variable name

Eric Wong (5):
      sha256/gcrypt: fix build with SANITIZE=leak
      sha256/gcrypt: fix memory leak with SHA-256 repos
      sha256/gcrypt: die on gcry_md_open failures
      sha256: avoid functions deprecated in OpenSSL 3+
      avoid SHA-1 functions deprecated in OpenSSL 3+

Glen Choo (16):
      cocci: add headings to and reword README
      cocci: codify authoring and reviewing practices
      setup.c: don't setup in discover_git_directory()
      config: don't BUG when both kvi and source are set
      config: inline git_color_default_config
      urlmatch.h: use config_fn_t type
      config: add ctx arg to config_fn_t
      config.c: pass ctx in configsets
      config: pass ctx with config files
      config.c: pass ctx with CLI config
      trace2: plumb config kvi
      config: pass kvi to die_bad_number()
      config.c: remove config_reader from configsets
      config: add kvi.path, use it to evaluate includes
      config: pass source to config_parser_event_fn_t
      mailmap: change primary address for Glen Choo

Han Young (1):
      blame: allow --contents to work with bare repo

Jacob Abel (11):
      worktree add: include -B in usage docs
      t2400: cleanup created worktree in test
      t2400: refactor "worktree add" opt exclusion tests
      t2400: add tests to verify --quiet
      worktree add: add --orphan flag
      worktree add: introduce "try --orphan" hint
      worktree add: extend DWIM to infer --orphan
      worktree add: emit warn when there is a bad HEAD
      t2400: drop no-op `--sq` from rev-parse call
      builtin/worktree.c: convert tab in advice to space
      t2400: rewrite regex to avoid unintentional PCRE

Jacob Keller (1):
      fix cherry-pick/revert status when doing multiple commits

Jan Klötzke (1):
      ref-filter: handle nested tags in --points-at option

Jeff King (36):
      format-patch: free rev.message_id when exiting
      format-patch: free elements of rev.ref_message_ids list
      pathspec: factor out magic-to-name function
      diff: factor out --follow pathspec check
      diff: detect pathspec magic not supported by --follow
      ci: use clang for ASan/UBSan checks
      ci: run ASan/UBSan in a single job
      ci: drop linux-clang job
      commit: pass --no-divider to interpret-trailers
      http: handle both "h2" and "h2h3" in curl info lines
      var: mark unused parameters in git_var callbacks
      imap-send: use server conf argument in setup_curl()
      imap-send: drop unused parameter from imap_cmd_cb callback
      imap-send: drop unused fields from imap_cmd_cb
      refs.c: rename `ref_filter`
      ref-filter.h: provide `REF_FILTER_INIT`
      ref-filter: clear reachable list pointers after freeing
      ref-filter: add `ref_filter_clear()`
      ref-filter.c: parameterize match functions over patterns
      test-ref-store: drop unimplemented reflog-expire command
      do_for_each_ref_helper(): mark unused repository parameter
      http: mark unused parameters in curl callbacks
      http-push: mark unused parameter in xml callback
      am: mark unused keep_cr parameters
      count-objects: mark unused parameter in alternates callback
      revisions: drop unused "opt" parameter in "tweak" callbacks
      fsck: mark unused parameters in various fsck callbacks
      merge-tree: mark unused parameter in traverse callback
      replace: mark unused parameter in ref callback
      replace: mark unused parameter in each_mergetag_fn callback
      rev-parse: mark unused parameter in for_each_abbrev callback
      tag: mark unused parameters in each_tag_name_fn callbacks
      t/helper: mark unused callback void data parameters
      ref-filter: avoid parsing tagged objects in match_points_at()
      ref-filter: avoid parsing non-tags in match_points_at()
      ref-filter: simplify return type of match_points_at

Johan Ruokangas (1):
      gitignore.txt: use backticks instead of double quotes

Johannes Schindelin (3):
      do_read_index(): always mark index as initialized unless erroring out
      split-index: accept that a base index can be empty
      commit -a -m: allow the top-level tree to become empty again

John Cai (34):
      docs: clarify git-pack-refs --all will pack all refs
      pack-refs: teach --exclude option to exclude refs from being packed
      pack-refs: teach pack-refs --include option
      t0000-basic: modernize test format
      t0030-stripspace: modernize test format
      t3210-pack-refs: modernize test format
      t1001-read-tree-m-2way: modernize test format
      t1002-read-tree-m-u-2way: modernize test format
      t1006-cat-file: modernize test format
      t3500-cherry: modernize test format
      t3700-add: modernize test format
      t3903-stash: modernize test format
      t4002-diff-basic: modernize test format
      t4003-diff-rename-1: modernize test format
      t4004-diff-rename-symlink: modernize test format
      t4202-log: modernize test format
      t4206-log-follow-harder-copies: modernize test format
      t5300-pack-object: modernize test format
      t5301-sliding-window: modernize test format
      t5303-pack-corruption-resilience: modernize test format
      t5306-pack-nobase: modernize test format
      t6050-replace: modernize test format
      t7101-reset-empty-subdirs: modernize test format
      t7110-reset-merge: modernize test format
      t7111-reset-table: modernize test format
      t7201-co: modernize test format
      t7508-status: modernize test format
      t7600-merge: modernize test format
      t7700-repack: modernize test format
      t9100-git-svn-basic: modernize test format
      t9104-git-svn-follow-parent: modernize test format
      t9200-git-cvsexportcommit: modernize test format
      t9400-git-cvsserver-server: modernize test format
      docs: add git hash-object -t option's possible values

Jonathan Tan (1):
      CodingGuidelines: use octal escapes, not hex

Josip Sokcevic (1):
      diff-lib: honor override_submodule_config flag bit

Junio C Hamano (46):
      diff: fix interaction between the "-s" option and other options
      show-branch doc: say <ref>, not <reference>
      Start the 2.42 cycle
      The second batch for 2.42
      The third batch
      ll-merge: killing the external merge driver aborts the merge
      The fourth batch
      t6406: skip "external merge driver getting killed by a signal" test on Windows
      The fifth batch
      The sixth batch
      The seventh batch
      The eighth batch
      t6135: attr magic with path pattern
      tree-walk: lose base_offset that is never used in tree_entry_interesting
      tree-walk: drop unused base_offset from do_match()
      The ninth batch
      dir: match "attr" pathspec magic with correct paths
      The tenth batch
      The eleventh batch
      The twelfth batch
      gitignore.txt: mark up explanation of patterns consistently
      am: simplify parsing of "--[no-]keep-cr"
      branch: reject "--no-all" and "--no-remotes" early
      parse-options: introduce OPT_IPVERSION()
      fetch: reject --no-ipv[46]
      show-branch: --no-sparse should give dense output
      short help: allow multi-line opthelp
      remote: simplify "remote add --tags" help text
      short help: allow a gap smaller than USAGE_GAP
      show-branch: reject --[no-](topo|date)-order
      reset: reject --no-(mixed|soft|hard|merge|keep) option
      The thirteenth batch
      branch: update the message to refuse touching a branch in-use
      hex: retire get_sha1_hex()
      The fourteenth batch
      SubmittingPatches: choice of base for fixing an older maintenance track
      The fifteenth batch
      SubmittingPatches: explain why 'next' and above are inappropriate base
      SubmittingPatches: use of older maintenance tracks is an exception
      The sixteenth batch
      MyFirstContribution: refrain from self-iterating too much
      The seventeenth batch
      The eighteenth batch
      Git 2.42-rc0
      A few more topics before -rc1
      Git 2.42-rc1

Kousik Sanagavarapu (5):
      t/lib-gpg: introduce new prereq GPG2
      ref-filter: add new "signature" atom
      t4205: correctly test %(describe:abbrev=...)
      ref-filter: add multiple-option parsing functions
      ref-filter: add new "describe" atom

Kristoffer Haugsbakk (5):
      doc: tag: document `TAG_EDITMSG`
      t/t7004-tag: add regression test for successful tag creation
      tag: keep the message file in case ref transaction fails
      notes: update documentation for `use_default_notes`
      notes: move the documentation to the struct

Linus Arver (15):
      docs: typofixes
      doc: trailer: fix grammar
      doc: trailer: swap verb order
      doc: trailer: drop "commit message part" phrasing
      doc: trailer: examples: avoid the word "message" by itself
      doc: trailer: remove redundant phrasing
      doc: trailer: use angle brackets for <token> and <value>
      doc: trailer.<token>.command: emphasize deprecation
      doc: trailer: mention 'key' in DESCRIPTION
      doc: trailer: add more examples in DESCRIPTION
      SubmittingPatches: reword awkward phrasing
      SubmittingPatches: discuss subsystems separately from git.git
      SubmittingPatches: de-emphasize branches as starting points
      SubmittingPatches: emphasize need to communicate non-default starting points
      SubmittingPatches: simplify guidance for choosing a starting point

M Hickford (3):
      credential: avoid erasing distinct password
      credential: erase all matching credentials
      doc: gitcredentials: link to helper list

Martin Ågren (1):
      t0091-bugreport.sh: actually verify some content of report

Matthias Aßhauer (3):
      run-command: conditionally define locate_in_PATH()
      compat/mingw: implement a native locate_in_PATH()
      docs: update when `git bisect visualize` uses `gitk`

Mike Hommey (2):
      commit-reach: fix memory leak in get_reachable_subset()
      mingw: use lowercase includes for some Windows headers

Patrick Steinhardt (17):
      fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value
      fetch: drop unneeded NULL-check for `remote_ref`
      fetch: pass through `fetch_config` directly
      fetch: use `fetch_config` to store "fetch.prune" value
      fetch: use `fetch_config` to store "fetch.pruneTags" value
      fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
      fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
      fetch: use `fetch_config` to store "fetch.parallel" value
      fetch: use `fetch_config` to store "submodule.fetchJobs" value
      t1006: don't strip timestamps from expected results
      t1006: modernize test style to use `test_cmp`
      strbuf: provide CRLF-aware helper to read until a specified delimiter
      cat-file: simplify reading from standard input
      cat-file: add option '-Z' that delimits input and output with NUL
      revision: reorder `read_revisions_from_stdin()`
      revision: small readability improvement for reading from stdin
      revision: handle pseudo-opts in `--stdin` mode

Petar Vutov (1):
      doc: highlight that .gitmodules does not support !command

Philippe Blain (30):
      revisions.txt: use description list for special refs
      revisions.txt: document more special refs
      completion: complete REVERT_HEAD and BISECT_HEAD
      git-merge.txt: modernize word choice in "True merge" section
      Documentation: document AUTO_MERGE
      completion: complete AUTO_MERGE
      completion: add comments describing __git_diff_* globals
      completion: complete --break-rewrites
      completion: complete --cc
      completion: complete --combined-all-paths
      completion: complete --compact-summary
      completion: complete --default-prefix
      completion: complete --find-copies
      completion: complete --find-object
      completion: complete --find-renames
      completion: complete --function-context
      completion: complete --ignore-matching-lines
      completion: complete --irreversible-delete
      completion: complete --ita-invisible-in-index and --ita-visible-in-index
      completion: complete --line-prefix
      completion: complete --no-relative
      completion: complete --no-stat
      completion: complete --output
      completion: complete --output-indicator-{context,new,old}
      completion: complete --unified
      completion: complete --ws-error-highlight
      completion: move --pickaxe-{all,regex} to __git_diff_common_options
      completion: complete --diff-merges, its options and --no-diff-merges
      completion: complete --remerge-diff
      diff.c: mention completion above add_diff_options

Phillip Wood (6):
      apply: improve error messages when reading patch
      diff --no-index: refuse to compare stdin to a directory
      diff --no-index: die on error reading stdin
      t4054: test diff --no-index with stdin
      diff --no-index: support reading from named pipes
      rebase --skip: fix commit message clean up when skipping squash

René Scharfe (19):
      t1800: loosen matching of error message for bad shebang
      run-command: report exec error even on ENOENT
      ls-tree: fix documentation of %x format placeholder
      pretty: factor out expand_separator()
      strbuf: factor out strbuf_expand_step()
      replace strbuf_expand_dict_cb() with strbuf_expand_step()
      replace strbuf_expand() with strbuf_expand_step()
      strbuf: simplify strbuf_expand_literal_cb()
      ls-tree: simplify prefix handling
      pretty: avoid double negative in format_commit_item()
      pkt-line: add size parameter to packet_length()
      pretty: use strchr(3) in userformat_find_requirements()
      t6300: fix setup with GPGSSH but without GPG
      strbuf: use skip_prefix() in strbuf_addftime()
      ls-tree: fix --no-full-name
      describe: fix --no-exact-match
      pack-objects: fix --no-keep-true-parents
      pack-objects: fix --no-quiet
      bundle: use OPT_PASSTHRU_ARGV

Rubén Justo (11):
      config: fix a leak in git_config_copy_or_rename_section_in_file
      remote: fix a leak in query_matches_negative_refspec
      branch: fix a leak in dwim_and_setup_tracking
      branch: fix a leak in inherit_tracking
      branch: fix a leak in check_tracking_branch
      branch: fix a leak in setup_tracking
      rev-parse: fix a leak with --abbrev-ref
      branch: fix a leak in setup_tracking
      branch: fix a leak in cmd_branch
      config: fix a leak in git_config_copy_or_rename_section_in_file
      tests: mark as passing with SANITIZE=leak

Sean Allred (5):
      show-ref doc: update for internal consistency
      ls-remote doc: remove redundant --tags example
      ls-remote doc: show peeled tags in examples
      ls-remote doc: explain what each example does
      ls-remote doc: document the output format

Shuqi Liang (2):
      diff-tree: integrate with sparse index
      worktree: integrate with sparse-index

Taylor Blau (53):
      object: add object_array initializer helper function
      pack-bitmap.c: extract `fill_in_bitmap()`
      pack-bitmap.c: use commit boundary during bitmap traversal
      builtin/submodule--helper.c: handle missing submodule URLs
      builtin/repack.c: only collect fully-formed packs
      reachable.c: extract `obj_is_recent()`
      gc: introduce `gc.recentObjectsHook`
      pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack
      t7701: make annotated tag unreachable
      fsck: suppress commit-graph output with `--no-progress`
      fsck: suppress MIDX output with `--no-progress`
      commit-graph.c: extract `verify_one_commit_graph()`
      commit-graph.c: iteratively verify commit-graph chains
      commit-graph.c: pass progress to `verify_one_commit_graph()`
      commit-graph.c: avoid duplicated progress output during `verify`
      builtin/for-each-ref.c: add `--exclude` option
      refs: plumb `exclude_patterns` argument throughout
      refs/packed-backend.c: refactor `find_reference_location()`
      refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
      refs/packed-backend.c: add trace2 counters for jump list
      revision.h: store hidden refs in a `strvec`
      refs.h: let `for_each_namespaced_ref()` take excluded patterns
      refs.h: implement `hidden_refs_to_excludes()`
      builtin/receive-pack.c: avoid enumerating hidden references
      upload-pack.c: avoid enumerating hidden refs where possible
      ls-refs.c: avoid enumerating hidden refs where possible
      builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
      packfile.c: prevent overflow in `nth_packed_object_id()`
      packfile.c: prevent overflow in `load_idx()`
      packfile.c: use checked arithmetic in `nth_packed_object_offset()`
      midx.c: use `size_t`'s for fanout nr and alloc
      midx.c: prevent overflow in `nth_midxed_object_oid()`
      midx.c: prevent overflow in `nth_midxed_offset()`
      midx.c: store `nr`, `alloc` variables as `size_t`'s
      midx.c: prevent overflow in `write_midx_internal()`
      midx.c: prevent overflow in `fill_included_packs_batch()`
      pack-bitmap.c: ensure that eindex lookups don't overflow
      commit-graph.c: prevent overflow in `write_commit_graph_file()`
      commit-graph.c: prevent overflow in add_graph_to_chain()
      commit-graph.c: prevent overflow in `load_oid_from_graph()`
      commit-graph.c: prevent overflow in `fill_commit_graph_info()`
      commit-graph.c: prevent overflow in `fill_commit_in_graph()`
      commit-graph.c: prevent overflow in `load_tree_for_commit()`
      commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
      commit-graph.c: prevent overflow in `merge_commit_graph()`
      commit-graph.c: prevent overflow in `write_commit_graph()`
      commit-graph.c: prevent overflow in `verify_commit_graph()`
      t/lib-commit-graph.sh: allow `graph_read_expect()` in sub-directories
      t/lib-commit-graph.sh: avoid directory change in `graph_git_behavior()`
      t5318: avoid top-level directory changes
      t5328: avoid top-level directory changes
      t/lib-commit-graph.sh: avoid sub-shell in `graph_git_behavior()`
      Documentation/RelNotes/2.42.0.txt: typofix

Teng Long (8):
      surround %s with quotes when failed to lookup commit
      notes.c: cleanup 'strbuf_grow' call in 'append_edit'
      notes.c: use designated initializers for clarity
      t3321: add test cases about the notes stripspace behavior
      notes.c: introduce '--separator=<paragraph-break>' option
      notes.c: append separator instead of insert by pos
      notes.c: introduce "--[no-]stripspace" option
      notes: introduce "--no-separator" option

Todd Zullinger (3):
      trace2 tests: fix PTHREADS prereq
      t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0
      t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

Victoria Dye (3):
      config: use gitdir to get worktree config
      config: pass 'repo' directly to 'config_with_options()'
      repository: move 'repository_format_worktree_config' to repo scope

Vinayak Dev (1):
      docs: add necessary headers to Documentation/MFOW.txt

ZheNing Hu (1):
      ls-files: align format atoms with ls-tree

brian m. carlson (9):
      t: add a function to check executable bit
      var: add support for listing the shell
      var: format variable structure with C99 initializers
      var: adjust memory allocation for strings
      attr: expose and rename accessor functions
      var: add attributes files locations
      var: add config file locations
      ident: don't consider '.' a crud
      gitignore: ignore clangd .cache directory



^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.42.0-rc0
@ 2023-08-04 19:30  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-08-04 19:30 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel, git-packagers

An early preview release Git v2.42.0-rc0 is now available for
testing at the usual places.  It is comprised of 401 non-merge
commits since v2.41.0, contributed by 59 people, 13 of which are
new faces [*].

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.42.0-rc0' tag and the 'master' branch that the tag points at:

  url = https://git.kernel.org/pub/scm/git/git
  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.41.0 are as follows.
Welcome to the Git development community!

  Andreas Herrmann, Greg Alexander, Han Young, Jacob Abel, Jan
  Klötzke, Jim Pryor, Johan Ruokangas, Josh Sref, Josip Sokcevic,
  Petar Vutov, Premek Vysoky, Tribo Dar, and Vinayak Dev.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  , Alejandro R. Sedeño, Alex Henrie, Beat Bolli, brian
  m. carlson, Calvin Wan, Christian Couder, D. Ben Knoble, Derrick
  Stolee, Elijah Newren, Eric Sunshine, Glen Choo, Hariom Verma,
  Jacob Keller, Jaydeep Das, Jeff King, Johannes Schindelin,
  John Cai, Jonathan Nieder, Jonathan Tan, Junio C Hamano, Kousik
  Sanagavarapu, Kristoffer Haugsbakk, Linus Arver, Martin Ågren,
  Matthew Hughes, M Hickford, Michael Haggerty, Mike Hommey,
  Nsengiyumva Wilberforce, Patrick Steinhardt, Philippe Blain,
  Phillip Wood, Randall S. Becker, René Scharfe, Rubén Justo,
  Sean Allred, Shuqi Liang, SZEDER Gábor, Taylor Blau, Teng Long,
  Todd Zullinger, Toon Claes, Torsten Bögershausen, Victoria Dye,
  and ZheNing Hu.

[*] We are counting not just the authorship contribution but issue
    reporting, mentoring, helping and reviewing that are recorded in
    the commit trailers.

----------------------------------------------------------------

Git v2.42 Release Notes (draft)
===============================

UI, Workflows & Features

 * "git pack-refs" learns "--include" and "--exclude" to tweak the ref
   hierarchy to be packed using pattern matching.

 * 'git worktree add' learned how to create a worktree based on an
   orphaned branch with `--orphan`.

 * "git pack-objects" learned to invoke a new hook program that
   enumerates extra objects to be used as anchoring points to keep
   otherwise unreachable objects in cruft packs.

 * Add more "git var" for toolsmiths to learn various locations Git is
   configured with either via the configuration or hardcoded defaults.

 * 'git notes append' was taught '--separator' to specify string to insert
   between paragraphs.

 * The "git for-each-ref" family of commands learned placeholders
   related to GPG signature verification.

 * "git diff --no-index" learned to read from named pipes as if they
   were regular files, to allow "git diff <(process) <(substitution)"
   some shells support.

 * Help newbies by suggesting that there are cases where force-pushing
   is a valid and sensible thing to update a branch at a remote
   repository, rather than reconciling with merge/rebase.

 * "git blame --contents=file" has been taught to work in a bare
   repository.

 * "git branch -f X" to repoint the branch X said that X was "checked
   out" in another worktree, even when branch X was not and instead
   being bisected or rebased.  The message was reworded to say the
   branch was "in use".


Performance, Internal Implementation, Development Support etc.

 * "git diff-tree" has been taught to take advantage of the
   sparse-index feature.

 * Clang's sanitizer implementation seems to work better than GCC's.
   (merge d88d727143 jk/ci-use-clang-for-sanitizer-jobs later to maint).

 * The object traversal using reachability bitmap done by
   "pack-object" has been tweaked to take advantage of the fact that
   using "boundary" commits as representative of all the uninteresting
   ones can save quite a lot of object enumeration.

 * discover_git_directory() no longer touches the_repository.

 * "git worktree" learned to work better with sparse index feature.

 * When the external merge driver is killed by a signal, its output
   should not be trusted as a resolution with conflicts that is
   proposed by the driver, but the code did.

 * The set-up code for the get_revision() API now allows feeding
   options like --all and --not in the --stdin mode.

 * Move functions that are not about pure string manipulation out of
   strbuf.[ch]

 * "imap-send" codepaths got cleaned up to get rid of unused
   parameters.

 * Enumerating refs in the packed-refs file, while excluding refs that
   match certain patterns, has been optimized.

 * Mark-up unused parameters in the code so that we can eventually
   enable -Wunused-parameter by default.

 * Instead of inventing a custom counter variables for debugging,
   use existing trace2 facility in the fsync customization codepath.

 * "git branch --list --format=<format>" and friends are taught
   a new "%(describe)" placeholder.

 * Clarify how to choose the starting point for a new topic in
   developer guidance document.

 * The implementation of "get_sha1_hex()" that reads a hexadecimal
   string that spells a full object name has been extended to cope
   with any hash function used in the repository, but the "sha1" in
   its name survived.  Rename it to get_hash_hex(), a name that is
   more consistent within its friends like get_hash_hex_algop().

 * Command line parser fix, and a small parse-options API update.


Fixes since v2.41
-----------------

 * "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the
   command failed, so that the user can salvage what they typed.
   (merge 08c12ec1d0 kh/keep-tag-editmsg-upon-failure later to maint).

 * The "-s" (silent, squelch) option of the "diff" family of commands
   did not interact with other options that specify the output format
   well.  This has been cleaned up so that it will clear all the
   formatting options given before.
   (merge 9d484b92ed jc/diff-s-with-other-options later to maint).

 * Update documentation regarding Coccinelle patches.
   (merge 3bd0097cfc gc/doc-cocci-updates later to maint).

 * Some atoms that can be used in "--format=<format>" for "git ls-tree"
   were not supported by "git ls-files", even though they were relevant
   in the context of the latter.
   (merge 4d28c4f75f zh/ls-files-format-atoms later to maint).

 * Document more pseudo-refs and teach the command line completion
   machinery to complete AUTO_MERGE.
   (merge 982ff3a649 pb/complete-and-document-auto-merge-and-friends later to maint).

 * "git submodule" code trusted the data coming from the config (and
   the in-tree .gitmodules file) too much without validating, leading
   to NULL dereference if the user mucks with a repository (e.g.
   submodule.<name>.url is removed).  This has been corrected.
   (merge fbc806acd1 tb/submodule-null-deref-fix later to maint).

 * The value of config.worktree is per-repository, but has been kept
   in a singleton global variable per process. This has been OK as
   most Git operations interacted with a single repository at a time,
   but not right for operations like recursive "grep" that want to
   access multiple repositories from a single process without forking.

   The global variable has been eliminated and made into a member in
   the per-repository data structure.
   (merge 3867f6d650 vd/worktree-config-is-per-repository later to maint).

 * "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.
   (merge 8260bc5902 jk/log-follow-with-non-literal-pathspec later to maint).

 * Introduce a mechanism to disable replace refs globally and per
   repository.
   (merge 9c7d1b057f ds/disable-replace-refs later to maint).

 * "git cat-file --batch" and friends learned "-Z" that uses NUL
   delimiter for both input and output.
   (merge f79e18849b ps/cat-file-null-output later to maint).

 * The reimplemented "git add -i" did not honor color.ui configuration.
   (merge 6f74648cea ds/add-i-color-configuration-fix later to maint).

 * Compilation fix for platforms without D_TYPE in struct dirent.
   (merge 03bf92b9bf as/dtype-compilation-fix later to maint).

 * Suggest to refrain from using hex literals that are non-portable
   when writing printf(1) format strings.
   (merge f0b68f0546 jt/doc-use-octal-with-printf later to maint).

 * Simplify error message when run-command fails to start a command.
   (merge 6d224ac286 rs/run-command-exec-error-on-noent later to maint).

 * Gracefully deal with a stale MIDX file that lists a packfile that
   no longer exists.
   (merge 06f3867865 tb/open-midx-bitmap-fallback later to maint).

 * Even when diff.ignoreSubmodules tells us to ignore submodule
   changes, "git commit" with an index that already records changes to
   submodules should include the submodule changes in the resulting
   commit, but it did not.
   (merge 5768478edc js/defeat-ignore-submodules-config-with-explicit-addition later to maint).

 * When "git commit --trailer=..." invokes the interpret-trailers
   machinery, it knows what it feeds to interpret-trailers is a full
   log message without any patch, but failed to express that by
   passing the "--no-divider" option, which has been corrected.
   (merge be3d654343 jk/commit-use-no-divider-with-interpret-trailers later to maint).

 * Avoid breakage of "git pack-objects --cruft" due to inconsistency
   between the way the code enumerates packfiles in the repository.
   (merge 73320e49ad tb/collect-pack-filenames-fix later to maint).

 * We create .pack and then .idx, we consider only packfiles that have
   .idx usable (those with only .pack are not ready yet), so we should
   remove .idx before removing .pack for consistency.
   (merge 0dd1324a73 ds/remove-idx-before-pack later to maint).

 * Partially revert a sanity check that the rest of the config code
   was not ready, to avoid triggering it in a corner case.
   (merge a53f43f900 gc/config-partial-submodule-kvi-fix later to maint).

 * "git apply" punts when it is fed too large a patch input; the error
   message it gives when it happens has been clarified.
   (merge 42612e18d2 pw/apply-too-large later to maint).

 * During a cherry-pick or revert session that works on multiple
   commits, "git status" did not give correct information, which has
   been corrected.
   (merge a096a889f4 jk/cherry-pick-revert-status later to maint).

 * A few places failed to differentiate the case where the index is
   truly empty (nothing added) and we haven't yet read from the
   on-disk index file, which have been corrected.
   (merge 2ee045eea1 js/empty-index-fixes later to maint).

 * "git bugreport" tests did not test what it wanted to test, which
   has been corrected.
   (merge 1aa92b8500 ma/t0091-fixup later to maint).

 * Code snippets in a tutorial document no longer compiled after
   recent header shuffling, which have been corrected.
   (merge bbd7c7b7c0 vd/adjust-mfow-doc-to-updated-headers later to maint).

 * "git ls-files '(attr:X)D/'" that triggers the common prefix
   optimization codepath failed to read from "D/.gitattributes",
   which has been corrected.
   (merge f4a8fde057 jc/pathspec-match-with-common-prefix later to maint).

 * "git fsck --no-progress" still spewed noise from the commit-graph
   subsystem, which has been corrected.
   (merge 9281cd07f0 tb/fsck-no-progress later to maint).

 * Various offset computation in the code that accesses the packfiles
   and other data in the object layer has been hardened against
   arithmetic overflow, especially on 32-bit systems.
   (merge 9a25cad7e0 tb/object-access-overflow-protection later to maint).

 * Names of MinGW header files are spelled in mixed case in some
   source files, but the build host can be using case sensitive
   filesystem with header files with their name spelled in all
   lowercase.
   (merge 4a53d0d0bc mh/mingw-case-sensitive-build later to maint).

 * Update message mark-up for i18n in "git bundle".
   (merge bbb6acd998 dk/bundle-i18n-more later to maint).

 * "git tag --list --points-at X" showed tags that directly refers to
   object X, but did not list a tag that points at such a tag, which
   has been corrected.

 * "./configure --with-expat=no" did not work as a way to refuse use
   of the expat library on a system with the library installed, which
   has been corrected.
   (merge fb8f7269c2 ah/autoconf-fixes later to maint).

 * When the user edits "rebase -i" todo file so that it starts with a
   "fixup", which would make it invalid, the command truncated the
   rest of the file before giving an error and returning the control
   back to the user.  Stop truncating to make it easier to correct
   such a malformed todo file.
   (merge 9645a087c2 ah/sequencer-rewrite-todo-fix later to maint).

 * Rewrite the description of giving a custom command to the
   submodule.<name>.update configuration variable.
   (merge 7cebc5bd78 pv/doc-submodule-update-settings later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge 51f9d2e563 sa/doc-ls-remote later to maint).
   (merge c6d26a9dda jk/format-patch-message-id-unleak later to maint).
   (merge f7e063f326 ps/fetch-cleanups later to maint).
   (merge e4cf013468 tl/quote-problematic-arg-for-clarity later to maint).
   (merge 20025fdfc7 tz/test-ssh-verifytime-fix later to maint).
   (merge e48a21df65 tz/test-fix-pthreads-prereq later to maint).
   (merge 68b51172e3 mh/commit-reach-get-reachable-plug-leak later to maint).
   (merge aeee1408ce kh/use-default-notes-doc later to maint).
   (merge 3b8724bce6 jc/test-modernization later to maint).
   (merge 447a3b7331 jc/test-modernization-2 later to maint).
   (merge d57fa7fc73 la/doc-interpret-trailers later to maint).
   (merge 548afb0d9a la/docs-typofixes later to maint).
   (merge 3744ffcbcd rs/doc-ls-tree-hex-literal later to maint).
   (merge 6c26da8404 mh/credential-erase-improvements later to maint).
   (merge 78e56cff69 tz/lib-gpg-prereq-fix later to maint).
   (merge 80d32e84b5 rj/leakfixes later to maint).
   (merge 0a868031ed pb/complete-diff-options later to maint).
   (merge d4f28279ad jc/doc-hash-object-types later to maint).
   (merge 1876a5ae15 ks/t4205-test-describe-with-abbrev-fix later to maint).
   (merge 6e6a529b57 jk/fsck-indices-in-worktrees later to maint).
   (merge 3e81b896f7 rs/packet-length-simplify later to maint).
   (merge 4c9cb51fe7 mh/doc-credential-helpers later to maint).
   (merge 3437f549dd jr/gitignore-doc-example-markup later to maint).
   (merge 947ebd62a0 jc/am-parseopt-fix later to maint).
   (merge e12cb98e1e jc/branch-parseopt-fix later to maint).
   (merge d6f598e443 jc/gitignore-doc-pattern-markup later to maint).
   (merge a2dad4868b jc/transport-parseopt-fix later to maint).
   (merge 68cbb20e73 jc/parse-options-show-branch later to maint).
   (merge 3821eb6c3d jc/parse-options-reset later to maint).
   (merge c48af99a3e bb/trace2-comment-fix later to maint).
   (merge c95ae3ff9c rs/describe-parseopt-fix later to maint).
   (merge 36f76d2a25 rs/pack-objects-parseopt-fix later to maint).
   (merge 30c8c55cbf jc/tree-walk-drop-base-offset later to maint).

----------------------------------------------------------------

Changes since v2.41.0 are as follows:

Alejandro R. Sedeño (1):
      statinfo.h: move DTYPE defines from dir.h

Alex Henrie (4):
      wt-status: don't show divergence advice when committing
      remote: don't imply that integration is always required before pushing
      push: don't imply that integration is always required before pushing
      sequencer: finish parsing the todo list despite an invalid first line

Andreas Herrmann (3):
      configure.ac: don't overwrite NO_EXPAT option
      configure.ac: don't overwrite NO_CURL option
      configure.ac: always save NO_ICONV to config.status

Beat Bolli (2):
      trace2: fix a comment
      wrapper: use trace2 counters to collect fsync stats

Calvin Wan (13):
      strbuf: clarify API boundary
      strbuf: clarify dependency
      abspath: move related functions to abspath
      credential-store: move related functions to credential-store file
      object-name: move related functions to object-name
      path: move related function to path
      strbuf: remove global variable
      git-compat-util: move strbuf.c funcs to its header
      git-compat-util: move wrapper.c funcs to its header
      sane-ctype.h: create header for sane-ctype macros
      kwset: move translation table from ctype
      treewide: remove unnecessary includes for wrapper.h
      git-compat-util: move alloc macros to git-compat-util.h

D. Ben Knoble (2):
      i18n: mark more bundle.c strings for translation
      t4002: fix "diff can read from stdin" syntax

Derrick Stolee (7):
      add: check color.ui for interactive add
      add: test use of brackets when color is disabled
      repository: create disable_replace_refs()
      replace-objects: create wrapper around setting
      repository: create read_replace_refs setting
      packfile: delete .idx files before .pack files
      builtin/repack.c: only repack `.pack`s that exist

Elijah Newren (28):
      init-db: document existing bug with core.bare in template config
      init-db: remove unnecessary global variable
      init-db, clone: change unnecessary global into passed parameter
      setup: adopt shared init-db & clone code
      read-cache: move shared commit and ls-files code
      add: modify add_files_to_cache() to avoid globals
      read-cache: move shared add/checkout/commit code
      statinfo: move stat_{data,validity} functions from cache/read-cache
      run-command.h: move declarations for run-command.c from cache.h
      name-hash.h: move declarations for name-hash.c from cache.h
      sparse-index.h: move declarations for sparse-index.c from cache.h
      preload-index.h: move declarations for preload-index.c from elsewhere
      diff.h: move declaration for global in diff.c from cache.h
      merge.h: move declarations for merge.c from cache.h
      repository.h: move declaration of the_index from cache.h
      read-cache*.h: move declarations for read-cache.c functions from cache.h
      cache.h: remove this no-longer-used header
      log-tree: replace include of revision.h with simple forward declaration
      repository: remove unnecessary include of path.h
      diff.h: remove unnecessary include of oidset.h
      list-objects-filter-options.h: remove unneccessary include
      builtin.h: remove unneccessary includes
      git-compat-util.h: remove unneccessary include of wildmatch.h
      merge-ll: rename from ll-merge
      khash: name the structs that khash declares
      object-store-ll.h: split this header out of object-store.h
      hash-ll, hashmap: move oidhash() to hash-ll
      fsmonitor-ll.h: split this header out of fsmonitor.h

Eric Sunshine (1):
      fsck: avoid misleading variable name

Glen Choo (15):
      cocci: add headings to and reword README
      cocci: codify authoring and reviewing practices
      setup.c: don't setup in discover_git_directory()
      config: don't BUG when both kvi and source are set
      config: inline git_color_default_config
      urlmatch.h: use config_fn_t type
      config: add ctx arg to config_fn_t
      config.c: pass ctx in configsets
      config: pass ctx with config files
      config.c: pass ctx with CLI config
      trace2: plumb config kvi
      config: pass kvi to die_bad_number()
      config.c: remove config_reader from configsets
      config: add kvi.path, use it to evaluate includes
      config: pass source to config_parser_event_fn_t

Han Young (1):
      blame: allow --contents to work with bare repo

Jacob Abel (11):
      worktree add: include -B in usage docs
      t2400: cleanup created worktree in test
      t2400: refactor "worktree add" opt exclusion tests
      t2400: add tests to verify --quiet
      worktree add: add --orphan flag
      worktree add: introduce "try --orphan" hint
      worktree add: extend DWIM to infer --orphan
      worktree add: emit warn when there is a bad HEAD
      t2400: drop no-op `--sq` from rev-parse call
      builtin/worktree.c: convert tab in advice to space
      t2400: rewrite regex to avoid unintentional PCRE

Jacob Keller (1):
      fix cherry-pick/revert status when doing multiple commits

Jan Klötzke (1):
      ref-filter: handle nested tags in --points-at option

Jeff King (36):
      format-patch: free rev.message_id when exiting
      format-patch: free elements of rev.ref_message_ids list
      pathspec: factor out magic-to-name function
      diff: factor out --follow pathspec check
      diff: detect pathspec magic not supported by --follow
      ci: use clang for ASan/UBSan checks
      ci: run ASan/UBSan in a single job
      ci: drop linux-clang job
      commit: pass --no-divider to interpret-trailers
      http: handle both "h2" and "h2h3" in curl info lines
      var: mark unused parameters in git_var callbacks
      imap-send: use server conf argument in setup_curl()
      imap-send: drop unused parameter from imap_cmd_cb callback
      imap-send: drop unused fields from imap_cmd_cb
      refs.c: rename `ref_filter`
      ref-filter.h: provide `REF_FILTER_INIT`
      ref-filter: clear reachable list pointers after freeing
      ref-filter: add `ref_filter_clear()`
      ref-filter.c: parameterize match functions over patterns
      test-ref-store: drop unimplemented reflog-expire command
      do_for_each_ref_helper(): mark unused repository parameter
      http: mark unused parameters in curl callbacks
      http-push: mark unused parameter in xml callback
      am: mark unused keep_cr parameters
      count-objects: mark unused parameter in alternates callback
      revisions: drop unused "opt" parameter in "tweak" callbacks
      fsck: mark unused parameters in various fsck callbacks
      merge-tree: mark unused parameter in traverse callback
      replace: mark unused parameter in ref callback
      replace: mark unused parameter in each_mergetag_fn callback
      rev-parse: mark unused parameter in for_each_abbrev callback
      tag: mark unused parameters in each_tag_name_fn callbacks
      t/helper: mark unused callback void data parameters
      ref-filter: avoid parsing tagged objects in match_points_at()
      ref-filter: avoid parsing non-tags in match_points_at()
      ref-filter: simplify return type of match_points_at

Johan Ruokangas (1):
      gitignore.txt: use backticks instead of double quotes

Johannes Schindelin (3):
      do_read_index(): always mark index as initialized unless erroring out
      split-index: accept that a base index can be empty
      commit -a -m: allow the top-level tree to become empty again

John Cai (34):
      docs: clarify git-pack-refs --all will pack all refs
      pack-refs: teach --exclude option to exclude refs from being packed
      pack-refs: teach pack-refs --include option
      t0000-basic: modernize test format
      t0030-stripspace: modernize test format
      t3210-pack-refs: modernize test format
      t1001-read-tree-m-2way: modernize test format
      t1002-read-tree-m-u-2way: modernize test format
      t1006-cat-file: modernize test format
      t3500-cherry: modernize test format
      t3700-add: modernize test format
      t3903-stash: modernize test format
      t4002-diff-basic: modernize test format
      t4003-diff-rename-1: modernize test format
      t4004-diff-rename-symlink: modernize test format
      t4202-log: modernize test format
      t4206-log-follow-harder-copies: modernize test format
      t5300-pack-object: modernize test format
      t5301-sliding-window: modernize test format
      t5303-pack-corruption-resilience: modernize test format
      t5306-pack-nobase: modernize test format
      t6050-replace: modernize test format
      t7101-reset-empty-subdirs: modernize test format
      t7110-reset-merge: modernize test format
      t7111-reset-table: modernize test format
      t7201-co: modernize test format
      t7508-status: modernize test format
      t7600-merge: modernize test format
      t7700-repack: modernize test format
      t9100-git-svn-basic: modernize test format
      t9104-git-svn-follow-parent: modernize test format
      t9200-git-cvsexportcommit: modernize test format
      t9400-git-cvsserver-server: modernize test format
      docs: add git hash-object -t option's possible values

Jonathan Tan (1):
      CodingGuidelines: use octal escapes, not hex

Josip Sokcevic (1):
      diff-lib: honor override_submodule_config flag bit

Junio C Hamano (44):
      diff: fix interaction between the "-s" option and other options
      show-branch doc: say <ref>, not <reference>
      Start the 2.42 cycle
      The second batch for 2.42
      The third batch
      ll-merge: killing the external merge driver aborts the merge
      The fourth batch
      t6406: skip "external merge driver getting killed by a signal" test on Windows
      The fifth batch
      The sixth batch
      The seventh batch
      The eighth batch
      t6135: attr magic with path pattern
      tree-walk: lose base_offset that is never used in tree_entry_interesting
      tree-walk: drop unused base_offset from do_match()
      The ninth batch
      dir: match "attr" pathspec magic with correct paths
      The tenth batch
      The eleventh batch
      The twelfth batch
      gitignore.txt: mark up explanation of patterns consistently
      am: simplify parsing of "--[no-]keep-cr"
      branch: reject "--no-all" and "--no-remotes" early
      parse-options: introduce OPT_IPVERSION()
      fetch: reject --no-ipv[46]
      show-branch: --no-sparse should give dense output
      short help: allow multi-line opthelp
      remote: simplify "remote add --tags" help text
      short help: allow a gap smaller than USAGE_GAP
      show-branch: reject --[no-](topo|date)-order
      reset: reject --no-(mixed|soft|hard|merge|keep) option
      The thirteenth batch
      branch: update the message to refuse touching a branch in-use
      hex: retire get_sha1_hex()
      The fourteenth batch
      SubmittingPatches: choice of base for fixing an older maintenance track
      The fifteenth batch
      SubmittingPatches: explain why 'next' and above are inappropriate base
      SubmittingPatches: use of older maintenance tracks is an exception
      The sixteenth batch
      MyFirstContribution: refrain from self-iterating too much
      The seventeenth batch
      The eighteenth batch
      Git 2.42-rc0

Kousik Sanagavarapu (5):
      t/lib-gpg: introduce new prereq GPG2
      ref-filter: add new "signature" atom
      t4205: correctly test %(describe:abbrev=...)
      ref-filter: add multiple-option parsing functions
      ref-filter: add new "describe" atom

Kristoffer Haugsbakk (5):
      doc: tag: document `TAG_EDITMSG`
      t/t7004-tag: add regression test for successful tag creation
      tag: keep the message file in case ref transaction fails
      notes: update documentation for `use_default_notes`
      notes: move the documentation to the struct

Linus Arver (15):
      docs: typofixes
      doc: trailer: fix grammar
      doc: trailer: swap verb order
      doc: trailer: drop "commit message part" phrasing
      doc: trailer: examples: avoid the word "message" by itself
      doc: trailer: remove redundant phrasing
      doc: trailer: use angle brackets for <token> and <value>
      doc: trailer.<token>.command: emphasize deprecation
      doc: trailer: mention 'key' in DESCRIPTION
      doc: trailer: add more examples in DESCRIPTION
      SubmittingPatches: reword awkward phrasing
      SubmittingPatches: discuss subsystems separately from git.git
      SubmittingPatches: de-emphasize branches as starting points
      SubmittingPatches: emphasize need to communicate non-default starting points
      SubmittingPatches: simplify guidance for choosing a starting point

M Hickford (3):
      credential: avoid erasing distinct password
      credential: erase all matching credentials
      doc: gitcredentials: link to helper list

Martin Ågren (1):
      t0091-bugreport.sh: actually verify some content of report

Mike Hommey (2):
      commit-reach: fix memory leak in get_reachable_subset()
      mingw: use lowercase includes for some Windows headers

Patrick Steinhardt (17):
      fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value
      fetch: drop unneeded NULL-check for `remote_ref`
      fetch: pass through `fetch_config` directly
      fetch: use `fetch_config` to store "fetch.prune" value
      fetch: use `fetch_config` to store "fetch.pruneTags" value
      fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
      fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
      fetch: use `fetch_config` to store "fetch.parallel" value
      fetch: use `fetch_config` to store "submodule.fetchJobs" value
      t1006: don't strip timestamps from expected results
      t1006: modernize test style to use `test_cmp`
      strbuf: provide CRLF-aware helper to read until a specified delimiter
      cat-file: simplify reading from standard input
      cat-file: add option '-Z' that delimits input and output with NUL
      revision: reorder `read_revisions_from_stdin()`
      revision: small readability improvement for reading from stdin
      revision: handle pseudo-opts in `--stdin` mode

Petar Vutov (1):
      doc: highlight that .gitmodules does not support !command

Philippe Blain (30):
      revisions.txt: use description list for special refs
      revisions.txt: document more special refs
      completion: complete REVERT_HEAD and BISECT_HEAD
      git-merge.txt: modernize word choice in "True merge" section
      Documentation: document AUTO_MERGE
      completion: complete AUTO_MERGE
      completion: add comments describing __git_diff_* globals
      completion: complete --break-rewrites
      completion: complete --cc
      completion: complete --combined-all-paths
      completion: complete --compact-summary
      completion: complete --default-prefix
      completion: complete --find-copies
      completion: complete --find-object
      completion: complete --find-renames
      completion: complete --function-context
      completion: complete --ignore-matching-lines
      completion: complete --irreversible-delete
      completion: complete --ita-invisible-in-index and --ita-visible-in-index
      completion: complete --line-prefix
      completion: complete --no-relative
      completion: complete --no-stat
      completion: complete --output
      completion: complete --output-indicator-{context,new,old}
      completion: complete --unified
      completion: complete --ws-error-highlight
      completion: move --pickaxe-{all,regex} to __git_diff_common_options
      completion: complete --diff-merges, its options and --no-diff-merges
      completion: complete --remerge-diff
      diff.c: mention completion above add_diff_options

Phillip Wood (5):
      apply: improve error messages when reading patch
      diff --no-index: refuse to compare stdin to a directory
      diff --no-index: die on error reading stdin
      t4054: test diff --no-index with stdin
      diff --no-index: support reading from named pipes

René Scharfe (18):
      t1800: loosen matching of error message for bad shebang
      run-command: report exec error even on ENOENT
      ls-tree: fix documentation of %x format placeholder
      pretty: factor out expand_separator()
      strbuf: factor out strbuf_expand_step()
      replace strbuf_expand_dict_cb() with strbuf_expand_step()
      replace strbuf_expand() with strbuf_expand_step()
      strbuf: simplify strbuf_expand_literal_cb()
      ls-tree: simplify prefix handling
      pretty: avoid double negative in format_commit_item()
      pkt-line: add size parameter to packet_length()
      pretty: use strchr(3) in userformat_find_requirements()
      t6300: fix setup with GPGSSH but without GPG
      strbuf: use skip_prefix() in strbuf_addftime()
      ls-tree: fix --no-full-name
      describe: fix --no-exact-match
      pack-objects: fix --no-keep-true-parents
      pack-objects: fix --no-quiet

Rubén Justo (11):
      config: fix a leak in git_config_copy_or_rename_section_in_file
      remote: fix a leak in query_matches_negative_refspec
      branch: fix a leak in dwim_and_setup_tracking
      branch: fix a leak in inherit_tracking
      branch: fix a leak in check_tracking_branch
      branch: fix a leak in setup_tracking
      rev-parse: fix a leak with --abbrev-ref
      branch: fix a leak in setup_tracking
      branch: fix a leak in cmd_branch
      config: fix a leak in git_config_copy_or_rename_section_in_file
      tests: mark as passing with SANITIZE=leak

Sean Allred (5):
      show-ref doc: update for internal consistency
      ls-remote doc: remove redundant --tags example
      ls-remote doc: show peeled tags in examples
      ls-remote doc: explain what each example does
      ls-remote doc: document the output format

Shuqi Liang (2):
      diff-tree: integrate with sparse index
      worktree: integrate with sparse-index

Taylor Blau (48):
      object: add object_array initializer helper function
      pack-bitmap.c: extract `fill_in_bitmap()`
      pack-bitmap.c: use commit boundary during bitmap traversal
      builtin/submodule--helper.c: handle missing submodule URLs
      builtin/repack.c: only collect fully-formed packs
      reachable.c: extract `obj_is_recent()`
      gc: introduce `gc.recentObjectsHook`
      pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack
      t7701: make annotated tag unreachable
      fsck: suppress commit-graph output with `--no-progress`
      fsck: suppress MIDX output with `--no-progress`
      commit-graph.c: extract `verify_one_commit_graph()`
      commit-graph.c: iteratively verify commit-graph chains
      commit-graph.c: pass progress to `verify_one_commit_graph()`
      commit-graph.c: avoid duplicated progress output during `verify`
      builtin/for-each-ref.c: add `--exclude` option
      refs: plumb `exclude_patterns` argument throughout
      refs/packed-backend.c: refactor `find_reference_location()`
      refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
      refs/packed-backend.c: add trace2 counters for jump list
      revision.h: store hidden refs in a `strvec`
      refs.h: let `for_each_namespaced_ref()` take excluded patterns
      refs.h: implement `hidden_refs_to_excludes()`
      builtin/receive-pack.c: avoid enumerating hidden references
      upload-pack.c: avoid enumerating hidden refs where possible
      ls-refs.c: avoid enumerating hidden refs where possible
      builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
      packfile.c: prevent overflow in `nth_packed_object_id()`
      packfile.c: prevent overflow in `load_idx()`
      packfile.c: use checked arithmetic in `nth_packed_object_offset()`
      midx.c: use `size_t`'s for fanout nr and alloc
      midx.c: prevent overflow in `nth_midxed_object_oid()`
      midx.c: prevent overflow in `nth_midxed_offset()`
      midx.c: store `nr`, `alloc` variables as `size_t`'s
      midx.c: prevent overflow in `write_midx_internal()`
      midx.c: prevent overflow in `fill_included_packs_batch()`
      pack-bitmap.c: ensure that eindex lookups don't overflow
      commit-graph.c: prevent overflow in `write_commit_graph_file()`
      commit-graph.c: prevent overflow in add_graph_to_chain()
      commit-graph.c: prevent overflow in `load_oid_from_graph()`
      commit-graph.c: prevent overflow in `fill_commit_graph_info()`
      commit-graph.c: prevent overflow in `fill_commit_in_graph()`
      commit-graph.c: prevent overflow in `load_tree_for_commit()`
      commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
      commit-graph.c: prevent overflow in `merge_commit_graph()`
      commit-graph.c: prevent overflow in `write_commit_graph()`
      commit-graph.c: prevent overflow in `verify_commit_graph()`
      Documentation/RelNotes/2.42.0.txt: typofix

Teng Long (8):
      surround %s with quotes when failed to lookup commit
      notes.c: cleanup 'strbuf_grow' call in 'append_edit'
      notes.c: use designated initializers for clarity
      t3321: add test cases about the notes stripspace behavior
      notes.c: introduce '--separator=<paragraph-break>' option
      notes.c: append separator instead of insert by pos
      notes.c: introduce "--[no-]stripspace" option
      notes: introduce "--no-separator" option

Todd Zullinger (3):
      trace2 tests: fix PTHREADS prereq
      t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0
      t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

Victoria Dye (3):
      config: use gitdir to get worktree config
      config: pass 'repo' directly to 'config_with_options()'
      repository: move 'repository_format_worktree_config' to repo scope

Vinayak Dev (1):
      docs: add necessary headers to Documentation/MFOW.txt

ZheNing Hu (1):
      ls-files: align format atoms with ls-tree

brian m. carlson (7):
      t: add a function to check executable bit
      var: add support for listing the shell
      var: format variable structure with C99 initializers
      var: adjust memory allocation for strings
      attr: expose and rename accessor functions
      var: add attributes files locations
      var: add config file locations


^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jul 2023, #05; Tue, 25)
@ 2023-07-25 20:57  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-25 20:57 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* ah/advise-force-pushing (2023-07-13) 3 commits
  (merged to 'next' on 2023-07-17 at b040e8280e)
 + push: don't imply that integration is always required before pushing
 + remote: don't imply that integration is always required before pushing
 + wt-status: don't show divergence advice when committing

 Help newbies by suggesting that there are cases where force-pushing
 is a valid and sensible thing to update a branch at a remote
 repository, rather than reconciling with merge/rebase.
 source: <20230713044128.3771818-1-alexhenrie24@gmail.com>


* dk/bundle-i18n-more (2023-07-13) 1 commit
  (merged to 'next' on 2023-07-18 at a9745efbe2)
 + i18n: mark more bundle.c strings for translation

 Update message mark-up for i18n in "git bundle".
 source: <pull.1550.git.1689285683013.gitgitgadget@gmail.com>


* dk/t4002-syntaxo-fix (2023-07-14) 1 commit
  (merged to 'next' on 2023-07-17 at 75d729ee52)
 + t4002: fix "diff can read from stdin" syntax

 Test fix.
 source: <pull.1545.git.git.1689341410476.gitgitgadget@gmail.com>


* jk/nested-points-at (2023-07-17) 4 commits
  (merged to 'next' on 2023-07-18 at cf33f44a50)
 + ref-filter: simplify return type of match_points_at
 + ref-filter: avoid parsing non-tags in match_points_at()
 + ref-filter: avoid parsing tagged objects in match_points_at()
 + ref-filter: handle nested tags in --points-at option

 "git tag --list --points-at X" showed tags that directly refers to
 object X, but did not list a tag that points at such a tag, which
 has been corrected.
 source: <20230702223342.GA1598765@coredump.intra.peff.net>


* jk/unused-parameter (2023-07-13) 14 commits
  (merged to 'next' on 2023-07-18 at 59d8f4ec1e)
 + t/helper: mark unused callback void data parameters
 + tag: mark unused parameters in each_tag_name_fn callbacks
 + rev-parse: mark unused parameter in for_each_abbrev callback
 + replace: mark unused parameter in each_mergetag_fn callback
 + replace: mark unused parameter in ref callback
 + merge-tree: mark unused parameter in traverse callback
 + fsck: mark unused parameters in various fsck callbacks
 + revisions: drop unused "opt" parameter in "tweak" callbacks
 + count-objects: mark unused parameter in alternates callback
 + am: mark unused keep_cr parameters
 + http-push: mark unused parameter in xml callback
 + http: mark unused parameters in curl callbacks
 + do_for_each_ref_helper(): mark unused repository parameter
 + test-ref-store: drop unimplemented reflog-expire command

 Mark-up unused parameters in the code so that we can eventually
 enable -Wunused-parameter by default.
 source: <20230703064347.GA3524892@coredump.intra.peff.net>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
  (merged to 'next' on 2023-07-17 at 2c72856851)
 + mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.
 source: <20230604211934.1365289-1-mh@glandium.org>


* rs/ref-filter-signature-fix (2023-07-17) 1 commit
  (merged to 'next' on 2023-07-18 at e74f016a60)
 + t6300: fix setup with GPGSSH but without GPG

 Test fix.
 source: <cbc22750-af93-9274-2ed4-6dfd356568e8@web.de>


* rs/strbuf-addftime-simplify (2023-07-17) 1 commit
  (merged to 'next' on 2023-07-18 at d665b0f0e9)
 + strbuf: use skip_prefix() in strbuf_addftime()

 Code clean-up.
 source: <fccba24c-584d-6329-69a7-75cf0458af7d@web.de>


* tb/object-access-overflow-protection (2023-07-14) 20 commits
  (merged to 'next' on 2023-07-17 at 9ad8a08011)
 + commit-graph.c: prevent overflow in `verify_commit_graph()`
 + commit-graph.c: prevent overflow in `write_commit_graph()`
 + commit-graph.c: prevent overflow in `merge_commit_graph()`
 + commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
 + commit-graph.c: prevent overflow in `load_tree_for_commit()`
 + commit-graph.c: prevent overflow in `fill_commit_in_graph()`
 + commit-graph.c: prevent overflow in `fill_commit_graph_info()`
 + commit-graph.c: prevent overflow in `load_oid_from_graph()`
 + commit-graph.c: prevent overflow in add_graph_to_chain()
 + commit-graph.c: prevent overflow in `write_commit_graph_file()`
 + pack-bitmap.c: ensure that eindex lookups don't overflow
 + midx.c: prevent overflow in `fill_included_packs_batch()`
 + midx.c: prevent overflow in `write_midx_internal()`
 + midx.c: store `nr`, `alloc` variables as `size_t`'s
 + midx.c: prevent overflow in `nth_midxed_offset()`
 + midx.c: prevent overflow in `nth_midxed_object_oid()`
 + midx.c: use `size_t`'s for fanout nr and alloc
 + packfile.c: use checked arithmetic in `nth_packed_object_offset()`
 + packfile.c: prevent overflow in `load_idx()`
 + packfile.c: prevent overflow in `nth_packed_object_id()`

 Various offset computation in the code that accesses the packfiles
 and other data in the object layer has been hardened against
 arithmetic overflow, especially on 32-bit systems.
 source: <ZLAJNbIBFUPHYhlt@nand.local>
 source: <cover.1689205042.git.me@ttaylorr.com>


* tb/refs-exclusion-and-packed-refs (2023-07-10) 16 commits
  (merged to 'next' on 2023-07-13 at 6d72f3e995)
 + ls-refs.c: avoid enumerating hidden refs where possible
 + upload-pack.c: avoid enumerating hidden refs where possible
 + builtin/receive-pack.c: avoid enumerating hidden references
 + refs.h: implement `hidden_refs_to_excludes()`
 + refs.h: let `for_each_namespaced_ref()` take excluded patterns
 + revision.h: store hidden refs in a `strvec`
 + refs/packed-backend.c: add trace2 counters for jump list
 + refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 + refs/packed-backend.c: refactor `find_reference_location()`
 + refs: plumb `exclude_patterns` argument throughout
 + builtin/for-each-ref.c: add `--exclude` option
 + ref-filter.c: parameterize match functions over patterns
 + ref-filter: add `ref_filter_clear()`
 + ref-filter: clear reachable list pointers after freeing
 + ref-filter.h: provide `REF_FILTER_INIT`
 + refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.
 source: <cover.1689023520.git.me@ttaylorr.com>

--------------------------------------------------
[New Topics]

* ah/sequencer-rewrite-todo-fix (2023-07-24) 1 commit
 - sequencer: finish parsing the todo list despite an invalid first line

 When the user edits "rebase -i" todo file so that it starts with a
 "fixup", which would make it invalid, the command truncated the
 rest of the file before giving an error and returning the control
 back to the user.  Stop truncating to make it easier to correct
 such a malformed todo file.

 Will merge to 'next'.
 cf. <https://lore.kernel.org/git/0d1c5bfd-3ae5-83f0-a333-bbb8510a973a@gmail.com/>
 source: <20230722212830.132135-2-alexhenrie24@gmail.com>


* bb/trace2-comment-fix (2023-07-19) 1 commit
  (merged to 'next' on 2023-07-21 at f77aeba1b5)
 + trace2: fix a comment

 In-code comment fix.

 Will merge to 'master'.
 source: <20230719232444.555838-1-dev+git@drbeat.li>


* ks/ref-filter-describe (2023-07-24) 2 commits
 - ref-filter: add new "describe" atom
 - ref-filter: add multiple-option parsing functions

 "git branch --list --format=<format>" and friends are taught
 a new "%(describe)" placeholder.

 Will merge to 'next'.
 source: <20230723162717.68123-1-five231003@gmail.com>


* bb/use-trace2-counters-for-fsync-stats (2023-07-20) 1 commit
 - wrapper: use trace2 counters to collect fsync stats

 Instead of inventing a custom counter variables for debugging,
 use existing trace2 facility in the fsync customization codepath.

 Will merge to 'next'.
 source: <20230720164823.625815-1-dev+git@drbeat.li>


* am/doc-sha256 (2023-07-20) 1 commit
 - doc: sha256 is no longer experimental

 Tone down the warning on SHA-256 repositories being an experimental
 curiosity.  We do not have support for them to interoperate with
 traditional SHA-1 repositories, but at this point, we do not plan
 to make breaking changes to SHA-256 repositories and there is no
 longer need for such a strongly phrased warning.

 Review comments sent.
 cf. <xmqqr0p230rj.fsf@gitster.g>
 source: <ZLlNtbAbVcYH7eFb@adams>


* hy/blame-in-bare-with-contents (2023-07-21) 1 commit
 - blame: allow --contents to work with bare repo

 "git blame --contents=file" has been taught to work in a bare
 repository.

 Will merge to 'next'?
 source: <20230721035758.61956-1-hanyang.tony@bytedance.com>


* ja/worktree-orphan-fix (2023-07-21) 4 commits
 - SQUASH???
 - t2400: rewrite regex to avoid unintentional PCRE
 - builtin/worktree.c: convert tab in advice to space
 - t2400: drop no-op `--sq` from rev-parse call

 Expecting a reroll.
 cf. <axnxvnmo6ekhhccppinji73ivlandwuqs44epmq4pdefm7ukiv@ejz7bee5xjli>
 source: <20230721044012.24360-1-jacobabel@nullpo.dev>


* rs/describe-parseopt-fix (2023-07-21) 1 commit
  (merged to 'next' on 2023-07-21 at e74749af0c)
 + describe: fix --no-exact-match

 Command line parser fix.

 Will merge to 'master'.
 source: <4eea7e15-6594-93e2-27b5-3d6e3c0baac6@web.de>


* rs/pack-objects-parseopt-fix (2023-07-21) 2 commits
  (merged to 'next' on 2023-07-21 at acdf84416c)
 + pack-objects: fix --no-quiet
 + pack-objects: fix --no-keep-true-parents

 Command line parser fix.

 Will merge to 'master'.
 source: <xmqqo7k9fa5x.fsf@gitster.g>


* jc/retire-get-sha1-hex (2023-07-24) 1 commit
 - hex: retire get_sha1_hex()

 The implementation of "get_sha1_hex()" that reads a hexadecimal
 string that spells a full object name has been extended to cope
 with any hash function used in the repository, but the "sha1" in
 its name survived.  Rename it to get_hash_hex(), a name that is
 more consistent within its friends like get_hash_hex_algop().

 Will merge to 'next'.
 source: <xmqq1qgwoqgo.fsf_-_@gitster.g>


* rs/parse-options-negation-help (2023-07-24) 5 commits
 - parse-options: show negatability of options in short help
 - t1502: test option negation
 - t1502: move optionspec help output to a file
 - t1502, docs: disallow --no-help
 - subtree: disallow --no-{help,quiet,debug,branch,message}

 "git cmd -h" learned to signal which options can be negated by
 listing such options like "--[no-]opt".

 Comments?
 Would showing "--[[no-]no-]opt" for "no-opt" be worth it?
 cf. <9e8225dd-1e8b-8af2-c3e1-0c5834694244@web.de>
 source: <4d01e971-07cb-4f11-3cc6-9d9f21e590c1@web.de>


* tb/commit-graph-tests (2023-07-24) 5 commits
 - t/lib-commit-graph.sh: avoid sub-shell in `graph_git_behavior()`
 - t5328: avoid top-level directory changes
 - t5318: avoid top-level directory changes
 - t/lib-commit-graph.sh: avoid directory change in `graph_git_behavior()`
 - t/lib-commit-graph.sh: allow `graph_read_expect()` in sub-directories

 Test updates.

 Will merge to 'next'?
 source: <cover.1690216758.git.me@ttaylorr.com>

--------------------------------------------------
[Stalled]

* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Will discard.
 Have been expecting a hopefully minor and final reroll for too long.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.

 Will discard.
 Stalled for too long.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Will discard.
 Have been expecting a hopefully final reroll for too long.
 Looking much better, except for minor cosmetic issues.
 cf. <xmqqmt21txid.fsf@gitster.g>
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 cf. <55dd6194-25e5-1a66-9c39-27cb19bfbb3c@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

--------------------------------------------------
[Cooking]

* la/doc-choose-starting-point (2023-07-14) 5 commits
  (merged to 'next' on 2023-07-19 at 5a807cae46)
 + SubmittingPatches: simplify guidance for choosing a starting point
 + SubmittingPatches: emphasize need to communicate non-default starting points
 + SubmittingPatches: de-emphasize branches as starting points
 + SubmittingPatches: discuss subsystems separately from git.git
 + SubmittingPatches: reword awkward phrasing

 Clarify how to choose the starting point for a new topic in
 developer guidance document.

 Will merge to 'master'.
 source: <pull.1556.v2.git.1689314493.gitgitgadget@gmail.com>


* jr/gitignore-doc-example-markup (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at 4f2ece568d)
 + gitignore.txt: use backticks instead of double quotes

 Doc update.

 Will merge to 'master'.
 source: <pull.1553.git.git.1689685982027.gitgitgadget@gmail.com>


* jc/am-parseopt-fix (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at eaf592531e)
 + am: simplify parsing of "--[no-]keep-cr"

 Code simplification.

 Will merge to 'master'.
 source: <xmqqr0p5gjv3.fsf@gitster.g>


* jc/branch-parseopt-fix (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at 738d25bbb6)
 + branch: reject "--no-all" and "--no-remotes" early

 Command line parser fixes.

 Will merge to 'master'.
 source: <xmqqjzuxgjmi.fsf@gitster.g>


* rs/ls-tree-no-full-name-fix (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at 86e570c084)
 + ls-tree: fix --no-full-name

 Command line parser fix.

 Will merge to 'master'.
 source: <d392a005-4eba-7cc7-9554-cdb8dc53975e@web.de>


* jc/doc-sent-patch-now-what (2023-07-19) 1 commit
 - MyFirstContribution: refrain from self-iterating too much

 Process document update.

 Will merge to 'next'?
 source: <xmqqzga9opdu.fsf@gitster.g>


* jc/gitignore-doc-pattern-markup (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-20 at ecfc9c6118)
 + gitignore.txt: mark up explanation of patterns consistently

 Doc mark-up update.

 Will merge to 'master'.
 source: <xmqqwmyxglhg.fsf@gitster.g>


* jc/parse-options-reset (2023-07-19) 1 commit
  (merged to 'next' on 2023-07-20 at d2178a4bd4)
 + reset: reject --no-(mixed|soft|hard|merge|keep) option

 Command line parser fix.

 Will merge to 'master'.
 source: <xmqq1qh4c998.fsf@gitster.g>


* jc/parse-options-short-help (2023-07-19) 3 commits
 - short help: allow a gap smaller than USAGE_GAP
 - remote: simplify "remote add --tags" help text
 - short help: allow multi-line opthelp

 Command line parser fix, and a small parse-options API update.

 Comments?
 source: <xmqq5y6gg8fn.fsf@gitster.g>


* jc/parse-options-show-branch (2023-07-19) 2 commits
  (merged to 'next' on 2023-07-20 at 4fa809c2f2)
 + show-branch: reject --[no-](topo|date)-order
 + show-branch: --no-sparse should give dense output

 Command line parser fixes.

 Will merge to 'master'.
 source: <xmqqh6pzc15n.fsf@gitster.g>


* jc/transport-parseopt-fix (2023-07-18) 2 commits
  (merged to 'next' on 2023-07-20 at 07f0026aaa)
 + fetch: reject --no-ipv[46]
 + parse-options: introduce OPT_IPVERSION()

 Command line parser fixes.

 Will merge to 'master'.
 source: <xmqqedl4gag8.fsf@gitster.g>


* sl/sparse-check-attr (2023-07-18) 3 commits
 - check-attr: integrate with sparse-index
 - attr.c: read attributes in a sparse directory
 - t1092: add tests for 'git check-attr'

 Teach "git check-attr" work better with sparse-index.

 Expecting a reroll.
 cf. <c3ebe3b4-88b9-8ca2-2ee3-39a3e0d82201@github.com>
 cf. <5e478d8b-9ef4-864b-41e4-e0a79877d278@github.com>
 source: <20230718232916.31660-1-cheskaqiqi@gmail.com>


* ah/autoconf-fixes (2023-07-19) 3 commits
  (merged to 'next' on 2023-07-25 at 35ff66e0cb)
 + configure.ac: always save NO_ICONV to config.status
 + configure.ac: don't overwrite NO_CURL option
 + configure.ac: don't overwrite NO_EXPAT option

 "./configure --with-expat=no" did not work as a way to refuse use
 of the expat library on a system with the library installed, which
 has been corrected.

 Will merge to 'master'.
 source: <20230719145211.17854-2-aherrmann@suse.de>


* jc/branch-in-use-error-message (2023-07-21) 1 commit
 - branch: update the message to refuse touching a branch in-use

 "git branch -f X" to repoint the branch X seid that X was "checked
 out" in another worktree, even when branch X was not and instead
 being bisected or rebased.  The message was reworded to say the
 branch was "in use".

 Will merge to 'next'?
 source: <xmqqr0p1szhz.fsf_-_@gitster.g>


* jc/doc-submodule-update-settings (2023-07-13) 1 commit
 . submodule: clarify that "!custom command" is the only oddball

 Rewrite the description of giving a custom command to the
 submodule.<name>.update configuraiton variable.

 Expecting a reroll from the original author.
 cf. <0d29ac42-4e8f-71b6-b85f-00de182e2957@imap.cc>
 source: <xmqqwmz3oacg.fsf@gitster.g>


* jc/tree-walk-drop-base-offset (2023-07-07) 2 commits
  (merged to 'next' on 2023-07-25 at cc050c60a6)
 + tree-walk: drop unused base_offset from do_match()
 + tree-walk: lose base_offset that is never used in tree_entry_interesting

 Code simplification.

 Will merge to 'master'.
 source: <20230707222116.4129415-1-gitster@pobox.com>


* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


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

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Will merge to 'next'.
 source: <20230724085909.3831831-1-christian.couder@gmail.com>


* js/doc-unit-tests (2023-06-30) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Still filling in blanks.
 source: <0169ce6fb9ccafc089b74ae406db0d1a8ff8ac65.1688165272.git.steadmon@google.com>


* jt/path-filter-fix (2023-07-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <20230720202203.3816309-1-jonathantanmy@google.com>
 source: <cover.1689283789.git.jonathantanmy@google.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 What's the status of this thing?
 source: <20230602102533.876905-1-christian.couder@gmail.com>

--------------------------------------------------
[Discarded]

* jc/rerere-read-rr-fix (2023-07-21) 1 commit
 . rerere: match the hash algorithm with its length

 SHA-256 fix.

 Superseded by jc/retire-get-sha1-hex
 source: <xmqqa5vou9ar.fsf@gitster.g>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jul 2023, #04; Wed, 19)
@ 2023-07-19 21:25  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-19 21:25 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* cw/compat-util-header-cleanup (2023-07-05) 6 commits
  (merged to 'next' on 2023-07-08 at c244b65c4f)
 + git-compat-util: move alloc macros to git-compat-util.h
 + treewide: remove unnecessary includes for wrapper.h
 + kwset: move translation table from ctype
 + sane-ctype.h: create header for sane-ctype macros
 + git-compat-util: move wrapper.c funcs to its header
 + git-compat-util: move strbuf.c funcs to its header

 Further shuffling of declarations across header files to streamline
 file dependencies.
 source: <20230705170812.3833103-1-calvinwan@google.com>


* jc/pathspec-match-with-common-prefix (2023-07-08) 2 commits
  (merged to 'next' on 2023-07-10 at 4146f391ed)
 + dir: match "attr" pathspec magic with correct paths
 + t6135: attr magic with path pattern

 "git ls-files '(attr:X)D/'" that triggers the common prefix
 optimization codepath failed to read from "D/.gitattributes",
 which has been corrected.
 source: <20230707220457.3655121-1-gitster@pobox.com>


* jk/imap-send-unused-variable-cleanup (2023-07-05) 3 commits
  (merged to 'next' on 2023-07-06 at d2798ee0fe)
 + imap-send: drop unused fields from imap_cmd_cb
 + imap-send: drop unused parameter from imap_cmd_cb callback
 + imap-send: use server conf argument in setup_curl()

 "imap-send" codepaths got cleaned up to get rid of unused
 parameters.
 source: <20230703063247.GA3524302@coredump.intra.peff.net>


* ks/ref-filter-signature (2023-06-06) 2 commits
  (merged to 'next' on 2023-07-06 at 1748d2bb93)
 + ref-filter: add new "signature" atom
 + t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.
 cf. <CAP8UFD1CfUm+9PTXO0wBBdBs0U=YVte+EiPbDyUyg7T152aw2g@mail.gmail.com>
 source: <20230604185815.15761-1-five231003@gmail.com>


* ma/t0091-fixup (2023-07-05) 1 commit
  (merged to 'next' on 2023-07-06 at 3f82b468b4)
 + t0091-bugreport.sh: actually verify some content of report

 "git bugreport" tests did not test what it wanted to test, which
 has been corrected.
 source: <20230705183532.3057433-1-martin.agren@gmail.com>


* mh/doc-credential-helpers (2023-07-10) 1 commit
  (merged to 'next' on 2023-07-11 at a391669194)
 + doc: gitcredentials: link to helper list

 Doc update.
 source: <pull.1538.v3.git.1688848614262.gitgitgadget@gmail.com>


* pw/diff-no-index-from-named-pipes (2023-07-05) 4 commits
  (merged to 'next' on 2023-07-08 at 225230a441)
 + diff --no-index: support reading from named pipes
 + t4054: test diff --no-index with stdin
 + diff --no-index: die on error reading stdin
 + diff --no-index: refuse to compare stdin to a directory

 "git diff --no-index" learned to read from named pipes as if they
 were regular files, to allow "git diff <(process) <(substitution)"
 some shells support.
 source: <cover.1688586536.git.phillip.wood@dunelm.org.uk>


* rs/ls-tree-prefix-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 3e4826525f)
 + ls-tree: simplify prefix handling

 Code simplification.
 source: <b34aa99b-2bf1-c645-bdf5-03ac258b4bf5@web.de>


* rs/packet-length-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 7f4b52e75b)
 + pkt-line: add size parameter to packet_length()

 Code simplification.
 source: <4d2bb49b-9c3c-ea58-274b-d9e9586620c1@web.de>


* rs/pretty-format-double-negation-fix (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 6674b562ff)
 + pretty: avoid double negative in format_commit_item()

 Code clarification.
 source: <8d4fcad1-5f71-4790-17ee-e9ba0a3118dc@web.de>


* rs/userformat-find-requirements-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 6cdc328a08)
 + pretty: use strchr(3) in userformat_find_requirements()

 Code simplification.
 source: <108ab1a2-28f4-dd62-1f90-64f37708aa8c@web.de>


* tb/fsck-no-progress (2023-07-10) 6 commits
  (merged to 'next' on 2023-07-11 at aab8389518)
 + commit-graph.c: avoid duplicated progress output during `verify`
 + commit-graph.c: pass progress to `verify_one_commit_graph()`
 + commit-graph.c: iteratively verify commit-graph chains
 + commit-graph.c: extract `verify_one_commit_graph()`
 + fsck: suppress MIDX output with `--no-progress`
 + fsck: suppress commit-graph output with `--no-progress`

 "git fsck --no-progress" still spewed noise from the commit-graph
 subsystem, which has been corrected.
 source: <cover.1688776280.git.me@ttaylorr.com>


* tb/repack-cleanup (2023-07-11) 2 commits
  (merged to 'next' on 2023-07-11 at f598c59a8a)
 + builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
 + builtin/repack.c: only repack `.pack`s that exist

 The recent change to "git repack" made it react less nicely when a
 leftover .idx file that no longer has the corresponding .pack file
 in the repository, which has been corrected.
 source: <cover.1689096750.git.me@ttaylorr.com>


* vd/adjust-mfow-doc-to-updated-headers (2023-07-04) 1 commit
  (merged to 'next' on 2023-07-08 at 38103c697d)
 + docs: add necessary headers to Documentation/MFOW.txt

 Code snippets in a tutorial document no longer compiled after
 recent header shuffling, which have been corrected.
 source: <20230702151457.3227-1-vinayakdev.sci@gmail.com>

--------------------------------------------------
[New Topics]

* dk/bundle-i18n-more (2023-07-13) 1 commit
  (merged to 'next' on 2023-07-18 at a9745efbe2)
 + i18n: mark more bundle.c strings for translation

 Update message mark-up for i18n in "git bundle".

 Will merge to 'master'.
 source: <pull.1550.git.1689285683013.gitgitgadget@gmail.com>


* jk/unused-parameter (2023-07-13) 14 commits
  (merged to 'next' on 2023-07-18 at 59d8f4ec1e)
 + t/helper: mark unused callback void data parameters
 + tag: mark unused parameters in each_tag_name_fn callbacks
 + rev-parse: mark unused parameter in for_each_abbrev callback
 + replace: mark unused parameter in each_mergetag_fn callback
 + replace: mark unused parameter in ref callback
 + merge-tree: mark unused parameter in traverse callback
 + fsck: mark unused parameters in various fsck callbacks
 + revisions: drop unused "opt" parameter in "tweak" callbacks
 + count-objects: mark unused parameter in alternates callback
 + am: mark unused keep_cr parameters
 + http-push: mark unused parameter in xml callback
 + http: mark unused parameters in curl callbacks
 + do_for_each_ref_helper(): mark unused repository parameter
 + test-ref-store: drop unimplemented reflog-expire command

 Mark-up unused parameters in the code so that we can eventually
 enable -Wunused-parameter by default.

 Will merge to 'master'.
 source: <20230703064347.GA3524892@coredump.intra.peff.net>


* dk/t4002-syntaxo-fix (2023-07-14) 1 commit
  (merged to 'next' on 2023-07-17 at 75d729ee52)
 + t4002: fix "diff can read from stdin" syntax

 Test fix.

 Will merge to 'master'.
 source: <pull.1545.git.git.1689341410476.gitgitgadget@gmail.com>


* la/doc-choose-starting-point (2023-07-14) 5 commits
  (merged to 'next' on 2023-07-19 at 5a807cae46)
 + SubmittingPatches: simplify guidance for choosing a starting point
 + SubmittingPatches: emphasize need to communicate non-default starting points
 + SubmittingPatches: de-emphasize branches as starting points
 + SubmittingPatches: discuss subsystems separately from git.git
 + SubmittingPatches: reword awkward phrasing

 Clarify how to choose the starting point for a new topic in
 developer guidance document.

 Will merge to 'master'.
 source: <pull.1556.v2.git.1689314493.gitgitgadget@gmail.com>


* rs/ref-filter-signature-fix (2023-07-17) 1 commit
  (merged to 'next' on 2023-07-18 at e74f016a60)
 + t6300: fix setup with GPGSSH but without GPG

 Test fix.

 Will merge to 'master'.
 source: <cbc22750-af93-9274-2ed4-6dfd356568e8@web.de>


* rs/strbuf-addftime-simplify (2023-07-17) 1 commit
  (merged to 'next' on 2023-07-18 at d665b0f0e9)
 + strbuf: use skip_prefix() in strbuf_addftime()

 Code clean-up.

 Will merge to 'master'.
 source: <fccba24c-584d-6329-69a7-75cf0458af7d@web.de>


* jk/nested-points-at (2023-07-17) 4 commits
  (merged to 'next' on 2023-07-18 at cf33f44a50)
 + ref-filter: simplify return type of match_points_at
 + ref-filter: avoid parsing non-tags in match_points_at()
 + ref-filter: avoid parsing tagged objects in match_points_at()
 + ref-filter: handle nested tags in --points-at option

 "git tag --list --points-at X" showed tags that directly refers to
 object X, but did not list a tag that points at such a tag, which
 has been corrected.

 Will merge to 'master'.
 source: <20230702223342.GA1598765@coredump.intra.peff.net>


* jr/gitignore-doc-example-markup (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at 4f2ece568d)
 + gitignore.txt: use backticks instead of double quotes

 Doc update.

 Will merge to 'master'.
 source: <pull.1553.git.git.1689685982027.gitgitgadget@gmail.com>


* jc/am-parseopt-fix (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at eaf592531e)
 + am: simplify parsing of "--[no-]keep-cr"

 Code simplification.

 Will merge to 'master'.
 source: <xmqqr0p5gjv3.fsf@gitster.g>


* jc/branch-parseopt-fix (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at 738d25bbb6)
 + branch: reject "--no-all" and "--no-remotes" early

 Command line parser fixes.

 Will merge to 'master'.
 source: <xmqqjzuxgjmi.fsf@gitster.g>


* rs/ls-tree-no-full-name-fix (2023-07-18) 1 commit
  (merged to 'next' on 2023-07-19 at 86e570c084)
 + ls-tree: fix --no-full-name

 Command line parser fix.

 Will merge to 'master'.
 source: <d392a005-4eba-7cc7-9554-cdb8dc53975e@web.de>


* jc/describe-parseopt-fix (2023-07-18) 1 commit
 - describe: --no-exact-match should not be the same as --exact-match

 Command line parser fix.

 Comments?
 source: <xmqqy1jcgbiv.fsf@gitster.g>


* jc/doc-sent-patch-now-what (2023-07-19) 1 commit
 - MyFirstContribution: refrain from self-iterating too much

 Process document update.

 Will merge to 'next'?
 source: <xmqqzga9opdu.fsf@gitster.g>


* jc/gitignore-doc-pattern-markup (2023-07-18) 1 commit
 - gitignore.txt: mark up explanation of patterns consistently

 Doc mark-up update.

 Will merge to 'next'.
 source: <xmqqwmyxglhg.fsf@gitster.g>


* jc/parse-options-reset (2023-07-19) 1 commit
 - reset: reject --no-(mixed|soft|hard|merge|keep) option

 Command line parser fix.

 Will merge to 'next'.
 source: <xmqq1qh4c998.fsf@gitster.g>


* jc/parse-options-short-help (2023-07-18) 3 commits
 - short help: allow a gap smaller than USAGE_GAP
 - remote: simplify "remote add --tags" help text
 - short help: allow multi-line opthelp

 Command line parser fix, and a small parse-options API update.

 Comments?
 source: <xmqq5y6gg8fn.fsf@gitster.g>


* jc/parse-options-show-branch (2023-07-19) 2 commits
 - show-branch: reject --[no-](topo|date)-order
 - show-branch: --no-sparse should give dense output

 Command line parser fixes.

 Will merge to 'next'.
 source: <xmqqh6pzc15n.fsf@gitster.g>


* jc/transport-parseopt-fix (2023-07-18) 2 commits
 - fetch: reject --no-ipv[46]
 - parse-options: introduce OPT_IPVERSION()

 Command line parser fixes.

 Will merge to 'next'.
 source: <xmqqedl4gag8.fsf@gitster.g>


* sl/sparse-check-attr (2023-07-18) 3 commits
 - check-attr: integrate with sparse-index
 - attr.c: read attributes in a sparse directory
 - t1092: add tests for 'git check-attr'

 Teach "git check-attr" work better with sparse-index.

 Needs review.
 source: <20230718232916.31660-1-cheskaqiqi@gmail.com>

--------------------------------------------------
[Stalled]

* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Will discard.
 Have been expecting a hopefully minor and final reroll for too long.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 Will discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.

 Will discard.
 Stalled for too long.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 Will discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Will discard.
 Have been expecting a reroll for too long.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Will discard.
 Have been expecting a hopefully final reroll for too long.
 Looking much better, except for minor cosmetic issues.
 cf. <xmqqmt21txid.fsf@gitster.g>
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 cf. <55dd6194-25e5-1a66-9c39-27cb19bfbb3c@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

--------------------------------------------------
[Cooking]

* ah/autoconf-fixes (2023-07-19) 3 commits
 - configure.ac: always save NO_ICONV to config.status
 - configure.ac: don't overwrite NO_CURL option
 - configure.ac: don't overwrite NO_EXPAT option

 "./configure --with-expat=no" did not work as a way to refuse use
 of the expat library on a system with the library installed, which
 has been corrected.

 Needs review.
 source: <20230719145211.17854-2-aherrmann@suse.de>


* jc/branch-in-use-error-message (2023-07-12) 1 commit
 . branch: update the message to refuse touching a branch in-use

 "git branch -f X" to repoint the branch X seid that X was "checked
 out" in another worktree, even when branch X was not and instead
 being bisected or rebased.  The message was reworded to say the
 branch was "in use".

 Just a weather-balloon.
 source: <xmqqy1jkrcmg.fsf_-_@gitster.g>


* tb/object-access-overflow-protection (2023-07-14) 20 commits
  (merged to 'next' on 2023-07-17 at 9ad8a08011)
 + commit-graph.c: prevent overflow in `verify_commit_graph()`
 + commit-graph.c: prevent overflow in `write_commit_graph()`
 + commit-graph.c: prevent overflow in `merge_commit_graph()`
 + commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
 + commit-graph.c: prevent overflow in `load_tree_for_commit()`
 + commit-graph.c: prevent overflow in `fill_commit_in_graph()`
 + commit-graph.c: prevent overflow in `fill_commit_graph_info()`
 + commit-graph.c: prevent overflow in `load_oid_from_graph()`
 + commit-graph.c: prevent overflow in add_graph_to_chain()
 + commit-graph.c: prevent overflow in `write_commit_graph_file()`
 + pack-bitmap.c: ensure that eindex lookups don't overflow
 + midx.c: prevent overflow in `fill_included_packs_batch()`
 + midx.c: prevent overflow in `write_midx_internal()`
 + midx.c: store `nr`, `alloc` variables as `size_t`'s
 + midx.c: prevent overflow in `nth_midxed_offset()`
 + midx.c: prevent overflow in `nth_midxed_object_oid()`
 + midx.c: use `size_t`'s for fanout nr and alloc
 + packfile.c: use checked arithmetic in `nth_packed_object_offset()`
 + packfile.c: prevent overflow in `load_idx()`
 + packfile.c: prevent overflow in `nth_packed_object_id()`

 Various offset computation in the code that accesses the packfiles
 and other data in the object layer has been hardened against
 arithmetic overflow, especially on 32-bit systems.

 Will merge to 'master'.
 source: <ZLAJNbIBFUPHYhlt@nand.local>
 source: <cover.1689205042.git.me@ttaylorr.com>


* jc/doc-submodule-update-settings (2023-07-13) 1 commit
 . submodule: clarify that "!custom command" is the only oddball

 Rewrite the description of giving a custom command to the
 submodule.<name>.update configuraiton variable.

 Just a weather-balloon.
 source: <xmqqwmz3oacg.fsf@gitster.g>


* ah/advise-force-pushing (2023-07-13) 3 commits
  (merged to 'next' on 2023-07-17 at b040e8280e)
 + push: don't imply that integration is always required before pushing
 + remote: don't imply that integration is always required before pushing
 + wt-status: don't show divergence advice when committing

 Help newbies by suggesting that there are cases where force-pushing
 is a valid and sensible thing to update a branch at a remote
 repository, rather than reconciling with merge/rebase.

 Will merge to 'master'.
 cf. <919d1ba8-bb8b-a77b-cef3-db14f168ed4a@gmail.com>
 source: <20230713044128.3771818-1-alexhenrie24@gmail.com>


* jc/tree-walk-drop-base-offset (2023-07-07) 2 commits
 - tree-walk: drop unused base_offset from do_match()
 - tree-walk: lose base_offset that is never used in tree_entry_interesting

 Code simplification.

 Needs review.
 source: <20230707222116.4129415-1-gitster@pobox.com>


* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


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

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Comments?
 cf. <xmqqh6qi1byn.fsf@gitster.g>
 source: <20230705060812.2865188-1-christian.couder@gmail.com>


* js/doc-unit-tests (2023-06-30) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Still filling in blanks.
 source: <0169ce6fb9ccafc089b74ae406db0d1a8ff8ac65.1688165272.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
  (merged to 'next' on 2023-07-17 at 2c72856851)
 + mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Will merge to 'master'.
 cf. <xmqqmt14a36k.fsf@gitster.g>
 source: <20230604211934.1365289-1-mh@glandium.org>


* jt/path-filter-fix (2023-07-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.
 source: <cover.1689283789.git.jonathantanmy@google.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-07-10) 16 commits
  (merged to 'next' on 2023-07-13 at 6d72f3e995)
 + ls-refs.c: avoid enumerating hidden refs where possible
 + upload-pack.c: avoid enumerating hidden refs where possible
 + builtin/receive-pack.c: avoid enumerating hidden references
 + refs.h: implement `hidden_refs_to_excludes()`
 + refs.h: let `for_each_namespaced_ref()` take excluded patterns
 + revision.h: store hidden refs in a `strvec`
 + refs/packed-backend.c: add trace2 counters for jump list
 + refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 + refs/packed-backend.c: refactor `find_reference_location()`
 + refs: plumb `exclude_patterns` argument throughout
 + builtin/for-each-ref.c: add `--exclude` option
 + ref-filter.c: parameterize match functions over patterns
 + ref-filter: add `ref_filter_clear()`
 + ref-filter: clear reachable list pointers after freeing
 + ref-filter.h: provide `REF_FILTER_INIT`
 + refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.

 Will merge to 'master'.
 source: <cover.1689023520.git.me@ttaylorr.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 What's the status of this thing?
 source: <20230602102533.876905-1-christian.couder@gmail.com>

^ permalink raw reply	[relevance 2%]

* Re: [PATCH] Use lowercase includes for some Windows headers
  2023-06-12 19:30  5% ` Junio C Hamano
@ 2023-07-14 17:07  0%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-14 17:07 UTC (permalink / raw)
  To: git; +Cc: Mike Hommey, Johannes Schindelin, Jeff Hostetler, Johannes Sixt

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

> Mike Hommey <mh@glandium.org> writes:
>
>> When cross-compiling with the mingw toolchain on a system with a case
>> sensitive filesystem, the mixed case (which is technically correct as
>> per the contents of MS Visual C++) doesn't work (the corresponding mingw
>> headers are all lowercase for some reason).
>>
>> Signed-off-by: Mike Hommey <mh@glandium.org>
>> ---
>>  compat/win32/trace2_win32_process_info.c | 4 ++--
>>  wrapper.c                                | 2 +-
>>  2 files changed, 3 insertions(+), 3 deletions(-)
>
> ...  The only possible breakage I can think of is if
> different versions of mingw toolchain have these header files in
> different cases---those who have been happily using header files
> like <tlHelp32.h> on their case sensitive filesystem now will find
> their build to fail.  Theoretically, those who _corrected_ their
> header files to mixed case themselves (as it is "technically correct
> as per the contents of MS Visual C++") will be broken the same way,
> but they should be capable of diagnosing and recovering from such a
> breakage, so I'm not worried about that.
>
> Appreciate input from those who builds with mingw toolchain, but in
> the meantime let me queue it on 'seen' so that we won't forget.

And a month has passed.  Unless I hear objections, I'll merge this
change to 'next' in a few days at most.

Thanks.

>
> Thanks.
>
>
>
>
>
>> diff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c
>> index a4e33768f4..438af8f818 100644
>> --- a/compat/win32/trace2_win32_process_info.c
>> +++ b/compat/win32/trace2_win32_process_info.c
>> @@ -3,8 +3,8 @@
>>  #include "../../repository.h"
>>  #include "../../trace2.h"
>>  #include "lazyload.h"
>> -#include <Psapi.h>
>> -#include <tlHelp32.h>
>> +#include <psapi.h>
>> +#include <tlhelp32.h>
>>  
>>  /*
>>   * An arbitrarily chosen value to limit the size of the ancestor
>> diff --git a/wrapper.c b/wrapper.c
>> index 67f5f5dbe1..5dc48e815a 100644
>> --- a/wrapper.c
>> +++ b/wrapper.c
>> @@ -17,7 +17,7 @@ static intmax_t count_fsync_hardware_flush;
>>  #ifdef HAVE_RTLGENRANDOM
>>  /* This is required to get access to RtlGenRandom. */
>>  #define SystemFunction036 NTAPI SystemFunction036
>> -#include <NTSecAPI.h>
>> +#include <ntsecapi.h>
>>  #undef SystemFunction036
>>  #endif

^ permalink raw reply	[relevance 0%]

* What's cooking in git.git (Jul 2023, #03; Thu, 13)
@ 2023-07-13 23:09  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-13 23:09 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

There are quite a few topics that have been in "Expecting a reroll"
for too long.  I've moved those that are more than 3 months old to
the "Will discard" section, but given that Summer is a relatively
slow season, I'll keep these topics for a few more weeks at least.

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[New Topics]

* ah/configure-no-expat (2023-07-13) 1 commit
 - configure.ac: Don't overwrite NO_EXPAT option

 "./configure --with-expat=no" did not work as a way to refuse use
 of the expat library on a system with the library installed, which
 has been corrected.

 Review response sent.
 cf. <xmqqwmz3pwx2.fsf@gitster.g>
 source: <20230713074654.23957-1-aherrmann@suse.de>


* jc/branch-in-use-error-message (2023-07-12) 1 commit
 - branch: update the message to refuse touching a branch in-use

 "git branch -f X" to repoint the branch X seid that X was "checked
 out" in another worktree, even when branch X was not and instead
 being bisected or rebased.  The message was reworded to say the
 branch was "in use".

 Will merge to 'next'?
 source: <xmqqy1jkrcmg.fsf_-_@gitster.g>


* tb/object-access-overflow-protection (2023-07-12) 20 commits
 - commit-graph.c: prevent overflow in `verify_commit_graph()`
 - commit-graph.c: prevent overflow in `write_commit_graph()`
 - commit-graph.c: prevent overflow in `merge_commit_graph()`
 - commit-graph.c: prevent overflow in `split_graph_merge_strategy()`
 - commit-graph.c: prevent overflow in `load_tree_for_commit()`
 - commit-graph.c: prevent overflow in `fill_commit_in_graph()`
 - commit-graph.c: prevent overflow in `fill_commit_graph_info()`
 - commit-graph.c: prevent overflow in `load_oid_from_graph()`
 - commit-graph.c: prevent overflow in add_graph_to_chain()
 - commit-graph.c: prevent overflow in `write_commit_graph_file()`
 - pack-bitmap.c: ensure that eindex lookups don't overflow
 - midx.c: prevent overflow in `fill_included_packs_batch()`
 - midx.c: prevent overflow in `write_midx_internal()`
 - midx.c: store `nr`, `alloc` variables as `size_t`'s
 - midx.c: prevent overflow in `nth_midxed_offset()`
 - midx.c: prevent overflow in `nth_midxed_object_oid()`
 - midx.c: use `size_t`'s for fanout nr and alloc
 - packfile.c: use checked arithmetic in `nth_packed_object_offset()`
 - packfile.c: prevent overflow in `load_idx()`
 - packfile.c: prevent overflow in `nth_packed_object_id()`

 Various offset computation in the code that accesses the packfiles
 and other data in the object layer has been hardened against
 arithmetic overflow, especially on 32-bit systems.

 Expecting a reroll or a fix-up.
 cf. <5d2cf09f-34c7-9a88-bab2-8bf348dd13bb@gmail.com>
 source: <cover.1689205042.git.me@ttaylorr.com>


* jc/doc-submodule-update-settings (2023-07-13) 1 commit
 - submodule: clarify that "!custom command" is the only oddball

 Rewrite the description of giving a custom command to the
 submodule.<name>.update configuraiton variable.

 source: <xmqqwmz3oacg.fsf@gitster.g>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Will discard.
 Have been expecting a hopefully minor and final reroll for too long.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 Will discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.

 Will discard.
 Stalled for too long.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 Will discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Will discard.
 Have been expecting a reroll for too long.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Will discard.
 Have been expecting a reroll for too long.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Will discard.
 Have been expecting a hopefully final reroll for too long.
 Looking much better, except for minor cosmetic issues.
 cf. <xmqqmt21txid.fsf@gitster.g>
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

--------------------------------------------------
[Cooking]

* ah/advise-force-pushing (2023-07-13) 3 commits
 - push: don't imply that integration is always required before pushing
 - remote: don't imply that integration is always required before pushing
 - wt-status: don't show divergence advice when committing

 Help newbies by suggesting that there are cases where force-pushing
 is a valid and sensible thing to update a branch at a remote
 repository, rather than reconciling with merge/rebase.

 Will merge to 'next'.
 cf. <919d1ba8-bb8b-a77b-cef3-db14f168ed4a@gmail.com>
 source: <20230713044128.3771818-1-alexhenrie24@gmail.com>


* jc/pathspec-match-with-common-prefix (2023-07-08) 2 commits
  (merged to 'next' on 2023-07-10 at 4146f391ed)
 + dir: match "attr" pathspec magic with correct paths
 + t6135: attr magic with path pattern

 "git ls-files '(attr:X)D/'" that triggers the common prefix
 optimization codepath failed to read from "D/.gitattributes",
 which has been corrected.

 Will merge to 'master'.
 source: <20230707220457.3655121-1-gitster@pobox.com>


* jc/tree-walk-drop-base-offset (2023-07-07) 2 commits
 - tree-walk: drop unused base_offset from do_match()
 - tree-walk: lose base_offset that is never used in tree_entry_interesting

 Code simplification.

 Needs review.
 source: <20230707222116.4129415-1-gitster@pobox.com>


* rs/ls-tree-prefix-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 3e4826525f)
 + ls-tree: simplify prefix handling

 Code simplification.

 Will merge to 'master'.
 source: <b34aa99b-2bf1-c645-bdf5-03ac258b4bf5@web.de>


* rs/pretty-format-double-negation-fix (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 6674b562ff)
 + pretty: avoid double negative in format_commit_item()

 Code clarification.

 Will merge to 'master'.
 source: <8d4fcad1-5f71-4790-17ee-e9ba0a3118dc@web.de>


* rs/userformat-find-requirements-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 6cdc328a08)
 + pretty: use strchr(3) in userformat_find_requirements()

 Code simplification.

 Will merge to 'master'.
 source: <108ab1a2-28f4-dd62-1f90-64f37708aa8c@web.de>


* mh/doc-credential-helpers (2023-07-10) 1 commit
  (merged to 'next' on 2023-07-11 at a391669194)
 + doc: gitcredentials: link to helper list

 Doc update.

 Will merge to 'master'.
 source: <pull.1538.v3.git.1688848614262.gitgitgadget@gmail.com>


* tb/fsck-no-progress (2023-07-10) 6 commits
  (merged to 'next' on 2023-07-11 at aab8389518)
 + commit-graph.c: avoid duplicated progress output during `verify`
 + commit-graph.c: pass progress to `verify_one_commit_graph()`
 + commit-graph.c: iteratively verify commit-graph chains
 + commit-graph.c: extract `verify_one_commit_graph()`
 + fsck: suppress MIDX output with `--no-progress`
 + fsck: suppress commit-graph output with `--no-progress`

 "git fsck --no-progress" still spewed noise from the commit-graph
 subsystem, which has been corrected.

 Will merge to 'master'.
 source: <cover.1688776280.git.me@ttaylorr.com>


* tb/repack-cleanup (2023-07-11) 2 commits
  (merged to 'next' on 2023-07-11 at f598c59a8a)
 + builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
 + builtin/repack.c: only repack `.pack`s that exist

 The recent change to "git repack" made it react less nicely when a
 leftover .idx file that no longer has the corresponding .pack file
 in the repository, which has been corrected.

 Will merge to 'master'.
 source: <cover.1689096750.git.me@ttaylorr.com>


* cw/compat-util-header-cleanup (2023-07-05) 6 commits
  (merged to 'next' on 2023-07-08 at c244b65c4f)
 + git-compat-util: move alloc macros to git-compat-util.h
 + treewide: remove unnecessary includes for wrapper.h
 + kwset: move translation table from ctype
 + sane-ctype.h: create header for sane-ctype macros
 + git-compat-util: move wrapper.c funcs to its header
 + git-compat-util: move strbuf.c funcs to its header

 Further shuffling of declarations across header files to streamline
 file dependencies.

 Will merge to 'master'.
 source: <20230705170812.3833103-1-calvinwan@google.com>


* jk/imap-send-unused-variable-cleanup (2023-07-05) 3 commits
  (merged to 'next' on 2023-07-06 at d2798ee0fe)
 + imap-send: drop unused fields from imap_cmd_cb
 + imap-send: drop unused parameter from imap_cmd_cb callback
 + imap-send: use server conf argument in setup_curl()

 "imap-send" codepaths got cleaned up to get rid of unused
 parameters.

 Will merge to 'master'.
 source: <20230703063247.GA3524302@coredump.intra.peff.net>


* ma/t0091-fixup (2023-07-05) 1 commit
  (merged to 'next' on 2023-07-06 at 3f82b468b4)
 + t0091-bugreport.sh: actually verify some content of report

 "git bugreport" tests did not test what it wanted to test, which
 has been corrected.

 Will merge to 'master'.
 source: <20230705183532.3057433-1-martin.agren@gmail.com>


* rs/packet-length-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 7f4b52e75b)
 + pkt-line: add size parameter to packet_length()

 Code simplification.

 Will merge to 'master'.
 source: <4d2bb49b-9c3c-ea58-274b-d9e9586620c1@web.de>


* vd/adjust-mfow-doc-to-updated-headers (2023-07-04) 1 commit
  (merged to 'next' on 2023-07-08 at 38103c697d)
 + docs: add necessary headers to Documentation/MFOW.txt

 Code snippets in a tutorial document no longer compiled after
 recent header shuffling, which have been corrected.

 Will merge to 'master'.
 source: <20230702151457.3227-1-vinayakdev.sci@gmail.com>


* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


* pw/diff-no-index-from-named-pipes (2023-07-05) 4 commits
  (merged to 'next' on 2023-07-08 at 225230a441)
 + diff --no-index: support reading from named pipes
 + t4054: test diff --no-index with stdin
 + diff --no-index: die on error reading stdin
 + diff --no-index: refuse to compare stdin to a directory

 "git diff --no-index" learned to read from named pipes as if they
 were regular files, to allow "git diff <(process) <(substitution)"
 some shells support.

 Will merge to 'master'.
 source: <cover.1688586536.git.phillip.wood@dunelm.org.uk>


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

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Comments?
 cf. <xmqqh6qi1byn.fsf@gitster.g>
 source: <20230705060812.2865188-1-christian.couder@gmail.com>


* js/doc-unit-tests (2023-06-30) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Still filling in blanks.
 source: <0169ce6fb9ccafc089b74ae406db0d1a8ff8ac65.1688165272.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* ks/ref-filter-signature (2023-06-06) 2 commits
  (merged to 'next' on 2023-07-06 at 1748d2bb93)
 + ref-filter: add new "signature" atom
 + t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Will merge to 'master'.
 cf. <CAP8UFD1CfUm+9PTXO0wBBdBs0U=YVte+EiPbDyUyg7T152aw2g@mail.gmail.com>
 source: <20230604185815.15761-1-five231003@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-07-10) 16 commits
  (merged to 'next' on 2023-07-13 at 6d72f3e995)
 + ls-refs.c: avoid enumerating hidden refs where possible
 + upload-pack.c: avoid enumerating hidden refs where possible
 + builtin/receive-pack.c: avoid enumerating hidden references
 + refs.h: implement `hidden_refs_to_excludes()`
 + refs.h: let `for_each_namespaced_ref()` take excluded patterns
 + revision.h: store hidden refs in a `strvec`
 + refs/packed-backend.c: add trace2 counters for jump list
 + refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 + refs/packed-backend.c: refactor `find_reference_location()`
 + refs: plumb `exclude_patterns` argument throughout
 + builtin/for-each-ref.c: add `--exclude` option
 + ref-filter.c: parameterize match functions over patterns
 + ref-filter: add `ref_filter_clear()`
 + ref-filter: clear reachable list pointers after freeing
 + ref-filter.h: provide `REF_FILTER_INIT`
 + refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.

 Will merge to 'master'.
 source: <cover.1689023520.git.me@ttaylorr.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jul 2023, #02; Mon, 10)
@ 2023-07-11  1:05  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-11  1:05 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[New Topics]

* ah/advise-force-pushing (2023-07-07) 1 commit
 - push: advise about force-pushing as an alternative to reconciliation

 Help newbies by suggesting that there are cases where force-pushing
 is a valid and sensible thing to update a branch at a remote
 repository, rather than reconciling with merge/rebase.

 Will merge to 'next'?
 Perhaps we should go ahead with only the "git push" half (queued here)
 without touching "git checkout" and "git status" half (not queued here).
 source: <20230707054257.3366355-3-alexhenrie24@gmail.com>


* jc/pathspec-match-with-common-prefix (2023-07-08) 2 commits
  (merged to 'next' on 2023-07-10 at 4146f391ed)
 + dir: match "attr" pathspec magic with correct paths
 + t6135: attr magic with path pattern

 "git ls-files '(attr:X)D/'" that triggers the common prefix
 optimization codepath failed to read from "D/.gitattributes",
 which has been corrected.

 Will merge to 'master'.
 source: <20230707220457.3655121-1-gitster@pobox.com>


* jc/tree-walk-drop-base-offset (2023-07-07) 2 commits
 - tree-walk: drop unused base_offset from do_match()
 - tree-walk: lose base_offset that is never used in tree_entry_interesting

 Code simplification.

 Needs review.
 source: <20230707222116.4129415-1-gitster@pobox.com>


* rs/ls-tree-prefix-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 3e4826525f)
 + ls-tree: simplify prefix handling

 Code simplification.

 Will merge to 'master'.
 source: <b34aa99b-2bf1-c645-bdf5-03ac258b4bf5@web.de>


* rs/pretty-format-double-negation-fix (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 6674b562ff)
 + pretty: avoid double negative in format_commit_item()

 Code clarification.

 Will merge to 'master'.
 source: <8d4fcad1-5f71-4790-17ee-e9ba0a3118dc@web.de>


* rs/userformat-find-requirements-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 6cdc328a08)
 + pretty: use strchr(3) in userformat_find_requirements()

 Code simplification.

 Will merge to 'master'.
 source: <108ab1a2-28f4-dd62-1f90-64f37708aa8c@web.de>


* mh/doc-credential-helpers (2023-07-10) 1 commit
 - doc: gitcredentials: link to helper list

 Doc update.

 Will merge to 'next'.
 source: <pull.1538.v3.git.1688848614262.gitgitgadget@gmail.com>


* tb/fsck-no-progress (2023-07-10) 6 commits
 - commit-graph.c: avoid duplicated progress output during `verify`
 - commit-graph.c: pass progress to `verify_one_commit_graph()`
 - commit-graph.c: iteratively verify commit-graph chains
 - commit-graph.c: extract `verify_one_commit_graph()`
 - fsck: suppress MIDX output with `--no-progress`
 - fsck: suppress commit-graph output with `--no-progress`

 "git fsck --no-progress" still spewed noise from the commit-graph
 subsystem, which has been corrected.

 Will merge to 'next'.
 source: <cover.1688776280.git.me@ttaylorr.com>


* tb/repack-cleanup (2023-07-10) 2 commits
 - builtin/repack.c: avoid dir traversal in `collect_pack_filenames()`
 - builtin/repack.c: only repack `.pack`s that exist

 The recent change to "git repack" made it react less nicely when a
 leftover .idx file that no longer has the corresponding .pack file
 in the repository, which has been corrected.

 Will merge to 'next'.
 source: <cover.1689017830.git.me@ttaylorr.com>

--------------------------------------------------
[Graduated to 'master']

* cw/strbuf-cleanup (2023-06-12) 7 commits
  (merged to 'next' on 2023-06-28 at c158b004a8)
 + strbuf: remove global variable
 + path: move related function to path
 + object-name: move related functions to object-name
 + credential-store: move related functions to credential-store file
 + abspath: move related functions to abspath
 + strbuf: clarify dependency
 + strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]
 source: <20230606194720.2053551-1-calvinwan@google.com>


* gc/config-context (2023-06-28) 11 commits
  (merged to 'next' on 2023-06-28 at 38632f3daf)
 + config: pass source to config_parser_event_fn_t
 + config: add kvi.path, use it to evaluate includes
 + config.c: remove config_reader from configsets
 + config: pass kvi to die_bad_number()
 + trace2: plumb config kvi
 + config.c: pass ctx with CLI config
 + config: pass ctx with config files
 + config.c: pass ctx in configsets
 + config: add ctx arg to config_fn_t
 + urlmatch.h: use config_fn_t type
 + config: inline git_color_default_config

 Reduce reliance on a global state in the config reading API.
 source: <pull.1497.v5.git.git.1687980390.gitgitgadget@gmail.com>


* gc/config-partial-submodule-kvi-fix (2023-06-26) 1 commit
  (merged to 'next' on 2023-06-28 at 1fb30a34e3)
 + config: don't BUG when both kvi and source are set

 Partially revert a sanity check that the rest of the config code
 was not ready, to avoid triggering it in a corner case.
 source: <pull.1535.git.git.1687801297404.gitgitgadget@gmail.com>


* jc/doc-hash-object-types (2023-06-28) 1 commit
  (merged to 'next' on 2023-06-28 at adff1700c2)
 + docs: add git hash-object -t option's possible values

 Doc update.
 source: <pull.1533.v3.git.git.1688004473941.gitgitgadget@gmail.com>


* jk/cherry-pick-revert-status (2023-06-27) 1 commit
  (merged to 'next' on 2023-06-28 at 4a0d88ef7a)
 + fix cherry-pick/revert status when doing multiple commits

 During a cherry-pick or revert session that works on multiple
 commits, "git status" did not give correct information, which has
 been corrected.
 source: <20230627224230.1951135-1-jacob.e.keller@intel.com>


* jk/fsck-indices-in-worktrees (2023-06-29) 1 commit
  (merged to 'next' on 2023-06-29 at 9d245b3681)
 + fsck: avoid misleading variable name

 Code clarification.
 source: <20230629181333.87465-1-ericsunshine@charter.net>


* js/empty-index-fixes (2023-06-29) 3 commits
  (merged to 'next' on 2023-06-29 at cdfd131900)
 + commit -a -m: allow the top-level tree to become empty again
 + split-index: accept that a base index can be empty
 + do_read_index(): always mark index as initialized unless erroring out

 A few places failed to differenciate the case where the index is
 truly empty (nothing added) and we haven't yet read from the
 on-disk index file, which have been corrected.
 source: <pull.1554.git.1688044991.gitgitgadget@gmail.com>


* ks/t4205-test-describe-with-abbrev-fix (2023-06-29) 1 commit
  (merged to 'next' on 2023-06-29 at 5fc309dc75)
 + t4205: correctly test %(describe:abbrev=...)

 Test update.
 source: <20230629133841.18784-2-five231003@gmail.com>


* pb/complete-diff-options (2023-06-26) 24 commits
  (merged to 'next' on 2023-06-28 at ccff93557d)
 + diff.c: mention completion above add_diff_options
 + completion: complete --remerge-diff
 + completion: complete --diff-merges, its options and --no-diff-merges
 + completion: move --pickaxe-{all,regex} to __git_diff_common_options
 + completion: complete --ws-error-highlight
 + completion: complete --unified
 + completion: complete --output-indicator-{context,new,old}
 + completion: complete --output
 + completion: complete --no-stat
 + completion: complete --no-relative
 + completion: complete --line-prefix
 + completion: complete --ita-invisible-in-index and --ita-visible-in-index
 + completion: complete --irreversible-delete
 + completion: complete --ignore-matching-lines
 + completion: complete --function-context
 + completion: complete --find-renames
 + completion: complete --find-object
 + completion: complete --find-copies
 + completion: complete --default-prefix
 + completion: complete --compact-summary
 + completion: complete --combined-all-paths
 + completion: complete --cc
 + completion: complete --break-rewrites
 + completion: add comments describing __git_diff_* globals

 Completion updates.
 source: <pull.1543.v3.git.1687796688.gitgitgadget@gmail.com>


* pw/apply-too-large (2023-06-26) 1 commit
  (merged to 'next' on 2023-06-28 at c0460d682c)
 + apply: improve error messages when reading patch

 "git apply" punts when it is fed too large a patch input; the error
 message it gives when it happens has been clarified.
 source: <pull.1552.git.1687772253869.gitgitgadget@gmail.com>


* rs/strbuf-expand-step (2023-06-18) 5 commits
  (merged to 'next' on 2023-06-28 at 1918915b71)
 + strbuf: simplify strbuf_expand_literal_cb()
 + replace strbuf_expand() with strbuf_expand_step()
 + replace strbuf_expand_dict_cb() with strbuf_expand_step()
 + strbuf: factor out strbuf_expand_step()
 + pretty: factor out expand_separator()

 Code clean-up around strbuf_expand() API.
 source: <767baa64-20a6-daf2-d34b-d81f72363749@web.de>


* tl/notes-separator (2023-06-21) 7 commits
  (merged to 'next' on 2023-06-28 at 74fa459f4d)
 + notes: introduce "--no-separator" option
 + notes.c: introduce "--[no-]stripspace" option
 + notes.c: append separator instead of insert by pos
 + notes.c: introduce '--separator=<paragraph-break>' option
 + t3321: add test cases about the notes stripspace behavior
 + notes.c: use designated initializers for clarity
 + notes.c: cleanup 'strbuf_grow' call in 'append_edit'

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.
 source: <cover.1685174011.git.dyroneteng@gmail.com>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* cw/compat-util-header-cleanup (2023-07-05) 6 commits
  (merged to 'next' on 2023-07-08 at c244b65c4f)
 + git-compat-util: move alloc macros to git-compat-util.h
 + treewide: remove unnecessary includes for wrapper.h
 + kwset: move translation table from ctype
 + sane-ctype.h: create header for sane-ctype macros
 + git-compat-util: move wrapper.c funcs to its header
 + git-compat-util: move strbuf.c funcs to its header

 Further shuffling of declarations across header files to streamline
 file dependencies.

 Will merge to 'master'.
 source: <20230705170812.3833103-1-calvinwan@google.com>


* jk/imap-send-unused-variable-cleanup (2023-07-05) 3 commits
  (merged to 'next' on 2023-07-06 at d2798ee0fe)
 + imap-send: drop unused fields from imap_cmd_cb
 + imap-send: drop unused parameter from imap_cmd_cb callback
 + imap-send: use server conf argument in setup_curl()

 "imap-send" codepaths got cleaned up to get rid of unused
 parameters.

 Will merge to 'master'.
 source: <20230703063247.GA3524302@coredump.intra.peff.net>


* ma/t0091-fixup (2023-07-05) 1 commit
  (merged to 'next' on 2023-07-06 at 3f82b468b4)
 + t0091-bugreport.sh: actually verify some content of report

 "git bugreport" tests did not test what it wanted to test, which
 has been corrected.

 Will merge to 'master'.
 source: <20230705183532.3057433-1-martin.agren@gmail.com>


* rs/packet-length-simplify (2023-07-07) 1 commit
  (merged to 'next' on 2023-07-08 at 7f4b52e75b)
 + pkt-line: add size parameter to packet_length()

 Code simplification.

 Will merge to 'master'.
 source: <4d2bb49b-9c3c-ea58-274b-d9e9586620c1@web.de>


* vd/adjust-mfow-doc-to-updated-headers (2023-07-04) 1 commit
  (merged to 'next' on 2023-07-08 at 38103c697d)
 + docs: add necessary headers to Documentation/MFOW.txt

 Code snippets in a tutorial document no longer compiled after
 recent header shuffling, which have been corrected.

 Will merge to 'master'.
 source: <20230702151457.3227-1-vinayakdev.sci@gmail.com>


* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


* pw/diff-no-index-from-named-pipes (2023-07-05) 4 commits
  (merged to 'next' on 2023-07-08 at 225230a441)
 + diff --no-index: support reading from named pipes
 + t4054: test diff --no-index with stdin
 + diff --no-index: die on error reading stdin
 + diff --no-index: refuse to compare stdin to a directory

 "git diff --no-index" learned to read from named pipes as if they
 were regular files, to allow "git diff <(process) <(substitution)"
 some shells support.

 Will merge to 'master'.
 source: <cover.1688586536.git.phillip.wood@dunelm.org.uk>


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

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Comments?
 cf. <xmqqh6qi1byn.fsf@gitster.g>
 source: <20230705060812.2865188-1-christian.couder@gmail.com>


* js/doc-unit-tests (2023-06-30) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Still filling in blanks.
 source: <0169ce6fb9ccafc089b74ae406db0d1a8ff8ac65.1688165272.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* ks/ref-filter-signature (2023-06-06) 2 commits
  (merged to 'next' on 2023-07-06 at 1748d2bb93)
 + ref-filter: add new "signature" atom
 + t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Will merge to 'master'.
 cf. <CAP8UFD1CfUm+9PTXO0wBBdBs0U=YVte+EiPbDyUyg7T152aw2g@mail.gmail.com>
 source: <20230604185815.15761-1-five231003@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-07-10) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: implement `hidden_refs_to_excludes()`
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.

 Under discussion.
 source: <cover.1689023520.git.me@ttaylorr.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jul 2023, #01; Wed, 5)
@ 2023-07-06  1:05  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-07-06  1:05 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

I expect the rest of the week would also be slower than usual.
There are quite a few good topics cooking, though.

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* bc/more-git-var (2023-06-27) 8 commits
  (merged to 'next' on 2023-06-27 at ea14687e91)
 + var: add config file locations
 + var: add attributes files locations
 + attr: expose and rename accessor functions
 + var: adjust memory allocation for strings
 + var: format variable structure with C99 initializers
 + var: add support for listing the shell
 + t: add a function to check executable bit
 + var: mark unused parameters in git_var callbacks

 Add more "git var" for toolsmiths to learn various locations Git is
 configured with either via the configuration or hardcoded defaults.
 source: <20230627161902.754472-1-sandals@crustytoothpaste.net>


* ps/revision-stdin-with-options (2023-06-15) 3 commits
  (merged to 'next' on 2023-06-26 at eda3e4d0b5)
 + revision: handle pseudo-opts in `--stdin` mode
 + revision: small readability improvement for reading from stdin
 + revision: reorder `read_revisions_from_stdin()`

 The set-up code for the get_revision() API now allows feeding
 options like --all and --not in the --stdin mode.
 source: <cover.1686839572.git.ps@pks.im>

--------------------------------------------------
[New Topics]

* cw/compat-util-header-cleanup (2023-07-05) 6 commits
 - git-compat-util: move alloc macros to git-compat-util.h
 - treewide: remove unnecessary includes for wrapper.h
 - kwset: move translation table from ctype
 - sane-ctype.h: create header for sane-ctype macros
 - git-compat-util: move wrapper.c funcs to its header
 - git-compat-util: move strbuf.c funcs to its header

 Further shuffling of declarations across header files to streamline
 file dependencies.

 Will merge to 'next'?
 source: <20230705170812.3833103-1-calvinwan@google.com>


* jk/imap-send-unused-variable-cleanup (2023-07-05) 3 commits
 - imap-send: drop unused fields from imap_cmd_cb
 - imap-send: drop unused parameter from imap_cmd_cb callback
 - imap-send: use server conf argument in setup_curl()

 "imap-send" codepaths got cleaned up to get rid of unused
 parameters.

 Will merge to 'next'.
 source: <20230703063247.GA3524302@coredump.intra.peff.net>


* ma/t0091-fixup (2023-07-05) 1 commit
 - t0091-bugreport.sh: actually verify some content of report

 "git bugreport" tests did not test what it wanted to test, which
 has been corrected.

 Will merge to 'next'.
 source: <20230705183532.3057433-1-martin.agren@gmail.com>


* rs/packet-length-simplify (2023-07-04) 1 commit
 - pkt-line: don't check string length in packet_length()

 Code simplification.

 Will merge to 'next'?
 source: <89d58db7-6a01-b3fa-54f0-19d5a3819eb3@web.de>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* jk/cherry-pick-revert-status (2023-06-27) 1 commit
  (merged to 'next' on 2023-06-28 at 4a0d88ef7a)
 + fix cherry-pick/revert status when doing multiple commits

 During a cherry-pick or revert session that works on multiple
 commits, "git status" did not give correct information, which has
 been corrected.

 Will merge to 'master'.
 source: <20230627224230.1951135-1-jacob.e.keller@intel.com>


* ks/t4205-test-describe-with-abbrev-fix (2023-06-29) 1 commit
  (merged to 'next' on 2023-06-29 at 5fc309dc75)
 + t4205: correctly test %(describe:abbrev=...)

 Test update.

 Will merge to 'master'.
 source: <20230629133841.18784-2-five231003@gmail.com>


* jk/fsck-indices-in-worktrees (2023-06-29) 1 commit
  (merged to 'next' on 2023-06-29 at 9d245b3681)
 + fsck: avoid misleading variable name

 Code clarification.

 Will merge to 'master'.
 source: <20230629181333.87465-1-ericsunshine@charter.net>


* js/empty-index-fixes (2023-06-29) 3 commits
  (merged to 'next' on 2023-06-29 at cdfd131900)
 + commit -a -m: allow the top-level tree to become empty again
 + split-index: accept that a base index can be empty
 + do_read_index(): always mark index as initialized unless erroring out

 A few places failed to differenciate the case where the index is
 truly empty (nothing added) and we haven't yet read from the
 on-disk index file, which have been corrected.

 Will merge to 'master'.
 source: <pull.1554.git.1688044991.gitgitgadget@gmail.com>


* vd/adjust-mfow-doc-to-updated-headers (2023-07-04) 1 commit
 - docs: add necessary headers to Documentation/MFOW.txt

 Code snippets in a tutorial document no longer compiled after
 recent header shuffling, which have been corrected.

 Will merge to 'next'?
 source: <20230702151457.3227-1-vinayakdev.sci@gmail.com>


* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


* gc/config-context (2023-06-28) 11 commits
  (merged to 'next' on 2023-06-28 at 38632f3daf)
 + config: pass source to config_parser_event_fn_t
 + config: add kvi.path, use it to evaluate includes
 + config.c: remove config_reader from configsets
 + config: pass kvi to die_bad_number()
 + trace2: plumb config kvi
 + config.c: pass ctx with CLI config
 + config: pass ctx with config files
 + config.c: pass ctx in configsets
 + config: add ctx arg to config_fn_t
 + urlmatch.h: use config_fn_t type
 + config: inline git_color_default_config

 Reduce reliance on a global state in the config reading API.

 Will merge to 'master'.
 source: <pull.1497.v5.git.git.1687980390.gitgitgadget@gmail.com>


* gc/config-partial-submodule-kvi-fix (2023-06-26) 1 commit
  (merged to 'next' on 2023-06-28 at 1fb30a34e3)
 + config: don't BUG when both kvi and source are set

 Partially revert a sanity check that the rest of the config code
 was not ready, to avoid triggering it in a corner case.

 Will merge to 'master'.
 source: <pull.1535.git.git.1687801297404.gitgitgadget@gmail.com>


* pw/apply-too-large (2023-06-26) 1 commit
  (merged to 'next' on 2023-06-28 at c0460d682c)
 + apply: improve error messages when reading patch

 "git apply" punts when it is fed too large a patch input; the error
 message it gives when it happens has been clarified.

 Will merge to 'master'.
 source: <pull.1552.git.1687772253869.gitgitgadget@gmail.com>


* pw/diff-no-index-from-named-pipes (2023-07-05) 4 commits
 - diff --no-index: support reading from named pipes
 - t4054: test diff --no-index with stdin
 - diff --no-index: die on error reading stdin
 - diff --no-index: refuse to compare stdin to a directory

 "git diff --no-index" learned to read from named pipes as if they
 were regular files, to allow "git diff <(process) <(substitution)"
 some shells support.

 Will merge to 'next'.
 source: <cover.1688586536.git.phillip.wood@dunelm.org.uk>


* jc/doc-hash-object-types (2023-06-28) 1 commit
  (merged to 'next' on 2023-06-28 at adff1700c2)
 + docs: add git hash-object -t option's possible values

 Doc update.

 Will merge to 'master'.
 source: <pull.1533.v3.git.git.1688004473941.gitgitgadget@gmail.com>


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

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Comments?
 cf. <xmqqh6qi1byn.fsf@gitster.g>
 source: <20230705060812.2865188-1-christian.couder@gmail.com>


* rs/strbuf-expand-step (2023-06-18) 5 commits
  (merged to 'next' on 2023-06-28 at 1918915b71)
 + strbuf: simplify strbuf_expand_literal_cb()
 + replace strbuf_expand() with strbuf_expand_step()
 + replace strbuf_expand_dict_cb() with strbuf_expand_step()
 + strbuf: factor out strbuf_expand_step()
 + pretty: factor out expand_separator()

 Code clean-up around strbuf_expand() API.

 Will merge to 'master'.
 source: <767baa64-20a6-daf2-d34b-d81f72363749@web.de>


* js/doc-unit-tests (2023-06-30) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Still filling in blanks.
 source: <0169ce6fb9ccafc089b74ae406db0d1a8ff8ac65.1688165272.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-26) 24 commits
  (merged to 'next' on 2023-06-28 at ccff93557d)
 + diff.c: mention completion above add_diff_options
 + completion: complete --remerge-diff
 + completion: complete --diff-merges, its options and --no-diff-merges
 + completion: move --pickaxe-{all,regex} to __git_diff_common_options
 + completion: complete --ws-error-highlight
 + completion: complete --unified
 + completion: complete --output-indicator-{context,new,old}
 + completion: complete --output
 + completion: complete --no-stat
 + completion: complete --no-relative
 + completion: complete --line-prefix
 + completion: complete --ita-invisible-in-index and --ita-visible-in-index
 + completion: complete --irreversible-delete
 + completion: complete --ignore-matching-lines
 + completion: complete --function-context
 + completion: complete --find-renames
 + completion: complete --find-object
 + completion: complete --find-copies
 + completion: complete --default-prefix
 + completion: complete --compact-summary
 + completion: complete --combined-all-paths
 + completion: complete --cc
 + completion: complete --break-rewrites
 + completion: add comments describing __git_diff_* globals

 Completion updates.

 Will merge to 'master'.
 source: <pull.1543.v3.git.1687796688.gitgitgadget@gmail.com>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Will merge to 'next'.
 cf. <CAP8UFD1CfUm+9PTXO0wBBdBs0U=YVte+EiPbDyUyg7T152aw2g@mail.gmail.com>
 source: <20230604185815.15761-1-five231003@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-06-20) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.

 Under discussion.
 source: <cover.1687270849.git.me@ttaylorr.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
  (merged to 'next' on 2023-06-28 at c158b004a8)
 + strbuf: remove global variable
 + path: move related function to path
 + object-name: move related functions to object-name
 + credential-store: move related functions to credential-store file
 + abspath: move related functions to abspath
 + strbuf: clarify dependency
 + strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]

 Will merge to 'master'.
 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-06-21) 7 commits
  (merged to 'next' on 2023-06-28 at 74fa459f4d)
 + notes: introduce "--no-separator" option
 + notes.c: introduce "--[no-]stripspace" option
 + notes.c: append separator instead of insert by pos
 + notes.c: introduce '--separator=<paragraph-break>' option
 + t3321: add test cases about the notes stripspace behavior
 + notes.c: use designated initializers for clarity
 + notes.c: cleanup 'strbuf_grow' call in 'append_edit'

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.

 Will merge to 'master'.
 source: <cover.1685174011.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jun 2023, #08; Fri, 30)
@ 2023-06-30 20:27  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-30 20:27 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

The northern hemisphere being in Summer vacation season, the list
traffic in the coming week is expected to be lighter.  Have fun and
be safe, everybody.

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* ds/remove-idx-before-pack (2023-06-20) 1 commit
  (merged to 'next' on 2023-06-23 at fa97bf0e41)
 + packfile: delete .idx files before .pack files

 We create .pack and then .idx, we consider only packfiles that have
 .idx usable (those with only .pack are not ready yet), so we should
 remove .idx before removing .pack for consistency.
 source: <pull.1547.git.1687287675248.gitgitgadget@gmail.com>


* en/header-split-cache-h-part-3 (2023-06-21) 28 commits
  (merged to 'next' on 2023-06-23 at 84ad22bf36)
 + fsmonitor-ll.h: split this header out of fsmonitor.h
 + hash-ll, hashmap: move oidhash() to hash-ll
 + object-store-ll.h: split this header out of object-store.h
 + khash: name the structs that khash declares
 + merge-ll: rename from ll-merge
 + git-compat-util.h: remove unneccessary include of wildmatch.h
 + builtin.h: remove unneccessary includes
 + list-objects-filter-options.h: remove unneccessary include
 + diff.h: remove unnecessary include of oidset.h
 + repository: remove unnecessary include of path.h
 + log-tree: replace include of revision.h with simple forward declaration
 + cache.h: remove this no-longer-used header
 + read-cache*.h: move declarations for read-cache.c functions from cache.h
 + repository.h: move declaration of the_index from cache.h
 + merge.h: move declarations for merge.c from cache.h
 + diff.h: move declaration for global in diff.c from cache.h
 + preload-index.h: move declarations for preload-index.c from elsewhere
 + sparse-index.h: move declarations for sparse-index.c from cache.h
 + name-hash.h: move declarations for name-hash.c from cache.h
 + run-command.h: move declarations for run-command.c from cache.h
 + statinfo: move stat_{data,validity} functions from cache/read-cache
 + read-cache: move shared add/checkout/commit code
 + add: modify add_files_to_cache() to avoid globals
 + read-cache: move shared commit and ls-files code
 + setup: adopt shared init-db & clone code
 + init-db, clone: change unnecessary global into passed parameter
 + init-db: remove unnecessary global variable
 + init-db: document existing bug with core.bare in template config

 Header files cleanup.
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* jc/abort-ll-merge-with-a-signal (2023-06-23) 2 commits
  (merged to 'next' on 2023-06-24 at 685eb5d25c)
 + t6406: skip "external merge driver getting killed by a signal" test on Windows
  (merged to 'next' on 2023-06-23 at 9c9c37e95e)
 + ll-merge: killing the external merge driver aborts the merge

 When the external merge driver is killed by a signal, its output
 should not be trusted as a resolution with conflicts that is
 proposed by the driver, but the code did.
 source: <xmqq4jmzc91e.fsf_-_@gitster.g>


* tb/gc-recent-object-hook (2023-06-24) 1 commit
  (merged to 'next' on 2023-06-24 at e8c295841b)
 + t7701: make annotated tag unreachable

 Test update.
 source: <259b1b559114ab1a9a0bd7f1ad29a4cba2612ae0.1687617197.git.me@ttaylorr.com>

--------------------------------------------------
[New Topics]

* jk/cherry-pick-revert-status (2023-06-27) 1 commit
  (merged to 'next' on 2023-06-28 at 4a0d88ef7a)
 + fix cherry-pick/revert status when doing multiple commits

 During a cherry-pick or revert session that works on multiple
 commits, "git status" did not give correct information, which has
 been corrected.

 Will merge to 'master'.
 source: <20230627224230.1951135-1-jacob.e.keller@intel.com>


* ks/t4205-test-describe-with-abbrev-fix (2023-06-29) 1 commit
  (merged to 'next' on 2023-06-29 at 5fc309dc75)
 + t4205: correctly test %(describe:abbrev=...)

 Test update.

 Will merge to 'master'.
 source: <20230629133841.18784-2-five231003@gmail.com>


* jk/fsck-indices-in-worktrees (2023-06-29) 1 commit
  (merged to 'next' on 2023-06-29 at 9d245b3681)
 + fsck: avoid misleading variable name

 Code clarification.

 Will merge to 'master'.
 source: <20230629181333.87465-1-ericsunshine@charter.net>


* js/empty-index-fixes (2023-06-29) 3 commits
  (merged to 'next' on 2023-06-29 at cdfd131900)
 + commit -a -m: allow the top-level tree to become empty again
 + split-index: accept that a base index can be empty
 + do_read_index(): always mark index as initialized unless erroring out

 A few places failed to differenciate the case where the index is
 truly empty (nothing added) and we haven't yet read from the
 on-disk index file, which have been corrected.

 Will merge to 'master'.
 source: <pull.1554.git.1688044991.gitgitgadget@gmail.com>


* vd/adjust-mfow-doc-to-updated-headers (2023-06-29) 1 commit
 - docs: include "trace.h" in MyFirstObjectWalk.txt

 Code snippets in a tutorial document no longer compiled after
 recent header shuffling, which have been corrected.

 Will merge to 'next'?
 source: <20230629185238.58961-1-vinayakdev.sci@gmail.com>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


* gc/config-context (2023-06-28) 11 commits
  (merged to 'next' on 2023-06-28 at 38632f3daf)
 + config: pass source to config_parser_event_fn_t
 + config: add kvi.path, use it to evaluate includes
 + config.c: remove config_reader from configsets
 + config: pass kvi to die_bad_number()
 + trace2: plumb config kvi
 + config.c: pass ctx with CLI config
 + config: pass ctx with config files
 + config.c: pass ctx in configsets
 + config: add ctx arg to config_fn_t
 + urlmatch.h: use config_fn_t type
 + config: inline git_color_default_config

 Reduce reliance on a global state in the config reading API.

 Will merge to 'master'.
 source: <pull.1497.v5.git.git.1687980390.gitgitgadget@gmail.com>


* gc/config-partial-submodule-kvi-fix (2023-06-26) 1 commit
  (merged to 'next' on 2023-06-28 at 1fb30a34e3)
 + config: don't BUG when both kvi and source are set

 Partially revert a sanity check that the rest of the config code
 was not ready, to avoid triggering it in a corner case.

 Will merge to 'master'.
 source: <pull.1535.git.git.1687801297404.gitgitgadget@gmail.com>


* pw/apply-too-large (2023-06-26) 1 commit
  (merged to 'next' on 2023-06-28 at c0460d682c)
 + apply: improve error messages when reading patch

 "git apply" punts when it is fed too large a patch input; the error
 message it gives when it happens has been clarified.

 Will merge to 'master'.
 source: <pull.1552.git.1687772253869.gitgitgadget@gmail.com>


* pw/diff-no-index-from-named-pipes (2023-06-27) 3 commits
 - diff --no-index: support reading from named pipes
 - t4054: test diff --no-index with stdin
 - diff --no-index: die on error reading stdin

 "git diff --no-index" learned to read from named pipes as if they
 were regular files, to allow "git diff <(process) <(substitution)"
 some shells support.

 Expecting a reroll.
 cf. <457ff920-865e-f018-1d79-f3cb1121d199@gmail.com>
 source: <cover.1687874975.git.phillip.wood@dunelm.org.uk>


* bc/more-git-var (2023-06-27) 8 commits
  (merged to 'next' on 2023-06-27 at ea14687e91)
 + var: add config file locations
 + var: add attributes files locations
 + attr: expose and rename accessor functions
 + var: adjust memory allocation for strings
 + var: format variable structure with C99 initializers
 + var: add support for listing the shell
 + t: add a function to check executable bit
 + var: mark unused parameters in git_var callbacks

 Add more "git var" for toolsmiths to learn various locations Git is
 configured with either via the configuration or hardcoded defaults.

 Will merge to 'master'.
 source: <20230627161902.754472-1-sandals@crustytoothpaste.net>


* jc/doc-hash-object-types (2023-06-28) 1 commit
  (merged to 'next' on 2023-06-28 at adff1700c2)
 + docs: add git hash-object -t option's possible values

 Doc update.

 Will merge to 'master'.
 source: <pull.1533.v3.git.git.1688004473941.gitgitgadget@gmail.com>


* cc/repack-sift-filtered-objects-to-separate-pack (2023-06-14) 9 commits
 - gc: add `gc.repackFilterTo` config option
 - repack: implement `--filter-to` for storing filtered out objects
 - gc: add `gc.repackFilter` config option
 - repack: add `--filter=<filter-spec>` option
 - repack: refactor finishing pack-objects command
 - repack: refactor piping an oid to a command
 - t/helper: add 'find-pack' test-tool
 - pack-objects: add `--print-filtered` to print omitted objects
 - pack-objects: allow `--filter` without `--stdout`

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Needs review.
 source: <20230614192541.1599256-1-christian.couder@gmail.com>


* ps/revision-stdin-with-options (2023-06-15) 3 commits
  (merged to 'next' on 2023-06-26 at eda3e4d0b5)
 + revision: handle pseudo-opts in `--stdin` mode
 + revision: small readability improvement for reading from stdin
 + revision: reorder `read_revisions_from_stdin()`

 The set-up code for the get_revision() API now allows feeding
 options like --all and --not in the --stdin mode.

 Will merge to 'master'.
 source: <cover.1686839572.git.ps@pks.im>


* rs/strbuf-expand-step (2023-06-18) 5 commits
  (merged to 'next' on 2023-06-28 at 1918915b71)
 + strbuf: simplify strbuf_expand_literal_cb()
 + replace strbuf_expand() with strbuf_expand_step()
 + replace strbuf_expand_dict_cb() with strbuf_expand_step()
 + strbuf: factor out strbuf_expand_step()
 + pretty: factor out expand_separator()

 Code clean-up around strbuf_expand() API.

 Will merge to 'master'.
 source: <767baa64-20a6-daf2-d34b-d81f72363749@web.de>


* js/doc-unit-tests (2023-06-13) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Comments?  Filling in blanks?
 source: <8afdb215d7e10ca16a2ce8226b4127b3d8a2d971.1686352386.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-26) 24 commits
  (merged to 'next' on 2023-06-28 at ccff93557d)
 + diff.c: mention completion above add_diff_options
 + completion: complete --remerge-diff
 + completion: complete --diff-merges, its options and --no-diff-merges
 + completion: move --pickaxe-{all,regex} to __git_diff_common_options
 + completion: complete --ws-error-highlight
 + completion: complete --unified
 + completion: complete --output-indicator-{context,new,old}
 + completion: complete --output
 + completion: complete --no-stat
 + completion: complete --no-relative
 + completion: complete --line-prefix
 + completion: complete --ita-invisible-in-index and --ita-visible-in-index
 + completion: complete --irreversible-delete
 + completion: complete --ignore-matching-lines
 + completion: complete --function-context
 + completion: complete --find-renames
 + completion: complete --find-object
 + completion: complete --find-copies
 + completion: complete --default-prefix
 + completion: complete --compact-summary
 + completion: complete --combined-all-paths
 + completion: complete --cc
 + completion: complete --break-rewrites
 + completion: add comments describing __git_diff_* globals

 Completion updates.

 Will merge to 'master'.
 source: <pull.1543.v3.git.1687796688.gitgitgadget@gmail.com>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Needs review.
 source: <20230604185815.15761-1-five231003@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-06-20) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.
 source: <cover.1687270849.git.me@ttaylorr.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
  (merged to 'next' on 2023-06-28 at c158b004a8)
 + strbuf: remove global variable
 + path: move related function to path
 + object-name: move related functions to object-name
 + credential-store: move related functions to credential-store file
 + abspath: move related functions to abspath
 + strbuf: clarify dependency
 + strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]

 Will merge to 'master'.
 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-06-21) 7 commits
  (merged to 'next' on 2023-06-28 at 74fa459f4d)
 + notes: introduce "--no-separator" option
 + notes.c: introduce "--[no-]stripspace" option
 + notes.c: append separator instead of insert by pos
 + notes.c: introduce '--separator=<paragraph-break>' option
 + t3321: add test cases about the notes stripspace behavior
 + notes.c: use designated initializers for clarity
 + notes.c: cleanup 'strbuf_grow' call in 'append_edit'

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.

 Will merge to 'master'.
 source: <cover.1685174011.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jun 2023, #07; Tue, 27)
@ 2023-06-27 22:11  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-27 22:11 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* jk/commit-use-no-divider-with-interpret-trailers (2023-06-16) 1 commit
  (merged to 'next' on 2023-06-20 at 08e5f2a6b5)
 + commit: pass --no-divider to interpret-trailers

 When "git commit --trailer=..." invokes the interpret-trailers
 machinery, it knows what it feeds to interpret-trailers is a full
 log message without any patch, but failed to express that by
 passing the "--no-divider" option, which has been corrected.
 source: <20230617042624.GA562686@coredump.intra.peff.net>


* jk/redact-h2h3-headers-fix (2023-06-17) 1 commit
  (merged to 'next' on 2023-06-20 at c1247fd527)
 + http: handle both "h2" and "h2h3" in curl info lines

 Curl library recently changed how http2 traces are shown and broke
 the code to redact sensitive info header, which has been fixed.

 The GitHub Actions CI has been broken for recent macOS jobs, so
 this topic has been fast-tracked to help them.
 source: <20230617051559.GD562686@coredump.intra.peff.net>


* tb/collect-pack-filenames-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-20 at abcc6892c8)
 + builtin/repack.c: only collect fully-formed packs

 Avoid breakage of "git pack-objects --cruft" due to inconsistency
 between the way the code enumerates packfiles in the repository.
 source: <20230607101617.ges6tnMry4E52lDGld43QgtNUsIS4YQq6w-t71hEfkQ@z>

--------------------------------------------------
[New Topics]

* mh/credential-erase-improvements-more (2023-06-24) 2 commits
 - credential/wincred: erase matching creds only
 - credential/libsecret: erase matching creds only

 Needs review.
 source: <pull.1529.git.git.1687596777147.gitgitgadget@gmail.com>


* tb/gc-recent-object-hook (2023-06-24) 1 commit
  (merged to 'next' on 2023-06-24 at e8c295841b)
 + t7701: make annotated tag unreachable

 Test update.

 Will merge to 'master'.
 source: <259b1b559114ab1a9a0bd7f1ad29a4cba2612ae0.1687617197.git.me@ttaylorr.com>


* gc/config-context (2023-06-26) 12 commits
 - config: pass source to config_parser_event_fn_t
 - config: add kvi.path, use it to evaluate includes
 - config.c: remove config_reader from configsets
 - config: pass kvi to die_bad_number()
 - trace2: plumb config kvi
 - config.c: pass ctx with CLI config
 - builtin/config.c: test misuse of format_config()
 - config: pass ctx with config files
 - config.c: pass ctx in configsets
 - config: add ctx arg to config_fn_t
 - urlmatch.h: use config_fn_t type
 - config: inline git_color_default_config

 source: <pull.1497.v4.git.git.1687803083.gitgitgadget@gmail.com>


* gc/config-partial-submodule-kvi-fix (2023-06-26) 1 commit
 - config: don't BUG when both kvi and source are set

 source: <pull.1535.git.git.1687801297404.gitgitgadget@gmail.com>


* pw/apply-too-large (2023-06-26) 1 commit
 - apply: improve error messages when reading patch

 source: <pull.1552.git.1687772253869.gitgitgadget@gmail.com>


* pw/diff-no-index-from-named-pipes (2023-06-27) 3 commits
 . diff --no-index: support reading from named pipes
 . t4054: test diff --no-index with stdin
 . diff --no-index: die on error reading stdin

 source: <cover.1687874975.git.phillip.wood@dunelm.org.uk>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* ds/remove-idx-before-pack (2023-06-20) 1 commit
  (merged to 'next' on 2023-06-23 at fa97bf0e41)
 + packfile: delete .idx files before .pack files

 We create .pack and then .idx, we consider only packfiles that have
 .idx usable (those with only .pack are not ready yet), so we should
 remove .idx before removing .pack for consistency.

 Will merge to 'master'.
 source: <pull.1547.git.1687287675248.gitgitgadget@gmail.com>


* bc/more-git-var (2023-06-27) 8 commits
  (merged to 'next' on 2023-06-27 at ea14687e91)
 + var: add config file locations
 + var: add attributes files locations
 + attr: expose and rename accessor functions
 + var: adjust memory allocation for strings
 + var: format variable structure with C99 initializers
 + var: add support for listing the shell
 + t: add a function to check executable bit
 + var: mark unused parameters in git_var callbacks
<<
* bc/more-git-var (2023-06-27) 8 commits
 . var: add config file locations
 . var: add attributes files locations
 . attr: expose and rename accessor functions
 . var: adjust memory allocation for strings
 . var: format variable structure with C99 initializers
 . var: add support for listing the shell
 . t: add a function to check executable bit
 . var: mark unused parameters in git_var callbacks
>>

 Add more "git var" for toolsmiths to learn various locations Git is
 configured with either via the configuration or hardcoded defaults.

 Will merge to 'master'.
 source: <20230627161902.754472-1-sandals@crustytoothpaste.net>


* jc/doc-hash-object-types (2023-06-23) 1 commit
 - docs: add git hash-object -t option's possible values

 Doc update.

 Will merge to 'next'.
 source: <pull.1533.v2.git.git.1687555504551.gitgitgadget@gmail.com>


* jc/abort-ll-merge-with-a-signal (2023-06-23) 2 commits
  (merged to 'next' on 2023-06-24 at 685eb5d25c)
 + t6406: skip "external merge driver getting killed by a signal" test on Windows
  (merged to 'next' on 2023-06-23 at 9c9c37e95e)
 + ll-merge: killing the external merge driver aborts the merge

 When the external merge driver is killed by a signal, its output
 should not be trusted as a resolution with conflicts that is
 proposed by the driver, but the code did.

 Will merge to 'master'.
 source: <xmqq4jmzc91e.fsf_-_@gitster.g>


* cc/repack-sift-filtered-objects-to-separate-pack (2023-06-14) 9 commits
 - gc: add `gc.repackFilterTo` config option
 - repack: implement `--filter-to` for storing filtered out objects
 - gc: add `gc.repackFilter` config option
 - repack: add `--filter=<filter-spec>` option
 - repack: refactor finishing pack-objects command
 - repack: refactor piping an oid to a command
 - t/helper: add 'find-pack' test-tool
 - pack-objects: add `--print-filtered` to print omitted objects
 - pack-objects: allow `--filter` without `--stdout`

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Needs review.
 source: <20230614192541.1599256-1-christian.couder@gmail.com>


* ps/revision-stdin-with-options (2023-06-15) 3 commits
  (merged to 'next' on 2023-06-26 at eda3e4d0b5)
 + revision: handle pseudo-opts in `--stdin` mode
 + revision: small readability improvement for reading from stdin
 + revision: reorder `read_revisions_from_stdin()`

 The set-up code for the get_revision() API now allows feeding
 options like --all and --not in the --stdin mode.

 Will merge to 'master'.
 source: <cover.1686839572.git.ps@pks.im>


* rs/strbuf-expand-step (2023-06-18) 5 commits
 - strbuf: simplify strbuf_expand_literal_cb()
 - replace strbuf_expand() with strbuf_expand_step()
 - replace strbuf_expand_dict_cb() with strbuf_expand_step()
 - strbuf: factor out strbuf_expand_step()
 - pretty: factor out expand_separator()

 Code clean-up around strbuf_expand() API.

 Will merge to 'next'.
 source: <767baa64-20a6-daf2-d34b-d81f72363749@web.de>


* js/doc-unit-tests (2023-06-13) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Comments?  Filling in blanks?
 source: <8afdb215d7e10ca16a2ce8226b4127b3d8a2d971.1686352386.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-26) 24 commits
 - diff.c: mention completion above add_diff_options
 - completion: complete --remerge-diff
 - completion: complete --diff-merges, its options and --no-diff-merges
 - completion: move --pickaxe-{all,regex} to __git_diff_common_options
 - completion: complete --ws-error-highlight
 - completion: complete --unified
 - completion: complete --output-indicator-{context,new,old}
 - completion: complete --output
 - completion: complete --no-stat
 - completion: complete --no-relative
 - completion: complete --line-prefix
 - completion: complete --ita-invisible-in-index and --ita-visible-in-index
 - completion: complete --irreversible-delete
 - completion: complete --ignore-matching-lines
 - completion: complete --function-context
 - completion: complete --find-renames
 - completion: complete --find-object
 - completion: complete --find-copies
 - completion: complete --default-prefix
 - completion: complete --compact-summary
 - completion: complete --combined-all-paths
 - completion: complete --cc
 - completion: complete --break-rewrites
 - completion: add comments describing __git_diff_* globals

 Completion updates.

 Will merge to 'next'.
 source: <pull.1543.v3.git.1687796688.gitgitgadget@gmail.com>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Needs review.
 source: <20230604185815.15761-1-five231003@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-06-20) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.
 source: <cover.1687270849.git.me@ttaylorr.com>


* en/header-split-cache-h-part-3 (2023-06-21) 28 commits
  (merged to 'next' on 2023-06-23 at 84ad22bf36)
 + fsmonitor-ll.h: split this header out of fsmonitor.h
 + hash-ll, hashmap: move oidhash() to hash-ll
 + object-store-ll.h: split this header out of object-store.h
 + khash: name the structs that khash declares
 + merge-ll: rename from ll-merge
 + git-compat-util.h: remove unneccessary include of wildmatch.h
 + builtin.h: remove unneccessary includes
 + list-objects-filter-options.h: remove unneccessary include
 + diff.h: remove unnecessary include of oidset.h
 + repository: remove unnecessary include of path.h
 + log-tree: replace include of revision.h with simple forward declaration
 + cache.h: remove this no-longer-used header
 + read-cache*.h: move declarations for read-cache.c functions from cache.h
 + repository.h: move declaration of the_index from cache.h
 + merge.h: move declarations for merge.c from cache.h
 + diff.h: move declaration for global in diff.c from cache.h
 + preload-index.h: move declarations for preload-index.c from elsewhere
 + sparse-index.h: move declarations for sparse-index.c from cache.h
 + name-hash.h: move declarations for name-hash.c from cache.h
 + run-command.h: move declarations for run-command.c from cache.h
 + statinfo: move stat_{data,validity} functions from cache/read-cache
 + read-cache: move shared add/checkout/commit code
 + add: modify add_files_to_cache() to avoid globals
 + read-cache: move shared commit and ls-files code
 + setup: adopt shared init-db & clone code
 + init-db, clone: change unnecessary global into passed parameter
 + init-db: remove unnecessary global variable
 + init-db: document existing bug with core.bare in template config

 Header files cleanup.

 Will merge to 'master'.
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
 - strbuf: remove global variable
 - path: move related function to path
 - object-name: move related functions to object-name
 - credential-store: move related functions to credential-store file
 - abspath: move related functions to abspath
 - strbuf: clarify dependency
 - strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]

 Will merge to 'next'.
 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-06-21) 7 commits
 - notes: introduce "--no-separator" option
 - notes.c: introduce "--[no-]stripspace" option
 - notes.c: append separator instead of insert by pos
 - notes.c: introduce '--separator=<paragraph-break>' option
 - t3321: add test cases about the notes stripspace behavior
 - notes.c: use designated initializers for clarity
 - notes.c: cleanup 'strbuf_grow' call in 'append_edit'

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.
 source: <cover.1685174011.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

--------------------------------------------------
[Discarded]

* mh/credential-password-expiry-libsecret (2023-05-05) 1 commit
 . credential/libsecret: support password_expiry_utc

 Originally merged to 'next' on 2023-05-09

 The libsecret credential helper learns to handle the password
 expiry time information.

 Superseded by mh/credential-libsecret-attrs.
 cf. <CAGJzqskMwOJkriH6serqdwAVYi+fftEL8ohJd-suP6v+OxB_bg@mail.gmail.com>
 source: <pull.1469.v3.git.git.1683270298313.gitgitgadget@gmail.com>


* tb/pack-bitmap-index-seek (2023-03-20) 6 commits
 . pack-bitmap.c: factor out `bitmap_index_seek_commit()`
 . pack-bitmap.c: use `bitmap_index_seek()` where possible
 . pack-bitmap.c: factor out manual `map_pos` manipulation
 . pack-bitmap.c: drop unnecessary 'inline's
 . pack-bitmap.c: hide bitmap internals in `read_be32()`
 . pack-bitmap.c: hide bitmap internals in `read_u8()`

 Clean-up the pack-bitmap codepath.

 Retracted for now.
 cf. <ZJCI6FHtbuOKPlV1@nand.local>
 source: <cover.1679342296.git.me@ttaylorr.com>


* js/cmake-wo-cache-h (2023-06-15) 1 commit
 . cmake: adapt to `cache.h` being no more

 Build fix in en/header-split-cache-h-part-3 topic.

 Ejected out of 'next' and made into a part of en/header-split-cache-h-part-3
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* jc/notes-separator-fix (2023-06-13) 7 commits
 . notes: do not access before the beginning of an array

 Fix to tl/notes-separator topic.

 Discarded as the updated base topic should not require it anymore.
 source: <cover.1682671758.git.dyroneteng@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jun 2023, #06; Fri, 23)
@ 2023-06-23 22:54  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-23 22:54 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* as/dtype-compilation-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 267100947e)
 + statinfo.h: move DTYPE defines from dir.h

 Compilation fix for platforms without D_TYPE in struct dirent.
 source: <20230606205935.3183276-1-asedeno@google.com>


* ds/add-i-color-configuration-fix (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-15 at 377b9f9a00)
 + add: test use of brackets when color is disabled
 + add: check color.ui for interactive add

 The reimplemented "git add -i" did not honor color.ui configuration.
 source: <pull.1541.v2.git.1686061219078.gitgitgadget@gmail.com>


* ds/disable-replace-refs (2023-06-12) 3 commits
  (merged to 'next' on 2023-06-15 at e7baddb745)
 + repository: create read_replace_refs setting
 + replace-objects: create wrapper around setting
 + repository: create disable_replace_refs()
 (this branch uses tb/pack-bitmap-traversal-with-boundary.)

 Introduce a mechanism to disable replace refs globally and per
 repository.
 source: <pull.1537.v3.git.1686057877.gitgitgadget@gmail.com>


* gc/discover-not-setup (2023-06-16) 1 commit
  (merged to 'next' on 2023-06-16 at 27d1cd2a1b)
 + setup.c: don't setup in discover_git_directory()

 discover_git_directory() no longer touches the_repository.
 source: <pull.1526.git.git.1686771358484.gitgitgadget@gmail.com>


* ja/worktree-orphan (2023-05-17) 8 commits
  (merged to 'next' on 2023-06-15 at 16bb552b79)
 + worktree add: emit warn when there is a bad HEAD
 + worktree add: extend DWIM to infer --orphan
 + worktree add: introduce "try --orphan" hint
 + worktree add: add --orphan flag
 + t2400: add tests to verify --quiet
 + t2400: refactor "worktree add" opt exclusion tests
 + t2400: cleanup created worktree in test
 + worktree add: include -B in usage docs

 Originally merged to 'next' on 2023-06-14

 'git worktree add' learned how to create a worktree based on an
 orphaned branch with `--orphan`.
 source: <20230517214711.12467-1-jacobabel@nullpo.dev>


* js/defeat-ignore-submodules-config-with-explicit-addition (2023-06-14) 1 commit
  (merged to 'next' on 2023-06-16 at bfc01bd5e2)
 + diff-lib: honor override_submodule_config flag bit

 Even when diff.ignoreSubmodules tells us to ignore submodule
 changes, "git commit" with an index that already records changes to
 submodules should include the submodule changes in the resulting
 commit, but it did not.
 source: <20230614164856.3186012-2-sokcevic@google.com>


* jt/doc-use-octal-with-printf (2023-06-14) 1 commit
  (merged to 'next' on 2023-06-16 at ebb72b9bd8)
 + CodingGuidelines: use octal escapes, not hex

 Suggest to refrain from using hex literals that are non-portable
 when writing printf(1) format strings.
 source: <20230614213145.475607-1-jonathantanmy@google.com>


* la/docs-typofixes (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 56ddcb16e6)
 + docs: typofixes

 Typofixes.
 source: <pull.1542.v2.git.1686166007816.gitgitgadget@gmail.com>


* mh/credential-erase-improvements (2023-06-15) 2 commits
  (merged to 'next' on 2023-06-16 at 5a3ed25303)
 + credential: erase all matching credentials
 + credential: avoid erasing distinct password

 Will merge to 'master'.
 cf. <20230615212116.GA39325@coredump.intra.peff.net>
 source: <pull.1525.v4.git.git.1686856773.gitgitgadget@gmail.com>


* ps/cat-file-null-output (2023-06-12) 5 commits
  (merged to 'next' on 2023-06-15 at e841ad2be5)
 + cat-file: add option '-Z' that delimits input and output with NUL
 + cat-file: simplify reading from standard input
 + strbuf: provide CRLF-aware helper to read until a specified delimiter
 + t1006: modernize test style to use `test_cmp`
 + t1006: don't strip timestamps from expected results

 "git cat-file --batch" and friends learned "-Z" that uses NUL
 delimiter for both input and output.
 source: <cover.1686028409.git.ps@pks.im>


* rj/leakfixes (2023-06-17) 11 commits
  (merged to 'next' on 2023-06-17 at 49e54a88e2)
 + tests: mark as passing with SANITIZE=leak
 + config: fix a leak in git_config_copy_or_rename_section_in_file
 + branch: fix a leak in cmd_branch
 + branch: fix a leak in setup_tracking
 + rev-parse: fix a leak with --abbrev-ref
  (merged to 'next' on 2023-06-16 at d9330ea230)
 + branch: fix a leak in setup_tracking
 + branch: fix a leak in check_tracking_branch
 + branch: fix a leak in inherit_tracking
 + branch: fix a leak in dwim_and_setup_tracking
 + remote: fix a leak in query_matches_negative_refspec
 + config: fix a leak in git_config_copy_or_rename_section_in_file

 Leakfixes
 source: <71b49be1-eeef-2f60-38f1-cfcbe4c8252f@gmail.com>
 source: <9eb931e7-dd18-8ce8-4d4a-cf3d85066189@gmail.com>


* rs/doc-ls-tree-hex-literal (2023-06-15) 1 commit
  (merged to 'next' on 2023-06-16 at 472c7f55c9)
 + ls-tree: fix documentation of %x format placeholder

 Doc update.
 source: <23e54256-9ad5-e978-d0b8-abb511232fd1@web.de>


* rs/run-command-exec-error-on-noent (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-16 at 6bb4425334)
 + run-command: report exec error even on ENOENT
 + t1800: loosen matching of error message for bad shebang

 Simplify error message when run-command fails to start a command.
 source: <14e1be60-3765-0ba5-00f5-2848bb57bf53@web.de>


* sl/worktree-sparse (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at ca0a7edcc5)
 + worktree: integrate with sparse-index

 "git worktree" learned to work better with sparse index feature.
 source: <20230606172633.669916-1-cheskaqiqi@gmail.com>


* tb/gc-recent-object-hook (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-16 at 2d8d8ea2ef)
 + gc: introduce `gc.recentObjectsHook`
 + reachable.c: extract `obj_is_recent()`

 "git pack-objects" learned to invoke a new hook program that
 enumerates extra objects to be used as anchoring points to keep
 otherwise unreachable objects in cruft packs.
 source: <cover.1686178684.git.me@ttaylorr.com>


* tb/open-midx-bitmap-fallback (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 6546fee734)
 + pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack

 Gracefully deal with a stale MIDX file that lists a packfile that
 no longer exists.
 source: <f123b68cb8a277fbf105b1789a84b9405a499b79.1686178854.git.me@ttaylorr.com>


* tb/pack-bitmap-traversal-with-boundary (2023-05-08) 3 commits
 + pack-bitmap.c: use commit boundary during bitmap traversal
 + pack-bitmap.c: extract `fill_in_bitmap()`
 + object: add object_array initializer helper function
 (this branch is used by ds/disable-replace-refs.)

 Originally merged to 'next' on 2023-06-15

 The object traversal using reachability bitmap done by
 "pack-object" has been tweaked to take advantage of the fact that
 using "boundary" commits as representative of all the uninteresting
 ones can save quite a lot of object enumeration.
 source: <cover.1683567065.git.me@ttaylorr.com>


* tz/lib-gpg-prereq-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 19770e970a)
 + t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

 Test update.
 source: <20230606214707.55739-1-tmz@pobox.com>

--------------------------------------------------
[New Topics]

* ds/remove-idx-before-pack (2023-06-20) 1 commit
  (merged to 'next' on 2023-06-23 at fa97bf0e41)
 + packfile: delete .idx files before .pack files

 We create .pack and then .idx, we consider only packfiles that have
 .idx usable (those with only .pack are not ready yet), so we should
 remove .idx before removing .pack for consistency.

 Will merge to 'master'.
 source: <pull.1547.git.1687287675248.gitgitgadget@gmail.com>


* bc/more-git-var (2023-06-22) 3 commits
 - var: add config file locations
 - var: add attributes files locations
 - var: add support for listing the shell

 Add more "git var" for toolsmiths to learn various locations Git is
 configured with either via the configuration or hardcoded defaults.

 Expecting a reroll.
 source: <20230622195059.320593-1-sandals@crustytoothpaste.net>


* jc/doc-hash-object-types (2023-06-22) 1 commit
 - docs: add "git hash-object -t" option's possible values

 Doc update.

 Expecting a reroll.
 cf. <62B7F5FF-F85D-47C0-B553-F57B991D0BCC@gmail.com>
 source: <pull.1533.git.git.1687394795009.gitgitgadget@gmail.com>


* jc/abort-ll-merge-with-a-signal (2023-06-23) 1 commit
  (merged to 'next' on 2023-06-23 at 9c9c37e95e)
 + ll-merge: killing the external merge driver aborts the merge

 When the external merge driver is killed by a signal, its output
 should not be trusted as a resolution with conflicts that is
 proposed by the driver, but the code did.

 Will merge to 'master'.
 source: <xmqq4jmzc91e.fsf_-_@gitster.g>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* cc/repack-sift-filtered-objects-to-separate-pack (2023-06-14) 9 commits
 - gc: add `gc.repackFilterTo` config option
 - repack: implement `--filter-to` for storing filtered out objects
 - gc: add `gc.repackFilter` config option
 - repack: add `--filter=<filter-spec>` option
 - repack: refactor finishing pack-objects command
 - repack: refactor piping an oid to a command
 - t/helper: add 'find-pack' test-tool
 - pack-objects: add `--print-filtered` to print omitted objects
 - pack-objects: allow `--filter` without `--stdout`

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Needs review.
 source: <20230614192541.1599256-1-christian.couder@gmail.com>


* ps/revision-stdin-with-options (2023-06-15) 3 commits
 - revision: handle pseudo-opts in `--stdin` mode
 - revision: small readability improvement for reading from stdin
 - revision: reorder `read_revisions_from_stdin()`

 The set-up code for the get_revision() API now allows feeding
 options like --all and --not in the --stdin mode.

 Will merge to 'next'?
 source: <cover.1686839572.git.ps@pks.im>


* jk/commit-use-no-divider-with-interpret-trailers (2023-06-16) 1 commit
  (merged to 'next' on 2023-06-20 at 08e5f2a6b5)
 + commit: pass --no-divider to interpret-trailers

 When "git commit --trailer=..." invokes the interpret-trailers
 machinery, it knows what it feeds to interpret-trailers is a full
 log message without any patch, but failed to express that by
 passing the "--no-divider" option, which has been corrected.

 Will merge to 'master'.
 source: <20230617042624.GA562686@coredump.intra.peff.net>


* jk/redact-h2h3-headers-fix (2023-06-17) 1 commit
  (merged to 'next' on 2023-06-20 at c1247fd527)
 + http: handle both "h2" and "h2h3" in curl info lines

 Curl library recently changed how http2 traces are shown and broke
 the code to redact sensitive info header, which has been fixed.

 Will merge to 'master'.
 source: <20230617051559.GD562686@coredump.intra.peff.net>


* rs/strbuf-expand-step (2023-06-18) 5 commits
 - strbuf: simplify strbuf_expand_literal_cb()
 - replace strbuf_expand() with strbuf_expand_step()
 - replace strbuf_expand_dict_cb() with strbuf_expand_step()
 - strbuf: factor out strbuf_expand_step()
 - pretty: factor out expand_separator()

 Code clean-up around strbuf_expand() API.
 source: <767baa64-20a6-daf2-d34b-d81f72363749@web.de>


* js/doc-unit-tests (2023-06-13) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Comments?  Filling in blanks?
 source: <8afdb215d7e10ca16a2ce8226b4127b3d8a2d971.1686352386.git.steadmon@google.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-12) 25 commits
 - diff.c: mention completion above add_diff_options
 - completion: complete --remerge-diff
 - completion: complete --diff-merges, its options and --no-diff-merges
 - completion: move --pickaxe-{all,regex} to __git_diff_common_options
 - completion: complete --ws-error-highlight
 - completion: complete --unified
 - completion: complete --patch-with-raw
 - completion: complete --output-indicator-{context,new,old}
 - completion: complete --output
 - completion: complete --no-stat
 - completion: complete --no-relative
 - completion: complete --line-prefix
 - completion: complete --ita-invisible-in-index and --ita-visible-in-index
 - completion: complete --irreversible-delete
 - completion: complete --ignore-matching-lines
 - completion: complete --function-context
 - completion: complete --find-renames
 - completion: complete --find-object
 - completion: complete --find-copies
 - completion: complete --default-prefix
 - completion: complete --compact-summary
 - completion: complete --combined-all-paths
 - completion: complete --cc
 - completion: complete --break-rewrites
 - completion: add comments describing __git_diff_* globals

 Completion updates.

 Expecting a reroll.
 cf. <5cba334c-4d75-0dac-20c6-9e3def1f224a@gmail.com>
 source: <pull.1543.v2.git.1686574374.gitgitgadget@gmail.com>


* tb/collect-pack-filenames-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-20 at abcc6892c8)
 + builtin/repack.c: only collect fully-formed packs

 Avoid breakage of "git pack-objects --cruft" due to inconsistency
 between the way the code enumerates packfiles in the repository.

 Will merge to 'master'.
 source: <20230607101617.ges6tnMry4E52lDGld43QgtNUsIS4YQq6w-t71hEfkQ@z>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Needs review.
 source: <20230604185815.15761-1-five231003@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-06-20) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.
 source: <cover.1687270849.git.me@ttaylorr.com>


* en/header-split-cache-h-part-3 (2023-06-21) 28 commits
  (merged to 'next' on 2023-06-23 at 84ad22bf36)
 + fsmonitor-ll.h: split this header out of fsmonitor.h
 + hash-ll, hashmap: move oidhash() to hash-ll
 + object-store-ll.h: split this header out of object-store.h
 + khash: name the structs that khash declares
 + merge-ll: rename from ll-merge
 + git-compat-util.h: remove unneccessary include of wildmatch.h
 + builtin.h: remove unneccessary includes
 + list-objects-filter-options.h: remove unneccessary include
 + diff.h: remove unnecessary include of oidset.h
 + repository: remove unnecessary include of path.h
 + log-tree: replace include of revision.h with simple forward declaration
 + cache.h: remove this no-longer-used header
 + read-cache*.h: move declarations for read-cache.c functions from cache.h
 + repository.h: move declaration of the_index from cache.h
 + merge.h: move declarations for merge.c from cache.h
 + diff.h: move declaration for global in diff.c from cache.h
 + preload-index.h: move declarations for preload-index.c from elsewhere
 + sparse-index.h: move declarations for sparse-index.c from cache.h
 + name-hash.h: move declarations for name-hash.c from cache.h
 + run-command.h: move declarations for run-command.c from cache.h
 + statinfo: move stat_{data,validity} functions from cache/read-cache
 + read-cache: move shared add/checkout/commit code
 + add: modify add_files_to_cache() to avoid globals
 + read-cache: move shared commit and ls-files code
 + setup: adopt shared init-db & clone code
 + init-db, clone: change unnecessary global into passed parameter
 + init-db: remove unnecessary global variable
 + init-db: document existing bug with core.bare in template config

 Header files cleanup.

 Will merge to 'master'.
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
 - strbuf: remove global variable
 - path: move related function to path
 - object-name: move related functions to object-name
 - credential-store: move related functions to credential-store file
 - abspath: move related functions to abspath
 - strbuf: clarify dependency
 - strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]
 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-06-21) 7 commits
 - notes: introduce "--no-separator" option
 - notes.c: introduce "--[no-]stripspace" option
 - notes.c: append separator instead of insert by pos
 - notes.c: introduce '--separator=<paragraph-break>' option
 - t3321: add test cases about the notes stripspace behavior
 - notes.c: use designated initializers for clarity
 - notes.c: cleanup 'strbuf_grow' call in 'append_edit'

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.
 source: <cover.1685174011.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>

--------------------------------------------------
[Discarded]

* mh/credential-password-expiry-libsecret (2023-05-05) 1 commit
 . credential/libsecret: support password_expiry_utc

 Originally merged to 'next' on 2023-05-09

 The libsecret credential helper learns to handle the password
 expiry time information.

 Superseded by mh/credential-libsecret-attrs.
 cf. <CAGJzqskMwOJkriH6serqdwAVYi+fftEL8ohJd-suP6v+OxB_bg@mail.gmail.com>
 source: <pull.1469.v3.git.git.1683270298313.gitgitgadget@gmail.com>


* tb/pack-bitmap-index-seek (2023-03-20) 6 commits
 . pack-bitmap.c: factor out `bitmap_index_seek_commit()`
 . pack-bitmap.c: use `bitmap_index_seek()` where possible
 . pack-bitmap.c: factor out manual `map_pos` manipulation
 . pack-bitmap.c: drop unnecessary 'inline's
 . pack-bitmap.c: hide bitmap internals in `read_be32()`
 . pack-bitmap.c: hide bitmap internals in `read_u8()`

 Clean-up the pack-bitmap codepath.

 Retracted for now.
 cf. <ZJCI6FHtbuOKPlV1@nand.local>
 source: <cover.1679342296.git.me@ttaylorr.com>


* js/cmake-wo-cache-h (2023-06-15) 1 commit
 . cmake: adapt to `cache.h` being no more

 Build fix in en/header-split-cache-h-part-3 topic.

 Ejected out of 'next' and made into a part of en/header-split-cache-h-part-3
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* jc/notes-separator-fix (2023-06-13) 7 commits
 . notes: do not access before the beginning of an array

 Fix to tl/notes-separator topic.

 Discarded as the updated base topic should not require it anymore.
 source: <cover.1682671758.git.dyroneteng@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jun 2023, #05; Tue, 20)
@ 2023-06-21  0:04  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-21  0:04 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[Graduated to 'master']

* jc/test-modernization (2023-05-19) 20 commits
  (merged to 'next' on 2023-06-15 at 811ac3f7ad)
 + t7101-reset-empty-subdirs: modernize test format
 + t6050-replace: modernize test format
 + t5306-pack-nobase: modernize test format
 + t5303-pack-corruption-resilience: modernize test format
 + t5301-sliding-window: modernize test format
 + t5300-pack-object: modernize test format
 + t4206-log-follow-harder-copies: modernize test format
 + t4202-log: modernize test format
 + t4004-diff-rename-symlink: modernize test format
 + t4003-diff-rename-1: modernize test format
 + t4002-diff-basic: modernize test format
 + t3903-stash: modernize test format
 + t3700-add: modernize test format
 + t3500-cherry: modernize test format
 + t1006-cat-file: modernize test format
 + t1002-read-tree-m-u-2way: modernize test format
 + t1001-read-tree-m-2way: modernize test format
 + t3210-pack-refs: modernize test format
 + t0030-stripspace: modernize test format
 + t0000-basic: modernize test format
 (this branch is used by jc/test-modernization-2.)

 Originally merged to 'next' on 2023-06-13
 source: <pull.1513.git.git.1684440205.gitgitgadget@gmail.com>


* jc/test-modernization-2 (2023-05-23) 10 commits
  (merged to 'next' on 2023-06-15 at 01df673682)
 + t9400-git-cvsserver-server: modernize test format
 + t9200-git-cvsexportcommit: modernize test format
 + t9104-git-svn-follow-parent: modernize test format
 + t9100-git-svn-basic: modernize test format
 + t7700-repack: modernize test format
 + t7600-merge: modernize test format
 + t7508-status: modernize test format
 + t7201-co: modernize test format
 + t7111-reset-table: modernize test format
 + t7110-reset-merge: modernize test format
 (this branch uses jc/test-modernization.)

 Originally merged to 'next' on 2023-06-13

 Test style updates.
 source: <pull.1514.git.git.1684599239.gitgitgadget@gmail.com>


* jk/ci-use-clang-for-sanitizer-jobs (2023-06-03) 3 commits
  (merged to 'next' on 2023-06-15 at 268459fc6a)
 + ci: drop linux-clang job
 + ci: run ASan/UBSan in a single job
 + ci: use clang for ASan/UBSan checks

 Originally merged to 'next' on 2023-06-12

 Clang's sanitizer implementation seems to work better than GCC's.
 source: <20230601180220.GA4167745@coredump.intra.peff.net>


* jk/log-follow-with-non-literal-pathspec (2023-06-03) 3 commits
  (merged to 'next' on 2023-06-15 at 6848e0b8e6)
 + diff: detect pathspec magic not supported by --follow
 + diff: factor out --follow pathspec check
 + pathspec: factor out magic-to-name function

 Originally merged to 'next' on 2023-06-13

 "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.
 source: <20230601173724.GA4158369@coredump.intra.peff.net>


* kh/use-default-notes-doc (2023-06-06) 2 commits
  (merged to 'next' on 2023-06-15 at f25ced157e)
 + notes: move the documentation to the struct
 + notes: update documentation for `use_default_notes`

 Originally merged to 'next' on 2023-06-13

 Doc update.
 source: <cover.1685958731.git.code@khaugsbakk.name>


* la/doc-interpret-trailers (2023-06-14) 9 commits
  (merged to 'next' on 2023-06-15 at 6ff4a2b913)
 + doc: trailer: add more examples in DESCRIPTION
 + doc: trailer: mention 'key' in DESCRIPTION
 + doc: trailer.<token>.command: emphasize deprecation
 + doc: trailer: use angle brackets for <token> and <value>
 + doc: trailer: remove redundant phrasing
 + doc: trailer: examples: avoid the word "message" by itself
 + doc: trailer: drop "commit message part" phrasing
 + doc: trailer: swap verb order
 + doc: trailer: fix grammar

 Originally merged to 'next' on 2023-06-14

 Doc update.
 source: <pull.1506.v4.git.git.1686797630.gitgitgadget@gmail.com>


* mh/commit-reach-get-reachable-plug-leak (2023-06-04) 1 commit
  (merged to 'next' on 2023-06-15 at 62e19d66fb)
 + commit-reach: fix memory leak in get_reachable_subset()

 Originally merged to 'next' on 2023-06-12

 Plug memory leak.
 source: <20230603002819.1122129-1-mh@glandium.org>


* pb/complete-and-document-auto-merge-and-friends (2023-05-23) 6 commits
  (merged to 'next' on 2023-06-15 at ebe3216719)
 + completion: complete AUTO_MERGE
 + Documentation: document AUTO_MERGE
 + git-merge.txt: modernize word choice in "True merge" section
 + completion: complete REVERT_HEAD and BISECT_HEAD
 + revisions.txt: document more special refs
 + revisions.txt: use description list for special refs

 Originally merged to 'next' on 2023-06-13

 Document more pseudo-refs and teach the command line completion
 machinery to complete AUTO_MERGE.
 source: <pull.1515.v2.git.1684783741.gitgitgadget@gmail.com>


* ps/fetch-cleanups (2023-05-17) 9 commits
  (merged to 'next' on 2023-06-15 at 33878153a5)
 + fetch: use `fetch_config` to store "submodule.fetchJobs" value
 + fetch: use `fetch_config` to store "fetch.parallel" value
 + fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
 + fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
 + fetch: use `fetch_config` to store "fetch.pruneTags" value
 + fetch: use `fetch_config` to store "fetch.prune" value
 + fetch: pass through `fetch_config` directly
 + fetch: drop unneeded NULL-check for `remote_ref`
 + fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value

 Originally merged to 'next' on 2023-06-12

 Code clean-up.
 cf. <20230519002128.GD2442034@coredump.intra.peff.net>
 source: <cover.1684324059.git.ps@pks.im>


* tb/submodule-null-deref-fix (2023-05-25) 1 commit
  (merged to 'next' on 2023-06-15 at 8cb6a7710a)
 + builtin/submodule--helper.c: handle missing submodule URLs

 Originally merged to 'next' on 2023-06-13

 "git submodule" code trusted the data coming from the config (and
 the in-tree .gitmodules file) too much without validating, leading
 to NULL dereference if the user mucks with a repository (e.g.
 submodule.<name>.url is removed).  This has been corrected.
 source: <ae6cf3fa461b85e346f034371dae56a2790dfa20.1684957882.git.me@ttaylorr.com>


* tl/quote-problematic-arg-for-clarity (2023-06-03) 1 commit
  (merged to 'next' on 2023-06-15 at 4e52ad2fb3)
 + surround %s with quotes when failed to lookup commit

 Originally merged to 'next' on 2023-06-12

 Error message fix.
 source: <1f7c62a8870433792076fae30d6c4dc4b61a00d8.1685366301.git.dyroneteng@gmail.com>


* tz/test-fix-pthreads-prereq (2023-05-26) 1 commit
  (merged to 'next' on 2023-06-15 at 2d2446ff97)
 + trace2 tests: fix PTHREADS prereq

 Originally merged to 'next' on 2023-06-12

 Test fix.
 source: <20230525031218.3554586-1-tmz@pobox.com>


* tz/test-ssh-verifytime-fix (2023-05-26) 1 commit
  (merged to 'next' on 2023-06-15 at dd97dd32f3)
 + t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0

 Originally merged to 'next' on 2023-06-12

 Test fix.
 source: <20230525031026.3554406-1-tmz@pobox.com>


* vd/worktree-config-is-per-repository (2023-05-26) 3 commits
  (merged to 'next' on 2023-06-15 at 6301770cd6)
 + repository: move 'repository_format_worktree_config' to repo scope
 + config: pass 'repo' directly to 'config_with_options()'
 + config: use gitdir to get worktree config

 Originally merged to 'next' on 2023-06-13

 The value of config.worktree is per-repository, but has been kept
 in a singleton global variable per process. This has been OK as
 most Git operations interacted with a single repository at a time,
 but not right for operations like recursive "grep" that want to
 access multiple repositories from a single process without forking.

 The global variable has been eliminated and made into a member in
 the per-repository data structure.
 cf. <3145f4f3-7bd4-8a1b-4943-11b7d22b60c6@github.com>
 cf. <kl6lr0qwno2q.fsf@chooglen-macbookpro.roam.corp.google.com>
 source: <pull.1536.v2.git.1685064781.gitgitgadget@gmail.com>

--------------------------------------------------
[New Topics]

* gc/discover-not-setup (2023-06-16) 1 commit
  (merged to 'next' on 2023-06-16 at 27d1cd2a1b)
 + setup.c: don't setup in discover_git_directory()

 discover_git_directory() no longer touches the_repository.

 Will merge to 'master'.
 source: <pull.1526.git.git.1686771358484.gitgitgadget@gmail.com>


* mh/credential-erase-improvements (2023-06-15) 2 commits
  (merged to 'next' on 2023-06-16 at 5a3ed25303)
 + credential: erase all matching credentials
 + credential: avoid erasing distinct password

 Will merge to 'master'.
 cf. <20230615212116.GA39325@coredump.intra.peff.net>
 source: <pull.1525.v4.git.git.1686856773.gitgitgadget@gmail.com>


* cc/repack-sift-filtered-objects-to-separate-pack (2023-06-14) 9 commits
 - gc: add `gc.repackFilterTo` config option
 - repack: implement `--filter-to` for storing filtered out objects
 - gc: add `gc.repackFilter` config option
 - repack: add `--filter=<filter-spec>` option
 - repack: refactor finishing pack-objects command
 - repack: refactor piping an oid to a command
 - t/helper: add 'find-pack' test-tool
 - pack-objects: add `--print-filtered` to print omitted objects
 - pack-objects: allow `--filter` without `--stdout`

 "git repack" machinery learns to pay attention to the "--filter="
 option.

 Needs review.
 source: <20230614192541.1599256-1-christian.couder@gmail.com>


* js/cmake-wo-cache-h (2023-06-15) 1 commit
  (merged to 'next' on 2023-06-16 at b138273e7e)
 + cmake: adapt to `cache.h` being no more
 (this branch uses en/header-split-cache-h-part-3.)

 Build fix in en/header-split-cache-h-part-3 topic.

 Will merge to 'master'.
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* ps/revision-stdin-with-options (2023-06-15) 3 commits
 - revision: handle pseudo-opts in `--stdin` mode
 - revision: small readability improvement for reading from stdin
 - revision: reorder `read_revisions_from_stdin()`

 The set-up code for the get_revision() API now allows feeding
 options like --all and --not in the --stdin mode.

 Will merge to 'next'?
 source: <cover.1686839572.git.ps@pks.im>


* rs/doc-ls-tree-hex-literal (2023-06-15) 1 commit
  (merged to 'next' on 2023-06-16 at 472c7f55c9)
 + ls-tree: fix documentation of %x format placeholder

 Doc update.

 Will merge to 'master'.
 source: <23e54256-9ad5-e978-d0b8-abb511232fd1@web.de>


* jk/commit-use-no-divider-with-interpret-trailers (2023-06-16) 1 commit
  (merged to 'next' on 2023-06-20 at 08e5f2a6b5)
 + commit: pass --no-divider to interpret-trailers

 When "git commit --trailer=..." invokes the interpret-trailers
 machinery, it knows what it feeds to interpret-trailers is a full
 log message without any patch, but failed to express that by
 passing the "--no-divider" option, which has been corrected.

 Will merge to 'master'.
 source: <20230617042624.GA562686@coredump.intra.peff.net>


* jk/redact-h2h3-headers-fix (2023-06-17) 1 commit
  (merged to 'next' on 2023-06-20 at c1247fd527)
 + http: handle both "h2" and "h2h3" in curl info lines

 Curl library recently changed how http2 traces are shown and broke
 the code to redact sensitive info header, which has been fixed.

 Will merge to 'master'.
 source: <20230617051559.GD562686@coredump.intra.peff.net>


* rs/strbuf-expand-step (2023-06-18) 5 commits
 - strbuf: simplify strbuf_expand_literal_cb()
 - replace strbuf_expand() with strbuf_expand_step()
 - replace strbuf_expand_dict_cb() with strbuf_expand_step()
 - strbuf: factor out strbuf_expand_step()
 - pretty: factor out expand_separator()

 Code clean-up around strbuf_expand() API.

 source: <767baa64-20a6-daf2-d34b-d81f72363749@web.de>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* js/doc-unit-tests (2023-06-13) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Comments?  Filling in blanks?
 source: <8afdb215d7e10ca16a2ce8226b4127b3d8a2d971.1686352386.git.steadmon@google.com>


* jt/doc-use-octal-with-printf (2023-06-14) 1 commit
  (merged to 'next' on 2023-06-16 at ebb72b9bd8)
 + CodingGuidelines: use octal escapes, not hex

 Suggest to refrain from using hex literals that are non-portable
 when writing printf(1) format strings.

 Will merge to 'master'.
 source: <20230614213145.475607-1-jonathantanmy@google.com>


* js/defeat-ignore-submodules-config-with-explicit-addition (2023-06-14) 1 commit
  (merged to 'next' on 2023-06-16 at bfc01bd5e2)
 + diff-lib: honor override_submodule_config flag bit

 Even when diff.ignoreSubmodules tells us to ignore submodule
 changes, "git commit" with an index that already records changes to
 submodules should include the submodule changes in the resulting
 commit, but it did not.

 Will merge to 'master'.
 source: <20230614164856.3186012-2-sokcevic@google.com>


* as/dtype-compilation-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 267100947e)
 + statinfo.h: move DTYPE defines from dir.h

 Compilation fix for platforms without D_TYPE in struct dirent.

 Will merge to 'master'.
 source: <20230606205935.3183276-1-asedeno@google.com>


* la/docs-typofixes (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 56ddcb16e6)
 + docs: typofixes

 Typofixes.

 Will merge to 'master'.
 source: <pull.1542.v2.git.1686166007816.gitgitgadget@gmail.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-12) 25 commits
 - diff.c: mention completion above add_diff_options
 - completion: complete --remerge-diff
 - completion: complete --diff-merges, its options and --no-diff-merges
 - completion: move --pickaxe-{all,regex} to __git_diff_common_options
 - completion: complete --ws-error-highlight
 - completion: complete --unified
 - completion: complete --patch-with-raw
 - completion: complete --output-indicator-{context,new,old}
 - completion: complete --output
 - completion: complete --no-stat
 - completion: complete --no-relative
 - completion: complete --line-prefix
 - completion: complete --ita-invisible-in-index and --ita-visible-in-index
 - completion: complete --irreversible-delete
 - completion: complete --ignore-matching-lines
 - completion: complete --function-context
 - completion: complete --find-renames
 - completion: complete --find-object
 - completion: complete --find-copies
 - completion: complete --default-prefix
 - completion: complete --compact-summary
 - completion: complete --combined-all-paths
 - completion: complete --cc
 - completion: complete --break-rewrites
 - completion: add comments describing __git_diff_* globals

 Completion updates.

 Expecting a reroll.
 cf. <5cba334c-4d75-0dac-20c6-9e3def1f224a@gmail.com>
 source: <pull.1543.v2.git.1686574374.gitgitgadget@gmail.com>


* rj/leakfixes (2023-06-17) 11 commits
  (merged to 'next' on 2023-06-17 at 49e54a88e2)
 + tests: mark as passing with SANITIZE=leak
 + config: fix a leak in git_config_copy_or_rename_section_in_file
 + branch: fix a leak in cmd_branch
 + branch: fix a leak in setup_tracking
 + rev-parse: fix a leak with --abbrev-ref
  (merged to 'next' on 2023-06-16 at d9330ea230)
 + branch: fix a leak in setup_tracking
 + branch: fix a leak in check_tracking_branch
 + branch: fix a leak in inherit_tracking
 + branch: fix a leak in dwim_and_setup_tracking
 + remote: fix a leak in query_matches_negative_refspec
 + config: fix a leak in git_config_copy_or_rename_section_in_file

 Leakfixes

 Will merge to 'master'.
 source: <71b49be1-eeef-2f60-38f1-cfcbe4c8252f@gmail.com>
 source: <9eb931e7-dd18-8ce8-4d4a-cf3d85066189@gmail.com>


* rs/run-command-exec-error-on-noent (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-16 at 6bb4425334)
 + run-command: report exec error even on ENOENT
 + t1800: loosen matching of error message for bad shebang

 Simplify error message when run-command fails to start a command.

 Will merge to 'master'.
 source: <14e1be60-3765-0ba5-00f5-2848bb57bf53@web.de>


* sl/worktree-sparse (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at ca0a7edcc5)
 + worktree: integrate with sparse-index

 "git worktree" learned to work better with sparse index feature.

 Will merge to 'master'.
 source: <20230606172633.669916-1-cheskaqiqi@gmail.com>


* tb/collect-pack-filenames-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-20 at abcc6892c8)
 + builtin/repack.c: only collect fully-formed packs

 Avoid breakage of "git pack-objects --cruft" due to inconsistency
 between the way the code enumerates packfiles in the repository.

 Will merge to 'master'.
 source: <20230607101617.ges6tnMry4E52lDGld43QgtNUsIS4YQq6w-t71hEfkQ@z>


* tb/open-midx-bitmap-fallback (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 6546fee734)
 + pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack

 Gracefully deal with a stale MIDX file that lists a packfile that
 no longer exists.

 Will merge to 'master'.
 source: <f123b68cb8a277fbf105b1789a84b9405a499b79.1686178854.git.me@ttaylorr.com>


* tz/lib-gpg-prereq-fix (2023-06-12) 1 commit
  (merged to 'next' on 2023-06-16 at 19770e970a)
 + t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

 Test update.

 Will merge to 'master'.
 source: <20230606214707.55739-1-tmz@pobox.com>


* ps/cat-file-null-output (2023-06-12) 5 commits
  (merged to 'next' on 2023-06-15 at e841ad2be5)
 + cat-file: add option '-Z' that delimits input and output with NUL
 + cat-file: simplify reading from standard input
 + strbuf: provide CRLF-aware helper to read until a specified delimiter
 + t1006: modernize test style to use `test_cmp`
 + t1006: don't strip timestamps from expected results

 "git cat-file --batch" and friends learned "-Z" that uses NUL
 delimiter for both input and output.

 Will merge to 'master'.
 source: <cover.1686028409.git.ps@pks.im>


* ds/add-i-color-configuration-fix (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-15 at 377b9f9a00)
 + add: test use of brackets when color is disabled
 + add: check color.ui for interactive add

 The reimplemented "git add -i" did not honor color.ui configuration.

 Will merge to 'master'.
 source: <pull.1541.v2.git.1686061219078.gitgitgadget@gmail.com>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Needs review.
 source: <20230604185815.15761-1-five231003@gmail.com>


* ds/disable-replace-refs (2023-06-12) 3 commits
  (merged to 'next' on 2023-06-15 at e7baddb745)
 + repository: create read_replace_refs setting
 + replace-objects: create wrapper around setting
 + repository: create disable_replace_refs()
 (this branch uses tb/pack-bitmap-traversal-with-boundary.)

 Introduce a mechanism to disable replace refs globally and per
 repository.

 Will merge to 'master'.
 source: <pull.1537.v3.git.1686057877.gitgitgadget@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Expecting a reroll.
 cf. <c7b66d2c-cdc3-1f0f-60a0-a2ee21c277bf@github.com>
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-06-16) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v5.git.git.1686945306242.gitgitgadget@gmail.com>


* ja/worktree-orphan (2023-05-17) 8 commits
  (merged to 'next' on 2023-06-15 at 16bb552b79)
 + worktree add: emit warn when there is a bad HEAD
 + worktree add: extend DWIM to infer --orphan
 + worktree add: introduce "try --orphan" hint
 + worktree add: add --orphan flag
 + t2400: add tests to verify --quiet
 + t2400: refactor "worktree add" opt exclusion tests
 + t2400: cleanup created worktree in test
 + worktree add: include -B in usage docs

 Originally merged to 'next' on 2023-06-14

 'git worktree add' learned how to create a worktree based on an
 orphaned branch with `--orphan`.

 Will merge to 'master'.
 source: <20230517214711.12467-1-jacobabel@nullpo.dev>


* tb/refs-exclusion-and-packed-refs (2023-06-20) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.

 source: <cover.1687270849.git.me@ttaylorr.com>


* en/header-split-cache-h-part-3 (2023-05-16) 29 commits
  (merged to 'next' on 2023-06-15 at 76ebce0b7a)
 + fsmonitor-ll.h: split this header out of fsmonitor.h
 + hash-ll, hashmap: move oidhash() to hash-ll
 + object-store-ll.h: split this header out of object-store.h
 + khash: name the structs that khash declares
 + merge-ll: rename from ll-merge
 + git-compat-util.h: remove unneccessary include of wildmatch.h
 + builtin.h: remove unneccessary includes
 + list-objects-filter-options.h: remove unneccessary include
 + diff.h: remove unnecessary include of oidset.h
 + repository: remove unnecessary include of path.h
 + log-tree: replace include of revision.h with simple forward declaration
 + cache.h: remove this no-longer-used header
 + read-cache*.h: move declarations for read-cache.c functions from cache.h
 + repository.h: move declaration of the_index from cache.h
 + merge.h: move declarations for merge.c from cache.h
 + diff.h: move declaration for global in diff.c from cache.h
 + preload-index.h: move declarations for preload-index.c from elsewhere
 + sparse-index.h: move declarations for sparse-index.c from cache.h
 + name-hash.h: move declarations for name-hash.c from cache.h
 + run-command.h: move declarations for run-command.c from cache.h
 + statinfo: move stat_{data,validity} functions from cache/read-cache
 + read-cache: move shared add/checkout/commit code
 + add: modify add_files_to_cache() to avoid globals
 + read-cache: move shared commit and ls-files code
 + setup: adopt shared init-db & clone code
 + init-db, clone: change unnecessary global into passed parameter
 + init-db: remove unnecessary global variable
 + init-db: document existing bug with core.bare in template config
 + Merge branch 'en/header-split-cache-h-part-2' into en/header-split-cache-h-part-3
 (this branch is used by js/cmake-wo-cache-h.)

 Originally merged to 'next' on 2023-06-13

 Header files cleanup.

 Will merge to 'master' together with its fix-up in js/cmake-wo-cache-h
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* tb/gc-recent-object-hook (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-16 at 2d8d8ea2ef)
 + gc: introduce `gc.recentObjectsHook`
 + reachable.c: extract `obj_is_recent()`

 "git pack-objects" learned to invoke a new hook program that
 enumerates extra objects to be used as anchoring points to keep
 otherwise unreachable objects in cruft packs.

 Will merge to 'master'.
 source: <cover.1686178684.git.me@ttaylorr.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
 - strbuf: remove global variable
 - path: move related function to path
 - object-name: move related functions to object-name
 - credential-store: move related functions to credential-store file
 - abspath: move related functions to abspath
 - strbuf: clarify dependency
 - strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]
 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-04-28) 6 commits
 - notes.c: introduce "--[no-]stripspace" option
 - notes.c: append separator instead of insert by pos
 - notes.c: introduce '--separator=<paragraph-break>' option
 - t3321: add test cases about the notes stripspace behavior
 - notes.c: use designated initializers for clarity
 - notes.c: cleanup 'strbuf_grow' call in 'append_edit'
 (this branch is used by jc/notes-separator-fix.)

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.

 Expecting a reroll.
 cf. <20230615071314.GC1460739@coredump.intra.peff.net>
 source: <cover.1682671758.git.dyroneteng@gmail.com>


* jc/notes-separator-fix (2023-06-13) 1 commit
 - notes: do not access before the beginning of an array
 (this branch uses tl/notes-separator.)

 Fix to tl/notes-separator topic.

 Will drop once tl/notes-separator gets updated.
 source: <cover.1682671758.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>


* tb/pack-bitmap-traversal-with-boundary (2023-05-08) 3 commits
 + pack-bitmap.c: use commit boundary during bitmap traversal
 + pack-bitmap.c: extract `fill_in_bitmap()`
 + object: add object_array initializer helper function
 (this branch is used by ds/disable-replace-refs.)

 Originally merged to 'next' on 2023-06-15

 The object traversal using reachability bitmap done by
 "pack-object" has been tweaked to take advantage of the fact that
 using "boundary" commits as representative of all the uninteresting
 ones can save quite a lot of object enumeration.

 Will merge to 'master'.
 source: <cover.1683567065.git.me@ttaylorr.com>

--------------------------------------------------
[Discarded]

* mh/credential-password-expiry-libsecret (2023-05-05) 1 commit
 . credential/libsecret: support password_expiry_utc

 Originally merged to 'next' on 2023-05-09

 The libsecret credential helper learns to handle the password
 expiry time information.

 Superseded by mh/credential-libsecret-attrs.
 cf. <CAGJzqskMwOJkriH6serqdwAVYi+fftEL8ohJd-suP6v+OxB_bg@mail.gmail.com>
 source: <pull.1469.v3.git.git.1683270298313.gitgitgadget@gmail.com>


* tb/pack-bitmap-index-seek (2023-03-20) 6 commits
 . pack-bitmap.c: factor out `bitmap_index_seek_commit()`
 . pack-bitmap.c: use `bitmap_index_seek()` where possible
 . pack-bitmap.c: factor out manual `map_pos` manipulation
 . pack-bitmap.c: drop unnecessary 'inline's
 . pack-bitmap.c: hide bitmap internals in `read_be32()`
 . pack-bitmap.c: hide bitmap internals in `read_u8()`

 Clean-up the pack-bitmap codepath.

 Retracted for now.
 cf. <ZJCI6FHtbuOKPlV1@nand.local>
 source: <cover.1679342296.git.me@ttaylorr.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jun 2023, #04; Wed, 14)
@ 2023-06-15  0:06  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-15  0:06 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[New Topics]

* jc/notes-separator-fix (2023-06-13) 1 commit
  (merged to 'next' on 2023-06-14 at 3321da32a9)
 + notes: do not access before the beginning of an array
 (this branch uses tl/notes-separator.)

 Fix to tl/notes-separator topic.

 Will merge to 'master'.
 source: <cover.1682671758.git.dyroneteng@gmail.com>


* js/doc-unit-tests (2023-06-13) 1 commit
 - unit tests: Add a project plan document

 Process to add some form of low-level unit tests has started.

 Comments?  Filling in blanks?
 source: <8afdb215d7e10ca16a2ce8226b4127b3d8a2d971.1686352386.git.steadmon@google.com>


* jt/doc-use-octal-with-printf (2023-06-13) 1 commit
 - CodingGuidelines: use octal escapes, not hex

 Suggest to refrain from using hex literals that are non-portable
 when writing printf(1) format strings.

 Will merge to 'next'.
 source: <20230614001558.277755-1-jonathantanmy@google.com>


* js/defeat-ignore-submodules-config-with-explicit-addition (2023-06-14) 1 commit
 - diff-lib: honor override_submodule_config flag bit

 Even when diff.ignoreSubmodules tells us to ignore submodule
 changes, "git commit" with an index that already records changes to
 submodules should include the submodule changes in the resulting
 commit, but it did not.

 Will merge to 'next'.
 source: <20230614164856.3186012-2-sokcevic@google.com>

--------------------------------------------------
[Graduated to 'master']

* gc/doc-cocci-updates (2023-04-27) 2 commits
  (merged to 'next' on 2023-05-20 at 3fe237c1a8)
 + cocci: codify authoring and reviewing practices
 + cocci: add headings to and reword README

 Update documentation regarding Coccinelle patches.
 source: <pull.1495.v2.git.git.1682634143.gitgitgadget@gmail.com>


* jc/diff-s-with-other-options (2023-05-05) 1 commit
  (merged to 'next' on 2023-05-20 at dda3826a68)
 + diff: fix interaction between the "-s" option and other options

 The "-s" (silent, squelch) option of the "diff" family of commands
 did not interact with other options that specify the output format
 well.  This has been cleaned up so that it will clear all the
 formatting options given before.
 source: <20230505165952.335256-1-gitster@pobox.com>


* jc/pack-ref-exclude-include (2023-05-12) 3 commits
  (merged to 'next' on 2023-05-23 at 37333a2d00)
 + pack-refs: teach pack-refs --include option
 + pack-refs: teach --exclude option to exclude refs from being packed
 + docs: clarify git-pack-refs --all will pack all refs

 "git pack-refs" learns "--include" and "--exclude" to tweak the ref
 hierarchy to be packed using pattern matching.
 source: <pull.1501.v4.git.git.1683927282.gitgitgadget@gmail.com>


* jk/format-patch-message-id-unleak (2023-05-19) 2 commits
  (merged to 'next' on 2023-05-23 at 44b9e1ab91)
 + format-patch: free elements of rev.ref_message_ids list
 + format-patch: free rev.message_id when exiting

 Leakfix.
 source: <20230519000239.GA1975039@coredump.intra.peff.net>


* kh/keep-tag-editmsg-upon-failure (2023-05-16) 3 commits
  (merged to 'next' on 2023-05-19 at fc0fe3173d)
 + tag: keep the message file in case ref transaction fails
 + t/t7004-tag: add regression test for successful tag creation
 + doc: tag: document `TAG_EDITMSG`

 "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the
 command failed, so that the user can salvage what they typed.
 source: <cover.1684258780.git.code@khaugsbakk.name>


* sa/doc-ls-remote (2023-05-19) 6 commits
  (merged to 'next' on 2023-05-20 at d577bf75a0)
 + ls-remote doc: document the output format
 + ls-remote doc: explain what each example does
 + ls-remote doc: show peeled tags in examples
 + ls-remote doc: remove redundant --tags example
 + show-branch doc: say <ref>, not <reference>
 + show-ref doc: update for internal consistency

 Doc update.
 source: <pull.1471.v4.git.git.1684469874.gitgitgadget@gmail.com>


* sl/diff-tree-sparse (2023-05-18) 1 commit
  (merged to 'next' on 2023-05-24 at 5d4f2dec4d)
 + diff-tree: integrate with sparse index

 "git diff-tree" has been taught to take advantage of the
 sparse-index feature.
 cf. <2a2b7223-bb5d-65f9-95bb-9be45d329c87@github.com>
 source: <20230518154454.475487-1-cheskaqiqi@gmail.com>


* zh/ls-files-format-atoms (2023-05-23) 1 commit
  (merged to 'next' on 2023-05-24 at 116b11effb)
 + ls-files: align format atoms with ls-tree

 Some atoms that can be used in "--format=<format>" for "git ls-tree"
 were not supported by "git ls-files", even though they were relevant
 in the context of the latter.
 source: <pull.1533.v2.git.1684832418299.gitgitgadget@gmail.com>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* tb/pack-bitmap-index-seek (2023-03-20) 6 commits
 - pack-bitmap.c: factor out `bitmap_index_seek_commit()`
 - pack-bitmap.c: use `bitmap_index_seek()` where possible
 - pack-bitmap.c: factor out manual `map_pos` manipulation
 - pack-bitmap.c: drop unnecessary 'inline's
 - pack-bitmap.c: hide bitmap internals in `read_be32()`
 - pack-bitmap.c: hide bitmap internals in `read_u8()`

 Clean-up the pack-bitmap codepath.

 Kicked back to 'seen' out of 'next'.
 There is a BUG() on data errors that needs to be fixed.
 source: <cover.1679342296.git.me@ttaylorr.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* as/dtype-compilation-fix (2023-06-12) 1 commit
 - statinfo.h: move DTYPE defines from dir.h

 Compilation fix for platforms without D_TYPE in struct dirent.

 Will merge to 'next'.
 source: <20230606205935.3183276-1-asedeno@google.com>


* la/docs-typofixes (2023-06-12) 1 commit
 - docs: typofixes

 Typofixes.

 Will merge to 'next'.
 source: <pull.1542.v2.git.1686166007816.gitgitgadget@gmail.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-12) 25 commits
 - diff.c: mention completion above add_diff_options
 - completion: complete --remerge-diff
 - completion: complete --diff-merges, its options and --no-diff-merges
 - completion: move --pickaxe-{all,regex} to __git_diff_common_options
 - completion: complete --ws-error-highlight
 - completion: complete --unified
 - completion: complete --patch-with-raw
 - completion: complete --output-indicator-{context,new,old}
 - completion: complete --output
 - completion: complete --no-stat
 - completion: complete --no-relative
 - completion: complete --line-prefix
 - completion: complete --ita-invisible-in-index and --ita-visible-in-index
 - completion: complete --irreversible-delete
 - completion: complete --ignore-matching-lines
 - completion: complete --function-context
 - completion: complete --find-renames
 - completion: complete --find-object
 - completion: complete --find-copies
 - completion: complete --default-prefix
 - completion: complete --compact-summary
 - completion: complete --combined-all-paths
 - completion: complete --cc
 - completion: complete --break-rewrites
 - completion: add comments describing __git_diff_* globals

 Completion updates.

 Expecting a reroll.
 cf. <5cba334c-4d75-0dac-20c6-9e3def1f224a@gmail.com>
 source: <pull.1543.v2.git.1686574374.gitgitgadget@gmail.com>


* rj/leakfixes (2023-06-12) 6 commits
 - branch: fix a leak in setup_tracking
 - branch: fix a leak in check_tracking_branch
 - branch: fix a leak in inherit_tracking
 - branch: fix a leak in dwim_and_setup_tracking
 - remote: fix a leak in query_matches_negative_refspec
 - config: fix a leak in git_config_copy_or_rename_section_in_file

 Leakfixes (subset)

 Will merge to 'next'.
 source: <9eb931e7-dd18-8ce8-4d4a-cf3d85066189@gmail.com>


* rs/run-command-exec-error-on-noent (2023-06-12) 2 commits
 - run-command: report exec error even on ENOENT
 - t1800: loosen matching of error message for bad shebang

 Simplify error message when run-command fails to start a command.

 Will merge to 'next'.
 source: <14e1be60-3765-0ba5-00f5-2848bb57bf53@web.de>


* sl/worktree-sparse (2023-06-12) 1 commit
 - worktree: integrate with sparse-index

 "git worktree" learned to work better with sparse index feature.

 Will merge to 'next'.
 source: <20230606172633.669916-1-cheskaqiqi@gmail.com>


* tb/collect-pack-filenames-fix (2023-06-12) 1 commit
 - builtin/repack.c: only collect fully-formed packs

 Avoid breakage of "git pack-objects --cruft" due to inconsistency
 between the way the code enumerates packfiles in the repository.

 Will merge to 'next'?
 source: <20230607101617.ges6tnMry4E52lDGld43QgtNUsIS4YQq6w-t71hEfkQ@z>


* tb/open-midx-bitmap-fallback (2023-06-12) 1 commit
 - pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack

 Gracefully deal with a stale MIDX file that lists a packfile that
 no longer exists.

 Will merge to 'next'.
 source: <f123b68cb8a277fbf105b1789a84b9405a499b79.1686178854.git.me@ttaylorr.com>


* tz/lib-gpg-prereq-fix (2023-06-12) 1 commit
 - t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

 Test update.

 Will merge to 'next'.
 source: <20230606214707.55739-1-tmz@pobox.com>


* jk/ci-use-clang-for-sanitizer-jobs (2023-06-03) 3 commits
  (merged to 'next' on 2023-06-12 at f6d4c5aac6)
 + ci: drop linux-clang job
 + ci: run ASan/UBSan in a single job
 + ci: use clang for ASan/UBSan checks

 Clang's sanitizer implementation seems to work better than GCC's.

 Will merge to 'master'.
 source: <20230601180220.GA4167745@coredump.intra.peff.net>


* jk/log-follow-with-non-literal-pathspec (2023-06-03) 3 commits
  (merged to 'next' on 2023-06-13 at 6c864e2f8a)
 + diff: detect pathspec magic not supported by --follow
 + diff: factor out --follow pathspec check
 + pathspec: factor out magic-to-name function

 "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.

 Will merge to 'master'.
 source: <20230601173724.GA4158369@coredump.intra.peff.net>


* kh/use-default-notes-doc (2023-06-06) 2 commits
  (merged to 'next' on 2023-06-13 at ebfbf7a376)
 + notes: move the documentation to the struct
 + notes: update documentation for `use_default_notes`

 Doc update.

 Will merge to 'master'.
 source: <cover.1685958731.git.code@khaugsbakk.name>


* ps/cat-file-null-output (2023-06-12) 5 commits
  (merged to 'next' on 2023-06-14 at f879ffcbf0)
 + cat-file: add option '-Z' that delimits input and output with NUL
 + cat-file: simplify reading from standard input
 + strbuf: provide CRLF-aware helper to read until a specified delimiter
 + t1006: modernize test style to use `test_cmp`
 + t1006: don't strip timestamps from expected results

 "git cat-file --batch" and friends learned "-Z" that uses NUL
 delimiter for both input and output.

 Will merge to 'master'.
 source: <cover.1686028409.git.ps@pks.im>


* tl/quote-problematic-arg-for-clarity (2023-06-03) 1 commit
  (merged to 'next' on 2023-06-12 at 68851799e5)
 + surround %s with quotes when failed to lookup commit

 Error message fix.

 Will merge to 'master'.
 source: <1f7c62a8870433792076fae30d6c4dc4b61a00d8.1685366301.git.dyroneteng@gmail.com>


* ds/add-i-color-configuration-fix (2023-06-12) 2 commits
  (merged to 'next' on 2023-06-14 at 91eec092e0)
 + add: test use of brackets when color is disabled
 + add: check color.ui for interactive add

 The reimplemented "git add -i" did not honor color.ui configuration.

 Will merge to 'master'.
 source: <pull.1541.v2.git.1686061219078.gitgitgadget@gmail.com>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Needs review.
 source: <20230604185815.15761-1-five231003@gmail.com>


* mh/commit-reach-get-reachable-plug-leak (2023-06-04) 1 commit
  (merged to 'next' on 2023-06-12 at 7c58973941)
 + commit-reach: fix memory leak in get_reachable_subset()

 Plug memory leak.

 Will merge to 'master'.
 source: <20230603002819.1122129-1-mh@glandium.org>


* ds/disable-replace-refs (2023-06-12) 3 commits
  (merged to 'next' on 2023-06-14 at 82ba5a6ffa)
 + repository: create read_replace_refs setting
 + replace-objects: create wrapper around setting
 + repository: create disable_replace_refs()
 (this branch uses tb/pack-bitmap-traversal-with-boundary.)

 Introduce a mechanism to disable replace refs globally and per
 repository.

 Will merge to 'master'.
 source: <pull.1537.v3.git.1686057877.gitgitgadget@gmail.com>


* tz/test-fix-pthreads-prereq (2023-05-26) 1 commit
  (merged to 'next' on 2023-06-12 at 82d9529f2c)
 + trace2 tests: fix PTHREADS prereq

 Test fix.

 Will merge to 'master'.
 source: <20230525031218.3554586-1-tmz@pobox.com>


* tz/test-ssh-verifytime-fix (2023-05-26) 1 commit
  (merged to 'next' on 2023-06-12 at 3abad605d6)
 + t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0

 Test fix.

 Will merge to 'master'.
 source: <20230525031026.3554406-1-tmz@pobox.com>


* vd/worktree-config-is-per-repository (2023-05-26) 3 commits
  (merged to 'next' on 2023-06-13 at 339d281663)
 + repository: move 'repository_format_worktree_config' to repo scope
 + config: pass 'repo' directly to 'config_with_options()'
 + config: use gitdir to get worktree config

 The value of config.worktree is per-repository, but has been kept
 in a singleton global variable per process. This has been OK as
 most Git operations interacted with a single repository at a time,
 but not right for operations like recursive "grep" that want to
 access multiple repositories from a single process without forking.

 The global variable has been eliminated and made into a member in
 the per-repository data structure.

 Will merge to 'master'.
 cf. <3145f4f3-7bd4-8a1b-4943-11b7d22b60c6@github.com>
 cf. <kl6lr0qwno2q.fsf@chooglen-macbookpro.roam.corp.google.com>
 source: <pull.1536.v2.git.1685064781.gitgitgadget@gmail.com>


* tb/submodule-null-deref-fix (2023-05-25) 1 commit
  (merged to 'next' on 2023-06-13 at 5eb6a7948d)
 + builtin/submodule--helper.c: handle missing submodule URLs

 "git submodule" code trusted the data coming from the config (and
 the in-tree .gitmodules file) too much without validating, leading
 to NULL dereference if the user mucks with a repository (e.g.
 submodule.<name>.url is removed).  This has been corrected.

 Will merge to 'master'.
 source: <ae6cf3fa461b85e346f034371dae56a2790dfa20.1684957882.git.me@ttaylorr.com>


* jc/test-modernization-2 (2023-05-23) 10 commits
  (merged to 'next' on 2023-06-13 at e3ab8eea9a)
 + t9400-git-cvsserver-server: modernize test format
 + t9200-git-cvsexportcommit: modernize test format
 + t9104-git-svn-follow-parent: modernize test format
 + t9100-git-svn-basic: modernize test format
 + t7700-repack: modernize test format
 + t7600-merge: modernize test format
 + t7508-status: modernize test format
 + t7201-co: modernize test format
 + t7111-reset-table: modernize test format
 + t7110-reset-merge: modernize test format
 (this branch uses jc/test-modernization.)

 Test style updates.

 Will merge to 'master'.
 source: <pull.1514.git.git.1684599239.gitgitgadget@gmail.com>


* jt/path-filter-fix (2023-06-13) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Will merge to 'next'?
 source: <cover.1686677910.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-05-17) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v4.git.git.1684306540947.gitgitgadget@gmail.com>


* ps/fetch-cleanups (2023-05-17) 9 commits
  (merged to 'next' on 2023-06-12 at d15d335893)
 + fetch: use `fetch_config` to store "submodule.fetchJobs" value
 + fetch: use `fetch_config` to store "fetch.parallel" value
 + fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
 + fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
 + fetch: use `fetch_config` to store "fetch.pruneTags" value
 + fetch: use `fetch_config` to store "fetch.prune" value
 + fetch: pass through `fetch_config` directly
 + fetch: drop unneeded NULL-check for `remote_ref`
 + fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value

 Code clean-up.

 Will merge to 'master'.
 cf. <20230519002128.GD2442034@coredump.intra.peff.net>
 source: <cover.1684324059.git.ps@pks.im>


* jc/test-modernization (2023-05-19) 20 commits
  (merged to 'next' on 2023-06-13 at a61e7b7248)
 + t7101-reset-empty-subdirs: modernize test format
 + t6050-replace: modernize test format
 + t5306-pack-nobase: modernize test format
 + t5303-pack-corruption-resilience: modernize test format
 + t5301-sliding-window: modernize test format
 + t5300-pack-object: modernize test format
 + t4206-log-follow-harder-copies: modernize test format
 + t4202-log: modernize test format
 + t4004-diff-rename-symlink: modernize test format
 + t4003-diff-rename-1: modernize test format
 + t4002-diff-basic: modernize test format
 + t3903-stash: modernize test format
 + t3700-add: modernize test format
 + t3500-cherry: modernize test format
 + t1006-cat-file: modernize test format
 + t1002-read-tree-m-u-2way: modernize test format
 + t1001-read-tree-m-2way: modernize test format
 + t3210-pack-refs: modernize test format
 + t0030-stripspace: modernize test format
 + t0000-basic: modernize test format
 (this branch is used by jc/test-modernization-2.)

 Will merge to 'master'.
 source: <pull.1513.git.git.1684440205.gitgitgadget@gmail.com>


* ja/worktree-orphan (2023-05-17) 8 commits
  (merged to 'next' on 2023-06-14 at 25d508496b)
 + worktree add: emit warn when there is a bad HEAD
 + worktree add: extend DWIM to infer --orphan
 + worktree add: introduce "try --orphan" hint
 + worktree add: add --orphan flag
 + t2400: add tests to verify --quiet
 + t2400: refactor "worktree add" opt exclusion tests
 + t2400: cleanup created worktree in test
 + worktree add: include -B in usage docs

 'git worktree add' learned how to create a worktree based on an
 orphaned branch with `--orphan`.

 Will merge to 'master'.
 source: <20230517214711.12467-1-jacobabel@nullpo.dev>


* tb/refs-exclusion-and-packed-refs (2023-06-12) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.
 source: <cover.1686134440.git.me@ttaylorr.com>


* en/header-split-cache-h-part-3 (2023-05-16) 29 commits
  (merged to 'next' on 2023-06-13 at 56bcca52ac)
 + fsmonitor-ll.h: split this header out of fsmonitor.h
 + hash-ll, hashmap: move oidhash() to hash-ll
 + object-store-ll.h: split this header out of object-store.h
 + khash: name the structs that khash declares
 + merge-ll: rename from ll-merge
 + git-compat-util.h: remove unneccessary include of wildmatch.h
 + builtin.h: remove unneccessary includes
 + list-objects-filter-options.h: remove unneccessary include
 + diff.h: remove unnecessary include of oidset.h
 + repository: remove unnecessary include of path.h
 + log-tree: replace include of revision.h with simple forward declaration
 + cache.h: remove this no-longer-used header
 + read-cache*.h: move declarations for read-cache.c functions from cache.h
 + repository.h: move declaration of the_index from cache.h
 + merge.h: move declarations for merge.c from cache.h
 + diff.h: move declaration for global in diff.c from cache.h
 + preload-index.h: move declarations for preload-index.c from elsewhere
 + sparse-index.h: move declarations for sparse-index.c from cache.h
 + name-hash.h: move declarations for name-hash.c from cache.h
 + run-command.h: move declarations for run-command.c from cache.h
 + statinfo: move stat_{data,validity} functions from cache/read-cache
 + read-cache: move shared add/checkout/commit code
 + add: modify add_files_to_cache() to avoid globals
 + read-cache: move shared commit and ls-files code
 + setup: adopt shared init-db & clone code
 + init-db, clone: change unnecessary global into passed parameter
 + init-db: remove unnecessary global variable
 + init-db: document existing bug with core.bare in template config
 + Merge branch 'en/header-split-cache-h-part-2' into en/header-split-cache-h-part-3

 Header files cleanup.

 Will merge to 'master'.
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* la/doc-interpret-trailers (2023-06-12) 9 commits
  (merged to 'next' on 2023-06-14 at 64a59e71b3)
 + doc: trailer: add more examples in DESCRIPTION
 + doc: trailer: mention 'key' in DESCRIPTION
 + doc: trailer.<token>.command: emphasize deprecation
 + doc: trailer: use angle brackets for <token> and <value>
 + doc: trailer: remove redundant phrasing
 + doc: trailer: examples: avoid the word "message" by itself
 + doc: trailer: drop "commit message part" phrasing
 + doc: trailer: swap verb order
 + doc: trailer: fix grammar

 Doc update.

 Will merge to 'master'.
 source: <pull.1506.v3.git.git.1686017304.gitgitgadget@gmail.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* tb/gc-recent-object-hook (2023-06-12) 2 commits
 - gc: introduce `gc.recentObjectsHook`
 - reachable.c: extract `obj_is_recent()`

 "git pack-objects" learned to invoke a new hook program that
 enumerates extra objects to be used as anchoring points to keep
 otherwise unreachable objects in cruft packs.

 Will merge to 'next'.
 source: <cover.1686178684.git.me@ttaylorr.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
 - strbuf: remove global variable
 - path: move related function to path
 - object-name: move related functions to object-name
 - credential-store: move related functions to credential-store file
 - abspath: move related functions to abspath
 - strbuf: clarify dependency
 - strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]
 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-04-28) 6 commits
  (merged to 'next' on 2023-05-06 at 598ed19c9b)
 + notes.c: introduce "--[no-]stripspace" option
 + notes.c: append separator instead of insert by pos
 + notes.c: introduce '--separator=<paragraph-break>' option
 + t3321: add test cases about the notes stripspace behavior
 + notes.c: use designated initializers for clarity
 + notes.c: cleanup 'strbuf_grow' call in 'append_edit'
 (this branch is used by jc/notes-separator-fix.)

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.

 Will merge to 'next' together with its fix-up.
 source: <cover.1682671758.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>


* tb/pack-bitmap-traversal-with-boundary (2023-05-08) 3 commits
 + pack-bitmap.c: use commit boundary during bitmap traversal
 + pack-bitmap.c: extract `fill_in_bitmap()`
 + object: add object_array initializer helper function
 (this branch is used by ds/disable-replace-refs.)

 The object traversal using reachability bitmap done by
 "pack-object" has been tweaked to take advantage of the fact that
 using "boundary" commits as representative of all the uninteresting
 ones can save quite a lot of object enumeration.

 Will merge to 'next'.
 source: <cover.1683567065.git.me@ttaylorr.com>


* pb/complete-and-document-auto-merge-and-friends (2023-05-23) 6 commits
  (merged to 'next' on 2023-06-13 at 46ca10d88d)
 + completion: complete AUTO_MERGE
 + Documentation: document AUTO_MERGE
 + git-merge.txt: modernize word choice in "True merge" section
 + completion: complete REVERT_HEAD and BISECT_HEAD
 + revisions.txt: document more special refs
 + revisions.txt: use description list for special refs

 Document more pseudo-refs and teach the command line completion
 machinery to complete AUTO_MERGE.

 Will merge to 'master'.
 source: <pull.1515.v2.git.1684783741.gitgitgadget@gmail.com>


* mh/credential-password-expiry-libsecret (2023-05-05) 1 commit
  (merged to 'next' on 2023-05-09 at fd898e3756)
 + credential/libsecret: support password_expiry_utc

 The libsecret credential helper learns to handle the password
 expiry time information.

 On hold.
 The database gets littered with entries whose expiration dates only differ.
 cf. <CAGJzqskMwOJkriH6serqdwAVYi+fftEL8ohJd-suP6v+OxB_bg@mail.gmail.com>
 source: <pull.1469.v3.git.git.1683270298313.gitgitgadget@gmail.com>

^ permalink raw reply	[relevance 2%]

* What's cooking in git.git (Jun 2023, #03; Mon, 12)
@ 2023-06-13  2:28  2% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2023-06-13  2:28 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking in my tree.  Commits
prefixed with '+' are in 'next' (being in 'next' is a sign that a
topic is stable enough to be used and are candidate to be in a
future release).  Commits prefixed with '-' are only in 'seen', and
aren't considered "accepted" at all and may be annotated with an URL
to a message that raises issues but they are no means exhaustive.  A
topic without enough support may be discarded after a long period of
no activity (of course they can be resubmit when new interests
arise).

Sorry for being rather quiet for a few weeks.  I was visiting Japan,
attending a couple of memorial services, and then got sick and was
in bed for about a week X-<.  It makes you feel really old when a
friend from your highschool days passes away.  I think I've caught
up with the list traffic, but stale topics may want to be re-sent.

Copies of the source code to Git live in many repositories, and the
following is a list of the ones I push into or their mirrors.  Some
repositories have only a subset of branches.

With maint, master, next, seen, todo:

	git://git.kernel.org/pub/scm/git/git.git/
	git://repo.or.cz/alt-git.git/
	https://kernel.googlesource.com/pub/scm/git/git/
	https://github.com/git/git/
	https://gitlab.com/git-vcs/git/

With all the integration branches and topics broken out:

	https://github.com/gitster/git/

Even though the preformatted documentation in HTML and man format
are not sources, they are published in these repositories for
convenience (replace "htmldocs" with "manpages" for the manual
pages):

	git://git.kernel.org/pub/scm/git/git-htmldocs.git/
	https://github.com/gitster/git-htmldocs.git/

Release tarballs are available at:

	https://www.kernel.org/pub/software/scm/git/

--------------------------------------------------
[New Topics]

* as/dtype-compilation-fix (2023-06-12) 1 commit
 - statinfo.h: move DTYPE defines from dir.h

 Compilation fix for platforms without D_TYPE in struct dirent.

 Will merge to 'next'. 
 source: <20230606205935.3183276-1-asedeno@google.com>


* la/docs-typofixes (2023-06-12) 1 commit
 - docs: typofixes

 Typofixes.

 Will merge to 'next'.
 source: <pull.1542.v2.git.1686166007816.gitgitgadget@gmail.com>


* mh/mingw-case-sensitive-build (2023-06-12) 1 commit
 - mingw: use lowercase includes for some Windows headers

 Names of MinGW header files are spelled in mixed case in some
 source files, but the build host can be using case sensitive
 filesystem with header files with their name spelled in all
 lowercase.

 Needs review.
 source: <20230604211934.1365289-1-mh@glandium.org>


* pb/complete-diff-options (2023-06-12) 25 commits
 - diff.c: mention completion above add_diff_options
 - completion: complete --remerge-diff
 - completion: complete --diff-merges, its options and --no-diff-merges
 - completion: move --pickaxe-{all,regex} to __git_diff_common_options
 - completion: complete --ws-error-highlight
 - completion: complete --unified
 - completion: complete --patch-with-raw
 - completion: complete --output-indicator-{context,new,old}
 - completion: complete --output
 - completion: complete --no-stat
 - completion: complete --no-relative
 - completion: complete --line-prefix
 - completion: complete --ita-invisible-in-index and --ita-visible-in-index
 - completion: complete --irreversible-delete
 - completion: complete --ignore-matching-lines
 - completion: complete --function-context
 - completion: complete --find-renames
 - completion: complete --find-object
 - completion: complete --find-copies
 - completion: complete --default-prefix
 - completion: complete --compact-summary
 - completion: complete --combined-all-paths
 - completion: complete --cc
 - completion: complete --break-rewrites
 - completion: add comments describing __git_diff_* globals

 Completion updates.

 Expecting a reroll.
 cf. <5cba334c-4d75-0dac-20c6-9e3def1f224a@gmail.com>
 source: <pull.1543.v2.git.1686574374.gitgitgadget@gmail.com>


* rj/leakfixes (2023-06-12) 6 commits
 - branch: fix a leak in setup_tracking
 - branch: fix a leak in check_tracking_branch
 - branch: fix a leak in inherit_tracking
 - branch: fix a leak in dwim_and_setup_tracking
 - remote: fix a leak in query_matches_negative_refspec
 - config: fix a leak in git_config_copy_or_rename_section_in_file

 Leakfixes (subset)

 Will merge to 'next'.
 source: <9eb931e7-dd18-8ce8-4d4a-cf3d85066189@gmail.com>


* rs/run-command-exec-error-on-noent (2023-06-12) 2 commits
 - run-command: report exec error even on ENOENT
 - t1800: loosen matching of error message for bad shebang

 Simplify error message when run-command fails to start a command.

 Will merge to 'next'.
 source: <14e1be60-3765-0ba5-00f5-2848bb57bf53@web.de>


* sl/worktree-sparse (2023-06-12) 1 commit
 - worktree: integrate with sparse-index

 "git worktree" learned to work better with sparse index feature.

 Will merge to 'next'.
 source: <20230606172633.669916-1-cheskaqiqi@gmail.com>


* tb/collect-pack-filenames-fix (2023-06-12) 1 commit
 - builtin/repack.c: only collect fully-formed packs

 Avoid breakage of "git pack-objects --cruft" due to inconsistency
 between the way the code enumerates packfiles in the repository.

 Will merge to 'next'?
 source: <20230607101617.ges6tnMry4E52lDGld43QgtNUsIS4YQq6w-t71hEfkQ@z>


* tb/open-midx-bitmap-fallback (2023-06-12) 1 commit
 - pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack

 Gracefully deal with a stale MIDX file that lists a packfile that
 no longer exists.

 Will merge to 'next'.
 source: <f123b68cb8a277fbf105b1789a84b9405a499b79.1686178854.git.me@ttaylorr.com>


* tz/lib-gpg-prereq-fix (2023-06-12) 1 commit
 - t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

 Test update.

 Will merge to 'next'.
 source: <20230606214707.55739-1-tmz@pobox.com>

--------------------------------------------------
[Stalled]

* ed/fsmonitor-windows-named-pipe (2023-03-24) 1 commit
 - fsmonitor: handle differences between Windows named pipe functions

 Fix fsmonitor on Windows when the filesystem path contains certain
 characters.

 Expecting a reroll.
 cf. <b9cf67e4-22a7-2ff0-8310-9223bea10d6d@jeffhostetler.com>
 source: <pull.1503.git.1679678090412.gitgitgadget@gmail.com>


* rn/sparse-diff-index (2023-04-10) 1 commit
 - diff-index: enable sparse index

 "git diff-index" command has been taught to work better with the
 sparse index.

 Expecting a reroll.
 cf. <62821012-4fc3-5ad8-695c-70f7ab14a8c9@github.com>
 source: <20230408112342.404318-1-nanth.raghul@gmail.com>


* es/recurse-submodules-option-is-a-bool (2023-04-10) 1 commit
 - usage: clarify --recurse-submodules as a boolean

 The "--[no-]recurse-submodules" option of "git checkout" and others
 supported an undocumented syntax --recurse-submodules=<value> where
 the value can spell a Boolean in various ways.  The support for the
 syntax is being dropped.

 Expecting a reroll.
 cf. <ZDSTFwMFO7vbj/du@google.com>
 source: <ZDSTFwMFO7vbj/du@google.com>


* tb/pack-bitmap-index-seek (2023-03-20) 6 commits
 - pack-bitmap.c: factor out `bitmap_index_seek_commit()`
 - pack-bitmap.c: use `bitmap_index_seek()` where possible
 - pack-bitmap.c: factor out manual `map_pos` manipulation
 - pack-bitmap.c: drop unnecessary 'inline's
 - pack-bitmap.c: hide bitmap internals in `read_be32()`
 - pack-bitmap.c: hide bitmap internals in `read_u8()`

 Clean-up the pack-bitmap codepath.

 Kicked back to 'seen' out of 'next'.
 There is a BUG() on data errors that needs to be fixed.
 source: <cover.1679342296.git.me@ttaylorr.com>


* cb/checkout-same-branch-twice (2023-03-22) 2 commits
 - SQUASH??? the test marked to expect failure passes from day one
 - checkout/switch: disallow checking out same branch in multiple worktrees

 "git checkout -B $branch" failed to protect against checking out
 a branch that is checked out elsewhere, unlike "git branch -f" did.

 Expecting a hopefully minor and final reroll.
 cf. <CAPUEspj_Bh+LgYLnWfeBdcq_uV5Cbou-7H51GLFjzSa5Qzby9w@mail.gmail.com>
 source: <20230120113553.24655-1-carenas@gmail.com>


* tk/pull-conflict-suggest-rebase-merge-not-rebase-true (2023-02-13) 1 commit
 - pull: conflict hint pull.rebase suggestion should offer "merges" vs "true"

 In an advice message after failed non-ff pull, we used to suggest
 setting pull.rebase=true, but these days pull.rebase=merges may be
 more inline with the original spirit of "rebuild your side on top
 of theirs".

 May want to discard.
 This is too much of a departure from the existing practice.
 cf. <CAMMLpeTPEoKVTbfc17w+Y9qn7jOGmQi_Ux0Y3sFW5QTgGWJ=SA@mail.gmail.com>
 cf. <CABPp-BGqAxKnxDRVN4cYMteLp33hvto07R3=TJBT5WubJT4+Og@mail.gmail.com>
 source: <pull.1474.git.1675614276549.gitgitgadget@gmail.com>


* ab/tag-object-type-errors (2023-05-10) 4 commits
 - tag: don't emit potentially incorrect "object is a X, not a Y"
 - tag: don't misreport type of tagged objects in errors
 - object tests: add test for unexpected objects in tags
 - Merge branch 'jk/parse-object-type-mismatch' into ab/tag-object-type-errors

 Hardening checks around mismatched object types when one of those
 objects is a tag.
 source: <cover-v2-0.3-00000000000-20221230T011725Z-avarab@gmail.com>


* ad/test-record-count-when-harness-is-in-use (2022-12-25) 1 commit
 - test-lib: allow storing counts with test harnesses

 Allow summary results from tests to be written to t/test-results
 directory even when a test harness like 'prove' is in use.

 Expecting a reroll.
 cf. <CABPp-BGoPuGCZw+9wCgdYyRR4Zf4y9Kun27GrQhtMdYWpOUsYQ@mail.gmail.com>
 source: <20221224225200.1027806-1-adam@dinwoodie.org>


* so/diff-merges-more (2022-12-18) 5 commits
 - diff-merges: improve --diff-merges documentation
 - diff-merges: issue warning on lone '-m' option
 - diff-merges: support list of values for --diff-merges
 - diff-merges: implement log.diffMerges-m-imply-p config
 - diff-merges: implement [no-]hide option and log.diffMergesHide config

 Assorted updates to "--diff-merges=X" option.

 May want to discard.
 Breaking compatibility does not seem worth it.
 source: <20221217132955.108542-1-sorganov@gmail.com>


* ab/imap-send-requires-curl (2023-02-02) 6 commits
 - imap-send: correctly report "host" when using "tunnel"
 - imap-send: remove old --no-curl codepath
 - imap-send: make --curl no-optional
 - imap-send: replace auto-probe libcurl with hard dependency
 - imap-send doc: the imap.sslVerify is used with imap.tunnel
 - imap-send: note "auth_method", not "host" on auth method failure

 Give a hard dependency on cURL library to build "git imap-send",
 and remove the code to interact with IMAP server without using cURL.

 Expecting a reroll.
 The 'tunnel' part is still iffy.
 cf. <230203.86bkmabfjr.gmgdl@evledraar.gmail.com>
 source: <cover-v2-0.6-00000000000-20230202T093706Z-avarab@gmail.com>


* cw/submodule-status-in-parallel (2023-03-02) 6 commits
 - diff-lib: parallelize run_diff_files for submodules
 - diff-lib: refactor out diff_change logic
 - submodule: refactor is_submodule_modified()
 - submodule: move status parsing into function
 - submodule: rename strbuf variable
 - run-command: add on_stderr_output_fn to run_processes_parallel_opts

 "git submodule status" learned to run the comparison in submodule
 repositories in parallel.

 Expecting a reroll.
 cf. <CAFySSZDk05m6gU5-V1R+y3YnQ5PPduVW54+_gjBwD0rmacsLsw@mail.gmail.com>
 cf. <230307.865ybc273g.gmgdl@evledraar.gmail.com>
 source: <20230302215237.1473444-1-calvinwan@google.com>

--------------------------------------------------
[Cooking]

* jk/ci-use-clang-for-sanitizer-jobs (2023-06-03) 3 commits
 - ci: drop linux-clang job
 - ci: run ASan/UBSan in a single job
 - ci: use clang for ASan/UBSan checks

 Clang's sanitizer implementation seems to work better than GCC's.

 Will merge to 'next'.
 source: <20230601180220.GA4167745@coredump.intra.peff.net>


* jk/log-follow-with-non-literal-pathspec (2023-06-03) 3 commits
 - diff: detect pathspec magic not supported by --follow
 - diff: factor out --follow pathspec check
 - pathspec: factor out magic-to-name function

 "git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.

 Will merge to 'next'.
 source: <20230601173724.GA4158369@coredump.intra.peff.net>


* kh/use-default-notes-doc (2023-06-06) 2 commits
 - notes: move the documentation to the struct
 - notes: update documentation for `use_default_notes`

 Will merge to 'next'.
 source: <cover.1685958731.git.code@khaugsbakk.name>


* ps/cat-file-null-output (2023-06-12) 5 commits
 - cat-file: add option '-Z' that delimits input and output with NUL
 - cat-file: simplify reading from standard input
 - strbuf: provide CRLF-aware helper to read until a specified delimiter
 - t1006: modernize test style to use `test_cmp`
 - t1006: don't strip timestamps from expected results

 "git cat-file --batch" and friends learned "-Z" that uses NUL
 delimiter for both input and output.

 Will merge to 'next'.
 source: <cover.1686028409.git.ps@pks.im>


* tl/quote-problematic-arg-for-clarity (2023-06-03) 1 commit
 - surround %s with quotes when failed to lookup commit

 Error message fix.

 Will merge to 'next'.
 source: <1f7c62a8870433792076fae30d6c4dc4b61a00d8.1685366301.git.dyroneteng@gmail.com>


* ds/add-i-color-configuration-fix (2023-06-12) 2 commits
 - add: test use of brackets when color is disabled
 - add: check color.ui for interactive add

 The reimplemented "git add -i" did not honor color.ui configuration.

 Will merge to 'next'.
 source: <pull.1541.v2.git.1686061219078.gitgitgadget@gmail.com>


* ks/ref-filter-signature (2023-06-06) 2 commits
 - ref-filter: add new "signature" atom
 - t/lib-gpg: introduce new prereq GPG2

 The "git for-each-ref" family of commands learned placeholders
 related to GPG signature verification.

 Needs review.
 source: <20230604185815.15761-1-five231003@gmail.com>


* mh/commit-reach-get-reachable-plug-leak (2023-06-04) 1 commit
 - commit-reach: fix memory leak in get_reachable_subset()

 Plug memory leak.

 Will merge to 'next'.
 source: <20230603002819.1122129-1-mh@glandium.org>


* ds/disable-replace-refs (2023-06-12) 3 commits
 - repository: create read_replace_refs setting
 - replace-objects: create wrapper around setting
 - repository: create disable_replace_refs()
 (this branch uses tb/pack-bitmap-traversal-with-boundary.)

 Introduce a mechanism to disable replace refs globally and per
 repository.

 Will merge to 'next'.
 source: <pull.1537.v3.git.1686057877.gitgitgadget@gmail.com>


* tz/test-fix-pthreads-prereq (2023-05-26) 1 commit
 - trace2 tests: fix PTHREADS prereq

 Test fix.

 Will merge to 'next'.
 source: <20230525031218.3554586-1-tmz@pobox.com>


* tz/test-ssh-verifytime-fix (2023-05-26) 1 commit
 - t/lib-gpg: fix ssh-keygen -Y check-novalidate with openssh-9.0

 Test fix.

 Will merge to 'next'.
 source: <20230525031026.3554406-1-tmz@pobox.com>


* vd/worktree-config-is-per-repository (2023-05-26) 3 commits
 - repository: move 'repository_format_worktree_config' to repo scope
 - config: pass 'repo' directly to 'config_with_options()'
 - config: use gitdir to get worktree config

 The value of config.worktree is per-repository, but has been kept
 in a singleton global variable per process. This has been OK as
 most Git operations interacted with a single repository at a time,
 but not right for operations like recursive "grep" that want to
 access multiple repositories from a single process without forking.

 The global variable has been eliminated and made into a member in
 the per-repository data structure.

 Will merge to 'next'.
 cf. <3145f4f3-7bd4-8a1b-4943-11b7d22b60c6@github.com>
 cf. <kl6lr0qwno2q.fsf@chooglen-macbookpro.roam.corp.google.com>
 source: <pull.1536.v2.git.1685064781.gitgitgadget@gmail.com>


* tb/submodule-null-deref-fix (2023-05-25) 1 commit
 - builtin/submodule--helper.c: handle missing submodule URLs

 "git submodule" code trusted the data coming from the config (and
 the in-tree .gitmodules file) too much without validating, leading
 to NULL dereference if the user mucks with a repository (e.g.
 submodule.<name>.url is removed).  This has been corrected.

 Will merge to 'next'.
 source: <ae6cf3fa461b85e346f034371dae56a2790dfa20.1684957882.git.me@ttaylorr.com>


* jc/test-modernization-2 (2023-05-23) 10 commits
 - t9400-git-cvsserver-server: modernize test format
 - t9200-git-cvsexportcommit: modernize test format
 - t9104-git-svn-follow-parent: modernize test format
 - t9100-git-svn-basic: modernize test format
 - t7700-repack: modernize test format
 - t7600-merge: modernize test format
 - t7508-status: modernize test format
 - t7201-co: modernize test format
 - t7111-reset-table: modernize test format
 - t7110-reset-merge: modernize test format
 (this branch uses jc/test-modernization.)

 Test style updates.

 Will merge to 'next'.
 source: <pull.1514.git.git.1684599239.gitgitgadget@gmail.com>


* jt/path-filter-fix (2023-06-12) 4 commits
 - commit-graph: new filter ver. that fixes murmur3
 - repo-settings: introduce commitgraph.changedPathsVersion
 - t4216: test changed path filters with high bit paths
 - gitformat-commit-graph: describe version 2 of BDAT

 The Bloom filter used for path limited history traversal was broken
 on systems whose "char" is unsigned; update the implementation and
 bump the format version to 2.

 Will merge to 'next'?
 source: <cover.1686251688.git.jonathantanmy@google.com>


* tk/cherry-pick-sequence-requires-clean-worktree (2023-06-01) 1 commit
 - cherry-pick: refuse cherry-pick sequence if index is dirty

 "git cherry-pick A" that replays a single commit stopped before
 clobbering local modification, but "git cherry-pick A..B" did not,
 which has been corrected.

 Expecting a reroll.
 cf. <999f12b2-38d6-f446-e763-4985116ad37d@gmail.com>
 source: <pull.1535.v2.git.1685264889088.gitgitgadget@gmail.com>


* mh/credential-libsecret-attrs (2023-05-17) 1 commit
 - credential/libsecret: store new attributes

 The way authentication related data other than passwords (e.g.
 oath token and password expiration data) are stored in libsecret
 keyrings has been rethought.

 Needs review.
 source: <pull.1469.v4.git.git.1684306540947.gitgitgadget@gmail.com>


* ps/fetch-cleanups (2023-05-17) 9 commits
 - fetch: use `fetch_config` to store "submodule.fetchJobs" value
 - fetch: use `fetch_config` to store "fetch.parallel" value
 - fetch: use `fetch_config` to store "fetch.recurseSubmodules" value
 - fetch: use `fetch_config` to store "fetch.showForcedUpdates" value
 - fetch: use `fetch_config` to store "fetch.pruneTags" value
 - fetch: use `fetch_config` to store "fetch.prune" value
 - fetch: pass through `fetch_config` directly
 - fetch: drop unneeded NULL-check for `remote_ref`
 - fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value

 Code clean-up.

 Will merge to 'next'.
 cf. <20230519002128.GD2442034@coredump.intra.peff.net>
 source: <cover.1684324059.git.ps@pks.im>


* sl/diff-tree-sparse (2023-05-18) 1 commit
  (merged to 'next' on 2023-05-24 at 5d4f2dec4d)
 + diff-tree: integrate with sparse index

 "git diff-tree" has been taught to take advantage of the
 sparse-index feature.

 Will merge to 'master'.
 cf. <2a2b7223-bb5d-65f9-95bb-9be45d329c87@github.com>
 source: <20230518154454.475487-1-cheskaqiqi@gmail.com>


* jk/format-patch-message-id-unleak (2023-05-19) 2 commits
  (merged to 'next' on 2023-05-23 at 44b9e1ab91)
 + format-patch: free elements of rev.ref_message_ids list
 + format-patch: free rev.message_id when exiting

 Leakfix.

 Will merge to 'master'.
 source: <20230519000239.GA1975039@coredump.intra.peff.net>


* jc/test-modernization (2023-05-19) 20 commits
 - t7101-reset-empty-subdirs: modernize test format
 - t6050-replace: modernize test format
 - t5306-pack-nobase: modernize test format
 - t5303-pack-corruption-resilience: modernize test format
 - t5301-sliding-window: modernize test format
 - t5300-pack-object: modernize test format
 - t4206-log-follow-harder-copies: modernize test format
 - t4202-log: modernize test format
 - t4004-diff-rename-symlink: modernize test format
 - t4003-diff-rename-1: modernize test format
 - t4002-diff-basic: modernize test format
 - t3903-stash: modernize test format
 - t3700-add: modernize test format
 - t3500-cherry: modernize test format
 - t1006-cat-file: modernize test format
 - t1002-read-tree-m-u-2way: modernize test format
 - t1001-read-tree-m-2way: modernize test format
 - t3210-pack-refs: modernize test format
 - t0030-stripspace: modernize test format
 - t0000-basic: modernize test format
 (this branch is used by jc/test-modernization-2.)

 Will merge to 'next'.
 source: <pull.1513.git.git.1684440205.gitgitgadget@gmail.com>


* ja/worktree-orphan (2023-05-17) 8 commits
 - worktree add: emit warn when there is a bad HEAD
 - worktree add: extend DWIM to infer --orphan
 - worktree add: introduce "try --orphan" hint
 - worktree add: add --orphan flag
 - t2400: add tests to verify --quiet
 - t2400: refactor "worktree add" opt exclusion tests
 - t2400: cleanup created worktree in test
 - worktree add: include -B in usage docs

 'git worktree add' learned how to create a worktree based on an
 orphaned branch with `--orphan`.

 Will merge to 'next'.
 source: <20230517214711.12467-1-jacobabel@nullpo.dev>


* kh/keep-tag-editmsg-upon-failure (2023-05-16) 3 commits
  (merged to 'next' on 2023-05-19 at fc0fe3173d)
 + tag: keep the message file in case ref transaction fails
 + t/t7004-tag: add regression test for successful tag creation
 + doc: tag: document `TAG_EDITMSG`

 "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the
 command failed, so that the user can salvage what they typed.

 Will merge to 'master'.
 source: <cover.1684258780.git.code@khaugsbakk.name>


* sa/doc-ls-remote (2023-05-19) 6 commits
  (merged to 'next' on 2023-05-20 at d577bf75a0)
 + ls-remote doc: document the output format
 + ls-remote doc: explain what each example does
 + ls-remote doc: show peeled tags in examples
 + ls-remote doc: remove redundant --tags example
 + show-branch doc: say <ref>, not <reference>
 + show-ref doc: update for internal consistency

 Doc update.

 Will merge to 'master'.
 source: <pull.1471.v4.git.git.1684469874.gitgitgadget@gmail.com>


* tb/refs-exclusion-and-packed-refs (2023-06-12) 16 commits
 - ls-refs.c: avoid enumerating hidden refs where possible
 - upload-pack.c: avoid enumerating hidden refs where possible
 - builtin/receive-pack.c: avoid enumerating hidden references
 - refs.h: let `for_each_namespaced_ref()` take excluded patterns
 - refs/packed-backend.c: ignore complicated hidden refs rules
 - revision.h: store hidden refs in a `strvec`
 - refs/packed-backend.c: add trace2 counters for jump list
 - refs/packed-backend.c: implement jump lists to avoid excluded pattern(s)
 - refs/packed-backend.c: refactor `find_reference_location()`
 - refs: plumb `exclude_patterns` argument throughout
 - builtin/for-each-ref.c: add `--exclude` option
 - ref-filter.c: parameterize match functions over patterns
 - ref-filter: add `ref_filter_clear()`
 - ref-filter: clear reachable list pointers after freeing
 - ref-filter.h: provide `REF_FILTER_INIT`
 - refs.c: rename `ref_filter`

 Enumerating refs in the packed-refs file, while excluding refs that
 match certain patterns, has been optimized.

 source: <cover.1686134440.git.me@ttaylorr.com>


* zh/ls-files-format-atoms (2023-05-23) 1 commit
  (merged to 'next' on 2023-05-24 at 116b11effb)
 + ls-files: align format atoms with ls-tree

 Some atoms that can be used in "--format=<format>" for "git ls-tree"
 were not supported by "git ls-files", even though they were relevant
 in the context of the latter.

 Will merge to 'master'.
 source: <pull.1533.v2.git.1684832418299.gitgitgadget@gmail.com>


* en/header-split-cache-h-part-3 (2023-05-16) 29 commits
 - fsmonitor-ll.h: split this header out of fsmonitor.h
 - hash-ll, hashmap: move oidhash() to hash-ll
 - object-store-ll.h: split this header out of object-store.h
 - khash: name the structs that khash declares
 - merge-ll: rename from ll-merge
 - git-compat-util.h: remove unneccessary include of wildmatch.h
 - builtin.h: remove unneccessary includes
 - list-objects-filter-options.h: remove unneccessary include
 - diff.h: remove unnecessary include of oidset.h
 - repository: remove unnecessary include of path.h
 - log-tree: replace include of revision.h with simple forward declaration
 - cache.h: remove this no-longer-used header
 - read-cache*.h: move declarations for read-cache.c functions from cache.h
 - repository.h: move declaration of the_index from cache.h
 - merge.h: move declarations for merge.c from cache.h
 - diff.h: move declaration for global in diff.c from cache.h
 - preload-index.h: move declarations for preload-index.c from elsewhere
 - sparse-index.h: move declarations for sparse-index.c from cache.h
 - name-hash.h: move declarations for name-hash.c from cache.h
 - run-command.h: move declarations for run-command.c from cache.h
 - statinfo: move stat_{data,validity} functions from cache/read-cache
 - read-cache: move shared add/checkout/commit code
 - add: modify add_files_to_cache() to avoid globals
 - read-cache: move shared commit and ls-files code
 - setup: adopt shared init-db & clone code
 - init-db, clone: change unnecessary global into passed parameter
 - init-db: remove unnecessary global variable
 - init-db: document existing bug with core.bare in template config
 - Merge branch 'en/header-split-cache-h-part-2' into en/header-split-cache-h-part-3

 Header files cleanup.

 Will merge to 'next'.
 source: <pull.1525.v3.git.1684218848.gitgitgadget@gmail.com>


* la/doc-interpret-trailers (2023-06-12) 9 commits
 - doc: trailer: add more examples in DESCRIPTION
 - doc: trailer: mention 'key' in DESCRIPTION
 - doc: trailer.<token>.command: emphasize deprecation
 - doc: trailer: use angle brackets for <token> and <value>
 - doc: trailer: remove redundant phrasing
 - doc: trailer: examples: avoid the word "message" by itself
 - doc: trailer: drop "commit message part" phrasing
 - doc: trailer: swap verb order
 - doc: trailer: fix grammar

 Doc update.

 Will merge to 'next'.
 source: <pull.1506.v3.git.git.1686017304.gitgitgadget@gmail.com>


* cc/git-replay (2023-06-03) 15 commits
 - replay: stop assuming replayed branches do not diverge
 - replay: add --contained to rebase contained branches
 - replay: add --advance or 'cherry-pick' mode
 - replay: disallow revision specific options and pathspecs
 - replay: use standard revision ranges
 - replay: make it a minimal server side command
 - replay: remove HEAD related sanity check
 - replay: remove progress and info output
 - replay: add an important FIXME comment about gpg signing
 - replay: don't simplify history
 - replay: introduce pick_regular_commit()
 - replay: die() instead of failing assert()
 - replay: start using parse_options API
 - replay: introduce new builtin
 - t6429: remove switching aspects of fast-rebase

 source: <20230602102533.876905-1-christian.couder@gmail.com>


* jc/pack-ref-exclude-include (2023-05-12) 3 commits
  (merged to 'next' on 2023-05-23 at 37333a2d00)
 + pack-refs: teach pack-refs --include option
 + pack-refs: teach --exclude option to exclude refs from being packed
 + docs: clarify git-pack-refs --all will pack all refs

 "git pack-refs" learns "--include" and "--exclude" to tweak the ref
 hierarchy to be packed using pattern matching.

 Will merge to 'master'.
 source: <pull.1501.v4.git.git.1683927282.gitgitgadget@gmail.com>


* tb/gc-recent-object-hook (2023-06-12) 2 commits
 - gc: introduce `gc.recentObjectsHook`
 - reachable.c: extract `obj_is_recent()`

 "git pack-objects" learned to invoke a new hook program that
 enumerates extra objects to be used as anchoring points to keep
 otherwise unreachable objects in cruft packs.

 Will merge to 'next'.
 source: <cover.1686178684.git.me@ttaylorr.com>


* jc/diff-s-with-other-options (2023-05-05) 1 commit
  (merged to 'next' on 2023-05-20 at dda3826a68)
 + diff: fix interaction between the "-s" option and other options

 The "-s" (silent, squelch) option of the "diff" family of commands
 did not interact with other options that specify the output format
 well.  This has been cleaned up so that it will clear all the
 formatting options given before.

 Will merge to 'master'.
 source: <20230505165952.335256-1-gitster@pobox.com>


* ob/revert-of-revert (2023-05-05) 1 commit
 - sequencer: beautify subject of reverts of reverts

 Instead of "Revert "Revert "original"", give "Reapply "original""
 as the title for a revert of a revert.

 Expecting a hopefully final reroll.
 Looking much better, except for minor cosmetic issues.
 source: <20230428083528.1699221-1-oswald.buddenhagen@gmx.de>


* cw/strbuf-cleanup (2023-06-12) 7 commits
 - strbuf: remove global variable
 - path: move related function to path
 - object-name: move related functions to object-name
 - credential-store: move related functions to credential-store file
 - abspath: move related functions to abspath
 - strbuf: clarify dependency
 - strbuf: clarify API boundary

 Move functions that are not about pure string manipulation out of
 strbuf.[ch]

 source: <20230606194720.2053551-1-calvinwan@google.com>


* tl/notes-separator (2023-04-28) 6 commits
  (merged to 'next' on 2023-05-06 at 598ed19c9b)
 + notes.c: introduce "--[no-]stripspace" option
 + notes.c: append separator instead of insert by pos
 + notes.c: introduce '--separator=<paragraph-break>' option
 + t3321: add test cases about the notes stripspace behavior
 + notes.c: use designated initializers for clarity
 + notes.c: cleanup 'strbuf_grow' call in 'append_edit'

 'git notes append' was taught '--separator' to specify string to insert
 between paragraphs.

 On hold.
 source: <cover.1682671758.git.dyroneteng@gmail.com>


* pw/rebase-i-after-failure (2023-04-21) 6 commits
 - rebase -i: fix adding failed command to the todo list
 - rebase: fix rewritten list for failed pick
 - rebase --continue: refuse to commit after failed command
 - sequencer: factor out part of pick_commits()
 - rebase -i: remove patch file after conflict resolution
 - rebase -i: move unlink() calls

 Various fixes to the behaviour of "rebase -i" when the command got
 interrupted by conflicting changes.

 Expecting a reroll.
 cf. <xmqqsfcthrpb.fsf@gitster.g>
 cf. <1fd54422-b66a-c2e4-7cd7-934ea01190ad@gmail.com>
 source: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>


* tb/pack-bitmap-traversal-with-boundary (2023-05-08) 3 commits
 - pack-bitmap.c: use commit boundary during bitmap traversal
 - pack-bitmap.c: extract `fill_in_bitmap()`
 - object: add object_array initializer helper function
 (this branch is used by ds/disable-replace-refs.)

 The object traversal using reachability bitmap done by
 "pack-object" has been tweaked to take advantage of the fact that
 using "boundary" commits as representative of all the uninteresting
 ones can save quite a lot of object enumeration.

 Will merge to 'next'.
 source: <cover.1683567065.git.me@ttaylorr.com>


* gc/doc-cocci-updates (2023-04-27) 2 commits
  (merged to 'next' on 2023-05-20 at 3fe237c1a8)
 + cocci: codify authoring and reviewing practices
 + cocci: add headings to and reword README

 Update documentation regarding Coccinelle patches.

 Will merge to 'master'.
 source: <pull.1495.v2.git.git.1682634143.gitgitgadget@gmail.com>


* pb/complete-and-document-auto-merge-and-friends (2023-05-23) 6 commits
 - completion: complete AUTO_MERGE
 - Documentation: document AUTO_MERGE
 - git-merge.txt: modernize word choice in "True merge" section
 - completion: complete REVERT_HEAD and BISECT_HEAD
 - revisions.txt: document more special refs
 - revisions.txt: use description list for special refs

 Document more pseudo-refs and teach the command line completion
 machinery to complete AUTO_MERGE.

 Will merge to 'next'.
 source: <pull.1515.v2.git.1684783741.gitgitgadget@gmail.com>


* mh/credential-password-expiry-libsecret (2023-05-05) 1 commit
  (merged to 'next' on 2023-05-09 at fd898e3756)
 + credential/libsecret: support password_expiry_utc

 The libsecret credential helper learns to handle the password
 expiry time information.

 On hold.
 The database gets littered with entries whose expiration dates only differ.
 cf. <CAGJzqskMwOJkriH6serqdwAVYi+fftEL8ohJd-suP6v+OxB_bg@mail.gmail.com>
 source: <pull.1469.v3.git.git.1683270298313.gitgitgadget@gmail.com>

--------------------------------------------------
[Discarded]

* tc/cat-file-z-use-cquote (2023-05-10) 1 commit
 . cat-file: quote-format name in error when using -z

 "cat-file" in the batch mode that is fed NUL-terminated pathnames
 learned to cquote them in its error output (otherwise, a funny
 pathname with LF in it would break the lines in the output stream).

 Superseded by the ps/cat-file-null-output topic.
 source: <20230510190116.795641-2-toon@iotcl.com>

^ permalink raw reply	[relevance 2%]

* Re: [PATCH] Use lowercase includes for some Windows headers
  2023-06-04 21:19  5% [PATCH] Use lowercase includes for some Windows headers Mike Hommey
@ 2023-06-12 19:30  5% ` Junio C Hamano
  2023-07-14 17:07  0%   ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-06-12 19:30 UTC (permalink / raw)
  To: Mike Hommey; +Cc: git, Johannes Schindelin, Jeff Hostetler, Johannes Sixt

Mike Hommey <mh@glandium.org> writes:

> When cross-compiling with the mingw toolchain on a system with a case
> sensitive filesystem, the mixed case (which is technically correct as
> per the contents of MS Visual C++) doesn't work (the corresponding mingw
> headers are all lowercase for some reason).
>
> Signed-off-by: Mike Hommey <mh@glandium.org>
> ---
>  compat/win32/trace2_win32_process_info.c | 4 ++--
>  wrapper.c                                | 2 +-
>  2 files changed, 3 insertions(+), 3 deletions(-)

I can guess that this will not break the primary target audience of
the source, who build from the source on case insensitive
filesystems.  The only possible breakage I can think of is if
different versions of mingw toolchain have these header files in
different cases---those who have been happily using header files
like <tlHelp32.h> on their case sensitive filesystem now will find
their build to fail.  Theoretically, those who _corrected_ their
header files to mixed case themselves (as it is "technically correct
as per the contents of MS Visual C++") will be broken the same way,
but they should be capable of diagnosing and recovering from such a
breakage, so I'm not worried about that.

Appreciate input from those who builds with mingw toolchain, but in
the meantime let me queue it on 'seen' so that we won't forget.

Thanks.





> diff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c
> index a4e33768f4..438af8f818 100644
> --- a/compat/win32/trace2_win32_process_info.c
> +++ b/compat/win32/trace2_win32_process_info.c
> @@ -3,8 +3,8 @@
>  #include "../../repository.h"
>  #include "../../trace2.h"
>  #include "lazyload.h"
> -#include <Psapi.h>
> -#include <tlHelp32.h>
> +#include <psapi.h>
> +#include <tlhelp32.h>
>  
>  /*
>   * An arbitrarily chosen value to limit the size of the ancestor
> diff --git a/wrapper.c b/wrapper.c
> index 67f5f5dbe1..5dc48e815a 100644
> --- a/wrapper.c
> +++ b/wrapper.c
> @@ -17,7 +17,7 @@ static intmax_t count_fsync_hardware_flush;
>  #ifdef HAVE_RTLGENRANDOM
>  /* This is required to get access to RtlGenRandom. */
>  #define SystemFunction036 NTAPI SystemFunction036
> -#include <NTSecAPI.h>
> +#include <ntsecapi.h>
>  #undef SystemFunction036
>  #endif

^ permalink raw reply	[relevance 5%]

* [PATCH] Use lowercase includes for some Windows headers
@ 2023-06-04 21:19  5% Mike Hommey
  2023-06-12 19:30  5% ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Mike Hommey @ 2023-06-04 21:19 UTC (permalink / raw)
  To: git; +Cc: Johannes Schindelin, Mike Hommey

When cross-compiling with the mingw toolchain on a system with a case
sensitive filesystem, the mixed case (which is technically correct as
per the contents of MS Visual C++) doesn't work (the corresponding mingw
headers are all lowercase for some reason).

Signed-off-by: Mike Hommey <mh@glandium.org>
---
 compat/win32/trace2_win32_process_info.c | 4 ++--
 wrapper.c                                | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c
index a4e33768f4..438af8f818 100644
--- a/compat/win32/trace2_win32_process_info.c
+++ b/compat/win32/trace2_win32_process_info.c
@@ -3,8 +3,8 @@
 #include "../../repository.h"
 #include "../../trace2.h"
 #include "lazyload.h"
-#include <Psapi.h>
-#include <tlHelp32.h>
+#include <psapi.h>
+#include <tlhelp32.h>
 
 /*
  * An arbitrarily chosen value to limit the size of the ancestor
diff --git a/wrapper.c b/wrapper.c
index 67f5f5dbe1..5dc48e815a 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -17,7 +17,7 @@ static intmax_t count_fsync_hardware_flush;
 #ifdef HAVE_RTLGENRANDOM
 /* This is required to get access to RtlGenRandom. */
 #define SystemFunction036 NTAPI SystemFunction036
-#include <NTSecAPI.h>
+#include <ntsecapi.h>
 #undef SystemFunction036
 #endif
 
-- 
2.41.0.6.ge371d37104


^ permalink raw reply related	[relevance 5%]

* [PATCH v3 3/3] apply: support case-only renames in case-insensitive filesystems
  2023-05-28  9:59  4%   ` [PATCH v3 0/3] " Tao Klerks via GitGitGadget
  2023-05-28  9:59  5%     ` [PATCH v3 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
@ 2023-05-28  9:59 11%     ` Tao Klerks via GitGitGadget
  1 sibling, 0 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2023-05-28  9:59 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Junio C Hamano, Johannes Schindelin, Tao Klerks,
	Tao Klerks

From: Tao Klerks <tao@klerks.biz>

"git apply" checks, when validating a patch, to ensure that any files
being added aren't already in the worktree.

When this check runs on a case-only rename, in a case-insensitive
filesystem, this leads to a false positive - the command fails with an
error like:
error: File1: already exists in working directory

There is a mechanism to ensure that "seemingly conflicting" files are
handled correctly - for example overlapping rename pairs or swaps -
this mechanism treats renames as add/remove pairs, and would end up
treating a case-only rename as a "self-swap"... Except it does not
account for case-insensitive filesystems yet.

Because the index is inherently case-sensitive even on a
case-insensitive filesystem, we actually need this mechanism to
handle both requirements, lest we fail to account for conflicting
files only in the index.

Fix the "rename chain" existence exemption mechanism to account for
case-insensitive config, fixing case-only-rename-handling as a
"self-swap" and also fixing less-common "case-insensitive rename
pairs" when config core.ignorecase is set, but keep the index checks
file-sensitive.

Also add test cases around these behaviors - verifying that conflicting
file conditions are still caught correctly, including case-only
conflicts on case-sensitive filesystems, and edge cases around
case-sensitive index behaviors on a case-insensitive filesystem.

Signed-off-by: Tao Klerks <tao@klerks.biz>
---
 apply.c                |  81 ++++++++++++++++------
 apply.h                |   5 +-
 t/t4142-apply-icase.sh | 154 +++++++++++++++++++++++++++++++++++++----
 3 files changed, 207 insertions(+), 33 deletions(-)

diff --git a/apply.c b/apply.c
index 6212ab3a1b3..a2e2f6b531d 100644
--- a/apply.c
+++ b/apply.c
@@ -113,7 +113,9 @@ int init_apply_state(struct apply_state *state,
 	state->ws_error_action = warn_on_ws_error;
 	state->ws_ignore_action = ignore_ws_none;
 	state->linenr = 1;
-	string_list_init_nodup(&state->fn_table);
+	string_list_init_nodup(&state->fs_fn_table);
+	state->fs_fn_table.cmp = fspathcmp;
+	string_list_init_nodup(&state->index_fn_table);
 	string_list_init_nodup(&state->limit_by_name);
 	strset_init(&state->removed_symlinks);
 	strset_init(&state->kept_symlinks);
@@ -134,7 +136,10 @@ void clear_apply_state(struct apply_state *state)
 	strset_clear(&state->kept_symlinks);
 	strbuf_release(&state->root);
 
-	/* &state->fn_table is cleared at the end of apply_patch() */
+	/*
+	 * &state->fs_fn_table and &state->index_fn_table are cleared at the
+	 * end of apply_patch()
+	 */
 }
 
 static void mute_routine(const char *msg UNUSED, va_list params UNUSED)
@@ -3294,14 +3299,28 @@ static int read_file_or_gitlink(const struct cache_entry *ce, struct strbuf *buf
 	return read_blob_object(buf, &ce->oid, ce->ce_mode);
 }
 
-static struct patch *in_fn_table(struct apply_state *state, const char *name)
+static struct patch *in_fs_fn_table(struct apply_state *state, const char *name)
 {
 	struct string_list_item *item;
 
 	if (!name)
 		return NULL;
 
-	item = string_list_lookup(&state->fn_table, name);
+	item = string_list_lookup(&state->fs_fn_table, name);
+	if (item)
+		return (struct patch *)item->util;
+
+	return NULL;
+}
+
+static struct patch *in_index_fn_table(struct apply_state *state, const char *name)
+{
+	struct string_list_item *item;
+
+	if (!name)
+		return NULL;
+
+	item = string_list_lookup(&state->index_fn_table, name);
 	if (item)
 		return (struct patch *)item->util;
 
@@ -3333,7 +3352,7 @@ static int was_deleted(struct patch *patch)
 	return patch == PATH_WAS_DELETED;
 }
 
-static void add_to_fn_table(struct apply_state *state, struct patch *patch)
+static void add_to_fn_tables(struct apply_state *state, struct patch *patch)
 {
 	struct string_list_item *item;
 
@@ -3343,7 +3362,9 @@ static void add_to_fn_table(struct apply_state *state, struct patch *patch)
 	 * file creations and copies
 	 */
 	if (patch->new_name) {
-		item = string_list_insert(&state->fn_table, patch->new_name);
+		item = string_list_insert(&state->fs_fn_table, patch->new_name);
+		item->util = patch;
+		item = string_list_insert(&state->index_fn_table, patch->new_name);
 		item->util = patch;
 	}
 
@@ -3352,7 +3373,9 @@ static void add_to_fn_table(struct apply_state *state, struct patch *patch)
 	 * later chunks shouldn't patch old names
 	 */
 	if ((patch->new_name == NULL) || (patch->is_rename)) {
-		item = string_list_insert(&state->fn_table, patch->old_name);
+		item = string_list_insert(&state->fs_fn_table, patch->old_name);
+		item->util = PATH_WAS_DELETED;
+		item = string_list_insert(&state->index_fn_table, patch->old_name);
 		item->util = PATH_WAS_DELETED;
 	}
 }
@@ -3365,7 +3388,9 @@ static void prepare_fn_table(struct apply_state *state, struct patch *patch)
 	while (patch) {
 		if ((patch->new_name == NULL) || (patch->is_rename)) {
 			struct string_list_item *item;
-			item = string_list_insert(&state->fn_table, patch->old_name);
+			item = string_list_insert(&state->fs_fn_table, patch->old_name);
+			item->util = PATH_TO_BE_DELETED;
+			item = string_list_insert(&state->index_fn_table, patch->old_name);
 			item->util = PATH_TO_BE_DELETED;
 		}
 		patch = patch->next;
@@ -3395,7 +3420,7 @@ static struct patch *previous_patch(struct apply_state *state,
 	if (patch->is_copy || patch->is_rename)
 		return NULL; /* "git" patches do not depend on the order */
 
-	previous = in_fn_table(state, patch->old_name);
+	previous = in_index_fn_table(state, patch->old_name);
 	if (!previous)
 		return NULL;
 
@@ -3706,7 +3731,7 @@ static int apply_data(struct apply_state *state, struct patch *patch,
 	}
 	patch->result = image.buf;
 	patch->resultsize = image.len;
-	add_to_fn_table(state, patch);
+	add_to_fn_tables(state, patch);
 	free(image.line_allocated);
 
 	if (0 < patch->is_delete && patch->resultsize)
@@ -3805,11 +3830,12 @@ static int check_preimage(struct apply_state *state,
 
 static int check_to_create(struct apply_state *state,
 			   const char *new_name,
-			   int ok_if_exists)
+			   int ok_if_exists_in_fs,
+			   int ok_if_exists_in_index)
 {
 	struct stat nst;
 
-	if (state->check_index && (!ok_if_exists || !state->cached)) {
+	if (state->check_index && (!ok_if_exists_in_index || !state->cached)) {
 		int pos;
 
 		pos = index_name_pos(state->repo->index, new_name, strlen(new_name));
@@ -3817,7 +3843,7 @@ static int check_to_create(struct apply_state *state,
 			struct cache_entry *ce = state->repo->index->cache[pos];
 
 			/* allow ITA, as they do not yet exist in the index */
-			if (!ok_if_exists && !(ce->ce_flags & CE_INTENT_TO_ADD))
+			if (!ok_if_exists_in_index && !(ce->ce_flags & CE_INTENT_TO_ADD))
 				return EXISTS_IN_INDEX;
 
 			/* ITA entries can never match working tree files */
@@ -3830,7 +3856,7 @@ static int check_to_create(struct apply_state *state,
 		return 0;
 
 	if (!lstat(new_name, &nst)) {
-		if (S_ISDIR(nst.st_mode) || ok_if_exists)
+		if (S_ISDIR(nst.st_mode) || ok_if_exists_in_fs)
 			return 0;
 		/*
 		 * A leading component of new_name might be a symlink
@@ -3940,7 +3966,8 @@ static int check_patch(struct apply_state *state, struct patch *patch)
 	const char *name = old_name ? old_name : new_name;
 	struct cache_entry *ce = NULL;
 	struct patch *tpatch;
-	int ok_if_exists;
+	int ok_if_exists_in_fs;
+	int ok_if_exists_in_index;
 	int status;
 
 	patch->rejected = 1; /* we will drop this after we succeed */
@@ -3963,16 +3990,29 @@ static int check_patch(struct apply_state *state, struct patch *patch)
 	 * B; ask to_be_deleted() about the later rename.  Removal of
 	 * B and rename from A to B is handled the same way by asking
 	 * was_deleted().
+	 *
+	 * These exemptions account for the core.ignorecase config -
+	 * a file that differs only by case is also considered "deleted"
+	 * if git is configured to ignore case. This means a case-only
+	 * rename, in a case-insensitive filesystem, is treated here as
+	 * a "self-swap" or mode change.
 	 */
-	if ((tpatch = in_fn_table(state, new_name)) &&
+	if ((tpatch = in_fs_fn_table(state, new_name)) &&
+	    (was_deleted(tpatch) || to_be_deleted(tpatch)))
+		ok_if_exists_in_fs = 1;
+	else
+		ok_if_exists_in_fs = 0;
+
+	if ((tpatch = in_index_fn_table(state, new_name)) &&
 	    (was_deleted(tpatch) || to_be_deleted(tpatch)))
-		ok_if_exists = 1;
+		ok_if_exists_in_index = 1;
 	else
-		ok_if_exists = 0;
+		ok_if_exists_in_index = 0;
 
 	if (new_name &&
 	    ((0 < patch->is_new) || patch->is_rename || patch->is_copy)) {
-		int err = check_to_create(state, new_name, ok_if_exists);
+		int err = check_to_create(state, new_name, ok_if_exists_in_fs,
+					  ok_if_exists_in_index);
 
 		if (err && state->threeway) {
 			patch->direct_to_threeway = 1;
@@ -4870,7 +4910,8 @@ static int apply_patch(struct apply_state *state,
 end:
 	free_patch_list(list);
 	strbuf_release(&buf);
-	string_list_clear(&state->fn_table, 0);
+	string_list_clear(&state->fs_fn_table, 0);
+	string_list_clear(&state->index_fn_table, 0);
 	return res;
 }
 
diff --git a/apply.h b/apply.h
index 7cd38b1443c..a1419672507 100644
--- a/apply.h
+++ b/apply.h
@@ -95,8 +95,11 @@ struct apply_state {
 	/*
 	 * Records filenames that have been touched, in order to handle
 	 * the case where more than one patches touch the same file.
+	 * Two separate structures because with ignorecase, one of them
+	 * needs to be case-insensitive and the other not.
 	 */
-	struct string_list fn_table;
+	struct string_list fs_fn_table;
+	struct string_list index_fn_table;
 
 	/*
 	 * This is to save reporting routines before using
diff --git a/t/t4142-apply-icase.sh b/t/t4142-apply-icase.sh
index 17eb023a437..1c785133d16 100755
--- a/t/t4142-apply-icase.sh
+++ b/t/t4142-apply-icase.sh
@@ -30,7 +30,16 @@ test_expect_success setup '
        git diff HEAD HEAD^ -- file1 >deletion-patch &&
        git diff --cached HEAD -- file1 file2 >rename-file1-to-file2-patch &&
        git diff --cached HEAD -- file1 File1 >rename-file1-to-File1-patch &&
-       git diff --cached HEAD -- file0 >modify-file0-patch
+       git diff --cached HEAD -- file0 >modify-file0-patch &&
+
+       # then set up for swap
+       git reset --hard current &&
+       test_commit "swappable" file3 "different content for file3" swappable &&
+       file3blob=$(git rev-parse :file3) &&
+       git rm --cached file1 file3 &&
+       git update-index --add --cacheinfo 100644,$file1blob,File3 &&
+       git update-index --add --cacheinfo 100644,$file3blob,File1 &&
+       git diff --cached HEAD -- file1 file3 File1 File3 >swap-file1-and-file3-to-File3-and-File1-patch
 '
 
 # Basic creation, deletion, modification and renaming.
@@ -53,7 +62,7 @@ test_expect_success 'creation and deletion' '
        test_must_fail git rev-parse --verify :file1
 '
 
-test_expect_success 'modificaiton' '
+test_expect_success 'modification (index-only)' '
        # start at "initial" with file0 only
        git reset --hard initial &&
 
@@ -70,7 +79,7 @@ test_expect_success 'modificaiton' '
        test_cmp_rev :file0 "$file0blob"
 '
 
-test_expect_success 'rename file1 to file2' '
+test_expect_success 'rename file1 to file2 (index-only)' '
        # start from file0 and file1
        git reset --hard current &&
 
@@ -91,7 +100,7 @@ test_expect_success 'rename file1 to file2' '
        test_cmp_rev :file1 "$file1blob"
 '
 
-test_expect_success 'rename file1 to file2' '
+test_expect_success 'rename file1 to File1 (index-only)' '
        # start from file0 and file1
        git reset --hard current &&
 
@@ -112,17 +121,138 @@ test_expect_success 'rename file1 to file2' '
        test_cmp_rev :file1 "$file1blob"
 '
 
-# We may want to add tests with working tree here, without "--cached" and
-# with and without "--index" here.  For example, should modify-file0-patch
-# apply cleanly if we have File0 with $file0blob in the index and the working
-# tree if core.icase is set?
+# involve filesystem on renames
+test_expect_success 'rename file1 to File1 (with ignorecase, working tree)' '
+       # start from file0 and file1
+       git reset --hard current &&
+
+       # do the same with ignorecase
+       git -c core.ignorecase=true apply --index rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_cmp_rev :File1 "$file1blob" &&
+       git -c core.ignorecase=true apply --index -R rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :File1 &&
+       test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success CASE_INSENSITIVE_FS 'rename file1 to File1 (without ignorecase, case-insensitive FS)' '
+       # start from file0 and file1
+       git reset --hard current &&
+
+       # rename file1 to File1 without ignorecase (fails as expected)
+       test_must_fail git -c core.ignorecase=false apply --index rename-file1-to-File1-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success !CASE_INSENSITIVE_FS 'rename file1 to File1 (without ignorecase, case-sensitive FS)' '
+       # start from file0 and file1
+       git reset --hard current &&
+
+       # rename file1 to File1 without ignorecase
+       git -c core.ignorecase=false apply --index rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_cmp_rev :File1 "$file1blob" &&
+       git -c core.ignorecase=false apply --index -R rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :File1 &&
+       test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success 'rename file1 to file2 with working tree conflict' '
+       # start from file0 and file1, and file2 untracked
+       git reset --hard current &&
+       test_when_finished "rm file2" &&
+       touch file2 &&
+
+       # rename file1 to file2 with conflict
+       test_must_fail git -c core.ignorecase=false apply --index rename-file1-to-file2-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
 
-test_expect_success CASE_INSENSITIVE_FS 'a test only for icase fs' '
-       : sample
+       # do the same with ignorecase
+       test_must_fail git -c core.ignorecase=true apply --index rename-file1-to-file2-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob"
 '
 
-test_expect_success !CASE_INSENSITIVE_FS 'a test only for !icase fs' '
-       : sample
+test_expect_success 'rename file1 to file2 with case-insensitive conflict (index-only - ignorecase disabled)' '
+       # start from file0 and file1, and File2 in index
+       git reset --hard current &&
+       git update-index --add --cacheinfo 100644,$file3blob,File2 &&
+
+       # rename file1 to file2 without ignorecase
+       git -c core.ignorecase=false apply --cached rename-file1-to-file2-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_cmp_rev :file2 "$file1blob" &&
+       git -c core.ignorecase=false apply --cached -R rename-file1-to-file2-patch &&
+       test_must_fail git rev-parse --verify :file2 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File2 "$file3blob"
+'
+
+test_expect_failure 'rename file1 to file2 with case-insensitive conflict (index-only - ignorecase enabled)' '
+       # start from file0 and file1, and File2 in index
+       git reset --hard current &&
+       git update-index --add --cacheinfo 100644,$file3blob,File2 &&
+
+       # rename file1 to file2 with ignorecase, with a "File2" conflicting file in place - expect failure.
+       # instead of failure, we get success with "File1" and "file1" both existing in the index, despite
+       # the ignorecase configuration.
+       test_must_fail git -c core.ignorecase=true apply --cached rename-file1-to-file2-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File2 "$file3blob"
+'
+
+test_expect_success 'rename file1 to File1 with case-sensitive conflict (index-only)' '
+       # start from file0 and file1, and File1 in index
+       git reset --hard current &&
+       git update-index --add --cacheinfo 100644,$file3blob,File1 &&
+
+       # On a case-insensitive filesystem with core.ignorecase on, a single git
+       # "reset --hard" will actually leave things wrong because of the
+       # index-to-working-tree discrepancy - see "reset --hard handles
+       # index-only case-insensitive duplicate" under t7104-reset-hard.sh.
+       # We are creating this unexpected state, so we should explicitly queue
+       # an extra reset. If reset ever starts to handle this case, this will
+       # become unnecessary but also not harmful.
+       test_when_finished "git reset --hard" &&
+
+       # rename file1 to File1 when File1 is already in index (fails with conflict)
+       test_must_fail git -c core.ignorecase=false apply --cached rename-file1-to-File1-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File1 "$file3blob" &&
+
+       # do the same with ignorecase
+       test_must_fail git -c core.ignorecase=true apply --cached rename-file1-to-File1-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File1 "$file3blob"
+'
+
+test_expect_success CASE_INSENSITIVE_FS 'case-insensitive swap - file1 to File2 and file2 to File1 (working tree)' '
+       # start from file0, file1, and file3
+       git reset --hard swappable &&
+
+       # "swap" file1 and file3 to case-insensitive versions without ignorecase on case-insensitive FS (fails as expected)
+       test_must_fail git -c core.ignorecase=false apply --index swap-file1-and-file3-to-File3-and-File1-patch &&
+       git rev-parse --verify :file1 &&
+       git rev-parse --verify :file3 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :file3 "$file3blob" &&
+
+       # do the same with ignorecase
+       git -c core.ignorecase=true apply --index swap-file1-and-file3-to-File3-and-File1-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_must_fail git rev-parse --verify :file3 &&
+       test_cmp_rev :File3 "$file1blob" &&
+       test_cmp_rev :File1 "$file3blob" &&
+       git -c core.ignorecase=true apply --index -R swap-file1-and-file3-to-File3-and-File1-patch &&
+       test_must_fail git rev-parse --verify :File1 &&
+       test_must_fail git rev-parse --verify :File3 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :file3 "$file3blob"
 '
 
 test_done
-- 
gitgitgadget

^ permalink raw reply related	[relevance 11%]

* [PATCH v3 2/3] reset: new failing test for reset of case-insensitive duplicate in index
  2023-05-28  9:59  4%   ` [PATCH v3 0/3] " Tao Klerks via GitGitGadget
@ 2023-05-28  9:59  5%     ` Tao Klerks via GitGitGadget
  2023-05-28  9:59 11%     ` [PATCH v3 3/3] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
  1 sibling, 0 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2023-05-28  9:59 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Junio C Hamano, Johannes Schindelin, Tao Klerks,
	Tao Klerks

From: Tao Klerks <tao@klerks.biz>

On case-insensitive filesystems, where core.ignorecase is normally set,
the index is still case-sensitive, and surprising outcomes are possible
when the index contains states that cannot be represented on the file
system.

Add an "expect_failure" test to illustrate one such situation, where two
files differing only in case are in the index, and a "reset --hard" ends
up creating an unexpected worktree change.

Signed-off-by: Tao Klerks <tao@klerks.biz>
---
 t/t7104-reset-hard.sh | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/t/t7104-reset-hard.sh b/t/t7104-reset-hard.sh
index cf9697eba9a..55050ac831e 100755
--- a/t/t7104-reset-hard.sh
+++ b/t/t7104-reset-hard.sh
@@ -44,4 +44,15 @@ test_expect_success 'reset --hard did not corrupt index or cache-tree' '
 
 '
 
+test_expect_failure CASE_INSENSITIVE_FS 'reset --hard handles index-only case-insensitive duplicate' '
+	test_commit "initial" file1 "initial commit with file1" initial &&
+	file1blob=$(git rev-parse :file1) &&
+	git update-index --add --cacheinfo 100644,$file1blob,File1 &&
+
+	# reset --hard accidentally leaves the working tree with a deleted file.
+	git reset --hard &&
+	git status --porcelain -uno >wt_changes_remaining &&
+	test_must_be_empty wt_changes_remaining
+'
+
 test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 5%]

* [PATCH v3 0/3] apply: support case-only renames in case-insensitive filesystems
  2022-06-19 16:10  6% ` [PATCH v2 0/3] RFC: " Tao Klerks via GitGitGadget
                     ` (2 preceding siblings ...)
  2022-10-10  4:09  0%   ` [PATCH v2 0/3] RFC: " Tao Klerks
@ 2023-05-28  9:59  4%   ` Tao Klerks via GitGitGadget
  2023-05-28  9:59  5%     ` [PATCH v3 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
  2023-05-28  9:59 11%     ` [PATCH v3 3/3] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
  3 siblings, 2 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2023-05-28  9:59 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Junio C Hamano, Johannes Schindelin, Tao Klerks

As suggested almost a year ago in thread
CAPMMpojwV+f=z9sgc_GaUOTFBCUVdbrGW8WjatWWmC3WTcsoXw@mail.gmail.com,
proposing a fix to git-apply for case-only renames on case-insensitive
filesystems.

Changes in V3:

 * Rebased onto recent main
 * Renumbered now-duplicate-number test t4141 to t4142
 * Removed "RFC" prefix to officially submit; I don't see a better
   direction, and haven't received any corresponding feedback

As mentioned in V2, I'm not super-happy with the duplication of filename
tracking tables, but I do think this bug needs to be fixed, and I don't see
any other way to do so. The fundamental rule this change implements is that
filesystem filename duplication checks should respect the core.ignorecase
option, but index filename duplication checks should not.

Junio C Hamano (1):
  t4142: test "git apply" with core.ignorecase

Tao Klerks (2):
  reset: new failing test for reset of case-insensitive duplicate in
    index
  apply: support case-only renames in case-insensitive filesystems

 apply.c                |  81 +++++++++----
 apply.h                |   5 +-
 t/t4142-apply-icase.sh | 258 +++++++++++++++++++++++++++++++++++++++++
 t/t7104-reset-hard.sh  |  11 ++
 4 files changed, 334 insertions(+), 21 deletions(-)
 create mode 100755 t/t4142-apply-icase.sh


base-commit: 4a714b37029a4b63dbd22f7d7ed81f7a0d693680
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1257%2FTaoK%2Ftao-apply-case-insensitive-renames-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1257/TaoK/tao-apply-case-insensitive-renames-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1257

Range-diff vs v2:

 1:  efd3bd4cdda ! 1:  8ad60943c66 t4141: test "git apply" with core.ignorecase
     @@ Metadata
      Author: Junio C Hamano <gitster@pobox.com>
      
       ## Commit message ##
     -    t4141: test "git apply" with core.ignorecase
     +    t4142: test "git apply" with core.ignorecase
      
          Signed-off-by: Junio C Hamano <gitster@pobox.com>
      
     - ## t/t4141-apply-icase.sh (new) ##
     + ## t/t4142-apply-icase.sh (new) ##
      @@
      +#!/bin/sh
      +
 2:  1226fbd3caf = 2:  ab1cdd95e03 reset: new failing test for reset of case-insensitive duplicate in index
 3:  04d83283716 ! 3:  52359738532 apply: support case-only renames in case-insensitive filesystems
     @@ Commit message
          account for case-insensitive filesystems yet.
      
          Because the index is inherently case-sensitive even on a
     -    case-insensitive filesystem, we actually need this mechanism to be
     +    case-insensitive filesystem, we actually need this mechanism to
          handle both requirements, lest we fail to account for conflicting
          files only in the index.
      
     @@ apply.c: void clear_apply_state(struct apply_state *state)
      +	 */
       }
       
     - static void mute_routine(const char *msg, va_list params)
     + static void mute_routine(const char *msg UNUSED, va_list params UNUSED)
      @@ apply.c: static int read_file_or_gitlink(const struct cache_entry *ce, struct strbuf *buf
       	return read_blob_object(buf, &ce->oid, ce->ce_mode);
       }
     @@ apply.h: struct apply_state {
       	/*
       	 * This is to save reporting routines before using
      
     - ## t/t4141-apply-icase.sh ##
     -@@ t/t4141-apply-icase.sh: test_expect_success setup '
     + ## t/t4142-apply-icase.sh ##
     +@@ t/t4142-apply-icase.sh: test_expect_success setup '
              git diff HEAD HEAD^ -- file1 >deletion-patch &&
              git diff --cached HEAD -- file1 file2 >rename-file1-to-file2-patch &&
              git diff --cached HEAD -- file1 File1 >rename-file1-to-File1-patch &&
     @@ t/t4141-apply-icase.sh: test_expect_success setup '
       '
       
       # Basic creation, deletion, modification and renaming.
     -@@ t/t4141-apply-icase.sh: test_expect_success 'creation and deletion' '
     +@@ t/t4142-apply-icase.sh: test_expect_success 'creation and deletion' '
              test_must_fail git rev-parse --verify :file1
       '
       
     @@ t/t4141-apply-icase.sh: test_expect_success 'creation and deletion' '
              # start at "initial" with file0 only
              git reset --hard initial &&
       
     -@@ t/t4141-apply-icase.sh: test_expect_success 'modificaiton' '
     +@@ t/t4142-apply-icase.sh: test_expect_success 'modificaiton' '
              test_cmp_rev :file0 "$file0blob"
       '
       
     @@ t/t4141-apply-icase.sh: test_expect_success 'modificaiton' '
              # start from file0 and file1
              git reset --hard current &&
       
     -@@ t/t4141-apply-icase.sh: test_expect_success 'rename file1 to file2' '
     +@@ t/t4142-apply-icase.sh: test_expect_success 'rename file1 to file2' '
              test_cmp_rev :file1 "$file1blob"
       '
       
     @@ t/t4141-apply-icase.sh: test_expect_success 'rename file1 to file2' '
              # start from file0 and file1
              git reset --hard current &&
       
     -@@ t/t4141-apply-icase.sh: test_expect_success 'rename file1 to file2' '
     +@@ t/t4142-apply-icase.sh: test_expect_success 'rename file1 to file2' '
              test_cmp_rev :file1 "$file1blob"
       '
       

-- 
gitgitgadget

^ permalink raw reply	[relevance 4%]

* Re: Git branch capitalisation bug?
  @ 2023-04-20  7:28  7%       ` Chris Torek
  0 siblings, 0 replies; 200+ results
From: Chris Torek @ 2023-04-20  7:28 UTC (permalink / raw)
  To: Ilya Kamenshchikov; +Cc: Junio C Hamano, Torsten Bögershausen, git

On Thu, Apr 20, 2023 at 12:08 AM Ilya Kamenshchikov
<ikamenshchikov@gmail.com> wrote:
> I've recollected the history of how this issue occurred more and did
> few more tests. I'm now working with branch named "feature/git_repro":
> 1) The error first occurred when I worked with a colleague on a same
> branch, and he really used capital "Feature/branch".

The bug -- or "feature", depending on how you believe this all
*should* work -- is simple in concept and difficult in
reproduction because there are multiple moving parts.

Here's the concept:

 * In Git, branch names are always case sensitive.

 * But Git *sometimes* relies on the *OS* / file-system to
   implement this.

 * Some OSes / file-systems are case *in*sensitive.

When Git uses a case-INsensitive file-system to store a case-
sensitive branch name component, the OS / file-system loses the
case distinction. Exactly how that happens is up to the OS /
file-system, but we can see how common macOS and Windows systems
do it.

On these systems, when creating a file or directory, the *first*
creation attempt "wins". That is, if any command or process
goes to create a file or directory named "Feature", and no such
file or directory exists *now*, the file or directory is created
with precisely this set of casing. But if the file or directory
*already exists* in any casing (upper and/or lower), the system
uses the existing one: if "feature" exists, that's the name, or
if "featURE" exists, *that* is the name that is used.

So, if and when Git stores a branch name or component as a file-
system file or directory name *and* the system itself imposes this
case-folding match-some-existing-name scheme, Git's case
distinction -- the fact that Git considers "feature" and "Feature"
entirely different names -- is lost. Git is sure these are
different and will stay different, but they aren't and don't.

When Git reads these names back later, it finds the system's
names, rather than the ones Git attempted to store. Git believes
the system's names, rather than its own.

Sometimes, however, Git stores branch names in memory or in
file data, where this kind of case-folding never occurs. During
such periods, feature/git_repo and Feature/git_repo remain
different, distinct branch names.

To reproduce the problem, then, you must:

 1. mix a case-sensitive system (e.g., a typical Linux setup
    as found on GitHub) with a case-insensitive one (e.g., a
    typical Windows or macOS system);

 2. use the case-insensitive one yourself -- using the case-
    sensitive system you will see branch names as they actually
    appear, since they are never converted by the OS / file-system;

 3. set up the problem; and

 4. make sure Git stores the branch names in directories and
    files, rather than in the .git/packed-refs file.

The cure for this would be for Git to stop using the file system's
names directly, the way it does now. There are some long term
projects to make this happen, but little progress has happened
with them.

Until then, the way to avoid the problem is simple:

 A) insist that everyone use the same kind of OS, and/or
 B) be careful not to depend on case differences.

Method (A) tends to be impractical but method (B) is easy: just
make sure all users use all-lowercase all the time, at least for
branch names. It's not very nice, but it's practical.

Chris

^ permalink raw reply	[relevance 7%]

* Re: [PATCH v2] config: introduce an Operating System-specific `includeIf` condition
  @ 2023-04-19 14:26  6%             ` Chris Torek
  0 siblings, 0 replies; 200+ results
From: Chris Torek @ 2023-04-19 14:26 UTC (permalink / raw)
  To: Johannes Schindelin
  Cc: Junio C Hamano, Samuel Ferencik, Philip Oakley,
	Johannes Schindelin via GitGitGadget, git,
	Ævar Arnfjörð Bjarmason, Phillip Wood

Note: I'm going to mix two things here (maybe not the best idea)
and change the order.

On Wed, Apr 19, 2023 at 5:28 AM Johannes Schindelin
<Johannes.Schindelin@gmx.de> wrote:

> This is probably the most valuable feedback in this entire thread: What is
> the problem we're trying to solve here?
>
> The original report (which this patch tries to address) asks for a way to
> have a user-wide ("global") Git configuration that can be shared across
> machines and that allows for adapting to the various environments. The
> rationale is motivated well e.g. in
> https://medium.com/doing-things-right/platform-specific-gitconfigs-and-the-wonderful-includeif-7376cd44994d
> where platform-specific credential managers, editors, diff highlighters
> that work only in certain setups, and work vs personal environments are
> mentioned.

Why not allow use of environment variables?  Perhaps a simple:

git config include.env.USER_VAR

and/or:

git config include.ifexists.env.DIR

(feel free to invent better names!) or similar.  The user can then

export DIR=whatever

in some outside-of-Git setup.

On a separate note:

> ... This feature is meant for Git users, who I
> must assume based on my experience would expect the value to be
> case-insensitive. I.e. they would expect both `linux` and `Linux` to
> match.

I'm not at all sure about this: we already see a lot of confusion
from people who don't understand why, if Git is case-sensitive
about branch names (which it is), Git isn't case-sensitive about
branch names *sometimes* on Windows and macOS.

(In any case, using an env var sidesteps this question.)

Chris

^ permalink raw reply	[relevance 6%]

* Re: Git branch capitalisation bug?
  2023-04-13 10:35  4% Git branch capitalisation bug? Ilya Kamenshchikov
@ 2023-04-13 19:03  0% ` Torsten Bögershausen
    0 siblings, 1 reply; 200+ results
From: Torsten Bögershausen @ 2023-04-13 19:03 UTC (permalink / raw)
  To: Ilya Kamenshchikov; +Cc: git

On Thu, Apr 13, 2023 at 12:35:36PM +0200, Ilya Kamenshchikov wrote:
> What did you do before the bug happened? (Steps to reproduce your issue)
> Created a branch "feature/macos_tests", pushed to remote as
> "origin/feature/macos_tests".
>
> What did you expect to happen? (Expected behavior)
> remote branch "feature/macos_tests" to be created.
>
> What happened instead? (Actual behavior)
> remote branch name is "Feature/macos_tests" (capitalised). This
> doesn't play nicely with not case sensitive macos FS.
>
>
>
> [System Info]
> git version:
> git version 2.40.0
> cpu: x86_64
> no commit associated with this build
> sizeof-long: 8
> sizeof-size_t: 8
> shell-path: /bin/sh
> feature: fsmonitor--daemon
> uname: Darwin 21.6.0 Darwin Kernel Version 21.6.0: Mon Dec 19 20:44:01
> PST 2022; root:xnu-8020.240.18~2/RELEASE_X86_64 x86_64
> compiler info: clang: 14.0.0 (clang-1400.0.29.202)
> libc info: no libc information available
> $SHELL (typically, interactive shell): /usr/local/bin/fish
>
>
> [Enabled Hooks]
> pre-push
> (remark: reproduced also when uninstalling this hook)
>
> Raw output:
>
> ~ $ cd bosch/rlcore                                       (base) 12:11:42
> ~/b/rlcore (feature/macos_tests|✚2) $ git push            (base) 12:11:49
> fatal: The current branch feature/macos_tests has no upstream branch.
> To push the current branch and set the remote as upstream, use
>
>     git push --set-upstream origin feature/macos_tests
>
> To have this happen automatically for branches without a tracking
> upstream, see 'push.autoSetupRemote' in 'git help config'.
>
> ~/b/rlcore (feature/macos_tests|✚2) [128] $ git push --set-upstream
> origin feature/macos_tests
> Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
> Thank you for filling out a Git bug report!
> remote:
> remote: Create a pull request for 'feature/macos_tests' on GitHub by visiting:
> remote:      https://github.boschdevcloud.com/CR/rlcore/pull/new/feature/macos_tests
> remote:
> To https://github.boschdevcloud.com/CR/rlcore.git
>  * [new branch]        feature/macos_tests -> feature/macos_tests
> branch 'feature/macos_tests' set up to track 'origin/feature/macos_tests'.
> ~/b/rlcore (feature/macos_tests|✚2) $ gl                  (base) 12:16:10
> c001bc75 2023-04-13 | commit message (#514) (HEAD ->
> feature/macos_tests, origin/main, origin/git_problems, origin/HEAD,
> origin/Feature/macos_tests) [Rich..]
>
> Best Regards,
> --
> Ilya Kamen

I am not sure, where this Capitalizations comes from.
I don't have an account on boschdevcloud.com to test.
Is it possible to reproduce it with a public repo ?
Otherwise, should we suspect boschdevcloud.com for it ?

Any other thoughts from anybody ?

^ permalink raw reply	[relevance 0%]

* Git branch capitalisation bug?
@ 2023-04-13 10:35  4% Ilya Kamenshchikov
  2023-04-13 19:03  0% ` Torsten Bögershausen
  0 siblings, 1 reply; 200+ results
From: Ilya Kamenshchikov @ 2023-04-13 10:35 UTC (permalink / raw)
  To: git

What did you do before the bug happened? (Steps to reproduce your issue)
Created a branch "feature/macos_tests", pushed to remote as
"origin/feature/macos_tests".

What did you expect to happen? (Expected behavior)
remote branch "feature/macos_tests" to be created.

What happened instead? (Actual behavior)
remote branch name is "Feature/macos_tests" (capitalised). This
doesn't play nicely with not case sensitive macos FS.



[System Info]
git version:
git version 2.40.0
cpu: x86_64
no commit associated with this build
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
feature: fsmonitor--daemon
uname: Darwin 21.6.0 Darwin Kernel Version 21.6.0: Mon Dec 19 20:44:01
PST 2022; root:xnu-8020.240.18~2/RELEASE_X86_64 x86_64
compiler info: clang: 14.0.0 (clang-1400.0.29.202)
libc info: no libc information available
$SHELL (typically, interactive shell): /usr/local/bin/fish


[Enabled Hooks]
pre-push
(remark: reproduced also when uninstalling this hook)

Raw output:

~ $ cd bosch/rlcore                                       (base) 12:11:42
~/b/rlcore (feature/macos_tests|✚2) $ git push            (base) 12:11:49
fatal: The current branch feature/macos_tests has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature/macos_tests

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

~/b/rlcore (feature/macos_tests|✚2) [128] $ git push --set-upstream
origin feature/macos_tests
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
Thank you for filling out a Git bug report!
remote:
remote: Create a pull request for 'feature/macos_tests' on GitHub by visiting:
remote:      https://github.boschdevcloud.com/CR/rlcore/pull/new/feature/macos_tests
remote:
To https://github.boschdevcloud.com/CR/rlcore.git
 * [new branch]        feature/macos_tests -> feature/macos_tests
branch 'feature/macos_tests' set up to track 'origin/feature/macos_tests'.
~/b/rlcore (feature/macos_tests|✚2) $ gl                  (base) 12:16:10
c001bc75 2023-04-13 | commit message (#514) (HEAD ->
feature/macos_tests, origin/main, origin/git_problems, origin/HEAD,
origin/Feature/macos_tests) [Rich..]

Best Regards,
--
Ilya Kamen

^ permalink raw reply	[relevance 4%]

* [PATCH v7 38/49] completion: bash: shuffle __gitcomp functions
  2023-04-01  8:45  3% [PATCH v7 00/49] completion: git-completion 2.0 patches Felipe Contreras
  2023-04-01  8:45  7% ` [PATCH v7 12/49] completion: bash: do not modify COMP_WORDBREAKS Felipe Contreras
@ 2023-04-01  8:46  4% ` Felipe Contreras
  1 sibling, 0 replies; 200+ results
From: Felipe Contreras @ 2023-04-01  8:46 UTC (permalink / raw)
  To: git; +Cc: Felipe Contreras

They are the ones that actually do the completion, put them at the top.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/completion/git-completion.bash | 270 +++++++++++++------------
 1 file changed, 139 insertions(+), 131 deletions(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index bc6f83adce..3f48b61cbe 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -65,6 +65,145 @@
 #     case insensitively, even on systems with case sensitive file systems
 #     (e.g., completing tag name "FOO" on "git checkout f<TAB>").
 
+# The following functions are meant to modify COMPREPLY, which should not be
+# modified directly.  The purpose is to localize the modifications so it's
+# easier to emulate it in Zsh. Every time a new __gitcomp* function is added,
+# the corresponding function should be added to Zsh.
+
+__gitcompadd ()
+{
+	local x i=${#COMPREPLY[@]}
+	for x in $1; do
+		if [[ "$x" == "$3"* ]]; then
+			COMPREPLY[i++]="$2$x$4"
+		fi
+	done
+}
+
+# Creates completion replies.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word (optional).
+__gitcomp ()
+{
+	local IFS=$' \t\n'
+	__gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
+}
+
+# Generates completion reply from newline-separated possible completion words
+# by appending a space to all of them. The result is appended to COMPREPLY.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words, separated by a single newline.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word instead of
+#    the default space (optional).  If specified but empty, nothing is
+#    appended.
+__gitcomp_nl ()
+{
+	local IFS=$'\n'
+	__gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
+}
+
+# Appends prefiltered words to COMPREPLY without any additional processing.
+# Callers must take care of providing only words that match the current word
+# to be completed and adding any prefix and/or suffix (trailing space!), if
+# necessary.
+# 1: List of newline-separated matching completion words, complete with
+#    prefix and suffix.
+__gitcomp_direct ()
+{
+	local IFS=$'\n'
+
+	COMPREPLY+=($1)
+}
+
+# Generates completion reply with compgen from newline-separated possible
+# completion filenames.
+# It accepts 1 to 3 arguments:
+# 1: List of possible completion filenames, separated by a single newline.
+# 2: A directory prefix to be added to each possible completion filename
+#    (optional).
+# 3: Generate possible completion matches for this word (optional).
+__gitcomp_file ()
+{
+	local IFS=$'\n'
+
+	# XXX does not work when the directory prefix contains a tilde,
+	# since tilde expansion is not applied.
+	# This means that COMPREPLY will be empty and Bash default
+	# completion will be used.
+	__gitcompadd "$1" "${2-}" "${3-$cur}" ""
+
+	# use a hack to enable file mode in bash < 4
+	compopt -o filenames +o nospace 2>/dev/null ||
+	compgen -f /non-existing-dir/ >/dev/null ||
+	true
+}
+
+# Fills the COMPREPLY array with prefiltered paths without any additional
+# processing.
+# Callers must take care of providing only paths that match the current path
+# to be completed and adding any prefix path components, if necessary.
+# 1: List of newline-separated matching paths, complete with all prefix
+#    path components.
+__gitcomp_file_direct ()
+{
+	local IFS=$'\n'
+
+	COMPREPLY+=($1)
+
+	# use a hack to enable file mode in bash < 4
+	compopt -o filenames +o nospace 2>/dev/null ||
+	compgen -f /non-existing-dir/ >/dev/null ||
+	true
+}
+
+# Creates completion replies, reorganizing options and adding suffixes as needed.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word (optional).
+__gitcomp_opts ()
+{
+	local cur_="${3-$cur}"
+
+	if [[ "$cur_" == *= ]]; then
+		return
+	fi
+
+	local c i=0 IFS=$' \t\n' sfx
+	for c in $1; do
+		if [[ $c == "--" ]]; then
+			if [[ "$cur_" == --no-* ]]; then
+				continue
+			fi
+
+			if [[ --no == "$cur_"* ]]; then
+				COMPREPLY[i++]="--no-... "
+			fi
+			break
+		fi
+		if [[ $c == "$cur_"* ]]; then
+			if [[ -z "${4+set}" ]]; then
+				case $c in
+				*=|*.) sfx="" ;;
+				*) sfx=" " ;;
+				esac
+			else
+				sfx="$4"
+			fi
+			COMPREPLY[i++]="${2-}$c$sfx"
+		fi
+	done
+}
+
+# __gitcomp functions end here
+# ==============================================================================
+
 # Discovers the path to the git repository taking any '--git-dir=<path>' and
 # '-C <path>' options into account and stores it in the $__git_repo_path
 # variable.
@@ -307,81 +446,6 @@ _get_comp_words_by_ref ()
 }
 fi
 
-# Appends prefiltered words to COMPREPLY without any additional processing.
-# Callers must take care of providing only words that match the current word
-# to be completed and adding any prefix and/or suffix (trailing space!), if
-# necessary.
-# 1: List of newline-separated matching completion words, complete with
-#    prefix and suffix.
-__gitcomp_direct ()
-{
-	local IFS=$'\n'
-
-	COMPREPLY+=($1)
-}
-
-__gitcompadd ()
-{
-	local x i=${#COMPREPLY[@]}
-	for x in $1; do
-		if [[ "$x" == "$3"* ]]; then
-			COMPREPLY[i++]="$2$x$4"
-		fi
-	done
-}
-
-# Creates completion replies.
-# It accepts 1 to 4 arguments:
-# 1: List of possible completion words.
-# 2: A prefix to be added to each possible completion word (optional).
-# 3: Generate possible completion matches for this word (optional).
-# 4: A suffix to be appended to each possible completion word (optional).
-__gitcomp ()
-{
-	local IFS=$' \t\n'
-	__gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
-}
-
-# Creates completion replies, reorganizing options and adding suffixes as needed.
-# It accepts 1 to 4 arguments:
-# 1: List of possible completion words.
-# 2: A prefix to be added to each possible completion word (optional).
-# 3: Generate possible completion matches for this word (optional).
-# 4: A suffix to be appended to each possible completion word (optional).
-__gitcomp_opts ()
-{
-	local cur_="${3-$cur}"
-
-	if [[ "$cur_" == *= ]]; then
-		return
-	fi
-
-	local c i=0 IFS=$' \t\n' sfx
-	for c in $1; do
-		if [[ $c == "--" ]]; then
-			if [[ "$cur_" == --no-* ]]; then
-				continue
-			fi
-
-			if [[ --no == "$cur_"* ]]; then
-				COMPREPLY[i++]="--no-... "
-			fi
-			break
-		fi
-		if [[ $c == "$cur_"* ]]; then
-			if [[ -z "${4+set}" ]]; then
-				case $c in
-				*=|*.) sfx="" ;;
-				*) sfx=" " ;;
-				esac
-			else
-				sfx="$4"
-			fi
-			COMPREPLY[i++]="${2-}$c$sfx"
-		fi
-	done
-}
-
 # Clear the variables caching builtins' options when (re-)sourcing
 # the completion script.
 if [[ -n ${ZSH_VERSION-} ]]; then
@@ -430,62 +494,6 @@ __gitcomp_builtin ()
 	__gitcomp_opts "$options"
 }
 
-# Generates completion reply from newline-separated possible completion words
-# by appending a space to all of them. The result is appended to COMPREPLY.
-# It accepts 1 to 4 arguments:
-# 1: List of possible completion words, separated by a single newline.
-# 2: A prefix to be added to each possible completion word (optional).
-# 3: Generate possible completion matches for this word (optional).
-# 4: A suffix to be appended to each possible completion word instead of
-#    the default space (optional).  If specified but empty, nothing is
-#    appended.
-__gitcomp_nl ()
-{
-	local IFS=$'\n'
-	__gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
-}
-
-# Fills the COMPREPLY array with prefiltered paths without any additional
-# processing.
-# Callers must take care of providing only paths that match the current path
-# to be completed and adding any prefix path components, if necessary.
-# 1: List of newline-separated matching paths, complete with all prefix
-#    path components.
-__gitcomp_file_direct ()
-{
-	local IFS=$'\n'
-
-	COMPREPLY+=($1)
-
-	# use a hack to enable file mode in bash < 4
-	compopt -o filenames +o nospace 2>/dev/null ||
-	compgen -f /non-existing-dir/ >/dev/null ||
-	true
-}
-
-# Generates completion reply with compgen from newline-separated possible
-# completion filenames.
-# It accepts 1 to 3 arguments:
-# 1: List of possible completion filenames, separated by a single newline.
-# 2: A directory prefix to be added to each possible completion filename
-#    (optional).
-# 3: Generate possible completion matches for this word (optional).
-__gitcomp_file ()
-{
-	local IFS=$'\n'
-
-	# XXX does not work when the directory prefix contains a tilde,
-	# since tilde expansion is not applied.
-	# This means that COMPREPLY will be empty and Bash default
-	# completion will be used.
-	__gitcompadd "$1" "${2-}" "${3-$cur}" ""
-
-	# use a hack to enable file mode in bash < 4
-	compopt -o filenames +o nospace 2>/dev/null ||
-	compgen -f /non-existing-dir/ >/dev/null ||
-	true
-}
-
 # Execute 'git ls-files', unless the --committable option is specified, in
 # which case it runs 'git diff-index' to find out the files that can be
 # committed.  It return paths relative to the directory specified in the first
-- 
2.33.0


^ permalink raw reply related	[relevance 4%]

* [PATCH v7 12/49] completion: bash: do not modify COMP_WORDBREAKS
  2023-04-01  8:45  3% [PATCH v7 00/49] completion: git-completion 2.0 patches Felipe Contreras
@ 2023-04-01  8:45  7% ` Felipe Contreras
  2023-04-01  8:46  4% ` [PATCH v7 38/49] completion: bash: shuffle __gitcomp functions Felipe Contreras
  1 sibling, 0 replies; 200+ results
From: Felipe Contreras @ 2023-04-01  8:45 UTC (permalink / raw)
  To: git; +Cc: Felipe Contreras

There was no need for this once __git_reassemble_comp_words_by_ref() was
introduced. Now irrespective of the value of COMP_WORDBREAKS, words are
always joined together.

By default COMP_WORDBREAKS does contain a colon, and if it doesn't
somebody probably has a reason for it.

Completions are not supposed to modify COMP_WORDBREAKS and none of the
completions in the bash-completion project do.

We manually set it in Zsh so the Bash script is not confused.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/completion/git-completion.bash | 5 -----
 contrib/completion/git-completion.zsh  | 1 +
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index cf6ff0595f..fd2a43de38 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -65,11 +65,6 @@
 #     case insensitively, even on systems with case sensitive file systems
 #     (e.g., completing tag name "FOO" on "git checkout f<TAB>").
 
-case "$COMP_WORDBREAKS" in
-*:*) : great ;;
-*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
-esac
-
 # Discovers the path to the git repository taking any '--git-dir=<path>' and
 # '-C <path>' options into account and stores it in the $__git_repo_path
 # variable.
diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh
index 790879e319..186c49195b 100644
--- a/contrib/completion/git-completion.zsh
+++ b/contrib/completion/git-completion.zsh
@@ -46,6 +46,7 @@ fi
 
 local old_complete="$functions[complete]"
 functions[complete]=:
+COMP_WORDBREAKS=':'
 GIT_SOURCING_ZSH_COMPLETION=y . "$script"
 functions[complete]="$old_complete"
 
-- 
2.33.0


^ permalink raw reply related	[relevance 7%]

* [PATCH v7 00/49] completion: git-completion 2.0 patches
@ 2023-04-01  8:45  3% Felipe Contreras
  2023-04-01  8:45  7% ` [PATCH v7 12/49] completion: bash: do not modify COMP_WORDBREAKS Felipe Contreras
  2023-04-01  8:46  4% ` [PATCH v7 38/49] completion: bash: shuffle __gitcomp functions Felipe Contreras
  0 siblings, 2 replies; 200+ results
From: Felipe Contreras @ 2023-04-01  8:45 UTC (permalink / raw)
  To: git; +Cc: Felipe Contreras

This patch series revamps the completion code to git-completion 2.0.

It's meant to be applied on top of the zsh completion test series [1].

The zsh code delta between upstream and git-completion 2.0 results in 12
out of 13 failing tests now passing. This patch series now makes that
clear.

Additionally, it adds and fixes one bash completion test pending since
2020 [2].

This patch series started being relatively small (10 patches) [3], but
upstream has never merged them, so it's now 51 patches.

One patch has been merged to master, so that's progress I guess.

Here's a summary of the differences between upstream and git-completion:

# For zsh
 * Fix alias regression
 * Fix main option handling
 * Fix generic completions
 * Fix option relationships
 * Add improved removable suffix
 * Fix suboptions
 * Fix -C handling
 * Fix -c handling
 * Fix configurations with value (e1e00089da)

# Other
 * Fix `COMP_WORDBREAKS` handling
 * Plenty of reorganizations and cleanups

For more information check git-completion's project page [4].

Changes since v6:

 * Run the zsh completion test script directly in zsh
 * Simplify the zsh zpty code for testing
 * Rebase on top of Git 2.40

Past versions:

 * 1.4: https://lore.kernel.org/git/20220830093138.1581538-1-felipe.contreras@gmail.com/
 * 1.3.3: https://lore.kernel.org/git/20210618182518.697912-1-felipe.contreras@gmail.com/
 * 1.3.1: https://lore.kernel.org/git/20210426161458.49860-1-felipe.contreras@gmail.com/
 * 1.3: https://lore.kernel.org/git/20210101021622.798041-1-felipe.contreras@gmail.com/
 * v2: https://lore.kernel.org/git/20201110212136.870769-1-felipe.contreras@gmail.com/
 * v1: https://lore.kernel.org/git/20201104174716.783348-1-felipe.contreras@gmail.com/

Cheers.

[1] https://lore.kernel.org/git/20230401015632.103581-1-felipe.contreras@gmail.com/
[2] https://lore.kernel.org/git/20201223141950.GA23264@szeder.dev/
[3] https://lore.kernel.org/git/20201104174716.783348-1-felipe.contreras@gmail.com/
[4] https://github.com/felipec/git-completion

Felipe Contreras (48):
  test: completion add test for __git_cmd_idx
  completion: bash: trivial cleanup
  zsh: remove version
  completion: bash: trivial grammar fix
  completion: zsh: add higher-priority location
  zsh: simplify realpath dirname idiom
  test: completion: use global config
  completion: fix __git_cmd_idx regression for zsh
  completion: fix for suboptions with value
  completion: zsh: trivial improvement
  completion: bash: do not modify COMP_WORDBREAKS
  test: completion: fix currently typed words
  test: completion: switch __gitcomp_nl prefix test
  test: completion: add run_func() helper
  completion: bash: remove non-append functionality
  completion: bash: get rid of _append() functions
  completion: bash: get rid of any non-append code
  completion: zsh: fix options with arguments
  completion: zsh: expand --git-dir file argument
  completion: zsh: add support for general -C opts
  completion: zsh: fix for undefined completions
  completion: zsh: add support for general -c opts
  completion: zsh: fix extra space on foo=
  completion: zsh: add excluded options
  completion: zsh: always set compset
  completion: factor out check in __gitcomp
  completion: simplify equal suffix check
  completion: refactor __gitcomp
  completion: simplify __gitcomp
  completion: bash: change suffix check in __gitcomp
  completion: improve __gitcomp suffix code
  test: completion: add missing test
  completion: bash: simplify config_variable_name
  completion: bash: improve __gitcomp description
  completion: add __gitcomp_opts
  completion: bash: cleanup __gitcomp* invocations
  completion: bash: shuffle __gitcomp functions
  completion: zsh: simplify __gitcomp_direct
  completion: zsh: shuffle __gitcomp* functions
  completion: zsh: fix direct quoting
  completion: zsh: add elements individually in __gitcomp_opts
  completion: zsh: add __gitcompadd helper
  completion: zsh: add correct removable suffix
  completion: bash: simplify _get_comp_words_by_ref()
  completion: bash: refactor _get_comp_words_by_ref()
  completion: bash: cleanup _get_comp_words_by_ref()
  completion: bash: trivial cleanup
  completion: bash: rename _get_comp_words_by_ref()

Michael Bianco (1):
  zsh: resolve symlink of script

 contrib/completion/git-completion.bash | 637 +++++++++++--------------
 contrib/completion/git-completion.zsh  | 146 +++---
 t/t9902-completion.sh                  | 167 ++++---
 t/t9904-completion-zsh.sh              |  97 ++--
 4 files changed, 489 insertions(+), 558 deletions(-)

Range-diff against v6:
 1:  e3c5a79c51 =  1:  6d191be41c test: completion add test for __git_cmd_idx
 2:  674c223b68 <  -:  ---------- test: add zsh completion tests
 4:  8a6ec4348b =  2:  a59bf95ff5 completion: bash: trivial cleanup
50:  3dd08cbdf7 =  3:  c5c105bfff zsh: remove version
51:  88beef78a7 =  4:  0217b5641c completion: bash: trivial grammar fix
 5:  c6e3e9c8b4 =  5:  b1548d96a2 completion: zsh: add higher-priority location
 6:  7f34835f6e =  6:  7f2149738a zsh: resolve symlink of script
 7:  b2c9c92c5e =  7:  8af77967ed zsh: simplify realpath dirname idiom
 -:  ---------- >  8:  aeb19ab24c test: completion: use global config
 3:  28fd5901d7 !  9:  152eca2b34 completion: fix __git_cmd_idx regression for zsh
    @@ contrib/completion/git-completion.zsh: __git_zsh_main ()
      	cur=${words[CURRENT]}
      	prev=${words[CURRENT-1]}
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_failure 'options with value' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_failure 'options with value' '
      	EOF
      '
      
 8:  5496fc8ad2 <  -:  ---------- test: reset environment variables
 9:  a70c96e720 <  -:  ---------- completion: prompt: use generic colors
10:  3d949c4ef4 ! 10:  efe2d76308 completion: fix for suboptions with value
    @@ contrib/completion/git-completion.zsh: __gitcomp ()
      	--no-*)
      		local c IFS=$' \t\n'
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - expand/narrow all negative options' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp - expand/narrow all negative options' '
      	EOF
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - expand/narrow all ne
      	test_gitcomp "--option=" "--option=" <<-\EOF &&
      
      	EOF
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'git clone --config= - value' '
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'git clone --config= - value' '
      	EOF
      '
      
11:  39a5e432e8 = 11:  66abcf711f completion: zsh: trivial improvement
12:  d757c1e649 ! 12:  559f5daf27 completion: bash: do not modify COMP_WORDBREAKS
    @@ Commit message
     
      ## contrib/completion/git-completion.bash ##
     @@
    - #     When set to "1" suggest all options, including options which are
    - #     typically hidden (e.g. '--allow-empty' for 'git commit').
    + #     case insensitively, even on systems with case sensitive file systems
    + #     (e.g., completing tag name "FOO" on "git checkout f<TAB>").
      
     -case "$COMP_WORDBREAKS" in
     -*:*) : great ;;
13:  06f0430106 ! 13:  dbb1a7410e test: completion: fix currently typed words
    @@ t/t9902-completion.sh: test_expect_success '__gitcomp - prefix' '
      	branch.master.Z
      	branch.maint.Z
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - option parameter' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp - option parameter' '
      '
      
      test_expect_failure '__gitcomp - prefix' '
    @@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - option parameter' '
      		"branch.maint." "me" <<-\EOF
      	branch.maint.merge Z
      	branch.maint.mergeoptions Z
    -@@ t/t9904-zsh-completion.sh: test_expect_failure '__gitcomp - prefix' '
    +@@ t/t9904-completion-zsh.sh: test_expect_failure '__gitcomp - prefix' '
      '
      
      test_expect_failure '__gitcomp - suffix' '
14:  a6f4da3602 ! 14:  2f2c240ac1 test: completion: switch __gitcomp_nl prefix test
    @@ t/t9902-completion.sh: test_expect_success '__gitcomp_nl - trailing space' '
      '
      
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp_nl - trailing space' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp_nl - trailing space' '
      	EOF
      '
      
15:  4e11ca5f72 = 15:  c21c389bb7 test: completion: add run_func() helper
16:  6baf13d85f = 16:  ea93b6cdec completion: bash: remove non-append functionality
17:  2a8298ba7d = 17:  567046e66b completion: bash: get rid of _append() functions
18:  2b6225049f = 18:  1500142923 completion: bash: get rid of any non-append code
19:  dd5e794315 = 19:  655fac83e5 completion: zsh: fix options with arguments
20:  b88875e756 = 20:  9a7591b665 completion: zsh: expand --git-dir file argument
21:  045f42c461 ! 21:  58f8143817 completion: zsh: add support for general -C opts
    @@ contrib/completion/git-completion.zsh: __git_zsh_main ()
      
      		words=( git ${words[@]} )
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'checkout completes ref names' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'checkout completes ref names' '
      	EOF
      '
      
22:  2c69a0d2af ! 22:  3b424c7b78 completion: zsh: fix for undefined completions
    @@ contrib/completion/git-completion.zsh: __git_complete_command ()
      		return 1
      	fi
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c
      	EOF
      '
      
23:  40c6608ce6 ! 23:  1c6eddb71e completion: zsh: add support for general -c opts
    @@ contrib/completion/git-completion.zsh: __git_zsh_main ()
      		local command="${words[1]}" __git_dir __git_cmd_idx=1
      
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'git config - value' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'git config - value' '
      	EOF
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success 'git config - value' '
      	test_completion "git -c br" <<-\EOF
      	branch.Z
      	browser.Z
    -@@ t/t9904-zsh-completion.sh: test_expect_failure 'git -c - variable name' '
    +@@ t/t9904-completion-zsh.sh: test_expect_failure 'git -c - variable name' '
      	EOF
      '
      
24:  da05523a98 ! 24:  5ab47aa5e2 completion: zsh: fix extra space on foo=
    @@ contrib/completion/git-completion.zsh: __gitcomp ()
      			esac
      			array+=("$c")
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'git -c - section' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'git -c - section' '
      	EOF
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success 'git -c - section' '
      	test_completion "git -c log.d" <<-\EOF
      	log.date=Z
      	log.decorate=Z
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'git clone --config= - section' '
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'git clone --config= - section' '
      	EOF
      '
      
25:  92720f3b4e ! 25:  8d25832207 completion: zsh: add excluded options
    @@ contrib/completion/git-completion.zsh: __git_zsh_main ()
      		'--namespace=[set the git namespace]:' \
      		'--no-replace-objects[do not use replacement refs to replace git objects]' \
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'general options' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'general options' '
      	test_completion "git --no-r" "--no-replace-objects"
      '
      
26:  a4b22cfc5e = 26:  1ef670094b completion: zsh: always set compset
27:  4246b2dd11 = 27:  f2a9a5cf50 completion: factor out check in __gitcomp
28:  549bdf25c8 = 28:  a57311923f completion: simplify equal suffix check
29:  f2dde0eafc = 29:  48be9110f4 completion: refactor __gitcomp
30:  98ed73aec8 = 30:  beb47c2caa completion: simplify __gitcomp
31:  8b53745ef8 = 31:  f2e7c92b0b completion: bash: change suffix check in __gitcomp
32:  b3ca49a9ee = 32:  ec1e4d358d completion: improve __gitcomp suffix code
33:  24b974a7d6 ! 33:  3417863c0f test: completion: add missing test
    @@ t/t9902-completion.sh: test_expect_success 'git config - value' '
      	test_completion "git -c br" <<-\EOF
      	branch.Z
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'git config - value' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'git config - value' '
      	EOF
      '
      
34:  d2a5c05e2b = 34:  4066b8e02a completion: bash: simplify config_variable_name
35:  8c0220b07f = 35:  2efe630d2d completion: bash: improve __gitcomp description
36:  6aaa7f3b5a ! 36:  688046c606 completion: add __gitcomp_opts
    @@ t/t9902-completion.sh: test_expect_success '__gitcomp - ignore optional negative
      
      read -r -d "" refs <<-\EOF
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_completion ()
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_completion ()
      	test_cmp expected out_sorted
      }
      
    @@ t/t9904-zsh-completion.sh: test_completion ()
      	test_cmp expected out
      }
      
    -@@ t/t9904-zsh-completion.sh: test_expect_success 'setup for __git_find_repo_path/__gitdir tests' '
    +@@ t/t9904-completion-zsh.sh: test_expect_success 'setup for __git_find_repo_path/__gitdir tests' '
      	git init -b main otherrepo
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success 'setup for __git_find_repo_path/_
      		--reset-author" <<-EOF
      	--reuse-message=Z
      	--reedit-message=Z
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - trailing space - options' '
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp - trailing space - options' '
      	EOF
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - trailing space - opt
      		branch.autosetuprebase browser." <<-\EOF
      	branch.Z
      	branch.autosetupmerge Z
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - trailing space - config keys' '
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp - trailing space - config keys' '
      	EOF
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - trailing space - con
      	--abc Z
      	--def Z
      	--no-one Z
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp - ignore optional negative options' '
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp - ignore optional negative options' '
      	EOF
      '
      
37:  d512f5ebc2 = 37:  d74e8977cd completion: bash: cleanup __gitcomp* invocations
38:  b38b1f6e29 ! 38:  3d8e5655d0 completion: bash: shuffle __gitcomp functions
    @@ Commit message
     
      ## contrib/completion/git-completion.bash ##
     @@
    - #     When set to "1" suggest all options, including options which are
    - #     typically hidden (e.g. '--allow-empty' for 'git commit').
    + #     case insensitively, even on systems with case sensitive file systems
    + #     (e.g., completing tag name "FOO" on "git checkout f<TAB>").
      
     +# The following functions are meant to modify COMPREPLY, which should not be
     +# modified directly.  The purpose is to localize the modifications so it's
39:  86ca702ada = 39:  4164cb3b6e completion: zsh: simplify __gitcomp_direct
40:  a5c7949d3f = 40:  866fa2ff1b completion: zsh: shuffle __gitcomp* functions
41:  dcdc3b3626 = 41:  1243854e0d completion: zsh: fix direct quoting
42:  1343263c53 ! 42:  a80b970a46 completion: zsh: add elements individually in __gitcomp_opts
    @@ contrib/completion/git-completion.zsh: __gitcomp_opts ()
      
      __gitcomp_nl ()
     
    - ## t/t9904-zsh-completion.sh ##
    -@@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp_opts - option parameter' '
    + ## t/t9904-completion-zsh.sh ##
    +@@ t/t9904-completion-zsh.sh: test_expect_success '__gitcomp_opts - option parameter' '
      	EOF
      '
      
    @@ t/t9904-zsh-completion.sh: test_expect_success '__gitcomp_opts - option paramete
      	test_gitcomp_opts "branch.maint.me" "remote merge mergeoptions rebase" \
      		"branch.maint." "me" <<-\EOF
      	branch.maint.merge Z
    -@@ t/t9904-zsh-completion.sh: test_expect_failure '__gitcomp_opts - prefix' '
    +@@ t/t9904-completion-zsh.sh: test_expect_failure '__gitcomp_opts - prefix' '
      	EOF
      '
      
43:  5c3621f224 = 43:  66c429c075 completion: zsh: add __gitcompadd helper
44:  7aaaf8f8ed = 44:  22ab31138d completion: zsh: add correct removable suffix
45:  1ac27ad13d = 45:  290b7e753b completion: bash: simplify _get_comp_words_by_ref()
46:  3b32bfe16b = 46:  4d0de6230c completion: bash: refactor _get_comp_words_by_ref()
47:  32b36425ea = 47:  46b5530d25 completion: bash: cleanup _get_comp_words_by_ref()
48:  35cbf711e8 = 48:  039a43b994 completion: bash: trivial cleanup
49:  3a005ae3c4 = 49:  d33a04e5fd completion: bash: rename _get_comp_words_by_ref()
-- 
2.33.0


^ permalink raw reply	[relevance 3%]

* Re: Bug: git pull output and case sensitivity.
  2023-03-20 19:12  0%       ` Torsten Bögershausen
@ 2023-03-22 17:44  5%         ` dooagain
  0 siblings, 0 replies; 200+ results
From: dooagain @ 2023-03-22 17:44 UTC (permalink / raw)
  To: Torsten Bögershausen; +Cc: Jeff King, git@vger.kernel.org

This is probably overkill, but here is a script that replicates the issue

#! /usr/bin/env bash

# WARNING
# These are dangerous commands that create and delete
# disk volumes. Uncomment and execute at your own risk.

# [BEGIN DANGEROUS COMMANDS]
# 
# This is the command to "cleanup" or remove the newly created Volume.
# This will delete the Volume with an id of `disk1s9` that is going to
# change depending on your drive setup. Execute `diskutil list` to see 
# general disk info
#
# `diskutil apfs deleteVolume disk1s9`
#
# Create a case sensitive volume
# `diskutil apfs addVolume disk1 APFSX Casesensitive` # disk1s9
#
# [END DANGEROUS COMMANDS]

SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
REMOTE=/Volumes/Casesensitive/casing
# Set REMOTE="${SCRIPT_DIR}/casing-remote"
# If you do not want to create a case sensitive volume
REPO="${SCRIPT_DIR}/casing-bob"
REPO_OTHER="${SCRIPT_DIR}/casing-alice"

rm -rf "${REPO}" "${REPO_OTHER}" "${REMOTE}" && \
  mkdir "${REPO}" "${REPO_OTHER}" "${REMOTE}" && \
  cd "${REMOTE}" && \
  git init --bare && \
  cd "${REPO}" && \
  git init && \
  echo "#casing" > README.md && \
  git add README.md && \
  git commit -m "init commit" && \
  git branch -M master && \
  git remote add origin "${REMOTE}" && \
  git push -u origin master && \
  git clone "${REMOTE}" "${REPO_OTHER}" && \
  cd "${REPO}" && \
  git checkout -b Bug/foo && \
  touch foo && \
  git add foo && \
  git commit -m "adding foo file" && \
  git push --set-upstream origin Bug/foo && \
  cd "${REPO_OTHER}" && \
  git checkout -b bug/bar && \
  touch bar && \
  git add bar && \
  git commit -m "added bar file" && \
  git push --set-upstream origin bug/bar && \
  cd "${REPO_OTHER}" && \

  # casing-alice always thinks that Bug/foo is a new branch
  # because it has a loacl ref of ".git/refs/remotes/origin/bug/bar"
  # so it doesn't know Bug/foo and bug/foo are the same branch.
  # It does seem that local "bug/foo" 
  # is in sync with remote "Bug/foo" despite the warning

  git pull
  git pull


------- Original Message -------
On Monday, March 20th, 2023 at 1:12 PM, Torsten Bögershausen <tboegi@web.de> wrote:


> On Mon, Mar 20, 2023 at 06:01:30PM +0000, dooagain wrote:
> 
> > I'm not sure if this is helpful, but I documented a simple way to recreate the issue I am seeing in the README in the https://github.com/spencerdcarlson/test-casing repository.
> 
> 
> It is helpful, thanks.
> In general, we prefer to have all informartion in emails ;-)
> Anyway.
> 
> To reply on Peff's comment:
> 
> > So I think this is just a known gotcha, and the path forward is probably
> > a new ref storage format that doesn't rely on storing names directly in
> > the filesystem (reftable, or some system based on packed-ref slices).
> 
> 
> Yes, it is.
> The thing is, that Git at the moment is unable to handle to branches
> like Foo and foo on case-insensitive file systems.
> Because branch names are stored as files, and that doesn't typially work
> well under Windows or MacOs.
> 
> As a workaround,
> git pack-refs
> can be used.
> 
> side-note 1: a better backend for refs may make it's way into Git
> in the long term.
> 
> side-note 2:
> I always recommend to stick to a naming convention when working in
> a cross-platform project.
> You can keep filenames only lowercase.
> That is debatable, some people prefer camel-case rather then snake-case.
> So go for either way.
> But the same restriction/recommendation is valid for branch names as well,
> stick to one convention and avoid possible collisions under Mac or Windows.
> 
> Or run `git pack-refs`, but be aware the the performance may suffer,
> if you use zillions of refs.
> 
> HTH
> /Torsten
> 
> > ------- Original Message -------
> > On Monday, March 20th, 2023 at 11:16 AM, Jeff King peff@peff.net wrote:
> > 
> > > On Sun, Mar 19, 2023 at 07:22:40AM +0100, Torsten Bögershausen wrote:
> > > 
> > > > On Sat, Mar 18, 2023 at 07:21:10PM +0000, dooagain 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)
> > > > > 
> > > > > I configured my git repository to ignore case by executing `git config core.ignorecase true` then I executed `git pull` multiple times.
> > > > 
> > > > What do you mean by "I configured my git repository" ?
> > > > The answer is already there, so let's re-rephrase it:
> > > > Are you working on a case-insensitive file system ?
> > > > 
> > > > What happens if you create a test directory, like this:
> > > > mkdir test-case
> > > > cd test-case
> > > > git init
> > > > git config --get core.ignorecase
> > > 
> > > I think this is kind of a red herring, isn't it? The bug report is about
> > > refs, and I don't think those really respect core.ignorecase either way,
> > > and inconsistencies are known to happen on case-insensitive filesystems
> > > (because the refs are sometimes case-sensitive and sometimes not
> > > depending on whether they are packed or loose in the filesystem).
> > > 
> > > So I think this is just a known gotcha, and the path forward is probably
> > > a new ref storage format that doesn't rely on storing names directly in
> > > the filesystem (reftable, or some system based on packed-ref slices).
> > > 
> > > -Peff

^ permalink raw reply	[relevance 5%]

* Re: Bug: git pull output and case sensitivity.
  2023-03-20 18:01  0%     ` dooagain
@ 2023-03-20 19:12  0%       ` Torsten Bögershausen
  2023-03-22 17:44  5%         ` dooagain
  0 siblings, 1 reply; 200+ results
From: Torsten Bögershausen @ 2023-03-20 19:12 UTC (permalink / raw)
  To: dooagain; +Cc: Jeff King, git@vger.kernel.org

On Mon, Mar 20, 2023 at 06:01:30PM +0000, dooagain wrote:
> I'm not sure if this is helpful, but I documented a simple way to recreate the issue I am seeing in the README in the https://github.com/spencerdcarlson/test-casing repository.

It is helpful,  thanks.
In general, we prefer to have all informartion in emails ;-)
Anyway.

To reply on Peff's comment:

>So I think this is just a known gotcha, and the path forward is probably
>a new ref storage format that doesn't rely on storing names directly in
>the filesystem (reftable, or some system based on packed-ref slices).

Yes, it is.
The thing is, that Git at the moment is unable to handle to branches
like Foo and foo on case-insensitive file systems.
Because branch names are stored as files, and that doesn't typially work
well under Windows or MacOs.

As a workaround,
git pack-refs
can be used.

side-note 1: a better backend for refs may make it's way into Git
in the long term.

side-note 2:
I always recommend to stick to a naming convention when working in
a cross-platform project.
You can keep filenames only lowercase.
That is debatable, some people prefer camel-case rather then snake-case.
So go for either way.
But the same restriction/recommendation is valid for branch names as well,
stick to one convention and avoid possible collisions under Mac or Windows.

Or run `git pack-refs`, but be aware the the performance may suffer,
if you use zillions of refs.

HTH
/Torsten

>
> ------- Original Message -------
> On Monday, March 20th, 2023 at 11:16 AM, Jeff King <peff@peff.net> wrote:
>
>
> > On Sun, Mar 19, 2023 at 07:22:40AM +0100, Torsten Bögershausen wrote:
> >
> > > On Sat, Mar 18, 2023 at 07:21:10PM +0000, dooagain 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)
> > > >
> > > > I configured my git repository to ignore case by executing `git config core.ignorecase true` then I executed `git pull` multiple times.
> > >
> > > What do you mean by "I configured my git repository" ?
> > > The answer is already there, so let's re-rephrase it:
> > > Are you working on a case-insensitive file system ?
> > >
> > > What happens if you create a test directory, like this:
> > > mkdir test-case
> > > cd test-case
> > > git init
> > > git config --get core.ignorecase
> >
> >
> > I think this is kind of a red herring, isn't it? The bug report is about
> > refs, and I don't think those really respect core.ignorecase either way,
> > and inconsistencies are known to happen on case-insensitive filesystems
> > (because the refs are sometimes case-sensitive and sometimes not
> > depending on whether they are packed or loose in the filesystem).
> >
> > So I think this is just a known gotcha, and the path forward is probably
> > a new ref storage format that doesn't rely on storing names directly in
> > the filesystem (reftable, or some system based on packed-ref slices).
> >
> > -Peff

^ permalink raw reply	[relevance 0%]

* Re: Bug: git pull output and case sensitivity.
  2023-03-20 17:16  5%   ` Jeff King
@ 2023-03-20 18:01  0%     ` dooagain
  2023-03-20 19:12  0%       ` Torsten Bögershausen
  0 siblings, 1 reply; 200+ results
From: dooagain @ 2023-03-20 18:01 UTC (permalink / raw)
  To: Jeff King; +Cc: Torsten Bögershausen, git@vger.kernel.org

I'm not sure if this is helpful, but I documented a simple way to recreate the issue I am seeing in the README in the https://github.com/spencerdcarlson/test-casing repository.

------- Original Message -------
On Monday, March 20th, 2023 at 11:16 AM, Jeff King <peff@peff.net> wrote:


> On Sun, Mar 19, 2023 at 07:22:40AM +0100, Torsten Bögershausen wrote:
> 
> > On Sat, Mar 18, 2023 at 07:21:10PM +0000, dooagain 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)
> > > 
> > > I configured my git repository to ignore case by executing `git config core.ignorecase true` then I executed `git pull` multiple times.
> > 
> > What do you mean by "I configured my git repository" ?
> > The answer is already there, so let's re-rephrase it:
> > Are you working on a case-insensitive file system ?
> > 
> > What happens if you create a test directory, like this:
> > mkdir test-case
> > cd test-case
> > git init
> > git config --get core.ignorecase
> 
> 
> I think this is kind of a red herring, isn't it? The bug report is about
> refs, and I don't think those really respect core.ignorecase either way,
> and inconsistencies are known to happen on case-insensitive filesystems
> (because the refs are sometimes case-sensitive and sometimes not
> depending on whether they are packed or loose in the filesystem).
> 
> So I think this is just a known gotcha, and the path forward is probably
> a new ref storage format that doesn't rely on storing names directly in
> the filesystem (reftable, or some system based on packed-ref slices).
> 
> -Peff

^ permalink raw reply	[relevance 0%]

* Re: Bug: git pull output and case sensitivity.
  @ 2023-03-20 17:16  5%   ` Jeff King
  2023-03-20 18:01  0%     ` dooagain
  0 siblings, 1 reply; 200+ results
From: Jeff King @ 2023-03-20 17:16 UTC (permalink / raw)
  To: Torsten Bögershausen; +Cc: dooagain, git@vger.kernel.org

On Sun, Mar 19, 2023 at 07:22:40AM +0100, Torsten Bögershausen wrote:

> On Sat, Mar 18, 2023 at 07:21:10PM +0000, dooagain 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)
> >
> > I configured my git repository to ignore case by executing `git config core.ignorecase true` then I executed `git pull` multiple times.
> 
> What do you mean by "I configured my git repository" ?
> The answer is already there, so let's re-rephrase it:
> Are you working on a case-insensitive file system ?
> 
> What happens if you create a test directory, like this:
> mkdir test-case
> cd test-case
> git init
> git config --get  core.ignorecase

I think this is kind of a red herring, isn't it? The bug report is about
refs, and I don't think those really respect core.ignorecase either way,
and inconsistencies are known to happen on case-insensitive filesystems
(because the refs are sometimes case-sensitive and sometimes not
depending on whether they are packed or loose in the filesystem).

So I think this is just a known gotcha, and the path forward is probably
a new ref storage format that doesn't rely on storing names directly in
the filesystem (reftable, or some system based on packed-ref slices).

-Peff

^ permalink raw reply	[relevance 5%]

* [PATCH v10 0/3] Enhance credential helper protocol to include auth headers
    2023-02-15 21:34  2%                 ` [PATCH v9 2/3] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
@ 2023-02-16 22:34  1%                 ` Matthew John Cheetham via GitGitGadget
  1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2023-02-16 22:34 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Jeff King,
	Johannes Schindelin, Matthew John Cheetham

Following from my original RFC submission [0], this submission is considered
ready for full review. This patch series is now based on top of current
master (9c32cfb49c60fa8173b9666db02efe3b45a8522f) that includes my now
separately submitted patches [1] to fix up the other credential helpers'
behaviour.

In this patch series I update the existing credential helper design in order
to allow for some new scenarios, and future evolution of auth methods that
Git hosts may wish to provide. I outline the background, summary of changes
and some challenges below.

Testing these new additions, I use a small CGI shell script that acts as a
frontend to git-http-backend; simple authentication is configurable by
files.


Background
==========

Git uses a variety of protocols [2]: local, Smart HTTP, Dumb HTTP, SSH, and
Git. Here I focus on the Smart HTTP protocol, and attempt to enhance the
authentication capabilities of this protocol to address limitations (see
below).

The Smart HTTP protocol in Git supports a few different types of HTTP
authentication - Basic and Digest (RFC 2617) [3], and Negotiate (RFC 2478)
[4]. Git uses a extensible model where credential helpers can provide
credentials for protocols [5]. Several helpers support alternatives such as
OAuth authentication (RFC 6749) [6], but this is typically done as an
extension. For example, a helper might use basic auth and set the password
to an OAuth Bearer access token. Git uses standard input and output to
communicate with credential helpers.

After a HTTP 401 response, Git would call a credential helper with the
following over standard input:

protocol=https
host=example.com


And then a credential helper would return over standard output:

protocol=https
host=example.com
username=bob@id.example.com
password=<BEARER-TOKEN>


Git then the following request to the remote, including the standard HTTP
Authorization header (RFC 7235 Section 4.2) [7]:

GET /info/refs?service=git-upload-pack HTTP/1.1
Host: git.example
Git-Protocol: version=2
Authorization: Basic base64(bob@id.example.com:<BEARER-TOKEN>)


Credential helpers are encouraged (see gitcredentials.txt) to return the
minimum information necessary.


Limitations
===========

Because this credential model was built mostly for password based
authentication systems, it's somewhat limited. In particular:

 1. To generate valid credentials, additional information about the request
    (or indeed the requestee and their device) may be required. For example,
    OAuth is based around scopes. A scope, like "git.read", might be
    required to read data from the remote. However, the remote cannot tell
    the credential helper what scope is required for this request.

 2. This system is not fully extensible. Each time a new type of
    authentication (like OAuth Bearer) is invented, Git needs updates before
    credential helpers can take advantage of it (or leverage a new
    capability in libcurl).


Goals
=====

 * As a user with multiple federated cloud identities:
   
   * Reach out to a remote and have my credential helper automatically
     prompt me for the correct identity.
   * Allow credential helpers to differentiate between different authorities
     or authentication/authorization challenge types, even from the same DNS
     hostname (and without needing to use credential.useHttpPath).
   * Leverage existing authentication systems built-in to many operating
     systems and devices to boost security and reduce reliance on passwords.

 * As a Git host and/or cloud identity provider:
   
   * Enforce security policies (like requiring two-factor authentication)
     dynamically.
   * Allow integration with third party standard based identity providers in
     enterprises allowing customers to have a single plane of control for
     critical identities with access to source code.


Design Principles
=================

 * Use the existing infrastructure. Git credential helpers are an
   already-working model.
 * Follow widely-adopted time-proven open standards, avoid net new ideas in
   the authentication space.
 * Minimize knowledge of authentication in Git; maintain modularity and
   extensibility.


Proposed Changes
================

 1. Teach Git to read HTTP response headers, specifically the standard
    WWW-Authenticate (RFC 7235 Section 4.1) headers.

 2. Teach Git to include extra information about HTTP responses that require
    authentication when calling credential helpers. Specifically the
    WWW-Authenticate header information.
    
    Because the extra information forms an ordered list, and the existing
    credential helper I/O format only provides for simple key=value pairs,
    we introduce a new convention for transmitting an ordered list of
    values. Key names that are suffixed with a C-style array syntax should
    have values considered to form an order list, i.e. key[]=value, where
    the order of the key=value pairs in the stream specifies the order.
    
    For the WWW-Authenticate header values we opt to use the key wwwauth[].


Handling the WWW-Authenticate header in detail
==============================================

RFC 6750 [8] envisions that OAuth Bearer resource servers would give
responses that include WWW-Authenticate headers, for example:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="login.example", scope="git.readwrite"
WWW-Authenticate: Basic realm="login.example"


Specifically, a WWW-Authenticate header consists of a scheme and arbitrary
attributes, depending on the scheme. This pattern enables generic OAuth or
OpenID Connect [9] authorities. Note that it is possible to have several
WWW-Authenticate challenges in a response.

First Git attempts to make a request, unauthenticated, which fails with a
401 response and includes WWW-Authenticate header(s).

Next, Git invokes a credential helper which may prompt the user. If the user
approves, a credential helper can generate a token (or any auth challenge
response) to be used for that request.

For example: with a remote that supports bearer tokens from an OpenID
Connect [9] authority, a credential helper can use OpenID Connect's
Discovery [10] and Dynamic Client Registration [11] to register a client and
make a request with the correct permissions to access the remote. In this
manner, a user can be dynamically sent to the right federated identity
provider for a remote without any up-front configuration or manual
processes.

Following from the principle of keeping authentication knowledge in Git to a
minimum, we modify Git to add all WWW-Authenticate values to the credential
helper call.

Git sends over standard input:

protocol=https
host=example.com
wwwauth[]=Bearer realm="login.example", scope="git.readwrite"
wwwauth[]=Basic realm="login.example"


A credential helper that understands the extra wwwauth[n] property can
decide on the "best" or correct authentication scheme, generate credentials
for the request, and interact with the user.

The credential helper would then return over standard output:

protocol=https
host=example.com
path=foo.git
username=bob@identity.example
password=<BEARER-TOKEN>


Note that WWW-Authenticate supports multiple challenges, either in one
header:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="login.example", scope="git.readwrite", Basic realm="login.example"


or in multiple headers:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="login.example", scope="git.readwrite"
WWW-Authenticate: Basic realm="login.example"


These have equivalent meaning (RFC 2616 Section 4.2 [12]). To simplify the
implementation, Git will not merge or split up any of these WWW-Authenticate
headers, and instead pass each header line as one credential helper
property. The credential helper is responsible for splitting, merging, and
otherwise parsing these header values.

An alternative option to sending the header fields individually would be to
merge the header values in to one key=value property, for example:

...
wwwauth=Bearer realm="login.example", scope="git.readwrite", Basic realm="login.example"



Future work
===========

In the future we can further expand the protocol to allow credential helpers
decide the best authentication scheme. Today credential helpers are still
only expected to return a username/password pair to Git, meaning the other
authentication schemes that may be offered still need challenge responses
sent via a Basic Authorization header. The changes outlined above still
permit helpers to select and configure an available authentication mode, but
require the remote for example to unpack a bearer token from a basic
challenge.

More careful consideration is required in the handling of custom
authentication schemes which may not have a username, or may require
arbitrary additional request header values be set.

For example imagine a new "FooBar" authentication scheme that is surfaced in
the following response:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: FooBar realm="login.example", algs="ES256 PS256"


With support for arbitrary authentication schemes, Git would call credential
helpers with the following over standard input:

protocol=https
host=example.com
wwwauth[]=FooBar realm="login.example", algs="ES256 PS256", nonce="abc123"


And then an enlightened credential helper could return over standard output:

protocol=https
host=example.com
authtype=FooBar
username=bob@id.example.com
password=<FooBar credential>
header[]=X-FooBar: 12345
header[]=X-FooBar-Alt: ABCDEF


Git would be expected to attach this authorization header to the next
request:

GET /info/refs?service=git-upload-pack HTTP/1.1
Host: git.example
Git-Protocol: version=2
Authorization: FooBar <FooBar credential>
X-FooBar: 12345
X-FooBar-Alt: ABCDEF



Why not SSH?
============

There's nothing wrong with SSH. However, Git's Smart HTTP transport is
widely used, often with OAuth Bearer tokens. Git's Smart HTTP transport
sometimes requires less client setup than SSH transport, and works in
environments when SSH ports may be blocked. As long as Git supports HTTP
transport, it should support common and popular HTTP authentication methods.


References
==========

 * [0] [PATCH 0/8] [RFC] Enhance credential helper protocol to include auth
   headers
   https://lore.kernel.org/git/pull.1352.git.1663097156.gitgitgadget@gmail.com/

 * [1] [PATCH 0/3] Correct credential helper discrepancies handling input
   https://lore.kernel.org/git/pull.1363.git.1663865974.gitgitgadget@gmail.com/

 * [2] Git on the Server - The Protocols
   https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols

 * [3] HTTP Authentication: Basic and Digest Access Authentication
   https://datatracker.ietf.org/doc/html/rfc2617

 * [4] The Simple and Protected GSS-API Negotiation Mechanism
   https://datatracker.ietf.org/doc/html/rfc2478

 * [5] Git Credentials - Custom Helpers
   https://git-scm.com/docs/gitcredentials#_custom_helpers

 * [6] The OAuth 2.0 Authorization Framework
   https://datatracker.ietf.org/doc/html/rfc6749

 * [7] Hypertext Transfer Protocol (HTTP/1.1): Authentication
   https://datatracker.ietf.org/doc/html/rfc7235

 * [8] The OAuth 2.0 Authorization Framework: Bearer Token Usage
   https://datatracker.ietf.org/doc/html/rfc6750

 * [9] OpenID Connect Core 1.0
   https://openid.net/specs/openid-connect-core-1_0.html

 * [10] OpenID Connect Discovery 1.0
   https://openid.net/specs/openid-connect-discovery-1_0.html

 * [11] OpenID Connect Dynamic Client Registration 1.0
   https://openid.net/specs/openid-connect-registration-1_0.html

 * [12] Hypertext Transfer Protocol (HTTP/1.1)
   https://datatracker.ietf.org/doc/html/rfc2616


Updates from RFC
================

 * Submitted first three patches as separate submission:
   https://lore.kernel.org/git/pull.1363.git.1663865974.gitgitgadget@gmail.com/

 * Various style fixes and updates to- and addition of comments.

 * Drop the explicit integer index in new 'array' style credential helper
   attrbiutes ("key[n]=value" becomes just "key[]=value").

 * Added test helper; a mini HTTP server, and several tests.


Updates in v3
=============

 * Split final patch that added the test-http-server in to several, easier
   to review patches.

 * Updated wording in git-credential.txt to clarify which side of the
   credential helper protocol is sending/receiving the new wwwauth and
   authtype attributes.


Updates in v4
=============

 * Drop authentication scheme selection authtype attribute patches to
   greatly simplify the series; auth scheme selection is punted to a future
   series. This series still allows credential helpers to generate
   credentials and intelligently select correct identities for a given auth
   challenge.


Updates in v5
=============

 * Libify parts of daemon.c and share implementation with test-http-server.

 * Clarify test-http-server Git request regex pattern and auth logic
   comments.

 * Use STD*_FILENO in place of 'magic' file descriptor numbers.

 * Use strbuf_* functions in continuation header parsing.

 * Use configuration file to configure auth for test-http-server rather than
   command-line arguments. Add ability to specify arbitrary extra headers
   that is useful for testing 'malformed' server responses.

 * Use st_mult over unchecked multiplication in http.c curl callback
   functions.

 * Fix some documentation line break issues.

 * Reorder some commits to bring in the tests and test-http-server helper
   first and, then the WWW-Authentication changes, alongside tests to cover.

 * Expose previously static strvec_push_nodup function.

 * Merge the two timeout args for test-http-server (--timeout and
   --init-timeout) that were a hang-over from the original daemon.c but are
   no longer required here.

 * Be more careful around continuation headers where they may be empty
   strings. Add more tests to cover these header types.

 * Include standard trace2 tracing calls at start of test-http-server
   helper.


Updates in v6
=============

 * Clarify the change to make logging optional in the check_dead_children()
   function during libification of daemon.c.

 * Fix missing pointer dereference bugs identified in libification of child
   process handling functions for daemon.c.

 * Add doc comments to child process handling function declarations in the
   daemon-utils.h header.

 * Align function parameter names with variable names at callsites for
   libified daemon functions.

 * Re-split out the test-http-server test helper commits in to smaller
   patches: error response handling, request parsing, http-backend
   pass-through, simple authentication, arbitrary header support.

 * Call out auth configuration file format for test-http-server test helper
   and supported options in commit messages, as well as a test to exercise
   and demonstrate these options.

 * Permit auth.token and auth.challenge to appear in any order; create the
   struct auth_module just-in-time as options for that scheme are read. This
   simplifies the configuration authoring of the test-http-server test
   helper.

 * Update tests to use auth.allowAnoymous in the patch that introduces the
   new test helper option.

 * Drop the strvec_push_nodup() commit and update the implementation of HTTP
   request header line folding to use xstrdup and strvec_pop and _pushf.

 * Use size_t instead of int in credential.c when iterating over the struct
   strvec credential members. Also drop the not required const and cast from
   the full_key definition and free.

 * Replace in-tree test-credential-helper-reply.sh test cred helper script
   with the lib-credential-helper.sh reusable 'lib' test script and shell
   functions to configure the helper behaviour.

 * Leverage sed over the while read $line loop in the test credential helper
   script.


Updates in v7
=============

 * Address several whitespace and arg/param list alignment issues.

 * Rethink the test-http-helper worker-mode error and result enum to be more
   simple and more informative to the nature of the error.

 * Use uintmax_t to store the Content-Length of a request in the helper
   test-http-server. Maintain a bit flag to store if we received such a
   header.

 * Return a "400 Bad Request" HTTP response if we fail to parse the request
   in the test-http-server.

 * Add test case to cover request message parsing in test-http-server.

 * Use size_t and ALLOC_ARRAY over int and CALLOC_ARRAY respectively in
   get_auth_module.

 * Correctly free the split strbufs created in the header parsing loop in
   test-http-server.

 * Avoid needless comparison > 0 for unsigned types.

 * Always set optional outputs to NULL if not present in test helper config
   value handling.

 * Remove an accidentally commented-out test cleanup line for one test case
   in t5556.


Updates in v8
=============

 * Drop custom HTTP test helper tool in favour of using a CGI shell script
   and Apache; avoiding the need to implement an HTTP server.

 * Avoid allocations in header reading callback unless we have a header we
   care about; act on the char* from libcurl directly rather than create a
   strbuf for each header.

 * Drop st_mult overflow guarding function in curl callback functions; we're
   not allocating memory based on the resulting value and just adds to
   potential confusion in the future.


Updates in v9
=============

 * Drop anoynmous auth tests as these cases are already covered by all other
   tests that perform HTTP interactions with a remote today.

 * In the custom auth CGI script, avoid the empty-substitution in favour of
   testing explicitly for an empty string. Also simplify some other
   conditional expressions.

 * Avoid an allocation on each wwwauth[] credential helper key-value pair
   write.

 * Various style fixups.


Updates in v10
==============

 * Style fixups.

 * Only consider space (SP ' ') and horizontal tab (HTAB '\t') when
   detecting a header continuation line, as per the latest RFC on the
   matter.

 * Update references to old HTTP specs and formal grammars of header fields
   in comments.

 * Rewording of commit messages to remove confusing comment about the case
   sensitivity of header field names - this is not relevant with the current
   iteration of the header parsing code. Also update the message around
   libcurl header support to clarify that physical header lines are
   returned, but not 'logical' header lines.

 * Reword struct credential member doc comment to clarify the purpose of
   header_is_last_match is for re-folding lines of the WWW-Authenticate
   header.

 * Reintroduce helpful comments in tests to show the origin of the 'magic'
   base64 basic auth value.

 * Use grep -F to ensure we don't do regex matching; avoid interpreting
   special characters. Remove erronous insensitive comparison flag.

Matthew John Cheetham (3):
  t5563: add tests for basic and anoymous HTTP access
  http: read HTTP WWW-Authenticate response headers
  credential: add WWW-Authenticate header to cred requests

 Documentation/git-credential.txt |  19 +-
 credential.c                     |   4 +
 credential.h                     |  16 ++
 git-compat-util.h                |  23 +++
 http.c                           | 111 +++++++++++
 t/lib-httpd.sh                   |   1 +
 t/lib-httpd/apache.conf          |   6 +
 t/lib-httpd/nph-custom-auth.sh   |  39 ++++
 t/t5563-simple-http-auth.sh      | 324 +++++++++++++++++++++++++++++++
 9 files changed, 542 insertions(+), 1 deletion(-)
 create mode 100755 t/lib-httpd/nph-custom-auth.sh
 create mode 100755 t/t5563-simple-http-auth.sh


base-commit: c48035d29b4e524aed3a32f0403676f0d9128863
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1352%2Fmjcheetham%2Femu-v10
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1352/mjcheetham/emu-v10
Pull-Request: https://github.com/gitgitgadget/git/pull/1352

Range-diff vs v9:

 1:  05449ec892b ! 1:  f3ccc53055a t5563: add tests for basic and anoymous HTTP access
     @@ t/lib-httpd/nph-custom-auth.sh (new)
      +#
      +
      +if test -n "$HTTP_AUTHORIZATION" && \
     -+	grep -qsi "^${HTTP_AUTHORIZATION}\$" "$VALID_CREDS_FILE"
     ++	grep -Fqsx "${HTTP_AUTHORIZATION}" "$VALID_CREDS_FILE"
      +then
      +	# Note that although git-http-backend returns a status line, it
      +	# does so using a CGI 'Status' header. Because this script is an
     @@ t/t5563-simple-http-auth.sh (new)
      +	EOF
      +'
      +
     -+set_credential_reply() {
     ++set_credential_reply () {
      +	cat >"$TRASH_DIRECTORY/$1-reply.cred"
      +}
      +
     -+expect_credential_query() {
     ++expect_credential_query () {
      +	cat >"$TRASH_DIRECTORY/$1-expect.cred" &&
      +	test_cmp "$TRASH_DIRECTORY/$1-expect.cred" \
      +		 "$TRASH_DIRECTORY/$1-query.cred"
     @@ t/t5563-simple-http-auth.sh (new)
      +	password=secret-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF
 2:  f3f28e508c1 ! 2:  703ac15222f http: read HTTP WWW-Authenticate response headers
     @@ Commit message
          information to credential helpers or others that would otherwise have
          been lost.
      
     -    According to RFC2616 Section 4.2 [1], header field names are not
     -    case-sensitive meaning when collecting multiple values for the same
     -    field name, we can just use the case of the first observed instance of
     -    each field name and no normalisation is required.
     -
          libcurl only provides us with the ability to read all headers recieved
          for a particular request, including any intermediate redirect requests
          or proxies. The lines returned by libcurl include HTTP status lines
     @@ Commit message
      
          The collection of all header values matching the WWW-Authenticate
          header is complicated by the fact that it is legal for header fields to
     -    be continued over multiple lines, but libcurl only gives us one line at
     -    a time.
     +    be continued over multiple lines, but libcurl only gives us each
     +    physical line a time, not each logical header. This line folding feature
     +    is deprecated in RFC 7230 [1] but older servers may still emit them, so
     +    we need to handle them.
      
          In the future [2] we may be able to leverage functions to read headers
          from libcurl itself, but as of today we must do this ourselves.
      
     -    [1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
     +    [1] https://www.rfc-editor.org/rfc/rfc7230#section-3.2
          [2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/
      
          Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
     @@ credential.h: struct credential {
      +	struct strvec wwwauth_headers;
      +
      +	/**
     -+	 * Internal use only. Used to keep track of split header fields
     -+	 * in order to fold multiple lines into one value.
     ++	 * Internal use only. Keeps track of if we previously matched against a
     ++	 * WWW-Authenticate header line in order to re-fold future continuation
     ++	 * lines into one value.
      +	 */
      +	unsigned header_is_last_match:1;
      +
     @@ http.c: size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buff
       }
       
      +/*
     -+ * A folded header continuation line starts with at least one single whitespace
     -+ * character. It is not a continuation line if the line is *just* a newline.
     -+ * The RFC for HTTP states that CRLF is the header field line ending, but some
     -+ * servers may use LF only; we accept both.
     ++ * A folded header continuation line starts with any number of spaces or
     ++ * horizontal tab characters (SP or HTAB) as per RFC 7230 section 3.2.
     ++ * It is not a continuation line if the line starts with any other character.
      + */
      +static inline int is_hdr_continuation(const char *ptr, const size_t size)
      +{
     -+	/* totally empty line or normal header */
     -+	if (!size || !isspace(*ptr))
     -+		return 0;
     -+
     -+	/* empty line with LF line ending */
     -+	if (size == 1 && ptr[0] == '\n')
     -+		return 0;
     -+
     -+	/* empty line with CRLF line ending */
     -+	if (size == 2 && ptr[0] == '\r' && ptr[1] == '\n')
     -+		return 0;
     -+
     -+	return 1;
     ++	return size && (*ptr == ' ' || *ptr == '\t');
      +}
      +
      +static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
     @@ http.c: size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buff
      +	 * strbufs for all operations.
      +	 *
      +	 * In addition, it is possible that header values can be split over
     -+	 * multiple lines as per RFC 2616 (even though this has since been
     -+	 * deprecated in RFC 7230). A continuation header field value is
     -+	 * identified as starting with a space or horizontal tab.
     ++	 * multiple lines as per RFC 7230. 'Line folding' has been deprecated
     ++	 * but older servers may still emit them. A continuation header field
     ++	 * value is identified as starting with a space or horizontal tab.
     ++	 *
     ++	 * The formal definition of a header field as given in RFC 7230 is:
     ++	 *
     ++	 * header-field   = field-name ":" OWS field-value OWS
      +	 *
     -+	 * The formal definition of a header field as given in RFC 2616 is:
     ++	 * field-name     = token
     ++	 * field-value    = *( field-content / obs-fold )
     ++	 * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
     ++	 * field-vchar    = VCHAR / obs-text
      +	 *
     -+	 *   message-header = field-name ":" [ field-value ]
     -+	 *   field-name     = token
     -+	 *   field-value    = *( field-content | LWS )
     -+	 *   field-content  = <the OCTETs making up the field-value
     -+	 *                    and consisting of either *TEXT or combinations
     -+	 *                    of token, separators, and quoted-string>
     ++	 * obs-fold       = CRLF 1*( SP / HTAB )
     ++	 *                ; obsolete line folding
     ++	 *                ; see Section 3.2.4
      +	 */
      +
      +	/* Start of a new WWW-Authenticate header */
     @@ http.c: size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buff
      +		goto exit;
      +	}
      +
     -+	/* This is the start of a new header we don't care about */
     ++	/* Not a continuation of a previously matched auth header line. */
      +	http_auth.header_is_last_match = 0;
      +
      +	/*
 3:  eba58c0d08d ! 3:  186da54fd3b credential: add WWW-Authenticate header to cred requests
     @@ t/t5563-simple-http-auth.sh: test_expect_success 'access using basic auth' '
      +	password=wrong-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF
     @@ t/t5563-simple-http-auth.sh: test_expect_success 'access using basic auth' '
      +	password=secret-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF
     @@ t/t5563-simple-http-auth.sh: test_expect_success 'access using basic auth' '
      +	password=secret-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF
     @@ t/t5563-simple-http-auth.sh: test_expect_success 'access using basic auth' '
      +	password=secret-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF
     @@ t/t5563-simple-http-auth.sh: test_expect_success 'access using basic auth' '
      +	password=secret-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF
     @@ t/t5563-simple-http-auth.sh: test_expect_success 'access using basic auth' '
      +	password=secret-passwd
      +	EOF
      +
     ++	# Basic base64(alice:secret-passwd)
      +	cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
      +	Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
      +	EOF

-- 
gitgitgadget

^ permalink raw reply	[relevance 1%]

* Re: [PATCH v9 2/3] http: read HTTP WWW-Authenticate response headers
  2023-02-15 23:26  6%                   ` Junio C Hamano
@ 2023-02-16 22:29  0%                     ` Matthew John Cheetham
  0 siblings, 0 replies; 200+ results
From: Matthew John Cheetham @ 2023-02-16 22:29 UTC (permalink / raw)
  To: Junio C Hamano, Matthew John Cheetham via GitGitGadget
  Cc: git, Derrick Stolee, Lessley Dennington, M Hickford,
	Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Jeff King,
	Johannes Schindelin

On 2023-02-15 15:26, Junio C Hamano wrote:

> "Matthew John Cheetham via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
> 
>> According to RFC2616 Section 4.2 [1], header field names are not
>> case-sensitive meaning when collecting multiple values for the same
>> field name, we can just use the case of the first observed instance of
>> each field name and no normalisation is required.
> 
> If the names are not case-sensitive, you can choose to first
> downcase the names you see, and use that consistently, and the
> result would still be valid.  IOW, "not case-sensitive" does not at
> all mean you have to use the first observed instance without
> normalization.  You are allowed to choose such an implementation,
> but "not case-sensitive" is not a justification to choose such an
> implementation among possible implementation that would be allowed
> under the rule.

Re-reading this paragraph, it doens't really need to even be here. This was
an artefact of a time when I was storing all headers, including keys and
values. Since we're only interested now in the WWW-Authenticate header
_values_, there's no need to call out this out. Will drop this paragraph.

>> The collection of all header values matching the WWW-Authenticate
>> header is complicated by the fact that it is legal for header fields to
>> be continued over multiple lines, but libcurl only gives us one line at
>> a time.
> 
> Saying "one physical line" at a time may make it clear what you are
> pointing out as a weak point in the interface libcURL gives us (I
> think you are getting at "if they handled header folding for us and
> fed us one logical line at a time, it would have been nicer").

Logical header fields vs physical header lines is useful and clearer
terminology - I will update the commit message to reflect in the next
iteration. Thanks!

>> @@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
>>  	free(c->username);
>>  	free(c->password);
>>  	string_list_clear(&c->helpers, 0);
>> +	strvec_clear(&c->wwwauth_headers);
>>  
>>  	credential_init(c);
>>  }
>> diff --git a/credential.h b/credential.h
>> index f430e77fea4..6f2e5bc610b 100644
>> --- a/credential.h
>> +++ b/credential.h
>> @@ -2,6 +2,7 @@
>>  #define CREDENTIAL_H
>>  
>>  #include "string-list.h"
>> +#include "strvec.h"
>>  
>>  /**
>>   * The credentials API provides an abstracted way of gathering username and
>> @@ -115,6 +116,19 @@ struct credential {
>>  	 */
>>  	struct string_list helpers;
>>  
>> +	/**
>> +	 * A `strvec` of WWW-Authenticate header values. Each string
>> +	 * is the value of a WWW-Authenticate header in an HTTP response,
>> +	 * in the order they were received in the response.
>> +	 */
>> +	struct strvec wwwauth_headers;
>> +
>> +	/**
>> +	 * Internal use only. Used to keep track of split header fields
> 
> The technical term for what you call "split header" here seems to be
> "line folding" (RFC 7230, which deprecates it).
> 
>> +	 * in order to fold multiple lines into one value.
>> +	 */
>> +	unsigned header_is_last_match:1;
>> +
>>  	unsigned approved:1,
>>  		 configured:1,
>>  		 quit:1,
>> @@ -130,6 +144,7 @@ struct credential {
>>  
>>  #define CREDENTIAL_INIT { \
>>  	.helpers = STRING_LIST_INIT_DUP, \
>> +	.wwwauth_headers = STRVEC_INIT, \
>>  }
>>  
>>  /* Initialize a credential structure, setting all fields to empty. */
>> diff --git a/git-compat-util.h b/git-compat-util.h
>> index a76d0526f79..a59230564e8 100644
>> --- a/git-compat-util.h
>> +++ b/git-compat-util.h
>> @@ -1266,6 +1266,29 @@ static inline int skip_iprefix(const char *str, const char *prefix,
>>  	return 0;
>>  }
>>  
>> +/*
>> + * Like skip_prefix_mem, but compare case-insensitively. Note that the
>> + * comparison is done via tolower(), so it is strictly ASCII (no multi-byte
>> + * characters or locale-specific conversions).
>> + */
>> +static inline int skip_iprefix_mem(const char *buf, size_t len,
>> +				   const char *prefix,
>> +				   const char **out, size_t *outlen)
>> +{
>> +	size_t prefix_len = strlen(prefix);
>> +
>> +	if (len < prefix_len)
>> +		return 0;
>> +
>> +	if (!strncasecmp(buf, prefix, prefix_len)) {
>> +		*out = buf + prefix_len;
>> +		*outlen = len - prefix_len;
>> +		return 1;
>> +	}
>> +
>> +	return 0;
>> +}
> 
> OK.
> 
>> diff --git a/http.c b/http.c
>> index 8a5ba3f4776..7a56a3db5f7 100644
>> --- a/http.c
>> +++ b/http.c
>> @@ -183,6 +183,124 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
>>  	return nmemb;
>>  }
>>  
>> +/*
>> + * A folded header continuation line starts with at least one single whitespace
>> + * character. It is not a continuation line if the line is *just* a newline.
>> + * The RFC for HTTP states that CRLF is the header field line ending, but some
>> + * servers may use LF only; we accept both.
>> + */
> 
> Nice.
> 
>> +static inline int is_hdr_continuation(const char *ptr, const size_t size)
>> +{
>> +	/* totally empty line or normal header */
>> +	if (!size || !isspace(*ptr))
>> +		return 0;
> 
> obs-fold (RFC7230) begins the next line with SP or HTAB, but
> isspace() allows not just SP and HT but also CR and LF.  So
> this is a bit pessimistic but rejects what is not a folded
> continuation line reliably.
> 
>> +	/* empty line with LF line ending */
>> +	if (size == 1 && ptr[0] == '\n')
>> +		return 0;
> 
> And this is a blank line after the headers, with LF (not conforming
> but is OK).
> 
>> +	/* empty line with CRLF line ending */
>> +	if (size == 2 && ptr[0] == '\r' && ptr[1] == '\n')
>> +		return 0;
> 
> And this is another form of a blank line after the headers, with
> CRLF.
> 
>> +	return 1;
>> +}
> 
> After rejecting the above two "blank", it is a folded continuation
> line.  OK.
> 
> I wonder if
> 
> 	static inline int ... () {
> 	  	return (size && (*ptr == ' ' || *ptr == '\t'));
> 	}
> 
> sufficient and easier to grok, though.

You're correct. This implementation is 'more correct' and easier to grok.

>> +static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
>> +{
>> +	size_t size = eltsize * nmemb;
>> +	struct strvec *values = &http_auth.wwwauth_headers;
>> +	struct strbuf buf = STRBUF_INIT;
>> +	const char *val;
>> +	size_t val_len;
>> +
>> +	/*
>> +	 * Header lines may not come NULL-terminated from libcurl so we must
>> +	 * limit all scans to the maximum length of the header line, or leverage
>> +	 * strbufs for all operations.
>> +	 *
>> +	 * In addition, it is possible that header values can be split over
>> +	 * multiple lines as per RFC 2616 (even though this has since been
>> +	 * deprecated in RFC 7230). A continuation header field value is
>> +	 * identified as starting with a space or horizontal tab.
>> +	 *
>> +	 * The formal definition of a header field as given in RFC 2616 is:
>> +	 *
>> +	 *   message-header = field-name ":" [ field-value ]
>> +	 *   field-name     = token
>> +	 *   field-value    = *( field-content | LWS )
>> +	 *   field-content  = <the OCTETs making up the field-value
>> +	 *                    and consisting of either *TEXT or combinations
>> +	 *                    of token, separators, and quoted-string>
>> +	 */
>> +
>> +	/* Start of a new WWW-Authenticate header */
>> +	if (skip_iprefix_mem(ptr, size, "www-authenticate:", &val, &val_len)) {
>> +		strbuf_add(&buf, val, val_len);
>> +
>> +		/*
>> +		 * Strip the CRLF that should be present at the end of each
>> +		 * field as well as any trailing or leading whitespace from the
>> +		 * value.
>> +		 */
>> +		strbuf_trim(&buf);
>> +
>> +		strvec_push(values, buf.buf);
>> +		http_auth.header_is_last_match = 1;
>> +		goto exit;
> 
> OK.  We remember that we have seen the beginning of a header we are
> interested in (so that we can append if it is a continuation we see
> next).  Good.
> 
>> +	}
>> +
>> +	/*
>> +	 * This line could be a continuation of the previously matched header
>> +	 * field. If this is the case then we should append this value to the
>> +	 * end of the previously consumed value.
>> +	 */
>> +	if (http_auth.header_is_last_match && is_hdr_continuation(ptr, size)) {
>> +		/*
>> +		 * Trim the CRLF and any leading or trailing from this line.
>> +		 */
>> +		strbuf_add(&buf, ptr, size);
>> +		strbuf_trim(&buf);
>> +
>> +		/*
>> +		 * At this point we should always have at least one existing
>> +		 * value, even if it is empty. Do not bother appending the new
>> +		 * value if this continuation header is itself empty.
>> +		 */
>> +		if (!values->nr) {
>> +			BUG("should have at least one existing header value");
> 
> OK, we should set _is_last_match to true only after we recorded the
> header that might see a continuation, so it would be a bug if we
> didn't have anything there.  Good.
> 
>> +		} else if (buf.len) {
>> +			char *prev = xstrdup(values->v[values->nr - 1]);
>> +
>> +			/* Join two non-empty values with a single space. */
>> +			const char *const sp = *prev ? " " : "";
>> +
>> +			strvec_pop(values);
>> +			strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
>> +			free(prev);
>> +		}
>> +
>> +		goto exit;
> 
> Good that we are prepared to see a logical line split over more than
> two lines (i.e. by not toggling _is_last_match off prematurely here).
> 
>> +	}
>> +
>> +	/* This is the start of a new header we don't care about */
>> +	http_auth.header_is_last_match = 0;
> 
> Or what we just saw and ignored could be a continuation line of a
> header we ignored.  The comment is slightly misleading.

I'll try and reword this to make it more accurate - we have determined
this line is not a continuation of the previous WWW-Authenticate header.

> Other than that, looking good.
> 
> Thanks.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v9 2/3] http: read HTTP WWW-Authenticate response headers
  2023-02-15 21:34  2%                 ` [PATCH v9 2/3] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
@ 2023-02-15 23:26  6%                   ` Junio C Hamano
  2023-02-16 22:29  0%                     ` Matthew John Cheetham
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2023-02-15 23:26 UTC (permalink / raw)
  To: Matthew John Cheetham via GitGitGadget
  Cc: git, Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Jeff King,
	Johannes Schindelin

"Matthew John Cheetham via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> According to RFC2616 Section 4.2 [1], header field names are not
> case-sensitive meaning when collecting multiple values for the same
> field name, we can just use the case of the first observed instance of
> each field name and no normalisation is required.

If the names are not case-sensitive, you can choose to first
downcase the names you see, and use that consistently, and the
result would still be valid.  IOW, "not case-sensitive" does not at
all mean you have to use the first observed instance without
normalization.  You are allowed to choose such an implementation,
but "not case-sensitive" is not a justification to choose such an
implementation among possible implementation that would be allowed
under the rule.

> The collection of all header values matching the WWW-Authenticate
> header is complicated by the fact that it is legal for header fields to
> be continued over multiple lines, but libcurl only gives us one line at
> a time.

Saying "one physical line" at a time may make it clear what you are
pointing out as a weak point in the interface libcURL gives us (I
think you are getting at "if they handled header folding for us and
fed us one logical line at a time, it would have been nicer").

> @@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
>  	free(c->username);
>  	free(c->password);
>  	string_list_clear(&c->helpers, 0);
> +	strvec_clear(&c->wwwauth_headers);
>  
>  	credential_init(c);
>  }
> diff --git a/credential.h b/credential.h
> index f430e77fea4..6f2e5bc610b 100644
> --- a/credential.h
> +++ b/credential.h
> @@ -2,6 +2,7 @@
>  #define CREDENTIAL_H
>  
>  #include "string-list.h"
> +#include "strvec.h"
>  
>  /**
>   * The credentials API provides an abstracted way of gathering username and
> @@ -115,6 +116,19 @@ struct credential {
>  	 */
>  	struct string_list helpers;
>  
> +	/**
> +	 * A `strvec` of WWW-Authenticate header values. Each string
> +	 * is the value of a WWW-Authenticate header in an HTTP response,
> +	 * in the order they were received in the response.
> +	 */
> +	struct strvec wwwauth_headers;
> +
> +	/**
> +	 * Internal use only. Used to keep track of split header fields

The technical term for what you call "split header" here seems to be
"line folding" (RFC 7230, which deprecates it).

> +	 * in order to fold multiple lines into one value.
> +	 */
> +	unsigned header_is_last_match:1;
> +
>  	unsigned approved:1,
>  		 configured:1,
>  		 quit:1,
> @@ -130,6 +144,7 @@ struct credential {
>  
>  #define CREDENTIAL_INIT { \
>  	.helpers = STRING_LIST_INIT_DUP, \
> +	.wwwauth_headers = STRVEC_INIT, \
>  }
>  
>  /* Initialize a credential structure, setting all fields to empty. */
> diff --git a/git-compat-util.h b/git-compat-util.h
> index a76d0526f79..a59230564e8 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -1266,6 +1266,29 @@ static inline int skip_iprefix(const char *str, const char *prefix,
>  	return 0;
>  }
>  
> +/*
> + * Like skip_prefix_mem, but compare case-insensitively. Note that the
> + * comparison is done via tolower(), so it is strictly ASCII (no multi-byte
> + * characters or locale-specific conversions).
> + */
> +static inline int skip_iprefix_mem(const char *buf, size_t len,
> +				   const char *prefix,
> +				   const char **out, size_t *outlen)
> +{
> +	size_t prefix_len = strlen(prefix);
> +
> +	if (len < prefix_len)
> +		return 0;
> +
> +	if (!strncasecmp(buf, prefix, prefix_len)) {
> +		*out = buf + prefix_len;
> +		*outlen = len - prefix_len;
> +		return 1;
> +	}
> +
> +	return 0;
> +}

OK.

> diff --git a/http.c b/http.c
> index 8a5ba3f4776..7a56a3db5f7 100644
> --- a/http.c
> +++ b/http.c
> @@ -183,6 +183,124 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
>  	return nmemb;
>  }
>  
> +/*
> + * A folded header continuation line starts with at least one single whitespace
> + * character. It is not a continuation line if the line is *just* a newline.
> + * The RFC for HTTP states that CRLF is the header field line ending, but some
> + * servers may use LF only; we accept both.
> + */

Nice.

> +static inline int is_hdr_continuation(const char *ptr, const size_t size)
> +{
> +	/* totally empty line or normal header */
> +	if (!size || !isspace(*ptr))
> +		return 0;

obs-fold (RFC7230) begins the next line with SP or HTAB, but
isspace() allows not just SP and HT but also CR and LF.  So
this is a bit pessimistic but rejects what is not a folded
continuation line reliably.

> +	/* empty line with LF line ending */
> +	if (size == 1 && ptr[0] == '\n')
> +		return 0;

And this is a blank line after the headers, with LF (not conforming
but is OK).

> +	/* empty line with CRLF line ending */
> +	if (size == 2 && ptr[0] == '\r' && ptr[1] == '\n')
> +		return 0;

And this is another form of a blank line after the headers, with
CRLF.

> +	return 1;
> +}

After rejecting the above two "blank", it is a folded continuation
line.  OK.

I wonder if

	static inline int ... () {
	  	return (size && (*ptr == ' ' || *ptr == '\t'));
	}

sufficient and easier to grok, though.

> +static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
> +{
> +	size_t size = eltsize * nmemb;
> +	struct strvec *values = &http_auth.wwwauth_headers;
> +	struct strbuf buf = STRBUF_INIT;
> +	const char *val;
> +	size_t val_len;
> +
> +	/*
> +	 * Header lines may not come NULL-terminated from libcurl so we must
> +	 * limit all scans to the maximum length of the header line, or leverage
> +	 * strbufs for all operations.
> +	 *
> +	 * In addition, it is possible that header values can be split over
> +	 * multiple lines as per RFC 2616 (even though this has since been
> +	 * deprecated in RFC 7230). A continuation header field value is
> +	 * identified as starting with a space or horizontal tab.
> +	 *
> +	 * The formal definition of a header field as given in RFC 2616 is:
> +	 *
> +	 *   message-header = field-name ":" [ field-value ]
> +	 *   field-name     = token
> +	 *   field-value    = *( field-content | LWS )
> +	 *   field-content  = <the OCTETs making up the field-value
> +	 *                    and consisting of either *TEXT or combinations
> +	 *                    of token, separators, and quoted-string>
> +	 */
> +
> +	/* Start of a new WWW-Authenticate header */
> +	if (skip_iprefix_mem(ptr, size, "www-authenticate:", &val, &val_len)) {
> +		strbuf_add(&buf, val, val_len);
> +
> +		/*
> +		 * Strip the CRLF that should be present at the end of each
> +		 * field as well as any trailing or leading whitespace from the
> +		 * value.
> +		 */
> +		strbuf_trim(&buf);
> +
> +		strvec_push(values, buf.buf);
> +		http_auth.header_is_last_match = 1;
> +		goto exit;

OK.  We remember that we have seen the beginning of a header we are
interested in (so that we can append if it is a continuation we see
next).  Good.

> +	}
> +
> +	/*
> +	 * This line could be a continuation of the previously matched header
> +	 * field. If this is the case then we should append this value to the
> +	 * end of the previously consumed value.
> +	 */
> +	if (http_auth.header_is_last_match && is_hdr_continuation(ptr, size)) {
> +		/*
> +		 * Trim the CRLF and any leading or trailing from this line.
> +		 */
> +		strbuf_add(&buf, ptr, size);
> +		strbuf_trim(&buf);
> +
> +		/*
> +		 * At this point we should always have at least one existing
> +		 * value, even if it is empty. Do not bother appending the new
> +		 * value if this continuation header is itself empty.
> +		 */
> +		if (!values->nr) {
> +			BUG("should have at least one existing header value");

OK, we should set _is_last_match to true only after we recorded the
header that might see a continuation, so it would be a bug if we
didn't have anything there.  Good.

> +		} else if (buf.len) {
> +			char *prev = xstrdup(values->v[values->nr - 1]);
> +
> +			/* Join two non-empty values with a single space. */
> +			const char *const sp = *prev ? " " : "";
> +
> +			strvec_pop(values);
> +			strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
> +			free(prev);
> +		}
> +
> +		goto exit;

Good that we are prepared to see a logical line split over more than
two lines (i.e. by not toggling _is_last_match off prematurely here).

> +	}
> +
> +	/* This is the start of a new header we don't care about */
> +	http_auth.header_is_last_match = 0;

Or what we just saw and ignored could be a continuation line of a
header we ignored.  The comment is slightly misleading.

Other than that, looking good.

Thanks.

^ permalink raw reply	[relevance 6%]

* [PATCH v9 2/3] http: read HTTP WWW-Authenticate response headers
  @ 2023-02-15 21:34  2%                 ` Matthew John Cheetham via GitGitGadget
  2023-02-15 23:26  6%                   ` Junio C Hamano
  2023-02-16 22:34  1%                 ` [PATCH v10 0/3] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
  1 sibling, 1 reply; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2023-02-15 21:34 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Jeff King,
	Johannes Schindelin, Matthew John Cheetham, Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c      |   1 +
 credential.h      |  15 ++++++
 git-compat-util.h |  23 +++++++++
 http.c            | 120 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 159 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/git-compat-util.h b/git-compat-util.h
index a76d0526f79..a59230564e8 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1266,6 +1266,29 @@ static inline int skip_iprefix(const char *str, const char *prefix,
 	return 0;
 }
 
+/*
+ * Like skip_prefix_mem, but compare case-insensitively. Note that the
+ * comparison is done via tolower(), so it is strictly ASCII (no multi-byte
+ * characters or locale-specific conversions).
+ */
+static inline int skip_iprefix_mem(const char *buf, size_t len,
+				   const char *prefix,
+				   const char **out, size_t *outlen)
+{
+	size_t prefix_len = strlen(prefix);
+
+	if (len < prefix_len)
+		return 0;
+
+	if (!strncasecmp(buf, prefix, prefix_len)) {
+		*out = buf + prefix_len;
+		*outlen = len - prefix_len;
+		return 1;
+	}
+
+	return 0;
+}
+
 static inline int strtoul_ui(char const *s, int base, unsigned int *result)
 {
 	unsigned long ul;
diff --git a/http.c b/http.c
index 8a5ba3f4776..7a56a3db5f7 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,124 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+/*
+ * A folded header continuation line starts with at least one single whitespace
+ * character. It is not a continuation line if the line is *just* a newline.
+ * The RFC for HTTP states that CRLF is the header field line ending, but some
+ * servers may use LF only; we accept both.
+ */
+static inline int is_hdr_continuation(const char *ptr, const size_t size)
+{
+	/* totally empty line or normal header */
+	if (!size || !isspace(*ptr))
+		return 0;
+
+	/* empty line with LF line ending */
+	if (size == 1 && ptr[0] == '\n')
+		return 0;
+
+	/* empty line with CRLF line ending */
+	if (size == 2 && ptr[0] == '\r' && ptr[1] == '\n')
+		return 0;
+
+	return 1;
+}
+
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = eltsize * nmemb;
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+	size_t val_len;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix_mem(ptr, size, "www-authenticate:", &val, &val_len)) {
+		strbuf_add(&buf, val, val_len);
+
+		/*
+		 * Strip the CRLF that should be present at the end of each
+		 * field as well as any trailing or leading whitespace from the
+		 * value.
+		 */
+		strbuf_trim(&buf);
+
+		strvec_push(values, buf.buf);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 */
+	if (http_auth.header_is_last_match && is_hdr_continuation(ptr, size)) {
+		/*
+		 * Trim the CRLF and any leading or trailing from this line.
+		 */
+		strbuf_add(&buf, ptr, size);
+		strbuf_trim(&buf);
+
+		/*
+		 * At this point we should always have at least one existing
+		 * value, even if it is empty. Do not bother appending the new
+		 * value if this continuation header is itself empty.
+		 */
+		if (!values->nr) {
+			BUG("should have at least one existing header value");
+		} else if (buf.len) {
+			char *prev = xstrdup(values->v[values->nr - 1]);
+
+			/* Join two non-empty values with a single space. */
+			const char *const sp = *prev ? " " : "";
+
+			strvec_pop(values);
+			strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
+			free(prev);
+		}
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (!strncasecmp(ptr, "http/", 5))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1864,6 +1982,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 2%]

* [PATCH v8 2/3] http: read HTTP WWW-Authenticate response headers
  @ 2023-02-06 19:29  2%               ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2023-02-06 19:29 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Jeff King,
	Johannes Schindelin, Matthew John Cheetham, Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c      |   1 +
 credential.h      |  15 ++++++
 git-compat-util.h |  22 +++++++++
 http.c            | 120 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 158 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/git-compat-util.h b/git-compat-util.h
index a76d0526f79..f11c44517d7 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1266,6 +1266,28 @@ static inline int skip_iprefix(const char *str, const char *prefix,
 	return 0;
 }
 
+/*
+ * Like skip_prefix_mem, but compare case-insensitively. Note that the
+ * comparison is done via tolower(), so it is strictly ASCII (no multi-byte
+ * characters or locale-specific conversions).
+ */
+static inline int skip_iprefix_mem(const char *buf, size_t len,
+				   const char *prefix,
+				   const char **out, size_t *outlen)
+{
+	size_t prefix_len = strlen(prefix);
+	if (len < prefix_len)
+		return 0;
+
+	if (!strncasecmp(buf, prefix, prefix_len)){
+		*out = buf + prefix_len;
+		*outlen = len - prefix_len;
+		return 1;
+	}
+
+	return 0;
+}
+
 static inline int strtoul_ui(char const *s, int base, unsigned int *result)
 {
 	unsigned long ul;
diff --git a/http.c b/http.c
index 8a5ba3f4776..7a56a3db5f7 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,124 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+/*
+ * A folded header continuation line starts with at least one single whitespace
+ * character. It is not a continuation line if the line is *just* a newline.
+ * The RFC for HTTP states that CRLF is the header field line ending, but some
+ * servers may use LF only; we accept both.
+ */
+static inline int is_hdr_continuation(const char *ptr, const size_t size)
+{
+	/* totally empty line or normal header */
+	if (!size || !isspace(*ptr))
+		return 0;
+
+	/* empty line with LF line ending */
+	if (size == 1 && ptr[0] == '\n')
+		return 0;
+
+	/* empty line with CRLF line ending */
+	if (size == 2 && ptr[0] == '\r' && ptr[1] == '\n')
+		return 0;
+
+	return 1;
+}
+
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = eltsize * nmemb;
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+	size_t val_len;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix_mem(ptr, size, "www-authenticate:", &val, &val_len)) {
+		strbuf_add(&buf, val, val_len);
+
+		/*
+		 * Strip the CRLF that should be present at the end of each
+		 * field as well as any trailing or leading whitespace from the
+		 * value.
+		 */
+		strbuf_trim(&buf);
+
+		strvec_push(values, buf.buf);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 */
+	if (http_auth.header_is_last_match && is_hdr_continuation(ptr, size)) {
+		/*
+		 * Trim the CRLF and any leading or trailing from this line.
+		 */
+		strbuf_add(&buf, ptr, size);
+		strbuf_trim(&buf);
+
+		/*
+		 * At this point we should always have at least one existing
+		 * value, even if it is empty. Do not bother appending the new
+		 * value if this continuation header is itself empty.
+		 */
+		if (!values->nr) {
+			BUG("should have at least one existing header value");
+		} else if (buf.len) {
+			char *prev = xstrdup(values->v[values->nr - 1]);
+
+			/* Join two non-empty values with a single space. */
+			const char *const sp = *prev ? " " : "";
+
+			strvec_pop(values);
+			strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
+			free(prev);
+		}
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (!strncasecmp(ptr, "http/", 5))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1864,6 +1982,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 2%]

* [PATCH v7 11/12] http: read HTTP WWW-Authenticate response headers
  @ 2023-01-20 22:08  3%             ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2023-01-20 22:08 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Matthew John Cheetham,
	Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 15 +++++++++
 http.c       | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 110 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index a2a80318bb2..595c93bc7a3 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,98 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = st_mult(eltsize, nmemb);
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val))
+			val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 * Continuation lines start with at least one whitespace, maybe more,
+	 * so we should collapse these down to a single SP (valid per the spec).
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		/* Trim leading whitespace from this continuation hdr line. */
+		strbuf_ltrim(&buf);
+
+		/*
+		 * At this point we should always have at least one existing
+		 * value, even if it is empty. Do not bother appending the new
+		 * value if this continuation header is itself empty.
+		 */
+		if (!values->nr) {
+			BUG("should have at least one existing header value");
+		} else if (buf.len) {
+			char *prev = xstrdup(values->v[values->nr - 1]);
+
+			/* Join two non-empty values with a single space. */
+			const char *const sp = *prev ? " " : "";
+
+			strvec_pop(values);
+			strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
+			free(prev);
+		}
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (istarts_with(buf.buf, "http/"))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1864,6 +1956,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* Re: Race condition on `git checkout -c`
  2023-01-19 22:55  7% ` Chris Torek
@ 2023-01-20  9:01  0%   ` Arthur Milchior
  0 siblings, 0 replies; 200+ results
From: Arthur Milchior @ 2023-01-20  9:01 UTC (permalink / raw)
  To: Chris Torek; +Cc: git

Thank you very much for the explanation. I’m ever so happy not to be
working at the file system level nor on cross platform app.
Alas, it’s a computer configured by work, so not only do I have no
control over the disk configuration, but I’m not even allowed to plus
external storage. So I guess I’ll just remain with the case
almost-insensitive branch. Not like I expect this to occur again in
the future.

Good luck with whatever next change git plans.

Regards,
Arthur

On Thu, Jan 19, 2023 at 11:56 PM Chris Torek <chris.torek@gmail.com> wrote:
>
> (Top note: you mean `git checkout -b` or `git switch -c`, not `git
> checkout -c`.)
>
> On Thu, Jan 19, 2023 at 1:24 PM Arthur Milchior
> <arthur.milchior@gmail.com> wrote:
> >
> > I expect either:
> > * to see an error message stating that `b` already exists
> > * to see `b` and `B` in the list of branch.
>
> [snip]
>
> > uname: Darwin 22.2.0 Darwin Kernel Version 22.2.0: Fri Nov 11 02:03:51
>
> Darwin (macOS) is your problem here.  The same problem
> occurs on Windows, but not on Linux, by default.
>
> Technically the problem is in the file system itself, combined with
> the ways (plural) that Git stores branch names.
>
> As far as Git itself is concerned, branch names are *always* case
> sensitive, so branches named `b` and `B` are different.  But Git
> stores branch names in two different formats, at the moment:
>
>  * Some are kept in a plain-text file `.git/packed-refs`.
>  * Some are stored as directory-and-file-names in `.git/refs/`.
>
> If the OS's file system is case sensitive, as most standard Linux
> file systems are, there's no problem with the latter. But if the OS's
> file system is case-INsensitive, as the default file systems on
> Windows and MacOS are, this becomes a problem: the attempt
> to create both `refs/heads/b` and a different file, `refs/head/B`,
> fails, with one of the two names "winning" and the other attempt
> to create a new name simply re-using the existing name.
>
> If you create a case-sensitive disk volume on your Mac, which
> can be a simple click-to-mount virtual drive within your regular
> case-insensitive file system, you can happily use Git without this
> complication. Note that the same complication applies to file
> names: Linux users can create two different, separate files
> named `README.TXT` and `ReadMe.txt` in a GIt project, and
> if you use the default case-insensitive macOS file system, you
> won't be able to check out both files.  Using your case sensitive
> volume will allow you to work with the Linux group.
>
> If and when a future version of Git starts using reftables instead
> of the file system to store branch and tag names, this particular
> issue will go away, but until then, I recommend keeping a case
> sensitive volume handy on your mac, and more generally,
> avoiding mixing upper and lower case branch and/or file names
> (at all, ever) whenever possible.  This avoids a lot of problems,
> though nothing can get you past the Windows `aux.h` problem. :-)
>
> Chris

^ permalink raw reply	[relevance 0%]

* Re: Race condition on `git checkout -c`
  @ 2023-01-19 22:55  7% ` Chris Torek
  2023-01-20  9:01  0%   ` Arthur Milchior
  0 siblings, 1 reply; 200+ results
From: Chris Torek @ 2023-01-19 22:55 UTC (permalink / raw)
  To: Arthur Milchior; +Cc: git

(Top note: you mean `git checkout -b` or `git switch -c`, not `git
checkout -c`.)

On Thu, Jan 19, 2023 at 1:24 PM Arthur Milchior
<arthur.milchior@gmail.com> wrote:
>
> I expect either:
> * to see an error message stating that `b` already exists
> * to see `b` and `B` in the list of branch.

[snip]

> uname: Darwin 22.2.0 Darwin Kernel Version 22.2.0: Fri Nov 11 02:03:51

Darwin (macOS) is your problem here.  The same problem
occurs on Windows, but not on Linux, by default.

Technically the problem is in the file system itself, combined with
the ways (plural) that Git stores branch names.

As far as Git itself is concerned, branch names are *always* case
sensitive, so branches named `b` and `B` are different.  But Git
stores branch names in two different formats, at the moment:

 * Some are kept in a plain-text file `.git/packed-refs`.
 * Some are stored as directory-and-file-names in `.git/refs/`.

If the OS's file system is case sensitive, as most standard Linux
file systems are, there's no problem with the latter. But if the OS's
file system is case-INsensitive, as the default file systems on
Windows and MacOS are, this becomes a problem: the attempt
to create both `refs/heads/b` and a different file, `refs/head/B`,
fails, with one of the two names "winning" and the other attempt
to create a new name simply re-using the existing name.

If you create a case-sensitive disk volume on your Mac, which
can be a simple click-to-mount virtual drive within your regular
case-insensitive file system, you can happily use Git without this
complication. Note that the same complication applies to file
names: Linux users can create two different, separate files
named `README.TXT` and `ReadMe.txt` in a GIt project, and
if you use the default case-insensitive macOS file system, you
won't be able to check out both files.  Using your case sensitive
volume will allow you to work with the Linux group.

If and when a future version of Git starts using reftables instead
of the file system to store branch and tag names, this particular
issue will go away, but until then, I recommend keeping a case
sensitive volume handy on your mac, and more generally,
avoiding mixing upper and lower case branch and/or file names
(at all, ever) whenever possible.  This avoids a lot of problems,
though nothing can get you past the Windows `aux.h` problem. :-)

Chris

^ permalink raw reply	[relevance 7%]

* [PATCH v6 11/12] http: read HTTP WWW-Authenticate response headers
  @ 2023-01-18  3:30  3%           ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2023-01-18  3:30 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Ævar Arnfjörð Bjarmason, Matthew John Cheetham,
	Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 15 +++++++++
 http.c       | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 110 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index a2a80318bb2..595c93bc7a3 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,98 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = st_mult(eltsize, nmemb);
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val))
+			val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 * Continuation lines start with at least one whitespace, maybe more,
+	 * so we should collapse these down to a single SP (valid per the spec).
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		/* Trim leading whitespace from this continuation hdr line. */
+		strbuf_ltrim(&buf);
+
+		/*
+		 * At this point we should always have at least one existing
+		 * value, even if it is empty. Do not bother appending the new
+		 * value if this continuation header is itself empty.
+		 */
+		if (!values->nr) {
+			BUG("should have at least one existing header value");
+		} else if (buf.len) {
+			char *prev = xstrdup(values->v[values->nr - 1]);
+
+			/* Join two non-empty values with a single space. */
+			const char *const sp = *prev ? " " : "";
+
+			strvec_pop(values);
+			strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
+			free(prev);
+		}
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (istarts_with(buf.buf, "http/"))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1864,6 +1956,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* [PATCH v5 09/10] http: read HTTP WWW-Authenticate response headers
  @ 2023-01-11 22:13  3%         ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2023-01-11 22:13 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Victoria Dye,
	Matthew John Cheetham, Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 15 ++++++++
 http.c       | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 114 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index a2a80318bb2..10882034145 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,102 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = st_mult(eltsize, nmemb);
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val))
+			val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 * Continuation lines start with at least one whitespace, maybe more,
+	 * so we should collapse these down to a single SP (valid per the spec).
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		/* Trim leading whitespace from this continuation hdr line. */
+		strbuf_ltrim(&buf);
+
+		/*
+		 * At this point we should always have at least one existing
+		 * value, even if it is empty. Do not bother appending the new
+		 * value if this continuation header is itself empty.
+		 */
+		if (!values->nr) {
+			BUG("should have at least one existing header value");
+		} else if (buf.len) {
+			const char *prev = values->v[values->nr - 1];
+			struct strbuf append = STRBUF_INIT;
+			strbuf_addstr(&append, prev);
+
+			/* Join two non-empty values with a single space. */
+			if (append.len)
+				strbuf_addch(&append, ' ');
+
+			strbuf_addbuf(&append, &buf);
+
+			strvec_pop(values);
+			strvec_push_nodup(values, strbuf_detach(&append, NULL));
+		}
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (istarts_with(buf.buf, "http/"))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1864,6 +1960,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* [PATCH v4 1/8] http: read HTTP WWW-Authenticate response headers
  @ 2022-12-12 21:36  3%       ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2022-12-12 21:36 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Glen Choo, Matthew John Cheetham,
	Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 15 ++++++++++
 http.c       | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 94 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index 8a5ba3f4776..c4e9cd73e14 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,82 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = eltsize * nmemb;
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+	const char *z = NULL;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val))
+			val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		const char **v = values->v + values->nr - 1;
+		char *append = xstrfmt("%s%.*s", *v, (int)(size - 1), ptr + 1);
+
+		free((void*)*v);
+		*v = append;
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (skip_iprefix(buf.buf, "http/", &z))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1864,6 +1940,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH 0/2] add case insensitivity option to bash completion
  2022-11-05 17:28  5% [PATCH 0/2] add case insensitivity option to bash completion Alison Winters via GitGitGadget
  2022-11-21  0:26  6% ` [PATCH v2 " Alison Winters via GitGitGadget
@ 2022-11-29  2:38  0% ` Junio C Hamano
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2022-11-29  2:38 UTC (permalink / raw)
  To: Alison Winters via GitGitGadget, Johannes Schindelin,
	Ævar Arnfjörð Bjarmason, Sibi Siddharthan
  Cc: git, Alison Winters

"Alison Winters via GitGitGadget" <gitgitgadget@gmail.com> writes:

> In 3bb16a8bf2 (tag, branch, for-each-ref: add --ignore-case for sorting and
> filtering, 2016-12-04), support was added for filtering and sorting refs in
> a case insensitive way. This is a behavior that seems appropriate to enable
> with shell completion. Many shells provide case insensitive completion as an
> option, even on filesystems that remain case sensitive.
>
> This patch adds a new variable that, when set, will allow Bash completion to
> use the --ignore-case option to match refs. Additionally, some basic support
> is implemented to match pseudorefs like HEAD.

I did not try to figure out the reason but the topic with its tests
seem to break in 'seen' the linux-cmake-ctest CI job.

  https://github.com/git/git/actions/runs/3570230611/jobs/6001013549

but the same test does not break under usual "make test".

Can people who are interested in the cmake-ctest stuff take a look?

It is tempting to eject the ab/cmake-nix-and-ci topic that is
already in 'next', under the theory that what that topic does to the
tests "works" for some tests but not for others, and this topic is
an unfortunate collateral damage whose tests weren't something the
other topic supports well.  If the cmake-ctest stuff is in such a
shape, then it may have been a bit premature to merge it down.

Thanks.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] config: introduce an Operating System-specific `includeIf` condition
  2022-11-23 15:07  0%         ` Phillip Wood
@ 2022-11-23 23:51  5%           ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-11-23 23:51 UTC (permalink / raw)
  To: Phillip Wood
  Cc: Ævar Arnfjörð Bjarmason,
	Johannes Schindelin via GitGitGadget, git, Johannes Schindelin

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

> I can see that we would want to respect the preferred spelling in our
> documentation but it seems a bit mean to penalize users who write
>
> 	[IncludeIf "os:windows"]
>
> rather than
>
> 	[IncludeIf "os:Windows"]

I do not think "uname-s/i:windows" is out of question.  I am saying
that the default should be case sensitive for consistency with
others.

Also, as I said already, I do not think we should squat on a good
name "os" with this "uname -s" feature that may not be a good
differenciator for two OSes for some cases (e.g. telling Debian and
Fedora apart was a good example raised upthread already).

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v2] config: introduce an Operating System-specific `includeIf` condition
  2022-11-23  0:16  0%       ` Junio C Hamano
@ 2022-11-23 15:07  0%         ` Phillip Wood
  2022-11-23 23:51  5%           ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Phillip Wood @ 2022-11-23 15:07 UTC (permalink / raw)
  To: Junio C Hamano, Phillip Wood
  Cc: Ævar Arnfjörð Bjarmason,
	Johannes Schindelin via GitGitGadget, git, Johannes Schindelin

Hi Junio

Welcome back, I hope you enjoyed your time away from the list.

On 23/11/2022 00:16, Junio C Hamano wrote:
> Phillip Wood <phillip.wood123@gmail.com> writes:
> 
>> All the other items listed in your table such as branch names are case
>> sensitive. The os name is not so it is of no benefit at all to the
> 
> You keep saying that you consider the OS name is case insensitive,
> but I doubt that is the case, not in the sense that MacOS and macOS
> are two different operating systems, but in the sense that OS
> publishers have a single preferred way to spell their ware (which is
> shown in "uname -s" output), and we should respect that.

I can see that we would want to respect the preferred spelling in our 
documentation but it seems a bit mean to penalize users who write

	[IncludeIf "os:windows"]

rather than

	[IncludeIf "os:Windows"]

Best Wishes

Phillip


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] config: introduce an Operating System-specific `includeIf` condition
  2022-11-22 14:31  6%     ` Phillip Wood
@ 2022-11-23  0:16  0%       ` Junio C Hamano
  2022-11-23 15:07  0%         ` Phillip Wood
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2022-11-23  0:16 UTC (permalink / raw)
  To: Phillip Wood
  Cc: Ævar Arnfjörð Bjarmason,
	Johannes Schindelin via GitGitGadget, git, Johannes Schindelin

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

> All the other items listed in your table such as branch names are case
> sensitive. The os name is not so it is of no benefit at all to the

You keep saying that you consider the OS name is case insensitive,
but I doubt that is the case, not in the sense that MacOS and macOS
are two different operating systems, but in the sense that OS
publishers have a single preferred way to spell their ware (which is
shown in "uname -s" output), and we should respect that.


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] config: introduce an Operating System-specific `includeIf` condition
  2022-11-22 14:01  5%   ` Ævar Arnfjörð Bjarmason
@ 2022-11-22 14:31  6%     ` Phillip Wood
  2022-11-23  0:16  0%       ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Phillip Wood @ 2022-11-22 14:31 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason,
	Johannes Schindelin via GitGitGadget
  Cc: git, Phillip Wood, Johannes Schindelin

On 22/11/2022 14:01, Ævar Arnfjörð Bjarmason wrote:
> 
> On Mon, Nov 21 2022, Johannes Schindelin via GitGitGadget wrote:
> 
>> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>>
>> +`os`::
>> +	The data that follows this keyword is taken as the name of an
>> +	Operating System, e.g. `Linux` or `Windows`; If it matches the
>> +	current Operating System, the include condition is met.
>> +
>>   A few more notes on matching via `gitdir` and `gitdir/i`:
> 
> The reste of the "includeif" use glob matching and "/i" for icase. IOW
> this is how this new feature would fit in:
> 	
> 	|--------+--------+----------+----------+------------------+----|
> 	|        | gitdir | gitdir/i | onbranch | hasconfig:remote | os |
> 	|--------+--------+----------+----------+------------------+----|
> 	| icase? | N      | Y        | N        | N                | Y  |
> 	| glob?  | Y      | Y        | Y        | Y                | N  |
> 	| path?  | Y      | Y        | Y        | Y                | N  |
> 	|--------+--------+----------+----------+------------------+----|
> 
> I think at least flipping that "glob" to "Y" so you could match e.g.
> "*BSD" would be useful, and easier to explain in context, rather than
> why the rest use wildmatch() and this doesn't.

Globbing could be useful for the BSDs.

One other thing I thought of is will users know "Darwin" means MacOS?

> For matching the uname the case doesn't really matter, but for
> consistency of the interface I think making it case-sensitive or adding
> an "os/i" would make sense. I.e. let's consistently use "/i" if & when
> something's case-insensitive.

All the other items listed in your table such as branch names are case 
sensitive. The os name is not so it is of no benefit at all to the user 
to match it case sensitively. Let's consistently test case sensitive 
keys cases sensitively and case insensitive keys case insensitively.

Best Wishes

Phillip

>> +test_expect_success '[includeIf "os:..."]' '
>> +	test_config x.y 0 &&
>> +	echo "[x] y = z" >.git/xyz &&
>> +
>> +	if test_have_prereq MINGW
>> +	then
>> +		uname_s=Windows
>> +	else
>> +		uname_s="$(uname -s)"
>> +	fi &&
>> +	test_config "includeIf.os:not-$uname_s.path" xyz &&
>> +	test 0 = "$(git config x.y)" &&
>> +	test_config "includeIf.os:$uname_s.path" xyz &&
>> +	test z = "$(git config x.y)"
>> +'
> 
> As I pointed out in the v1, this still:
> 
>   * Hides segfaults in "git config", let's check the exit code.
>   * Doesn't test the "icase" semantics you're introducing. Let's do that
>     if it's intentional.

^ permalink raw reply	[relevance 6%]

* Re: [PATCH v2] config: introduce an Operating System-specific `includeIf` condition
  @ 2022-11-22 14:01  5%   ` Ævar Arnfjörð Bjarmason
  2022-11-22 14:31  6%     ` Phillip Wood
    1 sibling, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-11-22 14:01 UTC (permalink / raw)
  To: Johannes Schindelin via GitGitGadget
  Cc: git, Phillip Wood, Johannes Schindelin


On Mon, Nov 21 2022, Johannes Schindelin via GitGitGadget wrote:

> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>
> +`os`::
> +	The data that follows this keyword is taken as the name of an
> +	Operating System, e.g. `Linux` or `Windows`; If it matches the
> +	current Operating System, the include condition is met.
> +
>  A few more notes on matching via `gitdir` and `gitdir/i`:

The reste of the "includeif" use glob matching and "/i" for icase. IOW
this is how this new feature would fit in:
	
	|--------+--------+----------+----------+------------------+----|
	|        | gitdir | gitdir/i | onbranch | hasconfig:remote | os |
	|--------+--------+----------+----------+------------------+----|
	| icase? | N      | Y        | N        | N                | Y  |
	| glob?  | Y      | Y        | Y        | Y                | N  |
	| path?  | Y      | Y        | Y        | Y                | N  |
	|--------+--------+----------+----------+------------------+----|

I think at least flipping that "glob" to "Y" so you could match e.g.
"*BSD" would be useful, and easier to explain in context, rather than
why the rest use wildmatch() and this doesn't.

For matching the uname the case doesn't really matter, but for
consistency of the interface I think making it case-sensitive or adding
an "os/i" would make sense. I.e. let's consistently use "/i" if & when
something's case-insensitive.

> +test_expect_success '[includeIf "os:..."]' '
> +	test_config x.y 0 &&
> +	echo "[x] y = z" >.git/xyz &&
> +
> +	if test_have_prereq MINGW
> +	then
> +		uname_s=Windows
> +	else
> +		uname_s="$(uname -s)"
> +	fi &&
> +	test_config "includeIf.os:not-$uname_s.path" xyz &&
> +	test 0 = "$(git config x.y)" &&
> +	test_config "includeIf.os:$uname_s.path" xyz &&
> +	test z = "$(git config x.y)"
> +'

As I pointed out in the v1, this still:

 * Hides segfaults in "git config", let's check the exit code.
 * Doesn't test the "icase" semantics you're introducing. Let's do that
   if it's intentional.

^ permalink raw reply	[relevance 5%]

* Re: [PATCH] config: introduce an Operating System-specific `includeIf` condition
  @ 2022-11-21 15:51  6%   ` Phillip Wood
  0 siblings, 0 replies; 200+ results
From: Phillip Wood @ 2022-11-21 15:51 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason,
	Johannes Schindelin via GitGitGadget
  Cc: git, Johannes Schindelin

Hi Dscho and Ævar

On 21/11/2022 13:51, Ævar Arnfjörð Bjarmason wrote:
> 
> On Mon, Nov 21 2022, Johannes Schindelin via GitGitGadget wrote:
> 
>> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>>
>> It is relatively common for users to maintain identical `~/.gitconfig`
>> files across all of their setups, using the `includeIf` construct
>> liberally to adjust the settings to the respective setup as needed.
>>
>> In case of Operating System-specific adjustments, Git currently offers
>> no support to the users and they typically use a work-around like this:
>>
>> 	[includeIf "gitdir:/home/"]
>> 		path = ~/.gitconfig-linux
>> 	[includeIf "gitdir:/Users/"]
>> 		path = ~/.gitconfig-mac
>> 	[includeIf "gitdir:C:"]
>> 		path = ~/.gitconfig-windows
>>
>> However, this is fragile, as it would not even allow to discern between
>> Operating Systems that happen to host their home directories in
>> `/home/`, such as Linux and the BSDs.
> 
> This looks like a really sensible thing to do, thanks.

Yes, it looks like a really useful enhancement

>> +`os`::
>> +	The data that follows this keyword is taken as the name of an
>> +	Operating System; If it matches the output of `uname -s`, the

Maybe add e.g. "Windows or Linux" after Operating System?

>> +static int include_by_os(const char *cond, size_t cond_len)
>> +{
>> +	struct utsname uname_info;
>> +
>> +	return !uname(&uname_info) &&
>> +		!strncasecmp(uname_info.sysname, cond, cond_len) &&
> 
> Our config.mak.uname doesn't to case-insensitive uname matching, and
> AFAIK these don't change between platforms versions. So why do we need
> to support LINUX, LiNuX etc. in addition to the canonical Linux?
> 
> I'm not opposed to it if there's a good reason, but as we have "gitdir"
> and "gitdir/i" shouldn't we make that "os/i" for consistency, if it's
> needed?

Why should we penalize users who write "linux" rather than "Linux"? 
Making the comparison case insensitive seems eminently sensible. File 
systems can be case sensitive so having the option to specify whether a 
match for "gitdir" is case sensitive or not makes sense there but not 
for the name of an operating system.

Best Wishes

Phillip

^ permalink raw reply	[relevance 6%]

* [PATCH v2 1/2] completion: add optional ignore-case when matching refs
  2022-11-21  0:26  6% ` [PATCH v2 " Alison Winters via GitGitGadget
@ 2022-11-21  0:26 12%   ` Alison Winters via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Alison Winters via GitGitGadget @ 2022-11-21  0:26 UTC (permalink / raw)
  To: git; +Cc: Taylor Blau, SZEDER Gábor, Alison Winters, Alison Winters

From: Alison Winters <alisonatwork@outlook.com>

If GIT_COMPLETION_IGNORE_CASE is set, --ignore-case will be added to
git for-each-ref calls so that refs can be matched case insensitively,
even when running on case sensitive filesystems.

Signed-off-by: Alison Winters <alisonatwork@outlook.com>
---
 contrib/completion/git-completion.bash | 12 ++++++++++++
 t/t9902-completion.sh                  | 15 +++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index ba5c395d2d8..7dcf4b63562 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -58,6 +58,12 @@
 #
 #     When set to "1" suggest all options, including options which are
 #     typically hidden (e.g. '--allow-empty' for 'git commit').
+#
+#   GIT_COMPLETION_IGNORE_CASE
+#
+#     When set, uses for-each-ref '--ignore-case' to find refs that match
+#     case insensitively, even on systems with case sensitive file systems
+#     (e.g., completing tag name "FOO" on "git checkout f<TAB>").
 
 case "$COMP_WORDBREAKS" in
 *:*) : great ;;
@@ -646,6 +652,7 @@ __git_heads ()
 	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
 
 	__git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
+			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
 			"refs/heads/$cur_*" "refs/heads/$cur_*/**"
 }
 
@@ -659,6 +666,7 @@ __git_remote_heads ()
 	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
 
 	__git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
+			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
 			"refs/remotes/$cur_*" "refs/remotes/$cur_*/**"
 }
 
@@ -669,6 +677,7 @@ __git_tags ()
 	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
 
 	__git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
+			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
 			"refs/tags/$cur_*" "refs/tags/$cur_*/**"
 }
 
@@ -688,6 +697,7 @@ __git_dwim_remote_heads ()
 	# but only output if the branch name is unique
 	__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
 		--sort="refname:strip=3" \
+		${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
 		"refs/remotes/*/$cur_*" "refs/remotes/*/$cur_*/**" | \
 	uniq -u
 }
@@ -765,6 +775,7 @@ __git_refs ()
 			;;
 		esac
 		__git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
+			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
 			"${refs[@]}"
 		if [ -n "$track" ]; then
 			__git_dwim_remote_heads "$pfx" "$match" "$sfx"
@@ -787,6 +798,7 @@ __git_refs ()
 			$match*)	echo "${pfx}HEAD$sfx" ;;
 			esac
 			__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
+				${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
 				"refs/remotes/$remote/$match*" \
 				"refs/remotes/$remote/$match*/**"
 		else
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 43de868b800..d89d0a93a2a 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -2255,6 +2255,21 @@ test_expect_success 'checkout completes ref names' '
 	EOF
 '
 
+test_expect_success 'checkout does not match ref names of a different case' '
+	test_completion "git checkout M" ""
+'
+
+test_expect_success 'checkout matches case insensitively with GIT_COMPLETION_IGNORE_CASE' '
+	(
+		GIT_COMPLETION_IGNORE_CASE=1 &&
+		test_completion "git checkout M" <<-\EOF
+		main Z
+		mybranch Z
+		mytag Z
+		EOF
+	)
+'
+
 test_expect_success 'git -C <path> checkout uses the right repo' '
 	test_completion "git -C subdir -C subsubdir -C .. -C ../otherrepo checkout b" <<-\EOF
 	branch-in-other Z
-- 
gitgitgadget


^ permalink raw reply related	[relevance 12%]

* [PATCH v2 0/2] add case insensitivity option to bash completion
  2022-11-05 17:28  5% [PATCH 0/2] add case insensitivity option to bash completion Alison Winters via GitGitGadget
@ 2022-11-21  0:26  6% ` Alison Winters via GitGitGadget
  2022-11-21  0:26 12%   ` [PATCH v2 1/2] completion: add optional ignore-case when matching refs Alison Winters via GitGitGadget
  2022-11-29  2:38  0% ` [PATCH 0/2] add case insensitivity option to bash completion Junio C Hamano
  1 sibling, 1 reply; 200+ results
From: Alison Winters via GitGitGadget @ 2022-11-21  0:26 UTC (permalink / raw)
  To: git; +Cc: Taylor Blau, SZEDER Gábor, Alison Winters

In 3bb16a8bf2 (tag, branch, for-each-ref: add --ignore-case for sorting and
filtering, 2016-12-04), support was added for filtering and sorting refs in
a case insensitive way. This is a behavior that seems appropriate to enable
with shell completion. Many shells provide case insensitive completion as an
option, even on filesystems that remain case sensitive.

This patch adds a new variable that, when set, will allow Bash completion to
use the --ignore-case option to match refs. Additionally, some basic support
is implemented to match pseudorefs like HEAD.

Changes since v1:

 * Improved comments and commit messages to clarify behavior on case
   sensitive filesystems
 * Replaced some lengthy if blocks with inline substitution
 * As a result of the above change, GIT_COMPLETION_IGNORE_CASE no longer
   needs to be set to "1" and now just needs to be present in the
   environment to work
 * Removed unnecessary exports in tests

Alison Winters (2):
  completion: add optional ignore-case when matching refs
  completion: add case-insensitive match of pseudorefs

 contrib/completion/git-completion.bash | 26 +++++++++++++++++++---
 t/t9902-completion.sh                  | 30 ++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 3 deletions(-)


base-commit: a0789512c5a4ae7da935cd2e419f253cb3cb4ce7
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1374%2Falisonatwork%2Fbash-insensitive-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1374/alisonatwork/bash-insensitive-v2
Pull-Request: https://github.com/git/git/pull/1374

Range-diff vs v1:

 1:  cef9a12b575 ! 1:  a261a94877a completion: add optional ignore-case when matching refs
     @@ Metadata
       ## Commit message ##
          completion: add optional ignore-case when matching refs
      
     -    If GIT_COMPLETION_IGNORE_CASE=1 is set, --ignore-case will be added to
     -    git for-each-ref calls so that branches and tags can be matched case
     -    insensitively.
     +    If GIT_COMPLETION_IGNORE_CASE is set, --ignore-case will be added to
     +    git for-each-ref calls so that refs can be matched case insensitively,
     +    even when running on case sensitive filesystems.
      
          Signed-off-by: Alison Winters <alisonatwork@outlook.com>
      
     @@ contrib/completion/git-completion.bash
      +#
      +#   GIT_COMPLETION_IGNORE_CASE
      +#
     -+#     When set to "1", suggest refs that match case insensitively (e.g.,
     -+#     completing "FOO" on "git checkout f<TAB>").
     ++#     When set, uses for-each-ref '--ignore-case' to find refs that match
     ++#     case insensitively, even on systems with case sensitive file systems
     ++#     (e.g., completing tag name "FOO" on "git checkout f<TAB>").
       
       case "$COMP_WORDBREAKS" in
       *:*) : great ;;
     -@@ contrib/completion/git-completion.bash: __git_complete_index_file ()
     - __git_heads ()
     - {
     +@@ contrib/completion/git-completion.bash: __git_heads ()
       	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
     -+	local ignore_case=""
     -+
     -+	if test "${GIT_COMPLETION_IGNORE_CASE-}" = "1"
     -+	then
     -+		ignore_case="--ignore-case"
     -+	fi
       
       	__git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
     -+			$ignore_case \
     ++			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
       			"refs/heads/$cur_*" "refs/heads/$cur_*/**"
       }
       
     -@@ contrib/completion/git-completion.bash: __git_heads ()
     - __git_remote_heads ()
     - {
     +@@ contrib/completion/git-completion.bash: __git_remote_heads ()
       	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
     -+	local ignore_case=""
     -+
     -+	if test "${GIT_COMPLETION_IGNORE_CASE-}" = "1"
     -+	then
     -+		ignore_case="--ignore-case"
     -+	fi
       
       	__git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
     -+			$ignore_case \
     ++			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
       			"refs/remotes/$cur_*" "refs/remotes/$cur_*/**"
       }
       
     -@@ contrib/completion/git-completion.bash: __git_remote_heads ()
     - __git_tags ()
     - {
     +@@ contrib/completion/git-completion.bash: __git_tags ()
       	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
     -+	local ignore_case=""
     -+
     -+	if test "${GIT_COMPLETION_IGNORE_CASE-}" = "1"
     -+	then
     -+		ignore_case="--ignore-case"
     -+	fi
       
       	__git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
     -+			$ignore_case \
     ++			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
       			"refs/tags/$cur_*" "refs/tags/$cur_*/**"
       }
       
      @@ contrib/completion/git-completion.bash: __git_dwim_remote_heads ()
     - {
     - 	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
     - 	local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
     -+	local ignore_case=""
     -+
     -+	if test "${GIT_COMPLETION_IGNORE_CASE-}" = "1"
     -+	then
     -+		ignore_case="--ignore-case"
     -+	fi
     - 
     - 	# employ the heuristic used by git checkout and git switch
     - 	# Try to find a remote branch that cur_es the completion word
       	# but only output if the branch name is unique
       	__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
       		--sort="refname:strip=3" \
     -+		$ignore_case \
     ++		${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
       		"refs/remotes/*/$cur_*" "refs/remotes/*/$cur_*/**" | \
       	uniq -u
       }
     -@@ contrib/completion/git-completion.bash: __git_refs ()
     - 	local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
     - 	local match="${4-}"
     - 	local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
     -+	local ignore_case=""
     - 
     - 	__git_find_repo_path
     - 	dir="$__git_repo_path"
     -@@ contrib/completion/git-completion.bash: __git_refs ()
     - 		fi
     - 	fi
     - 
     -+	if test "${GIT_COMPLETION_IGNORE_CASE-}" = "1"
     -+	then
     -+		ignore_case="--ignore-case"
     -+	fi
     -+
     - 	if [ "$list_refs_from" = path ]; then
     - 		if [[ "$cur_" == ^* ]]; then
     - 			pfx="$pfx^"
      @@ contrib/completion/git-completion.bash: __git_refs ()
       			;;
       		esac
       		__git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
     -+			$ignore_case \
     ++			${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
       			"${refs[@]}"
       		if [ -n "$track" ]; then
       			__git_dwim_remote_heads "$pfx" "$match" "$sfx"
     @@ contrib/completion/git-completion.bash: __git_refs ()
       			$match*)	echo "${pfx}HEAD$sfx" ;;
       			esac
       			__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
     -+				$ignore_case \
     ++				${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
       				"refs/remotes/$remote/$match*" \
       				"refs/remotes/$remote/$match*/**"
       		else
     @@ t/t9902-completion.sh: test_expect_success 'checkout completes ref names' '
      +
      +test_expect_success 'checkout matches case insensitively with GIT_COMPLETION_IGNORE_CASE' '
      +	(
     -+		. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" &&
     -+		GIT_COMPLETION_IGNORE_CASE=1 && export GIT_COMPLETION_IGNORE_CASE &&
     ++		GIT_COMPLETION_IGNORE_CASE=1 &&
      +		test_completion "git checkout M" <<-\EOF
      +		main Z
      +		mybranch Z
 2:  c455e855395 ! 2:  480f6554c93 completion: add case-insensitive match of pseudorefs
     @@ Metadata
       ## Commit message ##
          completion: add case-insensitive match of pseudorefs
      
     -    When GIT_COMPLETION_IGNORE_CASE=1, also allow lowercase completion text
     -    like "head" to match HEAD and other pseudorefs.
     +    When GIT_COMPLETION_IGNORE_CASE is set, also allow lowercase completion
     +    text like "head" to match uppercase HEAD and other pseudorefs.
      
          Signed-off-by: Alison Winters <alisonatwork@outlook.com>
      
     @@ contrib/completion/git-completion.bash: __git_refs ()
       	local match="${4-}"
      +	local umatch="${4-}"
       	local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
     - 	local ignore_case=""
       
     + 	__git_find_repo_path
      @@ contrib/completion/git-completion.bash: __git_refs ()
     - 	if test "${GIT_COMPLETION_IGNORE_CASE-}" = "1"
     - 	then
     - 		ignore_case="--ignore-case"
     -+		# use tr instead of ${match,^^} to preserve bash 3.2 compatibility
     -+		umatch=$(echo "$match" | tr a-z A-Z 2> /dev/null || echo "$match")
     + 		fi
       	fi
       
     ++	if test "${GIT_COMPLETION_IGNORE_CASE:+1}" = "1"
     ++	then
     ++		# uppercase with tr instead of ${match,^^} for bash 3.2 compatibility
     ++		umatch=$(echo "$match" | tr a-z A-Z 2>/dev/null || echo "$match")
     ++	fi
     ++
       	if [ "$list_refs_from" = path ]; then
     -@@ contrib/completion/git-completion.bash: __git_refs ()
     + 		if [[ "$cur_" == ^* ]]; then
     + 			pfx="$pfx^"
       			fer_pfx="$fer_pfx^"
       			cur_=${cur_#^}
       			match=${match#^}
     @@ contrib/completion/git-completion.bash: __git_refs ()
      +			$match*|$umatch*)	echo "${pfx}HEAD$sfx" ;;
       			esac
       			__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
     - 				$ignore_case \
     + 				${GIT_COMPLETION_IGNORE_CASE+--ignore-case} \
      @@ contrib/completion/git-completion.bash: __git_refs ()
       		else
       			local query_symref
     @@ t/t9902-completion.sh: test_expect_success 'checkout matches case insensitively
      +
      +test_expect_success 'checkout completes pseudo refs case insensitively with GIT_COMPLETION_IGNORE_CASE' '
      +	(
     -+		. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" &&
     -+		GIT_COMPLETION_IGNORE_CASE=1 && export GIT_COMPLETION_IGNORE_CASE &&
     ++		GIT_COMPLETION_IGNORE_CASE=1 &&
      +		test_completion "git checkout h" <<-\EOF
      +		HEAD Z
      +		EOF

-- 
gitgitgadget

^ permalink raw reply	[relevance 6%]

* Re: [PATCH 00/30] [RFC] extensions.refFormat and packed-refs v2 file format
  2022-11-16 14:45  6%       ` Derrick Stolee
@ 2022-11-17  4:28  0%         ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2022-11-17  4:28 UTC (permalink / raw)
  To: Derrick Stolee; +Cc: Derrick Stolee via GitGitGadget, git, jrnieder

On Wed, Nov 16, 2022 at 6:45 AM Derrick Stolee <derrickstolee@github.com> wrote:
>
> On 11/14/22 9:47 PM, Elijah Newren wrote:
> > On Sun, Nov 13, 2022 at 4:07 PM Derrick Stolee <derrickstolee@github.com> wrote:
> >>
> >> On 11/11/22 6:28 PM, Elijah Newren wrote:
> >>> On Mon, Nov 7, 2022 at 11:01 AM Derrick Stolee via GitGitGadget
> >>> <gitgitgadget@gmail.com> wrote:
[...]
> >>>>  * (Secondary) Allow using a packed ref format for all refs, dropping loose
> >>>>    refs and creating a clear way to snapshot all refs at a given point in
> >>>>    time.
[...]
>
> The reason is in the goal "creating a clear way to snapshot all refs
> at a given point in time". This is a server-side benefit with no
> visible benefit to users, immediately.

Yes, sorry, I just missed it.  I didn't understand it and wrongly
assumed it was continuing to talk about the implementation details
rather than the benefit details.  My bad.

Thanks for patiently correcting me.

> The D/F conflicts and case-sensitive parts that could fall from that
> are not included in my goals. Part of that is because we would need a
> new reflog format to complete that part. Let's take things one step
> at a time and handle reflogs after we have ref update performance
> handled.

Ah, right, I can see how reflog would affect both of those problems
now that you highlight it, but it hadn't occurred to me before.

> >> The biggest benefit on the server side is actually for consistency
> >> checks. Using a stacked packed-refs (especially with a tip file
> >> that describes all of the layers) allows an atomic way to take a
> >> snapshot of the refs and run a checksum operation on their values.
> >> With loose refs, concurrent updates can modify the checksum during
> >> its computation. This is a super niche reason for this, but it's
> >> nice that the performance-only focus also ends up with a design
> >> that satisfies this goal.
> >
> > Ah...so this is the reason for your secondary goal?  Re-reading it
> > looks like you did state this, I just missed it without the longer
> > explanation.
> >
> > Anyway, it might be worth calling out in your cover letter that there
> > are (at least) three benefits to this secondary goal of yours -- the
> > one you list here, plus the two I list above.
>
> I suppose I assumed that the D/F and case conflicts were a "known"
> benefit and a huge motivation of the reftable work.

Yes, and I thought you had just found a simpler solution to those
problems that might not provide all the benefits of reftable (e.g.
performance with huge numbers of refs) but did solve those particular
problems.  I've only looked at reftable from the surface from a
distance, and I was unaware previously that reflog also affected these
two problems (though it seems obvious in hindsight).  And I do
remember you calling out that you weren't changing the reflog format
in your cover letter, but I didn't understand the ramifications of
that statement at the time.

> Instead of trying
> to solve all of the ref problems at once, I wanted to focus on the
> subset that I knew could be solved with a simpler solution, leaving
> the full solution to later steps. It would help to be explicit about
> how this direction helps solve this problem while also being clear
> about how it does not solve it completely.

It certainly would have helped me.  :-)

Thanks for explaining all these details.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 00/30] [RFC] extensions.refFormat and packed-refs v2 file format
  @ 2022-11-16 14:45  6%       ` Derrick Stolee
  2022-11-17  4:28  0%         ` Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee @ 2022-11-16 14:45 UTC (permalink / raw)
  To: Elijah Newren; +Cc: Derrick Stolee via GitGitGadget, git, jrnieder

On 11/14/22 9:47 PM, Elijah Newren wrote:
> On Sun, Nov 13, 2022 at 4:07 PM Derrick Stolee <derrickstolee@github.com> wrote:
>>
>> On 11/11/22 6:28 PM, Elijah Newren wrote:
>>> On Mon, Nov 7, 2022 at 11:01 AM Derrick Stolee via GitGitGadget
>>> <gitgitgadget@gmail.com> wrote:
>>>>
>>>> Introduction
>>>> ============
>>>>
>>>> I became interested in our packed-ref format based on the asymmetry between
>>>> ref updates and ref deletions: if we delete a packed ref, then the
>>>> packed-refs file needs to be rewritten. Compared to writing a loose ref,
>>>> this is an O(N) cost instead of O(1).
>>>>
>>>> In this way, I set out with some goals:
>>>>
>>>>  * (Primary) Make packed ref deletions be nearly as fast as loose ref
>>>>    updates.
>>>
>>> Performance is always nice.  :-)
>>>
>>>>  * (Secondary) Allow using a packed ref format for all refs, dropping loose
>>>>    refs and creating a clear way to snapshot all refs at a given point in
>>>>    time.
>>>
>>> Is this secondary goal the actual goal you have, or just the
>>> implementation by which you get the real underlying goal?
>>
>> To me, the primary goal takes precedence. It turns out that the best
>> way to solve for that goal happens to also make it possible to store
>> all refs in a packed form, because we can update the packed form
>> much faster than our current setup. There are alternatives that I
>> considered (and prototyped) that were more specific to the deletions
>> case, but they were not actually as fast as the stacked method. Those
>> alternatives also would never help reach the secondary goal, but I
>> probably would have considered them anyway if they were faster, if
>> only for their simplicity.
> 
> That's orthogonal to my question, though.  For your primary goal, you
> stated it in a form where it was obvious what benefit it would provide
> to end users.  Your secondary goal, as stated, didn't list any benefit
> to end users that I could see (update: reading the rest of your
> response it appears I just didn't understand it), so I was trying to
> guess at why your secondary goal might be a goal, i.e. what the real
> secondary goal was.

The reason is in the goal "creating a clear way to snapshot all refs
at a given point in time". This is a server-side benefit with no
visible benefit to users, immediately.

The D/F conflicts and case-sensitive parts that could fall from that
are not included in my goals. Part of that is because we would need a
new reflog format to complete that part. Let's take things one step
at a time and handle reflogs after we have ref update performance
handled.

>>> To me, it appears that such a capability would solve both (a) D/F
>>> conflict problems (i.e. the ability to simultaneously have a
>>> refs/heads/feature and refs/heads/feature/shiny ref), and (b) case
>>> sensitivity issues in refnames (i.e. inability of some users to work
>>> with both a refs/heads/feature and a refs/heads/FeAtUrE, due to
>>> constraints of their filesystem and the loose storage mechanism).  Are
>>> either of those the goal you are trying to achieve (I think both would
>>> be really nice, more so than the performance goal you have), or is
>>> there another?
>>
>> For a Git host provider, these D/F conflict and case-sensitivity
>> situations probably would need to stay as restrictions on the
>> server side for quite some time because we don't want users on
>> older Git clients to be unable to fetch a repository just because
>> we updated our ref storage to allow for such possibilities.
> 
> Okay, but even if not used on the server side, this capability could
> still be used on the client side and provide a big benefit to end
> users.
> 
> But I think there's a minor issue with what you stated; as far as I
> can tell, there is no case-sensitivity restriction on the server side
> for GitHub currently, and users do currently have problems cloning and
> using repositories with branches that differ in case only.  See e.g.
> https://github.com/newren/git-filter-repo/issues/48 and the multiple
> duplicates which reference that issue.  We've also had issues at
> $DAYJOB, though for GHE we added some hooks to deny creating branches
> that differ only in case from another branch to avoid the problem.

Yes, you're right here. We could do better in rejecting case-sensitive
matches upon request.

> Also, D/F restrictions on the server do not stop users from having D/F
> problems when fetching.  If users forget to use `--prune`, then when a
> refs/heads/foo has already been fetched is deleted and replaced by a
> refs/heads/foo/bar, then the user gets errors.  This issue actually
> caused a bit of a fire-drill for us just recently.

And similar to the case-sensitive situation, I'm not sure if we have
checks to avoid D/F conflicts if they happen across the loose/packed
boundary. We might just be using the filesystem as a constraint. I'll
need to dig in more here.

(This is all the more reason why this space is already complicated and
will take some time to unwind.)

> So both kinds of problems already exist, for users with any git client
> version (although the former only for users with unfortunate file
> systems).  And both problems cause pain.  Both issues are caused by
> loose refs, so limiting git storage to packed refs would fix both
> issues.
> 
>> The biggest benefit on the server side is actually for consistency
>> checks. Using a stacked packed-refs (especially with a tip file
>> that describes all of the layers) allows an atomic way to take a
>> snapshot of the refs and run a checksum operation on their values.
>> With loose refs, concurrent updates can modify the checksum during
>> its computation. This is a super niche reason for this, but it's
>> nice that the performance-only focus also ends up with a design
>> that satisfies this goal.
> 
> Ah...so this is the reason for your secondary goal?  Re-reading it
> looks like you did state this, I just missed it without the longer
> explanation.
> 
> Anyway, it might be worth calling out in your cover letter that there
> are (at least) three benefits to this secondary goal of yours -- the
> one you list here, plus the two I list above.

I suppose I assumed that the D/F and case conflicts were a "known"
benefit and a huge motivation of the reftable work. Instead of trying
to solve all of the ref problems at once, I wanted to focus on the
subset that I knew could be solved with a simpler solution, leaving
the full solution to later steps. It would help to be explicit about
how this direction helps solve this problem while also being clear
about how it does not solve it completely.

Thanks,
-Stolee

^ permalink raw reply	[relevance 6%]

* [PATCH 0/2] add case insensitivity option to bash completion
@ 2022-11-05 17:28  5% Alison Winters via GitGitGadget
  2022-11-21  0:26  6% ` [PATCH v2 " Alison Winters via GitGitGadget
  2022-11-29  2:38  0% ` [PATCH 0/2] add case insensitivity option to bash completion Junio C Hamano
  0 siblings, 2 replies; 200+ results
From: Alison Winters via GitGitGadget @ 2022-11-05 17:28 UTC (permalink / raw)
  To: git; +Cc: Alison Winters

In 3bb16a8bf2 (tag, branch, for-each-ref: add --ignore-case for sorting and
filtering, 2016-12-04), support was added for filtering and sorting refs in
a case insensitive way. This is a behavior that seems appropriate to enable
with shell completion. Many shells provide case insensitive completion as an
option, even on filesystems that remain case sensitive.

This patch adds a new variable that, when set, will allow Bash completion to
use the --ignore-case option to match refs. Additionally, some basic support
is implemented to match pseudorefs like HEAD.

Alison Winters (2):
  completion: add optional ignore-case when matching refs
  completion: add case-insensitive match of pseudorefs

 contrib/completion/git-completion.bash | 51 ++++++++++++++++++++++++--
 t/t9902-completion.sh                  | 32 ++++++++++++++++
 2 files changed, 80 insertions(+), 3 deletions(-)


base-commit: 3b08839926fcc7cc48cf4c759737c1a71af430c1
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1374%2Falisonatwork%2Fbash-insensitive-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1374/alisonatwork/bash-insensitive-v1
Pull-Request: https://github.com/git/git/pull/1374
-- 
gitgitgadget

^ permalink raw reply	[relevance 5%]

* [PATCH v3 01/11] http: read HTTP WWW-Authenticate response headers
  @ 2022-11-02 22:09  3%     ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2022-11-02 22:09 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	M Hickford, Jeff Hostetler, Matthew John Cheetham,
	Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 15 ++++++++++
 http.c       | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 94 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index 5d0502f51fd..03d43d352e7 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,82 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = eltsize * nmemb;
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+	const char *z = NULL;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val))
+			val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		const char **v = values->v + values->nr - 1;
+		char *append = xstrfmt("%s%.*s", *v, (int)(size - 1), ptr + 1);
+
+		free((void*)*v);
+		*v = append;
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (skip_iprefix(buf.buf, "http/", &z))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1829,6 +1905,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* [PATCH v2 1/6] http: read HTTP WWW-Authenticate response headers
  @ 2022-10-21 17:07  3%   ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2022-10-21 17:07 UTC (permalink / raw)
  To: git
  Cc: Derrick Stolee, Lessley Dennington, Matthew John Cheetham,
	Matthew John Cheetham, Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 15 ++++++++++
 http.c       | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 94 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6f2e5bc610b 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,19 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+
+	/**
+	 * Internal use only. Used to keep track of split header fields
+	 * in order to fold multiple lines into one value.
+	 */
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +144,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index 5d0502f51fd..03d43d352e7 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,82 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = eltsize * nmemb;
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+	const char *z = NULL;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val))
+			val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		const char **v = values->v + values->nr - 1;
+		char *append = xstrfmt("%s%.*s", *v, (int)(size - 1), ptr + 1);
+
+		free((void*)*v);
+		*v = append;
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (skip_iprefix(buf.buf, "http/", &z))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1829,6 +1905,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* Re: icase pathspec magic support in ls-tree
  @ 2022-10-17 15:46  3%               ` Tao Klerks
  0 siblings, 0 replies; 200+ results
From: Tao Klerks @ 2022-10-17 15:46 UTC (permalink / raw)
  To: Elijah Newren
  Cc: brian m. carlson, Ævar Arnfjörð Bjarmason, git

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

Thanks again for the code samples above!

I've spent some time productizing this for my environment, and I think
it's pretty close to optimal for my environment at least.

In case this can be of value to anyone else, I've attached the final thing.

This version is genericized a little - two specific specializations
for my environment not included here are:
* a specific strategy for determining the most-likely-correct upstream
branch to use as a default for "diff from" for new branches, to avoid
having to do a full-tree dupe search; in most environments choosing
"master" or "main" would likely be the right thing most of the time
* a specific list of branch paths that we should validate (vs others
that we should not)

Best regards,
Tao

On Sun, Oct 16, 2022 at 12:06 AM Tao Klerks <tao@klerks.biz> wrote:
>
> This seems to be working, thank you!!!
>
> Two updates I had to make, in case this is useful to anyone else:
>
> 1: I'm getting some weird behavior I can't explain yet, where some
> paths are returned from the ls-tree call twice: The input to ls-tree
> is all unique paths, but the output somehow includes a relatively
> small subset of paths twice.
> This mysterious issue is easily addressed by adding an extra "uniq"
> call to remove the "trivial dupes" before hunting for the
> "case-insensitive dupes" we're interested in:
>
> git diff --diff-filter=A --no-renames --name-only HEAD~1 HEAD |
> all-leading-dirs.py | xargs --no-run-if-empty git ls-tree --name-only
> -t HEAD | sort | uniq | uniq -i -d
>
> 2: The xargs call has issues with paths with spaces in them. Adding
> -d"\n" seems to be a clean way to fix this
>
> git diff --diff-filter=A --no-renames --name-only HEAD~1 HEAD |
> all-leading-dirs.py | xargs -d"\n" --no-run-if-empty git ls-tree --name-only
> -t HEAD | sort | uniq | uniq -i -d
>
>
> Not only does this approach seem to work well, but it also has far
> better performance characteristics than I was expecting!
>
> Simple small commit (10 files): 20ms
> Reasonably large commit (10,000 files): 250ms
> Diff from empty on a smaller branch (100,000 files): 2,800ms
> Diff from empty on a larger branch (200,000 files): 5,400ms
>
>
> It still makes sense to check the number of files/lines after doing
> the diff, and do a "simple" 800ms full-tree (no-pathspec) dupe check
> instead of this when your diff size goes past some file count
> threshold, but it looks like that threshold would be quite high in my
> environment - 30k files maybe?
>
> I will have a go at writing a full update hook, and (without knowing
> whether it will make sense from a performance perspective) I'd like to
> try to implement the "all-leading-dirs" logic in bash 4 using
> associative arrays, to remove the python dependency. If I make it work
> I'll post back here.
>
> This seems to cover what I needed icase pathspec magic for in ls-tree,
> without having to implement it - so thanks again!
>
> Tao
>
> On Fri, Oct 14, 2022 at 7:06 PM Elijah Newren <newren@gmail.com> wrote:
> >
> > On Fri, Oct 14, 2022 at 1:48 AM Tao Klerks <tao@klerks.biz> wrote:
> > >
> > > On Fri, Oct 14, 2022 at 9:41 AM Elijah Newren <newren@gmail.com> wrote:
> > > >
> > [...]
> > > > I don't see why you need to do full-tree with existing options, nor
> > > > why the ls-tree option you want would somehow make it easier to avoid.
> > > > I think you can avoid the full-tree search with something like:
> > > >
> > > > git diff --diff-filter=A --no-renames --name-only $OLDHASH $NEWHASH |
> > > > sed -e s%/[^/]*$%/% | uniq | xargs git ls-tree --name-only $NEWHASH |
> > > > \
> > > >    sort | uniq -i -d
> > > >
> > > > The final "sort | uniq -i -d" is taken from Torsten's suggestion.
> > > >
> > > > The git diff ... xargs git ls-tree section on the first line will
> > > > provide a list of all files (& subdirs) in the same directory as any
> > > > added file.  (Although, it has a blind spot for paths in the toplevel
> > > > directory.)
> > >
> > > The theoretical problem with this approach is that it only addresses
> > > case-insensitive-duplicate files, not directories.
> >
> > It'll catch some case-insensitive-duplicate directories too -- note
> > that I did call out that it'd print subdirs.  But to be more cautious,
> > you would need to carefully grab all leading directories of any added
> > path, not just the immediate leading directory.
> >
> > > Directories have been the problem, in "my" repo, around one-third of
> > > the time - typically someone does a directory rename, and someone else
> > > does a bad merge and reintroduces the old directory.
> > >
> > > That said, what "icase pathspec magic" actually *does*, is break down
> > > the pathspec into iteratively more complete paths, level by level,
> > > looking for case-duplicates at each level. That's something I could
> > > presumably do in shell scripting, collecting all the interesting
> > > sub-paths first, and then getting ls-tree to tell me about the
> > > immediate children for each sub-path, doing case-insensitive dupe
> > > searches across children for each of these sub-paths.
> > >
> > > ls-tree supporting icase pathspec magic would clearly be more
> > > efficient (I wouldn't need N ls-tree git processes, where N is the
> > > number of sub-paths in the diff), but this should be plenty efficient
> > > for normal commits, with a fallback to the full search
> > >
> > > This seems like a sensible direction, I'll have a play.
> >
> > If you create a script that gives you all leading directories of any
> > listed path (plus replacing the toplevel dir with ':/'), such as this
> > (which I'm calling 'all-leading-dirs.py'):
> >
> > """
> > #!/usr/bin/env python3
> >
> > import os
> > import sys
> >
> > paths = sys.stdin.read().splitlines()
> > dirs_seen = set()
> > for path in paths:
> >   dir = path
> >   while dir:
> >     dir = os.path.dirname(dir)
> >     if dir in dirs_seen:
> >       continue
> >     dirs_seen.add(dir)
> > if dirs_seen:
> >   # Replace top-level dir of "" with ":"; we'll add the trailing '/'
> > below when adding it to all other dirs
> >   dirs_seen.remove("")
> >   dirs_seen.add(':')
> >   for dir in dirs_seen:
> >     print(dir+'/')  # ls-tree wants the trailing '/' if we are going
> > to list contents within that tree rather than just the tree itself
> > """
> >
> > Then the following will catch duplicates files and directories for you:
> >
> > git diff --diff-filter=A --no-renames --name-only HEAD~1 HEAD |
> > all-leading-dirs.py | xargs --no-run-if-empty git ls-tree --name-only
> > -t HEAD | sort | uniq -i -d
> >
> > and it no longer has problems catching duplicates in the toplevel
> > directory either.  It does have (at most) two git invocations, but
> > only one invocation of ls-tree.  Here's a test script to prove it
> > works:
> >
> > """
> > #!/bin/bash
> >
> > git init -b main nukeme
> > cd nukeme
> > mkdir -p dir1/subdir/whatever
> > mkdir -p dir2/subdir/whatever
> > >dir1/subdir/whatever/foo
> > >dir2/subdir/whatever/foo
> > git add .
> > git commit -m initial
> >
> > mkdir -p dir1/SubDir/whatever
> > >dir1/SubDir/whatever/foo
> > git add .
> > git commit -m stuff
> >
> > git diff --diff-filter=A --no-renames --name-only HEAD~1 HEAD |
> > all-leading-dirs.py | xargs --no-run-if-empty git ls-tree --name-only
> > -t HEAD | sort | uniq -i -d
> > """
> >
> > The output of this script is
> > """
> > dir1/subdir
> > """
> > which correctly notifies on the duplicate (dir1/SubDir being the
> > other; uniq is the one that picks which of the two duplicate names to
> > print)

[-- Attachment #2: case-insensitive-duplicate-check-update-hook.bash --]
[-- Type: application/octet-stream, Size: 8047 bytes --]

#!/bin/bash

UPDATING_REF="$1"
FROM_HASH="$2"
TO_HASH="$3"

# GENERAL Problem Background:
# - In git, repo paths are inherently case-sensitive
# - In two of the three major dev workstation OSs (Windows, OSX), filesystems are typically case-insensitive
# - When files are added in the repo that are duplicates in the filesystem, but not in git, usability problems abound
# - A particularly onerous issue occurs when case-insensitive-duplicate files have differing content; after a checkout
#       of such a tree, the case-insensitive working tree always looks like it has a change to one or the other of the
#       VCS files. In such an "unavoidably/unfixably dirty tree" state, a casual user cannot even "pull" a fixed branch
#       state, as git will will refuse to pull in a dirty working tree.
# - Git currently offers no built-in mechanism to prevent this
# - It is preferable to avoid this issue in a server hook, rather than in CI validations (although the latter can also
#       work) - the earlier the issue is "nipped in the bud" the better.
# - There is a reasonably trivial shell scripting test for "Tree has duplicates", but validating simply on the basis of
#       this test presents two challenges:
#   - It might be too expensive to run on every commit in a large repo
#   - It might trigger "false positives" when creating new refs pointing to old already-problematic commits

# SPECIFIC Problem Repo Background:
# - 200K files, in deeply nested (java) folder structures (+50k directories)
# - Doing a "naive" full-tree case-insensitive duplicate search takes around 2s
#   - This is not a price we're willing to pay on every branch update
# - Case-insensitive duplicates are sometimes folders, sometimes files
# - Repo has lots of refs - 110k - so scanning them is costly
# - New refs are created *very* often - most often as "keeparound" refs in GitLab
#   - Validations don't make sense / don't add value for some or many classes of ref (those created by automated
#       systems, where a violation is not the "fault" of the pusher)
# - Some (active) branches are very distant from each other - there is no single "master"
 
# Test Cases / situations:
# - Single "normal" change, a dozen added files
# - Single "large-ish" change, a few hundred added files
# - on an existing branch (eg simple change, merge from upstream)
# - on a new branch, varying the original/upstream branch
# - on new refs that are excluded from validation by path/pattern

# Expected & tested performance characteristics of this hook script:
# - For non-branch or otherwise disqualified refs, close to no overhead.
# - For updates to existing refs, it is reasonably optimal
#   - There are four non-trivial operations, which all scale with the diff size:
#     - Finding the files added in the ref update (git diff)
#     - Finding all the ancestor-paths for these files (output_all_ancestor_gitpaths)
#       - This *can* be made slightly more efficient by using eg python
#     - Finding all items in these paths (git ls-tree)
#     - Sorting the resulting paths/items (sort)
#   - When the number of added files is too high, we fall back to a full-tree search
# - For new non-disqualified refs, there are additional overheads:
#   - Finding the best/closest "standard branch" to diff from, for a new ref, might be non-trivial in some repos
#     - (in the generic implementation, it is a trivial/cheap check for "master" and "main")
#   - Depending on the strategy used to find a "diff from" ref, diffs on new refs will likely be much larger/more expensive than they should ideally need to be

# Future work / possible improvements:
# - If git provided an easy/cheap way to detect "commits new to this repo" in an update hook, the diffs could be consistently much smaller/more efficient.
#   - (it is possible to find out whether a commit is net-new with something like "git rev-list MYREF --not --exclude MYREF --all", but this is *expensive* in a large repo)
# - If "git ls-tree" supported icase pathspec magic, we could pass in full added-file pathspecs, and subsequent dupe-detection could be more efficient
#   - (there would be a functional difference: the current strategy finds dupe directories even if they have non-overlapping contents; this other approach would not)

# Requirements:
# - Bash 4 for associative arrays


#---------
#FUNCTIONS - called via subshell
#---------

output_all_ancestor_gitpaths() {
  declare -A INTERESTING_PATHS
  while IFS= read -r INPUT_LINE; do
    CURRENT_PATH="$INPUT_LINE"
    while [ "$CURRENT_PATH" != ":" ]; do
      [[ "$CURRENT_PATH" == */* ]] || CURRENT_PATH=":/$CURRENT_PATH"
      PARENT_PATH="${CURRENT_PATH%/*}"
      if [ "${INTERESTING_PATHS["${PARENT_PATH}/"]}" = "1" ]; then
        break
      fi
      INTERESTING_PATHS["${PARENT_PATH}/"]="1"
      CURRENT_PATH="$PARENT_PATH"
    done
  done <<< "$1"
  for key in ${!INTERESTING_PATHS[@]}; do echo "$key"; done
  debug_log "FOUND ${#INTERESTING_PATHS[@]} INTERESTING PATHS" 
}

find_closest_standard_branch() {
  # Simplest implementation, look for "master" or "main" or give up.
  # there will likely be better repo-specific strategies in specific repos.
  git for-each-ref --format="%(refname)" --count=1 refs/heads/master refs/heads/main
}

START_TIME="$(date +%s%N)"
debug_log() {
  if [ -n "$DEBUG_DUPE_HOOK" ]; then
    CURRENT_TIME="$(date +%s%N)"
    echo "Debug at $(($(($CURRENT_TIME-$START_TIME))/1000000))ms: $1" >&2
  fi
}

#-----------
#MAIN SCRIPT
#-----------

if [ -z "$TO_HASH" ]; then
  # branch deletion, no possibility of new dupes
  debug_log "BRANCH DELETION - SKIPPING DUPE VALIDATION"
  exit 0
fi

VALIDATING_PATH_PREFIXES=("refs/heads/")
REF_IS_VALIDATABLE=0
for PATH_PREFIX in "${VALIDATING_PATH_PREFIXES[@]}"
do
  if [[ "$UPDATING_REF" = "$PATH_PREFIX"* ]]; then
    REF_IS_VALIDATABLE=1
  fi
done

if [[ "$REF_IS_VALIDATABLE" = "0" ]]; then
  # we're not interested in validating for dupes on this ref.
  debug_log "NON-VALIDATABLE REF - SKIPPING DUPE VALIDATION"
  exit 0
fi

FULL_SEARCH=false
if [ -z "$FROM_HASH" ]; then
  # New ref; in most repos new "interesting" (not-excluded-from-dupe-check)
  # refs will likely be closely related to master/main most of the time, so
  # diff from there rather than starting from scratch.
  debug_log "NEW REF - LOOKING FOR STANDARD BRANCH"
  FROM_HASH=$(find_closest_standard_branch "$TO_HASH")
fi

if [ -z "$FROM_HASH" ]; then
  # If this is a new ref and no "standard upstream ref" was found, fall back
  # to full dupe search.
  debug_log "NO STANDARD UPSTREAM REF FOUND; DOING FULL SEARCH"
  FULL_SEARCH=true
else
  debug_log "CHECKING DIFF: git diff --diff-filter=A --no-renames --name-only '$FROM_HASH' '$TO_HASH'"
  NEW_FILES=$(git diff --diff-filter=A --no-renames --name-only "$FROM_HASH" "$TO_HASH")
  NEW_FILE_LINE_COUNT=$(wc -l <<< "$NEW_FILES")
  
  if [ "$NEW_FILE_LINE_COUNT" -le "1" ] && [ -z "$NEW_FILES" ]; then
    # no newly added files, no possibility of new dupes
	# (count "1" can be an empty line)
    debug_log "EXITING WITH 0 ADDED FILES"
    exit 0
  fi

  if [ "$NEW_FILE_LINE_COUNT" -gt 10000 ]; then
    # If there are too many files, then generating all the sub-paths and
    # running ls-tree with a huge pathspec will be slower than simply
    # checking the whole tree.
    debug_log "FILE COUNT $NEW_FILE_LINE_COUNT OVER LIMIT; DOING FULL SEARCH"
    FULL_SEARCH=true
  fi
fi

if [ "$FULL_SEARCH" = "true" ]; then
  debug_log "DOING FULL DUPE SEARCH"
  DUPE_PATHS=$(git ls-tree --name-only -r "$TO_HASH" | sort | uniq -i -D)
else
  debug_log "DOING DIFF SEARCH OF $NEW_FILE_LINE_COUNT ADDED FILES BETWEEN $FROM_HASH AND $TO_HASH"
  DUPE_PATHS=$(output_all_ancestor_gitpaths "$NEW_FILES" | sort | xargs -d"\n" --no-run-if-empty git ls-tree --name-only -t "$TO_HASH" | sort | uniq | uniq -i -D)
fi

if [ -z "$DUPE_PATHS" ]; then
  debug_log "EXITING - NO DUPES FOUND"
  exit 0
else
  debug_log "EXITING WITH DUPES ERROR"
  echo "This ref cannot be accepted - duplicate folders or files found:"
  echo "$DUPE_PATHS"
  exit 1
fi

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 0/3] RFC: apply: support case-only renames in case-insensitive filesystems
  2022-06-19 16:10  6% ` [PATCH v2 0/3] RFC: " Tao Klerks via GitGitGadget
  2022-06-19 16:10  5%   ` [PATCH v2 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
  2022-06-19 16:10 11%   ` [PATCH v2 3/3] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
@ 2022-10-10  4:09  0%   ` Tao Klerks
  2023-05-28  9:59  4%   ` [PATCH v3 0/3] " Tao Klerks via GitGitGadget
  3 siblings, 0 replies; 200+ results
From: Tao Klerks @ 2022-10-10  4:09 UTC (permalink / raw)
  To: Tao Klerks via GitGitGadget; +Cc: git, Junio C Hamano

Hi folks,

These patches are a few months old now, but they still apply cleanly
and I'm not sure how to improve them.

I'd appreciate any feedback on both the approach, and the detailed
code changes themselves, that could help me make this a viable
patchset to fix case-only renames on file-insensitive filesystems
using "git apply".

Thanks,
Tao

On Sun, Jun 19, 2022 at 6:10 PM Tao Klerks via GitGitGadget
<gitgitgadget@gmail.com> wrote:
>
> As suggested recently in thread
> CAPMMpojwV+f=z9sgc_GaUOTFBCUVdbrGW8WjatWWmC3WTcsoXw@mail.gmail.com,
> proposing a fix to git-apply for case-only renames on case-insensitive
> filesystems.
>
> Changes in V2:
>
>  * Prepended a commit from Junio, with new apply tests to build on
>  * Added a largely-unrelated new known failing test, concerning reset --hard
>    in the presence of index case conflicts on a case-insensitive filesystem,
>    which we later need to work around in a corner-case test
>  * Moved test cases to build on Junio's new test file
>  * Switched fix approach from "allow same-name commit explicitly" to "track
>    files marked for deletion case-insensitively for filesystem checks",
>    which addresses the issue noted and other more obscure ones like "rename
>    swap with case change"
>  * Added a test case for "rename swap with case change"
>  * Added test cases setting "core.ignorecase" on and off explicitly
>  * Added a test case exposing one remaining surprising behavior
>
> POSSIBLE CONCERN:
>
> This fix was originally much simpler - it just made the "fn_table" string
> list use a case-insensitive string comparison - using case-insensitive
> comparisons when dealing with all replacement checks, both on the index and
> on the filesystem.
>
> However, with that simple implementation, there was at least one edge-case
> where data loss could result: If the index contained two files differing
> only by case, with different content, and we were doing a case-only rename,
> a swap, or some other operation involving the deletion and creation of a
> file with that name (ignoring case), then both of the files with that name
> in the index would be overwritten - even though only one of them had the
> expected content, and even though the one deleted might never have been
> committed.
>
> It seems as though the core.ignorecase option should typically only apply to
> filesystem checks - that the index is always case-sensitive.
>
> The current fix proposal therefore splits the string list used for "can I
> create a file that already exists?" checks into two such structures - one
> string list used for filesystem checks, which is case-insensitive when
> specified by core.ignorecase, and one used for index checks, which is always
> case-sensitive.
>
> The resulting duplication is not appealing, but I'm not sure how to address
> it / how to do this more elegantly. I'm also still not completely certain
> that my rule of thumb about the index always being case-sensitive is the
> right way of thinking of things.
>
> Junio C Hamano (1):
>   t4141: test "git apply" with core.ignorecase
>
> Tao Klerks (2):
>   reset: new failing test for reset of case-insensitive duplicate in
>     index
>   apply: support case-only renames in case-insensitive filesystems
>
>  apply.c                |  81 +++++++++----
>  apply.h                |   5 +-
>  t/t4141-apply-icase.sh | 258 +++++++++++++++++++++++++++++++++++++++++
>  t/t7104-reset-hard.sh  |  11 ++
>  4 files changed, 334 insertions(+), 21 deletions(-)
>  create mode 100755 t/t4141-apply-icase.sh
>
>
> base-commit: 1e59178e3f65880188caedb965e70db5ceeb2d64
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1257%2FTaoK%2Ftao-apply-case-insensitive-renames-v2
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1257/TaoK/tao-apply-case-insensitive-renames-v2
> Pull-Request: https://github.com/gitgitgadget/git/pull/1257
>
> Range-diff vs v1:
>
>  1:  b8bd612aa1e ! 1:  efd3bd4cdda apply: support case-only renames in case-insensitive filesystems
>      @@
>        ## Metadata ##
>      -Author: Tao Klerks <tao@klerks.biz>
>      +Author: Junio C Hamano <gitster@pobox.com>
>
>        ## Commit message ##
>      -    apply: support case-only renames in case-insensitive filesystems
>      +    t4141: test "git apply" with core.ignorecase
>
>      -    "git apply" checks, when validating a patch, to ensure that any files
>      -    being added aren't already in the worktree.
>      +    Signed-off-by: Junio C Hamano <gitster@pobox.com>
>
>      -    When this check runs on a case-only rename, in a case-insensitive
>      -    filesystem, this leads to a false positive - the command fails with an
>      -    error like:
>      -    error: File1: already exists in working directory
>      -
>      -    Fix this existence check to allow the file to exist, for a case-only
>      -    rename when config core.ignorecase is set.
>      -
>      -    Also add a test for this case, while verifying that conflicting file
>      -    conditions are still caught correctly, including case-only conflicts on
>      -    case-sensitive filesystems.
>      -
>      -    Signed-off-by: Tao Klerks <tao@klerks.biz>
>      -
>      - ## apply.c ##
>      -@@ apply.c: static int check_patch(struct apply_state *state, struct patch *patch)
>      -  if ((tpatch = in_fn_table(state, new_name)) &&
>      -      (was_deleted(tpatch) || to_be_deleted(tpatch)))
>      -          ok_if_exists = 1;
>      -+ else if (ignore_case && !strcasecmp(old_name, new_name))
>      -+         ok_if_exists = 1;
>      -  else
>      -          ok_if_exists = 0;
>      -
>      -
>      - ## t/t4141-apply-case-insensitive-rename.sh (new) ##
>      + ## t/t4141-apply-icase.sh (new) ##
>       @@
>       +#!/bin/sh
>       +
>      -+test_description='git apply should handle case-only renames on case-insensitive filesystems'
>      ++test_description='git apply with core.ignorecase'
>       +
>      -+TEST_PASSES_SANITIZE_LEAK=true
>       +. ./test-lib.sh
>       +
>      -+# Please note, this test assumes that core.ignorecase is set appropriately for the filesystem,
>      -+# as tested in t0050. Case-only rename conflicts are only tested in case-sensitive filesystems.
>      ++test_expect_success setup '
>      ++       # initial commit has file0 only
>      ++       test_commit "initial" file0 "initial commit with file0" initial &&
>       +
>      -+if ! test_have_prereq CASE_INSENSITIVE_FS
>      -+then
>      -+ test_set_prereq CASE_SENSITIVE_FS
>      -+ echo nuts
>      -+fi
>      ++       # current commit has file1 as well
>      ++       test_commit "current" file1 "initial content of file1" current &&
>      ++       file0blob=$(git rev-parse :file0) &&
>      ++       file1blob=$(git rev-parse :file1) &&
>       +
>      -+test_expect_success setup '
>      -+ echo "This is some content in the file." > file1 &&
>      -+ echo "A completely different file." > file2 &&
>      -+ git update-index --add file1 &&
>      -+ git update-index --add file2 &&
>      -+ cat >case_only_rename_patch <<-\EOF
>      -+ diff --git a/file1 b/File1
>      -+ similarity index 100%
>      -+ rename from file1
>      -+ rename to File1
>      -+ EOF
>      ++       # prepare sample patches
>      ++       # file0 is modified
>      ++       echo modification to file0 >file0 &&
>      ++       git add file0 &&
>      ++       modifiedfile0blob=$(git rev-parse :file0) &&
>      ++
>      ++       # file1 is removed and then ...
>      ++       git rm --cached file1 &&
>      ++       # ... identical copies are placed at File1 and file2
>      ++       git update-index --add --cacheinfo 100644,$file1blob,file2 &&
>      ++       git update-index --add --cacheinfo 100644,$file1blob,File1 &&
>      ++
>      ++       # then various patches to do basic things
>      ++       git diff HEAD^ HEAD -- file1 >creation-patch &&
>      ++       git diff HEAD HEAD^ -- file1 >deletion-patch &&
>      ++       git diff --cached HEAD -- file1 file2 >rename-file1-to-file2-patch &&
>      ++       git diff --cached HEAD -- file1 File1 >rename-file1-to-File1-patch &&
>      ++       git diff --cached HEAD -- file0 >modify-file0-patch
>       +'
>       +
>      -+test_expect_success 'refuse to apply rename patch with conflict' '
>      -+ cat >conflict_patch <<-\EOF &&
>      -+ diff --git a/file1 b/file2
>      -+ similarity index 100%
>      -+ rename from file1
>      -+ rename to file2
>      -+ EOF
>      -+ test_must_fail git apply --index conflict_patch
>      ++# Basic creation, deletion, modification and renaming.
>      ++test_expect_success 'creation and deletion' '
>      ++       # start at "initial" with file0 only
>      ++       git reset --hard initial &&
>      ++
>      ++       # add file1
>      ++       git -c core.ignorecase=false apply --cached creation-patch &&
>      ++       test_cmp_rev :file1 "$file1blob" &&
>      ++
>      ++       # remove file1
>      ++       git -c core.ignorecase=false apply --cached deletion-patch &&
>      ++       test_must_fail git rev-parse --verify :file1 &&
>      ++
>      ++       # do the same with ignorecase
>      ++       git -c core.ignorecase=true apply --cached creation-patch &&
>      ++       test_cmp_rev :file1 "$file1blob" &&
>      ++       git -c core.ignorecase=true apply --cached deletion-patch &&
>      ++       test_must_fail git rev-parse --verify :file1
>       +'
>       +
>      -+test_expect_success CASE_SENSITIVE_FS 'refuse to apply case-only rename patch with conflict, in case-sensitive FS' '
>      -+ test_when_finished "git mv File1 file2" &&
>      -+ git mv file2 File1 &&
>      -+ test_must_fail git apply --index case_only_rename_patch
>      ++test_expect_success 'modificaiton' '
>      ++       # start at "initial" with file0 only
>      ++       git reset --hard initial &&
>      ++
>      ++       # modify file0
>      ++       git -c core.ignorecase=false apply --cached modify-file0-patch &&
>      ++       test_cmp_rev :file0 "$modifiedfile0blob" &&
>      ++       git -c core.ignorecase=false apply --cached -R modify-file0-patch &&
>      ++       test_cmp_rev :file0 "$file0blob" &&
>      ++
>      ++       # do the same with ignorecase
>      ++       git -c core.ignorecase=true apply --cached modify-file0-patch &&
>      ++       test_cmp_rev :file0 "$modifiedfile0blob" &&
>      ++       git -c core.ignorecase=true apply --cached -R modify-file0-patch &&
>      ++       test_cmp_rev :file0 "$file0blob"
>      ++'
>      ++
>      ++test_expect_success 'rename file1 to file2' '
>      ++       # start from file0 and file1
>      ++       git reset --hard current &&
>      ++
>      ++       # rename file1 to file2
>      ++       git -c core.ignorecase=false apply --cached rename-file1-to-file2-patch &&
>      ++       test_must_fail git rev-parse --verify :file1 &&
>      ++       test_cmp_rev :file2 "$file1blob" &&
>      ++       git -c core.ignorecase=false apply --cached -R rename-file1-to-file2-patch &&
>      ++       test_must_fail git rev-parse --verify :file2 &&
>      ++       test_cmp_rev :file1 "$file1blob" &&
>      ++
>      ++       # do the same with ignorecase
>      ++       git -c core.ignorecase=true apply --cached rename-file1-to-file2-patch &&
>      ++       test_must_fail git rev-parse --verify :file1 &&
>      ++       test_cmp_rev :file2 "$file1blob" &&
>      ++       git -c core.ignorecase=true apply --cached -R rename-file1-to-file2-patch &&
>      ++       test_must_fail git rev-parse --verify :file2 &&
>      ++       test_cmp_rev :file1 "$file1blob"
>      ++'
>      ++
>      ++test_expect_success 'rename file1 to file2' '
>      ++       # start from file0 and file1
>      ++       git reset --hard current &&
>      ++
>      ++       # rename file1 to File1
>      ++       git -c core.ignorecase=false apply --cached rename-file1-to-File1-patch &&
>      ++       test_must_fail git rev-parse --verify :file1 &&
>      ++       test_cmp_rev :File1 "$file1blob" &&
>      ++       git -c core.ignorecase=false apply --cached -R rename-file1-to-File1-patch &&
>      ++       test_must_fail git rev-parse --verify :File1 &&
>      ++       test_cmp_rev :file1 "$file1blob" &&
>      ++
>      ++       # do the same with ignorecase
>      ++       git -c core.ignorecase=true apply --cached rename-file1-to-File1-patch &&
>      ++       test_must_fail git rev-parse --verify :file1 &&
>      ++       test_cmp_rev :File1 "$file1blob" &&
>      ++       git -c core.ignorecase=true apply --cached -R rename-file1-to-File1-patch &&
>      ++       test_must_fail git rev-parse --verify :File1 &&
>      ++       test_cmp_rev :file1 "$file1blob"
>      ++'
>      ++
>      ++# We may want to add tests with working tree here, without "--cached" and
>      ++# with and without "--index" here.  For example, should modify-file0-patch
>      ++# apply cleanly if we have File0 with $file0blob in the index and the working
>      ++# tree if core.icase is set?
>      ++
>      ++test_expect_success CASE_INSENSITIVE_FS 'a test only for icase fs' '
>      ++       : sample
>       +'
>       +
>      -+test_expect_success 'apply case-only rename patch without conflict' '
>      -+ git apply --index case_only_rename_patch
>      ++test_expect_success !CASE_INSENSITIVE_FS 'a test only for !icase fs' '
>      ++       : sample
>       +'
>       +
>       +test_done
>  -:  ----------- > 2:  1226fbd3caf reset: new failing test for reset of case-insensitive duplicate in index
>  -:  ----------- > 3:  04d83283716 apply: support case-only renames in case-insensitive filesystems
>
> --
> gitgitgadget

^ permalink raw reply	[relevance 0%]

* [PATCH 4/8] http: read HTTP WWW-Authenticate response headers
  @ 2022-09-13 19:25  3% ` Matthew John Cheetham via GitGitGadget
    1 sibling, 0 replies; 200+ results
From: Matthew John Cheetham via GitGitGadget @ 2022-09-13 19:25 UTC (permalink / raw)
  To: git; +Cc: Matthew John Cheetham, Matthew John Cheetham

From: Matthew John Cheetham <mjcheetham@outlook.com>

Read and store the HTTP WWW-Authenticate response headers made for
a particular request.

This will allow us to pass important authentication challenge
information to credential helpers or others that would otherwise have
been lost.

According to RFC2616 Section 4.2 [1], header field names are not
case-sensitive meaning when collecting multiple values for the same
field name, we can just use the case of the first observed instance of
each field name and no normalisation is required.

libcurl only provides us with the ability to read all headers recieved
for a particular request, including any intermediate redirect requests
or proxies. The lines returned by libcurl include HTTP status lines
delinating any intermediate requests such as "HTTP/1.1 200". We use
these lines to reset the strvec of WWW-Authenticate header values as
we encounter them in order to only capture the final response headers.

The collection of all header values matching the WWW-Authenticate
header is complicated by the fact that it is legal for header fields to
be continued over multiple lines, but libcurl only gives us one line at
a time.

In the future [2] we may be able to leverage functions to read headers
from libcurl itself, but as of today we must do this ourselves.

[1] https://datatracker.ietf.org/doc/html/rfc2616#section-4.2
[2] https://daniel.haxx.se/blog/2022/03/22/a-headers-api-for-libcurl/

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
---
 credential.c |  1 +
 credential.h | 10 +++++++
 http.c       | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+)

diff --git a/credential.c b/credential.c
index f6389a50684..897b4679333 100644
--- a/credential.c
+++ b/credential.c
@@ -22,6 +22,7 @@ void credential_clear(struct credential *c)
 	free(c->username);
 	free(c->password);
 	string_list_clear(&c->helpers, 0);
+	strvec_clear(&c->wwwauth_headers);
 
 	credential_init(c);
 }
diff --git a/credential.h b/credential.h
index f430e77fea4..6a9d4e3de07 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,14 @@ struct credential {
 	 */
 	struct string_list helpers;
 
+	/**
+	 * A `strvec` of WWW-Authenticate header values. Each string
+	 * is the value of a WWW-Authenticate header in an HTTP response,
+	 * in the order they were received in the response.
+	 */
+	struct strvec wwwauth_headers;
+	unsigned header_is_last_match:1;
+
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
@@ -130,6 +139,7 @@ struct credential {
 
 #define CREDENTIAL_INIT { \
 	.helpers = STRING_LIST_INIT_DUP, \
+	.wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
diff --git a/http.c b/http.c
index 5d0502f51fd..091321af98e 100644
--- a/http.c
+++ b/http.c
@@ -183,6 +183,81 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
 	return nmemb;
 }
 
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+	size_t size = eltsize * nmemb;
+	struct strvec *values = &http_auth.wwwauth_headers;
+	struct strbuf buf = STRBUF_INIT;
+	const char *val;
+	const char *z = NULL;
+
+	/*
+	 * Header lines may not come NULL-terminated from libcurl so we must
+	 * limit all scans to the maximum length of the header line, or leverage
+	 * strbufs for all operations.
+	 *
+	 * In addition, it is possible that header values can be split over
+	 * multiple lines as per RFC 2616 (even though this has since been
+	 * deprecated in RFC 7230). A continuation header field value is
+	 * identified as starting with a space or horizontal tab.
+	 *
+	 * The formal definition of a header field as given in RFC 2616 is:
+	 *
+	 *   message-header = field-name ":" [ field-value ]
+	 *   field-name     = token
+	 *   field-value    = *( field-content | LWS )
+	 *   field-content  = <the OCTETs making up the field-value
+	 *                    and consisting of either *TEXT or combinations
+	 *                    of token, separators, and quoted-string>
+	 */
+
+	strbuf_add(&buf, ptr, size);
+
+	/* Strip the CRLF that should be present at the end of each field */
+	strbuf_trim_trailing_newline(&buf);
+
+	/* Start of a new WWW-Authenticate header */
+	if (skip_iprefix(buf.buf, "www-authenticate:", &val)) {
+		while (isspace(*val)) val++;
+
+		strvec_push(values, val);
+		http_auth.header_is_last_match = 1;
+		goto exit;
+	}
+
+	/*
+	 * This line could be a continuation of the previously matched header
+	 * field. If this is the case then we should append this value to the
+	 * end of the previously consumed value.
+	 */
+	if (http_auth.header_is_last_match && isspace(*buf.buf)) {
+		const char **v = values->v + values->nr - 1;
+		char *append = xstrfmt("%s%.*s", *v, (int)(size - 1), ptr + 1);
+
+		free((void*)*v);
+		*v = append;
+
+		goto exit;
+	}
+
+	/* This is the start of a new header we don't care about */
+	http_auth.header_is_last_match = 0;
+
+	/*
+	 * If this is a HTTP status line and not a header field, this signals
+	 * a different HTTP response. libcurl writes all the output of all
+	 * response headers of all responses, including redirects.
+	 * We only care about the last HTTP request response's headers so clear
+	 * the existing array.
+	 */
+	if (skip_iprefix(buf.buf, "http/", &z))
+		strvec_clear(values);
+
+exit:
+	strbuf_release(&buf);
+	return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
 	return nmemb;
@@ -1829,6 +1904,8 @@ static int http_request(const char *url,
 					 fwrite_buffer);
 	}
 
+	curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
 	accept_language = http_get_accept_language_header();
 
 	if (accept_language)
-- 
gitgitgadget


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH] tests: replace mingw_test_cmp with a helper in C
  @ 2022-09-06 13:10  4%   ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2022-09-06 13:10 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin via GitGitGadget, git

Hi Junio,

On Fri, 29 Jul 2022, Junio C Hamano wrote:

> "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
>
> > +	const char *argv[] = {
> > +		"diff", "--no-index", NULL, NULL, NULL
> > +	};
>
> Don't we want to have "--" before the two paths?

Yes!

> > +	if (!(f0 = !strcmp(argv[1], "-") ? stdin : fopen(argv[1], "r")))
> > +		return error_errno("could not open '%s'", argv[1]);
> > +	if (!(f1 = !strcmp(argv[2], "-") ? stdin : fopen(argv[2], "r"))) {
> > +		fclose(f0);
> > +		return error_errno("could not open '%s'", argv[2]);
> > +	}
>
> It is tricky that you need to take "-" and treat it as the standard
> input stream in either argv[1] or argv[2] (but not both).  If would
> be a different story in an end-user facing program, but because this
> is a test helper, feeding wrong input is developer's fault, and I do
> not mind lack of attention to detail of error checking to make sure
> we avoid comparing alternating lines of the standard input.

No, you're right, I've added a guard that prevents `test-tool cmp - -`
from failing in obscure ways.

> > +	for (;;) {
> > +		int r0 = strbuf_getline(&b0, f0);
> > +		int r1 = strbuf_getline(&b1, f1);
> > +
> > +		if (r0 == EOF) {
> > +			fclose(f0);
> > +			fclose(f1);
> > +			strbuf_release(&b0);
> > +			strbuf_release(&b1);
> > +			if (r1 == EOF)
> > +				return 0;
>
> If both hit the EOF at the same time, we know they are the same, OK.
>
> > +cmp_failed:
> > +			if (!run_diff(argv[1], argv[2]))
>
> If one of argv[] was "-", then this wouldn't work correctly, as the
> other file is read from the beginning but the "-" side have consumed
> the initial part of the input and we cannot unseek it.  This bug
> needs to be fixed only if we expect a useful and reliable output
> from the helper.

Right. I've added a clause that says that we cannot show the diff because
`stdin` has been consumed already.

> But otherwise the idea is sound.  We compare them line by line,
> using strbuf_getline() to ignore differences in CRLF and LF that
> originates at 4d715ac0 (Windows: a test_cmp that is agnostic to
> random LF <> CRLF conversions, 2013-10-26).  Only when we find the
> input different, we use "git diff --no-index" to make the difference
> (and unfortunately more, as it does not ignore CRLF <> LF
> differences) visible.
>
> > +				die("Huh? 'diff --no-index %s %s' succeeded",
> > +				    argv[1], argv[2]);
>
> Nice attention to (possibly irrelevant) detail here.  I would have
> ignored the return value and reported "they are different" at this
> point, though.  The line-by-line comparison we did was the
> authoritative one, and "git diff --no-index" is merely used for
> human readable output.
>
> In any case, "test-tool mingwcmp" would be a better name that
> highlights the spirit of 4d715ac0 to ignore CRLF <> LF issues.  IOW,
> it does a lot more than "cmp" replacement, and we shouldn't mislead
> users/developers into thinking it is a plain "cmp" replacement.

Fair point. The Unix tool `cmp` does not care about line endings at all,
so when you come from a Unix background you will expect the same to be
true for `test-tool cmp`.

On the other hand, you will expect the same to be true for `test_cmp`,
too, which is not the case, and the root cause of why I had to come up
with 32ed3314c10 (t5351: avoid using `test_cmp` for binary data,
2022-07-29).

Having said that, I agree that the test tool name should reflect better
what the subcommand does.

I do dislike the proposed name `mingwcmp`. Not only because it is
misleading, as the purpose is not to compare MINGW-specific files but
instead the purpose is to compare text files (and, in fact, the tool works
just fine on Linux and macOS, too). But also because it would contribute
to just how much of a second-class citizen the MINGW-based build is in Git
land: From choosing to implement large parts, including the entire test
suite as well as the performance benchmarks, in POSIX scripts (which plays
to Windows' weaknesses in a big way) to massively favoring spawned
processes over multi-threading (which plays to Linux' strengths and to
Windows' weaknesses), to a still-inherent assumption that the underlying
filesystem is case-sensitive (think: branch names), to an implicit
agreement in the core Git community that patch contributions need not take
care of working well on Windows (but that that's the job "of Windows folk"
instead). This is kind of at odds with the fact that we must assume that
half of Git's users are Windows-based (we can only assume, based on
surveys, because we successfully avoid any kind of even opt-in telemetry
that would give us hard data). I definitely want to stay away from making
that second-citizenry even worse.

So I am going with the name `test-tool text-cmp` instead.

Thank you for your review,
Dscho

>
> Thanks.
>
> > diff --git a/t/test-lib.sh b/t/test-lib.sh
> > index 7726d1da88a..220c259e796 100644
> > --- a/t/test-lib.sh
> > +++ b/t/test-lib.sh
> > @@ -1546,7 +1546,7 @@ case $uname_s in
> >  	test_set_prereq SED_STRIPS_CR
> >  	test_set_prereq GREP_STRIPS_CR
> >  	test_set_prereq WINDOWS
> > -	GIT_TEST_CMP=mingw_test_cmp
> > +	GIT_TEST_CMP="test-tool cmp"
> >  	;;
> >  *CYGWIN*)
> >  	test_set_prereq POSIXPERM
> >
> > base-commit: 23b219f8e3f2adfb0441e135f0a880e6124f766c
>

^ permalink raw reply	[relevance 4%]

* [PATCH v3 0/5] Bundle URIs II: git clone --bundle-uri
    @ 2022-08-09 13:11  3%   ` Derrick Stolee via GitGitGadget
  1 sibling, 0 replies; 200+ results
From: Derrick Stolee via GitGitGadget @ 2022-08-09 13:11 UTC (permalink / raw)
  To: git
  Cc: gitster, me, newren, avarab, dyroneteng, Johannes.Schindelin,
	szeder.dev, mjcheetham, steadmon, Derrick Stolee

This is the second series building the bundle URI feature as discussed in
the previous series that added the design document [1]. This series does not
modify the design document, so the patches are independent and can be
applied to the latest 'master'.

[1]
https://lore.kernel.org/git/pull.1248.v3.git.1658757188.gitgitgadget@gmail.com

This series brings in just enough logic that we can bootstrap clones from a
single bundle using git clone --bundle-uri=<X>.

 * Patch 1 adds a 'get' capability to 'git remote-https' which allows
   downloading the contents of a URI to a local file.
 * Patch 2 creates basic file-copy logic within a new bundle-uri.c file. It
   is not used until patch 3.
 * Patch 3 creates the git clone --bundle-uri=<X> option, allowing Git to
   bootstrap a clone from a bundle, but get the remaining objects from the
   origin URL. (As of this patch, it only accepts a filename.)
 * Patch 4 extends the git clone --bundle-uri=<X> option to allow file://
   and https:// URIs.
 * Patch 5 is a CLI helper to avoid using --bundle-uri and --depth at the
   same time in git clone.

As outlined in [1], the next steps after this are:

 1. Allow parsing a bundle list as a config file at the given URI. The
    key-value format is unified with the protocol v2 verb (coming in (3)).
    [2]
 2. Implement the protocol v2 verb, re-using the bundle list logic from (2).
    Use this to auto-discover bundle URIs during 'git clone' (behind a
    config option). [3]
 3. Implement the 'creationToken' heuristic, allowing incremental 'git
    fetch' commands to download a bundle list from a configured URI, and
    only download bundles that are new based on the creation token values.
    [4]

I have prepared some of this work as pull requests on my personal fork so
curious readers can look ahead to where we are going:

[2] https://github.com/derrickstolee/git/pull/20

[3] https://github.com/derrickstolee/git/pull/21

[4] https://github.com/derrickstolee/git/pull/22

Note: this series includes some code pulled out of the first series [1], and
in particular the git fetch --bundle-uri=<X> option is removed. The
intention was to replace that with git bundle fetch <X>, but that conflicts
with the work to refactor how subcommands are parsed. The git bundle fetch
subcommand could be added later for maximum flexibility on the client side,
but we can also move forward without it.


Updates in v3
=============

 * The protocol matching for "http://", "https://", and "file://" now
   uniformly include the "//" portion and are case-sensitive.


Updates in v2
=============

 * Several typos or small tweaks. See the range-diff for details.

Thanks, -Stolee

Derrick Stolee (5):
  remote-curl: add 'get' capability
  bundle-uri: create basic file-copy logic
  clone: add --bundle-uri option
  bundle-uri: add support for http(s):// and file://
  clone: --bundle-uri cannot be combined with --depth

 Documentation/git-clone.txt         |   7 ++
 Documentation/gitremote-helpers.txt |   9 ++
 Makefile                            |   1 +
 builtin/clone.c                     |  18 +++
 bundle-uri.c                        | 168 ++++++++++++++++++++++++++++
 bundle-uri.h                        |  14 +++
 remote-curl.c                       |  28 +++++
 t/t5557-http-get.sh                 |  39 +++++++
 t/t5558-clone-bundle-uri.sh         |  81 ++++++++++++++
 t/t5606-clone-options.sh            |   8 ++
 10 files changed, 373 insertions(+)
 create mode 100644 bundle-uri.c
 create mode 100644 bundle-uri.h
 create mode 100755 t/t5557-http-get.sh
 create mode 100755 t/t5558-clone-bundle-uri.sh


base-commit: e72d93e88cb20b06e88e6e7d81bd1dc4effe453f
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1300%2Fderrickstolee%2Fbundle-redo%2Fclone-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1300/derrickstolee/bundle-redo/clone-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1300

Range-diff vs v2:

 1:  4df4a1d679a = 1:  4df4a1d679a remote-curl: add 'get' capability
 2:  6a6f1a04889 = 2:  6a6f1a04889 bundle-uri: create basic file-copy logic
 3:  00debaf6e77 = 3:  00debaf6e77 clone: add --bundle-uri option
 4:  e4f2dcc7a45 ! 4:  66a1ce40451 bundle-uri: add support for http(s):// and file://
     @@ bundle-uri.c: static int find_temp_filename(struct strbuf *name)
      +	struct strbuf line = STRBUF_INIT;
      +	int found_get = 0;
      +
     -+	strvec_pushl(&cp.args, "git-remote-https", "origin", uri, NULL);
     ++	strvec_pushl(&cp.args, "git-remote-https", uri, NULL);
      +	cp.in = -1;
      +	cp.out = -1;
      +
     @@ bundle-uri.c: static int find_temp_filename(struct strbuf *name)
      +{
      +	const char *out;
      +
     -+	if (istarts_with(uri, "https:") ||
     -+	    istarts_with(uri, "http:"))
     ++	if (starts_with(uri, "https:") ||
     ++	    starts_with(uri, "http:"))
      +		return download_https_uri_to_file(filename, uri);
      +
     -+	if (!skip_prefix(uri, "file://", &out))
     -+		out = uri;
     ++	if (skip_prefix(uri, "file://", &out))
     ++		uri = out;
      +
      +	/* Copy as a file */
     -+	return copy_file(filename, out, 0);
     ++	return copy_file(filename, uri, 0);
       }
       
       static int unbundle_from_file(struct repository *r, const char *file)
 5:  acee1fae027 = 5:  ed76d84c5a7 clone: --bundle-uri cannot be combined with --depth

-- 
gitgitgadget

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 4/5] bundle-uri: add support for http(s):// and file://
  2022-08-04 15:34  4%       ` Derrick Stolee
@ 2022-08-04 18:19  0%         ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2022-08-04 18:19 UTC (permalink / raw)
  To: Derrick Stolee
  Cc: Derrick Stolee via GitGitGadget, git, me, newren, avarab,
	dyroneteng, Johannes.Schindelin, szeder.dev, mjcheetham, steadmon

Derrick Stolee <derrickstolee@github.com> writes:

>>> +	if (istarts_with(uri, "https:") ||
>>> +	    istarts_with(uri, "http:"))
>> 
>> Let's be a bit more strict to avoid mistakes and make the code
>> immediately obvious, e.g.
>> 
>> 	if (istarts_with(uri, "https://") ||
>> 	    istarts_with(uri, "http://"))

This part (i.e. check for "<scheme>://", not "<scheme>:") still
stands, as the latter could be an scp style Git URL that goes to the
host whose name is <scheme>.  As mentioned later, s/istarts/starts/
is probably a good thing to do here.

>> Does "git-remote-https" talk to a "http://" URL just fine when uri
>> parameter starts with "http://"?  Would it be the same if the uri
>> parameter begins with say "Http://"?
>
> I did a quick check of our HTTPS tests modifying the HTTPD_PROTO
> variable in lib-httpd.sh to "HtTP" and we get this fun error:
>
> + git clone --filter=blob:limit=0 HtTP://127.0.0.1:5601/smart/server client
> Cloning into 'client'...
> git: 'remote-HtTP' is not a git command. See 'git --help'.
>
> So I guess I can keep case-sensitive comparisons here.

Guarding them to lowercase-only may sound like a cop-out to purists,
but I think it is reasonable thing to do.  The only folks that would
be offended by are protocol lawyers, and as your check shows, we are
treating <scheme> case sensitively already.

An obvious alternative is to downcase the "<scheme>://" part but I
do not think it is worth it; we have to do that everywhere and we
need to be confident that we covered all the code paths---the latter
is expensive.

There do exist skip_iprefix() that are used in many places, like
convert, http, mailinfo, etc. by the way.  That is a moot point as
we are not doing case insensitive comparison anymore.

Thanks.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 4/5] bundle-uri: add support for http(s):// and file://
  @ 2022-08-04 15:34  4%       ` Derrick Stolee
  2022-08-04 18:19  0%         ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee @ 2022-08-04 15:34 UTC (permalink / raw)
  To: Junio C Hamano, Derrick Stolee via GitGitGadget
  Cc: git, me, newren, avarab, dyroneteng, Johannes.Schindelin,
	szeder.dev, mjcheetham, steadmon

On 8/2/2022 5:32 PM, Junio C Hamano wrote:
> "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com> writes:
> 
>> +static int copy_uri_to_file(const char *filename, const char *uri)
>> +{
>> +	const char *out;
>> +
>> +	if (istarts_with(uri, "https:") ||
>> +	    istarts_with(uri, "http:"))
> 
> Let's be a bit more strict to avoid mistakes and make the code
> immediately obvious, e.g.
> 
> 	if (istarts_with(uri, "https://") ||
> 	    istarts_with(uri, "http://"))
> 
>> +		return download_https_uri_to_file(filename, uri);
>> +
>> +	if (!skip_prefix(uri, "file://", &out))
>> +		out = uri;
> 
> If we are using istarts_with because URI scheme name is case
> insensitive, shouldn't we do the same for "file://" URL, not
> just for "http(s)://" URL?  IOW
> 
> 	if (!skip_iprefix(uri, "file://", &out))

Good ideas. Of course, we don't have a skip_iprefix(), but
I can use "istarts_with()" and then manually add the length.
If we see more need for that in the future, we can consider
adding it.

(It's interesting that these uses in bundle-uri.c are the
only uses of istarts_with() that I see in the codebase.)

>> +static int download_https_uri_to_file(const char *file, const char *uri)
>>  {
>> +	int result = 0;
>> +	struct child_process cp = CHILD_PROCESS_INIT;
>> +	FILE *child_in = NULL, *child_out = NULL;
>> +	struct strbuf line = STRBUF_INIT;
>> +	int found_get = 0;
>> +
>> +	strvec_pushl(&cp.args, "git-remote-https", "origin", uri, NULL);
> 
> Does "git-remote-https" talk to a "http://" URL just fine when uri
> parameter starts with "http://"?  Would it be the same if the uri
> parameter begins with say "Http://"?

I did a quick check of our HTTPS tests modifying the HTTPD_PROTO
variable in lib-httpd.sh to "HtTP" and we get this fun error:

+ git clone --filter=blob:limit=0 HtTP://127.0.0.1:5601/smart/server client
Cloning into 'client'...
git: 'remote-HtTP' is not a git command. See 'git --help'.

So I guess I can keep case-sensitive comparisons here.

Thanks,
-Stolee

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 0/3] log: create tighter default decoration filter
  @ 2022-07-26 18:19  4%     ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2022-07-26 18:19 UTC (permalink / raw)
  To: Derrick Stolee
  Cc: Derrick Stolee via GitGitGadget, git, gitster, me, vdye, steadmon


On Tue, Jul 26 2022, Derrick Stolee wrote:

> On 7/26/2022 10:44 AM, Ævar Arnfjörð Bjarmason wrote:
>> 
>> On Tue, Jul 26 2022, Derrick Stolee via GitGitGadget wrote:
>> 
>>> This was previously reduced by adding the log.excludeDecoration config
>>> option and modifying that config in git maintenance's prefetch task (to hide
>>> refs/prefetch/*). I then followed that pattern again for the bundle URI
>>> feature [1], but this caught some reviewers by surprise as an unfortunate
>>> side-effect. This series is a way to roll back the previous decision to use
>>> log.excludeDecoration and instead use tighter filters by default.
>>>
>>> As noted in the last patch, the current design ignores the new filters if
>>> there are any previously-specified filters. This includes the
>>> log.excludeDecorations=refs/prefetch/ set by the git maintenance command.
>>> This means that users who ran that command in their repo will not get the
>>> benefits of the more strict filters. While we stop writing
>>> log.excludeDecorations, we don't remove existing instances of it.
>> 
>> Leaving aside the question of these magic refs, and if we need new ones
>> (e.g. refs/bundle/*) I have sometimes made use of out-of-standard
>> refspace refs.
>> 
>> E.g. when I build git I create refs/built-tags/* tag object refs
>> (i.e. not in refs/tags/*), which is a neat way to get "git tag -l" and
>> the like to ignore it.
>> 
>> But to still have it show decorated in logs (e.g. I'll see what my
>> "private" branch is at), and "for-each-ref --contains" still knows about
>> it.
>
> You also have the unfortunate UX of having the refs spelled out entirely
> ("refs/<special-place>/..." instead of "<special-place>/..." like how
> "refs/remotes/" is dropped from remote refs) and not having special color.
> But that's beside the point.

Whether that's unfortunate UX or not is debatable, since we expose the
"refs/" prefix explicitly in other parts of the UX, and e.g. "HEAD" or
"ORIG_HEAD" or whatever in in that "/"-relation to
"refs/heads/whatever", and not "heads/whatever".

E.g. try:

	mkdir .git/FOO &&
	git rev-parse origin/seen >.git/FOO/BAR &&
	git push origin FOO/BAR:refs/FOO/BAR

And then:

	mkdir .git/refs/FOO &&
	git rev-parse origin/next >.git/refs/FOO/BAR
	$ git rev-parse FOO/BAR
	warning: object-name.c:970: refname 'FOO/BAR' is ambiguous.
	[seen SHA1]
	$ git rev-parse refs/FOO/BAR
	[next SHA1]

I.e. we really do understand FOO/BAR as meaning .git/FOO/BAR, as opposed
to .git/refs/FOO/BAR. You really can't assume that you can strip a
"refs/" from a multi-level ref and not end up with ambiguities. It's
*not* the case that we just have the .git/<UPPER-CASE-HERE> and
.git/refs/* namespaces, and nothing else.

Are we *almost* there? Yes, I vaguely recall experimenting with trying
to get us 100% of the way (just locally, didn't make it on-list) a long
time ago, and there were some tricky edge cases, and we don't know who
in the wild is relying on it.

I think it would be interesting to explore getting there, but I don't
think eliding information on the display end like that would be the
right way to start.

Although to be fair e.g. "git for-each-ref" excludes these entirely, but
that's a ref-filter.c specific edge-case, per the above try it on
e.g. "git push", you'll find that you can push one or the other.

I think I was poking at this at the time because I wanted to have "git
show head" mean the same as "git show HEAD", or at least for us to start
enforcing the rule that thou shalt not use refnames that are head, HeAd
or whatever mixed-case version we have of our magical all-upper special
refs. This matters because you have commands like "git rev-parse head"
that'll work on case-insensitive FS's that promptly fail on
case-sensitive FS's.

>> Now, that's a rather obscure use-case, and I suspect other "special
>> refs" are similarly obscure (e.g. GitLab's refs/keep-around/* comes to
>> mind).
>> 
>> But I think this change is going about it the wrong way, let's have a
>> list of refs that Git knows about as magical, instead of assuming that
>> we can ignore everything that's not on a small list of things we're
>> including.
>> 
>> Wouldn't that give you what you want, and not exclude these sorts of
>> custom refs unexpectedly for users?
>
> Instead of keeping track of an ever-growing list of exclusions, instead
> making a clear list of "this is what most users will want for their
> decorations" is a better approach.
>
> Users who know how to create custom refs outside of this space have the
> capability to figure out how to show their special refs. My general ideas
> for designing these kinds of features is to have a default that is focused
> on the typical user while giving config options for experts to tweak those
> defaults.
>
> You're right that this series perhaps leaves something to be desired in
> that second part, since there isn't an easy _config-based_ way to enable
> all decorations (or a small additional subset).

Yes, but this is just side-stepping the issue. Your X-Y problem is that
you want to exclude certain refs that we're specifically creating.

I think that's fair enough, but I don't see why we're not specifically
excluding just those then.

It'll just be these bundle refs, filter refs, or whatever other magic we
want excluded. Why would we extend that to refs that we don't know about?

It seems like a safe assumption that if we don't know what it is we
should include it.

Both because that's what we do now (least chance of breaking workflows
in the wild), and because the entire point of the feature is to display
the log in relation to points on the ref namespace. If we don't *know*
that they're meaningless let's leave them out of the exclusion, no?

I'd also think that we'd want to consider this holistically. I haven't
checked, but aside from HEAD (which I think is the only special-case,
but maybe I'm wrong) isn't there a one-to-one mapping between what we'll
show in decorations, and what "git for-each-ref" diplays?

>>> I'm interested if anyone has another way around this issue, or if we
>>> consider adding the default filter as long as no --decorate=refs options are
>>> specified.
>> 
>> I think the resulting UX here is bad, in that we ship hardcoded list of
>> these if you don't specify the config in 2/3. So I can do:
>> 
>>       -c log.excludeDecoration=this-will-never-match
>> 
>> To "clear" the list, but not this:
>> 
>>       -c log.excludeDecoration=
>
> The thing that I forgot to do, but had considered was adding a
> --decorate-all option to allow clearing the default filters from the
> command line. You can already do "--decorate-refs=refs" to get everything
> (except HEAD).

...and some other exclusions, e.g. it won't show ORIG_HEAD even with
--decorate-refs=ORIG_HEAD, but perhaps I'm doing it the wrong way...

> As far as config goes, we could also create a log.includeDecoration key,
> but we'd want to consider it to populate the same part of the filtering
> algorithm. Similar to having any instance of log.excludeDecoration, this
> would clear the default list. To get all decorations again, you could add
> this to your config file:
>
> 	[log]
> 		includeDecoration = refs
> 		includeDecoration = HEAD

If we're considering new config I'd think anything that worked like this
instead would be *much less* confusing:

	some.config = refs/*
	some.config = HEAD

I.e. per the above your HEAD will presumably either match HEAD/BLAH, or
treat "refs" magically as "refs/" and not "refs".

Now, I don't think you can delete .git/HEAD and/or make .git/refs a file
and still have a functioning repository, but the same general rule
applies to "FOO" v.s. "FOO/BAR" and "custom-refs" or whatever.

We use that wildcard syntax unambiguously for the refspec matching, we
could just use the same machinery to match this.

> Alternatively, we could instead create a "filter default" option such as
> "log.decorateFilter = (core|all)" where "core" is the default set being
> considered by this series, and "all" is the empty filter.

Sure, for any key that takes N arguments we could have some way to say
"if you do this it's the same as enumerating these X values", as long as
it's not ambiguous whether you mean a special "aggregate label" or a
name of your own...

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2 1/6] docs: document bundle URI standard
  2022-07-21 12:09  3%     ` Matthew John Cheetham
  2022-07-22 13:52  0%       ` Derrick Stolee
@ 2022-07-22 16:03  0%       ` Derrick Stolee
  1 sibling, 0 replies; 200+ results
From: Derrick Stolee @ 2022-07-22 16:03 UTC (permalink / raw)
  To: Matthew John Cheetham, Derrick Stolee via GitGitGadget
  Cc: gitster, me, newren, avarab, dyroneteng, Johannes.Schindelin, git

On 7/21/2022 8:09 AM, Matthew John Cheetham wrote:

>> +The remaining keys include an `<id>` segment which is a server-designated
>> +name for each available bundle.
> 
> Case-sensitive ID? A-Za-z0-9 only? "Same as Git config rules"?

I was thinking "same as Git config rules", but those rules are extremely
flexible, perhaps more than we want them to be. (For instance, the rules
allow specifying "remote.<id>.url" where <id> could be anything except
having a newline or null byte.

Perhaps we should start with "alphanumeric and `-`" like the section
name, just to be extra careful here. We can probably be fine parsing
more flexibly on the client, but better to be restrictive now and
relax later.

Thanks,
-Stolee


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 1/6] docs: document bundle URI standard
  2022-07-21 12:09  3%     ` Matthew John Cheetham
@ 2022-07-22 13:52  0%       ` Derrick Stolee
  2022-07-22 16:03  0%       ` Derrick Stolee
  1 sibling, 0 replies; 200+ results
From: Derrick Stolee @ 2022-07-22 13:52 UTC (permalink / raw)
  To: Matthew John Cheetham, Derrick Stolee via GitGitGadget
  Cc: gitster, me, newren, avarab, dyroneteng, Johannes.Schindelin, git

On 7/21/2022 8:09 AM, Matthew John Cheetham wrote:> I had a few questions and suggestions; below.
> 
> On 2022-06-29 21:40, Derrick Stolee via GitGitGadget wrote:> +Assuming a `200 OK` response from the server, the content at the URL is
>> +inspected. First, Git attempts to parse the file as a bundle file of
>> +version 2 or higher. If the file is not a bundle, then the file is parsed
>> +as a plain-text file using Git's config parser. The key-value pairs in
>> +that config file are expected to describe a list of bundle URIs. If
>> +neither of these parse attempts succeed, then Git will report an error to
>> +the user that the bundle URI provided erroneous data.
>> +
>> +Any other data provided by the server is considered erroneous.
> 
> I wonder if it may be worth considering adding an optional server requirement ("MAY" not "MUST") to provide a `Content-Type` header indicating if the response is a bundle list (or bundle) to skip straight to parsing the correct type of file? Eg "application/x-git-bundle-list"?
> 
> Even the simplest of content servers should be able to set Content-Type. If not falling back to 'try parse bundle else try parse bundle list' is still OK.
This is an interesting idea. We should keep it in mind for a future
extension, since the Git client needs to do some work to parse the
header and communicate that upwards to the logic that parses the file. 
>> +bundle.mode::
>> +    (Required) This value has one of two values: `all` and `any`. When `all`
>> +    is specified, then the client should expect to need all of the listed
>> +    bundle URIs that match their repository's requirements. When `any` is
>> +    specified, then the client should expect that any one of the bundle URIs
>> +    that match their repository's requirements will suffice. Typically, the
>> +    `any` option is used to list a number of different bundle servers
>> +    located in different geographies.
> 
> Do you forsee any future where we'd want or need to specify 'sets' of bundles where "all" _of_ "any" particular set would be required?
> Eg. there are 3 sets of bundles (A, B, C), and the client would need to download all bundles belonging to any of A, B, or C? Where ABC would be different geo-distributed sets?

The bundle.heuristic space is open-ended to allow for different ways to
scan the bundle list and download a subset, so that might be a way to
extend this in the future.

I think what you're hinting at is a single "global" bundle list that knows
about all of the bundles scattered across the world and it groups bundles
by geography, even though the list knows about multiple geos. Is that what
you mean?

> I guess what I'm getting at here is with this design (which I appreciate is intentionally flexible), there are several different ways a server could direct a client to bundles stored in a nearby geography:
> 
> 1. Serve an "all" bundle list with geo-located bundle URIs?
> 2. Serve a global "any" bundle list with each single bundle in a different geography (specified by `location`)
> 3. Serve a single bundle (not a list) with a different

I think this item 3 is incomplete. What were you going to say?

I'll assume for now that you just mean "3. Serve a single bundle (not a
list)."

> Are any of these going to be preferred over another for potential client optimisations?

I could do better in this document of giving clear examples of how a
bundle provider could organize bundles. As the client becomes more
sophisticated, then different organizations become "unlocked" as something
the client can understand and use efficiently. That also sets the stage
for how to add extensions: the client change can be paired with an example
bundle provider organization.

The bundle provider setup that I personally think will work best is:

 1. The origin Git server advertises a bundle list in "any" mode. Each URI
    is a static URI that corresponds to a different geography. The client
    picks the closest one and stores that URI in local config.

 2. Each static URI provides a bundle list in "all" mode with the
    creationToken heuristic. The bundles are sorted by creation time, and
    new bundles are created on roughly a daily basis, but it could be
    a wider time frame if not enough Git data is added every day. The
    creationTokens are added as appending to this order, but after the
    list has some fixed length, the oldest bundles are merged into a single
    bundle. That merged bundle is then assigned the maximum creationToken
    of the bundles used to create it.

This comes from experience in how the GVFS Cache Server prefetch packfiles
are created. To support those very-active repos, there's another layer of
"hourly" packs that are merged into "daily" packs; those daily packs are
merged into a giant "everything old" pack after 30 days. This means that
there is a maximum of 1 + 30 + 23 packs at any given time.

>> +
>> +bundle.heuristic::
>> +    If this string-valued key exists, then the bundle list is designed to
>> +    work well with incremental `git fetch` commands. The heuristic signals
>> +    that there are additional keys available for each bundle that help
>> +    determine which subset of bundles the client should download.
>> +
>> +The remaining keys include an `<id>` segment which is a server-designated
>> +name for each available bundle.
> 
> Case-sensitive ID? A-Za-z0-9 only? "Same as Git config rules"?

I would say "Same as Git config rules" in general, but we could try to be
more strict here, if we want.

>> +bundle.<id>.location::
>> +    This string value advertises a real-world location from where the bundle
>> +    URI is served. This can be used to present the user with an option for
>> +    which bundle URI to use or simply as an informative indicator of which
>> +    bundle URI was selected by Git. This is only valuable when
>> +    `bundle.mode` is `any`.
> 
> I assume `location` is just an opaque string that is just used for info or display purposes? Does it make sense for other 'display' type strings like 'name' or 'message'?

We should definitely give this key another look when we get around to
building the UX around choosing from a list in "any" mode with human-
readable information like this.

>> +Advertising Bundle URIs
>> +-----------------------
>> +
> ...
>> +The client could choose an arbitrary bundle URI as an option _or_ select
>> +the URI with best performance by some exploratory checks. It is up to the
>> +bundle provider to decide if having multiple URIs is preferable to a
>> +single URI that is geodistributed through server-side infrastructure.
> 
> Would it make sense for the client to pick the first bundle URI rather than an arbitrary one? The server could use information about the request (origin IP/geography) to provide a sorted list of URIs by physical distance to the client.
> 
> I guess if arbitrary is 'random' then this provides some client-side load balancing over multiple potential servers too. Interested in your thoughts behind what would be 'best practice' for a bundle server here.

I tend to think of the client as being the "smartest" participant in this
exchange. The origin Git server is just serving lines from its local config
and isn't thinking at all about the client's network topology. If instead
the bundle provider (not the Git server) organizes to have a single URI
listing all of the geographic options, then that server could do smarter
things, for sure. It might be able to do that reordering to take advantage
of the Git client picking the first option (before the client has the
capability to test the connections to all of them for the fastest link).

>> +If the bundle provider does not provide a heuristic, then the client
>> +should attempt to inspect the bundle headers before downloading the full
>> +bundle data in case the bundle tips already exist in the client
>> +repository.
> 
> Would this default behaviour also be considered another explicit heurisitic option? For example: `bundle.heuristic=default` or `inspect`.
> Is it ever likely that the default behaviour would change?

I think that if there is no explicit heuristic, then this is the only way
the client can avoid downloading all of the bundle content.

>> +* The client receives a response other than `200 OK` (such as `404 Not Found`,
>> +  `401 Not Authorized`, or `500 Internal Server Error`). The client should
>> +  use the `credential.helper` to attempt authentication after the first
>> +  `401 Not Authorized` response, but a second such response is a failure.
> 
> I'd probably say a 500 is not solvable with a different set of credentials, but potentially a retry or just `die`. Do we attempt to `credential_fill()` with anything other than a 401 (or maybe 403 or 404) elsewhere in Git?

This is poorly worded, and I should group 400-level errors in one bullet
and 500 errors as its own category. The implementation uses the same
"retry with credentials" logic that other HTTPS connections make, so the
logic should be shared there. This document should point to another place
that documents that contract, especially in case it changes in the future.

Thanks!
-Stolee

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 1/6] docs: document bundle URI standard
  @ 2022-07-21 12:09  3%     ` Matthew John Cheetham
  2022-07-22 13:52  0%       ` Derrick Stolee
  2022-07-22 16:03  0%       ` Derrick Stolee
  0 siblings, 2 replies; 200+ results
From: Matthew John Cheetham @ 2022-07-21 12:09 UTC (permalink / raw)
  To: Derrick Stolee via GitGitGadget
  Cc: gitster, me, newren, avarab, dyroneteng, Johannes.Schindelin,
	Derrick Stolee, git

I had a few questions and suggestions; below.

On 2022-06-29 21:40, Derrick Stolee via GitGitGadget wrote:> +Assuming a 
`200 OK` response from the server, the content at the URL is
> +inspected. First, Git attempts to parse the file as a bundle file of
> +version 2 or higher. If the file is not a bundle, then the file is parsed
> +as a plain-text file using Git's config parser. The key-value pairs in
> +that config file are expected to describe a list of bundle URIs. If
> +neither of these parse attempts succeed, then Git will report an error to
> +the user that the bundle URI provided erroneous data.
> +
> +Any other data provided by the server is considered erroneous.

I wonder if it may be worth considering adding an optional server 
requirement ("MAY" not "MUST") to provide a `Content-Type` header 
indicating if the response is a bundle list (or bundle) to skip straight 
to parsing the correct type of file? Eg "application/x-git-bundle-list"?

Even the simplest of content servers should be able to set Content-Type. 
If not falling back to 'try parse bundle else try parse bundle list' is 
still OK.

> +bundle.mode::
> +	(Required) This value has one of two values: `all` and `any`. When `all`
> +	is specified, then the client should expect to need all of the listed
> +	bundle URIs that match their repository's requirements. When `any` is
> +	specified, then the client should expect that any one of the bundle URIs
> +	that match their repository's requirements will suffice. Typically, the
> +	`any` option is used to list a number of different bundle servers
> +	located in different geographies.

Do you forsee any future where we'd want or need to specify 'sets' of 
bundles where "all" _of_ "any" particular set would be required?
Eg. there are 3 sets of bundles (A, B, C), and the client would need to 
download all bundles belonging to any of A, B, or C? Where ABC would be 
different geo-distributed sets?

I guess what I'm getting at here is with this design (which I appreciate 
is intentionally flexible), there are several different ways a server 
could direct a client to bundles stored in a nearby geography:

1. Serve an "all" bundle list with geo-located bundle URIs?
2. Serve a global "any" bundle list with each single bundle in a 
different geography (specified by `location`)
3. Serve a single bundle (not a list) with a different

Are any of these going to be preferred over another for potential client 
optimisations?

> +
> +bundle.heuristic::
> +	If this string-valued key exists, then the bundle list is designed to
> +	work well with incremental `git fetch` commands. The heuristic signals
> +	that there are additional keys available for each bundle that help
> +	determine which subset of bundles the client should download.
> +
> +The remaining keys include an `<id>` segment which is a server-designated
> +name for each available bundle.

Case-sensitive ID? A-Za-z0-9 only? "Same as Git config rules"?

> +bundle.<id>.location::
> +	This string value advertises a real-world location from where the bundle
> +	URI is served. This can be used to present the user with an option for
> +	which bundle URI to use or simply as an informative indicator of which
> +	bundle URI was selected by Git. This is only valuable when
> +	`bundle.mode` is `any`.

I assume `location` is just an opaque string that is just used for info 
or display purposes? Does it make sense for other 'display' type strings 
like 'name' or 'message'?

> +Here is an example bundle list using the Git config format:
> +
> +```
> +[bundle]
> +	version = 1
> +	mode = all
> +	heuristic = creationToken
> +
> +[bundle "2022-02-09-1644442601-daily"]
> +	uri = https://bundles.example.com/git/git/2022-02-09-1644442601-daily.bundle
> +	timestamp = 1644442601
> +
> +[bundle "2022-02-02-1643842562"]
> +	uri = https://bundles.example.com/git/git/2022-02-02-1643842562.bundle
> +	timestamp = 1643842562
> +
> +[bundle "2022-02-09-1644442631-daily-blobless"]
> +	uri = 2022-02-09-1644442631-daily-blobless.bundle
> +	timestamp = 1644442631
> +	filter = blob:none
> +
> +[bundle "2022-02-02-1643842568-blobless"]
> +	uri = /git/git/2022-02-02-1643842568-blobless.bundle
> +	timestamp = 1643842568
> +	filter = blob:none
> +```

Do you mean to use `creationToken` in these examples rather than 
`timestamp`?

> +Advertising Bundle URIs
> +-----------------------
> +
...
> +The client could choose an arbitrary bundle URI as an option _or_ select
> +the URI with best performance by some exploratory checks. It is up to the
> +bundle provider to decide if having multiple URIs is preferable to a
> +single URI that is geodistributed through server-side infrastructure.

Would it make sense for the client to pick the first bundle URI rather 
than an arbitrary one? The server could use information about the 
request (origin IP/geography) to provide a sorted list of URIs by 
physical distance to the client.

I guess if arbitrary is 'random' then this provides some client-side 
load balancing over multiple potential servers too. Interested in your 
thoughts behind what would be 'best practice' for a bundle server here.

> +If the bundle provider does not provide a heuristic, then the client
> +should attempt to inspect the bundle headers before downloading the full
> +bundle data in case the bundle tips already exist in the client
> +repository.

Would this default behaviour also be considered another explicit 
heurisitic option? For example: `bundle.heuristic=default` or `inspect`.
Is it ever likely that the default behaviour would change?

> +* The client receives a response other than `200 OK` (such as `404 Not Found`,
> +  `401 Not Authorized`, or `500 Internal Server Error`). The client should
> +  use the `credential.helper` to attempt authentication after the first
> +  `401 Not Authorized` response, but a second such response is a failure.

I'd probably say a 500 is not solvable with a different set of 
credentials, but potentially a retry or just `die`. Do we attempt to 
`credential_fill()` with anything other than a 401 (or maybe 403 or 404) 
elsewhere in Git?

> +* A bundle download during a `git fetch` contains objects already in the
> +  object database. This is probably unavoidable if we are using bundles
> +  for fetches, since the client will almost always be slightly ahead of
> +  the bundle servers after performing its "catch-up" fetch to the remote
> +  server. This extra work is most wasteful when the client is fetching
> +  much more frequently than the server is computing bundles, such as if
> +  the client is using hourly prefetches with background maintenance, but
> +  the server is computing bundles weekly. For this reason, the client
> +  should not use bundle URIs for fetch unless the server has explicitly
> +  recommended it through the `bundle.flags = forFetch` value.

`bundle.flags` is not mentioned elsewhere in this document. Might be 
worth including this, and possible values, with the other key 
definitions above.


> +Implementation Plan
> +-------------------
> +
> +This design document is being submitted on its own as an aspirational
> +document, with the goal of implementing all of the mentioned client
> +features over the course of several patch series. Here is a potential
> +outline for submitting these features:
> +
> +1. Integrate bundle URIs into `git clone` with a `--bundle-uri` option.
> +   This will include a new `git fetch --bundle-uri` mode for use as the
> +   implementation underneath `git clone`. The initial version here will
> +   expect a single bundle at the given URI.
> +
> +2. Implement the ability to parse a bundle list from a bundle URI and
> +   update the `git fetch --bundle-uri` logic to properly distinguish
> +   between `bundle.mode` options. Specifically design the feature so
> +   that the config format parsing feeds a list of key-value pairs into the
> +   bundle list logic.
> +
> +3. Create the `bundle-uri` protocol v2 verb so Git servers can advertise
> +   bundle URIs using the key-value pairs. Plug into the existing key-value
> +   input to the bundle list logic. Allow `git clone` to discover these
> +   bundle URIs and bootstrap the client repository from the bundle data.
> +   (This choice is an opt-in via a config option and a command-line
> +   option.)
> +
> +4. Allow the client to understand the `bundle.flag=forFetch` configuration
> +   and the `bundle.<id>.creationToken` heuristic. When `git clone`
> +   discovers a bundle URI with `bundle.flag=forFetch`, it configures the
> +   client repository to check that bundle URI during later `git fetch <remote>`
> +   commands.
> +
> +5. Allow clients to discover bundle URIs during `git fetch` and configure
> +   a bundle URI for later fetches if `bundle.flag=forFetch`.
> +
> +6. Implement the "inspect headers" heuristic to reduce data downloads when
> +   the `bundle.<id>.creationToken` heuristic is not available.
> +
> +As these features are reviewed, this plan might be updated. We also expect
> +that new designs will be discovered and implemented as this feature
> +matures and becomes used in real-world scenarios.

This plan seems logical to me at least! :-)

--
Thanks,
Matthew

^ permalink raw reply	[relevance 3%]

* [PATCH v2 3/3] apply: support case-only renames in case-insensitive filesystems
  2022-06-19 16:10  6% ` [PATCH v2 0/3] RFC: " Tao Klerks via GitGitGadget
  2022-06-19 16:10  5%   ` [PATCH v2 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
@ 2022-06-19 16:10 11%   ` Tao Klerks via GitGitGadget
  2022-10-10  4:09  0%   ` [PATCH v2 0/3] RFC: " Tao Klerks
  2023-05-28  9:59  4%   ` [PATCH v3 0/3] " Tao Klerks via GitGitGadget
  3 siblings, 0 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2022-06-19 16:10 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Junio C Hamano, Tao Klerks, Tao Klerks

From: Tao Klerks <tao@klerks.biz>

"git apply" checks, when validating a patch, to ensure that any files
being added aren't already in the worktree.

When this check runs on a case-only rename, in a case-insensitive
filesystem, this leads to a false positive - the command fails with an
error like:
error: File1: already exists in working directory

There is a mechanism to ensure that "seemingly conflicting" files are
handled correctly - for example overlapping rename pairs or swaps -
this mechanism treats renames as add/remove pairs, and would end up
treating a case-only rename as a "self-swap"... Except it does not
account for case-insensitive filesystems yet.

Because the index is inherently case-sensitive even on a
case-insensitive filesystem, we actually need this mechanism to be
handle both requirements, lest we fail to account for conflicting
files only in the index.

Fix the "rename chain" existence exemption mechanism to account for
case-insensitive config, fixing case-only-rename-handling as a
"self-swap" and also fixing less-common "case-insensitive rename
pairs" when config core.ignorecase is set, but keep the index checks
file-sensitive.

Also add test cases around these behaviors - verifying that conflicting
file conditions are still caught correctly, including case-only
conflicts on case-sensitive filesystems, and edge cases around
case-sensitive index behaviors on a case-insensitive filesystem.

Signed-off-by: Tao Klerks <tao@klerks.biz>
---
 apply.c                |  81 ++++++++++++++++------
 apply.h                |   5 +-
 t/t4141-apply-icase.sh | 154 +++++++++++++++++++++++++++++++++++++----
 3 files changed, 207 insertions(+), 33 deletions(-)

diff --git a/apply.c b/apply.c
index 2b7cd930efa..2bd59b63edd 100644
--- a/apply.c
+++ b/apply.c
@@ -101,7 +101,9 @@ int init_apply_state(struct apply_state *state,
 	state->ws_error_action = warn_on_ws_error;
 	state->ws_ignore_action = ignore_ws_none;
 	state->linenr = 1;
-	string_list_init_nodup(&state->fn_table);
+	string_list_init_nodup(&state->fs_fn_table);
+	state->fs_fn_table.cmp = fspathcmp;
+	string_list_init_nodup(&state->index_fn_table);
 	string_list_init_nodup(&state->limit_by_name);
 	strset_init(&state->removed_symlinks);
 	strset_init(&state->kept_symlinks);
@@ -122,7 +124,10 @@ void clear_apply_state(struct apply_state *state)
 	strset_clear(&state->kept_symlinks);
 	strbuf_release(&state->root);
 
-	/* &state->fn_table is cleared at the end of apply_patch() */
+	/*
+	 * &state->fs_fn_table and &state->index_fn_table are cleared at the
+	 * end of apply_patch()
+	 */
 }
 
 static void mute_routine(const char *msg, va_list params)
@@ -3270,14 +3275,28 @@ static int read_file_or_gitlink(const struct cache_entry *ce, struct strbuf *buf
 	return read_blob_object(buf, &ce->oid, ce->ce_mode);
 }
 
-static struct patch *in_fn_table(struct apply_state *state, const char *name)
+static struct patch *in_fs_fn_table(struct apply_state *state, const char *name)
 {
 	struct string_list_item *item;
 
 	if (!name)
 		return NULL;
 
-	item = string_list_lookup(&state->fn_table, name);
+	item = string_list_lookup(&state->fs_fn_table, name);
+	if (item)
+		return (struct patch *)item->util;
+
+	return NULL;
+}
+
+static struct patch *in_index_fn_table(struct apply_state *state, const char *name)
+{
+	struct string_list_item *item;
+
+	if (!name)
+		return NULL;
+
+	item = string_list_lookup(&state->index_fn_table, name);
 	if (item)
 		return (struct patch *)item->util;
 
@@ -3309,7 +3328,7 @@ static int was_deleted(struct patch *patch)
 	return patch == PATH_WAS_DELETED;
 }
 
-static void add_to_fn_table(struct apply_state *state, struct patch *patch)
+static void add_to_fn_tables(struct apply_state *state, struct patch *patch)
 {
 	struct string_list_item *item;
 
@@ -3319,7 +3338,9 @@ static void add_to_fn_table(struct apply_state *state, struct patch *patch)
 	 * file creations and copies
 	 */
 	if (patch->new_name) {
-		item = string_list_insert(&state->fn_table, patch->new_name);
+		item = string_list_insert(&state->fs_fn_table, patch->new_name);
+		item->util = patch;
+		item = string_list_insert(&state->index_fn_table, patch->new_name);
 		item->util = patch;
 	}
 
@@ -3328,7 +3349,9 @@ static void add_to_fn_table(struct apply_state *state, struct patch *patch)
 	 * later chunks shouldn't patch old names
 	 */
 	if ((patch->new_name == NULL) || (patch->is_rename)) {
-		item = string_list_insert(&state->fn_table, patch->old_name);
+		item = string_list_insert(&state->fs_fn_table, patch->old_name);
+		item->util = PATH_WAS_DELETED;
+		item = string_list_insert(&state->index_fn_table, patch->old_name);
 		item->util = PATH_WAS_DELETED;
 	}
 }
@@ -3341,7 +3364,9 @@ static void prepare_fn_table(struct apply_state *state, struct patch *patch)
 	while (patch) {
 		if ((patch->new_name == NULL) || (patch->is_rename)) {
 			struct string_list_item *item;
-			item = string_list_insert(&state->fn_table, patch->old_name);
+			item = string_list_insert(&state->fs_fn_table, patch->old_name);
+			item->util = PATH_TO_BE_DELETED;
+			item = string_list_insert(&state->index_fn_table, patch->old_name);
 			item->util = PATH_TO_BE_DELETED;
 		}
 		patch = patch->next;
@@ -3371,7 +3396,7 @@ static struct patch *previous_patch(struct apply_state *state,
 	if (patch->is_copy || patch->is_rename)
 		return NULL; /* "git" patches do not depend on the order */
 
-	previous = in_fn_table(state, patch->old_name);
+	previous = in_index_fn_table(state, patch->old_name);
 	if (!previous)
 		return NULL;
 
@@ -3681,7 +3706,7 @@ static int apply_data(struct apply_state *state, struct patch *patch,
 	}
 	patch->result = image.buf;
 	patch->resultsize = image.len;
-	add_to_fn_table(state, patch);
+	add_to_fn_tables(state, patch);
 	free(image.line_allocated);
 
 	if (0 < patch->is_delete && patch->resultsize)
@@ -3780,11 +3805,12 @@ static int check_preimage(struct apply_state *state,
 
 static int check_to_create(struct apply_state *state,
 			   const char *new_name,
-			   int ok_if_exists)
+			   int ok_if_exists_in_fs,
+			   int ok_if_exists_in_index)
 {
 	struct stat nst;
 
-	if (state->check_index && (!ok_if_exists || !state->cached)) {
+	if (state->check_index && (!ok_if_exists_in_index || !state->cached)) {
 		int pos;
 
 		pos = index_name_pos(state->repo->index, new_name, strlen(new_name));
@@ -3792,7 +3818,7 @@ static int check_to_create(struct apply_state *state,
 			struct cache_entry *ce = state->repo->index->cache[pos];
 
 			/* allow ITA, as they do not yet exist in the index */
-			if (!ok_if_exists && !(ce->ce_flags & CE_INTENT_TO_ADD))
+			if (!ok_if_exists_in_index && !(ce->ce_flags & CE_INTENT_TO_ADD))
 				return EXISTS_IN_INDEX;
 
 			/* ITA entries can never match working tree files */
@@ -3805,7 +3831,7 @@ static int check_to_create(struct apply_state *state,
 		return 0;
 
 	if (!lstat(new_name, &nst)) {
-		if (S_ISDIR(nst.st_mode) || ok_if_exists)
+		if (S_ISDIR(nst.st_mode) || ok_if_exists_in_fs)
 			return 0;
 		/*
 		 * A leading component of new_name might be a symlink
@@ -3915,7 +3941,8 @@ static int check_patch(struct apply_state *state, struct patch *patch)
 	const char *name = old_name ? old_name : new_name;
 	struct cache_entry *ce = NULL;
 	struct patch *tpatch;
-	int ok_if_exists;
+	int ok_if_exists_in_fs;
+	int ok_if_exists_in_index;
 	int status;
 
 	patch->rejected = 1; /* we will drop this after we succeed */
@@ -3938,16 +3965,29 @@ static int check_patch(struct apply_state *state, struct patch *patch)
 	 * B; ask to_be_deleted() about the later rename.  Removal of
 	 * B and rename from A to B is handled the same way by asking
 	 * was_deleted().
+	 *
+	 * These exemptions account for the core.ignorecase config -
+	 * a file that differs only by case is also considered "deleted"
+	 * if git is configured to ignore case. This means a case-only
+	 * rename, in a case-insensitive filesystem, is treated here as
+	 * a "self-swap" or mode change.
 	 */
-	if ((tpatch = in_fn_table(state, new_name)) &&
+	if ((tpatch = in_fs_fn_table(state, new_name)) &&
+	    (was_deleted(tpatch) || to_be_deleted(tpatch)))
+		ok_if_exists_in_fs = 1;
+	else
+		ok_if_exists_in_fs = 0;
+
+	if ((tpatch = in_index_fn_table(state, new_name)) &&
 	    (was_deleted(tpatch) || to_be_deleted(tpatch)))
-		ok_if_exists = 1;
+		ok_if_exists_in_index = 1;
 	else
-		ok_if_exists = 0;
+		ok_if_exists_in_index = 0;
 
 	if (new_name &&
 	    ((0 < patch->is_new) || patch->is_rename || patch->is_copy)) {
-		int err = check_to_create(state, new_name, ok_if_exists);
+		int err = check_to_create(state, new_name, ok_if_exists_in_fs,
+					  ok_if_exists_in_index);
 
 		if (err && state->threeway) {
 			patch->direct_to_threeway = 1;
@@ -4808,7 +4848,8 @@ static int apply_patch(struct apply_state *state,
 end:
 	free_patch_list(list);
 	strbuf_release(&buf);
-	string_list_clear(&state->fn_table, 0);
+	string_list_clear(&state->fs_fn_table, 0);
+	string_list_clear(&state->index_fn_table, 0);
 	return res;
 }
 
diff --git a/apply.h b/apply.h
index b9f18ce87d1..b520ce8c40a 100644
--- a/apply.h
+++ b/apply.h
@@ -95,8 +95,11 @@ struct apply_state {
 	/*
 	 * Records filenames that have been touched, in order to handle
 	 * the case where more than one patches touch the same file.
+	 * Two separate structures because with ignorecase, one of them
+	 * needs to be case-insensitive and the other not.
 	 */
-	struct string_list fn_table;
+	struct string_list fs_fn_table;
+	struct string_list index_fn_table;
 
 	/*
 	 * This is to save reporting routines before using
diff --git a/t/t4141-apply-icase.sh b/t/t4141-apply-icase.sh
index 17eb023a437..1c785133d16 100755
--- a/t/t4141-apply-icase.sh
+++ b/t/t4141-apply-icase.sh
@@ -30,7 +30,16 @@ test_expect_success setup '
        git diff HEAD HEAD^ -- file1 >deletion-patch &&
        git diff --cached HEAD -- file1 file2 >rename-file1-to-file2-patch &&
        git diff --cached HEAD -- file1 File1 >rename-file1-to-File1-patch &&
-       git diff --cached HEAD -- file0 >modify-file0-patch
+       git diff --cached HEAD -- file0 >modify-file0-patch &&
+
+       # then set up for swap
+       git reset --hard current &&
+       test_commit "swappable" file3 "different content for file3" swappable &&
+       file3blob=$(git rev-parse :file3) &&
+       git rm --cached file1 file3 &&
+       git update-index --add --cacheinfo 100644,$file1blob,File3 &&
+       git update-index --add --cacheinfo 100644,$file3blob,File1 &&
+       git diff --cached HEAD -- file1 file3 File1 File3 >swap-file1-and-file3-to-File3-and-File1-patch
 '
 
 # Basic creation, deletion, modification and renaming.
@@ -53,7 +62,7 @@ test_expect_success 'creation and deletion' '
        test_must_fail git rev-parse --verify :file1
 '
 
-test_expect_success 'modificaiton' '
+test_expect_success 'modification (index-only)' '
        # start at "initial" with file0 only
        git reset --hard initial &&
 
@@ -70,7 +79,7 @@ test_expect_success 'modificaiton' '
        test_cmp_rev :file0 "$file0blob"
 '
 
-test_expect_success 'rename file1 to file2' '
+test_expect_success 'rename file1 to file2 (index-only)' '
        # start from file0 and file1
        git reset --hard current &&
 
@@ -91,7 +100,7 @@ test_expect_success 'rename file1 to file2' '
        test_cmp_rev :file1 "$file1blob"
 '
 
-test_expect_success 'rename file1 to file2' '
+test_expect_success 'rename file1 to File1 (index-only)' '
        # start from file0 and file1
        git reset --hard current &&
 
@@ -112,17 +121,138 @@ test_expect_success 'rename file1 to file2' '
        test_cmp_rev :file1 "$file1blob"
 '
 
-# We may want to add tests with working tree here, without "--cached" and
-# with and without "--index" here.  For example, should modify-file0-patch
-# apply cleanly if we have File0 with $file0blob in the index and the working
-# tree if core.icase is set?
+# involve filesystem on renames
+test_expect_success 'rename file1 to File1 (with ignorecase, working tree)' '
+       # start from file0 and file1
+       git reset --hard current &&
+
+       # do the same with ignorecase
+       git -c core.ignorecase=true apply --index rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_cmp_rev :File1 "$file1blob" &&
+       git -c core.ignorecase=true apply --index -R rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :File1 &&
+       test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success CASE_INSENSITIVE_FS 'rename file1 to File1 (without ignorecase, case-insensitive FS)' '
+       # start from file0 and file1
+       git reset --hard current &&
+
+       # rename file1 to File1 without ignorecase (fails as expected)
+       test_must_fail git -c core.ignorecase=false apply --index rename-file1-to-File1-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success !CASE_INSENSITIVE_FS 'rename file1 to File1 (without ignorecase, case-sensitive FS)' '
+       # start from file0 and file1
+       git reset --hard current &&
+
+       # rename file1 to File1 without ignorecase
+       git -c core.ignorecase=false apply --index rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_cmp_rev :File1 "$file1blob" &&
+       git -c core.ignorecase=false apply --index -R rename-file1-to-File1-patch &&
+       test_must_fail git rev-parse --verify :File1 &&
+       test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success 'rename file1 to file2 with working tree conflict' '
+       # start from file0 and file1, and file2 untracked
+       git reset --hard current &&
+       test_when_finished "rm file2" &&
+       touch file2 &&
+
+       # rename file1 to file2 with conflict
+       test_must_fail git -c core.ignorecase=false apply --index rename-file1-to-file2-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
 
-test_expect_success CASE_INSENSITIVE_FS 'a test only for icase fs' '
-       : sample
+       # do the same with ignorecase
+       test_must_fail git -c core.ignorecase=true apply --index rename-file1-to-file2-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob"
 '
 
-test_expect_success !CASE_INSENSITIVE_FS 'a test only for !icase fs' '
-       : sample
+test_expect_success 'rename file1 to file2 with case-insensitive conflict (index-only - ignorecase disabled)' '
+       # start from file0 and file1, and File2 in index
+       git reset --hard current &&
+       git update-index --add --cacheinfo 100644,$file3blob,File2 &&
+
+       # rename file1 to file2 without ignorecase
+       git -c core.ignorecase=false apply --cached rename-file1-to-file2-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_cmp_rev :file2 "$file1blob" &&
+       git -c core.ignorecase=false apply --cached -R rename-file1-to-file2-patch &&
+       test_must_fail git rev-parse --verify :file2 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File2 "$file3blob"
+'
+
+test_expect_failure 'rename file1 to file2 with case-insensitive conflict (index-only - ignorecase enabled)' '
+       # start from file0 and file1, and File2 in index
+       git reset --hard current &&
+       git update-index --add --cacheinfo 100644,$file3blob,File2 &&
+
+       # rename file1 to file2 with ignorecase, with a "File2" conflicting file in place - expect failure.
+       # instead of failure, we get success with "File1" and "file1" both existing in the index, despite
+       # the ignorecase configuration.
+       test_must_fail git -c core.ignorecase=true apply --cached rename-file1-to-file2-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File2 "$file3blob"
+'
+
+test_expect_success 'rename file1 to File1 with case-sensitive conflict (index-only)' '
+       # start from file0 and file1, and File1 in index
+       git reset --hard current &&
+       git update-index --add --cacheinfo 100644,$file3blob,File1 &&
+
+       # On a case-insensitive filesystem with core.ignorecase on, a single git
+       # "reset --hard" will actually leave things wrong because of the
+       # index-to-working-tree discrepancy - see "reset --hard handles
+       # index-only case-insensitive duplicate" under t7104-reset-hard.sh.
+       # We are creating this unexpected state, so we should explicitly queue
+       # an extra reset. If reset ever starts to handle this case, this will
+       # become unnecessary but also not harmful.
+       test_when_finished "git reset --hard" &&
+
+       # rename file1 to File1 when File1 is already in index (fails with conflict)
+       test_must_fail git -c core.ignorecase=false apply --cached rename-file1-to-File1-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File1 "$file3blob" &&
+
+       # do the same with ignorecase
+       test_must_fail git -c core.ignorecase=true apply --cached rename-file1-to-File1-patch &&
+       git rev-parse --verify :file1 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :File1 "$file3blob"
+'
+
+test_expect_success CASE_INSENSITIVE_FS 'case-insensitive swap - file1 to File2 and file2 to File1 (working tree)' '
+       # start from file0, file1, and file3
+       git reset --hard swappable &&
+
+       # "swap" file1 and file3 to case-insensitive versions without ignorecase on case-insensitive FS (fails as expected)
+       test_must_fail git -c core.ignorecase=false apply --index swap-file1-and-file3-to-File3-and-File1-patch &&
+       git rev-parse --verify :file1 &&
+       git rev-parse --verify :file3 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :file3 "$file3blob" &&
+
+       # do the same with ignorecase
+       git -c core.ignorecase=true apply --index swap-file1-and-file3-to-File3-and-File1-patch &&
+       test_must_fail git rev-parse --verify :file1 &&
+       test_must_fail git rev-parse --verify :file3 &&
+       test_cmp_rev :File3 "$file1blob" &&
+       test_cmp_rev :File1 "$file3blob" &&
+       git -c core.ignorecase=true apply --index -R swap-file1-and-file3-to-File3-and-File1-patch &&
+       test_must_fail git rev-parse --verify :File1 &&
+       test_must_fail git rev-parse --verify :File3 &&
+       test_cmp_rev :file1 "$file1blob" &&
+       test_cmp_rev :file3 "$file3blob"
 '
 
 test_done
-- 
gitgitgadget

^ permalink raw reply related	[relevance 11%]

* [PATCH v2 0/3] RFC: apply: support case-only renames in case-insensitive filesystems
  2022-06-11 17:03 13% [PATCH] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
    2022-06-12 23:30  6% ` Junio C Hamano
@ 2022-06-19 16:10  6% ` Tao Klerks via GitGitGadget
  2022-06-19 16:10  5%   ` [PATCH v2 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
                     ` (3 more replies)
  2 siblings, 4 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2022-06-19 16:10 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Junio C Hamano, Tao Klerks

As suggested recently in thread
CAPMMpojwV+f=z9sgc_GaUOTFBCUVdbrGW8WjatWWmC3WTcsoXw@mail.gmail.com,
proposing a fix to git-apply for case-only renames on case-insensitive
filesystems.

Changes in V2:

 * Prepended a commit from Junio, with new apply tests to build on
 * Added a largely-unrelated new known failing test, concerning reset --hard
   in the presence of index case conflicts on a case-insensitive filesystem,
   which we later need to work around in a corner-case test
 * Moved test cases to build on Junio's new test file
 * Switched fix approach from "allow same-name commit explicitly" to "track
   files marked for deletion case-insensitively for filesystem checks",
   which addresses the issue noted and other more obscure ones like "rename
   swap with case change"
 * Added a test case for "rename swap with case change"
 * Added test cases setting "core.ignorecase" on and off explicitly
 * Added a test case exposing one remaining surprising behavior

POSSIBLE CONCERN:

This fix was originally much simpler - it just made the "fn_table" string
list use a case-insensitive string comparison - using case-insensitive
comparisons when dealing with all replacement checks, both on the index and
on the filesystem.

However, with that simple implementation, there was at least one edge-case
where data loss could result: If the index contained two files differing
only by case, with different content, and we were doing a case-only rename,
a swap, or some other operation involving the deletion and creation of a
file with that name (ignoring case), then both of the files with that name
in the index would be overwritten - even though only one of them had the
expected content, and even though the one deleted might never have been
committed.

It seems as though the core.ignorecase option should typically only apply to
filesystem checks - that the index is always case-sensitive.

The current fix proposal therefore splits the string list used for "can I
create a file that already exists?" checks into two such structures - one
string list used for filesystem checks, which is case-insensitive when
specified by core.ignorecase, and one used for index checks, which is always
case-sensitive.

The resulting duplication is not appealing, but I'm not sure how to address
it / how to do this more elegantly. I'm also still not completely certain
that my rule of thumb about the index always being case-sensitive is the
right way of thinking of things.

Junio C Hamano (1):
  t4141: test "git apply" with core.ignorecase

Tao Klerks (2):
  reset: new failing test for reset of case-insensitive duplicate in
    index
  apply: support case-only renames in case-insensitive filesystems

 apply.c                |  81 +++++++++----
 apply.h                |   5 +-
 t/t4141-apply-icase.sh | 258 +++++++++++++++++++++++++++++++++++++++++
 t/t7104-reset-hard.sh  |  11 ++
 4 files changed, 334 insertions(+), 21 deletions(-)
 create mode 100755 t/t4141-apply-icase.sh


base-commit: 1e59178e3f65880188caedb965e70db5ceeb2d64
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1257%2FTaoK%2Ftao-apply-case-insensitive-renames-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1257/TaoK/tao-apply-case-insensitive-renames-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1257

Range-diff vs v1:

 1:  b8bd612aa1e ! 1:  efd3bd4cdda apply: support case-only renames in case-insensitive filesystems
     @@
       ## Metadata ##
     -Author: Tao Klerks <tao@klerks.biz>
     +Author: Junio C Hamano <gitster@pobox.com>
      
       ## Commit message ##
     -    apply: support case-only renames in case-insensitive filesystems
     +    t4141: test "git apply" with core.ignorecase
      
     -    "git apply" checks, when validating a patch, to ensure that any files
     -    being added aren't already in the worktree.
     +    Signed-off-by: Junio C Hamano <gitster@pobox.com>
      
     -    When this check runs on a case-only rename, in a case-insensitive
     -    filesystem, this leads to a false positive - the command fails with an
     -    error like:
     -    error: File1: already exists in working directory
     -
     -    Fix this existence check to allow the file to exist, for a case-only
     -    rename when config core.ignorecase is set.
     -
     -    Also add a test for this case, while verifying that conflicting file
     -    conditions are still caught correctly, including case-only conflicts on
     -    case-sensitive filesystems.
     -
     -    Signed-off-by: Tao Klerks <tao@klerks.biz>
     -
     - ## apply.c ##
     -@@ apply.c: static int check_patch(struct apply_state *state, struct patch *patch)
     - 	if ((tpatch = in_fn_table(state, new_name)) &&
     - 	    (was_deleted(tpatch) || to_be_deleted(tpatch)))
     - 		ok_if_exists = 1;
     -+	else if (ignore_case && !strcasecmp(old_name, new_name))
     -+		ok_if_exists = 1;
     - 	else
     - 		ok_if_exists = 0;
     - 
     -
     - ## t/t4141-apply-case-insensitive-rename.sh (new) ##
     + ## t/t4141-apply-icase.sh (new) ##
      @@
      +#!/bin/sh
      +
     -+test_description='git apply should handle case-only renames on case-insensitive filesystems'
     ++test_description='git apply with core.ignorecase'
      +
     -+TEST_PASSES_SANITIZE_LEAK=true
      +. ./test-lib.sh
      +
     -+# Please note, this test assumes that core.ignorecase is set appropriately for the filesystem,
     -+# as tested in t0050. Case-only rename conflicts are only tested in case-sensitive filesystems.
     ++test_expect_success setup '
     ++       # initial commit has file0 only
     ++       test_commit "initial" file0 "initial commit with file0" initial &&
      +
     -+if ! test_have_prereq CASE_INSENSITIVE_FS
     -+then
     -+	test_set_prereq CASE_SENSITIVE_FS
     -+	echo nuts
     -+fi
     ++       # current commit has file1 as well
     ++       test_commit "current" file1 "initial content of file1" current &&
     ++       file0blob=$(git rev-parse :file0) &&
     ++       file1blob=$(git rev-parse :file1) &&
      +
     -+test_expect_success setup '
     -+	echo "This is some content in the file." > file1 &&
     -+	echo "A completely different file." > file2 &&
     -+	git update-index --add file1 &&
     -+	git update-index --add file2 &&
     -+	cat >case_only_rename_patch <<-\EOF
     -+	diff --git a/file1 b/File1
     -+	similarity index 100%
     -+	rename from file1
     -+	rename to File1
     -+	EOF
     ++       # prepare sample patches
     ++       # file0 is modified
     ++       echo modification to file0 >file0 &&
     ++       git add file0 &&
     ++       modifiedfile0blob=$(git rev-parse :file0) &&
     ++
     ++       # file1 is removed and then ...
     ++       git rm --cached file1 &&
     ++       # ... identical copies are placed at File1 and file2
     ++       git update-index --add --cacheinfo 100644,$file1blob,file2 &&
     ++       git update-index --add --cacheinfo 100644,$file1blob,File1 &&
     ++
     ++       # then various patches to do basic things
     ++       git diff HEAD^ HEAD -- file1 >creation-patch &&
     ++       git diff HEAD HEAD^ -- file1 >deletion-patch &&
     ++       git diff --cached HEAD -- file1 file2 >rename-file1-to-file2-patch &&
     ++       git diff --cached HEAD -- file1 File1 >rename-file1-to-File1-patch &&
     ++       git diff --cached HEAD -- file0 >modify-file0-patch
      +'
      +
     -+test_expect_success 'refuse to apply rename patch with conflict' '
     -+	cat >conflict_patch <<-\EOF &&
     -+	diff --git a/file1 b/file2
     -+	similarity index 100%
     -+	rename from file1
     -+	rename to file2
     -+	EOF
     -+	test_must_fail git apply --index conflict_patch
     ++# Basic creation, deletion, modification and renaming.
     ++test_expect_success 'creation and deletion' '
     ++       # start at "initial" with file0 only
     ++       git reset --hard initial &&
     ++
     ++       # add file1
     ++       git -c core.ignorecase=false apply --cached creation-patch &&
     ++       test_cmp_rev :file1 "$file1blob" &&
     ++
     ++       # remove file1
     ++       git -c core.ignorecase=false apply --cached deletion-patch &&
     ++       test_must_fail git rev-parse --verify :file1 &&
     ++
     ++       # do the same with ignorecase
     ++       git -c core.ignorecase=true apply --cached creation-patch &&
     ++       test_cmp_rev :file1 "$file1blob" &&
     ++       git -c core.ignorecase=true apply --cached deletion-patch &&
     ++       test_must_fail git rev-parse --verify :file1
      +'
      +
     -+test_expect_success CASE_SENSITIVE_FS 'refuse to apply case-only rename patch with conflict, in case-sensitive FS' '
     -+	test_when_finished "git mv File1 file2" &&
     -+	git mv file2 File1 &&
     -+	test_must_fail git apply --index case_only_rename_patch
     ++test_expect_success 'modificaiton' '
     ++       # start at "initial" with file0 only
     ++       git reset --hard initial &&
     ++
     ++       # modify file0
     ++       git -c core.ignorecase=false apply --cached modify-file0-patch &&
     ++       test_cmp_rev :file0 "$modifiedfile0blob" &&
     ++       git -c core.ignorecase=false apply --cached -R modify-file0-patch &&
     ++       test_cmp_rev :file0 "$file0blob" &&
     ++
     ++       # do the same with ignorecase
     ++       git -c core.ignorecase=true apply --cached modify-file0-patch &&
     ++       test_cmp_rev :file0 "$modifiedfile0blob" &&
     ++       git -c core.ignorecase=true apply --cached -R modify-file0-patch &&
     ++       test_cmp_rev :file0 "$file0blob"
     ++'
     ++
     ++test_expect_success 'rename file1 to file2' '
     ++       # start from file0 and file1
     ++       git reset --hard current &&
     ++
     ++       # rename file1 to file2
     ++       git -c core.ignorecase=false apply --cached rename-file1-to-file2-patch &&
     ++       test_must_fail git rev-parse --verify :file1 &&
     ++       test_cmp_rev :file2 "$file1blob" &&
     ++       git -c core.ignorecase=false apply --cached -R rename-file1-to-file2-patch &&
     ++       test_must_fail git rev-parse --verify :file2 &&
     ++       test_cmp_rev :file1 "$file1blob" &&
     ++
     ++       # do the same with ignorecase
     ++       git -c core.ignorecase=true apply --cached rename-file1-to-file2-patch &&
     ++       test_must_fail git rev-parse --verify :file1 &&
     ++       test_cmp_rev :file2 "$file1blob" &&
     ++       git -c core.ignorecase=true apply --cached -R rename-file1-to-file2-patch &&
     ++       test_must_fail git rev-parse --verify :file2 &&
     ++       test_cmp_rev :file1 "$file1blob"
     ++'
     ++
     ++test_expect_success 'rename file1 to file2' '
     ++       # start from file0 and file1
     ++       git reset --hard current &&
     ++
     ++       # rename file1 to File1
     ++       git -c core.ignorecase=false apply --cached rename-file1-to-File1-patch &&
     ++       test_must_fail git rev-parse --verify :file1 &&
     ++       test_cmp_rev :File1 "$file1blob" &&
     ++       git -c core.ignorecase=false apply --cached -R rename-file1-to-File1-patch &&
     ++       test_must_fail git rev-parse --verify :File1 &&
     ++       test_cmp_rev :file1 "$file1blob" &&
     ++
     ++       # do the same with ignorecase
     ++       git -c core.ignorecase=true apply --cached rename-file1-to-File1-patch &&
     ++       test_must_fail git rev-parse --verify :file1 &&
     ++       test_cmp_rev :File1 "$file1blob" &&
     ++       git -c core.ignorecase=true apply --cached -R rename-file1-to-File1-patch &&
     ++       test_must_fail git rev-parse --verify :File1 &&
     ++       test_cmp_rev :file1 "$file1blob"
     ++'
     ++
     ++# We may want to add tests with working tree here, without "--cached" and
     ++# with and without "--index" here.  For example, should modify-file0-patch
     ++# apply cleanly if we have File0 with $file0blob in the index and the working
     ++# tree if core.icase is set?
     ++
     ++test_expect_success CASE_INSENSITIVE_FS 'a test only for icase fs' '
     ++       : sample
      +'
      +
     -+test_expect_success 'apply case-only rename patch without conflict' '
     -+	git apply --index case_only_rename_patch
     ++test_expect_success !CASE_INSENSITIVE_FS 'a test only for !icase fs' '
     ++       : sample
      +'
      +
      +test_done
 -:  ----------- > 2:  1226fbd3caf reset: new failing test for reset of case-insensitive duplicate in index
 -:  ----------- > 3:  04d83283716 apply: support case-only renames in case-insensitive filesystems

-- 
gitgitgadget

^ permalink raw reply	[relevance 6%]

* [PATCH v2 2/3] reset: new failing test for reset of case-insensitive duplicate in index
  2022-06-19 16:10  6% ` [PATCH v2 0/3] RFC: " Tao Klerks via GitGitGadget
@ 2022-06-19 16:10  5%   ` Tao Klerks via GitGitGadget
  2022-06-19 16:10 11%   ` [PATCH v2 3/3] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2022-06-19 16:10 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Junio C Hamano, Tao Klerks, Tao Klerks

From: Tao Klerks <tao@klerks.biz>

On case-insensitive filesystems, where core.ignorecase is normally set,
the index is still case-sensitive, and surprising outcomes are possible
when the index contains states that cannot be represented on the file
system.

Add an "expect_failure" test to illustrate one such situation, where two
files differing only in case are in the index, and a "reset --hard" ends
up creating an unexpected worktree change.

Signed-off-by: Tao Klerks <tao@klerks.biz>
---
 t/t7104-reset-hard.sh | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/t/t7104-reset-hard.sh b/t/t7104-reset-hard.sh
index cf9697eba9a..55050ac831e 100755
--- a/t/t7104-reset-hard.sh
+++ b/t/t7104-reset-hard.sh
@@ -44,4 +44,15 @@ test_expect_success 'reset --hard did not corrupt index or cache-tree' '
 
 '
 
+test_expect_failure CASE_INSENSITIVE_FS 'reset --hard handles index-only case-insensitive duplicate' '
+	test_commit "initial" file1 "initial commit with file1" initial &&
+	file1blob=$(git rev-parse :file1) &&
+	git update-index --add --cacheinfo 100644,$file1blob,File1 &&
+
+	# reset --hard accidentally leaves the working tree with a deleted file.
+	git reset --hard &&
+	git status --porcelain -uno >wt_changes_remaining &&
+	test_must_be_empty wt_changes_remaining
+'
+
 test_done
-- 
gitgitgadget


^ permalink raw reply related	[relevance 5%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  2022-06-18  0:45  6%     ` Junio C Hamano
@ 2022-06-18 15:34  0%       ` Tao Klerks
  0 siblings, 0 replies; 200+ results
From: Tao Klerks @ 2022-06-18 15:34 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Tao Klerks via GitGitGadget, git

On Sat, Jun 18, 2022 at 2:45 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> Tao Klerks <tao@klerks.biz> writes:
>
> >  I assumed that
> > both case-sensitive and case-insensitive code paths would be tested by
> > the complete CI suite.
>
>
> When the system I am primary owrking on is case sensitive, it is
> always nice to be able to discover that I broke something on case
> INsensitive system before I conclude my WIP into a commit and throw
> it at CI.  We may have to case-insensitively treat the paths in the
> index in order to match what the working tree would do to make "git
> checkout -- <path>" work case-insentively, and doing in-index-only
> mode of operation with core.ignorecase=yes on case-sensitive system
> may be a way to "emulate" some of the requirement case-insentive
> systems have with these "-c core.ignorecase" trick, but of course
> not all scenarios can be tested without being on case-insensitive
> systems.
>
> So we need both, I think.
>

Understood, makes sense, thank you.

I made some changes that seem to resolve the regression that I had
previously noted, but I'm not sure the approach makes sense, it feels
like there must be a better way. I will submit an RFC series at this
point I think.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  2022-06-14  5:13  6%   ` Tao Klerks
@ 2022-06-18  0:45  6%     ` Junio C Hamano
  2022-06-18 15:34  0%       ` Tao Klerks
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2022-06-18  0:45 UTC (permalink / raw)
  To: Tao Klerks; +Cc: Tao Klerks via GitGitGadget, git

Tao Klerks <tao@klerks.biz> writes:

>> We need a new test or two to see if a straight creation or deletion
>> patch does work correctly with icase set, before we even dream of
>> handling rename patches.  Not having tests for such basic cases is
>> quite surprising, but apparently the above line passed the CI.
>
> This is where I made some very bad assumptions: I only manually ran
> the new "t4141-apply-case-insensitive-rename.sh" test, and assumed
> that the test suite ran against linux, windows, and OSX, with the
> latter two running on case-insensitive filesystems. I assumed that
> both case-sensitive and case-insensitive code paths would be tested by
> the complete CI suite.

Apparently we were surprised the same way ;-)

> *Do* we expect to run the full test suite on case-insensitive systems
> in gitlab, or do we expect to need to add explicit "-C
> core.ignorecase" tests as you have done here?

Running all tests on case-insensitive systems and expect them to
pass is reasonable; we need to sprinkle !CASE_INSENSITIVE_FS
prerequiste to skip certain tests that exercise functionalities that
case insensitive filesystem will never be able to support (e.g. you
cannot by their design have file1.txt and File1.txt at the same time
on the filesystem, so any test with "test_cmp file1.txt FIle1.txt"
must be marked with !CASE_INSENSITIVE_FS prerequisite).

When the system I am primary owrking on is case sensitive, it is
always nice to be able to discover that I broke something on case
INsensitive system before I conclude my WIP into a commit and throw
it at CI.  We may have to case-insensitively treat the paths in the
index in order to match what the working tree would do to make "git
checkout -- <path>" work case-insentively, and doing in-index-only
mode of operation with core.ignorecase=yes on case-sensitive system
may be a way to "emulate" some of the requirement case-insentive
systems have with these "-c core.ignorecase" trick, but of course
not all scenarios can be tested without being on case-insensitive
systems.

So we need both, I think.


^ permalink raw reply	[relevance 6%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  2022-06-13 18:12  0%   ` Junio C Hamano
@ 2022-06-14  6:26  0%     ` Tao Klerks
  0 siblings, 0 replies; 200+ results
From: Tao Klerks @ 2022-06-14  6:26 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Tao Klerks via GitGitGadget, git

On Mon, Jun 13, 2022 at 8:12 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Junio C Hamano <gitster@pobox.com> writes:
>
> > And then, you could use --cached (not --index) to bypass the working
> > tree altogether, which is a good way to test the feature without
> > getting affected by the underlying filesystem.  Check both case
> > sensitive and case insensitive cases:
> > ...
> > Likewise, try both sensitive and insensitive one.
>
> As I already wrote tests for basic cases, I'm sending them out,
>
> so that you may extend them with your new cases so that new code you
> write can be checked.
>

Thanks! I'm not sure how to handle this procedurally, especially as
I'm using GitGitGadget, so my patches must always be anchored on a
commit found in the public mirror.

For now I'll add this as a new first commit in my patch, which becomes
my patch series I guess (but keeping your commit metadata
as-specified). Please let me know if there's a better way.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  @ 2022-06-14  6:22  5%     ` Tao Klerks
  0 siblings, 0 replies; 200+ results
From: Tao Klerks @ 2022-06-14  6:22 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Tao Klerks via GitGitGadget, git

On Mon, Jun 13, 2022 at 1:35 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> Junio C Hamano <gitster@pobox.com> writes:
>
> > ...  I
> > do not think in_fn_table() pays attention to "ignore_case" option,
> > so there may be an existing bug there already, regardless of the
> > problem you are trying to address with your patch.
> >
> > And I wonder if doing case-insensitive match in in_fn_table() lets
> > us cover this new case as well as "fixing" the existing issue.
>
> While I still think in_fn_table() should be looked into for an
> existing case sensitivity bug, I think this one is different enough
> that in_fn_table() logic wouild not trigger for it, and a patch to
> add an extra piece of logic for renames is probably needed.
>

Having spent some time with this yesterday and today, I'm quite
confident not only that you were right about the general
case-sensitivity fix required here, but also that it fixes the
case-only rename issue. It turns it (on case-insensitive filesystems)
into a similar issue to the mode change, which is treated as a remove
and add of the same file.

As you suggested, it is possible to construct "case-differing file
swaps" which are not file swaps on a case-sensitive FS but are on a
case-insensitive one, and without a fix these fail. The same (very
small) change fixes both issues.

> It might be sufficient to tighten the condition so that it triggers
> only to the case you wanted to handle, i.e. a rename between the
> same name.
>
>         else if (ignore_case && old_name && new_name &&
>                  !strcasecmp(old_name, new_name))
>
> (the "both names must be non-NULL" check is new).
>

This was my original tack, but I think it makes more sense to make the
general fix and explain how it also handles this case.

New patch coming.

Thanks!

^ permalink raw reply	[relevance 5%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  2022-06-12 23:30  6% ` Junio C Hamano
  2022-06-13 18:12  0%   ` Junio C Hamano
@ 2022-06-14  6:16  7%   ` Tao Klerks
  1 sibling, 0 replies; 200+ results
From: Tao Klerks @ 2022-06-14  6:16 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Tao Klerks via GitGitGadget, git

On Mon, Jun 13, 2022 at 1:30 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Tao Klerks via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > +if ! test_have_prereq CASE_INSENSITIVE_FS
> > +then
> > +     test_set_prereq CASE_SENSITIVE_FS
> > +     echo nuts
> > +fi
>
> You can easily say !CASE_INSENSITIVE_FS as the prerequiste, so I do
> not see the point of this.  I do not see the point of "nuts", either.

I was not aware of negated prerequisite support (I did not see it in
the README nor in any examples I scanned), but I agree this is much
cleaner of course!

"nuts" was a debugging leak, my apologies.

>
> But it probably is a moot point as I do not think you should do the
> prerequisite at all.
>
> Instead, you can explicitly set the core.ignorecase configuration,
> i.e. "git -c core.ignorecase=yes/no", and possibly "apply --cached"
> so that you do not have to worry about the case sensitivity of the
> filesystem at all.

Sure, I can see how we can test most of the case-sensitive logic, even
on a case-insensitive filesystem, with "--cached" and "-c
core.ignorecase=no". I'm not sure whether there's a need to test the
same things against the actual file system or not (certainly in the
case-insensitive path there is, as this is where the errors/conflicts
actually occur).

>
> > +test_expect_success setup '
> > +     echo "This is some content in the file." > file1 &&
>
> Style.  Redirection operator ">" sticks to its operand, i.e.
>
>         echo "This is some content in the file." >file1 &&
>

Thx.

> > +     echo "A completely different file." > file2 &&
> > +     git update-index --add file1 &&
> > +     git update-index --add file2 &&
> > +     cat >case_only_rename_patch <<-\EOF
> > +     diff --git a/file1 b/File1
> > +     similarity index 100%
> > +     rename from file1
> > +     rename to File1
> > +     EOF
>
> You are better off not writing the diff output manually.  Instead,
> you can let the test write it for you, e.g.
>
>         echo "This is some content in the file." >file1 &&
>         git update-index --add file1 &&
>         file1blob=$(git rev-parse :file1) &&
>         git commit -m "Initial - file1" &&
>         git update-index --add --cacheinfo 100644,$file1blob,File1 &&
>         git rm --cached file1 &&
>         git diff --cached -M HEAD >case-only-rename-patch
>

Makes sense, thx.

> If you want to be extra careful not to rely on your filesystem
> corrupting the pathnames you feed (e.g. the redireciton to "file1"
> might create file FILE1 on MS-DOS ;-), you could even do:
>
>         file1blob=$(echo "This is some content in the file." |
>                     git hash-object -w --stdin) &&
>         file2blob=$(echo "A completeloy different contents." |
>                     git hash-object -w --stdin) &&
>         git update-index --add --cacheinfo 100644,$file1blob,file1 &&
>
>         git commit -m "Initial - file1" &&
>         git update-index --add --cacheinfo 100644,$file1blob,File1 &&
>         git rm --cached file1 &&
>         git diff --cached -M HEAD >rename-file1-to-File2 &&
>
>         git reset --hard HEAD &&
>         git update-index --add --cacheinfo 100644,$file1blob,file2 &&
>         git rm --cached file1 &&
>         git diff --cached -M HEAD >rename-file1-to-file2 &&
>
>         # from here on, HEAD has file1 and file2
>         git reset --hard HEAD &&
>         git update-index --add --cacheinfo 100644,$file2blob,file2 &&
>         git commit -m 'file1 and file2'
>

Cool, but probably excessive? (do we support MS-DOS??)

> > +'
> > +
> > +test_expect_success 'refuse to apply rename patch with conflict' '
> > +     cat >conflict_patch <<-\EOF &&
> > +     diff --git a/file1 b/file2
> > +     similarity index 100%
> > +     rename from file1
> > +     rename to file2
> > +     EOF
> > +     test_must_fail git apply --index conflict_patch
>
> And then, you could use --cached (not --index) to bypass the working
> tree altogether, which is a good way to test the feature without
> getting affected by the underlying filesystem.  Check both case
> sensitive and case insensitive cases:
>
>         # Start from a known state
>         git reset --hard HEAD &&
>         test_must_fail git -c core.ignorecase=no apply --cached rename-file1-to-file2 &&
>
>         # Start from a known state
>         git reset --hard HEAD &&
>         test_must_fail git -c core.ignorecase=yes apply --cached rename-file1-to-file2 &&
>

Makes sense, understanding that this tests "happy paths" - it doesn't
fail even if talking to the (case-insensitive) filesystem actually
would (which here it wouldn't of course).

> > +'
> > +
> > +test_expect_success CASE_SENSITIVE_FS 'refuse to apply case-only rename patch with conflict, in case-sensitive FS' '
>
> Lose the prerequisite, replace --index with --cached, and force core.ignorecase
> to both case insensitive and sensitive to check the behaviour.
>

Sure, makes sense - you can test case-sensitive behaviors in git
without needing a case-sensitive FS.

> > +     test_when_finished "git mv File1 file2" &&
> > +     git mv file2 File1 &&
> > +     test_must_fail git apply --index case_only_rename_patch
> > +'
> > +
> > +test_expect_success 'apply case-only rename patch without conflict' '
>
> Likewise, try both sensitive and insensitive one.
>

This one will fail on a case-insensitive filesystem if you disable
core.ignorecase, so explicitly trying with both settings in a single
test, without prerequisites, presumably isn't the right thing. I
assume the right thing is to have 2 versions of the same test, one
which expects success in all cases on a case-sensitive filesystem, and
one which expects failure when case-insensitivity is disabled on a
case-insensitive filesystem?

> > +     git apply --index case_only_rename_patch
> > +'
> > +
> > +test_done
> >
> > base-commit: 1e59178e3f65880188caedb965e70db5ceeb2d64
>
> Thanks.
>

Thank you!

^ permalink raw reply	[relevance 7%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
    @ 2022-06-14  5:13  6%   ` Tao Klerks
  2022-06-18  0:45  6%     ` Junio C Hamano
  1 sibling, 1 reply; 200+ results
From: Tao Klerks @ 2022-06-14  5:13 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Tao Klerks via GitGitGadget, git

On Sat, Jun 11, 2022 at 9:17 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Tao Klerks via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > From: Tao Klerks <tao@klerks.biz>
> >
> > "git apply" checks, when validating a patch, to ensure that any files
> > being added aren't already in the worktree.
> >
> > When this check runs on a case-only rename, in a case-insensitive
> > filesystem, this leads to a false positive - the command fails with an
> > error like:
> > error: File1: already exists in working directory
> >
> > Fix this existence check to allow the file to exist, for a case-only
> > rename when config core.ignorecase is set.
>
> Hmph, close, but the patch as-posted may be fatally buggy, I think.
>

Yes indeed, very much so.

> At the beginning of the function there is this block:
>
>         const char *old_name = patch->old_name;
>         const char *new_name = patch->new_name;
>         const char *name = old_name ? old_name : new_name;
>
> which makes us realize that old_name CAN legitimately be NULL.  That
> is true for a creation patch.  new_name can also be NULL for a
> deletion patch.
>

Yep, I was aware of the nulls, but I was unaware that passing nulls
into "strcasecmp()" was a bad thing to do. I just assumed a non-zero
comparison result would ensue.

> >       if ((tpatch = in_fn_table(state, new_name)) &&
> >           (was_deleted(tpatch) || to_be_deleted(tpatch)))
> >               ok_if_exists = 1;
> > +     else if (ignore_case && !strcasecmp(old_name, new_name))
> > +             ok_if_exists = 1;
>
> You'd get a segfault when the patch is creating a file at new_name,
> or deleting a file at old_name, wouldn't you?
>

Indeed you do (when ignorecase is true of course).

> We need a new test or two to see if a straight creation or deletion
> patch does work correctly with icase set, before we even dream of
> handling rename patches.  Not having tests for such basic cases is
> quite surprising, but apparently the above line passed the CI.
>

This is where I made some very bad assumptions: I only manually ran
the new "t4141-apply-case-insensitive-rename.sh" test, and assumed
that the test suite ran against linux, windows, and OSX, with the
latter two running on case-insensitive filesystems. I assumed that
both case-sensitive and case-insensitive code paths would be tested by
the complete CI suite.

The OSX tests were not running for me at all in GitGitGadget (seems to
be an ongoing struggle), but I assumed that everything was still
tested in case-insensitive mode because of the windows suite. It looks
like that was wrong, although I still don´t know how/why.

Had I run "t4114-apply-typechange.sh" (or probably some others in the
41XX range) on the OSX environment where I happen to have developed
this weekend, I would have seen the failures immediately.

> >       else
> >               ok_if_exists = 0;
>
> Having said that, I wonder what the existing check before the new
> condition is doing?  Especially, what is in_fn_table() for and how
> does it try to do its work?
>
> Reading the big comment before it, it seems that it tries to deal
> with tricky delete/create case already.  With a typechange patch
> that first removes a regular file "hello.txt" and then creates a
> symbolic link "hello.txt" is exempted from the "what you are
> creating should not exist already" rule by using in_fn_table()
> check.  If it tries to create a symlink "Hello.txt" instead,
> shouldn't we allow it the same way on case-insensitive systems?  I
> do not think in_fn_table() pays attention to "ignore_case" option,
> so there may be an existing bug there already, regardless of the
> problem you are trying to address with your patch.
>
> And I wonder if doing case-insensitive match in in_fn_table() lets
> us cover this new case as well as "fixing" the existing issue.
>

Yep, I confirmed that as you expect, it does fix the issue I set out
to fix, and as you noted also fixes other (slightly more obscure?)
existing issues with "git apply" on case-insensitive filesystems.

This time I tested all of t41XX on a case-insensitive system, and the
CI process ran in GitLab, presumably on case-sensitive filesystems
only.

I'm not sure what more to look out for, and will note as much in the
patch v2 comments.

> In any case, here are such two tests to make sure creation and
> deletion patches on icase systems are not broken by careless
> mistakes like the one in this patch.

I have a question related to this:

*Do* we expect to run the full test suite on case-insensitive systems
in gitlab, or do we expect to need to add explicit "-C
core.ignorecase" tests as you have done here? The latter seems risky
both because the behavior is not representatively tested (because it's
still actually running in a case-sensitive filesystem), and because
it's hard to predict all the things that should be explicitly retested
in this way.

I don't think these specific tests were necessary, and I guess they
are replaced by later ones in this thread, so I will ignore this bit
specifically.

Thanks for the careful review, my apologies for the careless patch.

^ permalink raw reply	[relevance 6%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  2022-06-12 23:30  6% ` Junio C Hamano
@ 2022-06-13 18:12  0%   ` Junio C Hamano
  2022-06-14  6:26  0%     ` Tao Klerks
  2022-06-14  6:16  7%   ` Tao Klerks
  1 sibling, 1 reply; 200+ results
From: Junio C Hamano @ 2022-06-13 18:12 UTC (permalink / raw)
  To: Tao Klerks via GitGitGadget; +Cc: git, Tao Klerks

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

> And then, you could use --cached (not --index) to bypass the working
> tree altogether, which is a good way to test the feature without
> getting affected by the underlying filesystem.  Check both case
> sensitive and case insensitive cases:
> ...
> Likewise, try both sensitive and insensitive one.

As I already wrote tests for basic cases, I'm sending them out,

so that you may extend them with your new cases so that new code you
write can be checked.

Thanks.

----- >8 --------- >8 --------- >8 --------- >8 --------- >8 -----
From: Junio C Hamano <gitster@pobox.com>
Date: Mon, 13 Jun 2022 11:05:54 -0700
Subject: [PATCH] t4141: test "git apply" with core.ignorecase

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t4141-apply-icase.sh | 128 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 128 insertions(+)
 create mode 100755 t/t4141-apply-icase.sh

diff --git a/t/t4141-apply-icase.sh b/t/t4141-apply-icase.sh
new file mode 100755
index 0000000000..9b70ff82c3
--- /dev/null
+++ b/t/t4141-apply-icase.sh
@@ -0,0 +1,128 @@
+#!/bin/sh
+
+test_description='git apply with core.ignorecase'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	# initial commit has file0 only
+	test_commit "initial" file0 "initial commit with file0" initial &&
+
+	# current commit has file1 as well
+	test_commit "current" file1 "initial content of file1" current &&
+	file0blob=$(git rev-parse :file0) &&
+	file1blob=$(git rev-parse :file1) &&
+
+	# prepare sample patches
+	# file0 is modified
+	echo modification to file0 >file0 &&
+	git add file0 &&
+	modifiedfile0blob=$(git rev-parse :file0) &&
+
+	# file1 is removed and then ...
+	git rm --cached file1 &&
+	# ... identical copies are placed at File1 and file2
+	git update-index --add --cacheinfo 100644,$file1blob,file2 &&
+	git update-index --add --cacheinfo 100644,$file1blob,File1 &&
+
+	# then various patches to do basic things
+	git diff HEAD^ HEAD -- file1 >creation-patch &&
+	git diff HEAD HEAD^ -- file1 >deletion-patch &&
+	git diff --cached HEAD -- file1 file2 >rename-file1-to-file2-patch &&
+	git diff --cached HEAD -- file1 File1 >rename-file1-to-File1-patch &&
+	git diff --cached HEAD -- file0 >modify-file0-patch
+'
+
+# Basic creation, deletion, modification and renaming.
+test_expect_success 'creation and deletion' '
+	# start at "initial" with file0 only
+	git reset --hard initial &&
+
+	# add file1
+	git -c core.ignorecase=false apply --cached creation-patch &&
+	test_cmp_rev :file1 "$file1blob" &&
+
+	# remove file1
+	git -c core.ignorecase=false apply --cached deletion-patch &&
+	test_must_fail git rev-parse --verify :file1 &&
+
+	# do the same with ignorecase
+	git -c core.ignorecase=true apply --cached creation-patch &&
+	test_cmp_rev :file1 "$file1blob" &&
+	git -c core.ignorecase=true apply --cached deletion-patch &&
+	test_must_fail git rev-parse --verify :file1
+'
+
+test_expect_success 'modificaiton' '
+	# start at "initial" with file0 only
+	git reset --hard initial &&
+
+	# modify file0
+	git -c core.ignorecase=false apply --cached modify-file0-patch &&
+	test_cmp_rev :file0 "$modifiedfile0blob" &&
+	git -c core.ignorecase=false apply --cached -R modify-file0-patch &&
+	test_cmp_rev :file0 "$file0blob" &&
+
+	# do the same with ignorecase
+	git -c core.ignorecase=true apply --cached modify-file0-patch &&
+	test_cmp_rev :file0 "$modifiedfile0blob" &&
+	git -c core.ignorecase=true apply --cached -R modify-file0-patch &&
+	test_cmp_rev :file0 "$file0blob"
+'
+
+test_expect_success 'rename file1 to file2' '
+	# start from file0 and file1
+	git reset --hard current &&
+
+	# rename file1 to file2
+	git -c core.ignorecase=false apply --cached rename-file1-to-file2-patch &&
+	test_must_fail git rev-parse --verify :file1 &&
+	test_cmp_rev :file2 "$file1blob" &&
+	git -c core.ignorecase=false apply --cached -R rename-file1-to-file2-patch &&
+	test_must_fail git rev-parse --verify :file2 &&
+	test_cmp_rev :file1 "$file1blob" &&
+
+	# do the same with ignorecase
+	git -c core.ignorecase=true apply --cached rename-file1-to-file2-patch &&
+	test_must_fail git rev-parse --verify :file1 &&
+	test_cmp_rev :file2 "$file1blob" &&
+	git -c core.ignorecase=true apply --cached -R rename-file1-to-file2-patch &&
+	test_must_fail git rev-parse --verify :file2 &&
+	test_cmp_rev :file1 "$file1blob"
+'
+
+test_expect_success 'rename file1 to file2' '
+	# start from file0 and file1
+	git reset --hard current &&
+
+	# rename file1 to File1
+	git -c core.ignorecase=false apply --cached rename-file1-to-File1-patch &&
+	test_must_fail git rev-parse --verify :file1 &&
+	test_cmp_rev :File1 "$file1blob" &&
+	git -c core.ignorecase=false apply --cached -R rename-file1-to-File1-patch &&
+	test_must_fail git rev-parse --verify :File1 &&
+	test_cmp_rev :file1 "$file1blob" &&
+
+	# do the same with ignorecase
+	git -c core.ignorecase=true apply --cached rename-file1-to-File1-patch &&
+	test_must_fail git rev-parse --verify :file1 &&
+	test_cmp_rev :File1 "$file1blob" &&
+	git -c core.ignorecase=true apply --cached -R rename-file1-to-File1-patch &&
+	test_must_fail git rev-parse --verify :File1 &&
+	test_cmp_rev :file1 "$file1blob"
+'
+
+# We may want to add tests with working tree here, without "--cached" and
+# with and without "--index" here.  For example, should modify-file0-patch
+# apply cleanly if we have File0 with $file0blob in the index and the working
+# tree if core.icase is set?
+
+test_expect_success CASE_INSENSITIVE_FS 'a test only for icase fs' '
+	: sample
+'
+
+test_expect_success !CASE_INSENSITIVE_FS 'a test only for !icase fs' '
+	: sample
+'
+
+test_done
-- 
2.36.1-513-gd2306e2395


^ permalink raw reply related	[relevance 0%]

* Re: [PATCH] apply: support case-only renames in case-insensitive filesystems
  2022-06-11 17:03 13% [PATCH] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
  @ 2022-06-12 23:30  6% ` Junio C Hamano
  2022-06-13 18:12  0%   ` Junio C Hamano
  2022-06-14  6:16  7%   ` Tao Klerks
  2022-06-19 16:10  6% ` [PATCH v2 0/3] RFC: " Tao Klerks via GitGitGadget
  2 siblings, 2 replies; 200+ results
From: Junio C Hamano @ 2022-06-12 23:30 UTC (permalink / raw)
  To: Tao Klerks via GitGitGadget; +Cc: git, Tao Klerks

"Tao Klerks via GitGitGadget" <gitgitgadget@gmail.com> writes:

> +if ! test_have_prereq CASE_INSENSITIVE_FS
> +then
> +	test_set_prereq CASE_SENSITIVE_FS
> +	echo nuts
> +fi

You can easily say !CASE_INSENSITIVE_FS as the prerequiste, so I do
not see the point of this.  I do not see the point of "nuts", either.

But it probably is a moot point as I do not think you should do the
prerequisite at all.

Instead, you can explicitly set the core.ignorecase configuration,
i.e. "git -c core.ignorecase=yes/no", and possibly "apply --cached"
so that you do not have to worry about the case sensitivity of the
filesystem at all.

> +test_expect_success setup '
> +	echo "This is some content in the file." > file1 &&

Style.  Redirection operator ">" sticks to its operand, i.e.

	echo "This is some content in the file." >file1 &&

> +	echo "A completely different file." > file2 &&
> +	git update-index --add file1 &&
> +	git update-index --add file2 &&
> +	cat >case_only_rename_patch <<-\EOF
> +	diff --git a/file1 b/File1
> +	similarity index 100%
> +	rename from file1
> +	rename to File1
> +	EOF

You are better off not writing the diff output manually.  Instead,
you can let the test write it for you, e.g.

	echo "This is some content in the file." >file1 &&
	git update-index --add file1 &&
        file1blob=$(git rev-parse :file1) &&
	git commit -m "Initial - file1" &&
	git update-index --add --cacheinfo 100644,$file1blob,File1 &&
	git rm --cached file1 &&
	git diff --cached -M HEAD >case-only-rename-patch

If you want to be extra careful not to rely on your filesystem
corrupting the pathnames you feed (e.g. the redireciton to "file1"
might create file FILE1 on MS-DOS ;-), you could even do:

	file1blob=$(echo "This is some content in the file." |
		    git hash-object -w --stdin) &&
	file2blob=$(echo "A completeloy different contents." |
		    git hash-object -w --stdin) &&
	git update-index --add --cacheinfo 100644,$file1blob,file1 &&

	git commit -m "Initial - file1" &&
	git update-index --add --cacheinfo 100644,$file1blob,File1 &&
	git rm --cached file1 &&
	git diff --cached -M HEAD >rename-file1-to-File2 &&

	git reset --hard HEAD &&
        git update-index --add --cacheinfo 100644,$file1blob,file2 &&
	git rm --cached file1 &&
	git diff --cached -M HEAD >rename-file1-to-file2 &&

	# from here on, HEAD has file1 and file2
	git reset --hard HEAD &&
	git update-index --add --cacheinfo 100644,$file2blob,file2 &&
	git commit -m 'file1 and file2'

> +'
> +
> +test_expect_success 'refuse to apply rename patch with conflict' '
> +	cat >conflict_patch <<-\EOF &&
> +	diff --git a/file1 b/file2
> +	similarity index 100%
> +	rename from file1
> +	rename to file2
> +	EOF
> +	test_must_fail git apply --index conflict_patch

And then, you could use --cached (not --index) to bypass the working
tree altogether, which is a good way to test the feature without
getting affected by the underlying filesystem.  Check both case
sensitive and case insensitive cases:

	# Start from a known state
	git reset --hard HEAD &&
	test_must_fail git -c core.ignorecase=no apply --cached rename-file1-to-file2 &&

	# Start from a known state
	git reset --hard HEAD &&
	test_must_fail git -c core.ignorecase=yes apply --cached rename-file1-to-file2 &&

> +'
> +
> +test_expect_success CASE_SENSITIVE_FS 'refuse to apply case-only rename patch with conflict, in case-sensitive FS' '

Lose the prerequisite, replace --index with --cached, and force core.ignorecase
to both case insensitive and sensitive to check the behaviour.

> +	test_when_finished "git mv File1 file2" &&
> +	git mv file2 File1 &&
> +	test_must_fail git apply --index case_only_rename_patch
> +'
> +
> +test_expect_success 'apply case-only rename patch without conflict' '

Likewise, try both sensitive and insensitive one.

> +	git apply --index case_only_rename_patch
> +'
> +
> +test_done
>
> base-commit: 1e59178e3f65880188caedb965e70db5ceeb2d64

Thanks.


^ permalink raw reply	[relevance 6%]

* [PATCH] apply: support case-only renames in case-insensitive filesystems
@ 2022-06-11 17:03 13% Tao Klerks via GitGitGadget
                     ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Tao Klerks via GitGitGadget @ 2022-06-11 17:03 UTC (permalink / raw)
  To: git; +Cc: Tao Klerks, Tao Klerks

From: Tao Klerks <tao@klerks.biz>

"git apply" checks, when validating a patch, to ensure that any files
being added aren't already in the worktree.

When this check runs on a case-only rename, in a case-insensitive
filesystem, this leads to a false positive - the command fails with an
error like:
error: File1: already exists in working directory

Fix this existence check to allow the file to exist, for a case-only
rename when config core.ignorecase is set.

Also add a test for this case, while verifying that conflicting file
conditions are still caught correctly, including case-only conflicts on
case-sensitive filesystems.

Signed-off-by: Tao Klerks <tao@klerks.biz>
---
    apply: support case-only renames in case-insensitive filesystems
    
    As suggested recently in thread
    CAPMMpojwV+f=z9sgc_GaUOTFBCUVdbrGW8WjatWWmC3WTcsoXw@mail.gmail.com,
    proposing a fix to git-apply for case-only renames on case-insensitive
    filesystems.
    
    Also including tests to check both the corrected behavior and the
    corresponding legitimate errors.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1257%2FTaoK%2Ftao-apply-case-insensitive-renames-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1257/TaoK/tao-apply-case-insensitive-renames-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1257

 apply.c                                  |  2 +
 t/t4141-apply-case-insensitive-rename.sh | 50 ++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100755 t/t4141-apply-case-insensitive-rename.sh

diff --git a/apply.c b/apply.c
index 2b7cd930efa..ccba7f90393 100644
--- a/apply.c
+++ b/apply.c
@@ -3942,6 +3942,8 @@ static int check_patch(struct apply_state *state, struct patch *patch)
 	if ((tpatch = in_fn_table(state, new_name)) &&
 	    (was_deleted(tpatch) || to_be_deleted(tpatch)))
 		ok_if_exists = 1;
+	else if (ignore_case && !strcasecmp(old_name, new_name))
+		ok_if_exists = 1;
 	else
 		ok_if_exists = 0;
 
diff --git a/t/t4141-apply-case-insensitive-rename.sh b/t/t4141-apply-case-insensitive-rename.sh
new file mode 100755
index 00000000000..6b394252ff8
--- /dev/null
+++ b/t/t4141-apply-case-insensitive-rename.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+test_description='git apply should handle case-only renames on case-insensitive filesystems'
+
+TEST_PASSES_SANITIZE_LEAK=true
+. ./test-lib.sh
+
+# Please note, this test assumes that core.ignorecase is set appropriately for the filesystem,
+# as tested in t0050. Case-only rename conflicts are only tested in case-sensitive filesystems.
+
+if ! test_have_prereq CASE_INSENSITIVE_FS
+then
+	test_set_prereq CASE_SENSITIVE_FS
+	echo nuts
+fi
+
+test_expect_success setup '
+	echo "This is some content in the file." > file1 &&
+	echo "A completely different file." > file2 &&
+	git update-index --add file1 &&
+	git update-index --add file2 &&
+	cat >case_only_rename_patch <<-\EOF
+	diff --git a/file1 b/File1
+	similarity index 100%
+	rename from file1
+	rename to File1
+	EOF
+'
+
+test_expect_success 'refuse to apply rename patch with conflict' '
+	cat >conflict_patch <<-\EOF &&
+	diff --git a/file1 b/file2
+	similarity index 100%
+	rename from file1
+	rename to file2
+	EOF
+	test_must_fail git apply --index conflict_patch
+'
+
+test_expect_success CASE_SENSITIVE_FS 'refuse to apply case-only rename patch with conflict, in case-sensitive FS' '
+	test_when_finished "git mv File1 file2" &&
+	git mv file2 File1 &&
+	test_must_fail git apply --index case_only_rename_patch
+'
+
+test_expect_success 'apply case-only rename patch without conflict' '
+	git apply --index case_only_rename_patch
+'
+
+test_done

base-commit: 1e59178e3f65880188caedb965e70db5ceeb2d64
-- 
gitgitgadget

^ permalink raw reply related	[relevance 13%]

* [PATCH v5] remote: create fetch.credentialsInUrl config
  2022-06-02 17:20  2%     ` [PATCH v4] remote: " Derrick Stolee via GitGitGadget
@ 2022-06-06 14:36  2%       ` Derrick Stolee via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Derrick Stolee via GitGitGadget @ 2022-06-06 14:36 UTC (permalink / raw)
  To: git
  Cc: gitster, peff, me, avarab, christian.couder, johannes.schindelin,
	jrnieder, brian m. carlson, Robert Coup, Derrick Stolee,
	Derrick Stolee

From: Derrick Stolee <derrickstolee@github.com>

Users sometimes provide a "username:password" combination in their
plaintext URLs. Since Git stores these URLs in plaintext in the
.git/config file, this is a very insecure way of storing these
credentials. Credential managers are a more secure way of storing this
information.

System administrators might want to prevent this kind of use by users on
their machines.

Create a new "fetch.credentialsInUrl" config option and teach Git to
warn or die when seeing a URL with this kind of information. The warning
anonymizes the sensitive information of the URL to be clear about the
issue.

This change currently defaults the behavior to "allow" which does
nothing with these URLs. We can consider changing this behavior to
"warn" by default if we wish. At that time, we may want to add some
advice about setting fetch.credentialsInUrl=ignore for users who still
want to follow this pattern (and not receive the warning).

An earlier version of this change injected the logic into
url_normalize() in urlmatch.c. While most code paths that parse URLs
eventually normalize the URL, that normalization does not happen early
enough in the stack to avoid attempting connections to the URL first. By
inserting a check into the remote validation, we identify the issue
before making a connection. In the old code path, this was revealed by
testing the new t5601-clone.sh test under --stress, resulting in an
instance where the return code was 13 (SIGPIPE) instead of 128 from the
die().

However, we can reuse the parsing information from url_normalize() in
order to benefit from its well-worn parsing logic. We can use the struct
url_info that is created in that method to replace the password with
"<redacted>" in our error messages. This comes with a slight downside
that the normalized URL might look slightly different from the input URL
(for instance, the normalized version adds a closing slash). This should
not hinder users figuring out what the problem is and being able to fix
the issue.

As an attempt to ensure the parsing logic did not catch any
unintentional cases, I modified this change locally to to use the "die"
option by default. Running the test suite succeeds except for the
explicit username:password URLs used in t5550-http-fetch-dumb.sh and
t5541-http-push-smart.sh. This means that all other tested URLs did not
trigger this logic.

The tests show that the proper error messages appear (or do not
appear), but also count the number of error messages. When only warning,
each process validates the remote URL and outputs a warning. This
happens twice for clone, three times for fetch, and once for push.

Co-authored-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Derrick Stolee <derrickstolee@github.com>
---
    remote: create fetch.credentialsInUrl config
    
    Users can specify credentials in their URL using the
    username:password@domain format. This is potentially hazardous since the
    URL is stored in plaintext and can also appear in trace2 logs and other
    places. Add a new config option that allows warnings or failures when
    discovering URLs with this format. The default behavior does not change
    in this series, although we may want to move to the warn state by
    default in the future.
    
    This is a modified version of the patch I submitted a while ago [1].
    
    Based on the feedback, changing the behavior to fail by default was not
    a good approach. Further, the idea to stop storing the credentials in
    config and redirect them to a credential manager was already considered
    by Peff [2] but not merged.
    
    This patch does what should be the simplest thing we can do: create a
    config option that will cause the user to get a warning or a failure,
    depending on its value. The default is to ignore the setting, identical
    to the current behavior. We can talk about changing this default to
    "warn" in the future, but it would be safest to release with ignore as
    the default until we are sure that we are not going to start warning on
    false positives.
    
    This patch would be sufficient for the interested internal parties that
    want to prevent users from storing credentials this way. System
    administrators can modify system-level Git config into "die" mode to
    prevent this behavior.
    
    [1]
    https://lore.kernel.org/git/pull.945.git.1619807844627.gitgitgadget@gmail.com
    Reject passwords in URLs (April 2021).
    
    [2]
    https://lore.kernel.org/git/20190519050724.GA26179@sigill.intra.peff.net/
    Re: Git ransom campaign incident report - May 2019
    
    
    Updates in v5
    =============
    
     * Squashed in Junio's recommended changes.
     * Noticed that the redacted strbuf wasn't reset between loop
       iterations, which only matters if there are multiple URLs for the
       remote.
    
    
    Updates in v4
    =============
    
     * The warn_once() patch is dropped in favor of using a different
       location for the check (remotes_remote_get_1() instead of
       valid_remote()).
     * The parsing logic is removed in favor of using the output url_info
       from url_normalize().
     * Tests for 'fetch' and 'push' are added.
     * This requires updating the topic to be on a more-recent version of
       'master' because some change since the previous base caused 'git
       push' to output the warning only once, not twice.
    
    
    Updates in v3
    =============
    
     * Because of some flaky behavior around SIGPIPE, the URL check needed
       to move to be earlier in the command.
     * For this reason, I moved the cred check into remote.c's
       valid_remote() check. This changed the previous BUG() statements into
       early returns.
     * I repeated the check with the test suite to see if this parsing fails
       on any existing cases, but it is worth double-checking the parsing
       rules.
     * Documentation is more consistent about using placeholders.
     * A test for the "allow" case is now included.
     * A new patch is added that creates the warn_once() helper. This
       reduces multiple advisory warnings with the same text from being
       written by the same process.
    
    
    Updates in v2
    =============
    
     * Documentation is slightly expanded to include the fact that Git
       stores the given URL as plaintext in its config.
     * The new method has a new documentation comment that details the
       necessary preconditions.
     * "ignore" is now "allow"
     * Additional checks on colon_ptr are added.
     * Use strbuf_splice() instead of custom string-walking logic.
     * Use "" instead of asterisks.
     * Config value checks are no longer case sensitive.
    
    Thanks, -Stolee

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1237%2Fderrickstolee%2Fcreds-in-url-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1237/derrickstolee/creds-in-url-v5
Pull-Request: https://github.com/gitgitgadget/git/pull/1237

Range-diff vs v4:

 1:  5fb038402d6 ! 1:  b744a9887e5 remote: create fetch.credentialsInUrl config
     @@ Commit message
          each process validates the remote URL and outputs a warning. This
          happens twice for clone, three times for fetch, and once for push.
      
     +    Co-authored-by: Junio C Hamano <gitster@pobox.com>
     +    Signed-off-by: Junio C Hamano <gitster@pobox.com>
          Signed-off-by: Derrick Stolee <derrickstolee@github.com>
      
       ## Documentation/config/fetch.txt ##
     @@ remote.c: const char *remote_ref_for_branch(struct branch *branch, int for_push)
      +	int i;
      +	const char *value;
      +	struct strbuf redacted = STRBUF_INIT;
     ++	int warn_not_die;
      +
     -+	if (git_config_get_string_tmp("fetch.credentialsinurl", &value) ||
     -+	    !strcmp("allow", value))
     ++	if (git_config_get_string_tmp("fetch.credentialsinurl", &value))
      +		return;
      +
     ++	if (!strcmp("warn", value))
     ++		warn_not_die = 1;
     ++	else if (!strcmp("die", value))
     ++		warn_not_die = 0;
     ++	else if (!strcmp("allow", value))
     ++		return;
     ++	else
     ++		die(_("unrecognized value fetch.credentialsInURL: '%s'"), value);
     ++
      +	for (i = 0; i < remote->url_nr; i++) {
     -+		struct url_info url_info = { NULL };
     -+		url_normalize(remote->url[i], &url_info);
     ++		struct url_info url_info = { 0 };
      +
     -+		if (!url_info.passwd_len)
     ++		if (!url_normalize(remote->url[i], &url_info) ||
     ++		    !url_info.passwd_off)
      +			goto loop_cleanup;
      +
     ++		strbuf_reset(&redacted);
      +		strbuf_add(&redacted, url_info.url, url_info.passwd_off);
      +		strbuf_addstr(&redacted, "<redacted>");
     -+		strbuf_addstr(&redacted, url_info.url + url_info.passwd_off + url_info.passwd_len);
     ++		strbuf_addstr(&redacted,
     ++			      url_info.url + url_info.passwd_off + url_info.passwd_len);
      +
     -+		if (!strcmp("warn", value))
     ++		if (warn_not_die)
      +			warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
     -+		if (!strcmp("die", value))
     ++		else
      +			die(_("URL '%s' uses plaintext credentials"), redacted.buf);
      +
      +loop_cleanup:
     @@ t/t5516-fetch-push.sh: test_expect_success 'refuse to push a hidden ref, and mak
      +
      +	test_must_fail git -c fetch.credentialsInUrl=die fetch https://username:password@localhost 2>err &&
      +	grep "fatal: $message" err >warnings &&
     ++	test_line_count = 1 warnings &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=die fetch https://username:@localhost 2>err &&
     ++	grep "fatal: $message" err >warnings &&
      +	test_line_count = 1 warnings
      +'
      +
     @@ t/t5601-clone.sh: test_expect_success 'clone respects GIT_WORK_TREE' '
      +
      +	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt3 2>err &&
      +	grep "fatal: $message" err >warnings &&
     ++	test_line_count = 1 warnings &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:@localhost attempt3 2>err &&
     ++	grep "fatal: $message" err >warnings &&
      +	test_line_count = 1 warnings
      +'
      +


 Documentation/config/fetch.txt | 14 ++++++++++
 remote.c                       | 48 ++++++++++++++++++++++++++++++++++
 t/t5516-fetch-push.sh          | 32 +++++++++++++++++++++++
 t/t5601-clone.sh               | 23 ++++++++++++++++
 4 files changed, 117 insertions(+)

diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.txt
index cd65d236b43..0db7fe85bb8 100644
--- a/Documentation/config/fetch.txt
+++ b/Documentation/config/fetch.txt
@@ -96,3 +96,17 @@ fetch.writeCommitGraph::
 	merge and the write may take longer. Having an updated commit-graph
 	file helps performance of many Git commands, including `git merge-base`,
 	`git push -f`, and `git log --graph`. Defaults to false.
+
+fetch.credentialsInUrl::
+	A URL can contain plaintext credentials in the form
+	`<protocol>://<user>:<password>@<domain>/<path>`. Using such URLs
+	is not recommended as it exposes the password in multiple ways,
+	including Git storing the URL as plaintext in the repository config.
+	The `fetch.credentialsInUrl` option provides instruction for how Git
+	should react to seeing such a URL, with these values:
++
+* `allow` (default): Git will proceed with its activity without warning.
+* `warn`: Git will write a warning message to `stderr` when parsing a URL
+  with a plaintext credential.
+* `die`: Git will write a failure message to `stderr` when parsing a URL
+  with a plaintext credential.
diff --git a/remote.c b/remote.c
index 930fdc9c2f6..2b6a8b3df7d 100644
--- a/remote.c
+++ b/remote.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "config.h"
 #include "remote.h"
+#include "urlmatch.h"
 #include "refs.h"
 #include "refspec.h"
 #include "object-store.h"
@@ -614,6 +615,50 @@ const char *remote_ref_for_branch(struct branch *branch, int for_push)
 	return NULL;
 }
 
+static void validate_remote_url(struct remote *remote)
+{
+	int i;
+	const char *value;
+	struct strbuf redacted = STRBUF_INIT;
+	int warn_not_die;
+
+	if (git_config_get_string_tmp("fetch.credentialsinurl", &value))
+		return;
+
+	if (!strcmp("warn", value))
+		warn_not_die = 1;
+	else if (!strcmp("die", value))
+		warn_not_die = 0;
+	else if (!strcmp("allow", value))
+		return;
+	else
+		die(_("unrecognized value fetch.credentialsInURL: '%s'"), value);
+
+	for (i = 0; i < remote->url_nr; i++) {
+		struct url_info url_info = { 0 };
+
+		if (!url_normalize(remote->url[i], &url_info) ||
+		    !url_info.passwd_off)
+			goto loop_cleanup;
+
+		strbuf_reset(&redacted);
+		strbuf_add(&redacted, url_info.url, url_info.passwd_off);
+		strbuf_addstr(&redacted, "<redacted>");
+		strbuf_addstr(&redacted,
+			      url_info.url + url_info.passwd_off + url_info.passwd_len);
+
+		if (warn_not_die)
+			warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
+		else
+			die(_("URL '%s' uses plaintext credentials"), redacted.buf);
+
+loop_cleanup:
+		free(url_info.url);
+	}
+
+	strbuf_release(&redacted);
+}
+
 static struct remote *
 remotes_remote_get_1(struct remote_state *remote_state, const char *name,
 		     const char *(*get_default)(struct remote_state *,
@@ -639,6 +684,9 @@ remotes_remote_get_1(struct remote_state *remote_state, const char *name,
 		add_url_alias(remote_state, ret, name);
 	if (!valid_remote(ret))
 		return NULL;
+
+	validate_remote_url(ret);
+
 	return ret;
 }
 
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 4dfb080433e..dc6cb3cbf5d 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -12,6 +12,7 @@ This test checks the following functionality:
 * --porcelain output format
 * hiderefs
 * reflogs
+* URL validation
 '
 
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
@@ -1813,4 +1814,35 @@ test_expect_success 'refuse to push a hidden ref, and make sure do not pollute t
 	test_dir_is_empty testrepo/.git/objects/pack
 '
 
+test_expect_success 'fetch warns or fails when using username:password' '
+	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
+	test_must_fail git -c fetch.credentialsInUrl=allow fetch https://username:password@localhost 2>err &&
+	! grep "$message" err &&
+
+	test_must_fail git -c fetch.credentialsInUrl=warn fetch https://username:password@localhost 2>err &&
+	grep "warning: $message" err >warnings &&
+	test_line_count = 3 warnings &&
+
+	test_must_fail git -c fetch.credentialsInUrl=die fetch https://username:password@localhost 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings &&
+
+	test_must_fail git -c fetch.credentialsInUrl=die fetch https://username:@localhost 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings
+'
+
+
+test_expect_success 'push warns or fails when using username:password' '
+	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
+	test_must_fail git -c fetch.credentialsInUrl=allow push https://username:password@localhost 2>err &&
+	! grep "$message" err &&
+
+	test_must_fail git -c fetch.credentialsInUrl=warn push https://username:password@localhost 2>err &&
+	grep "warning: $message" err >warnings &&
+	test_must_fail git -c fetch.credentialsInUrl=die push https://username:password@localhost 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings
+'
+
 test_done
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 4a61f2c901e..d2f046b4b92 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -71,6 +71,29 @@ test_expect_success 'clone respects GIT_WORK_TREE' '
 
 '
 
+test_expect_success 'clone warns or fails when using username:password' '
+	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
+	test_must_fail git -c fetch.credentialsInUrl=allow clone https://username:password@localhost attempt1 2>err &&
+	! grep "$message" err &&
+
+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt2 2>err &&
+	grep "warning: $message" err >warnings &&
+	test_line_count = 2 warnings &&
+
+	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt3 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings &&
+
+	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:@localhost attempt3 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings
+'
+
+test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username@localhost:8080 attempt3 2>err &&
+	! grep "uses plaintext credentials" err
+'
+
 test_expect_success 'clone from hooks' '
 
 	test_create_repo r0 &&

base-commit: 2668e3608e47494f2f10ef2b6e69f08a84816bcb
-- 
gitgitgadget

^ permalink raw reply related	[relevance 2%]

* [PATCH v4] remote: create fetch.credentialsInUrl config
  2022-06-01  1:16  2%   ` [PATCH v3 0/2] fetch: " Derrick Stolee via GitGitGadget
@ 2022-06-02 17:20  2%     ` Derrick Stolee via GitGitGadget
  2022-06-06 14:36  2%       ` [PATCH v5] " Derrick Stolee via GitGitGadget
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee via GitGitGadget @ 2022-06-02 17:20 UTC (permalink / raw)
  To: git
  Cc: gitster, peff, me, avarab, christian.couder, johannes.schindelin,
	jrnieder, brian m. carlson, Robert Coup, Derrick Stolee,
	Derrick Stolee

From: Derrick Stolee <derrickstolee@github.com>

Users sometimes provide a "username:password" combination in their
plaintext URLs. Since Git stores these URLs in plaintext in the
.git/config file, this is a very insecure way of storing these
credentials. Credential managers are a more secure way of storing this
information.

System administrators might want to prevent this kind of use by users on
their machines.

Create a new "fetch.credentialsInUrl" config option and teach Git to
warn or die when seeing a URL with this kind of information. The warning
anonymizes the sensitive information of the URL to be clear about the
issue.

This change currently defaults the behavior to "allow" which does
nothing with these URLs. We can consider changing this behavior to
"warn" by default if we wish. At that time, we may want to add some
advice about setting fetch.credentialsInUrl=ignore for users who still
want to follow this pattern (and not receive the warning).

An earlier version of this change injected the logic into
url_normalize() in urlmatch.c. While most code paths that parse URLs
eventually normalize the URL, that normalization does not happen early
enough in the stack to avoid attempting connections to the URL first. By
inserting a check into the remote validation, we identify the issue
before making a connection. In the old code path, this was revealed by
testing the new t5601-clone.sh test under --stress, resulting in an
instance where the return code was 13 (SIGPIPE) instead of 128 from the
die().

However, we can reuse the parsing information from url_normalize() in
order to benefit from its well-worn parsing logic. We can use the struct
url_info that is created in that method to replace the password with
"<redacted>" in our error messages. This comes with a slight downside
that the normalized URL might look slightly different from the input URL
(for instance, the normalized version adds a closing slash). This should
not hinder users figuring out what the problem is and being able to fix
the issue.

As an attempt to ensure the parsing logic did not catch any
unintentional cases, I modified this change locally to to use the "die"
option by default. Running the test suite succeeds except for the
explicit username:password URLs used in t5550-http-fetch-dumb.sh and
t5541-http-push-smart.sh. This means that all other tested URLs did not
trigger this logic.

The tests show that the proper error messages appear (or do not
appear), but also count the number of error messages. When only warning,
each process validates the remote URL and outputs a warning. This
happens twice for clone, three times for fetch, and once for push.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
---
    remote: create fetch.credentialsInUrl config
    
    Users can specify credentials in their URL using the
    username:password@domain format. This is potentially hazardous since the
    URL is stored in plaintext and can also appear in trace2 logs and other
    places. Add a new config option that allows warnings or failures when
    discovering URLs with this format. The default behavior does not change
    in this series, although we may want to move to the warn state by
    default in the future.
    
    This is a modified version of the patch I submitted a while ago [1].
    
    Based on the feedback, changing the behavior to fail by default was not
    a good approach. Further, the idea to stop storing the credentials in
    config and redirect them to a credential manager was already considered
    by Peff [2] but not merged.
    
    This patch does what should be the simplest thing we can do: create a
    config option that will cause the user to get a warning or a failure,
    depending on its value. The default is to ignore the setting, identical
    to the current behavior. We can talk about changing this default to
    "warn" in the future, but it would be safest to release with ignore as
    the default until we are sure that we are not going to start warning on
    false positives.
    
    This patch would be sufficient for the interested internal parties that
    want to prevent users from storing credentials this way. System
    administrators can modify system-level Git config into "die" mode to
    prevent this behavior.
    
    [1]
    https://lore.kernel.org/git/pull.945.git.1619807844627.gitgitgadget@gmail.com
    Reject passwords in URLs (April 2021).
    
    [2]
    https://lore.kernel.org/git/20190519050724.GA26179@sigill.intra.peff.net/
    Re: Git ransom campaign incident report - May 2019
    
    
    Updates in v4
    =============
    
     * The warn_once() patch is dropped in favor of using a different
       location for the check (remotes_remote_get_1() instead of
       valid_remote()).
     * The parsing logic is removed in favor of using the output url_info
       from url_normalize().
     * Tests for 'fetch' and 'push' are added.
     * This requires updating the topic to be on a more-recent version of
       'master' because some change since the previous base caused 'git
       push' to output the warning only once, not twice.
    
    
    Updates in v3
    =============
    
     * Because of some flaky behavior around SIGPIPE, the URL check needed
       to move to be earlier in the command.
     * For this reason, I moved the cred check into remote.c's
       valid_remote() check. This changed the previous BUG() statements into
       early returns.
     * I repeated the check with the test suite to see if this parsing fails
       on any existing cases, but it is worth double-checking the parsing
       rules.
     * Documentation is more consistent about using placeholders.
     * A test for the "allow" case is now included.
     * A new patch is added that creates the warn_once() helper. This
       reduces multiple advisory warnings with the same text from being
       written by the same process.
    
    
    Updates in v2
    =============
    
     * Documentation is slightly expanded to include the fact that Git
       stores the given URL as plaintext in its config.
     * The new method has a new documentation comment that details the
       necessary preconditions.
     * "ignore" is now "allow"
     * Additional checks on colon_ptr are added.
     * Use strbuf_splice() instead of custom string-walking logic.
     * Use "" instead of asterisks.
     * Config value checks are no longer case sensitive.
    
    Thanks, -Stolee

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1237%2Fderrickstolee%2Fcreds-in-url-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1237/derrickstolee/creds-in-url-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/1237

Range-diff vs v3:

 1:  083a918e9b1 ! 1:  5fb038402d6 remote: create fetch.credentialsInUrl config
     @@ Commit message
          instance where the return code was 13 (SIGPIPE) instead of 128 from the
          die().
      
     -    Since we are not deep within url_normalize(), we need to do our own
     -    parsing to detect if there is a "username:password@domain" section. We
     -    begin by detecting the first '@' symbol in the URL. We then detect if
     -    there is a scheme such as "https://" by finding the first slash. If that
     -    slash does not exist or is after the first '@' symbol, then we consider
     -    the scheme to be complete before the URL. Finally, we look for a colon
     -    between the scheme and the '@' symbol, indicating a "username:password"
     -    string. Replace the password with "<redacted>" when writing the error
     -    message.
     +    However, we can reuse the parsing information from url_normalize() in
     +    order to benefit from its well-worn parsing logic. We can use the struct
     +    url_info that is created in that method to replace the password with
     +    "<redacted>" in our error messages. This comes with a slight downside
     +    that the normalized URL might look slightly different from the input URL
     +    (for instance, the normalized version adds a closing slash). This should
     +    not hinder users figuring out what the problem is and being able to fix
     +    the issue.
      
          As an attempt to ensure the parsing logic did not catch any
          unintentional cases, I modified this change locally to to use the "die"
     @@ Commit message
          t5541-http-push-smart.sh. This means that all other tested URLs did not
          trigger this logic.
      
     +    The tests show that the proper error messages appear (or do not
     +    appear), but also count the number of error messages. When only warning,
     +    each process validates the remote URL and outputs a warning. This
     +    happens twice for clone, three times for fetch, and once for push.
     +
          Signed-off-by: Derrick Stolee <derrickstolee@github.com>
      
       ## Documentation/config/fetch.txt ##
     @@ Documentation/config/fetch.txt: fetch.writeCommitGraph::
      +  with a plaintext credential.
      
       ## remote.c ##
     -@@ remote.c: struct counted_string {
     - 	const char *s;
     - };
     +@@
     + #include "cache.h"
     + #include "config.h"
     + #include "remote.h"
     ++#include "urlmatch.h"
     + #include "refs.h"
     + #include "refspec.h"
     + #include "object-store.h"
     +@@ remote.c: const char *remote_ref_for_branch(struct branch *branch, int for_push)
     + 	return NULL;
     + }
       
     -+/*
     -+ * Check if the given URL is of the following form:
     -+ *
     -+ *     scheme://username:password@domain[:port][/path]
     -+ *
     -+ * Specifically, see if the ":password@" section of the URL appears.
     -+ *
     -+ * The fetch.credentialsInUrl config indicates what to do on such a URL,
     -+ * either ignoring, warning, or erroring. The latter two modes write a
     -+ * redacted URL to stderr.
     -+ */
     -+static void check_if_creds_in_url(const char *url)
     ++static void validate_remote_url(struct remote *remote)
      +{
     -+	const char *value, *scheme_ptr, *colon_ptr, *at_ptr;
     ++	int i;
     ++	const char *value;
      +	struct strbuf redacted = STRBUF_INIT;
      +
     -+	/* "allow" is the default behavior. */
      +	if (git_config_get_string_tmp("fetch.credentialsinurl", &value) ||
      +	    !strcmp("allow", value))
      +		return;
      +
     -+	if (!(at_ptr = strchr(url, '@')))
     -+		return;
     ++	for (i = 0; i < remote->url_nr; i++) {
     ++		struct url_info url_info = { NULL };
     ++		url_normalize(remote->url[i], &url_info);
      +
     -+	if (!(scheme_ptr = strchr(url, '/')) ||
     -+	    scheme_ptr > at_ptr)
     -+		scheme_ptr = url;
     ++		if (!url_info.passwd_len)
     ++			goto loop_cleanup;
      +
     -+	if (!(colon_ptr = strchr(scheme_ptr, ':')))
     -+		return;
     ++		strbuf_add(&redacted, url_info.url, url_info.passwd_off);
     ++		strbuf_addstr(&redacted, "<redacted>");
     ++		strbuf_addstr(&redacted, url_info.url + url_info.passwd_off + url_info.passwd_len);
      +
     -+	/* Include the colon when creating the redacted URL. */
     -+	colon_ptr++;
     -+	strbuf_addstr(&redacted, url);
     -+	strbuf_splice(&redacted, colon_ptr - url, at_ptr - colon_ptr,
     -+		      "<redacted>", 10);
     ++		if (!strcmp("warn", value))
     ++			warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
     ++		if (!strcmp("die", value))
     ++			die(_("URL '%s' uses plaintext credentials"), redacted.buf);
      +
     -+	if (!strcmp("warn", value))
     -+		warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
     -+	if (!strcmp("die", value))
     -+		die(_("URL '%s' uses plaintext credentials"), redacted.buf);
     ++loop_cleanup:
     ++		free(url_info.url);
     ++	}
      +
      +	strbuf_release(&redacted);
      +}
      +
     - static int valid_remote(const struct remote *remote)
     - {
     -+	for (int i = 0; i < remote->url_nr; i++)
     -+		check_if_creds_in_url(remote->url[i]);
     + static struct remote *
     + remotes_remote_get_1(struct remote_state *remote_state, const char *name,
     + 		     const char *(*get_default)(struct remote_state *,
     +@@ remote.c: remotes_remote_get_1(struct remote_state *remote_state, const char *name,
     + 		add_url_alias(remote_state, ret, name);
     + 	if (!valid_remote(ret))
     + 		return NULL;
     ++
     ++	validate_remote_url(ret);
      +
     - 	return (!!remote->url) || (!!remote->foreign_vcs);
     + 	return ret;
       }
       
      
     + ## t/t5516-fetch-push.sh ##
     +@@ t/t5516-fetch-push.sh: This test checks the following functionality:
     + * --porcelain output format
     + * hiderefs
     + * reflogs
     ++* URL validation
     + '
     + 
     + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
     +@@ t/t5516-fetch-push.sh: test_expect_success 'refuse to push a hidden ref, and make sure do not pollute t
     + 	test_dir_is_empty testrepo/.git/objects/pack
     + '
     + 
     ++test_expect_success 'fetch warns or fails when using username:password' '
     ++	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
     ++	test_must_fail git -c fetch.credentialsInUrl=allow fetch https://username:password@localhost 2>err &&
     ++	! grep "$message" err &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=warn fetch https://username:password@localhost 2>err &&
     ++	grep "warning: $message" err >warnings &&
     ++	test_line_count = 3 warnings &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=die fetch https://username:password@localhost 2>err &&
     ++	grep "fatal: $message" err >warnings &&
     ++	test_line_count = 1 warnings
     ++'
     ++
     ++
     ++test_expect_success 'push warns or fails when using username:password' '
     ++	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
     ++	test_must_fail git -c fetch.credentialsInUrl=allow push https://username:password@localhost 2>err &&
     ++	! grep "$message" err &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=warn push https://username:password@localhost 2>err &&
     ++	grep "warning: $message" err >warnings &&
     ++	test_must_fail git -c fetch.credentialsInUrl=die push https://username:password@localhost 2>err &&
     ++	grep "fatal: $message" err >warnings &&
     ++	test_line_count = 1 warnings
     ++'
     ++
     + test_done
     +
       ## t/t5601-clone.sh ##
      @@ t/t5601-clone.sh: test_expect_success 'clone respects GIT_WORK_TREE' '
       
       '
       
      +test_expect_success 'clone warns or fails when using username:password' '
     ++	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
      +	test_must_fail git -c fetch.credentialsInUrl=allow clone https://username:password@localhost attempt1 2>err &&
     -+	! grep "URL '\''https://username:<redacted>@localhost'\'' uses plaintext credentials" err &&
     -+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt1 2>err &&
     -+	grep "warning: URL '\''https://username:<redacted>@localhost'\'' uses plaintext credentials" err &&
     -+	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt2 2>err &&
     -+	grep "fatal: URL '\''https://username:<redacted>@localhost'\'' uses plaintext credentials" err
     ++	! grep "$message" err &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt2 2>err &&
     ++	grep "warning: $message" err >warnings &&
     ++	test_line_count = 2 warnings &&
     ++
     ++	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt3 2>err &&
     ++	grep "fatal: $message" err >warnings &&
     ++	test_line_count = 1 warnings
      +'
      +
      +test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
 2:  8e29ac807c6 < -:  ----------- usage: add warn_once() helper for repeated warnings


 Documentation/config/fetch.txt | 14 +++++++++++++
 remote.c                       | 37 ++++++++++++++++++++++++++++++++++
 t/t5516-fetch-push.sh          | 28 +++++++++++++++++++++++++
 t/t5601-clone.sh               | 19 +++++++++++++++++
 4 files changed, 98 insertions(+)

diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.txt
index cd65d236b43..0db7fe85bb8 100644
--- a/Documentation/config/fetch.txt
+++ b/Documentation/config/fetch.txt
@@ -96,3 +96,17 @@ fetch.writeCommitGraph::
 	merge and the write may take longer. Having an updated commit-graph
 	file helps performance of many Git commands, including `git merge-base`,
 	`git push -f`, and `git log --graph`. Defaults to false.
+
+fetch.credentialsInUrl::
+	A URL can contain plaintext credentials in the form
+	`<protocol>://<user>:<password>@<domain>/<path>`. Using such URLs
+	is not recommended as it exposes the password in multiple ways,
+	including Git storing the URL as plaintext in the repository config.
+	The `fetch.credentialsInUrl` option provides instruction for how Git
+	should react to seeing such a URL, with these values:
++
+* `allow` (default): Git will proceed with its activity without warning.
+* `warn`: Git will write a warning message to `stderr` when parsing a URL
+  with a plaintext credential.
+* `die`: Git will write a failure message to `stderr` when parsing a URL
+  with a plaintext credential.
diff --git a/remote.c b/remote.c
index 930fdc9c2f6..1f4a95e9840 100644
--- a/remote.c
+++ b/remote.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "config.h"
 #include "remote.h"
+#include "urlmatch.h"
 #include "refs.h"
 #include "refspec.h"
 #include "object-store.h"
@@ -614,6 +615,39 @@ const char *remote_ref_for_branch(struct branch *branch, int for_push)
 	return NULL;
 }
 
+static void validate_remote_url(struct remote *remote)
+{
+	int i;
+	const char *value;
+	struct strbuf redacted = STRBUF_INIT;
+
+	if (git_config_get_string_tmp("fetch.credentialsinurl", &value) ||
+	    !strcmp("allow", value))
+		return;
+
+	for (i = 0; i < remote->url_nr; i++) {
+		struct url_info url_info = { NULL };
+		url_normalize(remote->url[i], &url_info);
+
+		if (!url_info.passwd_len)
+			goto loop_cleanup;
+
+		strbuf_add(&redacted, url_info.url, url_info.passwd_off);
+		strbuf_addstr(&redacted, "<redacted>");
+		strbuf_addstr(&redacted, url_info.url + url_info.passwd_off + url_info.passwd_len);
+
+		if (!strcmp("warn", value))
+			warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
+		if (!strcmp("die", value))
+			die(_("URL '%s' uses plaintext credentials"), redacted.buf);
+
+loop_cleanup:
+		free(url_info.url);
+	}
+
+	strbuf_release(&redacted);
+}
+
 static struct remote *
 remotes_remote_get_1(struct remote_state *remote_state, const char *name,
 		     const char *(*get_default)(struct remote_state *,
@@ -639,6 +673,9 @@ remotes_remote_get_1(struct remote_state *remote_state, const char *name,
 		add_url_alias(remote_state, ret, name);
 	if (!valid_remote(ret))
 		return NULL;
+
+	validate_remote_url(ret);
+
 	return ret;
 }
 
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 4dfb080433e..4497617db7f 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -12,6 +12,7 @@ This test checks the following functionality:
 * --porcelain output format
 * hiderefs
 * reflogs
+* URL validation
 '
 
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
@@ -1813,4 +1814,31 @@ test_expect_success 'refuse to push a hidden ref, and make sure do not pollute t
 	test_dir_is_empty testrepo/.git/objects/pack
 '
 
+test_expect_success 'fetch warns or fails when using username:password' '
+	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
+	test_must_fail git -c fetch.credentialsInUrl=allow fetch https://username:password@localhost 2>err &&
+	! grep "$message" err &&
+
+	test_must_fail git -c fetch.credentialsInUrl=warn fetch https://username:password@localhost 2>err &&
+	grep "warning: $message" err >warnings &&
+	test_line_count = 3 warnings &&
+
+	test_must_fail git -c fetch.credentialsInUrl=die fetch https://username:password@localhost 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings
+'
+
+
+test_expect_success 'push warns or fails when using username:password' '
+	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
+	test_must_fail git -c fetch.credentialsInUrl=allow push https://username:password@localhost 2>err &&
+	! grep "$message" err &&
+
+	test_must_fail git -c fetch.credentialsInUrl=warn push https://username:password@localhost 2>err &&
+	grep "warning: $message" err >warnings &&
+	test_must_fail git -c fetch.credentialsInUrl=die push https://username:password@localhost 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings
+'
+
 test_done
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 4a61f2c901e..d03c19f5e07 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -71,6 +71,25 @@ test_expect_success 'clone respects GIT_WORK_TREE' '
 
 '
 
+test_expect_success 'clone warns or fails when using username:password' '
+	message="URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" &&
+	test_must_fail git -c fetch.credentialsInUrl=allow clone https://username:password@localhost attempt1 2>err &&
+	! grep "$message" err &&
+
+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt2 2>err &&
+	grep "warning: $message" err >warnings &&
+	test_line_count = 2 warnings &&
+
+	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt3 2>err &&
+	grep "fatal: $message" err >warnings &&
+	test_line_count = 1 warnings
+'
+
+test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username@localhost:8080 attempt3 2>err &&
+	! grep "uses plaintext credentials" err
+'
+
 test_expect_success 'clone from hooks' '
 
 	test_create_repo r0 &&

base-commit: 2668e3608e47494f2f10ef2b6e69f08a84816bcb
-- 
gitgitgadget

^ permalink raw reply related	[relevance 2%]

* [PATCH v3 0/2] fetch: create fetch.credentialsInUrl config
  2022-05-27 13:27  3% ` [PATCH v2] " Derrick Stolee via GitGitGadget
@ 2022-06-01  1:16  2%   ` Derrick Stolee via GitGitGadget
  2022-06-02 17:20  2%     ` [PATCH v4] remote: " Derrick Stolee via GitGitGadget
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee via GitGitGadget @ 2022-06-01  1:16 UTC (permalink / raw)
  To: git
  Cc: gitster, peff, me, avarab, christian.couder, johannes.schindelin,
	jrnieder, brian m. carlson, Robert Coup, Derrick Stolee

Users can specify credentials in their URL using the
username:password@domain format. This is potentially hazardous since the URL
is stored in plaintext and can also appear in trace2 logs and other places.
Add a new config option that allows warnings or failures when discovering
URLs with this format. The default behavior does not change in this series,
although we may want to move to the warn state by default in the future.

This is a modified version of the patch I submitted a while ago [1].

Based on the feedback, changing the behavior to fail by default was not a
good approach. Further, the idea to stop storing the credentials in config
and redirect them to a credential manager was already considered by Peff [2]
but not merged.

This patch does what should be the simplest thing we can do: create a config
option that will cause the user to get a warning or a failure, depending on
its value. The default is to ignore the setting, identical to the current
behavior. We can talk about changing this default to "warn" in the future,
but it would be safest to release with ignore as the default until we are
sure that we are not going to start warning on false positives.

This patch would be sufficient for the interested internal parties that want
to prevent users from storing credentials this way. System administrators
can modify system-level Git config into "die" mode to prevent this behavior.

[1]
https://lore.kernel.org/git/pull.945.git.1619807844627.gitgitgadget@gmail.com
Reject passwords in URLs (April 2021).

[2]
https://lore.kernel.org/git/20190519050724.GA26179@sigill.intra.peff.net/
Re: Git ransom campaign incident report - May 2019


Updates in v3
=============

 * Because of some flaky behavior around SIGPIPE, the URL check needed to
   move to be earlier in the command.
 * For this reason, I moved the cred check into remote.c's valid_remote()
   check. This changed the previous BUG() statements into early returns.
 * I repeated the check with the test suite to see if this parsing fails on
   any existing cases, but it is worth double-checking the parsing rules.
 * Documentation is more consistent about using placeholders.
 * A test for the "allow" case is now included.
 * A new patch is added that creates the warn_once() helper. This reduces
   multiple advisory warnings with the same text from being written by the
   same process.


Updates in v2
=============

 * Documentation is slightly expanded to include the fact that Git stores
   the given URL as plaintext in its config.
 * The new method has a new documentation comment that details the necessary
   preconditions.
 * "ignore" is now "allow"
 * Additional checks on colon_ptr are added.
 * Use strbuf_splice() instead of custom string-walking logic.
 * Use "" instead of asterisks.
 * Config value checks are no longer case sensitive.

Thanks, -Stolee

Derrick Stolee (2):
  remote: create fetch.credentialsInUrl config
  usage: add warn_once() helper for repeated warnings

 Documentation/config/fetch.txt | 14 ++++++++++
 git-compat-util.h              |  1 +
 remote.c                       | 48 ++++++++++++++++++++++++++++++++++
 t/t5601-clone.sh               | 17 ++++++++++++
 usage.c                        | 22 ++++++++++++++++
 5 files changed, 102 insertions(+)


base-commit: f9b95943b68b6b8ca5a6072f50a08411c6449b55
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1237%2Fderrickstolee%2Fcreds-in-url-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1237/derrickstolee/creds-in-url-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1237

Range-diff vs v2:

 1:  364f5c37c70 ! 1:  083a918e9b1 urlmatch: create fetch.credentialsInUrl config
     @@ Metadata
      Author: Derrick Stolee <derrickstolee@github.com>
      
       ## Commit message ##
     -    urlmatch: create fetch.credentialsInUrl config
     +    remote: create fetch.credentialsInUrl config
      
          Users sometimes provide a "username:password" combination in their
          plaintext URLs. Since Git stores these URLs in plaintext in the
     @@ Commit message
          advice about setting fetch.credentialsInUrl=ignore for users who still
          want to follow this pattern (and not receive the warning).
      
     +    An earlier version of this change injected the logic into
     +    url_normalize() in urlmatch.c. While most code paths that parse URLs
     +    eventually normalize the URL, that normalization does not happen early
     +    enough in the stack to avoid attempting connections to the URL first. By
     +    inserting a check into the remote validation, we identify the issue
     +    before making a connection. In the old code path, this was revealed by
     +    testing the new t5601-clone.sh test under --stress, resulting in an
     +    instance where the return code was 13 (SIGPIPE) instead of 128 from the
     +    die().
     +
     +    Since we are not deep within url_normalize(), we need to do our own
     +    parsing to detect if there is a "username:password@domain" section. We
     +    begin by detecting the first '@' symbol in the URL. We then detect if
     +    there is a scheme such as "https://" by finding the first slash. If that
     +    slash does not exist or is after the first '@' symbol, then we consider
     +    the scheme to be complete before the URL. Finally, we look for a colon
     +    between the scheme and the '@' symbol, indicating a "username:password"
     +    string. Replace the password with "<redacted>" when writing the error
     +    message.
     +
          As an attempt to ensure the parsing logic did not catch any
          unintentional cases, I modified this change locally to to use the "die"
          option by default. Running the test suite succeeds except for the
     @@ Documentation/config/fetch.txt: fetch.writeCommitGraph::
      +
      +fetch.credentialsInUrl::
      +	A URL can contain plaintext credentials in the form
     -+	`protocol://<user>:<password>@domain/path`. Using such URLs is not
     -+	recommended as it exposes the password in multiple ways, including
     -+	Git storing the URL as plaintext in the repository config. The
     -+	`fetch.credentialsInUrl` option provides instruction for how Git
     ++	`<protocol>://<user>:<password>@<domain>/<path>`. Using such URLs
     ++	is not recommended as it exposes the password in multiple ways,
     ++	including Git storing the URL as plaintext in the repository config.
     ++	The `fetch.credentialsInUrl` option provides instruction for how Git
      +	should react to seeing such a URL, with these values:
      ++
      +* `allow` (default): Git will proceed with its activity without warning.
     @@ Documentation/config/fetch.txt: fetch.writeCommitGraph::
      +* `die`: Git will write a failure message to `stderr` when parsing a URL
      +  with a plaintext credential.
      
     - ## t/t5601-clone.sh ##
     -@@ t/t5601-clone.sh: test_expect_success 'clone respects GIT_WORK_TREE' '
     - 
     - '
     - 
     -+test_expect_success 'clone warns or fails when using username:password' '
     -+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt1 2>err &&
     -+	grep "warning: URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" err &&
     -+	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt2 2>err &&
     -+	grep "fatal: URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" err
     -+'
     -+
     -+test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
     -+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username@localhost:8080 attempt3 2>err &&
     -+	! grep "uses plaintext credentials" err
     -+'
     -+
     - test_expect_success 'clone from hooks' '
     - 
     - 	test_create_repo r0 &&
     -
     - ## urlmatch.c ##
     -@@
     - #include "cache.h"
     - #include "urlmatch.h"
     -+#include "config.h"
     - 
     - #define URL_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
     - #define URL_DIGIT "0123456789"
     -@@ urlmatch.c: static int match_host(const struct url_info *url_info,
     - 	return (!url_len && !pat_len);
     - }
     + ## remote.c ##
     +@@ remote.c: struct counted_string {
     + 	const char *s;
     + };
       
      +/*
     -+ * Call this method when we have detected credentials within the 'url' in
     -+ * the form
     ++ * Check if the given URL is of the following form:
      + *
      + *     scheme://username:password@domain[:port][/path]
      + *
     -+ * The 'scheme_len' value should be equal to the string length of the
     -+ * "scheme://" portion of the URL.
     ++ * Specifically, see if the ":password@" section of the URL appears.
      + *
      + * The fetch.credentialsInUrl config indicates what to do on such a URL,
     -+ * either ignoring, warning, or die()ing. The latter two modes write a
     ++ * either ignoring, warning, or erroring. The latter two modes write a
      + * redacted URL to stderr.
      + */
     -+static void detected_credentials_in_url(const char *url, size_t scheme_len)
     ++static void check_if_creds_in_url(const char *url)
      +{
     -+	const char *value;
     -+	const char *at_ptr;
     -+	const char *colon_ptr;
     ++	const char *value, *scheme_ptr, *colon_ptr, *at_ptr;
      +	struct strbuf redacted = STRBUF_INIT;
      +
      +	/* "allow" is the default behavior. */
     @@ urlmatch.c: static int match_host(const struct url_info *url_info,
      +	    !strcmp("allow", value))
      +		return;
      +
     -+	at_ptr = strchr(url, '@');
     -+	colon_ptr = strchr(url + scheme_len + 3, ':');
     ++	if (!(at_ptr = strchr(url, '@')))
     ++		return;
      +
     -+	/*
     -+	 * Let's do some defensive programming to ensure the given
     -+	 * URL is of the proper format.
     -+	 */
     -+	if (!colon_ptr)
     -+		BUG("failed to find colon in url '%s' with scheme_len %"PRIuMAX,
     -+		    url, (uintmax_t) scheme_len);
     -+	if (colon_ptr > at_ptr)
     -+		BUG("input url '%s' does not include credentials",
     -+		    url);
     ++	if (!(scheme_ptr = strchr(url, '/')) ||
     ++	    scheme_ptr > at_ptr)
     ++		scheme_ptr = url;
     ++
     ++	if (!(colon_ptr = strchr(scheme_ptr, ':')))
     ++		return;
      +
      +	/* Include the colon when creating the redacted URL. */
      +	colon_ptr++;
     @@ urlmatch.c: static int match_host(const struct url_info *url_info,
      +	strbuf_release(&redacted);
      +}
      +
     - static char *url_normalize_1(const char *url, struct url_info *out_info, char allow_globs)
     + static int valid_remote(const struct remote *remote)
       {
     - 	/*
     -@@ urlmatch.c: static char *url_normalize_1(const char *url, struct url_info *out_info, char al
     - 	 */
     ++	for (int i = 0; i < remote->url_nr; i++)
     ++		check_if_creds_in_url(remote->url[i]);
     ++
     + 	return (!!remote->url) || (!!remote->foreign_vcs);
     + }
     + 
     +
     + ## t/t5601-clone.sh ##
     +@@ t/t5601-clone.sh: test_expect_success 'clone respects GIT_WORK_TREE' '
     + 
     + '
       
     - 	size_t url_len = strlen(url);
     -+	const char *orig_url = url;
     - 	struct strbuf norm;
     - 	size_t spanned;
     - 	size_t scheme_len, user_off=0, user_len=0, passwd_off=0, passwd_len=0;
     -@@ urlmatch.c: static char *url_normalize_1(const char *url, struct url_info *out_info, char al
     - 			}
     - 			colon_ptr = strchr(norm.buf + scheme_len + 3, ':');
     - 			if (colon_ptr) {
     -+				detected_credentials_in_url(orig_url, scheme_len);
     - 				passwd_off = (colon_ptr + 1) - norm.buf;
     - 				passwd_len = norm.len - passwd_off;
     - 				user_len = (passwd_off - 1) - (scheme_len + 3);
     ++test_expect_success 'clone warns or fails when using username:password' '
     ++	test_must_fail git -c fetch.credentialsInUrl=allow clone https://username:password@localhost attempt1 2>err &&
     ++	! grep "URL '\''https://username:<redacted>@localhost'\'' uses plaintext credentials" err &&
     ++	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt1 2>err &&
     ++	grep "warning: URL '\''https://username:<redacted>@localhost'\'' uses plaintext credentials" err &&
     ++	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt2 2>err &&
     ++	grep "fatal: URL '\''https://username:<redacted>@localhost'\'' uses plaintext credentials" err
     ++'
     ++
     ++test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
     ++	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username@localhost:8080 attempt3 2>err &&
     ++	! grep "uses plaintext credentials" err
     ++'
     ++
     + test_expect_success 'clone from hooks' '
     + 
     + 	test_create_repo r0 &&
 -:  ----------- > 2:  8e29ac807c6 usage: add warn_once() helper for repeated warnings

-- 
gitgitgadget

^ permalink raw reply	[relevance 2%]

* [PATCH v2] urlmatch: create fetch.credentialsInUrl config
  @ 2022-05-27 13:27  3% ` Derrick Stolee via GitGitGadget
  2022-06-01  1:16  2%   ` [PATCH v3 0/2] fetch: " Derrick Stolee via GitGitGadget
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee via GitGitGadget @ 2022-05-27 13:27 UTC (permalink / raw)
  To: git
  Cc: gitster, peff, me, avarab, christian.couder, johannes.schindelin,
	jrnieder, brian m. carlson, Robert Coup, Derrick Stolee,
	Derrick Stolee

From: Derrick Stolee <derrickstolee@github.com>

Users sometimes provide a "username:password" combination in their
plaintext URLs. Since Git stores these URLs in plaintext in the
.git/config file, this is a very insecure way of storing these
credentials. Credential managers are a more secure way of storing this
information.

System administrators might want to prevent this kind of use by users on
their machines.

Create a new "fetch.credentialsInUrl" config option and teach Git to
warn or die when seeing a URL with this kind of information. The warning
anonymizes the sensitive information of the URL to be clear about the
issue.

This change currently defaults the behavior to "allow" which does
nothing with these URLs. We can consider changing this behavior to
"warn" by default if we wish. At that time, we may want to add some
advice about setting fetch.credentialsInUrl=ignore for users who still
want to follow this pattern (and not receive the warning).

As an attempt to ensure the parsing logic did not catch any
unintentional cases, I modified this change locally to to use the "die"
option by default. Running the test suite succeeds except for the
explicit username:password URLs used in t5550-http-fetch-dumb.sh and
t5541-http-push-smart.sh. This means that all other tested URLs did not
trigger this logic.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
---
    urlmatch: create fetch.credentialsInUrl config
    
    This is a modified version of the patch I submitted a while ago [1].
    
    Based on the feedback, changing the behavior to fail by default was not
    a good approach. Further, the idea to stop storing the credentials in
    config and redirect them to a credential manager was already considered
    by Peff [2] but not merged.
    
    This patch does what should be the simplest thing we can do: create a
    config option that will cause the user to get a warning or a failure,
    depending on its value. The default is to ignore the setting, identical
    to the current behavior. We can talk about changing this default to
    "warn" in the future, but it would be safest to release with ignore as
    the default until we are sure that we are not going to start warning on
    false positives.
    
    This patch would be sufficient for the interested internal parties that
    want to prevent users from storing credentials this way. System
    administrators can modify system-level Git config into "die" mode to
    prevent this behavior.
    
    [1]
    https://lore.kernel.org/git/pull.945.git.1619807844627.gitgitgadget@gmail.com
    Reject passwords in URLs (April 2021).
    
    [2]
    https://lore.kernel.org/git/20190519050724.GA26179@sigill.intra.peff.net/
    Re: Git ransom campaign incident report - May 2019
    
    
    Updates in v2
    =============
    
     * Documentation is slightly expanded to include the fact that Git
       stores the given URL as plaintext in its config.
     * The new method has a new documentation comment that details the
       necessary preconditions.
     * "ignore" is now "allow"
     * Additional checks on colon_ptr are added.
     * Use strbuf_splice() instead of custom string-walking logic.
     * Use "" instead of asterisks.
     * Config value checks are no longer case sensitive.
    
    Thanks, -Stolee

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1237%2Fderrickstolee%2Fcreds-in-url-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1237/derrickstolee/creds-in-url-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1237

Range-diff vs v1:

 1:  cc2befb3803 ! 1:  364f5c37c70 urlmatch: create fetch.credentialsInUrl config
     @@ Commit message
          anonymizes the sensitive information of the URL to be clear about the
          issue.
      
     -    This change currently defaults the behavior to "ignore" which does
     +    This change currently defaults the behavior to "allow" which does
          nothing with these URLs. We can consider changing this behavior to
          "warn" by default if we wish. At that time, we may want to add some
          advice about setting fetch.credentialsInUrl=ignore for users who still
     @@ Commit message
          As an attempt to ensure the parsing logic did not catch any
          unintentional cases, I modified this change locally to to use the "die"
          option by default. Running the test suite succeeds except for the
     -    explicit username:password URLs used in t5550-http-fetch-dumb.s and
     +    explicit username:password URLs used in t5550-http-fetch-dumb.sh and
          t5541-http-push-smart.sh. This means that all other tested URLs did not
          trigger this logic.
      
     @@ Documentation/config/fetch.txt: fetch.writeCommitGraph::
      +fetch.credentialsInUrl::
      +	A URL can contain plaintext credentials in the form
      +	`protocol://<user>:<password>@domain/path`. Using such URLs is not
     -+	recommended as it exposes the password in multiple ways. The
     ++	recommended as it exposes the password in multiple ways, including
     ++	Git storing the URL as plaintext in the repository config. The
      +	`fetch.credentialsInUrl` option provides instruction for how Git
      +	should react to seeing such a URL, with these values:
      ++
     -+* `ignore` (default): Git will proceed with its activity without warning.
     ++* `allow` (default): Git will proceed with its activity without warning.
      +* `warn`: Git will write a warning message to `stderr` when parsing a URL
      +  with a plaintext credential.
      +* `die`: Git will write a failure message to `stderr` when parsing a URL
     @@ t/t5601-clone.sh: test_expect_success 'clone respects GIT_WORK_TREE' '
       
      +test_expect_success 'clone warns or fails when using username:password' '
      +	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt1 2>err &&
     -+	grep "warning: URL '\''https://username:\*\*\*\*\*\*\*\*@localhost/'\'' uses plaintext credentials" err &&
     ++	grep "warning: URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" err &&
      +	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt2 2>err &&
     -+	grep "fatal: URL '\''https://username:\*\*\*\*\*\*\*\*@localhost/'\'' uses plaintext credentials" err
     ++	grep "fatal: URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" err
     ++'
     ++
     ++test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
     ++	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username@localhost:8080 attempt3 2>err &&
     ++	! grep "uses plaintext credentials" err
      +'
      +
       test_expect_success 'clone from hooks' '
     @@ urlmatch.c: static int match_host(const struct url_info *url_info,
       	return (!url_len && !pat_len);
       }
       
     ++/*
     ++ * Call this method when we have detected credentials within the 'url' in
     ++ * the form
     ++ *
     ++ *     scheme://username:password@domain[:port][/path]
     ++ *
     ++ * The 'scheme_len' value should be equal to the string length of the
     ++ * "scheme://" portion of the URL.
     ++ *
     ++ * The fetch.credentialsInUrl config indicates what to do on such a URL,
     ++ * either ignoring, warning, or die()ing. The latter two modes write a
     ++ * redacted URL to stderr.
     ++ */
      +static void detected_credentials_in_url(const char *url, size_t scheme_len)
      +{
     -+	char *value = NULL;
     ++	const char *value;
      +	const char *at_ptr;
      +	const char *colon_ptr;
     -+	struct strbuf anonymized = STRBUF_INIT;
     ++	struct strbuf redacted = STRBUF_INIT;
      +
     -+	/* "ignore" is the default behavior. */
     -+	if (git_config_get_string("fetch.credentialsinurl", &value) ||
     -+	    !strcasecmp("ignore", value))
     -+		goto cleanup;
     ++	/* "allow" is the default behavior. */
     ++	if (git_config_get_string_tmp("fetch.credentialsinurl", &value) ||
     ++	    !strcmp("allow", value))
     ++		return;
      +
      +	at_ptr = strchr(url, '@');
      +	colon_ptr = strchr(url + scheme_len + 3, ':');
      +
     ++	/*
     ++	 * Let's do some defensive programming to ensure the given
     ++	 * URL is of the proper format.
     ++	 */
      +	if (!colon_ptr)
      +		BUG("failed to find colon in url '%s' with scheme_len %"PRIuMAX,
      +		    url, (uintmax_t) scheme_len);
     ++	if (colon_ptr > at_ptr)
     ++		BUG("input url '%s' does not include credentials",
     ++		    url);
      +
     -+	/* Include everything including the colon. */
     ++	/* Include the colon when creating the redacted URL. */
      +	colon_ptr++;
     -+	strbuf_add(&anonymized, url, colon_ptr - url);
     -+
     -+	while (colon_ptr < at_ptr) {
     -+		strbuf_addch(&anonymized, '*');
     -+		colon_ptr++;
     -+	}
     -+
     -+	strbuf_addstr(&anonymized, at_ptr);
     ++	strbuf_addstr(&redacted, url);
     ++	strbuf_splice(&redacted, colon_ptr - url, at_ptr - colon_ptr,
     ++		      "<redacted>", 10);
      +
     -+	if (!strcasecmp("warn", value))
     -+		warning(_("URL '%s' uses plaintext credentials"), anonymized.buf);
     -+	if (!strcasecmp("die", value))
     -+		die(_("URL '%s' uses plaintext credentials"), anonymized.buf);
     ++	if (!strcmp("warn", value))
     ++		warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
     ++	if (!strcmp("die", value))
     ++		die(_("URL '%s' uses plaintext credentials"), redacted.buf);
      +
     -+cleanup:
     -+	free(value);
     -+	strbuf_release(&anonymized);
     ++	strbuf_release(&redacted);
      +}
      +
       static char *url_normalize_1(const char *url, struct url_info *out_info, char allow_globs)


 Documentation/config/fetch.txt | 14 +++++++++
 t/t5601-clone.sh               | 12 ++++++++
 urlmatch.c                     | 56 ++++++++++++++++++++++++++++++++++
 3 files changed, 82 insertions(+)

diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.txt
index cd65d236b43..7fd3ea89f5d 100644
--- a/Documentation/config/fetch.txt
+++ b/Documentation/config/fetch.txt
@@ -96,3 +96,17 @@ fetch.writeCommitGraph::
 	merge and the write may take longer. Having an updated commit-graph
 	file helps performance of many Git commands, including `git merge-base`,
 	`git push -f`, and `git log --graph`. Defaults to false.
+
+fetch.credentialsInUrl::
+	A URL can contain plaintext credentials in the form
+	`protocol://<user>:<password>@domain/path`. Using such URLs is not
+	recommended as it exposes the password in multiple ways, including
+	Git storing the URL as plaintext in the repository config. The
+	`fetch.credentialsInUrl` option provides instruction for how Git
+	should react to seeing such a URL, with these values:
++
+* `allow` (default): Git will proceed with its activity without warning.
+* `warn`: Git will write a warning message to `stderr` when parsing a URL
+  with a plaintext credential.
+* `die`: Git will write a failure message to `stderr` when parsing a URL
+  with a plaintext credential.
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 4a61f2c901e..387da74d175 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -71,6 +71,18 @@ test_expect_success 'clone respects GIT_WORK_TREE' '
 
 '
 
+test_expect_success 'clone warns or fails when using username:password' '
+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username:password@localhost attempt1 2>err &&
+	grep "warning: URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" err &&
+	test_must_fail git -c fetch.credentialsInUrl=die clone https://username:password@localhost attempt2 2>err &&
+	grep "fatal: URL '\''https://username:<redacted>@localhost/'\'' uses plaintext credentials" err
+'
+
+test_expect_success 'clone does not detect username:password when it is https://username@domain:port/' '
+	test_must_fail git -c fetch.credentialsInUrl=warn clone https://username@localhost:8080 attempt3 2>err &&
+	! grep "uses plaintext credentials" err
+'
+
 test_expect_success 'clone from hooks' '
 
 	test_create_repo r0 &&
diff --git a/urlmatch.c b/urlmatch.c
index b615adc923a..16beda37a3a 100644
--- a/urlmatch.c
+++ b/urlmatch.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "urlmatch.h"
+#include "config.h"
 
 #define URL_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
 #define URL_DIGIT "0123456789"
@@ -106,6 +107,59 @@ static int match_host(const struct url_info *url_info,
 	return (!url_len && !pat_len);
 }
 
+/*
+ * Call this method when we have detected credentials within the 'url' in
+ * the form
+ *
+ *     scheme://username:password@domain[:port][/path]
+ *
+ * The 'scheme_len' value should be equal to the string length of the
+ * "scheme://" portion of the URL.
+ *
+ * The fetch.credentialsInUrl config indicates what to do on such a URL,
+ * either ignoring, warning, or die()ing. The latter two modes write a
+ * redacted URL to stderr.
+ */
+static void detected_credentials_in_url(const char *url, size_t scheme_len)
+{
+	const char *value;
+	const char *at_ptr;
+	const char *colon_ptr;
+	struct strbuf redacted = STRBUF_INIT;
+
+	/* "allow" is the default behavior. */
+	if (git_config_get_string_tmp("fetch.credentialsinurl", &value) ||
+	    !strcmp("allow", value))
+		return;
+
+	at_ptr = strchr(url, '@');
+	colon_ptr = strchr(url + scheme_len + 3, ':');
+
+	/*
+	 * Let's do some defensive programming to ensure the given
+	 * URL is of the proper format.
+	 */
+	if (!colon_ptr)
+		BUG("failed to find colon in url '%s' with scheme_len %"PRIuMAX,
+		    url, (uintmax_t) scheme_len);
+	if (colon_ptr > at_ptr)
+		BUG("input url '%s' does not include credentials",
+		    url);
+
+	/* Include the colon when creating the redacted URL. */
+	colon_ptr++;
+	strbuf_addstr(&redacted, url);
+	strbuf_splice(&redacted, colon_ptr - url, at_ptr - colon_ptr,
+		      "<redacted>", 10);
+
+	if (!strcmp("warn", value))
+		warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
+	if (!strcmp("die", value))
+		die(_("URL '%s' uses plaintext credentials"), redacted.buf);
+
+	strbuf_release(&redacted);
+}
+
 static char *url_normalize_1(const char *url, struct url_info *out_info, char allow_globs)
 {
 	/*
@@ -144,6 +198,7 @@ static char *url_normalize_1(const char *url, struct url_info *out_info, char al
 	 */
 
 	size_t url_len = strlen(url);
+	const char *orig_url = url;
 	struct strbuf norm;
 	size_t spanned;
 	size_t scheme_len, user_off=0, user_len=0, passwd_off=0, passwd_len=0;
@@ -191,6 +246,7 @@ static char *url_normalize_1(const char *url, struct url_info *out_info, char al
 			}
 			colon_ptr = strchr(norm.buf + scheme_len + 3, ':');
 			if (colon_ptr) {
+				detected_credentials_in_url(orig_url, scheme_len);
 				passwd_off = (colon_ptr + 1) - norm.buf;
 				passwd_len = norm.len - passwd_off;
 				user_len = (passwd_off - 1) - (scheme_len + 3);

base-commit: f9b95943b68b6b8ca5a6072f50a08411c6449b55
-- 
gitgitgadget

^ permalink raw reply related	[relevance 3%]

* [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 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
  1 sibling, 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
  1 sibling, 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: Git bug report - disk errors on Windows after push
  @ 2022-04-21  2:29  5%       ` Attila Csosz
  0 siblings, 0 replies; 200+ results
From: Attila Csosz @ 2022-04-21  2:29 UTC (permalink / raw)
  To: neerajsi; +Cc: brian m. carlson, git

Please check this link also
https://github.community/t/what-could-be-the-reason-my-git-repositories-keep-getting-corrupted-broken/184711

You can found many link on web on 'git corrupted repository'. In my
opinion when a git repository is corrupted on Windows there is a good
chance to HDD errors.

I suggest also run intensive test on Windows (run a bat file commiting
and pushing to a bare directory type repository). Check your HDD
healthy status after 10-20 run of 'git push'.

My git software is come form 'git-scm.com' and I'm using TortoiseGit.
My git software is up to date.
Last time my laptop HDD is crashed loosing sensitive datas. I will
never push to a local repo I'm using online repo-s like github.

///
fsutil fsinfo volumeinfo e:
Volume Name : Seagate Backup Plus Drive
Volume Serial Number : <removed by hand>
Max Component Length : 255
File System Name : NTFS
Is ReadWrite
Not Thinly-Provisioned
Supports Case-sensitive filenames
Preserves Case of filenames
Supports Unicode in filenames
Preserves & Enforces ACL's
Supports file-based Compression
Supports Disk Quotas
Supports Sparse files
Supports Reparse Points
Returns Handle Close Result Information
Supports POSIX-style Unlink and Rename
Supports Object Identifiers
Supports Encrypted File System
Supports Named Streams
Supports Transactions
Supports Hard Links
Supports Extended Attributes
Supports Open By FileID
Supports USN Journal
///

Maybe this email not reaching the main mailing list I'm somehow blacklisted.


Attila

On Thu, Apr 21, 2022 at 12:54 AM Neeraj Singh <nksingh85@gmail.com> wrote:
>
> On 4/18/2022 8:52 PM, Attila Csosz wrote:
> > I've experienced the problem at least 3 different external disk.
> > I'm not using cloud syncing service (e.g., Dropbox or OneDrive) for git.
> >
> > Attila
> >
> Hi Attila,
> Could you please share a bit more information about the disks that are
> being corrupted and the specific error messages you're seeing?
>
> What is the underlying storage type (e.g. USB key, external hard drive,
> etc)?  Also, which filesystem is the drive formatted as?
>
> Could you please save one instance of a volume in the corrupted state so
> that we can consider further investigations?
>
> I believe the output of "fsutil fsinfo volumeinfo <drive letter>" and
> "fsutil fsinfo drivetype <drive letter>" should give us some useful info
> about the volume that's being corrupted.
>
> Thanks,
> Neeraj Singh,
> Windows FileSystem Dev

^ permalink raw reply	[relevance 5%]

* Re: [PATCH 02/23] t7527: test FS event reporing on macOS WRT case and Unicode
  2022-03-04 23:40  0%       ` Jeff Hostetler
@ 2022-03-05  8:59  0%         ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
  0 siblings, 0 replies; 200+ results
From: Torsten =?unknown-8bit?Q?B=C3=B6gershausen?= @ 2022-03-05  8:59 UTC (permalink / raw)
  To: Jeff Hostetler
  Cc: Derrick Stolee, Jeff Hostetler via GitGitGadget, git,
	Jeff Hostetler

On Fri, Mar 04, 2022 at 06:40:27PM -0500, Jeff Hostetler wrote:
>
>
> On 2/24/22 12:33 PM, Torsten =?unknown-8bit?Q?B=C3=B6gershausen?= wrote:
> > On Thu, Feb 24, 2022 at 09:52:28AM -0500, Derrick Stolee wrote:
> > > On 2/15/2022 10:59 AM, Jeff Hostetler via GitGitGadget wrote:
> > > > From: Jeff Hostetler <jeffhost@microsoft.com>
> > > >
> > > > Confirm that macOS FS events are reported with a normalized spelling.
> > > >
> > > > APFS (and/or HFS+) is case-insensitive.  This means that case-independent
> >
> > This is not true, strictly speaking.
> > You can format a disk with "case sensitive" or "case-insenstive, case preserving".
> > Both APFS and HFS+  can be formated that way.
> > The default, which is what you get when you get a new machine,
> > is "case-insenstive, case preserving".
> > And I assume, that more 99% of all disks are formated that way.
> > The "core.ignorecase" is used in the same way as it is used under NTFS,
> > FAT or all other case-insenstive file systems.
> > (and even ext4 can be formated case-insensitive these days.)
> >
> > An interesting article can be found here:
> > https://lwn.net/Articles/784041/
> >
> > And to be technically correct, I think that even NTFS can be
> > "configured to be case insensitive in an empty directory".
> >
> > In that sense, I would like to avoid this statement, which
> > file system is case insensitive, and which is not.
> > Git assumes that after probing the FS in "git init" we have
> > a valid configuration in core.ignorecase.
>
> You're right. I was incorrectly glossing over the differences
> between APFS and HFS+ -- and conflating case and nfc/nfd
> issues.
>
> [...]
> > >
> > > > NEEDSWORK: I was only able to test case.  It would be nice to add tests
> > >
> > > "I was only able test the APFS case."?
>
> I'm going to completely redo this commit in the next version.
> I now have both APFS and HFS+ partitions on my machine and
> can compare the differences in behaviors and will have a new
> set of tests to cover this.
>
> > >
> > > > that use different Unicode spellings/normalizations and understand the
> > > > differences between APFS and HFS+ in this area.  We should confirm that
> > > > the spelling of the workdir paths that the daemon sends to clients are
> > > > always properly normalized.
> > >
> > > Are there any macOS experts out there who can help us find the answers
> > > to these questions?
> >
> > There is a difference between HFS+ and APFS.
> > HFS+  is "unicode decomposing" when you call readdir() - file names
> > are stored decomposed on disk once created.
> > However, opening  file in precompsed form succeds.
> > In that sense I would strongly suspect, that any monitors are "sending"
> > the decomposed form (on HFS+).
> >
> > APFS does not manipulate file names in that way, it is
> > "unicode normalization preserving and ignoring".
>
> It took a few hours of poking to figure out what Apple is doing,
> but yes on HFS+ they convert to NFD and use that as the on-disk
> format.  And they do collision detection as they always have in
> NFD-space.
>
> Whereas on APFS, they preserve the NFC/NFD as given when the file
> is created, but always do the same collision detection in NFD-space.
> The net result is similar, but subtlety different.

That depends what you mean with "net result".
What Git sees after calling precompose_utf8_readdir() with
core.precomposeunicode=true ?


>
> FS Events from MacOS are sent using the on-disk format (NFD on HFS+
> and whichever on APFS) and my FSMonitor daemon is sending them to
> the client as received.
>
> I'm not sure whether or not the daemon should respect the
> `core.precompseUnicode` setting and when watching an HFS+
> volume do the NFD-->NFC conversion for the client.  I'm not
> sure whether that would be any more or less correct than just
> reporting the paths as received.  I'm going to leave this as a
> question for the future.

I think that I have a suggestion for an answer:
We still have HFS+ systems around, and we still have an NFD feature
in MacOs for USB sticks with FAT or SAMBA mounted network volumes.
Both return NFD in readdir().
Even if NFC is on disk for FAT or going over the wire for SAMBA.
Having a precompose() function in the FSMonitor would help to make
things consistent.
And the answer is yes.

>
>
> Thanks for all of your background information on this topic.
> Jeff
>

The pleasure is on my side.
Please feel free to cc me for the next round, so that I don't miss
to review them.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 02/23] t7527: test FS event reporing on macOS WRT case and Unicode
  2022-02-24 17:33  5%     ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
  2022-03-04 23:40  0%       ` Jeff Hostetler
@ 2022-03-04 23:47  5%       ` Jeff Hostetler
  1 sibling, 0 replies; 200+ results
From: Jeff Hostetler @ 2022-03-04 23:47 UTC (permalink / raw)
  To: Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=, Derrick Stolee
  Cc: Jeff Hostetler via GitGitGadget, git, Jeff Hostetler



On 2/24/22 12:33 PM, Torsten =?unknown-8bit?Q?B=C3=B6gershausen?= wrote:
> On Thu, Feb 24, 2022 at 09:52:28AM -0500, Derrick Stolee wrote:
>> On 2/15/2022 10:59 AM, Jeff Hostetler via GitGitGadget wrote:
>>> From: Jeff Hostetler <jeffhost@microsoft.com>
>>>
>>> Confirm that macOS FS events are reported with a normalized spelling.
>>>
>>> APFS (and/or HFS+) is case-insensitive.  This means that case-independent
> 
[...]
> 
> An interesting article can be found here:
> https://lwn.net/Articles/784041/
> 
> And to be technically correct, I think that even NTFS can be
> "configured to be case insensitive in an empty directory".

Yes, it is now possible to have NTFS be case sensitive (on a
directory by directory basis).  I haven't had a chance to
experiment with this yet, but I'm hoping that if we can always
have the daemon report using the on-disk spelling, we can
avoid most of this insanity.

Thanks,
Jeff

^ permalink raw reply	[relevance 5%]

* Re: [PATCH 02/23] t7527: test FS event reporing on macOS WRT case and Unicode
  2022-02-24 17:33  5%     ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
@ 2022-03-04 23:40  0%       ` Jeff Hostetler
  2022-03-05  8:59  0%         ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
  2022-03-04 23:47  5%       ` Jeff Hostetler
  1 sibling, 1 reply; 200+ results
From: Jeff Hostetler @ 2022-03-04 23:40 UTC (permalink / raw)
  To: Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=, Derrick Stolee
  Cc: Jeff Hostetler via GitGitGadget, git, Jeff Hostetler



On 2/24/22 12:33 PM, Torsten =?unknown-8bit?Q?B=C3=B6gershausen?= wrote:
> On Thu, Feb 24, 2022 at 09:52:28AM -0500, Derrick Stolee wrote:
>> On 2/15/2022 10:59 AM, Jeff Hostetler via GitGitGadget wrote:
>>> From: Jeff Hostetler <jeffhost@microsoft.com>
>>>
>>> Confirm that macOS FS events are reported with a normalized spelling.
>>>
>>> APFS (and/or HFS+) is case-insensitive.  This means that case-independent
> 
> This is not true, strictly speaking.
> You can format a disk with "case sensitive" or "case-insenstive, case preserving".
> Both APFS and HFS+  can be formated that way.
> The default, which is what you get when you get a new machine,
> is "case-insenstive, case preserving".
> And I assume, that more 99% of all disks are formated that way.
> The "core.ignorecase" is used in the same way as it is used under NTFS,
> FAT or all other case-insenstive file systems.
> (and even ext4 can be formated case-insensitive these days.)
> 
> An interesting article can be found here:
> https://lwn.net/Articles/784041/
> 
> And to be technically correct, I think that even NTFS can be
> "configured to be case insensitive in an empty directory".
> 
> In that sense, I would like to avoid this statement, which
> file system is case insensitive, and which is not.
> Git assumes that after probing the FS in "git init" we have
> a valid configuration in core.ignorecase.

You're right. I was incorrectly glossing over the differences
between APFS and HFS+ -- and conflating case and nfc/nfd
issues.

[...]
>>
>>> NEEDSWORK: I was only able to test case.  It would be nice to add tests
>>
>> "I was only able test the APFS case."?

I'm going to completely redo this commit in the next version.
I now have both APFS and HFS+ partitions on my machine and
can compare the differences in behaviors and will have a new
set of tests to cover this.

>>
>>> that use different Unicode spellings/normalizations and understand the
>>> differences between APFS and HFS+ in this area.  We should confirm that
>>> the spelling of the workdir paths that the daemon sends to clients are
>>> always properly normalized.
>>
>> Are there any macOS experts out there who can help us find the answers
>> to these questions?
> 
> There is a difference between HFS+ and APFS.
> HFS+  is "unicode decomposing" when you call readdir() - file names
> are stored decomposed on disk once created.
> However, opening  file in precompsed form succeds.
> In that sense I would strongly suspect, that any monitors are "sending"
> the decomposed form (on HFS+).
> 
> APFS does not manipulate file names in that way, it is
> "unicode normalization preserving and ignoring".

It took a few hours of poking to figure out what Apple is doing,
but yes on HFS+ they convert to NFD and use that as the on-disk
format.  And they do collision detection as they always have in
NFD-space.

Whereas on APFS, they preserve the NFC/NFD as given when the file
is created, but always do the same collision detection in NFD-space.
The net result is similar, but subtlety different.

FS Events from MacOS are sent using the on-disk format (NFD on HFS+
and whichever on APFS) and my FSMonitor daemon is sending them to
the client as received.

I'm not sure whether or not the daemon should respect the
`core.precompseUnicode` setting and when watching an HFS+
volume do the NFD-->NFC conversion for the client.  I'm not
sure whether that would be any more or less correct than just
reporting the paths as received.  I'm going to leave this as a
question for the future.


Thanks for all of your background information on this topic.
Jeff



^ permalink raw reply	[relevance 0%]

* Re: [PATCH 02/23] t7527: test FS event reporing on macOS WRT case and Unicode
  @ 2022-02-24 17:33  5%     ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
  2022-03-04 23:40  0%       ` Jeff Hostetler
  2022-03-04 23:47  5%       ` Jeff Hostetler
  0 siblings, 2 replies; 200+ results
From: Torsten =?unknown-8bit?Q?B=C3=B6gershausen?= @ 2022-02-24 17:33 UTC (permalink / raw)
  To: Derrick Stolee; +Cc: Jeff Hostetler via GitGitGadget, git, Jeff Hostetler

On Thu, Feb 24, 2022 at 09:52:28AM -0500, Derrick Stolee wrote:
> On 2/15/2022 10:59 AM, Jeff Hostetler via GitGitGadget wrote:
> > From: Jeff Hostetler <jeffhost@microsoft.com>
> >
> > Confirm that macOS FS events are reported with a normalized spelling.
> >
> > APFS (and/or HFS+) is case-insensitive.  This means that case-independent

This is not true, strictly speaking.
You can format a disk with "case sensitive" or "case-insenstive, case preserving".
Both APFS and HFS+  can be formated that way.
The default, which is what you get when you get a new machine,
is "case-insenstive, case preserving".
And I assume, that more 99% of all disks are formated that way.
The "core.ignorecase" is used in the same way as it is used under NTFS,
FAT or all other case-insenstive file systems.
(and even ext4 can be formated case-insensitive these days.)

An interesting article can be found here:
https://lwn.net/Articles/784041/

And to be technically correct, I think that even NTFS can be
"configured to be case insensitive in an empty directory".

In that sense, I would like to avoid this statement, which
file system is case insensitive, and which is not.
Git assumes that after probing the FS in "git init" we have
a valid configuration in core.ignorecase.

> > lookups ( [ -d .git ] and [ -d .GIT ] ) should both succeed.  But that
> > doesn't tell us how FS events are reported if we try "rm -rf .git" versus
> > "rm -rf .GIT".  Are the events reported using the on-disk spelling of the
> > pathname or in the spelling used by the command.
>
> Was this last sentence supposed to be a question?
>
> > NEEDSWORK: I was only able to test case.  It would be nice to add tests
>
> "I was only able test the APFS case."?
>
> > that use different Unicode spellings/normalizations and understand the
> > differences between APFS and HFS+ in this area.  We should confirm that
> > the spelling of the workdir paths that the daemon sends to clients are
> > always properly normalized.
>
> Are there any macOS experts out there who can help us find the answers
> to these questions?

There is a difference between HFS+ and APFS.
HFS+  is "unicode decomposing" when you call readdir() - file names
are stored decomposed on disk once created.
However, opening  file in precompsed form succeds.
In that sense I would strongly suspect, that any monitors are "sending"
the decomposed form (on HFS+).

APFS does not manipulate file names in that way, it is
"unicode normalization preserving and ignoring".


>
> > +# Confirm that MacOS hides all of the Unicode normalization and/or
> > +# case folding from the FS events.  That is, are the pathnames in the
> > +# FS events reported using the spelling on the disk or in the spelling
> > +# used by the other process.
> > +#
> > +# Note that we assume that the filesystem is set to case insensitive.
> > +#
> > +# NEEDSWORK: APFS handles Unicode and Unicode normalization
> > +# differently than HFS+.  I only have an APFS partition, so
> > +# more testing here would be helpful.

I have an older system and may be able to help, (but am busy this week)
> > +#
> > +
> > +# Rename .git using alternate spelling and confirm that the daemon
> > +# sees the event using the correct spelling and shutdown.
> > +test_expect_success UTF8_NFD_TO_NFC 'MacOS event spelling (rename .GIT)' '

Isn't this precondition is the wrong one and CASE_INSENSITIVE_FS is a better one ?

[snip]

I diddn't follow you series, but if there is a need to test under MacOS with HFS+,
feel free to cc me in the next round

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v4 0/2] Conditional config includes based on remote URL
  @ 2021-11-30  7:51  4%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2021-11-30  7:51 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason; +Cc: Jonathan Tan, git, chooglen

Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:

> On Mon, Nov 29 2021, Jonathan Tan wrote:
>
>> Thanks everyone for your comments. Here's an update.
>
> Just from skimming this (minor) feedback on v3 still applies:
> https://lore.kernel.org/git/211123.86pmqrwtf2.gmgdl@evledraar.gmail.com/
>
> I.e. s/hasremoteurl/hasRemoteURL/ etc. in appropriate places.

Is there any appropriate place, though?

"hasremoteurl" is a new directive to be used as the leading part of
<condition> in the name of `includeIf.<condition>.path` variable.
The <condtion> part is case sensitive, and we do not want people to
spell it, and the existing "gitdir", "gitdir/i", and "onbranch", in
mixed cases.

See config.c::include_condition_is_true() function and its use of
skip_prefix_mem() to locate these existing conditions.

It is troubling that this patch is *NOT* extend the implementation
of include_condition_is_true() function (which gives a very clean
abstraction and makes the caller very readable); it instead mucks
with the caller of include_condition_is_true() and adds a parallel
logic that include_condition_is_true() does not know about.  It may
have been an expedite way to implement this, and the result may not
seem to hurt when include_condition_is_true() is called by only one
caller, but I find the resulting code structure unnecessarily ugly.

Can't the body of if (skip_prefix_mem(..."hasremoteurl:", ...)) block
become include_by_remoteurl() function, similar to include_by_foo()
functions include_condition_is_true() already calls?

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v3 2/2] config: include file if remote URL matches a glob
  2021-11-29 18:33  5% ` Jonathan Tan
@ 2021-11-29 20:50  0%   ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-11-29 20:50 UTC (permalink / raw)
  To: Jonathan Tan; +Cc: git, emilyshaffer, peff, gitster


On Mon, Nov 29 2021, Jonathan Tan wrote:

>> On Mon, Nov 15 2021, Jonathan Tan wrote:
>> 
>> > +`hasremoteurl`::
>> > +	The data that follows the keyword `hasremoteurl:` is taken to
>> 
>> Both here..
>> 
>> > +		die(_("remote URLs cannot be configured in file directly or indirectly included by includeIf.hasremoteurl"));
>> 
>> ..and here...
>> 
>> > +		if (skip_prefix_mem(cond, cond_len, "hasremoteurl:", &url,
>> 
>> ...but not here (C code)..
>> 
>> > +	 * For internal use. Include all includeif.hasremoteurl paths without
>> 
>> ..but here..
>> 
>> > +test_expect_success 'includeIf.hasremoteurl' '
>> 
>> ..and also here etc., let's consistently camelCase config keys whenever
>> we're not using them for lookups in the C
>> code.
>> 
>> I.e. "includeIf.hasRemoteUrl" (possibly "includeIf.hasRemoteURL"?). It
>> makes them a lot easier to read, and makes the end-user documentation &
>> messaging more consistent.
>
> The middle part is not case-insensitive, though - I tried changing it in
> the test and the test now fails. (Unless you mean that we should also
> change the code to make it case-insensitive - but I would think that
> it's better for the URL to be case-sensitive, and by extension, the
> "hasremoteurl:" part connected to it.)

Ah, I forgot about that edge case. sorry. And sent [1] without having
seen this as a reminder on v4. Makes sense.

(I seem to be getting really slow delivery from kernel.org to GMail
these days, sometimes I can see things on lore.kernel.org hours or half
a day before it pops up in my mail...)

1. https://lore.kernel.org/git/211129.864k7ug02c.gmgdl@evledraar.gmail.com/

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3 2/2] config: include file if remote URL matches a glob
  @ 2021-11-29 18:33  5% ` Jonathan Tan
  2021-11-29 20:50  0%   ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Jonathan Tan @ 2021-11-29 18:33 UTC (permalink / raw)
  To: avarab; +Cc: jonathantanmy, git, emilyshaffer, peff, gitster

> On Mon, Nov 15 2021, Jonathan Tan wrote:
> 
> > +`hasremoteurl`::
> > +	The data that follows the keyword `hasremoteurl:` is taken to
> 
> Both here..
> 
> > +		die(_("remote URLs cannot be configured in file directly or indirectly included by includeIf.hasremoteurl"));
> 
> ..and here...
> 
> > +		if (skip_prefix_mem(cond, cond_len, "hasremoteurl:", &url,
> 
> ...but not here (C code)..
> 
> > +	 * For internal use. Include all includeif.hasremoteurl paths without
> 
> ..but here..
> 
> > +test_expect_success 'includeIf.hasremoteurl' '
> 
> ..and also here etc., let's consistently camelCase config keys whenever
> we're not using them for lookups in the C
> code.
> 
> I.e. "includeIf.hasRemoteUrl" (possibly "includeIf.hasRemoteURL"?). It
> makes them a lot easier to read, and makes the end-user documentation &
> messaging more consistent.

The middle part is not case-insensitive, though - I tried changing it in
the test and the test now fails. (Unless you mean that we should also
change the code to make it case-insensitive - but I would think that
it's better for the URL to be case-sensitive, and by extension, the
"hasremoteurl:" part connected to it.)

^ permalink raw reply	[relevance 5%]

* Re: [RFC PATCH v1 1/1] docs: add the new commit-msg tags 'Reported:' and 'Reviewed:'
  @ 2021-11-24  6:12  5%       ` Eric Wong
  0 siblings, 0 replies; 200+ results
From: Eric Wong @ 2021-11-24  6:12 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Thorsten Leemhuis, workflows, linux-kernel, Konstantin Ryabitsev,
	Jonathan Corbet, git

Junio C Hamano <gitster@pobox.com> wrote:
> Eric Wong <e@80x24.org> writes:
> 
> > git send-email's capitalization does annoy me and I've looked
> > into changing it; but there's a bunch of tests and probably
> > dependent code that also need to be updated...
> 
> It does annoy me, too, and I do not mind if it gets "fixed", but I
> do not know if the cost for vetting a bulk update like that is worth
> it.  There is another one outside send-email in log-tree.c that is
> responsible for output from format-patch.

I support updating the documentation in git, first; then perhaps
making tests case-insensitive (which could be a complex
change...).

Unfortunately, changing the send-email + log-tree.c code would
break existing users of the applypatch-msg hook sample in
linux/Documentation/maintainer/configure-git.rst which has
been case-sensitive for around for 2 years:
https://lore.kernel.org/r/20191118223019.81708-1-linus.walleij@linaro.org

:<

^ permalink raw reply	[relevance 5%]

* Re: Questions, improvements
  @ 2021-10-21  1:00  4%     ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2021-10-21  1:00 UTC (permalink / raw)
  To: BARDOT Jérôme; +Cc: Jeff King, git

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

On 2021-10-20 at 12:25:32, BARDOT Jérôme wrote:
> 
> On 19/10/2021 23:31, Jeff King wrote:
> > I think you may have a hard time getting people to agree on what should
> > go into those rules. ;)
> 
> Yes but for certain things i think we will are most of us agree. (In
> professional context)
> 
> Temp files for Operating System, file system, text editor and IDE.

Unfortunately, there are a lot of different patterns here.  Some IDEs
use entire directories, and sometimes those patterns conflict with
common patterns used elsewhere.

For example, GitHub's recommended Visual Studio .gitignore[0] recommends
excluding directories "Bin" and "bin".  However, it is extremely common
for folks to have a "bin" directory in their dotfiles (I do, at least),
and that would cause problems.

It is generally recommended that projects try to remain reasonably
editor independent so that people can use whichever editor they prefer.
As a result, many projects don't include any editor-specific .gitignore
patterns, and rely on each individual user using their
`core.excludesfile` settings to ignore their own editor's and operating
system's files (e.g., Vim swap files).  Only editor-agnostic files, such
as .editorconfig files or files to run linting or formatting tools, are
included.

Also, when you try to pick common patterns, you end up with having to
decide what "common" means.  Should we support every editor's temporary
files, no matter how infrequently used?  Should we only support the top
N editors?  How do we decide which editors we should support?  How do we
decide which OSes we should support?  Should all patterns be case
insensitive to support the most OSes, or case sensitive to prevent false
positives?  How do we limit the rules to avoid bad performance from
giant lists of rules?  How do we resolve conflicts between these rules?

As you can see, it becomes quite sticky pretty quickly, and we're
basically bound to make somebody unhappy.  Letting each project decide
the appropriate rules for them may not please everybody, but it at least
displeases far fewer people, and it lets the people most competent to
decide those rules (the project leaders) make the decision.

[0] https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

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

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] http: match headers case-insensitively when redacting
  2021-09-22 22:11  3%           ` [PATCH v2] " Jeff King
@ 2021-09-22 22:14  4%             ` Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2021-09-22 22:14 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Daniel Stenberg

On Wed, Sep 22, 2021 at 06:11:54PM -0400, Jeff King wrote:

> Well, I did it anyway. :) Here's the updated patch. I think it explains
> things more clearly by showing the example output from our discussion
> (and reframes the text around it to explain it more). I'll send a
> range-diff in a moment.

Here's the range-diff. I split it out because the commit message is
already so long and full of sample diffs and output that I thought it
would get hard to tell what was range-diff and what was actual diff. :)

1:  faa6e6d28e ! 1:  ea064beb32 http: match headers case-insensitively when redacting
    @@ Commit message
           Authorization: Basic ...
     
         After breaking it into lines, we match each header using skip_prefix().
    -    This is case-insensitive, even though HTTP headers are case-insensitive.
    +    This is case-sensitive, even though HTTP headers are case-insensitive.
         This has worked reliably in the past because these headers are generated
         by curl itself, which is predictable in what it sends.
     
    @@ Commit message
             (the overall operation works fine; we just don't see the header in
             the trace).
     
    -    On top of that, we also need the test change that this patch _does_ do:
    -    grepping the trace file case-insensitively. Otherwise the test continues
    -    to pass even over HTTP/2, because it sees _both_ forms of the header
    -    (redacted and unredacted), as we upgrade from HTTP/1.1 to HTTP/2. So our
    -    double grep:
    +    Furthermore, even with the changes above, this test still does not
    +    detect the current failure, because we see _both_ HTTP/1.1 and HTTP/2
    +    requests, which confuse it. Quoting only the interesting bits from the
    +    resulting trace file, we first see:
    +
    +      => Send header: GET /auth/smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
    +      => Send header: Connection: Upgrade, HTTP2-Settings
    +      => Send header: Upgrade: h2c
    +      => Send header: HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA
    +
    +      <= Recv header: HTTP/1.1 401 Unauthorized
    +      <= Recv header: Date: Wed, 22 Sep 2021 20:03:32 GMT
    +      <= Recv header: Server: Apache/2.4.49 (Debian)
    +      <= Recv header: WWW-Authenticate: Basic realm="git-auth"
    +
    +    So the client asks for HTTP/2, but Apache does not do the upgrade for
    +    the 401 response. Then the client repeats with credentials:
    +
    +      => Send header: GET /auth/smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
    +      => Send header: Authorization: Basic <redacted>
    +      => Send header: Connection: Upgrade, HTTP2-Settings
    +      => Send header: Upgrade: h2c
    +      => Send header: HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA
    +
    +      <= Recv header: HTTP/1.1 101 Switching Protocols
    +      <= Recv header: Upgrade: h2c
    +      <= Recv header: Connection: Upgrade
    +      <= Recv header: HTTP/2 200
    +      <= Recv header: content-type: application/x-git-upload-pack-advertisement
    +
    +    So the client does properly redact there, because we're speaking
    +    HTTP/1.1, and the server indicates it can do the upgrade. And then the
    +    client will make further requests using HTTP/2:
    +
    +      => Send header: POST /auth/smart/repo.git/git-upload-pack HTTP/2
    +      => Send header: authorization: Basic dXNlckBob3N0OnBhc3NAaG9zdA==
    +      => Send header: content-type: application/x-git-upload-pack-request
    +
    +    And there we can see that the credential is _not_ redacted. This part of
    +    the test is what gets confused:
     
                 # Ensure that there is no "Basic" followed by a base64 string, but that
                 # the auth details are redacted
                 ! grep "Authorization: Basic [0-9a-zA-Z+/]" trace &&
                 grep "Authorization: Basic <redacted>" trace
     
    -    gets confused. It sees the "<redacted>" one from the pre-upgrade
    -    HTTP/1.1 request, but fails to see the unredacted HTTP/2 one, because it
    -    does not match the lower-case "authorization". Even without the rest of
    -    the test changes, we can still make this test more robust by matching
    -    case-insensitively. That will future-proof the test for a day when
    -    HTTP/2 is finally enabled by default, and doesn't hurt in the meantime.
    +    The first grep does not match the un-redacted HTTP/2 header, because
    +    it insists on an uppercase "A". And the second one does find the
    +    HTTP/1.1 header. So as far as the test is concerned, everything is OK,
    +    but it failed to notice the un-redacted lines.
    +
    +    We can make this test (and the other related ones) more robust by adding
    +    "-i" to grep case-insensitively. This isn't really doing anything for
    +    now, since we're not actually speaking HTTP/2, but it future-proofs the
    +    tests for a day when we do (either we add explicit HTTP/2 test support,
    +    or it's eventually enabled by default by our Apache+curl test setup).
    +    And it doesn't hurt in the meantime for the tests to be more careful.
    +
    +    The change to use "grep -i", coupled with the changes to use HTTP/2
    +    shown above, causes the test to fail with the current code, and pass
    +    after this patch is applied.
     
         And finally, there's one other way to demonstrate the issue (and how I
         actually found it originally). Looking at GIT_TRACE_CURL output against

^ permalink raw reply	[relevance 4%]

* [PATCH v2] http: match headers case-insensitively when redacting
  @ 2021-09-22 22:11  3%           ` Jeff King
  2021-09-22 22:14  4%             ` Jeff King
  0 siblings, 1 reply; 200+ results
From: Jeff King @ 2021-09-22 22:11 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Daniel Stenberg

On Wed, Sep 22, 2021 at 02:42:57PM -0700, Junio C Hamano wrote:

> Jeff King <peff@peff.net> writes:
> 
> > No, I think we are on the same page now. Do you want me to take
> > another stab at writing the commit message to clarify things (i.e., do
> > we think it's badly written, or was it just mis-interpreted)?
> 
> I am not sure which, but perhaps more of the latter.  So I would not
> insist.

Well, I did it anyway. :) Here's the updated patch. I think it explains
things more clearly by showing the example output from our discussion
(and reframes the text around it to explain it more). I'll send a
range-diff in a moment.

(It also fixes the s/insensitive/sensitive/ typo).

-- >8 --
Subject: http: match headers case-insensitively when redacting

When HTTP/2 is in use, we fail to correctly redact "Authorization" (and
other) headers in our GIT_TRACE_CURL output.

We get the headers in our CURLOPT_DEBUGFUNCTION callback, curl_trace().
It passes them along to curl_dump_header(), which in turn checks
redact_sensitive_header(). We see the headers as a text buffer like:

  Host: ...
  Authorization: Basic ...

After breaking it into lines, we match each header using skip_prefix().
This is case-sensitive, even though HTTP headers are case-insensitive.
This has worked reliably in the past because these headers are generated
by curl itself, which is predictable in what it sends.

But when HTTP/2 is in use, instead we get a lower-case "authorization:"
header, and we fail to match it. The fix is simple: we should match with
skip_iprefix().

Testing is more complicated, though. We do have a test for the redacting
feature, but we don't hit the problem case because our test Apache setup
does not understand HTTP/2. You can reproduce the issue by applying this
on top of the test change in this patch:

	diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf
	index afa91e38b0..19267c7107 100644
	--- a/t/lib-httpd/apache.conf
	+++ b/t/lib-httpd/apache.conf
	@@ -29,6 +29,9 @@ ErrorLog error.log
	 	LoadModule setenvif_module modules/mod_setenvif.so
	 </IfModule>

	+LoadModule http2_module modules/mod_http2.so
	+Protocols h2c
	+
	 <IfVersion < 2.4>
	 LockFile accept.lock
	 </IfVersion>
	@@ -64,8 +67,8 @@ LockFile accept.lock
	 <IfModule !mod_access_compat.c>
	 	LoadModule access_compat_module modules/mod_access_compat.so
	 </IfModule>
	-<IfModule !mod_mpm_prefork.c>
	-	LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
	+<IfModule !mod_mpm_event.c>
	+	LoadModule mpm_event_module modules/mod_mpm_event.so
	 </IfModule>
	 <IfModule !mod_unixd.c>
	 	LoadModule unixd_module modules/mod_unixd.so
	diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
	index 1c2a444ae7..ff74f0ae8a 100755
	--- a/t/t5551-http-fetch-smart.sh
	+++ b/t/t5551-http-fetch-smart.sh
	@@ -24,6 +24,10 @@ test_expect_success 'create http-accessible bare repository' '
	 	git push public main:main
	 '

	+test_expect_success 'prefer http/2' '
	+	git config --global http.version HTTP/2
	+'
	+
	 setup_askpass_helper

	 test_expect_success 'clone http repository' '

but this has a few issues:

  - it's not necessarily portable. The http2 apache module might not be
    available on all systems. Further, the http2 module isn't compatible
    with the prefork mpm, so we have to switch to something else. But we
    don't necessarily know what's available. It would be nice if we
    could have conditional config, but IfModule only tells us if a
    module is already loaded, not whether it is available at all.

    This might be a non-issue. The http tests are already optional, and
    modern-enough systems may just have both of these. But...

  - if we do this, then we'd no longer be testing HTTP/1.1 at all. I'm
    not sure how much that matters since it's all handled by curl under
    the hood, but I'd worry that some detail leaks through. We'd
    probably want two scripts running similar tests, one with HTTP/2 and
    one with HTTP/1.1.

  - speaking of which, a later test fails with the patch above! The
    problem is that it is making sure we used a chunked
    transfer-encoding by looking for that header in the trace. But
    HTTP/2 doesn't support that, as it has its own streaming mechanisms
    (the overall operation works fine; we just don't see the header in
    the trace).

Furthermore, even with the changes above, this test still does not
detect the current failure, because we see _both_ HTTP/1.1 and HTTP/2
requests, which confuse it. Quoting only the interesting bits from the
resulting trace file, we first see:

  => Send header: GET /auth/smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
  => Send header: Connection: Upgrade, HTTP2-Settings
  => Send header: Upgrade: h2c
  => Send header: HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA

  <= Recv header: HTTP/1.1 401 Unauthorized
  <= Recv header: Date: Wed, 22 Sep 2021 20:03:32 GMT
  <= Recv header: Server: Apache/2.4.49 (Debian)
  <= Recv header: WWW-Authenticate: Basic realm="git-auth"

So the client asks for HTTP/2, but Apache does not do the upgrade for
the 401 response. Then the client repeats with credentials:

  => Send header: GET /auth/smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
  => Send header: Authorization: Basic <redacted>
  => Send header: Connection: Upgrade, HTTP2-Settings
  => Send header: Upgrade: h2c
  => Send header: HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA

  <= Recv header: HTTP/1.1 101 Switching Protocols
  <= Recv header: Upgrade: h2c
  <= Recv header: Connection: Upgrade
  <= Recv header: HTTP/2 200
  <= Recv header: content-type: application/x-git-upload-pack-advertisement

So the client does properly redact there, because we're speaking
HTTP/1.1, and the server indicates it can do the upgrade. And then the
client will make further requests using HTTP/2:

  => Send header: POST /auth/smart/repo.git/git-upload-pack HTTP/2
  => Send header: authorization: Basic dXNlckBob3N0OnBhc3NAaG9zdA==
  => Send header: content-type: application/x-git-upload-pack-request

And there we can see that the credential is _not_ redacted. This part of
the test is what gets confused:

	# Ensure that there is no "Basic" followed by a base64 string, but that
	# the auth details are redacted
	! grep "Authorization: Basic [0-9a-zA-Z+/]" trace &&
	grep "Authorization: Basic <redacted>" trace

The first grep does not match the un-redacted HTTP/2 header, because
it insists on an uppercase "A". And the second one does find the
HTTP/1.1 header. So as far as the test is concerned, everything is OK,
but it failed to notice the un-redacted lines.

We can make this test (and the other related ones) more robust by adding
"-i" to grep case-insensitively. This isn't really doing anything for
now, since we're not actually speaking HTTP/2, but it future-proofs the
tests for a day when we do (either we add explicit HTTP/2 test support,
or it's eventually enabled by default by our Apache+curl test setup).
And it doesn't hurt in the meantime for the tests to be more careful.

The change to use "grep -i", coupled with the changes to use HTTP/2
shown above, causes the test to fail with the current code, and pass
after this patch is applied.

And finally, there's one other way to demonstrate the issue (and how I
actually found it originally). Looking at GIT_TRACE_CURL output against
github.com, you'll see the unredacted output, even if you didn't set
http.version. That's because setting it is only necessary for curl to
send the extra headers in its HTTP/1.1 request that say "Hey, I speak
HTTP/2; upgrade if you do, too". But for a production site speaking
https, the server advertises via ALPN, a TLS extension, that it supports
HTTP/2, and the client can immediately start using it.

Signed-off-by: Jeff King <peff@peff.net>
---
 http.c                      |  6 +++---
 t/t5551-http-fetch-smart.sh | 24 ++++++++++++------------
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/http.c b/http.c
index a0f169d2fe..4f6a32165f 100644
--- a/http.c
+++ b/http.c
@@ -550,8 +550,8 @@ static void redact_sensitive_header(struct strbuf *header)
 	const char *sensitive_header;
 
 	if (trace_curl_redact &&
-	    (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
-	     skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header))) {
+	    (skip_iprefix(header->buf, "Authorization:", &sensitive_header) ||
+	     skip_iprefix(header->buf, "Proxy-Authorization:", &sensitive_header))) {
 		/* The first token is the type, which is OK to log */
 		while (isspace(*sensitive_header))
 			sensitive_header++;
@@ -561,7 +561,7 @@ static void redact_sensitive_header(struct strbuf *header)
 		strbuf_setlen(header,  sensitive_header - header->buf);
 		strbuf_addstr(header, " <redacted>");
 	} else if (trace_curl_redact &&
-		   skip_prefix(header->buf, "Cookie:", &sensitive_header)) {
+		   skip_iprefix(header->buf, "Cookie:", &sensitive_header)) {
 		struct strbuf redacted_header = STRBUF_INIT;
 		const char *cookie;
 
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index 4f87d90c5b..4e54226162 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -196,8 +196,8 @@ test_expect_success 'GIT_TRACE_CURL redacts auth details' '
 
 	# Ensure that there is no "Basic" followed by a base64 string, but that
 	# the auth details are redacted
-	! grep "Authorization: Basic [0-9a-zA-Z+/]" trace &&
-	grep "Authorization: Basic <redacted>" trace
+	! grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace &&
+	grep -i "Authorization: Basic <redacted>" trace
 '
 
 test_expect_success 'GIT_CURL_VERBOSE redacts auth details' '
@@ -208,8 +208,8 @@ test_expect_success 'GIT_CURL_VERBOSE redacts auth details' '
 
 	# Ensure that there is no "Basic" followed by a base64 string, but that
 	# the auth details are redacted
-	! grep "Authorization: Basic [0-9a-zA-Z+/]" trace &&
-	grep "Authorization: Basic <redacted>" trace
+	! grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace &&
+	grep -i "Authorization: Basic <redacted>" trace
 '
 
 test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_REDACT=0' '
@@ -219,7 +219,7 @@ test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_RE
 		git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
 	expect_askpass both user@host &&
 
-	grep "Authorization: Basic [0-9a-zA-Z+/]" trace
+	grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace
 '
 
 test_expect_success 'disable dumb http on server' '
@@ -474,10 +474,10 @@ test_expect_success 'cookies are redacted by default' '
 	GIT_TRACE_CURL=true \
 		git -c "http.cookieFile=$(pwd)/cookies" clone \
 		$HTTPD_URL/smart/repo.git clone 2>err &&
-	grep "Cookie:.*Foo=<redacted>" err &&
-	grep "Cookie:.*Bar=<redacted>" err &&
-	! grep "Cookie:.*Foo=1" err &&
-	! grep "Cookie:.*Bar=2" err
+	grep -i "Cookie:.*Foo=<redacted>" err &&
+	grep -i "Cookie:.*Bar=<redacted>" err &&
+	! grep -i "Cookie:.*Foo=1" err &&
+	! grep -i "Cookie:.*Bar=2" err
 '
 
 test_expect_success 'empty values of cookies are also redacted' '
@@ -486,7 +486,7 @@ test_expect_success 'empty values of cookies are also redacted' '
 	GIT_TRACE_CURL=true \
 		git -c "http.cookieFile=$(pwd)/cookies" clone \
 		$HTTPD_URL/smart/repo.git clone 2>err &&
-	grep "Cookie:.*Foo=<redacted>" err
+	grep -i "Cookie:.*Foo=<redacted>" err
 '
 
 test_expect_success 'GIT_TRACE_REDACT=0 disables cookie redaction' '
@@ -496,8 +496,8 @@ test_expect_success 'GIT_TRACE_REDACT=0 disables cookie redaction' '
 	GIT_TRACE_REDACT=0 GIT_TRACE_CURL=true \
 		git -c "http.cookieFile=$(pwd)/cookies" clone \
 		$HTTPD_URL/smart/repo.git clone 2>err &&
-	grep "Cookie:.*Foo=1" err &&
-	grep "Cookie:.*Bar=2" err
+	grep -i "Cookie:.*Foo=1" err &&
+	grep -i "Cookie:.*Bar=2" err
 '
 
 test_expect_success 'GIT_TRACE_CURL_NO_DATA prevents data from being traced' '
-- 
2.33.0.1031.gb334554566


^ permalink raw reply related	[relevance 3%]

* Re: [PATCH] http: match headers case-insensitively when redacting
  2021-09-22 20:51  5%     ` Junio C Hamano
@ 2021-09-22 21:18  0%       ` Jeff King
    0 siblings, 1 reply; 200+ results
From: Jeff King @ 2021-09-22 21:18 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Daniel Stenberg

On Wed, Sep 22, 2021 at 01:51:39PM -0700, Junio C Hamano wrote:

> >> Neither pattern of the above two will not match the HTTP/2 one, so
> >> the first one would report "there is no leakage of Auth with a
> >> caplital letter"; the second one may see only one pre-upgrade Auth
> >> with a capital letter, but as long as it does find one, it should be
> >> happy, no?
> >> 
> >> I am a bit puzzled how the test gets confused.
> >
> > The first one matches nothing, because the HTTP/2 one which fails to
> > redact has a lower-case "A". The second one _does_ match, because ...
> 
> I thought we were talking about the original case sensitive test
> getting confused when testing the software that is fixed,
> i.e. HTTP/2 lowercase "authorization" line properly redacted.

No, sorry. I meant: before the fix, even if we were running HTTP/2, the
test does not detect the bug. And thus it is hard to realize that the
fix is indeed making the bug go away. :)

> > I get (with some extraneous headers omitted):
> > ...
> >   => Send header: GET /auth/smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
> >   => Send header: Authorization: Basic <redacted>
> 
> So, this is what we see in HTTP/1.1 (with capitalization).  And then
> ...
> 
> > ...
> >   => Send header: POST /auth/smart/repo.git/git-upload-pack HTTP/2
> >   => Send header: authorization: Basic dXNlckBob3N0OnBhc3NAaG9zdA==
> 
> this one, once the redaction code is fixed by applying this patch,
> would show that we redacted it, too, no?

Correct. But the test, without switching to "grep -i", does not realize
that.

> With or without the fix in the code, I agree that neither of the two
> "grep" patterns without "grep -i" change will match this line.  So
> the end result is that the test finds no unredacted line, and one
> redacted one (instead of two).
> 
> I agree that it is *not* testing what we want to test, and if you
> said so, I wouldn't have been puzzled.  I just wanted to know if
> there is something _else_ (other than "gee, we are not testing the
> HTTP/2 case at all") going on that I failed to read in your
> "... gets confused".

No, I think we are on the same page now. Do you want me to take
another stab at writing the commit message to clarify things (i.e., do
we think it's badly written, or was it just mis-interpreted)?

-Peff

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] http: match headers case-insensitively when redacting
  @ 2021-09-22 20:51  5%     ` Junio C Hamano
  2021-09-22 21:18  0%       ` Jeff King
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2021-09-22 20:51 UTC (permalink / raw)
  To: Jeff King; +Cc: git, Daniel Stenberg

Jeff King <peff@peff.net> writes:

> On Wed, Sep 22, 2021 at 12:19:26PM -0700, Junio C Hamano wrote:
>
>> Jeff King <peff@peff.net> writes:
>> 
>> > 	# Ensure that there is no "Basic" followed by a base64 string, but that
>> > 	# the auth details are redacted
>> > 	! grep "Authorization: Basic [0-9a-zA-Z+/]" trace &&
>> > 	grep "Authorization: Basic <redacted>" trace
>> >
>> > gets confused. It sees the "<redacted>" one from the pre-upgrade
>> > HTTP/1.1 request, but fails to see the unredacted HTTP/2 one, because it
>> > does not match the lower-case "authorization".
>> 
>> Neither pattern of the above two will not match the HTTP/2 one, so
>> the first one would report "there is no leakage of Auth with a
>> caplital letter"; the second one may see only one pre-upgrade Auth
>> with a capital letter, but as long as it does find one, it should be
>> happy, no?
>> 
>> I am a bit puzzled how the test gets confused.
>
> The first one matches nothing, because the HTTP/2 one which fails to
> redact has a lower-case "A". The second one _does_ match, because ...

I thought we were talking about the original case sensitive test
getting confused when testing the software that is fixed,
i.e. HTTP/2 lowercase "authorization" line properly redacted.

> I get (with some extraneous headers omitted):
> ...
>   => Send header: GET /auth/smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
>   => Send header: Authorization: Basic <redacted>

So, this is what we see in HTTP/1.1 (with capitalization).  And then
...

> ...
>   => Send header: POST /auth/smart/repo.git/git-upload-pack HTTP/2
>   => Send header: authorization: Basic dXNlckBob3N0OnBhc3NAaG9zdA==

this one, once the redaction code is fixed by applying this patch,
would show that we redacted it, too, no?

With or without the fix in the code, I agree that neither of the two
"grep" patterns without "grep -i" change will match this line.  So
the end result is that the test finds no unredacted line, and one
redacted one (instead of two).

I agree that it is *not* testing what we want to test, and if you
said so, I wouldn't have been puzzled.  I just wanted to know if
there is something _else_ (other than "gee, we are not testing the
HTTP/2 case at all") going on that I failed to read in your
"... gets confused".

Thanks.

^ permalink raw reply	[relevance 5%]

* Re: [PATCH] http: match headers case-insensitively when redacting
  2021-09-21 19:14  0%   ` Jeff King
@ 2021-09-22 19:10  0%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2021-09-22 19:10 UTC (permalink / raw)
  To: Jeff King; +Cc: Eric Sunshine, Git List, Daniel Stenberg

Jeff King <peff@peff.net> writes:

> On Tue, Sep 21, 2021 at 03:06:20PM -0400, Eric Sunshine wrote:
>
>> On Tue, Sep 21, 2021 at 2:41 PM Jeff King <peff@peff.net> wrote:
>> > When HTTP/2 is in use, we fail to correctly redact "Authorization" (and
>> > other) headers in our GIT_TRACE_CURL output.
>> >
>> > We get the headers in our CURLOPT_DEBUGFUNCTION callback, curl_trace().
>> > It passes them along to curl_dump_header(), which in turn checks
>> > redact_sensitive_header(). We see the headers as a text buffer like:
>> >
>> >   Host: ...
>> >   Authorization: Basic ...
>> >
>> > After breaking it into lines, we match each header using skip_prefix().
>> > This is case-insensitive, even though HTTP headers are case-insensitive.
>> > This has worked reliably in the past because these headers are generated
>> > by curl itself, which is predictable in what it sends.
>> 
>> Did you mean "This is case-sensitive..."?
>
> Whoops, yes. It probably makes a lot more sense with that fix. :)

Yeah, I was wondering about the same thing when I read it the first
time.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] http: match headers case-insensitively when redacting
  2021-09-21 19:06  5% ` Eric Sunshine
@ 2021-09-21 19:14  0%   ` Jeff King
  2021-09-22 19:10  0%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Jeff King @ 2021-09-21 19:14 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: Git List, Daniel Stenberg

On Tue, Sep 21, 2021 at 03:06:20PM -0400, Eric Sunshine wrote:

> On Tue, Sep 21, 2021 at 2:41 PM Jeff King <peff@peff.net> wrote:
> > When HTTP/2 is in use, we fail to correctly redact "Authorization" (and
> > other) headers in our GIT_TRACE_CURL output.
> >
> > We get the headers in our CURLOPT_DEBUGFUNCTION callback, curl_trace().
> > It passes them along to curl_dump_header(), which in turn checks
> > redact_sensitive_header(). We see the headers as a text buffer like:
> >
> >   Host: ...
> >   Authorization: Basic ...
> >
> > After breaking it into lines, we match each header using skip_prefix().
> > This is case-insensitive, even though HTTP headers are case-insensitive.
> > This has worked reliably in the past because these headers are generated
> > by curl itself, which is predictable in what it sends.
> 
> Did you mean "This is case-sensitive..."?

Whoops, yes. It probably makes a lot more sense with that fix. :)

-Peff

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] http: match headers case-insensitively when redacting
  @ 2021-09-21 19:06  5% ` Eric Sunshine
  2021-09-21 19:14  0%   ` Jeff King
    1 sibling, 1 reply; 200+ results
From: Eric Sunshine @ 2021-09-21 19:06 UTC (permalink / raw)
  To: Jeff King; +Cc: Git List, Daniel Stenberg

On Tue, Sep 21, 2021 at 2:41 PM Jeff King <peff@peff.net> wrote:
> When HTTP/2 is in use, we fail to correctly redact "Authorization" (and
> other) headers in our GIT_TRACE_CURL output.
>
> We get the headers in our CURLOPT_DEBUGFUNCTION callback, curl_trace().
> It passes them along to curl_dump_header(), which in turn checks
> redact_sensitive_header(). We see the headers as a text buffer like:
>
>   Host: ...
>   Authorization: Basic ...
>
> After breaking it into lines, we match each header using skip_prefix().
> This is case-insensitive, even though HTTP headers are case-insensitive.
> This has worked reliably in the past because these headers are generated
> by curl itself, which is predictable in what it sends.

Did you mean "This is case-sensitive..."?

> But when HTTP/2 is in use, instead we get a lower-case "authorization:"
> header, and we fail to match it. The fix is simple: we should match with
> skip_iprefix().
> [...]
> Signed-off-by: Jeff King <peff@peff.net>

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v6 1/2] grep: refactor next_match() and match_one_pattern() for external use
  @ 2021-09-21  1:15  4% ` Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2021-09-21  1:15 UTC (permalink / raw)
  To: Hamza Mahfooz; +Cc: git, Junio C Hamano

On Mon, Sep 20, 2021 at 08:30:49PM -0400, Hamza Mahfooz wrote:

> diff --git a/grep.c b/grep.c
> index 424a39591b..2901233865 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -956,26 +956,34 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
>  	const char *start = bol;
>  
>  	if ((p->token != GREP_PATTERN) &&
> -	    ((p->token == GREP_PATTERN_HEAD) != (ctx == GREP_CONTEXT_HEAD)))
> +	    ((p->token == GREP_PATTERN_HEAD) != (ctx == GREP_CONTEXT_HEAD)) &&
> +	    ((p->token == GREP_PATTERN_BODY) != (ctx == GREP_CONTEXT_BODY)))
>  		return 0;
>  
>  	if (p->token == GREP_PATTERN_HEAD) {
>  		const char *field;
>  		size_t len;
> -		assert(p->field < ARRAY_SIZE(header_field));
> -		field = header_field[p->field].field;
> -		len = header_field[p->field].len;
> -		if (strncmp(bol, field, len))
> -			return 0;
> -		bol += len;
> +		const char *end = eol;
> +
>  		switch (p->field) {
>  		case GREP_HEADER_AUTHOR:
>  		case GREP_HEADER_COMMITTER:
>  			saved_ch = strip_timestamp(bol, &eol);
> +			if (eol == end)
> +				goto again;

I'm not sure if this part is right. If we didn't strip any timestamp,
then we jump to the "again" label, where we actually try to match the
pattern.

But that means we skip the part you deleted above, which got moved down
here:

>  			break;
>  		default:
>  			break;
>  		}
> +
> +		assert(p->field < ARRAY_SIZE(header_field));
> +		field = header_field[p->field].field;
> +		len = header_field[p->field].len;
> +
> +		if (strncmp(bol, field, len))
> +			goto restore;
> +
> +		bol += len;
>  	}

And so we do not check that we have the right field at all. And as a
result, we may return nonsense results. For example, try this in
git.git:

  git log -1 --author=junio 1462b67bc893fc845d28e2748c20357cb16a5ce3

It currently returns no results, because the match is case-sensitive (so
it does not match "Junio" in the author field). But with your patch, it
prints t hat commit (1462b67bc), because it matches a line buried in the
mergetag header ("tag post183-for-junio").

That pattern is how I actually stumbled across it, but an even more
obvious version is:

  git log --author=commit

Currently that returns one result (somebody who has the word "commit" in
their email address). But after your patch, it returns a ton of tag
merges (because they all have "type commit" in their mergetag headers).

-Peff

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v3 2/6] core.fsyncobjectfiles: batched disk flushes
  @ 2021-09-15  4:55  5%       ` Neeraj Singh
  0 siblings, 0 replies; 200+ results
From: Neeraj Singh @ 2021-09-15  4:55 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Neeraj Singh via GitGitGadget, Git List, Johannes Schindelin,
	Jeff King, Jeff Hostetler, Christoph Hellwig,
	Ævar Arnfjörð Bjarmason, Randall S. Becker,
	Neeraj K. Singh

On Tue, Sep 14, 2021 at 12:34 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Neeraj Singh via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > diff --git a/config.c b/config.c
> > index cb4a8058bff..9fe3602e1c4 100644
> > --- a/config.c
> > +++ b/config.c
> > @@ -1509,7 +1509,13 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
> >       }
> >
> >       if (!strcmp(var, "core.fsyncobjectfiles")) {
> > -             fsync_object_files = git_config_bool(var, value);
> > +             if (!value)
> > +                     return config_error_nonbool(var);
> > +             if (!strcasecmp(value, "batch"))
> > +                     fsync_object_files = FSYNC_OBJECT_FILES_BATCH;
> > +             else
> > +                     fsync_object_files = git_config_bool(var, value)
> > +                             ? FSYNC_OBJECT_FILES_ON : FSYNC_OBJECT_FILES_OFF;
> >               return 0;
>
> The original code used to allow the short-and-sweet valueless true
>
>         [core]
>                 fsyncobjectfiles
>
> but it no longer does by calling it a nonbool error.  This breaks
> existing users' repositories that have been happily working, doesn't
> it?
>
> Perhaps
>
>         if (value && !strcmp(value, "batch"))
>                 fsync_object_files = FSYNC_OBJECT_FILES_BATCH;
>         else if (git_config_bool(var, value))
>                 fsync_object_files = FSYNC_OBJECT_FILES_ON;
>         else
>                 fsync_object_files = FSYNC_OBJECT_FILES_OFF;

I'll take your suggestion, including the change to case-sensitive.

> > +#ifdef __APPLE__
> > +     return fcntl(fd, F_FULLFSYNC);
> > +#else
> > +     return fsync(fd);
> > +#endif
> > +}
>
> If we are introducing "enum fsync_action", we should have some way
> to make it clear that we are covering all the possible values of
> "action".
>
> Switching on action, i.e.
>
>         switch (action) {
>         case FSYNC_WRITEOUT_ONLY:
>                 ...
>                 break;
>         case FSYNC_HARDWARE_FLUSH:
>                 ...
>                 break;
>         default:
>                 BUG("unexpected git_fsync(%d) call", action);
>         }
>
> would be one way to do so.
>

Will do.

Thanks for reviewing my changes. I've updated the github PR.
I'll wait for a few more days to see if anyone has more feedback
before sending out another round of patches.

^ permalink raw reply	[relevance 5%]

* [PATCH v3 05/11] rebase: drop support for `--preserve-merges`
  @ 2021-09-07 21:05  2%     ` Johannes Schindelin via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin via GitGitGadget @ 2021-09-07 21:05 UTC (permalink / raw)
  To: git
  Cc: Eric Wong, Ævar Arnfjörð Bjarmason, Johannes Sixt,
	Alban Gruin, Phillip Wood, Johannes Schindelin,
	Johannes Schindelin

From: Johannes Schindelin <johannes.schindelin@gmx.de>

This option was deprecated in favor of `--rebase-merges` some time ago,
and now we retire it.

To assist users to transition away, we do not _actually_ remove the
option, but now we no longer implement the functionality. Instead, we
offer a helpful error message suggesting which option to use.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 .gitignore                     |    1 -
 Documentation/git-rebase.txt   |   51 --
 Makefile                       |    2 -
 builtin/rebase.c               |  138 +----
 git-rebase--preserve-merges.sh | 1057 --------------------------------
 5 files changed, 11 insertions(+), 1238 deletions(-)
 delete mode 100644 git-rebase--preserve-merges.sh

diff --git a/.gitignore b/.gitignore
index 311841f9bed..98d6275b20d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -125,7 +125,6 @@
 /git-range-diff
 /git-read-tree
 /git-rebase
-/git-rebase--preserve-merges
 /git-receive-pack
 /git-reflog
 /git-remote
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 55af6fd24e2..1382dc6f005 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -525,29 +525,12 @@ i.e. commits that would be excluded by linkgit:git-log[1]'s
 the `rebase-cousins` mode is turned on, such commits are instead rebased
 onto `<upstream>` (or `<onto>`, if specified).
 +
-The `--rebase-merges` mode is similar in spirit to the deprecated
-`--preserve-merges` but works with interactive rebases,
-where commits can be reordered, inserted and dropped at will.
-+
 It is currently only possible to recreate the merge commits using the
 `recursive` merge strategy; Different merge strategies can be used only via
 explicit `exec git merge -s <strategy> [...]` commands.
 +
 See also REBASING MERGES and INCOMPATIBLE OPTIONS below.
 
--p::
---preserve-merges::
-	[DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
-	instead of flattening the history by replaying commits a merge commit
-	introduces. Merge conflict resolutions or manual amendments to merge
-	commits are not preserved.
-+
-This uses the `--interactive` machinery internally, but combining it
-with the `--interactive` option explicitly is generally not a good
-idea unless you know what you are doing (see BUGS below).
-+
-See also INCOMPATIBLE OPTIONS below.
-
 -x <cmd>::
 --exec <cmd>::
 	Append "exec <cmd>" after each line creating a commit in the
@@ -579,9 +562,6 @@ See also INCOMPATIBLE OPTIONS below.
 	the root commit(s) on a branch.  When used with --onto, it
 	will skip changes already contained in <newbase> (instead of
 	<upstream>) whereas without --onto it will operate on every change.
-	When used together with both --onto and --preserve-merges,
-	'all' root commits will be rewritten to have <newbase> as parent
-	instead.
 +
 See also INCOMPATIBLE OPTIONS below.
 
@@ -643,7 +623,6 @@ are incompatible with the following options:
  * --allow-empty-message
  * --[no-]autosquash
  * --rebase-merges
- * --preserve-merges
  * --interactive
  * --exec
  * --no-keep-empty
@@ -654,13 +633,6 @@ are incompatible with the following options:
 
 In addition, the following pairs of options are incompatible:
 
- * --preserve-merges and --interactive
- * --preserve-merges and --signoff
- * --preserve-merges and --rebase-merges
- * --preserve-merges and --empty=
- * --preserve-merges and --ignore-whitespace
- * --preserve-merges and --committer-date-is-author-date
- * --preserve-merges and --ignore-date
  * --keep-base and --onto
  * --keep-base and --root
  * --fork-point and --root
@@ -1274,29 +1246,6 @@ CONFIGURATION
 include::config/rebase.txt[]
 include::config/sequencer.txt[]
 
-BUGS
-----
-The todo list presented by the deprecated `--preserve-merges --interactive`
-does not represent the topology of the revision graph (use `--rebase-merges`
-instead).  Editing commits and rewording their commit messages should work
-fine, but attempts to reorder commits tend to produce counterintuitive results.
-Use `--rebase-merges` in such scenarios instead.
-
-For example, an attempt to rearrange
-------------
-1 --- 2 --- 3 --- 4 --- 5
-------------
-to
-------------
-1 --- 2 --- 4 --- 3 --- 5
-------------
-by moving the "pick 4" line will result in the following history:
-------------
-	3
-       /
-1 --- 2 --- 4 --- 5
-------------
-
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Makefile b/Makefile
index 9573190f1d7..43f93f61660 100644
--- a/Makefile
+++ b/Makefile
@@ -616,7 +616,6 @@ SCRIPT_SH += git-submodule.sh
 SCRIPT_SH += git-web--browse.sh
 
 SCRIPT_LIB += git-mergetool--lib
-SCRIPT_LIB += git-rebase--preserve-merges
 SCRIPT_LIB += git-sh-i18n
 SCRIPT_LIB += git-sh-setup
 
@@ -2649,7 +2648,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
-LOCALIZED_SH += git-rebase--preserve-merges.sh
 LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
 
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 33e09619005..5f8d9f89ba4 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -48,8 +48,7 @@ static GIT_PATH_FUNC(merge_dir, "rebase-merge")
 enum rebase_type {
 	REBASE_UNSPECIFIED = -1,
 	REBASE_APPLY,
-	REBASE_MERGE,
-	REBASE_PRESERVE_MERGES
+	REBASE_MERGE
 };
 
 enum empty_type {
@@ -571,8 +570,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
 
 static int is_merge(struct rebase_options *opts)
 {
-	return opts->type == REBASE_MERGE ||
-		opts->type == REBASE_PRESERVE_MERGES;
+	return opts->type == REBASE_MERGE;
 }
 
 static void imply_merge(struct rebase_options *opts, const char *option)
@@ -582,7 +580,6 @@ static void imply_merge(struct rebase_options *opts, const char *option)
 		die(_("%s requires the merge backend"), option);
 		break;
 	case REBASE_MERGE:
-	case REBASE_PRESERVE_MERGES:
 		break;
 	default:
 		opts->type = REBASE_MERGE; /* implied */
@@ -773,17 +770,6 @@ static struct commit *peel_committish(const char *name)
 	return (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);
 }
 
-static void add_var(struct strbuf *buf, const char *name, const char *value)
-{
-	if (!value)
-		strbuf_addf(buf, "unset %s; ", name);
-	else {
-		strbuf_addf(buf, "%s=", name);
-		sq_quote_buf(buf, value);
-		strbuf_addstr(buf, "; ");
-	}
-}
-
 static int move_to_original_branch(struct rebase_options *opts)
 {
 	struct strbuf orig_head_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT;
@@ -940,10 +926,7 @@ static int run_am(struct rebase_options *opts)
 
 static int run_specific_rebase(struct rebase_options *opts, enum action action)
 {
-	const char *argv[] = { NULL, NULL };
-	struct strbuf script_snippet = STRBUF_INIT, buf = STRBUF_INIT;
 	int status;
-	const char *backend, *backend_func;
 
 	if (opts->type == REBASE_MERGE) {
 		/* Run sequencer-based rebase */
@@ -960,87 +943,11 @@ static int run_specific_rebase(struct rebase_options *opts, enum action action)
 		}
 
 		status = run_sequencer_rebase(opts, action);
-		goto finished_rebase;
-	}
-
-	if (opts->type == REBASE_APPLY) {
+	} else if (opts->type == REBASE_APPLY)
 		status = run_am(opts);
-		goto finished_rebase;
-	}
-
-	add_var(&script_snippet, "GIT_DIR", absolute_path(get_git_dir()));
-	add_var(&script_snippet, "state_dir", opts->state_dir);
-
-	add_var(&script_snippet, "upstream_name", opts->upstream_name);
-	add_var(&script_snippet, "upstream", opts->upstream ?
-		oid_to_hex(&opts->upstream->object.oid) : NULL);
-	add_var(&script_snippet, "head_name",
-		opts->head_name ? opts->head_name : "detached HEAD");
-	add_var(&script_snippet, "orig_head", oid_to_hex(&opts->orig_head));
-	add_var(&script_snippet, "onto", opts->onto ?
-		oid_to_hex(&opts->onto->object.oid) : NULL);
-	add_var(&script_snippet, "onto_name", opts->onto_name);
-	add_var(&script_snippet, "revisions", opts->revisions);
-	add_var(&script_snippet, "restrict_revision", opts->restrict_revision ?
-		oid_to_hex(&opts->restrict_revision->object.oid) : NULL);
-	sq_quote_argv_pretty(&buf, opts->git_am_opts.v);
-	add_var(&script_snippet, "git_am_opt", buf.buf);
-	strbuf_release(&buf);
-	add_var(&script_snippet, "verbose",
-		opts->flags & REBASE_VERBOSE ? "t" : "");
-	add_var(&script_snippet, "diffstat",
-		opts->flags & REBASE_DIFFSTAT ? "t" : "");
-	add_var(&script_snippet, "force_rebase",
-		opts->flags & REBASE_FORCE ? "t" : "");
-	if (opts->switch_to)
-		add_var(&script_snippet, "switch_to", opts->switch_to);
-	add_var(&script_snippet, "action", opts->action ? opts->action : "");
-	add_var(&script_snippet, "signoff", opts->signoff ? "--signoff" : "");
-	add_var(&script_snippet, "allow_rerere_autoupdate",
-		opts->allow_rerere_autoupdate ?
-			opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE ?
-			"--rerere-autoupdate" : "--no-rerere-autoupdate" : "");
-	add_var(&script_snippet, "keep_empty", opts->keep_empty ? "yes" : "");
-	add_var(&script_snippet, "autosquash", opts->autosquash ? "t" : "");
-	add_var(&script_snippet, "gpg_sign_opt", opts->gpg_sign_opt);
-	add_var(&script_snippet, "cmd", opts->cmd);
-	add_var(&script_snippet, "allow_empty_message",
-		opts->allow_empty_message ?  "--allow-empty-message" : "");
-	add_var(&script_snippet, "rebase_merges",
-		opts->rebase_merges ? "t" : "");
-	add_var(&script_snippet, "rebase_cousins",
-		opts->rebase_cousins ? "t" : "");
-	add_var(&script_snippet, "strategy", opts->strategy);
-	add_var(&script_snippet, "strategy_opts", opts->strategy_opts);
-	add_var(&script_snippet, "rebase_root", opts->root ? "t" : "");
-	add_var(&script_snippet, "squash_onto",
-		opts->squash_onto ? oid_to_hex(opts->squash_onto) : "");
-	add_var(&script_snippet, "git_format_patch_opt",
-		opts->git_format_patch_opt.buf);
-
-	if (is_merge(opts) &&
-	    !(opts->flags & REBASE_INTERACTIVE_EXPLICIT)) {
-		strbuf_addstr(&script_snippet,
-			      "GIT_SEQUENCE_EDITOR=:; export GIT_SEQUENCE_EDITOR; ");
-		opts->autosquash = 0;
-	}
-
-	switch (opts->type) {
-	case REBASE_PRESERVE_MERGES:
-		backend = "git-rebase--preserve-merges";
-		backend_func = "git_rebase__preserve_merges";
-		break;
-	default:
+	else
 		BUG("Unhandled rebase type %d", opts->type);
-		break;
-	}
-
-	strbuf_addf(&script_snippet,
-		    ". git-sh-setup && . %s && %s", backend, backend_func);
-	argv[0] = script_snippet.buf;
 
-	status = run_command_v_opt(argv, RUN_USING_SHELL);
-finished_rebase:
 	if (opts->dont_finish_rebase)
 		; /* do nothing */
 	else if (opts->type == REBASE_MERGE)
@@ -1058,8 +965,6 @@ finished_rebase:
 		die("Nothing to do");
 	}
 
-	strbuf_release(&script_snippet);
-
 	return status ? -1 : 0;
 }
 
@@ -1313,6 +1218,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 	char *squash_onto_name = NULL;
 	int reschedule_failed_exec = -1;
 	int allow_preemptive_ff = 1;
+	int preserve_merges_selected = 0;
 	struct option builtin_rebase_options[] = {
 		OPT_STRING(0, "onto", &options.onto_name,
 			   N_("revision"),
@@ -1377,10 +1283,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			N_("let the user edit the list of commits to rebase"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
 			parse_opt_interactive),
-		OPT_SET_INT_F('p', "preserve-merges", &options.type,
+		OPT_SET_INT_F('p', "preserve-merges", &preserve_merges_selected,
 			      N_("(DEPRECATED) try to recreate merges instead of "
 				 "ignoring them"),
-			      REBASE_PRESERVE_MERGES, PARSE_OPT_HIDDEN),
+			      1, PARSE_OPT_HIDDEN),
 		OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate),
 		OPT_CALLBACK_F(0, "empty", &options, "{drop,keep,ask}",
 			       N_("how to handle commits that become empty"),
@@ -1448,8 +1354,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		strbuf_reset(&buf);
 		strbuf_addf(&buf, "%s/rewritten", merge_dir());
 		if (is_directory(buf.buf)) {
-			options.type = REBASE_PRESERVE_MERGES;
-			options.flags |= REBASE_INTERACTIVE_EXPLICIT;
+			die("`rebase -p` is no longer supported");
 		} else {
 			strbuf_reset(&buf);
 			strbuf_addf(&buf, "%s/interactive", merge_dir());
@@ -1470,6 +1375,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			     builtin_rebase_options,
 			     builtin_rebase_usage, 0);
 
+	if (preserve_merges_selected)
+		die(_("--preserve-merges was replaced by --rebase-merges"));
+
 	if (action != ACTION_NONE && total_argc != 2) {
 		usage_with_options(builtin_rebase_usage,
 				   builtin_rebase_options);
@@ -1479,10 +1387,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		usage_with_options(builtin_rebase_usage,
 				   builtin_rebase_options);
 
-	if (options.type == REBASE_PRESERVE_MERGES)
-		warning(_("git rebase --preserve-merges is deprecated. "
-			  "Use --rebase-merges instead."));
-
 	if (keep_base) {
 		if (options.onto_name)
 			die(_("cannot combine '--keep-base' with '--onto'"));
@@ -1728,7 +1632,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		case REBASE_APPLY:
 			die(_("--strategy requires --merge or --interactive"));
 		case REBASE_MERGE:
-		case REBASE_PRESERVE_MERGES:
 			/* compatible */
 			break;
 		case REBASE_UNSPECIFIED:
@@ -1780,7 +1683,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 
 	switch (options.type) {
 	case REBASE_MERGE:
-	case REBASE_PRESERVE_MERGES:
 		options.state_dir = merge_dir();
 		break;
 	case REBASE_APPLY:
@@ -1805,28 +1707,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		options.reschedule_failed_exec = reschedule_failed_exec;
 
 	if (options.signoff) {
-		if (options.type == REBASE_PRESERVE_MERGES)
-			die("cannot combine '--signoff' with "
-			    "'--preserve-merges'");
 		strvec_push(&options.git_am_opts, "--signoff");
 		options.flags |= REBASE_FORCE;
 	}
 
-	if (options.type == REBASE_PRESERVE_MERGES) {
-		/*
-		 * Note: incompatibility with --signoff handled in signoff block above
-		 * Note: incompatibility with --interactive is just a strong warning;
-		 *       git-rebase.txt caveats with "unless you know what you are doing"
-		 */
-		if (options.rebase_merges)
-			die(_("cannot combine '--preserve-merges' with "
-			      "'--rebase-merges'"));
-
-		if (options.reschedule_failed_exec)
-			die(_("error: cannot combine '--preserve-merges' with "
-			      "'--reschedule-failed-exec'"));
-	}
-
 	if (!options.root) {
 		if (argc < 1) {
 			struct branch *branch;
diff --git a/git-rebase--preserve-merges.sh b/git-rebase--preserve-merges.sh
deleted file mode 100644
index b9c71d2a71b..00000000000
--- a/git-rebase--preserve-merges.sh
+++ /dev/null
@@ -1,1057 +0,0 @@
-# This shell script fragment is sourced by git-rebase to implement its
-# preserve-merges mode.
-#
-# Copyright (c) 2006 Johannes E. Schindelin
-#
-# The file containing rebase commands, comments, and empty lines.
-# This file is created by "git rebase -i" then edited by the user.  As
-# the lines are processed, they are removed from the front of this
-# file and written to the tail of $done.
-todo="$state_dir"/git-rebase-todo
-
-# The rebase command lines that have already been processed.  A line
-# is moved here when it is first handled, before any associated user
-# actions.
-done="$state_dir"/done
-
-# The commit message that is planned to be used for any changes that
-# need to be committed following a user interaction.
-msg="$state_dir"/message
-
-# The file into which is accumulated the suggested commit message for
-# squash/fixup commands.  When the first of a series of squash/fixups
-# is seen, the file is created and the commit message from the
-# previous commit and from the first squash/fixup commit are written
-# to it.  The commit message for each subsequent squash/fixup commit
-# is appended to the file as it is processed.
-#
-# The first line of the file is of the form
-#     # This is a combination of $count commits.
-# where $count is the number of commits whose messages have been
-# written to the file so far (including the initial "pick" commit).
-# Each time that a commit message is processed, this line is read and
-# updated.  It is deleted just before the combined commit is made.
-squash_msg="$state_dir"/message-squash
-
-# If the current series of squash/fixups has not yet included a squash
-# command, then this file exists and holds the commit message of the
-# original "pick" commit.  (If the series ends without a "squash"
-# command, then this can be used as the commit message of the combined
-# commit without opening the editor.)
-fixup_msg="$state_dir"/message-fixup
-
-# $rewritten is the name of a directory containing files for each
-# commit that is reachable by at least one merge base of $head and
-# $upstream. They are not necessarily rewritten, but their children
-# might be.  This ensures that commits on merged, but otherwise
-# unrelated side branches are left alone. (Think "X" in the man page's
-# example.)
-rewritten="$state_dir"/rewritten
-
-dropped="$state_dir"/dropped
-
-end="$state_dir"/end
-msgnum="$state_dir"/msgnum
-
-# A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
-# GIT_AUTHOR_DATE that will be used for the commit that is currently
-# being rebased.
-author_script="$state_dir"/author-script
-
-# When an "edit" rebase command is being processed, the SHA1 of the
-# commit to be edited is recorded in this file.  When "git rebase
-# --continue" is executed, if there are any staged changes then they
-# will be amended to the HEAD commit, but only provided the HEAD
-# commit is still the commit to be edited.  When any other rebase
-# command is processed, this file is deleted.
-amend="$state_dir"/amend
-
-# For the post-rewrite hook, we make a list of rewritten commits and
-# their new sha1s.  The rewritten-pending list keeps the sha1s of
-# commits that have been processed, but not committed yet,
-# e.g. because they are waiting for a 'squash' command.
-rewritten_list="$state_dir"/rewritten-list
-rewritten_pending="$state_dir"/rewritten-pending
-
-# Work around Git for Windows' Bash whose "read" does not strip CRLF
-# and leaves CR at the end instead.
-cr=$(printf "\015")
-
-resolvemsg="
-$(gettext 'Resolve all conflicts manually, mark them as resolved with
-"git add/rm <conflicted_files>", then run "git rebase --continue".
-You can instead skip this commit: run "git rebase --skip".
-To abort and get back to the state before "git rebase", run "git rebase --abort".')
-"
-
-write_basic_state () {
-	echo "$head_name" > "$state_dir"/head-name &&
-	echo "$onto" > "$state_dir"/onto &&
-	echo "$orig_head" > "$state_dir"/orig-head &&
-	test t = "$GIT_QUIET" && : > "$state_dir"/quiet
-	test t = "$verbose" && : > "$state_dir"/verbose
-	test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
-	test -n "$strategy_opts" && echo "$strategy_opts" > \
-		"$state_dir"/strategy_opts
-	test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
-		"$state_dir"/allow_rerere_autoupdate
-	test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
-	test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
-	test -n "$reschedule_failed_exec" && : > "$state_dir"/reschedule-failed-exec
-}
-
-apply_autostash () {
-	if test -f "$state_dir/autostash"
-	then
-		stash_sha1=$(cat "$state_dir/autostash")
-		if git stash apply $stash_sha1 >/dev/null 2>&1
-		then
-			echo "$(gettext 'Applied autostash.')" >&2
-		else
-			git stash store -m "autostash" -q $stash_sha1 ||
-			die "$(eval_gettext "Cannot store \$stash_sha1")"
-			gettext 'Applying autostash resulted in conflicts.
-Your changes are safe in the stash.
-You can run "git stash pop" or "git stash drop" at any time.
-' >&2
-		fi
-	fi
-}
-
-output () {
-	case "$verbose" in
-	'')
-		output=$("$@" 2>&1 )
-		status=$?
-		test $status != 0 && printf "%s\n" "$output"
-		return $status
-		;;
-	*)
-		"$@"
-		;;
-	esac
-}
-
-strategy_args=${strategy:+--strategy=$strategy}
-test -n "$strategy_opts" &&
-eval '
-	for strategy_opt in '"$strategy_opts"'
-	do
-		strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")"
-	done
-'
-
-GIT_CHERRY_PICK_HELP="$resolvemsg"
-export GIT_CHERRY_PICK_HELP
-
-comment_char=$(git config --get core.commentchar 2>/dev/null)
-case "$comment_char" in
-'' | auto)
-	comment_char="#"
-	;;
-?)
-	;;
-*)
-	comment_char=$(echo "$comment_char" | cut -c1)
-	;;
-esac
-
-warn () {
-	printf '%s\n' "$*" >&2
-}
-
-# Output the commit message for the specified commit.
-commit_message () {
-	git cat-file commit "$1" | sed "1,/^$/d"
-}
-
-orig_reflog_action="$GIT_REFLOG_ACTION"
-
-comment_for_reflog () {
-	case "$orig_reflog_action" in
-	''|rebase*)
-		GIT_REFLOG_ACTION="rebase -i ($1)"
-		export GIT_REFLOG_ACTION
-		;;
-	esac
-}
-
-last_count=
-mark_action_done () {
-	sed -e 1q < "$todo" >> "$done"
-	sed -e 1d < "$todo" >> "$todo".new
-	mv -f "$todo".new "$todo"
-	new_count=$(( $(git stripspace --strip-comments <"$done" | wc -l) ))
-	echo $new_count >"$msgnum"
-	total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
-	echo $total >"$end"
-	if test "$last_count" != "$new_count"
-	then
-		last_count=$new_count
-		eval_gettext "Rebasing (\$new_count/\$total)"; printf "\r"
-		test -z "$verbose" || echo
-	fi
-}
-
-append_todo_help () {
-	gettext "
-Commands:
-p, pick <commit> = use commit
-r, reword <commit> = use commit, but edit the commit message
-e, edit <commit> = use commit, but stop for amending
-s, squash <commit> = use commit, but meld into previous commit
-f, fixup <commit> = like \"squash\", but discard this commit's log message
-x, exec <commit> = run command (the rest of the line) using shell
-d, drop <commit> = remove commit
-l, label <label> = label current HEAD with a name
-t, reset <label> = reset HEAD to a label
-m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
-.       create a merge commit using the original merge commit's
-.       message (or the oneline, if no original merge commit was
-.       specified). Use -c <commit> to reword the commit message.
-
-These lines can be re-ordered; they are executed from top to bottom.
-" | git stripspace --comment-lines >>"$todo"
-
-	if test $(get_missing_commit_check_level) = error
-	then
-		gettext "
-Do not remove any line. Use 'drop' explicitly to remove a commit.
-" | git stripspace --comment-lines >>"$todo"
-	else
-		gettext "
-If you remove a line here THAT COMMIT WILL BE LOST.
-" | git stripspace --comment-lines >>"$todo"
-	fi
-}
-
-make_patch () {
-	sha1_and_parents="$(git rev-list --parents -1 "$1")"
-	case "$sha1_and_parents" in
-	?*' '?*' '?*)
-		git diff --cc $sha1_and_parents
-		;;
-	?*' '?*)
-		git diff-tree -p "$1^!"
-		;;
-	*)
-		echo "Root commit"
-		;;
-	esac > "$state_dir"/patch
-	test -f "$msg" ||
-		commit_message "$1" > "$msg"
-	test -f "$author_script" ||
-		get_author_ident_from_commit "$1" > "$author_script"
-}
-
-die_with_patch () {
-	echo "$1" > "$state_dir"/stopped-sha
-	git update-ref REBASE_HEAD "$1"
-	make_patch "$1"
-	die "$2"
-}
-
-exit_with_patch () {
-	echo "$1" > "$state_dir"/stopped-sha
-	git update-ref REBASE_HEAD "$1"
-	make_patch $1
-	git rev-parse --verify HEAD > "$amend"
-	gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
-	warn "$(eval_gettext "\
-You can amend the commit now, with
-
-	git commit --amend \$gpg_sign_opt_quoted
-
-Once you are satisfied with your changes, run
-
-	git rebase --continue")"
-	warn
-	exit $2
-}
-
-die_abort () {
-	apply_autostash
-	rm -rf "$state_dir"
-	die "$1"
-}
-
-has_action () {
-	test -n "$(git stripspace --strip-comments <"$1")"
-}
-
-is_empty_commit() {
-	tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null) || {
-		sha1=$1
-		die "$(eval_gettext "\$sha1: not a commit that can be picked")"
-	}
-	ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null) ||
-		ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
-	test "$tree" = "$ptree"
-}
-
-is_merge_commit()
-{
-	git rev-parse --verify --quiet "$1"^2 >/dev/null 2>&1
-}
-
-# Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
-# GIT_AUTHOR_DATE exported from the current environment.
-do_with_author () {
-	(
-		export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
-		"$@"
-	)
-}
-
-git_sequence_editor () {
-	if test -z "$GIT_SEQUENCE_EDITOR"
-	then
-		GIT_SEQUENCE_EDITOR="$(git config sequence.editor)"
-		if [ -z "$GIT_SEQUENCE_EDITOR" ]
-		then
-			GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $?
-		fi
-	fi
-
-	eval "$GIT_SEQUENCE_EDITOR" '"$@"'
-}
-
-pick_one () {
-	ff=--ff
-
-	case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac
-	case "$force_rebase" in '') ;; ?*) ff= ;; esac
-	output git rev-parse --verify $sha1 || die "$(eval_gettext "Invalid commit name: \$sha1")"
-
-	if is_empty_commit "$sha1"
-	then
-		empty_args="--allow-empty"
-	fi
-
-	pick_one_preserving_merges "$@"
-}
-
-pick_one_preserving_merges () {
-	fast_forward=t
-	case "$1" in
-	-n)
-		fast_forward=f
-		sha1=$2
-		;;
-	*)
-		sha1=$1
-		;;
-	esac
-	sha1=$(git rev-parse $sha1)
-
-	if test -f "$state_dir"/current-commit && test "$fast_forward" = t
-	then
-		while read current_commit
-		do
-			git rev-parse HEAD > "$rewritten"/$current_commit
-		done <"$state_dir"/current-commit
-		rm "$state_dir"/current-commit ||
-			die "$(gettext "Cannot write current commit's replacement sha1")"
-	fi
-
-	echo $sha1 >> "$state_dir"/current-commit
-
-	# rewrite parents; if none were rewritten, we can fast-forward.
-	new_parents=
-	pend=" $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)"
-	if test "$pend" = " "
-	then
-		pend=" root"
-	fi
-	while [ "$pend" != "" ]
-	do
-		p=$(expr "$pend" : ' \([^ ]*\)')
-		pend="${pend# $p}"
-
-		if test -f "$rewritten"/$p
-		then
-			new_p=$(cat "$rewritten"/$p)
-
-			# If the todo reordered commits, and our parent is marked for
-			# rewriting, but hasn't been gotten to yet, assume the user meant to
-			# drop it on top of the current HEAD
-			if test -z "$new_p"
-			then
-				new_p=$(git rev-parse HEAD)
-			fi
-
-			test $p != $new_p && fast_forward=f
-			case "$new_parents" in
-			*$new_p*)
-				;; # do nothing; that parent is already there
-			*)
-				new_parents="$new_parents $new_p"
-				;;
-			esac
-		else
-			if test -f "$dropped"/$p
-			then
-				fast_forward=f
-				replacement="$(cat "$dropped"/$p)"
-				test -z "$replacement" && replacement=root
-				pend=" $replacement$pend"
-			else
-				new_parents="$new_parents $p"
-			fi
-		fi
-	done
-	case $fast_forward in
-	t)
-		output warn "$(eval_gettext "Fast-forward to \$sha1")"
-		output git reset --hard $sha1 ||
-			die "$(eval_gettext "Cannot fast-forward to \$sha1")"
-		;;
-	f)
-		first_parent=$(expr "$new_parents" : ' \([^ ]*\)')
-
-		if [ "$1" != "-n" ]
-		then
-			# detach HEAD to current parent
-			output git checkout $first_parent 2> /dev/null ||
-				die "$(eval_gettext "Cannot move HEAD to \$first_parent")"
-		fi
-
-		case "$new_parents" in
-		' '*' '*)
-			test "a$1" = a-n && die "$(eval_gettext "Refusing to squash a merge: \$sha1")"
-
-			# redo merge
-			author_script_content=$(get_author_ident_from_commit $sha1)
-			eval "$author_script_content"
-			msg_content="$(commit_message $sha1)"
-			# No point in merging the first parent, that's HEAD
-			new_parents=${new_parents# $first_parent}
-			merge_args="--no-log --no-ff"
-			if ! do_with_author output eval \
-				git merge ${gpg_sign_opt:+$(git rev-parse \
-					--sq-quote "$gpg_sign_opt")} \
-				$allow_rerere_autoupdate "$merge_args" \
-				"$strategy_args" \
-				-m "$(git rev-parse --sq-quote "$msg_content")" \
-				"$new_parents"
-			then
-				printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG
-				die_with_patch $sha1 "$(eval_gettext "Error redoing merge \$sha1")"
-			fi
-			echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list"
-			;;
-		*)
-			output eval git cherry-pick $allow_rerere_autoupdate \
-				$allow_empty_message \
-				${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
-				"$strategy_args" "$@" ||
-				die_with_patch $sha1 "$(eval_gettext "Could not pick \$sha1")"
-			;;
-		esac
-		;;
-	esac
-}
-
-this_nth_commit_message () {
-	n=$1
-	eval_gettext "This is the commit message #\${n}:"
-}
-
-skip_nth_commit_message () {
-	n=$1
-	eval_gettext "The commit message #\${n} will be skipped:"
-}
-
-update_squash_messages () {
-	if test -f "$squash_msg"; then
-		mv "$squash_msg" "$squash_msg".bak || exit
-		count=$(($(sed -n \
-			-e "1s/^$comment_char[^0-9]*\([0-9][0-9]*\).*/\1/p" \
-			-e "q" < "$squash_msg".bak)+1))
-		{
-			printf '%s\n' "$comment_char $(eval_ngettext \
-				"This is a combination of \$count commit." \
-				"This is a combination of \$count commits." \
-				$count)"
-			sed -e 1d -e '2,/^./{
-				/^$/d
-			}' <"$squash_msg".bak
-		} >"$squash_msg"
-	else
-		commit_message HEAD >"$fixup_msg" ||
-		die "$(eval_gettext "Cannot write \$fixup_msg")"
-		count=2
-		{
-			printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")"
-			printf '%s\n' "$comment_char $(gettext "This is the 1st commit message:")"
-			echo
-			cat "$fixup_msg"
-		} >"$squash_msg"
-	fi
-	case $1 in
-	squash)
-		rm -f "$fixup_msg"
-		echo
-		printf '%s\n' "$comment_char $(this_nth_commit_message $count)"
-		echo
-		commit_message $2
-		;;
-	fixup)
-		echo
-		printf '%s\n' "$comment_char $(skip_nth_commit_message $count)"
-		echo
-		# Change the space after the comment character to TAB:
-		commit_message $2 | git stripspace --comment-lines | sed -e 's/ /	/'
-		;;
-	esac >>"$squash_msg"
-}
-
-peek_next_command () {
-	git stripspace --strip-comments <"$todo" | sed -n -e 's/ .*//p' -e q
-}
-
-# A squash/fixup has failed.  Prepare the long version of the squash
-# commit message, then die_with_patch.  This code path requires the
-# user to edit the combined commit message for all commits that have
-# been squashed/fixedup so far.  So also erase the old squash
-# messages, effectively causing the combined commit to be used as the
-# new basis for any further squash/fixups.  Args: sha1 rest
-die_failed_squash() {
-	sha1=$1
-	rest=$2
-	mv "$squash_msg" "$msg" || exit
-	rm -f "$fixup_msg"
-	cp "$msg" "$GIT_DIR"/MERGE_MSG || exit
-	warn
-	warn "$(eval_gettext "Could not apply \$sha1... \$rest")"
-	die_with_patch $sha1 ""
-}
-
-flush_rewritten_pending() {
-	test -s "$rewritten_pending" || return
-	newsha1="$(git rev-parse HEAD^0)"
-	sed "s/$/ $newsha1/" < "$rewritten_pending" >> "$rewritten_list"
-	rm -f "$rewritten_pending"
-}
-
-record_in_rewritten() {
-	oldsha1="$(git rev-parse $1)"
-	echo "$oldsha1" >> "$rewritten_pending"
-
-	case "$(peek_next_command)" in
-	squash|s|fixup|f)
-		;;
-	*)
-		flush_rewritten_pending
-		;;
-	esac
-}
-
-do_pick () {
-	sha1=$1
-	rest=$2
-	if test "$(git rev-parse HEAD)" = "$squash_onto"
-	then
-		# Set the correct commit message and author info on the
-		# sentinel root before cherry-picking the original changes
-		# without committing (-n).  Finally, update the sentinel again
-		# to include these changes.  If the cherry-pick results in a
-		# conflict, this means our behaviour is similar to a standard
-		# failed cherry-pick during rebase, with a dirty index to
-		# resolve before manually running git commit --amend then git
-		# rebase --continue.
-		git commit --allow-empty --allow-empty-message --amend \
-			   --no-post-rewrite -n -q -C $sha1 $signoff &&
-			pick_one -n $sha1 &&
-			git commit --allow-empty --allow-empty-message \
-				   --amend --no-post-rewrite -n -q -C $sha1 $signoff \
-				   ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-				   die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
-	else
-		pick_one $sha1 ||
-			die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
-	fi
-}
-
-do_next () {
-	rm -f "$msg" "$author_script" "$amend" "$state_dir"/stopped-sha || exit
-	read -r command sha1 rest < "$todo"
-	case "$command" in
-	"$comment_char"*|''|noop|drop|d)
-		mark_action_done
-		;;
-	"$cr")
-		# Work around CR left by "read" (e.g. with Git for Windows' Bash).
-		mark_action_done
-		;;
-	pick|p)
-		comment_for_reflog pick
-
-		mark_action_done
-		do_pick $sha1 "$rest"
-		record_in_rewritten $sha1
-		;;
-	reword|r)
-		comment_for_reflog reword
-
-		mark_action_done
-		do_pick $sha1 "$rest"
-		git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} \
-			$allow_empty_message || {
-			warn "$(eval_gettext "\
-Could not amend commit after successfully picking \$sha1... \$rest
-This is most likely due to an empty commit message, or the pre-commit hook
-failed. If the pre-commit hook failed, you may need to resolve the issue before
-you are able to reword the commit.")"
-			exit_with_patch $sha1 1
-		}
-		record_in_rewritten $sha1
-		;;
-	edit|e)
-		comment_for_reflog edit
-
-		mark_action_done
-		do_pick $sha1 "$rest"
-		sha1_abbrev=$(git rev-parse --short $sha1)
-		warn "$(eval_gettext "Stopped at \$sha1_abbrev... \$rest")"
-		exit_with_patch $sha1 0
-		;;
-	squash|s|fixup|f)
-		case "$command" in
-		squash|s)
-			squash_style=squash
-			;;
-		fixup|f)
-			squash_style=fixup
-			;;
-		esac
-		comment_for_reflog $squash_style
-
-		test -f "$done" && has_action "$done" ||
-			die "$(eval_gettext "Cannot '\$squash_style' without a previous commit")"
-
-		mark_action_done
-		update_squash_messages $squash_style $sha1
-		author_script_content=$(get_author_ident_from_commit HEAD)
-		echo "$author_script_content" > "$author_script"
-		eval "$author_script_content"
-		if ! pick_one -n $sha1
-		then
-			git rev-parse --verify HEAD >"$amend"
-			die_failed_squash $sha1 "$rest"
-		fi
-		case "$(peek_next_command)" in
-		squash|s|fixup|f)
-			# This is an intermediate commit; its message will only be
-			# used in case of trouble.  So use the long version:
-			do_with_author output git commit --amend --no-verify -F "$squash_msg" \
-				${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-				die_failed_squash $sha1 "$rest"
-			;;
-		*)
-			# This is the final command of this squash/fixup group
-			if test -f "$fixup_msg"
-			then
-				do_with_author git commit --amend --no-verify -F "$fixup_msg" \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die_failed_squash $sha1 "$rest"
-			else
-				cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
-				rm -f "$GIT_DIR"/MERGE_MSG
-				do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die_failed_squash $sha1 "$rest"
-			fi
-			rm -f "$squash_msg" "$fixup_msg"
-			;;
-		esac
-		record_in_rewritten $sha1
-		;;
-	x|"exec")
-		read -r command rest < "$todo"
-		mark_action_done
-		eval_gettextln "Executing: \$rest"
-		"${SHELL:-@SHELL_PATH@}" -c "$rest" # Actual execution
-		status=$?
-		# Run in subshell because require_clean_work_tree can die.
-		dirty=f
-		(require_clean_work_tree "rebase" 2>/dev/null) || dirty=t
-		if test "$status" -ne 0
-		then
-			warn "$(eval_gettext "Execution failed: \$rest")"
-			test "$dirty" = f ||
-				warn "$(gettext "and made changes to the index and/or the working tree")"
-
-			warn "$(gettext "\
-You can fix the problem, and then run
-
-	git rebase --continue")"
-			warn
-			if test $status -eq 127		# command not found
-			then
-				status=1
-			fi
-			exit "$status"
-		elif test "$dirty" = t
-		then
-			# TRANSLATORS: after these lines is a command to be issued by the user
-			warn "$(eval_gettext "\
-Execution succeeded: \$rest
-but left changes to the index and/or the working tree
-Commit or stash your changes, and then run
-
-	git rebase --continue")"
-			warn
-			exit 1
-		fi
-		;;
-	*)
-		warn "$(eval_gettext "Unknown command: \$command \$sha1 \$rest")"
-		fixtodo="$(gettext "Please fix this using 'git rebase --edit-todo'.")"
-		if git rev-parse --verify -q "$sha1" >/dev/null
-		then
-			die_with_patch $sha1 "$fixtodo"
-		else
-			die "$fixtodo"
-		fi
-		;;
-	esac
-	test -s "$todo" && return
-
-	comment_for_reflog finish &&
-	newhead=$(git rev-parse HEAD) &&
-	case $head_name in
-	refs/*)
-		message="$GIT_REFLOG_ACTION: $head_name onto $onto" &&
-		git update-ref -m "$message" $head_name $newhead $orig_head &&
-		git symbolic-ref \
-		  -m "$GIT_REFLOG_ACTION: returning to $head_name" \
-		  HEAD $head_name
-		;;
-	esac && {
-		test ! -f "$state_dir"/verbose ||
-			git diff-tree --stat $orig_head..HEAD
-	} &&
-	{
-		test -s "$rewritten_list" &&
-		git notes copy --for-rewrite=rebase < "$rewritten_list" ||
-		true # we don't care if this copying failed
-	} &&
-	hook="$(git rev-parse --git-path hooks/post-rewrite)"
-	if test -x "$hook" && test -s "$rewritten_list"; then
-		"$hook" rebase < "$rewritten_list"
-		true # we don't care if this hook failed
-	fi &&
-		warn "$(eval_gettext "Successfully rebased and updated \$head_name.")"
-
-	return 1 # not failure; just to break the do_rest loop
-}
-
-# can only return 0, when the infinite loop breaks
-do_rest () {
-	while :
-	do
-		do_next || break
-	done
-}
-
-expand_todo_ids() {
-	git rebase--interactive --expand-ids
-}
-
-collapse_todo_ids() {
-	git rebase--interactive --shorten-ids
-}
-
-# Switch to the branch in $into and notify it in the reflog
-checkout_onto () {
-	GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
-	output git checkout $onto || die_abort "$(gettext "could not detach HEAD")"
-	git update-ref ORIG_HEAD $orig_head
-}
-
-get_missing_commit_check_level () {
-	check_level=$(git config --get rebase.missingCommitsCheck)
-	check_level=${check_level:-ignore}
-	# Don't be case sensitive
-	printf '%s' "$check_level" | tr 'A-Z' 'a-z'
-}
-
-# Initiate an action. If the cannot be any
-# further action it  may exec a command
-# or exit and not return.
-#
-# TODO: Consider a cleaner return model so it
-# never exits and always return 0 if process
-# is complete.
-#
-# Parameter 1 is the action to initiate.
-#
-# Returns 0 if the action was able to complete
-# and if 1 if further processing is required.
-initiate_action () {
-	case "$1" in
-	continue)
-		# do we have anything to commit?
-		if git diff-index --cached --quiet HEAD --
-		then
-			# Nothing to commit -- skip this commit
-
-			test ! -f "$GIT_DIR"/CHERRY_PICK_HEAD ||
-			rm "$GIT_DIR"/CHERRY_PICK_HEAD ||
-			die "$(gettext "Could not remove CHERRY_PICK_HEAD")"
-		else
-			if ! test -f "$author_script"
-			then
-				gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
-				die "$(eval_gettext "\
-You have staged changes in your working tree.
-If these changes are meant to be
-squashed into the previous commit, run:
-
-  git commit --amend \$gpg_sign_opt_quoted
-
-If they are meant to go into a new commit, run:
-
-  git commit \$gpg_sign_opt_quoted
-
-In both cases, once you're done, continue with:
-
-  git rebase --continue
-")"
-			fi
-			. "$author_script" ||
-				die "$(gettext "Error trying to find the author identity to amend commit")"
-			if test -f "$amend"
-			then
-				current_head=$(git rev-parse --verify HEAD)
-				test "$current_head" = $(cat "$amend") ||
-				die "$(gettext "\
-You have uncommitted changes in your working tree. Please commit them
-first and then run 'git rebase --continue' again.")"
-				do_with_author git commit --amend --no-verify -F "$msg" -e \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die "$(gettext "Could not commit staged changes.")"
-			else
-				do_with_author git commit --no-verify -F "$msg" -e \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die "$(gettext "Could not commit staged changes.")"
-			fi
-		fi
-
-		if test -r "$state_dir"/stopped-sha
-		then
-			record_in_rewritten "$(cat "$state_dir"/stopped-sha)"
-		fi
-
-		require_clean_work_tree "rebase"
-		do_rest
-		return 0
-		;;
-	skip)
-		git rerere clear
-		do_rest
-		return 0
-		;;
-	edit-todo)
-		git stripspace --strip-comments <"$todo" >"$todo".new
-		mv -f "$todo".new "$todo"
-		collapse_todo_ids
-		append_todo_help
-		gettext "
-You are editing the todo file of an ongoing interactive rebase.
-To continue rebase after editing, run:
-    git rebase --continue
-
-" | git stripspace --comment-lines >>"$todo"
-
-		git_sequence_editor "$todo" ||
-			die "$(gettext "Could not execute editor")"
-		expand_todo_ids
-
-		exit
-		;;
-	show-current-patch)
-		exec git show REBASE_HEAD --
-		;;
-	*)
-		return 1 # continue
-		;;
-	esac
-}
-
-setup_reflog_action () {
-	comment_for_reflog start
-
-	if test ! -z "$switch_to"
-	then
-		GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to"
-		output git checkout "$switch_to" -- ||
-			die "$(eval_gettext "Could not checkout \$switch_to")"
-
-		comment_for_reflog start
-	fi
-}
-
-init_basic_state () {
-	orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
-	mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
-	rm -f "$(git rev-parse --git-path REBASE_HEAD)"
-
-	: > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")"
-	write_basic_state
-}
-
-init_revisions_and_shortrevisions () {
-	shorthead=$(git rev-parse --short $orig_head)
-	shortonto=$(git rev-parse --short $onto)
-	if test -z "$rebase_root"
-		# this is now equivalent to ! -z "$upstream"
-	then
-		shortupstream=$(git rev-parse --short $upstream)
-		revisions=$upstream...$orig_head
-		shortrevisions=$shortupstream..$shorthead
-	else
-		revisions=$onto...$orig_head
-		shortrevisions=$shorthead
-		test -z "$squash_onto" ||
-		echo "$squash_onto" >"$state_dir"/squash-onto
-	fi
-}
-
-complete_action() {
-	test -s "$todo" || echo noop >> "$todo"
-	test -z "$autosquash" || git rebase--interactive --rearrange-squash || exit
-	test -n "$cmd" && git rebase--interactive --add-exec-commands --cmd "$cmd"
-
-	todocount=$(git stripspace --strip-comments <"$todo" | wc -l)
-	todocount=${todocount##* }
-
-cat >>"$todo" <<EOF
-
-$comment_char $(eval_ngettext \
-	"Rebase \$shortrevisions onto \$shortonto (\$todocount command)" \
-	"Rebase \$shortrevisions onto \$shortonto (\$todocount commands)" \
-	"$todocount")
-EOF
-	append_todo_help
-	gettext "
-However, if you remove everything, the rebase will be aborted.
-
-" | git stripspace --comment-lines >>"$todo"
-
-	if test -z "$keep_empty"
-	then
-		printf '%s\n' "$comment_char $(gettext "Note that empty commits are commented out")" >>"$todo"
-	fi
-
-
-	has_action "$todo" ||
-		return 2
-
-	cp "$todo" "$todo".backup
-	collapse_todo_ids
-	git_sequence_editor "$todo" ||
-		die_abort "$(gettext "Could not execute editor")"
-
-	has_action "$todo" ||
-		return 2
-
-	git rebase--interactive --check-todo-list || {
-		ret=$?
-		checkout_onto
-		exit $ret
-	}
-
-	expand_todo_ids
-	checkout_onto
-	do_rest
-}
-
-git_rebase__preserve_merges () {
-	initiate_action "$action"
-	ret=$?
-	if test $ret = 0; then
-		return 0
-	fi
-
-	setup_reflog_action
-	init_basic_state
-
-	if test -z "$rebase_root"
-	then
-		mkdir "$rewritten" &&
-		for c in $(git merge-base --all $orig_head $upstream)
-		do
-			echo $onto > "$rewritten"/$c ||
-				die "$(gettext "Could not init rewritten commits")"
-		done
-	else
-		mkdir "$rewritten" &&
-		echo $onto > "$rewritten"/root ||
-			die "$(gettext "Could not init rewritten commits")"
-	fi
-
-	init_revisions_and_shortrevisions
-
-	format=$(git config --get rebase.instructionFormat)
-	# the 'rev-list .. | sed' requires %m to parse; the instruction requires %H to parse
-	git rev-list --format="%m%H ${format:-%s}" \
-		--reverse --left-right --topo-order \
-		$revisions ${restrict_revision+^$restrict_revision} | \
-		sed -n "s/^>//p" |
-	while read -r sha1 rest
-	do
-		if test -z "$keep_empty" && is_empty_commit $sha1 && ! is_merge_commit $sha1
-		then
-			comment_out="$comment_char "
-		else
-			comment_out=
-		fi
-
-		if test -z "$rebase_root"
-		then
-			preserve=t
-			for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)
-			do
-				if test -f "$rewritten"/$p
-				then
-					preserve=f
-				fi
-			done
-		else
-			preserve=f
-		fi
-		if test f = "$preserve"
-		then
-			touch "$rewritten"/$sha1
-			printf '%s\n' "${comment_out}pick $sha1 $rest" >>"$todo"
-		fi
-	done
-
-	# Watch for commits that been dropped by --cherry-pick
-	mkdir "$dropped"
-	# Save all non-cherry-picked changes
-	git rev-list $revisions --left-right --cherry-pick | \
-		sed -n "s/^>//p" > "$state_dir"/not-cherry-picks
-	# Now all commits and note which ones are missing in
-	# not-cherry-picks and hence being dropped
-	git rev-list $revisions |
-	while read rev
-	do
-		if test -f "$rewritten"/$rev &&
-		   ! sane_grep "$rev" "$state_dir"/not-cherry-picks >/dev/null
-		then
-			# Use -f2 because if rev-list is telling us this commit is
-			# not worthwhile, we don't want to track its multiple heads,
-			# just the history of its first-parent for others that will
-			# be rebasing on top of it
-			git rev-list --parents -1 $rev | cut -d' ' -s -f2 > "$dropped"/$rev
-			sha1=$(git rev-list -1 $rev)
-			sane_grep -v "^[a-z][a-z]* $sha1" <"$todo" > "${todo}2" ; mv "${todo}2" "$todo"
-			rm "$rewritten"/$rev
-		fi
-	done
-
-	complete_action
-}
-- 
gitgitgadget


^ permalink raw reply related	[relevance 2%]

* Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
  2021-09-01 11:57  2%   ` [PATCH v2 5/7] rebase: drop support for `--preserve-merges` Johannes Schindelin via GitGitGadget
@ 2021-09-06 10:15  0%     ` Phillip Wood
  0 siblings, 0 replies; 200+ results
From: Phillip Wood @ 2021-09-06 10:15 UTC (permalink / raw)
  To: Johannes Schindelin via GitGitGadget, git; +Cc: Eric Wong, Johannes Schindelin

Hi dscho

On 01/09/2021 12:57, Johannes Schindelin via GitGitGadget wrote:
> From: Johannes Schindelin <johannes.schindelin@gmx.de>
> 
> This option was deprecated in favor of `--rebase-merges` some time ago,
> and now we retire it.

This all looks good to me. I did see the comment below in 
builtin/rebase.c that could be tweaked if you reroll, but it is a very 
minor issue.

/* -i followed by -p is still explicitly interactive, but -p alone is not */
static int parse_opt_interactive(const struct option *opt, const char *arg,
                                  int unset)

I do wonder if we need these option parsing functions now but that is a 
question for another day.

Best Wishes

Phillip

> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>   .gitignore                     |    1 -
>   Documentation/git-rebase.txt   |   51 --
>   Makefile                       |    2 -
>   builtin/rebase.c               |  133 +---
>   git-rebase--preserve-merges.sh | 1057 --------------------------------
>   5 files changed, 6 insertions(+), 1238 deletions(-)
>   delete mode 100644 git-rebase--preserve-merges.sh
> 
> diff --git a/.gitignore b/.gitignore
> index 311841f9bed..98d6275b20d 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -125,7 +125,6 @@
>   /git-range-diff
>   /git-read-tree
>   /git-rebase
> -/git-rebase--preserve-merges
>   /git-receive-pack
>   /git-reflog
>   /git-remote
> diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
> index 55af6fd24e2..1382dc6f005 100644
> --- a/Documentation/git-rebase.txt
> +++ b/Documentation/git-rebase.txt
> @@ -525,29 +525,12 @@ i.e. commits that would be excluded by linkgit:git-log[1]'s
>   the `rebase-cousins` mode is turned on, such commits are instead rebased
>   onto `<upstream>` (or `<onto>`, if specified).
>   +
> -The `--rebase-merges` mode is similar in spirit to the deprecated
> -`--preserve-merges` but works with interactive rebases,
> -where commits can be reordered, inserted and dropped at will.
> -+
>   It is currently only possible to recreate the merge commits using the
>   `recursive` merge strategy; Different merge strategies can be used only via
>   explicit `exec git merge -s <strategy> [...]` commands.
>   +
>   See also REBASING MERGES and INCOMPATIBLE OPTIONS below.
>   
> --p::
> ---preserve-merges::
> -	[DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
> -	instead of flattening the history by replaying commits a merge commit
> -	introduces. Merge conflict resolutions or manual amendments to merge
> -	commits are not preserved.
> -+
> -This uses the `--interactive` machinery internally, but combining it
> -with the `--interactive` option explicitly is generally not a good
> -idea unless you know what you are doing (see BUGS below).
> -+
> -See also INCOMPATIBLE OPTIONS below.
> -
>   -x <cmd>::
>   --exec <cmd>::
>   	Append "exec <cmd>" after each line creating a commit in the
> @@ -579,9 +562,6 @@ See also INCOMPATIBLE OPTIONS below.
>   	the root commit(s) on a branch.  When used with --onto, it
>   	will skip changes already contained in <newbase> (instead of
>   	<upstream>) whereas without --onto it will operate on every change.
> -	When used together with both --onto and --preserve-merges,
> -	'all' root commits will be rewritten to have <newbase> as parent
> -	instead.
>   +
>   See also INCOMPATIBLE OPTIONS below.
>   
> @@ -643,7 +623,6 @@ are incompatible with the following options:
>    * --allow-empty-message
>    * --[no-]autosquash
>    * --rebase-merges
> - * --preserve-merges
>    * --interactive
>    * --exec
>    * --no-keep-empty
> @@ -654,13 +633,6 @@ are incompatible with the following options:
>   
>   In addition, the following pairs of options are incompatible:
>   
> - * --preserve-merges and --interactive
> - * --preserve-merges and --signoff
> - * --preserve-merges and --rebase-merges
> - * --preserve-merges and --empty=
> - * --preserve-merges and --ignore-whitespace
> - * --preserve-merges and --committer-date-is-author-date
> - * --preserve-merges and --ignore-date
>    * --keep-base and --onto
>    * --keep-base and --root
>    * --fork-point and --root
> @@ -1274,29 +1246,6 @@ CONFIGURATION
>   include::config/rebase.txt[]
>   include::config/sequencer.txt[]
>   
> -BUGS
> -----
> -The todo list presented by the deprecated `--preserve-merges --interactive`
> -does not represent the topology of the revision graph (use `--rebase-merges`
> -instead).  Editing commits and rewording their commit messages should work
> -fine, but attempts to reorder commits tend to produce counterintuitive results.
> -Use `--rebase-merges` in such scenarios instead.
> -
> -For example, an attempt to rearrange
> -------------
> -1 --- 2 --- 3 --- 4 --- 5
> -------------
> -to
> -------------
> -1 --- 2 --- 4 --- 3 --- 5
> -------------
> -by moving the "pick 4" line will result in the following history:
> -------------
> -	3
> -       /
> -1 --- 2 --- 4 --- 5
> -------------
> -
>   GIT
>   ---
>   Part of the linkgit:git[1] suite
> diff --git a/Makefile b/Makefile
> index 9573190f1d7..43f93f61660 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -616,7 +616,6 @@ SCRIPT_SH += git-submodule.sh
>   SCRIPT_SH += git-web--browse.sh
>   
>   SCRIPT_LIB += git-mergetool--lib
> -SCRIPT_LIB += git-rebase--preserve-merges
>   SCRIPT_LIB += git-sh-i18n
>   SCRIPT_LIB += git-sh-setup
>   
> @@ -2649,7 +2648,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>   	--keyword=__ --keyword=N__ --keyword="__n:1,2"
>   LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
>   LOCALIZED_SH = $(SCRIPT_SH)
> -LOCALIZED_SH += git-rebase--preserve-merges.sh
>   LOCALIZED_SH += git-sh-setup.sh
>   LOCALIZED_PERL = $(SCRIPT_PERL)
>   
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> index 33e09619005..5af6aff9c5e 100644
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@ -48,8 +48,7 @@ static GIT_PATH_FUNC(merge_dir, "rebase-merge")
>   enum rebase_type {
>   	REBASE_UNSPECIFIED = -1,
>   	REBASE_APPLY,
> -	REBASE_MERGE,
> -	REBASE_PRESERVE_MERGES
> +	REBASE_MERGE
>   };
>   
>   enum empty_type {
> @@ -571,8 +570,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
>   
>   static int is_merge(struct rebase_options *opts)
>   {
> -	return opts->type == REBASE_MERGE ||
> -		opts->type == REBASE_PRESERVE_MERGES;
> +	return opts->type == REBASE_MERGE;
>   }
>   
>   static void imply_merge(struct rebase_options *opts, const char *option)
> @@ -582,7 +580,6 @@ static void imply_merge(struct rebase_options *opts, const char *option)
>   		die(_("%s requires the merge backend"), option);
>   		break;
>   	case REBASE_MERGE:
> -	case REBASE_PRESERVE_MERGES:
>   		break;
>   	default:
>   		opts->type = REBASE_MERGE; /* implied */
> @@ -773,17 +770,6 @@ static struct commit *peel_committish(const char *name)
>   	return (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);
>   }
>   
> -static void add_var(struct strbuf *buf, const char *name, const char *value)
> -{
> -	if (!value)
> -		strbuf_addf(buf, "unset %s; ", name);
> -	else {
> -		strbuf_addf(buf, "%s=", name);
> -		sq_quote_buf(buf, value);
> -		strbuf_addstr(buf, "; ");
> -	}
> -}
> -
>   static int move_to_original_branch(struct rebase_options *opts)
>   {
>   	struct strbuf orig_head_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT;
> @@ -940,10 +926,8 @@ static int run_am(struct rebase_options *opts)
>   
>   static int run_specific_rebase(struct rebase_options *opts, enum action action)
>   {
> -	const char *argv[] = { NULL, NULL };
> -	struct strbuf script_snippet = STRBUF_INIT, buf = STRBUF_INIT;
> +	struct strbuf script_snippet = STRBUF_INIT;
>   	int status;
> -	const char *backend, *backend_func;
>   
>   	if (opts->type == REBASE_MERGE) {
>   		/* Run sequencer-based rebase */
> @@ -960,87 +944,11 @@ static int run_specific_rebase(struct rebase_options *opts, enum action action)
>   		}
>   
>   		status = run_sequencer_rebase(opts, action);
> -		goto finished_rebase;
> -	}
> -
> -	if (opts->type == REBASE_APPLY) {
> +	} else if (opts->type == REBASE_APPLY)
>   		status = run_am(opts);
> -		goto finished_rebase;
> -	}
> -
> -	add_var(&script_snippet, "GIT_DIR", absolute_path(get_git_dir()));
> -	add_var(&script_snippet, "state_dir", opts->state_dir);
> -
> -	add_var(&script_snippet, "upstream_name", opts->upstream_name);
> -	add_var(&script_snippet, "upstream", opts->upstream ?
> -		oid_to_hex(&opts->upstream->object.oid) : NULL);
> -	add_var(&script_snippet, "head_name",
> -		opts->head_name ? opts->head_name : "detached HEAD");
> -	add_var(&script_snippet, "orig_head", oid_to_hex(&opts->orig_head));
> -	add_var(&script_snippet, "onto", opts->onto ?
> -		oid_to_hex(&opts->onto->object.oid) : NULL);
> -	add_var(&script_snippet, "onto_name", opts->onto_name);
> -	add_var(&script_snippet, "revisions", opts->revisions);
> -	add_var(&script_snippet, "restrict_revision", opts->restrict_revision ?
> -		oid_to_hex(&opts->restrict_revision->object.oid) : NULL);
> -	sq_quote_argv_pretty(&buf, opts->git_am_opts.v);
> -	add_var(&script_snippet, "git_am_opt", buf.buf);
> -	strbuf_release(&buf);
> -	add_var(&script_snippet, "verbose",
> -		opts->flags & REBASE_VERBOSE ? "t" : "");
> -	add_var(&script_snippet, "diffstat",
> -		opts->flags & REBASE_DIFFSTAT ? "t" : "");
> -	add_var(&script_snippet, "force_rebase",
> -		opts->flags & REBASE_FORCE ? "t" : "");
> -	if (opts->switch_to)
> -		add_var(&script_snippet, "switch_to", opts->switch_to);
> -	add_var(&script_snippet, "action", opts->action ? opts->action : "");
> -	add_var(&script_snippet, "signoff", opts->signoff ? "--signoff" : "");
> -	add_var(&script_snippet, "allow_rerere_autoupdate",
> -		opts->allow_rerere_autoupdate ?
> -			opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE ?
> -			"--rerere-autoupdate" : "--no-rerere-autoupdate" : "");
> -	add_var(&script_snippet, "keep_empty", opts->keep_empty ? "yes" : "");
> -	add_var(&script_snippet, "autosquash", opts->autosquash ? "t" : "");
> -	add_var(&script_snippet, "gpg_sign_opt", opts->gpg_sign_opt);
> -	add_var(&script_snippet, "cmd", opts->cmd);
> -	add_var(&script_snippet, "allow_empty_message",
> -		opts->allow_empty_message ?  "--allow-empty-message" : "");
> -	add_var(&script_snippet, "rebase_merges",
> -		opts->rebase_merges ? "t" : "");
> -	add_var(&script_snippet, "rebase_cousins",
> -		opts->rebase_cousins ? "t" : "");
> -	add_var(&script_snippet, "strategy", opts->strategy);
> -	add_var(&script_snippet, "strategy_opts", opts->strategy_opts);
> -	add_var(&script_snippet, "rebase_root", opts->root ? "t" : "");
> -	add_var(&script_snippet, "squash_onto",
> -		opts->squash_onto ? oid_to_hex(opts->squash_onto) : "");
> -	add_var(&script_snippet, "git_format_patch_opt",
> -		opts->git_format_patch_opt.buf);
> -
> -	if (is_merge(opts) &&
> -	    !(opts->flags & REBASE_INTERACTIVE_EXPLICIT)) {
> -		strbuf_addstr(&script_snippet,
> -			      "GIT_SEQUENCE_EDITOR=:; export GIT_SEQUENCE_EDITOR; ");
> -		opts->autosquash = 0;
> -	}
> -
> -	switch (opts->type) {
> -	case REBASE_PRESERVE_MERGES:
> -		backend = "git-rebase--preserve-merges";
> -		backend_func = "git_rebase__preserve_merges";
> -		break;
> -	default:
> +	else
>   		BUG("Unhandled rebase type %d", opts->type);
> -		break;
> -	}
>   
> -	strbuf_addf(&script_snippet,
> -		    ". git-sh-setup && . %s && %s", backend, backend_func);
> -	argv[0] = script_snippet.buf;
> -
> -	status = run_command_v_opt(argv, RUN_USING_SHELL);
> -finished_rebase:
>   	if (opts->dont_finish_rebase)
>   		; /* do nothing */
>   	else if (opts->type == REBASE_MERGE)
> @@ -1377,10 +1285,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>   			N_("let the user edit the list of commits to rebase"),
>   			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
>   			parse_opt_interactive),
> -		OPT_SET_INT_F('p', "preserve-merges", &options.type,
> -			      N_("(DEPRECATED) try to recreate merges instead of "
> -				 "ignoring them"),
> -			      REBASE_PRESERVE_MERGES, PARSE_OPT_HIDDEN),
>   		OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate),
>   		OPT_CALLBACK_F(0, "empty", &options, "{drop,keep,ask}",
>   			       N_("how to handle commits that become empty"),
> @@ -1448,8 +1352,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>   		strbuf_reset(&buf);
>   		strbuf_addf(&buf, "%s/rewritten", merge_dir());
>   		if (is_directory(buf.buf)) {
> -			options.type = REBASE_PRESERVE_MERGES;
> -			options.flags |= REBASE_INTERACTIVE_EXPLICIT;
> +			die("`rebase -p` is no longer supported");
>   		} else {
>   			strbuf_reset(&buf);
>   			strbuf_addf(&buf, "%s/interactive", merge_dir());
> @@ -1479,10 +1382,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>   		usage_with_options(builtin_rebase_usage,
>   				   builtin_rebase_options);
>   
> -	if (options.type == REBASE_PRESERVE_MERGES)
> -		warning(_("git rebase --preserve-merges is deprecated. "
> -			  "Use --rebase-merges instead."));
> -
>   	if (keep_base) {
>   		if (options.onto_name)
>   			die(_("cannot combine '--keep-base' with '--onto'"));
> @@ -1728,7 +1627,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>   		case REBASE_APPLY:
>   			die(_("--strategy requires --merge or --interactive"));
>   		case REBASE_MERGE:
> -		case REBASE_PRESERVE_MERGES:
>   			/* compatible */
>   			break;
>   		case REBASE_UNSPECIFIED:
> @@ -1780,7 +1678,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>   
>   	switch (options.type) {
>   	case REBASE_MERGE:
> -	case REBASE_PRESERVE_MERGES:
>   		options.state_dir = merge_dir();
>   		break;
>   	case REBASE_APPLY:
> @@ -1805,28 +1702,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>   		options.reschedule_failed_exec = reschedule_failed_exec;
>   
>   	if (options.signoff) {
> -		if (options.type == REBASE_PRESERVE_MERGES)
> -			die("cannot combine '--signoff' with "
> -			    "'--preserve-merges'");
>   		strvec_push(&options.git_am_opts, "--signoff");
>   		options.flags |= REBASE_FORCE;
>   	}
>   
> -	if (options.type == REBASE_PRESERVE_MERGES) {
> -		/*
> -		 * Note: incompatibility with --signoff handled in signoff block above
> -		 * Note: incompatibility with --interactive is just a strong warning;
> -		 *       git-rebase.txt caveats with "unless you know what you are doing"
> -		 */
> -		if (options.rebase_merges)
> -			die(_("cannot combine '--preserve-merges' with "
> -			      "'--rebase-merges'"));
> -
> -		if (options.reschedule_failed_exec)
> -			die(_("error: cannot combine '--preserve-merges' with "
> -			      "'--reschedule-failed-exec'"));
> -	}
> -
>   	if (!options.root) {
>   		if (argc < 1) {
>   			struct branch *branch;
> diff --git a/git-rebase--preserve-merges.sh b/git-rebase--preserve-merges.sh
> deleted file mode 100644
> index b9c71d2a71b..00000000000
> --- a/git-rebase--preserve-merges.sh
> +++ /dev/null
> @@ -1,1057 +0,0 @@
> -# This shell script fragment is sourced by git-rebase to implement its
> -# preserve-merges mode.
> -#
> -# Copyright (c) 2006 Johannes E. Schindelin
> -#
> -# The file containing rebase commands, comments, and empty lines.
> -# This file is created by "git rebase -i" then edited by the user.  As
> -# the lines are processed, they are removed from the front of this
> -# file and written to the tail of $done.
> -todo="$state_dir"/git-rebase-todo
> -
> -# The rebase command lines that have already been processed.  A line
> -# is moved here when it is first handled, before any associated user
> -# actions.
> -done="$state_dir"/done
> -
> -# The commit message that is planned to be used for any changes that
> -# need to be committed following a user interaction.
> -msg="$state_dir"/message
> -
> -# The file into which is accumulated the suggested commit message for
> -# squash/fixup commands.  When the first of a series of squash/fixups
> -# is seen, the file is created and the commit message from the
> -# previous commit and from the first squash/fixup commit are written
> -# to it.  The commit message for each subsequent squash/fixup commit
> -# is appended to the file as it is processed.
> -#
> -# The first line of the file is of the form
> -#     # This is a combination of $count commits.
> -# where $count is the number of commits whose messages have been
> -# written to the file so far (including the initial "pick" commit).
> -# Each time that a commit message is processed, this line is read and
> -# updated.  It is deleted just before the combined commit is made.
> -squash_msg="$state_dir"/message-squash
> -
> -# If the current series of squash/fixups has not yet included a squash
> -# command, then this file exists and holds the commit message of the
> -# original "pick" commit.  (If the series ends without a "squash"
> -# command, then this can be used as the commit message of the combined
> -# commit without opening the editor.)
> -fixup_msg="$state_dir"/message-fixup
> -
> -# $rewritten is the name of a directory containing files for each
> -# commit that is reachable by at least one merge base of $head and
> -# $upstream. They are not necessarily rewritten, but their children
> -# might be.  This ensures that commits on merged, but otherwise
> -# unrelated side branches are left alone. (Think "X" in the man page's
> -# example.)
> -rewritten="$state_dir"/rewritten
> -
> -dropped="$state_dir"/dropped
> -
> -end="$state_dir"/end
> -msgnum="$state_dir"/msgnum
> -
> -# A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
> -# GIT_AUTHOR_DATE that will be used for the commit that is currently
> -# being rebased.
> -author_script="$state_dir"/author-script
> -
> -# When an "edit" rebase command is being processed, the SHA1 of the
> -# commit to be edited is recorded in this file.  When "git rebase
> -# --continue" is executed, if there are any staged changes then they
> -# will be amended to the HEAD commit, but only provided the HEAD
> -# commit is still the commit to be edited.  When any other rebase
> -# command is processed, this file is deleted.
> -amend="$state_dir"/amend
> -
> -# For the post-rewrite hook, we make a list of rewritten commits and
> -# their new sha1s.  The rewritten-pending list keeps the sha1s of
> -# commits that have been processed, but not committed yet,
> -# e.g. because they are waiting for a 'squash' command.
> -rewritten_list="$state_dir"/rewritten-list
> -rewritten_pending="$state_dir"/rewritten-pending
> -
> -# Work around Git for Windows' Bash whose "read" does not strip CRLF
> -# and leaves CR at the end instead.
> -cr=$(printf "\015")
> -
> -resolvemsg="
> -$(gettext 'Resolve all conflicts manually, mark them as resolved with
> -"git add/rm <conflicted_files>", then run "git rebase --continue".
> -You can instead skip this commit: run "git rebase --skip".
> -To abort and get back to the state before "git rebase", run "git rebase --abort".')
> -"
> -
> -write_basic_state () {
> -	echo "$head_name" > "$state_dir"/head-name &&
> -	echo "$onto" > "$state_dir"/onto &&
> -	echo "$orig_head" > "$state_dir"/orig-head &&
> -	test t = "$GIT_QUIET" && : > "$state_dir"/quiet
> -	test t = "$verbose" && : > "$state_dir"/verbose
> -	test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
> -	test -n "$strategy_opts" && echo "$strategy_opts" > \
> -		"$state_dir"/strategy_opts
> -	test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
> -		"$state_dir"/allow_rerere_autoupdate
> -	test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
> -	test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
> -	test -n "$reschedule_failed_exec" && : > "$state_dir"/reschedule-failed-exec
> -}
> -
> -apply_autostash () {
> -	if test -f "$state_dir/autostash"
> -	then
> -		stash_sha1=$(cat "$state_dir/autostash")
> -		if git stash apply $stash_sha1 >/dev/null 2>&1
> -		then
> -			echo "$(gettext 'Applied autostash.')" >&2
> -		else
> -			git stash store -m "autostash" -q $stash_sha1 ||
> -			die "$(eval_gettext "Cannot store \$stash_sha1")"
> -			gettext 'Applying autostash resulted in conflicts.
> -Your changes are safe in the stash.
> -You can run "git stash pop" or "git stash drop" at any time.
> -' >&2
> -		fi
> -	fi
> -}
> -
> -output () {
> -	case "$verbose" in
> -	'')
> -		output=$("$@" 2>&1 )
> -		status=$?
> -		test $status != 0 && printf "%s\n" "$output"
> -		return $status
> -		;;
> -	*)
> -		"$@"
> -		;;
> -	esac
> -}
> -
> -strategy_args=${strategy:+--strategy=$strategy}
> -test -n "$strategy_opts" &&
> -eval '
> -	for strategy_opt in '"$strategy_opts"'
> -	do
> -		strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")"
> -	done
> -'
> -
> -GIT_CHERRY_PICK_HELP="$resolvemsg"
> -export GIT_CHERRY_PICK_HELP
> -
> -comment_char=$(git config --get core.commentchar 2>/dev/null)
> -case "$comment_char" in
> -'' | auto)
> -	comment_char="#"
> -	;;
> -?)
> -	;;
> -*)
> -	comment_char=$(echo "$comment_char" | cut -c1)
> -	;;
> -esac
> -
> -warn () {
> -	printf '%s\n' "$*" >&2
> -}
> -
> -# Output the commit message for the specified commit.
> -commit_message () {
> -	git cat-file commit "$1" | sed "1,/^$/d"
> -}
> -
> -orig_reflog_action="$GIT_REFLOG_ACTION"
> -
> -comment_for_reflog () {
> -	case "$orig_reflog_action" in
> -	''|rebase*)
> -		GIT_REFLOG_ACTION="rebase -i ($1)"
> -		export GIT_REFLOG_ACTION
> -		;;
> -	esac
> -}
> -
> -last_count=
> -mark_action_done () {
> -	sed -e 1q < "$todo" >> "$done"
> -	sed -e 1d < "$todo" >> "$todo".new
> -	mv -f "$todo".new "$todo"
> -	new_count=$(( $(git stripspace --strip-comments <"$done" | wc -l) ))
> -	echo $new_count >"$msgnum"
> -	total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
> -	echo $total >"$end"
> -	if test "$last_count" != "$new_count"
> -	then
> -		last_count=$new_count
> -		eval_gettext "Rebasing (\$new_count/\$total)"; printf "\r"
> -		test -z "$verbose" || echo
> -	fi
> -}
> -
> -append_todo_help () {
> -	gettext "
> -Commands:
> -p, pick <commit> = use commit
> -r, reword <commit> = use commit, but edit the commit message
> -e, edit <commit> = use commit, but stop for amending
> -s, squash <commit> = use commit, but meld into previous commit
> -f, fixup <commit> = like \"squash\", but discard this commit's log message
> -x, exec <commit> = run command (the rest of the line) using shell
> -d, drop <commit> = remove commit
> -l, label <label> = label current HEAD with a name
> -t, reset <label> = reset HEAD to a label
> -m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
> -.       create a merge commit using the original merge commit's
> -.       message (or the oneline, if no original merge commit was
> -.       specified). Use -c <commit> to reword the commit message.
> -
> -These lines can be re-ordered; they are executed from top to bottom.
> -" | git stripspace --comment-lines >>"$todo"
> -
> -	if test $(get_missing_commit_check_level) = error
> -	then
> -		gettext "
> -Do not remove any line. Use 'drop' explicitly to remove a commit.
> -" | git stripspace --comment-lines >>"$todo"
> -	else
> -		gettext "
> -If you remove a line here THAT COMMIT WILL BE LOST.
> -" | git stripspace --comment-lines >>"$todo"
> -	fi
> -}
> -
> -make_patch () {
> -	sha1_and_parents="$(git rev-list --parents -1 "$1")"
> -	case "$sha1_and_parents" in
> -	?*' '?*' '?*)
> -		git diff --cc $sha1_and_parents
> -		;;
> -	?*' '?*)
> -		git diff-tree -p "$1^!"
> -		;;
> -	*)
> -		echo "Root commit"
> -		;;
> -	esac > "$state_dir"/patch
> -	test -f "$msg" ||
> -		commit_message "$1" > "$msg"
> -	test -f "$author_script" ||
> -		get_author_ident_from_commit "$1" > "$author_script"
> -}
> -
> -die_with_patch () {
> -	echo "$1" > "$state_dir"/stopped-sha
> -	git update-ref REBASE_HEAD "$1"
> -	make_patch "$1"
> -	die "$2"
> -}
> -
> -exit_with_patch () {
> -	echo "$1" > "$state_dir"/stopped-sha
> -	git update-ref REBASE_HEAD "$1"
> -	make_patch $1
> -	git rev-parse --verify HEAD > "$amend"
> -	gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
> -	warn "$(eval_gettext "\
> -You can amend the commit now, with
> -
> -	git commit --amend \$gpg_sign_opt_quoted
> -
> -Once you are satisfied with your changes, run
> -
> -	git rebase --continue")"
> -	warn
> -	exit $2
> -}
> -
> -die_abort () {
> -	apply_autostash
> -	rm -rf "$state_dir"
> -	die "$1"
> -}
> -
> -has_action () {
> -	test -n "$(git stripspace --strip-comments <"$1")"
> -}
> -
> -is_empty_commit() {
> -	tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null) || {
> -		sha1=$1
> -		die "$(eval_gettext "\$sha1: not a commit that can be picked")"
> -	}
> -	ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null) ||
> -		ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
> -	test "$tree" = "$ptree"
> -}
> -
> -is_merge_commit()
> -{
> -	git rev-parse --verify --quiet "$1"^2 >/dev/null 2>&1
> -}
> -
> -# Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
> -# GIT_AUTHOR_DATE exported from the current environment.
> -do_with_author () {
> -	(
> -		export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
> -		"$@"
> -	)
> -}
> -
> -git_sequence_editor () {
> -	if test -z "$GIT_SEQUENCE_EDITOR"
> -	then
> -		GIT_SEQUENCE_EDITOR="$(git config sequence.editor)"
> -		if [ -z "$GIT_SEQUENCE_EDITOR" ]
> -		then
> -			GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $?
> -		fi
> -	fi
> -
> -	eval "$GIT_SEQUENCE_EDITOR" '"$@"'
> -}
> -
> -pick_one () {
> -	ff=--ff
> -
> -	case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac
> -	case "$force_rebase" in '') ;; ?*) ff= ;; esac
> -	output git rev-parse --verify $sha1 || die "$(eval_gettext "Invalid commit name: \$sha1")"
> -
> -	if is_empty_commit "$sha1"
> -	then
> -		empty_args="--allow-empty"
> -	fi
> -
> -	pick_one_preserving_merges "$@"
> -}
> -
> -pick_one_preserving_merges () {
> -	fast_forward=t
> -	case "$1" in
> -	-n)
> -		fast_forward=f
> -		sha1=$2
> -		;;
> -	*)
> -		sha1=$1
> -		;;
> -	esac
> -	sha1=$(git rev-parse $sha1)
> -
> -	if test -f "$state_dir"/current-commit && test "$fast_forward" = t
> -	then
> -		while read current_commit
> -		do
> -			git rev-parse HEAD > "$rewritten"/$current_commit
> -		done <"$state_dir"/current-commit
> -		rm "$state_dir"/current-commit ||
> -			die "$(gettext "Cannot write current commit's replacement sha1")"
> -	fi
> -
> -	echo $sha1 >> "$state_dir"/current-commit
> -
> -	# rewrite parents; if none were rewritten, we can fast-forward.
> -	new_parents=
> -	pend=" $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)"
> -	if test "$pend" = " "
> -	then
> -		pend=" root"
> -	fi
> -	while [ "$pend" != "" ]
> -	do
> -		p=$(expr "$pend" : ' \([^ ]*\)')
> -		pend="${pend# $p}"
> -
> -		if test -f "$rewritten"/$p
> -		then
> -			new_p=$(cat "$rewritten"/$p)
> -
> -			# If the todo reordered commits, and our parent is marked for
> -			# rewriting, but hasn't been gotten to yet, assume the user meant to
> -			# drop it on top of the current HEAD
> -			if test -z "$new_p"
> -			then
> -				new_p=$(git rev-parse HEAD)
> -			fi
> -
> -			test $p != $new_p && fast_forward=f
> -			case "$new_parents" in
> -			*$new_p*)
> -				;; # do nothing; that parent is already there
> -			*)
> -				new_parents="$new_parents $new_p"
> -				;;
> -			esac
> -		else
> -			if test -f "$dropped"/$p
> -			then
> -				fast_forward=f
> -				replacement="$(cat "$dropped"/$p)"
> -				test -z "$replacement" && replacement=root
> -				pend=" $replacement$pend"
> -			else
> -				new_parents="$new_parents $p"
> -			fi
> -		fi
> -	done
> -	case $fast_forward in
> -	t)
> -		output warn "$(eval_gettext "Fast-forward to \$sha1")"
> -		output git reset --hard $sha1 ||
> -			die "$(eval_gettext "Cannot fast-forward to \$sha1")"
> -		;;
> -	f)
> -		first_parent=$(expr "$new_parents" : ' \([^ ]*\)')
> -
> -		if [ "$1" != "-n" ]
> -		then
> -			# detach HEAD to current parent
> -			output git checkout $first_parent 2> /dev/null ||
> -				die "$(eval_gettext "Cannot move HEAD to \$first_parent")"
> -		fi
> -
> -		case "$new_parents" in
> -		' '*' '*)
> -			test "a$1" = a-n && die "$(eval_gettext "Refusing to squash a merge: \$sha1")"
> -
> -			# redo merge
> -			author_script_content=$(get_author_ident_from_commit $sha1)
> -			eval "$author_script_content"
> -			msg_content="$(commit_message $sha1)"
> -			# No point in merging the first parent, that's HEAD
> -			new_parents=${new_parents# $first_parent}
> -			merge_args="--no-log --no-ff"
> -			if ! do_with_author output eval \
> -				git merge ${gpg_sign_opt:+$(git rev-parse \
> -					--sq-quote "$gpg_sign_opt")} \
> -				$allow_rerere_autoupdate "$merge_args" \
> -				"$strategy_args" \
> -				-m "$(git rev-parse --sq-quote "$msg_content")" \
> -				"$new_parents"
> -			then
> -				printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG
> -				die_with_patch $sha1 "$(eval_gettext "Error redoing merge \$sha1")"
> -			fi
> -			echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list"
> -			;;
> -		*)
> -			output eval git cherry-pick $allow_rerere_autoupdate \
> -				$allow_empty_message \
> -				${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
> -				"$strategy_args" "$@" ||
> -				die_with_patch $sha1 "$(eval_gettext "Could not pick \$sha1")"
> -			;;
> -		esac
> -		;;
> -	esac
> -}
> -
> -this_nth_commit_message () {
> -	n=$1
> -	eval_gettext "This is the commit message #\${n}:"
> -}
> -
> -skip_nth_commit_message () {
> -	n=$1
> -	eval_gettext "The commit message #\${n} will be skipped:"
> -}
> -
> -update_squash_messages () {
> -	if test -f "$squash_msg"; then
> -		mv "$squash_msg" "$squash_msg".bak || exit
> -		count=$(($(sed -n \
> -			-e "1s/^$comment_char[^0-9]*\([0-9][0-9]*\).*/\1/p" \
> -			-e "q" < "$squash_msg".bak)+1))
> -		{
> -			printf '%s\n' "$comment_char $(eval_ngettext \
> -				"This is a combination of \$count commit." \
> -				"This is a combination of \$count commits." \
> -				$count)"
> -			sed -e 1d -e '2,/^./{
> -				/^$/d
> -			}' <"$squash_msg".bak
> -		} >"$squash_msg"
> -	else
> -		commit_message HEAD >"$fixup_msg" ||
> -		die "$(eval_gettext "Cannot write \$fixup_msg")"
> -		count=2
> -		{
> -			printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")"
> -			printf '%s\n' "$comment_char $(gettext "This is the 1st commit message:")"
> -			echo
> -			cat "$fixup_msg"
> -		} >"$squash_msg"
> -	fi
> -	case $1 in
> -	squash)
> -		rm -f "$fixup_msg"
> -		echo
> -		printf '%s\n' "$comment_char $(this_nth_commit_message $count)"
> -		echo
> -		commit_message $2
> -		;;
> -	fixup)
> -		echo
> -		printf '%s\n' "$comment_char $(skip_nth_commit_message $count)"
> -		echo
> -		# Change the space after the comment character to TAB:
> -		commit_message $2 | git stripspace --comment-lines | sed -e 's/ /	/'
> -		;;
> -	esac >>"$squash_msg"
> -}
> -
> -peek_next_command () {
> -	git stripspace --strip-comments <"$todo" | sed -n -e 's/ .*//p' -e q
> -}
> -
> -# A squash/fixup has failed.  Prepare the long version of the squash
> -# commit message, then die_with_patch.  This code path requires the
> -# user to edit the combined commit message for all commits that have
> -# been squashed/fixedup so far.  So also erase the old squash
> -# messages, effectively causing the combined commit to be used as the
> -# new basis for any further squash/fixups.  Args: sha1 rest
> -die_failed_squash() {
> -	sha1=$1
> -	rest=$2
> -	mv "$squash_msg" "$msg" || exit
> -	rm -f "$fixup_msg"
> -	cp "$msg" "$GIT_DIR"/MERGE_MSG || exit
> -	warn
> -	warn "$(eval_gettext "Could not apply \$sha1... \$rest")"
> -	die_with_patch $sha1 ""
> -}
> -
> -flush_rewritten_pending() {
> -	test -s "$rewritten_pending" || return
> -	newsha1="$(git rev-parse HEAD^0)"
> -	sed "s/$/ $newsha1/" < "$rewritten_pending" >> "$rewritten_list"
> -	rm -f "$rewritten_pending"
> -}
> -
> -record_in_rewritten() {
> -	oldsha1="$(git rev-parse $1)"
> -	echo "$oldsha1" >> "$rewritten_pending"
> -
> -	case "$(peek_next_command)" in
> -	squash|s|fixup|f)
> -		;;
> -	*)
> -		flush_rewritten_pending
> -		;;
> -	esac
> -}
> -
> -do_pick () {
> -	sha1=$1
> -	rest=$2
> -	if test "$(git rev-parse HEAD)" = "$squash_onto"
> -	then
> -		# Set the correct commit message and author info on the
> -		# sentinel root before cherry-picking the original changes
> -		# without committing (-n).  Finally, update the sentinel again
> -		# to include these changes.  If the cherry-pick results in a
> -		# conflict, this means our behaviour is similar to a standard
> -		# failed cherry-pick during rebase, with a dirty index to
> -		# resolve before manually running git commit --amend then git
> -		# rebase --continue.
> -		git commit --allow-empty --allow-empty-message --amend \
> -			   --no-post-rewrite -n -q -C $sha1 $signoff &&
> -			pick_one -n $sha1 &&
> -			git commit --allow-empty --allow-empty-message \
> -				   --amend --no-post-rewrite -n -q -C $sha1 $signoff \
> -				   ${gpg_sign_opt:+"$gpg_sign_opt"} ||
> -				   die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
> -	else
> -		pick_one $sha1 ||
> -			die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
> -	fi
> -}
> -
> -do_next () {
> -	rm -f "$msg" "$author_script" "$amend" "$state_dir"/stopped-sha || exit
> -	read -r command sha1 rest < "$todo"
> -	case "$command" in
> -	"$comment_char"*|''|noop|drop|d)
> -		mark_action_done
> -		;;
> -	"$cr")
> -		# Work around CR left by "read" (e.g. with Git for Windows' Bash).
> -		mark_action_done
> -		;;
> -	pick|p)
> -		comment_for_reflog pick
> -
> -		mark_action_done
> -		do_pick $sha1 "$rest"
> -		record_in_rewritten $sha1
> -		;;
> -	reword|r)
> -		comment_for_reflog reword
> -
> -		mark_action_done
> -		do_pick $sha1 "$rest"
> -		git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} \
> -			$allow_empty_message || {
> -			warn "$(eval_gettext "\
> -Could not amend commit after successfully picking \$sha1... \$rest
> -This is most likely due to an empty commit message, or the pre-commit hook
> -failed. If the pre-commit hook failed, you may need to resolve the issue before
> -you are able to reword the commit.")"
> -			exit_with_patch $sha1 1
> -		}
> -		record_in_rewritten $sha1
> -		;;
> -	edit|e)
> -		comment_for_reflog edit
> -
> -		mark_action_done
> -		do_pick $sha1 "$rest"
> -		sha1_abbrev=$(git rev-parse --short $sha1)
> -		warn "$(eval_gettext "Stopped at \$sha1_abbrev... \$rest")"
> -		exit_with_patch $sha1 0
> -		;;
> -	squash|s|fixup|f)
> -		case "$command" in
> -		squash|s)
> -			squash_style=squash
> -			;;
> -		fixup|f)
> -			squash_style=fixup
> -			;;
> -		esac
> -		comment_for_reflog $squash_style
> -
> -		test -f "$done" && has_action "$done" ||
> -			die "$(eval_gettext "Cannot '\$squash_style' without a previous commit")"
> -
> -		mark_action_done
> -		update_squash_messages $squash_style $sha1
> -		author_script_content=$(get_author_ident_from_commit HEAD)
> -		echo "$author_script_content" > "$author_script"
> -		eval "$author_script_content"
> -		if ! pick_one -n $sha1
> -		then
> -			git rev-parse --verify HEAD >"$amend"
> -			die_failed_squash $sha1 "$rest"
> -		fi
> -		case "$(peek_next_command)" in
> -		squash|s|fixup|f)
> -			# This is an intermediate commit; its message will only be
> -			# used in case of trouble.  So use the long version:
> -			do_with_author output git commit --amend --no-verify -F "$squash_msg" \
> -				${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
> -				die_failed_squash $sha1 "$rest"
> -			;;
> -		*)
> -			# This is the final command of this squash/fixup group
> -			if test -f "$fixup_msg"
> -			then
> -				do_with_author git commit --amend --no-verify -F "$fixup_msg" \
> -					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
> -					die_failed_squash $sha1 "$rest"
> -			else
> -				cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
> -				rm -f "$GIT_DIR"/MERGE_MSG
> -				do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
> -					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
> -					die_failed_squash $sha1 "$rest"
> -			fi
> -			rm -f "$squash_msg" "$fixup_msg"
> -			;;
> -		esac
> -		record_in_rewritten $sha1
> -		;;
> -	x|"exec")
> -		read -r command rest < "$todo"
> -		mark_action_done
> -		eval_gettextln "Executing: \$rest"
> -		"${SHELL:-@SHELL_PATH@}" -c "$rest" # Actual execution
> -		status=$?
> -		# Run in subshell because require_clean_work_tree can die.
> -		dirty=f
> -		(require_clean_work_tree "rebase" 2>/dev/null) || dirty=t
> -		if test "$status" -ne 0
> -		then
> -			warn "$(eval_gettext "Execution failed: \$rest")"
> -			test "$dirty" = f ||
> -				warn "$(gettext "and made changes to the index and/or the working tree")"
> -
> -			warn "$(gettext "\
> -You can fix the problem, and then run
> -
> -	git rebase --continue")"
> -			warn
> -			if test $status -eq 127		# command not found
> -			then
> -				status=1
> -			fi
> -			exit "$status"
> -		elif test "$dirty" = t
> -		then
> -			# TRANSLATORS: after these lines is a command to be issued by the user
> -			warn "$(eval_gettext "\
> -Execution succeeded: \$rest
> -but left changes to the index and/or the working tree
> -Commit or stash your changes, and then run
> -
> -	git rebase --continue")"
> -			warn
> -			exit 1
> -		fi
> -		;;
> -	*)
> -		warn "$(eval_gettext "Unknown command: \$command \$sha1 \$rest")"
> -		fixtodo="$(gettext "Please fix this using 'git rebase --edit-todo'.")"
> -		if git rev-parse --verify -q "$sha1" >/dev/null
> -		then
> -			die_with_patch $sha1 "$fixtodo"
> -		else
> -			die "$fixtodo"
> -		fi
> -		;;
> -	esac
> -	test -s "$todo" && return
> -
> -	comment_for_reflog finish &&
> -	newhead=$(git rev-parse HEAD) &&
> -	case $head_name in
> -	refs/*)
> -		message="$GIT_REFLOG_ACTION: $head_name onto $onto" &&
> -		git update-ref -m "$message" $head_name $newhead $orig_head &&
> -		git symbolic-ref \
> -		  -m "$GIT_REFLOG_ACTION: returning to $head_name" \
> -		  HEAD $head_name
> -		;;
> -	esac && {
> -		test ! -f "$state_dir"/verbose ||
> -			git diff-tree --stat $orig_head..HEAD
> -	} &&
> -	{
> -		test -s "$rewritten_list" &&
> -		git notes copy --for-rewrite=rebase < "$rewritten_list" ||
> -		true # we don't care if this copying failed
> -	} &&
> -	hook="$(git rev-parse --git-path hooks/post-rewrite)"
> -	if test -x "$hook" && test -s "$rewritten_list"; then
> -		"$hook" rebase < "$rewritten_list"
> -		true # we don't care if this hook failed
> -	fi &&
> -		warn "$(eval_gettext "Successfully rebased and updated \$head_name.")"
> -
> -	return 1 # not failure; just to break the do_rest loop
> -}
> -
> -# can only return 0, when the infinite loop breaks
> -do_rest () {
> -	while :
> -	do
> -		do_next || break
> -	done
> -}
> -
> -expand_todo_ids() {
> -	git rebase--interactive --expand-ids
> -}
> -
> -collapse_todo_ids() {
> -	git rebase--interactive --shorten-ids
> -}
> -
> -# Switch to the branch in $into and notify it in the reflog
> -checkout_onto () {
> -	GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
> -	output git checkout $onto || die_abort "$(gettext "could not detach HEAD")"
> -	git update-ref ORIG_HEAD $orig_head
> -}
> -
> -get_missing_commit_check_level () {
> -	check_level=$(git config --get rebase.missingCommitsCheck)
> -	check_level=${check_level:-ignore}
> -	# Don't be case sensitive
> -	printf '%s' "$check_level" | tr 'A-Z' 'a-z'
> -}
> -
> -# Initiate an action. If the cannot be any
> -# further action it  may exec a command
> -# or exit and not return.
> -#
> -# TODO: Consider a cleaner return model so it
> -# never exits and always return 0 if process
> -# is complete.
> -#
> -# Parameter 1 is the action to initiate.
> -#
> -# Returns 0 if the action was able to complete
> -# and if 1 if further processing is required.
> -initiate_action () {
> -	case "$1" in
> -	continue)
> -		# do we have anything to commit?
> -		if git diff-index --cached --quiet HEAD --
> -		then
> -			# Nothing to commit -- skip this commit
> -
> -			test ! -f "$GIT_DIR"/CHERRY_PICK_HEAD ||
> -			rm "$GIT_DIR"/CHERRY_PICK_HEAD ||
> -			die "$(gettext "Could not remove CHERRY_PICK_HEAD")"
> -		else
> -			if ! test -f "$author_script"
> -			then
> -				gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
> -				die "$(eval_gettext "\
> -You have staged changes in your working tree.
> -If these changes are meant to be
> -squashed into the previous commit, run:
> -
> -  git commit --amend \$gpg_sign_opt_quoted
> -
> -If they are meant to go into a new commit, run:
> -
> -  git commit \$gpg_sign_opt_quoted
> -
> -In both cases, once you're done, continue with:
> -
> -  git rebase --continue
> -")"
> -			fi
> -			. "$author_script" ||
> -				die "$(gettext "Error trying to find the author identity to amend commit")"
> -			if test -f "$amend"
> -			then
> -				current_head=$(git rev-parse --verify HEAD)
> -				test "$current_head" = $(cat "$amend") ||
> -				die "$(gettext "\
> -You have uncommitted changes in your working tree. Please commit them
> -first and then run 'git rebase --continue' again.")"
> -				do_with_author git commit --amend --no-verify -F "$msg" -e \
> -					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
> -					die "$(gettext "Could not commit staged changes.")"
> -			else
> -				do_with_author git commit --no-verify -F "$msg" -e \
> -					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
> -					die "$(gettext "Could not commit staged changes.")"
> -			fi
> -		fi
> -
> -		if test -r "$state_dir"/stopped-sha
> -		then
> -			record_in_rewritten "$(cat "$state_dir"/stopped-sha)"
> -		fi
> -
> -		require_clean_work_tree "rebase"
> -		do_rest
> -		return 0
> -		;;
> -	skip)
> -		git rerere clear
> -		do_rest
> -		return 0
> -		;;
> -	edit-todo)
> -		git stripspace --strip-comments <"$todo" >"$todo".new
> -		mv -f "$todo".new "$todo"
> -		collapse_todo_ids
> -		append_todo_help
> -		gettext "
> -You are editing the todo file of an ongoing interactive rebase.
> -To continue rebase after editing, run:
> -    git rebase --continue
> -
> -" | git stripspace --comment-lines >>"$todo"
> -
> -		git_sequence_editor "$todo" ||
> -			die "$(gettext "Could not execute editor")"
> -		expand_todo_ids
> -
> -		exit
> -		;;
> -	show-current-patch)
> -		exec git show REBASE_HEAD --
> -		;;
> -	*)
> -		return 1 # continue
> -		;;
> -	esac
> -}
> -
> -setup_reflog_action () {
> -	comment_for_reflog start
> -
> -	if test ! -z "$switch_to"
> -	then
> -		GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to"
> -		output git checkout "$switch_to" -- ||
> -			die "$(eval_gettext "Could not checkout \$switch_to")"
> -
> -		comment_for_reflog start
> -	fi
> -}
> -
> -init_basic_state () {
> -	orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
> -	mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
> -	rm -f "$(git rev-parse --git-path REBASE_HEAD)"
> -
> -	: > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")"
> -	write_basic_state
> -}
> -
> -init_revisions_and_shortrevisions () {
> -	shorthead=$(git rev-parse --short $orig_head)
> -	shortonto=$(git rev-parse --short $onto)
> -	if test -z "$rebase_root"
> -		# this is now equivalent to ! -z "$upstream"
> -	then
> -		shortupstream=$(git rev-parse --short $upstream)
> -		revisions=$upstream...$orig_head
> -		shortrevisions=$shortupstream..$shorthead
> -	else
> -		revisions=$onto...$orig_head
> -		shortrevisions=$shorthead
> -		test -z "$squash_onto" ||
> -		echo "$squash_onto" >"$state_dir"/squash-onto
> -	fi
> -}
> -
> -complete_action() {
> -	test -s "$todo" || echo noop >> "$todo"
> -	test -z "$autosquash" || git rebase--interactive --rearrange-squash || exit
> -	test -n "$cmd" && git rebase--interactive --add-exec-commands --cmd "$cmd"
> -
> -	todocount=$(git stripspace --strip-comments <"$todo" | wc -l)
> -	todocount=${todocount##* }
> -
> -cat >>"$todo" <<EOF
> -
> -$comment_char $(eval_ngettext \
> -	"Rebase \$shortrevisions onto \$shortonto (\$todocount command)" \
> -	"Rebase \$shortrevisions onto \$shortonto (\$todocount commands)" \
> -	"$todocount")
> -EOF
> -	append_todo_help
> -	gettext "
> -However, if you remove everything, the rebase will be aborted.
> -
> -" | git stripspace --comment-lines >>"$todo"
> -
> -	if test -z "$keep_empty"
> -	then
> -		printf '%s\n' "$comment_char $(gettext "Note that empty commits are commented out")" >>"$todo"
> -	fi
> -
> -
> -	has_action "$todo" ||
> -		return 2
> -
> -	cp "$todo" "$todo".backup
> -	collapse_todo_ids
> -	git_sequence_editor "$todo" ||
> -		die_abort "$(gettext "Could not execute editor")"
> -
> -	has_action "$todo" ||
> -		return 2
> -
> -	git rebase--interactive --check-todo-list || {
> -		ret=$?
> -		checkout_onto
> -		exit $ret
> -	}
> -
> -	expand_todo_ids
> -	checkout_onto
> -	do_rest
> -}
> -
> -git_rebase__preserve_merges () {
> -	initiate_action "$action"
> -	ret=$?
> -	if test $ret = 0; then
> -		return 0
> -	fi
> -
> -	setup_reflog_action
> -	init_basic_state
> -
> -	if test -z "$rebase_root"
> -	then
> -		mkdir "$rewritten" &&
> -		for c in $(git merge-base --all $orig_head $upstream)
> -		do
> -			echo $onto > "$rewritten"/$c ||
> -				die "$(gettext "Could not init rewritten commits")"
> -		done
> -	else
> -		mkdir "$rewritten" &&
> -		echo $onto > "$rewritten"/root ||
> -			die "$(gettext "Could not init rewritten commits")"
> -	fi
> -
> -	init_revisions_and_shortrevisions
> -
> -	format=$(git config --get rebase.instructionFormat)
> -	# the 'rev-list .. | sed' requires %m to parse; the instruction requires %H to parse
> -	git rev-list --format="%m%H ${format:-%s}" \
> -		--reverse --left-right --topo-order \
> -		$revisions ${restrict_revision+^$restrict_revision} | \
> -		sed -n "s/^>//p" |
> -	while read -r sha1 rest
> -	do
> -		if test -z "$keep_empty" && is_empty_commit $sha1 && ! is_merge_commit $sha1
> -		then
> -			comment_out="$comment_char "
> -		else
> -			comment_out=
> -		fi
> -
> -		if test -z "$rebase_root"
> -		then
> -			preserve=t
> -			for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)
> -			do
> -				if test -f "$rewritten"/$p
> -				then
> -					preserve=f
> -				fi
> -			done
> -		else
> -			preserve=f
> -		fi
> -		if test f = "$preserve"
> -		then
> -			touch "$rewritten"/$sha1
> -			printf '%s\n' "${comment_out}pick $sha1 $rest" >>"$todo"
> -		fi
> -	done
> -
> -	# Watch for commits that been dropped by --cherry-pick
> -	mkdir "$dropped"
> -	# Save all non-cherry-picked changes
> -	git rev-list $revisions --left-right --cherry-pick | \
> -		sed -n "s/^>//p" > "$state_dir"/not-cherry-picks
> -	# Now all commits and note which ones are missing in
> -	# not-cherry-picks and hence being dropped
> -	git rev-list $revisions |
> -	while read rev
> -	do
> -		if test -f "$rewritten"/$rev &&
> -		   ! sane_grep "$rev" "$state_dir"/not-cherry-picks >/dev/null
> -		then
> -			# Use -f2 because if rev-list is telling us this commit is
> -			# not worthwhile, we don't want to track its multiple heads,
> -			# just the history of its first-parent for others that will
> -			# be rebasing on top of it
> -			git rev-list --parents -1 $rev | cut -d' ' -s -f2 > "$dropped"/$rev
> -			sha1=$(git rev-list -1 $rev)
> -			sane_grep -v "^[a-z][a-z]* $sha1" <"$todo" > "${todo}2" ; mv "${todo}2" "$todo"
> -			rm "$rewritten"/$rev
> -		fi
> -	done
> -
> -	complete_action
> -}
> 


^ permalink raw reply	[relevance 0%]

* [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
  @ 2021-09-01 11:57  2%   ` Johannes Schindelin via GitGitGadget
  2021-09-06 10:15  0%     ` Phillip Wood
    1 sibling, 1 reply; 200+ results
From: Johannes Schindelin via GitGitGadget @ 2021-09-01 11:57 UTC (permalink / raw)
  To: git; +Cc: Eric Wong, Johannes Schindelin, Johannes Schindelin

From: Johannes Schindelin <johannes.schindelin@gmx.de>

This option was deprecated in favor of `--rebase-merges` some time ago,
and now we retire it.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 .gitignore                     |    1 -
 Documentation/git-rebase.txt   |   51 --
 Makefile                       |    2 -
 builtin/rebase.c               |  133 +---
 git-rebase--preserve-merges.sh | 1057 --------------------------------
 5 files changed, 6 insertions(+), 1238 deletions(-)
 delete mode 100644 git-rebase--preserve-merges.sh

diff --git a/.gitignore b/.gitignore
index 311841f9bed..98d6275b20d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -125,7 +125,6 @@
 /git-range-diff
 /git-read-tree
 /git-rebase
-/git-rebase--preserve-merges
 /git-receive-pack
 /git-reflog
 /git-remote
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 55af6fd24e2..1382dc6f005 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -525,29 +525,12 @@ i.e. commits that would be excluded by linkgit:git-log[1]'s
 the `rebase-cousins` mode is turned on, such commits are instead rebased
 onto `<upstream>` (or `<onto>`, if specified).
 +
-The `--rebase-merges` mode is similar in spirit to the deprecated
-`--preserve-merges` but works with interactive rebases,
-where commits can be reordered, inserted and dropped at will.
-+
 It is currently only possible to recreate the merge commits using the
 `recursive` merge strategy; Different merge strategies can be used only via
 explicit `exec git merge -s <strategy> [...]` commands.
 +
 See also REBASING MERGES and INCOMPATIBLE OPTIONS below.
 
--p::
---preserve-merges::
-	[DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
-	instead of flattening the history by replaying commits a merge commit
-	introduces. Merge conflict resolutions or manual amendments to merge
-	commits are not preserved.
-+
-This uses the `--interactive` machinery internally, but combining it
-with the `--interactive` option explicitly is generally not a good
-idea unless you know what you are doing (see BUGS below).
-+
-See also INCOMPATIBLE OPTIONS below.
-
 -x <cmd>::
 --exec <cmd>::
 	Append "exec <cmd>" after each line creating a commit in the
@@ -579,9 +562,6 @@ See also INCOMPATIBLE OPTIONS below.
 	the root commit(s) on a branch.  When used with --onto, it
 	will skip changes already contained in <newbase> (instead of
 	<upstream>) whereas without --onto it will operate on every change.
-	When used together with both --onto and --preserve-merges,
-	'all' root commits will be rewritten to have <newbase> as parent
-	instead.
 +
 See also INCOMPATIBLE OPTIONS below.
 
@@ -643,7 +623,6 @@ are incompatible with the following options:
  * --allow-empty-message
  * --[no-]autosquash
  * --rebase-merges
- * --preserve-merges
  * --interactive
  * --exec
  * --no-keep-empty
@@ -654,13 +633,6 @@ are incompatible with the following options:
 
 In addition, the following pairs of options are incompatible:
 
- * --preserve-merges and --interactive
- * --preserve-merges and --signoff
- * --preserve-merges and --rebase-merges
- * --preserve-merges and --empty=
- * --preserve-merges and --ignore-whitespace
- * --preserve-merges and --committer-date-is-author-date
- * --preserve-merges and --ignore-date
  * --keep-base and --onto
  * --keep-base and --root
  * --fork-point and --root
@@ -1274,29 +1246,6 @@ CONFIGURATION
 include::config/rebase.txt[]
 include::config/sequencer.txt[]
 
-BUGS
-----
-The todo list presented by the deprecated `--preserve-merges --interactive`
-does not represent the topology of the revision graph (use `--rebase-merges`
-instead).  Editing commits and rewording their commit messages should work
-fine, but attempts to reorder commits tend to produce counterintuitive results.
-Use `--rebase-merges` in such scenarios instead.
-
-For example, an attempt to rearrange
-------------
-1 --- 2 --- 3 --- 4 --- 5
-------------
-to
-------------
-1 --- 2 --- 4 --- 3 --- 5
-------------
-by moving the "pick 4" line will result in the following history:
-------------
-	3
-       /
-1 --- 2 --- 4 --- 5
-------------
-
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Makefile b/Makefile
index 9573190f1d7..43f93f61660 100644
--- a/Makefile
+++ b/Makefile
@@ -616,7 +616,6 @@ SCRIPT_SH += git-submodule.sh
 SCRIPT_SH += git-web--browse.sh
 
 SCRIPT_LIB += git-mergetool--lib
-SCRIPT_LIB += git-rebase--preserve-merges
 SCRIPT_LIB += git-sh-i18n
 SCRIPT_LIB += git-sh-setup
 
@@ -2649,7 +2648,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
-LOCALIZED_SH += git-rebase--preserve-merges.sh
 LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
 
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 33e09619005..5af6aff9c5e 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -48,8 +48,7 @@ static GIT_PATH_FUNC(merge_dir, "rebase-merge")
 enum rebase_type {
 	REBASE_UNSPECIFIED = -1,
 	REBASE_APPLY,
-	REBASE_MERGE,
-	REBASE_PRESERVE_MERGES
+	REBASE_MERGE
 };
 
 enum empty_type {
@@ -571,8 +570,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
 
 static int is_merge(struct rebase_options *opts)
 {
-	return opts->type == REBASE_MERGE ||
-		opts->type == REBASE_PRESERVE_MERGES;
+	return opts->type == REBASE_MERGE;
 }
 
 static void imply_merge(struct rebase_options *opts, const char *option)
@@ -582,7 +580,6 @@ static void imply_merge(struct rebase_options *opts, const char *option)
 		die(_("%s requires the merge backend"), option);
 		break;
 	case REBASE_MERGE:
-	case REBASE_PRESERVE_MERGES:
 		break;
 	default:
 		opts->type = REBASE_MERGE; /* implied */
@@ -773,17 +770,6 @@ static struct commit *peel_committish(const char *name)
 	return (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);
 }
 
-static void add_var(struct strbuf *buf, const char *name, const char *value)
-{
-	if (!value)
-		strbuf_addf(buf, "unset %s; ", name);
-	else {
-		strbuf_addf(buf, "%s=", name);
-		sq_quote_buf(buf, value);
-		strbuf_addstr(buf, "; ");
-	}
-}
-
 static int move_to_original_branch(struct rebase_options *opts)
 {
 	struct strbuf orig_head_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT;
@@ -940,10 +926,8 @@ static int run_am(struct rebase_options *opts)
 
 static int run_specific_rebase(struct rebase_options *opts, enum action action)
 {
-	const char *argv[] = { NULL, NULL };
-	struct strbuf script_snippet = STRBUF_INIT, buf = STRBUF_INIT;
+	struct strbuf script_snippet = STRBUF_INIT;
 	int status;
-	const char *backend, *backend_func;
 
 	if (opts->type == REBASE_MERGE) {
 		/* Run sequencer-based rebase */
@@ -960,87 +944,11 @@ static int run_specific_rebase(struct rebase_options *opts, enum action action)
 		}
 
 		status = run_sequencer_rebase(opts, action);
-		goto finished_rebase;
-	}
-
-	if (opts->type == REBASE_APPLY) {
+	} else if (opts->type == REBASE_APPLY)
 		status = run_am(opts);
-		goto finished_rebase;
-	}
-
-	add_var(&script_snippet, "GIT_DIR", absolute_path(get_git_dir()));
-	add_var(&script_snippet, "state_dir", opts->state_dir);
-
-	add_var(&script_snippet, "upstream_name", opts->upstream_name);
-	add_var(&script_snippet, "upstream", opts->upstream ?
-		oid_to_hex(&opts->upstream->object.oid) : NULL);
-	add_var(&script_snippet, "head_name",
-		opts->head_name ? opts->head_name : "detached HEAD");
-	add_var(&script_snippet, "orig_head", oid_to_hex(&opts->orig_head));
-	add_var(&script_snippet, "onto", opts->onto ?
-		oid_to_hex(&opts->onto->object.oid) : NULL);
-	add_var(&script_snippet, "onto_name", opts->onto_name);
-	add_var(&script_snippet, "revisions", opts->revisions);
-	add_var(&script_snippet, "restrict_revision", opts->restrict_revision ?
-		oid_to_hex(&opts->restrict_revision->object.oid) : NULL);
-	sq_quote_argv_pretty(&buf, opts->git_am_opts.v);
-	add_var(&script_snippet, "git_am_opt", buf.buf);
-	strbuf_release(&buf);
-	add_var(&script_snippet, "verbose",
-		opts->flags & REBASE_VERBOSE ? "t" : "");
-	add_var(&script_snippet, "diffstat",
-		opts->flags & REBASE_DIFFSTAT ? "t" : "");
-	add_var(&script_snippet, "force_rebase",
-		opts->flags & REBASE_FORCE ? "t" : "");
-	if (opts->switch_to)
-		add_var(&script_snippet, "switch_to", opts->switch_to);
-	add_var(&script_snippet, "action", opts->action ? opts->action : "");
-	add_var(&script_snippet, "signoff", opts->signoff ? "--signoff" : "");
-	add_var(&script_snippet, "allow_rerere_autoupdate",
-		opts->allow_rerere_autoupdate ?
-			opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE ?
-			"--rerere-autoupdate" : "--no-rerere-autoupdate" : "");
-	add_var(&script_snippet, "keep_empty", opts->keep_empty ? "yes" : "");
-	add_var(&script_snippet, "autosquash", opts->autosquash ? "t" : "");
-	add_var(&script_snippet, "gpg_sign_opt", opts->gpg_sign_opt);
-	add_var(&script_snippet, "cmd", opts->cmd);
-	add_var(&script_snippet, "allow_empty_message",
-		opts->allow_empty_message ?  "--allow-empty-message" : "");
-	add_var(&script_snippet, "rebase_merges",
-		opts->rebase_merges ? "t" : "");
-	add_var(&script_snippet, "rebase_cousins",
-		opts->rebase_cousins ? "t" : "");
-	add_var(&script_snippet, "strategy", opts->strategy);
-	add_var(&script_snippet, "strategy_opts", opts->strategy_opts);
-	add_var(&script_snippet, "rebase_root", opts->root ? "t" : "");
-	add_var(&script_snippet, "squash_onto",
-		opts->squash_onto ? oid_to_hex(opts->squash_onto) : "");
-	add_var(&script_snippet, "git_format_patch_opt",
-		opts->git_format_patch_opt.buf);
-
-	if (is_merge(opts) &&
-	    !(opts->flags & REBASE_INTERACTIVE_EXPLICIT)) {
-		strbuf_addstr(&script_snippet,
-			      "GIT_SEQUENCE_EDITOR=:; export GIT_SEQUENCE_EDITOR; ");
-		opts->autosquash = 0;
-	}
-
-	switch (opts->type) {
-	case REBASE_PRESERVE_MERGES:
-		backend = "git-rebase--preserve-merges";
-		backend_func = "git_rebase__preserve_merges";
-		break;
-	default:
+	else
 		BUG("Unhandled rebase type %d", opts->type);
-		break;
-	}
 
-	strbuf_addf(&script_snippet,
-		    ". git-sh-setup && . %s && %s", backend, backend_func);
-	argv[0] = script_snippet.buf;
-
-	status = run_command_v_opt(argv, RUN_USING_SHELL);
-finished_rebase:
 	if (opts->dont_finish_rebase)
 		; /* do nothing */
 	else if (opts->type == REBASE_MERGE)
@@ -1377,10 +1285,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			N_("let the user edit the list of commits to rebase"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
 			parse_opt_interactive),
-		OPT_SET_INT_F('p', "preserve-merges", &options.type,
-			      N_("(DEPRECATED) try to recreate merges instead of "
-				 "ignoring them"),
-			      REBASE_PRESERVE_MERGES, PARSE_OPT_HIDDEN),
 		OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate),
 		OPT_CALLBACK_F(0, "empty", &options, "{drop,keep,ask}",
 			       N_("how to handle commits that become empty"),
@@ -1448,8 +1352,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		strbuf_reset(&buf);
 		strbuf_addf(&buf, "%s/rewritten", merge_dir());
 		if (is_directory(buf.buf)) {
-			options.type = REBASE_PRESERVE_MERGES;
-			options.flags |= REBASE_INTERACTIVE_EXPLICIT;
+			die("`rebase -p` is no longer supported");
 		} else {
 			strbuf_reset(&buf);
 			strbuf_addf(&buf, "%s/interactive", merge_dir());
@@ -1479,10 +1382,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		usage_with_options(builtin_rebase_usage,
 				   builtin_rebase_options);
 
-	if (options.type == REBASE_PRESERVE_MERGES)
-		warning(_("git rebase --preserve-merges is deprecated. "
-			  "Use --rebase-merges instead."));
-
 	if (keep_base) {
 		if (options.onto_name)
 			die(_("cannot combine '--keep-base' with '--onto'"));
@@ -1728,7 +1627,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		case REBASE_APPLY:
 			die(_("--strategy requires --merge or --interactive"));
 		case REBASE_MERGE:
-		case REBASE_PRESERVE_MERGES:
 			/* compatible */
 			break;
 		case REBASE_UNSPECIFIED:
@@ -1780,7 +1678,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 
 	switch (options.type) {
 	case REBASE_MERGE:
-	case REBASE_PRESERVE_MERGES:
 		options.state_dir = merge_dir();
 		break;
 	case REBASE_APPLY:
@@ -1805,28 +1702,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		options.reschedule_failed_exec = reschedule_failed_exec;
 
 	if (options.signoff) {
-		if (options.type == REBASE_PRESERVE_MERGES)
-			die("cannot combine '--signoff' with "
-			    "'--preserve-merges'");
 		strvec_push(&options.git_am_opts, "--signoff");
 		options.flags |= REBASE_FORCE;
 	}
 
-	if (options.type == REBASE_PRESERVE_MERGES) {
-		/*
-		 * Note: incompatibility with --signoff handled in signoff block above
-		 * Note: incompatibility with --interactive is just a strong warning;
-		 *       git-rebase.txt caveats with "unless you know what you are doing"
-		 */
-		if (options.rebase_merges)
-			die(_("cannot combine '--preserve-merges' with "
-			      "'--rebase-merges'"));
-
-		if (options.reschedule_failed_exec)
-			die(_("error: cannot combine '--preserve-merges' with "
-			      "'--reschedule-failed-exec'"));
-	}
-
 	if (!options.root) {
 		if (argc < 1) {
 			struct branch *branch;
diff --git a/git-rebase--preserve-merges.sh b/git-rebase--preserve-merges.sh
deleted file mode 100644
index b9c71d2a71b..00000000000
--- a/git-rebase--preserve-merges.sh
+++ /dev/null
@@ -1,1057 +0,0 @@
-# This shell script fragment is sourced by git-rebase to implement its
-# preserve-merges mode.
-#
-# Copyright (c) 2006 Johannes E. Schindelin
-#
-# The file containing rebase commands, comments, and empty lines.
-# This file is created by "git rebase -i" then edited by the user.  As
-# the lines are processed, they are removed from the front of this
-# file and written to the tail of $done.
-todo="$state_dir"/git-rebase-todo
-
-# The rebase command lines that have already been processed.  A line
-# is moved here when it is first handled, before any associated user
-# actions.
-done="$state_dir"/done
-
-# The commit message that is planned to be used for any changes that
-# need to be committed following a user interaction.
-msg="$state_dir"/message
-
-# The file into which is accumulated the suggested commit message for
-# squash/fixup commands.  When the first of a series of squash/fixups
-# is seen, the file is created and the commit message from the
-# previous commit and from the first squash/fixup commit are written
-# to it.  The commit message for each subsequent squash/fixup commit
-# is appended to the file as it is processed.
-#
-# The first line of the file is of the form
-#     # This is a combination of $count commits.
-# where $count is the number of commits whose messages have been
-# written to the file so far (including the initial "pick" commit).
-# Each time that a commit message is processed, this line is read and
-# updated.  It is deleted just before the combined commit is made.
-squash_msg="$state_dir"/message-squash
-
-# If the current series of squash/fixups has not yet included a squash
-# command, then this file exists and holds the commit message of the
-# original "pick" commit.  (If the series ends without a "squash"
-# command, then this can be used as the commit message of the combined
-# commit without opening the editor.)
-fixup_msg="$state_dir"/message-fixup
-
-# $rewritten is the name of a directory containing files for each
-# commit that is reachable by at least one merge base of $head and
-# $upstream. They are not necessarily rewritten, but their children
-# might be.  This ensures that commits on merged, but otherwise
-# unrelated side branches are left alone. (Think "X" in the man page's
-# example.)
-rewritten="$state_dir"/rewritten
-
-dropped="$state_dir"/dropped
-
-end="$state_dir"/end
-msgnum="$state_dir"/msgnum
-
-# A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
-# GIT_AUTHOR_DATE that will be used for the commit that is currently
-# being rebased.
-author_script="$state_dir"/author-script
-
-# When an "edit" rebase command is being processed, the SHA1 of the
-# commit to be edited is recorded in this file.  When "git rebase
-# --continue" is executed, if there are any staged changes then they
-# will be amended to the HEAD commit, but only provided the HEAD
-# commit is still the commit to be edited.  When any other rebase
-# command is processed, this file is deleted.
-amend="$state_dir"/amend
-
-# For the post-rewrite hook, we make a list of rewritten commits and
-# their new sha1s.  The rewritten-pending list keeps the sha1s of
-# commits that have been processed, but not committed yet,
-# e.g. because they are waiting for a 'squash' command.
-rewritten_list="$state_dir"/rewritten-list
-rewritten_pending="$state_dir"/rewritten-pending
-
-# Work around Git for Windows' Bash whose "read" does not strip CRLF
-# and leaves CR at the end instead.
-cr=$(printf "\015")
-
-resolvemsg="
-$(gettext 'Resolve all conflicts manually, mark them as resolved with
-"git add/rm <conflicted_files>", then run "git rebase --continue".
-You can instead skip this commit: run "git rebase --skip".
-To abort and get back to the state before "git rebase", run "git rebase --abort".')
-"
-
-write_basic_state () {
-	echo "$head_name" > "$state_dir"/head-name &&
-	echo "$onto" > "$state_dir"/onto &&
-	echo "$orig_head" > "$state_dir"/orig-head &&
-	test t = "$GIT_QUIET" && : > "$state_dir"/quiet
-	test t = "$verbose" && : > "$state_dir"/verbose
-	test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
-	test -n "$strategy_opts" && echo "$strategy_opts" > \
-		"$state_dir"/strategy_opts
-	test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
-		"$state_dir"/allow_rerere_autoupdate
-	test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
-	test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
-	test -n "$reschedule_failed_exec" && : > "$state_dir"/reschedule-failed-exec
-}
-
-apply_autostash () {
-	if test -f "$state_dir/autostash"
-	then
-		stash_sha1=$(cat "$state_dir/autostash")
-		if git stash apply $stash_sha1 >/dev/null 2>&1
-		then
-			echo "$(gettext 'Applied autostash.')" >&2
-		else
-			git stash store -m "autostash" -q $stash_sha1 ||
-			die "$(eval_gettext "Cannot store \$stash_sha1")"
-			gettext 'Applying autostash resulted in conflicts.
-Your changes are safe in the stash.
-You can run "git stash pop" or "git stash drop" at any time.
-' >&2
-		fi
-	fi
-}
-
-output () {
-	case "$verbose" in
-	'')
-		output=$("$@" 2>&1 )
-		status=$?
-		test $status != 0 && printf "%s\n" "$output"
-		return $status
-		;;
-	*)
-		"$@"
-		;;
-	esac
-}
-
-strategy_args=${strategy:+--strategy=$strategy}
-test -n "$strategy_opts" &&
-eval '
-	for strategy_opt in '"$strategy_opts"'
-	do
-		strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")"
-	done
-'
-
-GIT_CHERRY_PICK_HELP="$resolvemsg"
-export GIT_CHERRY_PICK_HELP
-
-comment_char=$(git config --get core.commentchar 2>/dev/null)
-case "$comment_char" in
-'' | auto)
-	comment_char="#"
-	;;
-?)
-	;;
-*)
-	comment_char=$(echo "$comment_char" | cut -c1)
-	;;
-esac
-
-warn () {
-	printf '%s\n' "$*" >&2
-}
-
-# Output the commit message for the specified commit.
-commit_message () {
-	git cat-file commit "$1" | sed "1,/^$/d"
-}
-
-orig_reflog_action="$GIT_REFLOG_ACTION"
-
-comment_for_reflog () {
-	case "$orig_reflog_action" in
-	''|rebase*)
-		GIT_REFLOG_ACTION="rebase -i ($1)"
-		export GIT_REFLOG_ACTION
-		;;
-	esac
-}
-
-last_count=
-mark_action_done () {
-	sed -e 1q < "$todo" >> "$done"
-	sed -e 1d < "$todo" >> "$todo".new
-	mv -f "$todo".new "$todo"
-	new_count=$(( $(git stripspace --strip-comments <"$done" | wc -l) ))
-	echo $new_count >"$msgnum"
-	total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
-	echo $total >"$end"
-	if test "$last_count" != "$new_count"
-	then
-		last_count=$new_count
-		eval_gettext "Rebasing (\$new_count/\$total)"; printf "\r"
-		test -z "$verbose" || echo
-	fi
-}
-
-append_todo_help () {
-	gettext "
-Commands:
-p, pick <commit> = use commit
-r, reword <commit> = use commit, but edit the commit message
-e, edit <commit> = use commit, but stop for amending
-s, squash <commit> = use commit, but meld into previous commit
-f, fixup <commit> = like \"squash\", but discard this commit's log message
-x, exec <commit> = run command (the rest of the line) using shell
-d, drop <commit> = remove commit
-l, label <label> = label current HEAD with a name
-t, reset <label> = reset HEAD to a label
-m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
-.       create a merge commit using the original merge commit's
-.       message (or the oneline, if no original merge commit was
-.       specified). Use -c <commit> to reword the commit message.
-
-These lines can be re-ordered; they are executed from top to bottom.
-" | git stripspace --comment-lines >>"$todo"
-
-	if test $(get_missing_commit_check_level) = error
-	then
-		gettext "
-Do not remove any line. Use 'drop' explicitly to remove a commit.
-" | git stripspace --comment-lines >>"$todo"
-	else
-		gettext "
-If you remove a line here THAT COMMIT WILL BE LOST.
-" | git stripspace --comment-lines >>"$todo"
-	fi
-}
-
-make_patch () {
-	sha1_and_parents="$(git rev-list --parents -1 "$1")"
-	case "$sha1_and_parents" in
-	?*' '?*' '?*)
-		git diff --cc $sha1_and_parents
-		;;
-	?*' '?*)
-		git diff-tree -p "$1^!"
-		;;
-	*)
-		echo "Root commit"
-		;;
-	esac > "$state_dir"/patch
-	test -f "$msg" ||
-		commit_message "$1" > "$msg"
-	test -f "$author_script" ||
-		get_author_ident_from_commit "$1" > "$author_script"
-}
-
-die_with_patch () {
-	echo "$1" > "$state_dir"/stopped-sha
-	git update-ref REBASE_HEAD "$1"
-	make_patch "$1"
-	die "$2"
-}
-
-exit_with_patch () {
-	echo "$1" > "$state_dir"/stopped-sha
-	git update-ref REBASE_HEAD "$1"
-	make_patch $1
-	git rev-parse --verify HEAD > "$amend"
-	gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
-	warn "$(eval_gettext "\
-You can amend the commit now, with
-
-	git commit --amend \$gpg_sign_opt_quoted
-
-Once you are satisfied with your changes, run
-
-	git rebase --continue")"
-	warn
-	exit $2
-}
-
-die_abort () {
-	apply_autostash
-	rm -rf "$state_dir"
-	die "$1"
-}
-
-has_action () {
-	test -n "$(git stripspace --strip-comments <"$1")"
-}
-
-is_empty_commit() {
-	tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null) || {
-		sha1=$1
-		die "$(eval_gettext "\$sha1: not a commit that can be picked")"
-	}
-	ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null) ||
-		ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
-	test "$tree" = "$ptree"
-}
-
-is_merge_commit()
-{
-	git rev-parse --verify --quiet "$1"^2 >/dev/null 2>&1
-}
-
-# Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
-# GIT_AUTHOR_DATE exported from the current environment.
-do_with_author () {
-	(
-		export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
-		"$@"
-	)
-}
-
-git_sequence_editor () {
-	if test -z "$GIT_SEQUENCE_EDITOR"
-	then
-		GIT_SEQUENCE_EDITOR="$(git config sequence.editor)"
-		if [ -z "$GIT_SEQUENCE_EDITOR" ]
-		then
-			GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $?
-		fi
-	fi
-
-	eval "$GIT_SEQUENCE_EDITOR" '"$@"'
-}
-
-pick_one () {
-	ff=--ff
-
-	case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac
-	case "$force_rebase" in '') ;; ?*) ff= ;; esac
-	output git rev-parse --verify $sha1 || die "$(eval_gettext "Invalid commit name: \$sha1")"
-
-	if is_empty_commit "$sha1"
-	then
-		empty_args="--allow-empty"
-	fi
-
-	pick_one_preserving_merges "$@"
-}
-
-pick_one_preserving_merges () {
-	fast_forward=t
-	case "$1" in
-	-n)
-		fast_forward=f
-		sha1=$2
-		;;
-	*)
-		sha1=$1
-		;;
-	esac
-	sha1=$(git rev-parse $sha1)
-
-	if test -f "$state_dir"/current-commit && test "$fast_forward" = t
-	then
-		while read current_commit
-		do
-			git rev-parse HEAD > "$rewritten"/$current_commit
-		done <"$state_dir"/current-commit
-		rm "$state_dir"/current-commit ||
-			die "$(gettext "Cannot write current commit's replacement sha1")"
-	fi
-
-	echo $sha1 >> "$state_dir"/current-commit
-
-	# rewrite parents; if none were rewritten, we can fast-forward.
-	new_parents=
-	pend=" $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)"
-	if test "$pend" = " "
-	then
-		pend=" root"
-	fi
-	while [ "$pend" != "" ]
-	do
-		p=$(expr "$pend" : ' \([^ ]*\)')
-		pend="${pend# $p}"
-
-		if test -f "$rewritten"/$p
-		then
-			new_p=$(cat "$rewritten"/$p)
-
-			# If the todo reordered commits, and our parent is marked for
-			# rewriting, but hasn't been gotten to yet, assume the user meant to
-			# drop it on top of the current HEAD
-			if test -z "$new_p"
-			then
-				new_p=$(git rev-parse HEAD)
-			fi
-
-			test $p != $new_p && fast_forward=f
-			case "$new_parents" in
-			*$new_p*)
-				;; # do nothing; that parent is already there
-			*)
-				new_parents="$new_parents $new_p"
-				;;
-			esac
-		else
-			if test -f "$dropped"/$p
-			then
-				fast_forward=f
-				replacement="$(cat "$dropped"/$p)"
-				test -z "$replacement" && replacement=root
-				pend=" $replacement$pend"
-			else
-				new_parents="$new_parents $p"
-			fi
-		fi
-	done
-	case $fast_forward in
-	t)
-		output warn "$(eval_gettext "Fast-forward to \$sha1")"
-		output git reset --hard $sha1 ||
-			die "$(eval_gettext "Cannot fast-forward to \$sha1")"
-		;;
-	f)
-		first_parent=$(expr "$new_parents" : ' \([^ ]*\)')
-
-		if [ "$1" != "-n" ]
-		then
-			# detach HEAD to current parent
-			output git checkout $first_parent 2> /dev/null ||
-				die "$(eval_gettext "Cannot move HEAD to \$first_parent")"
-		fi
-
-		case "$new_parents" in
-		' '*' '*)
-			test "a$1" = a-n && die "$(eval_gettext "Refusing to squash a merge: \$sha1")"
-
-			# redo merge
-			author_script_content=$(get_author_ident_from_commit $sha1)
-			eval "$author_script_content"
-			msg_content="$(commit_message $sha1)"
-			# No point in merging the first parent, that's HEAD
-			new_parents=${new_parents# $first_parent}
-			merge_args="--no-log --no-ff"
-			if ! do_with_author output eval \
-				git merge ${gpg_sign_opt:+$(git rev-parse \
-					--sq-quote "$gpg_sign_opt")} \
-				$allow_rerere_autoupdate "$merge_args" \
-				"$strategy_args" \
-				-m "$(git rev-parse --sq-quote "$msg_content")" \
-				"$new_parents"
-			then
-				printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG
-				die_with_patch $sha1 "$(eval_gettext "Error redoing merge \$sha1")"
-			fi
-			echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list"
-			;;
-		*)
-			output eval git cherry-pick $allow_rerere_autoupdate \
-				$allow_empty_message \
-				${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
-				"$strategy_args" "$@" ||
-				die_with_patch $sha1 "$(eval_gettext "Could not pick \$sha1")"
-			;;
-		esac
-		;;
-	esac
-}
-
-this_nth_commit_message () {
-	n=$1
-	eval_gettext "This is the commit message #\${n}:"
-}
-
-skip_nth_commit_message () {
-	n=$1
-	eval_gettext "The commit message #\${n} will be skipped:"
-}
-
-update_squash_messages () {
-	if test -f "$squash_msg"; then
-		mv "$squash_msg" "$squash_msg".bak || exit
-		count=$(($(sed -n \
-			-e "1s/^$comment_char[^0-9]*\([0-9][0-9]*\).*/\1/p" \
-			-e "q" < "$squash_msg".bak)+1))
-		{
-			printf '%s\n' "$comment_char $(eval_ngettext \
-				"This is a combination of \$count commit." \
-				"This is a combination of \$count commits." \
-				$count)"
-			sed -e 1d -e '2,/^./{
-				/^$/d
-			}' <"$squash_msg".bak
-		} >"$squash_msg"
-	else
-		commit_message HEAD >"$fixup_msg" ||
-		die "$(eval_gettext "Cannot write \$fixup_msg")"
-		count=2
-		{
-			printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")"
-			printf '%s\n' "$comment_char $(gettext "This is the 1st commit message:")"
-			echo
-			cat "$fixup_msg"
-		} >"$squash_msg"
-	fi
-	case $1 in
-	squash)
-		rm -f "$fixup_msg"
-		echo
-		printf '%s\n' "$comment_char $(this_nth_commit_message $count)"
-		echo
-		commit_message $2
-		;;
-	fixup)
-		echo
-		printf '%s\n' "$comment_char $(skip_nth_commit_message $count)"
-		echo
-		# Change the space after the comment character to TAB:
-		commit_message $2 | git stripspace --comment-lines | sed -e 's/ /	/'
-		;;
-	esac >>"$squash_msg"
-}
-
-peek_next_command () {
-	git stripspace --strip-comments <"$todo" | sed -n -e 's/ .*//p' -e q
-}
-
-# A squash/fixup has failed.  Prepare the long version of the squash
-# commit message, then die_with_patch.  This code path requires the
-# user to edit the combined commit message for all commits that have
-# been squashed/fixedup so far.  So also erase the old squash
-# messages, effectively causing the combined commit to be used as the
-# new basis for any further squash/fixups.  Args: sha1 rest
-die_failed_squash() {
-	sha1=$1
-	rest=$2
-	mv "$squash_msg" "$msg" || exit
-	rm -f "$fixup_msg"
-	cp "$msg" "$GIT_DIR"/MERGE_MSG || exit
-	warn
-	warn "$(eval_gettext "Could not apply \$sha1... \$rest")"
-	die_with_patch $sha1 ""
-}
-
-flush_rewritten_pending() {
-	test -s "$rewritten_pending" || return
-	newsha1="$(git rev-parse HEAD^0)"
-	sed "s/$/ $newsha1/" < "$rewritten_pending" >> "$rewritten_list"
-	rm -f "$rewritten_pending"
-}
-
-record_in_rewritten() {
-	oldsha1="$(git rev-parse $1)"
-	echo "$oldsha1" >> "$rewritten_pending"
-
-	case "$(peek_next_command)" in
-	squash|s|fixup|f)
-		;;
-	*)
-		flush_rewritten_pending
-		;;
-	esac
-}
-
-do_pick () {
-	sha1=$1
-	rest=$2
-	if test "$(git rev-parse HEAD)" = "$squash_onto"
-	then
-		# Set the correct commit message and author info on the
-		# sentinel root before cherry-picking the original changes
-		# without committing (-n).  Finally, update the sentinel again
-		# to include these changes.  If the cherry-pick results in a
-		# conflict, this means our behaviour is similar to a standard
-		# failed cherry-pick during rebase, with a dirty index to
-		# resolve before manually running git commit --amend then git
-		# rebase --continue.
-		git commit --allow-empty --allow-empty-message --amend \
-			   --no-post-rewrite -n -q -C $sha1 $signoff &&
-			pick_one -n $sha1 &&
-			git commit --allow-empty --allow-empty-message \
-				   --amend --no-post-rewrite -n -q -C $sha1 $signoff \
-				   ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-				   die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
-	else
-		pick_one $sha1 ||
-			die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
-	fi
-}
-
-do_next () {
-	rm -f "$msg" "$author_script" "$amend" "$state_dir"/stopped-sha || exit
-	read -r command sha1 rest < "$todo"
-	case "$command" in
-	"$comment_char"*|''|noop|drop|d)
-		mark_action_done
-		;;
-	"$cr")
-		# Work around CR left by "read" (e.g. with Git for Windows' Bash).
-		mark_action_done
-		;;
-	pick|p)
-		comment_for_reflog pick
-
-		mark_action_done
-		do_pick $sha1 "$rest"
-		record_in_rewritten $sha1
-		;;
-	reword|r)
-		comment_for_reflog reword
-
-		mark_action_done
-		do_pick $sha1 "$rest"
-		git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} \
-			$allow_empty_message || {
-			warn "$(eval_gettext "\
-Could not amend commit after successfully picking \$sha1... \$rest
-This is most likely due to an empty commit message, or the pre-commit hook
-failed. If the pre-commit hook failed, you may need to resolve the issue before
-you are able to reword the commit.")"
-			exit_with_patch $sha1 1
-		}
-		record_in_rewritten $sha1
-		;;
-	edit|e)
-		comment_for_reflog edit
-
-		mark_action_done
-		do_pick $sha1 "$rest"
-		sha1_abbrev=$(git rev-parse --short $sha1)
-		warn "$(eval_gettext "Stopped at \$sha1_abbrev... \$rest")"
-		exit_with_patch $sha1 0
-		;;
-	squash|s|fixup|f)
-		case "$command" in
-		squash|s)
-			squash_style=squash
-			;;
-		fixup|f)
-			squash_style=fixup
-			;;
-		esac
-		comment_for_reflog $squash_style
-
-		test -f "$done" && has_action "$done" ||
-			die "$(eval_gettext "Cannot '\$squash_style' without a previous commit")"
-
-		mark_action_done
-		update_squash_messages $squash_style $sha1
-		author_script_content=$(get_author_ident_from_commit HEAD)
-		echo "$author_script_content" > "$author_script"
-		eval "$author_script_content"
-		if ! pick_one -n $sha1
-		then
-			git rev-parse --verify HEAD >"$amend"
-			die_failed_squash $sha1 "$rest"
-		fi
-		case "$(peek_next_command)" in
-		squash|s|fixup|f)
-			# This is an intermediate commit; its message will only be
-			# used in case of trouble.  So use the long version:
-			do_with_author output git commit --amend --no-verify -F "$squash_msg" \
-				${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-				die_failed_squash $sha1 "$rest"
-			;;
-		*)
-			# This is the final command of this squash/fixup group
-			if test -f "$fixup_msg"
-			then
-				do_with_author git commit --amend --no-verify -F "$fixup_msg" \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die_failed_squash $sha1 "$rest"
-			else
-				cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
-				rm -f "$GIT_DIR"/MERGE_MSG
-				do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die_failed_squash $sha1 "$rest"
-			fi
-			rm -f "$squash_msg" "$fixup_msg"
-			;;
-		esac
-		record_in_rewritten $sha1
-		;;
-	x|"exec")
-		read -r command rest < "$todo"
-		mark_action_done
-		eval_gettextln "Executing: \$rest"
-		"${SHELL:-@SHELL_PATH@}" -c "$rest" # Actual execution
-		status=$?
-		# Run in subshell because require_clean_work_tree can die.
-		dirty=f
-		(require_clean_work_tree "rebase" 2>/dev/null) || dirty=t
-		if test "$status" -ne 0
-		then
-			warn "$(eval_gettext "Execution failed: \$rest")"
-			test "$dirty" = f ||
-				warn "$(gettext "and made changes to the index and/or the working tree")"
-
-			warn "$(gettext "\
-You can fix the problem, and then run
-
-	git rebase --continue")"
-			warn
-			if test $status -eq 127		# command not found
-			then
-				status=1
-			fi
-			exit "$status"
-		elif test "$dirty" = t
-		then
-			# TRANSLATORS: after these lines is a command to be issued by the user
-			warn "$(eval_gettext "\
-Execution succeeded: \$rest
-but left changes to the index and/or the working tree
-Commit or stash your changes, and then run
-
-	git rebase --continue")"
-			warn
-			exit 1
-		fi
-		;;
-	*)
-		warn "$(eval_gettext "Unknown command: \$command \$sha1 \$rest")"
-		fixtodo="$(gettext "Please fix this using 'git rebase --edit-todo'.")"
-		if git rev-parse --verify -q "$sha1" >/dev/null
-		then
-			die_with_patch $sha1 "$fixtodo"
-		else
-			die "$fixtodo"
-		fi
-		;;
-	esac
-	test -s "$todo" && return
-
-	comment_for_reflog finish &&
-	newhead=$(git rev-parse HEAD) &&
-	case $head_name in
-	refs/*)
-		message="$GIT_REFLOG_ACTION: $head_name onto $onto" &&
-		git update-ref -m "$message" $head_name $newhead $orig_head &&
-		git symbolic-ref \
-		  -m "$GIT_REFLOG_ACTION: returning to $head_name" \
-		  HEAD $head_name
-		;;
-	esac && {
-		test ! -f "$state_dir"/verbose ||
-			git diff-tree --stat $orig_head..HEAD
-	} &&
-	{
-		test -s "$rewritten_list" &&
-		git notes copy --for-rewrite=rebase < "$rewritten_list" ||
-		true # we don't care if this copying failed
-	} &&
-	hook="$(git rev-parse --git-path hooks/post-rewrite)"
-	if test -x "$hook" && test -s "$rewritten_list"; then
-		"$hook" rebase < "$rewritten_list"
-		true # we don't care if this hook failed
-	fi &&
-		warn "$(eval_gettext "Successfully rebased and updated \$head_name.")"
-
-	return 1 # not failure; just to break the do_rest loop
-}
-
-# can only return 0, when the infinite loop breaks
-do_rest () {
-	while :
-	do
-		do_next || break
-	done
-}
-
-expand_todo_ids() {
-	git rebase--interactive --expand-ids
-}
-
-collapse_todo_ids() {
-	git rebase--interactive --shorten-ids
-}
-
-# Switch to the branch in $into and notify it in the reflog
-checkout_onto () {
-	GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
-	output git checkout $onto || die_abort "$(gettext "could not detach HEAD")"
-	git update-ref ORIG_HEAD $orig_head
-}
-
-get_missing_commit_check_level () {
-	check_level=$(git config --get rebase.missingCommitsCheck)
-	check_level=${check_level:-ignore}
-	# Don't be case sensitive
-	printf '%s' "$check_level" | tr 'A-Z' 'a-z'
-}
-
-# Initiate an action. If the cannot be any
-# further action it  may exec a command
-# or exit and not return.
-#
-# TODO: Consider a cleaner return model so it
-# never exits and always return 0 if process
-# is complete.
-#
-# Parameter 1 is the action to initiate.
-#
-# Returns 0 if the action was able to complete
-# and if 1 if further processing is required.
-initiate_action () {
-	case "$1" in
-	continue)
-		# do we have anything to commit?
-		if git diff-index --cached --quiet HEAD --
-		then
-			# Nothing to commit -- skip this commit
-
-			test ! -f "$GIT_DIR"/CHERRY_PICK_HEAD ||
-			rm "$GIT_DIR"/CHERRY_PICK_HEAD ||
-			die "$(gettext "Could not remove CHERRY_PICK_HEAD")"
-		else
-			if ! test -f "$author_script"
-			then
-				gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
-				die "$(eval_gettext "\
-You have staged changes in your working tree.
-If these changes are meant to be
-squashed into the previous commit, run:
-
-  git commit --amend \$gpg_sign_opt_quoted
-
-If they are meant to go into a new commit, run:
-
-  git commit \$gpg_sign_opt_quoted
-
-In both cases, once you're done, continue with:
-
-  git rebase --continue
-")"
-			fi
-			. "$author_script" ||
-				die "$(gettext "Error trying to find the author identity to amend commit")"
-			if test -f "$amend"
-			then
-				current_head=$(git rev-parse --verify HEAD)
-				test "$current_head" = $(cat "$amend") ||
-				die "$(gettext "\
-You have uncommitted changes in your working tree. Please commit them
-first and then run 'git rebase --continue' again.")"
-				do_with_author git commit --amend --no-verify -F "$msg" -e \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die "$(gettext "Could not commit staged changes.")"
-			else
-				do_with_author git commit --no-verify -F "$msg" -e \
-					${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
-					die "$(gettext "Could not commit staged changes.")"
-			fi
-		fi
-
-		if test -r "$state_dir"/stopped-sha
-		then
-			record_in_rewritten "$(cat "$state_dir"/stopped-sha)"
-		fi
-
-		require_clean_work_tree "rebase"
-		do_rest
-		return 0
-		;;
-	skip)
-		git rerere clear
-		do_rest
-		return 0
-		;;
-	edit-todo)
-		git stripspace --strip-comments <"$todo" >"$todo".new
-		mv -f "$todo".new "$todo"
-		collapse_todo_ids
-		append_todo_help
-		gettext "
-You are editing the todo file of an ongoing interactive rebase.
-To continue rebase after editing, run:
-    git rebase --continue
-
-" | git stripspace --comment-lines >>"$todo"
-
-		git_sequence_editor "$todo" ||
-			die "$(gettext "Could not execute editor")"
-		expand_todo_ids
-
-		exit
-		;;
-	show-current-patch)
-		exec git show REBASE_HEAD --
-		;;
-	*)
-		return 1 # continue
-		;;
-	esac
-}
-
-setup_reflog_action () {
-	comment_for_reflog start
-
-	if test ! -z "$switch_to"
-	then
-		GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to"
-		output git checkout "$switch_to" -- ||
-			die "$(eval_gettext "Could not checkout \$switch_to")"
-
-		comment_for_reflog start
-	fi
-}
-
-init_basic_state () {
-	orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
-	mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
-	rm -f "$(git rev-parse --git-path REBASE_HEAD)"
-
-	: > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")"
-	write_basic_state
-}
-
-init_revisions_and_shortrevisions () {
-	shorthead=$(git rev-parse --short $orig_head)
-	shortonto=$(git rev-parse --short $onto)
-	if test -z "$rebase_root"
-		# this is now equivalent to ! -z "$upstream"
-	then
-		shortupstream=$(git rev-parse --short $upstream)
-		revisions=$upstream...$orig_head
-		shortrevisions=$shortupstream..$shorthead
-	else
-		revisions=$onto...$orig_head
-		shortrevisions=$shorthead
-		test -z "$squash_onto" ||
-		echo "$squash_onto" >"$state_dir"/squash-onto
-	fi
-}
-
-complete_action() {
-	test -s "$todo" || echo noop >> "$todo"
-	test -z "$autosquash" || git rebase--interactive --rearrange-squash || exit
-	test -n "$cmd" && git rebase--interactive --add-exec-commands --cmd "$cmd"
-
-	todocount=$(git stripspace --strip-comments <"$todo" | wc -l)
-	todocount=${todocount##* }
-
-cat >>"$todo" <<EOF
-
-$comment_char $(eval_ngettext \
-	"Rebase \$shortrevisions onto \$shortonto (\$todocount command)" \
-	"Rebase \$shortrevisions onto \$shortonto (\$todocount commands)" \
-	"$todocount")
-EOF
-	append_todo_help
-	gettext "
-However, if you remove everything, the rebase will be aborted.
-
-" | git stripspace --comment-lines >>"$todo"
-
-	if test -z "$keep_empty"
-	then
-		printf '%s\n' "$comment_char $(gettext "Note that empty commits are commented out")" >>"$todo"
-	fi
-
-
-	has_action "$todo" ||
-		return 2
-
-	cp "$todo" "$todo".backup
-	collapse_todo_ids
-	git_sequence_editor "$todo" ||
-		die_abort "$(gettext "Could not execute editor")"
-
-	has_action "$todo" ||
-		return 2
-
-	git rebase--interactive --check-todo-list || {
-		ret=$?
-		checkout_onto
-		exit $ret
-	}
-
-	expand_todo_ids
-	checkout_onto
-	do_rest
-}
-
-git_rebase__preserve_merges () {
-	initiate_action "$action"
-	ret=$?
-	if test $ret = 0; then
-		return 0
-	fi
-
-	setup_reflog_action
-	init_basic_state
-
-	if test -z "$rebase_root"
-	then
-		mkdir "$rewritten" &&
-		for c in $(git merge-base --all $orig_head $upstream)
-		do
-			echo $onto > "$rewritten"/$c ||
-				die "$(gettext "Could not init rewritten commits")"
-		done
-	else
-		mkdir "$rewritten" &&
-		echo $onto > "$rewritten"/root ||
-			die "$(gettext "Could not init rewritten commits")"
-	fi
-
-	init_revisions_and_shortrevisions
-
-	format=$(git config --get rebase.instructionFormat)
-	# the 'rev-list .. | sed' requires %m to parse; the instruction requires %H to parse
-	git rev-list --format="%m%H ${format:-%s}" \
-		--reverse --left-right --topo-order \
-		$revisions ${restrict_revision+^$restrict_revision} | \
-		sed -n "s/^>//p" |
-	while read -r sha1 rest
-	do
-		if test -z "$keep_empty" && is_empty_commit $sha1 && ! is_merge_commit $sha1
-		then
-			comment_out="$comment_char "
-		else
-			comment_out=
-		fi
-
-		if test -z "$rebase_root"
-		then
-			preserve=t
-			for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)
-			do
-				if test -f "$rewritten"/$p
-				then
-					preserve=f
-				fi
-			done
-		else
-			preserve=f
-		fi
-		if test f = "$preserve"
-		then
-			touch "$rewritten"/$sha1
-			printf '%s\n' "${comment_out}pick $sha1 $rest" >>"$todo"
-		fi
-	done
-
-	# Watch for commits that been dropped by --cherry-pick
-	mkdir "$dropped"
-	# Save all non-cherry-picked changes
-	git rev-list $revisions --left-right --cherry-pick | \
-		sed -n "s/^>//p" > "$state_dir"/not-cherry-picks
-	# Now all commits and note which ones are missing in
-	# not-cherry-picks and hence being dropped
-	git rev-list $revisions |
-	while read rev
-	do
-		if test -f "$rewritten"/$rev &&
-		   ! sane_grep "$rev" "$state_dir"/not-cherry-picks >/dev/null
-		then
-			# Use -f2 because if rev-list is telling us this commit is
-			# not worthwhile, we don't want to track its multiple heads,
-			# just the history of its first-parent for others that will
-			# be rebasing on top of it
-			git rev-list --parents -1 $rev | cut -d' ' -s -f2 > "$dropped"/$rev
-			sha1=$(git rev-list -1 $rev)
-			sane_grep -v "^[a-z][a-z]* $sha1" <"$todo" > "${todo}2" ; mv "${todo}2" "$todo"
-			rm "$rewritten"/$rev
-		fi
-	done
-
-	complete_action
-}
-- 
gitgitgadget


^ permalink raw reply related	[relevance 2%]

* Re: [PATCH v6 2/9] ssh signing: add ssh signature format and signing using ssh keys
  2021-07-28 22:45  4% ` Jonathan Tan
  2021-07-29  1:01  0%   ` Junio C Hamano
@ 2021-07-29 11:01  0%   ` Fabian Stelzer
  1 sibling, 0 replies; 200+ results
From: Fabian Stelzer @ 2021-07-29 11:01 UTC (permalink / raw)
  To: Jonathan Tan, gitgitgadget
  Cc: git, hanwen, sandals, rsbecker, bagasdotme, hji, avarab,
	felipe.contreras, sunshine, gwymor

On 29.07.21 00:45, Jonathan Tan wrote:
> Keep the commit titles to 50 characters or fewer. E.g.:
> 
>    gpg-interface: teach "ssh" gpg.format
> 

i will go over my commits and shorten them although I find your example 
very unclear. or did you mean: teach "ssh" to gpg.format ?

>> implements the actual sign_buffer_ssh operation and move some shared
>> cleanup code into a strbuf function
> 
> Capitalization and punctuation.
fixed

> 
>> Set gpg.format = ssh and user.signingkey to either a ssh public key
>> string (like from an authorized_keys file), or a ssh key file.
>> If the key file or the config value itself contains only a public key
>> then the private key needs to be available via ssh-agent.
>>
>> gpg.ssh.program can be set to an alternative location of ssh-keygen.
>> A somewhat recent openssh version (8.2p1+) of ssh-keygen is needed for
>> this feature. Since only ssh-keygen is needed it can this way be
>> installed seperately without upgrading your system openssh packages.
> 
> I notice that end-user documentation (e.g. about gpg.ssh.program) is in
> its own patch, but could that be added as functionality is being
> implemented? That makes it easier for reviewers to understand what's
> being implemented in each patch.
> 

I can move the user.signingkey & gpg.format part into the signing 
implementation commit and the rest into the verification. I don't see 
much benefit in splitting it up further. I don't want to split up parts 
of the same documentation block into separate commits.

>> +
>> +	if (starts_with(signing_key, "ssh-")) {
>> +		/* A literal ssh key */
>> +		key_file = mks_tempfile_t(".git_signing_key_tmpXXXXXX");
>> +		if (!key_file)
>> +			return error_errno(
>> +				_("could not create temporary file"));
>> +		keylen = strlen(signing_key);
>> +		if (write_in_full(key_file->fd, signing_key, keylen) < 0 ||
>> +		    close_tempfile_gently(key_file) < 0) {
>> +			error_errno(_("failed writing ssh signing key to '%s'"),
>> +				    key_file->filename.buf);
>> +			goto out;
>> +		}
>> +		ssh_signing_key_file = key_file->filename.buf;
>> +	} else {
>> +		/* We assume a file */
>> +		ssh_signing_key_file = expand_user_path(signing_key, 1);
>> +	}
> 
> A config that has 2 modes of operation is quite error-prone, I think.
> For example, a user could put a path starting with "ssh-" (admittedly
> unlikely since it would usually be an absolute path, but not
> impossible). And also from an implementation point of view, here the
> "ssh-" is case-sensitive, but in a future patch, there is a "ssh-" that
> is case-insensitive.
> 
> Can this just always take a path?
> 

I found the ability to specify the key literally useful since i don't 
need an extra file for my public key. In my case all keys come from an 
ssh-agent anyway but I'd like to be able to select which one to use for 
signing. But i'm not hard pressed on this feature. If consenus is this 
complicates things then i can remove it.

>> +	if (ret) {
>> +		if (strstr(signer_stderr.buf, "usage:"))
>> +			error(_("ssh-keygen -Y sign is needed for ssh signing (available in openssh version 8.2p1+)"));
>> +
>> +		error("%s", signer_stderr.buf);
>> +		goto out;
>> +	}
> 
> Checking for "usage:" seems fragile -  a binary running in a different
> locale might emit a different string, and legitimate output may somehow
> contain the string "usage:". Is there a different way to detect a
> version mismatch?
> 

I agree. Unfortunately i did not find any better way. But i think the 
risk of doing something wrong here is quite low. We only check for 
"usage:" in case ssh-keygen fails. And all we do if we find it is give 
the user an extra hint on what the problem probably is.
In any case we print the full stderr output as well.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v6 2/9] ssh signing: add ssh signature format and signing using ssh keys
  2021-07-28 22:45  4% ` Jonathan Tan
@ 2021-07-29  1:01  0%   ` Junio C Hamano
  2021-07-29 11:01  0%   ` Fabian Stelzer
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2021-07-29  1:01 UTC (permalink / raw)
  To: Jonathan Tan
  Cc: gitgitgadget, git, hanwen, fs, sandals, rsbecker, bagasdotme, hji,
	avarab, felipe.contreras, sunshine, gwymor

Jonathan Tan <jonathantanmy@google.com> writes:

>> +/*
>> + * Strip CR from the line endings, in case we are on Windows.
>> + * NEEDSWORK: make it trim only CRs before LFs and rename
>> + */
>> +static void remove_cr_after(struct strbuf *buffer, size_t offset)
>> +{
>> +	size_t i, j;
>> +
>> +	for (i = j = offset; i < buffer->len; i++) {
>> +		if (buffer->buf[i] != '\r') {
>> +			if (i != j)
>> +				buffer->buf[j] = buffer->buf[i];
>> +			j++;
>> +		}
>> +	}
>> +	strbuf_setlen(buffer, j);
>> +}
>
> In the future, I would prefer refactoring like this to be in its own
> patch. For the moment, this should probably be called "remove_cr" (no
> "after" as CRs are removed wherever they are in the string).

You have me to blame for that "after".  It was meant to signal that
CR's before the given "offset" are retained.

> A config that has 2 modes of operation is quite error-prone, I think.
> For example, a user could put a path starting with "ssh-" (admittedly
> unlikely since it would usually be an absolute path, but not
> impossible). And also from an implementation point of view, here the
> "ssh-" is case-sensitive, but in a future patch, there is a "ssh-" that
> is case-insensitive.
>
> Can this just always take a path?

Sensible simplification, I guess.

Thanks for a careful review.

>> +	if (ret) {
>> +		if (strstr(signer_stderr.buf, "usage:"))
>> +			error(_("ssh-keygen -Y sign is needed for ssh signing (available in openssh version 8.2p1+)"));
>> +
>> +		error("%s", signer_stderr.buf);
>> +		goto out;
>> +	}
>
> Checking for "usage:" seems fragile -  a binary running in a different
> locale might emit a different string, and legitimate output may somehow
> contain the string "usage:". Is there a different way to detect a
> version mismatch?


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v6 2/9] ssh signing: add ssh signature format and signing using ssh keys
  @ 2021-07-28 22:45  4% ` Jonathan Tan
  2021-07-29  1:01  0%   ` Junio C Hamano
  2021-07-29 11:01  0%   ` Fabian Stelzer
  0 siblings, 2 replies; 200+ results
From: Jonathan Tan @ 2021-07-28 22:45 UTC (permalink / raw)
  To: gitgitgadget
  Cc: git, hanwen, fs, sandals, rsbecker, bagasdotme, hji, avarab,
	felipe.contreras, sunshine, gwymor, Jonathan Tan

Keep the commit titles to 50 characters or fewer. E.g.:

  gpg-interface: teach "ssh" gpg.format

> implements the actual sign_buffer_ssh operation and move some shared
> cleanup code into a strbuf function

Capitalization and punctuation.

> Set gpg.format = ssh and user.signingkey to either a ssh public key
> string (like from an authorized_keys file), or a ssh key file.
> If the key file or the config value itself contains only a public key
> then the private key needs to be available via ssh-agent.
> 
> gpg.ssh.program can be set to an alternative location of ssh-keygen.
> A somewhat recent openssh version (8.2p1+) of ssh-keygen is needed for
> this feature. Since only ssh-keygen is needed it can this way be
> installed seperately without upgrading your system openssh packages.

I notice that end-user documentation (e.g. about gpg.ssh.program) is in
its own patch, but could that be added as functionality is being
implemented? That makes it easier for reviewers to understand what's
being implemented in each patch.

> @@ -463,12 +482,30 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
>  	return use_format->sign_buffer(buffer, signature, signing_key);
>  }
>  
> +/*
> + * Strip CR from the line endings, in case we are on Windows.
> + * NEEDSWORK: make it trim only CRs before LFs and rename
> + */
> +static void remove_cr_after(struct strbuf *buffer, size_t offset)
> +{
> +	size_t i, j;
> +
> +	for (i = j = offset; i < buffer->len; i++) {
> +		if (buffer->buf[i] != '\r') {
> +			if (i != j)
> +				buffer->buf[j] = buffer->buf[i];
> +			j++;
> +		}
> +	}
> +	strbuf_setlen(buffer, j);
> +}

In the future, I would prefer refactoring like this to be in its own
patch. For the moment, this should probably be called "remove_cr" (no
"after" as CRs are removed wherever they are in the string).

> +static int sign_buffer_ssh(struct strbuf *buffer, struct strbuf *signature,
> +			   const char *signing_key)
> +{
> +	struct child_process signer = CHILD_PROCESS_INIT;
> +	int ret = -1;
> +	size_t bottom, keylen;
> +	struct strbuf signer_stderr = STRBUF_INIT;
> +	struct tempfile *key_file = NULL, *buffer_file = NULL;
> +	char *ssh_signing_key_file = NULL;
> +	struct strbuf ssh_signature_filename = STRBUF_INIT;
> +
> +	if (!signing_key || signing_key[0] == '\0')
> +		return error(
> +			_("user.signingkey needs to be set for ssh signing"));
> +
> +	if (starts_with(signing_key, "ssh-")) {
> +		/* A literal ssh key */
> +		key_file = mks_tempfile_t(".git_signing_key_tmpXXXXXX");
> +		if (!key_file)
> +			return error_errno(
> +				_("could not create temporary file"));
> +		keylen = strlen(signing_key);
> +		if (write_in_full(key_file->fd, signing_key, keylen) < 0 ||
> +		    close_tempfile_gently(key_file) < 0) {
> +			error_errno(_("failed writing ssh signing key to '%s'"),
> +				    key_file->filename.buf);
> +			goto out;
> +		}
> +		ssh_signing_key_file = key_file->filename.buf;
> +	} else {
> +		/* We assume a file */
> +		ssh_signing_key_file = expand_user_path(signing_key, 1);
> +	}

A config that has 2 modes of operation is quite error-prone, I think.
For example, a user could put a path starting with "ssh-" (admittedly
unlikely since it would usually be an absolute path, but not
impossible). And also from an implementation point of view, here the
"ssh-" is case-sensitive, but in a future patch, there is a "ssh-" that
is case-insensitive.

Can this just always take a path?

> +	if (ret) {
> +		if (strstr(signer_stderr.buf, "usage:"))
> +			error(_("ssh-keygen -Y sign is needed for ssh signing (available in openssh version 8.2p1+)"));
> +
> +		error("%s", signer_stderr.buf);
> +		goto out;
> +	}

Checking for "usage:" seems fragile -  a binary running in a different
locale might emit a different string, and legitimate output may somehow
contain the string "usage:". Is there a different way to detect a
version mismatch?

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v4 2/9] ssh signing: add ssh signature format and signing using ssh keys
  @ 2021-07-20 12:26  4%       ` Fabian Stelzer
  0 siblings, 0 replies; 200+ results
From: Fabian Stelzer @ 2021-07-20 12:26 UTC (permalink / raw)
  To: Junio C Hamano, Fabian Stelzer via GitGitGadget
  Cc: git, Han-Wen Nienhuys, brian m. carlson, Randall S. Becker,
	Bagas Sanjaya, Hans Jerry Illikainen,
	Ævar Arnfjörð Bjarmason, Felipe Contreras,
	Eric Sunshine, Gwyneth Morgan


On 20.07.21 01:53, Junio C Hamano wrote:
> "Fabian Stelzer via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
>> @@ -65,6 +73,14 @@ static struct gpg_format gpg_format[] = {
>>   		.verify_signed_buffer = verify_gpg_signed_buffer,
>>   		.sign_buffer = sign_buffer_gpg,
>>   	},
>> +	{
>> +		.name = "ssh",
>> +		.program = "ssh-keygen",
>> +		.verify_args = ssh_verify_args,
>> +		.sigs = ssh_sigs,
>> +		.verify_signed_buffer = NULL, /* TODO */
>> +		.sign_buffer = sign_buffer_ssh
>> +	},
>>   };
> A payload a malicious person may feed this version of Git can have a
> pattern that happens to match the ssh_sigs[] string, and the code
> will blindly try to call .verify_signed_buffer==NULL and die, no?
>
> That is not the end of the world; as long as we know that with the
> above "TODO" comment it is probably OK.
I thought about adding an if(!fmt->sign) BUG() but since these callbacks 
are static it shoud really only be an issue between patches of the set.
>
>> @@ -463,12 +482,26 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
>>   	return use_format->sign_buffer(buffer, signature, signing_key);
>>   }
>>   
>> +static void strbuf_trim_trailing_cr(struct strbuf *buffer, int offset)
>> +{
> This removes any and all CR, not just trimming the trailing ones, so
> the function is misnamed. Call it remove_cr_after() perhaps?
>
> Alternatively we could tighten the implementation and strip only the
> CR that come immediately before a LF.  That would be a better longer
> term thing to do, but because you are lifting an existing code from
> the end of the gpg side of the thing, it may make sense to keep the
> implementation as-is, but give it a name that is more faithful to
> what it actually does.  When the dust settles, we may want to
> revisit and fix this helper function to actually trim CRLF into LF
> (and leave CR in the middle of lines intact), but I do not think it
> is urgent.  Just leaving "NEEDSWORK: make it trim only CRs before LFs
> and rename" comment would be OK.
Agreed. I've renamed it and added the comment.
>
> Shouldn't the offset (aka bottom) be of type size_t?
fixed
>> +static int sign_buffer_ssh(struct strbuf *buffer, struct strbuf *signature,
>> +			   const char *signing_key)
>> +{
>> +	struct child_process signer = CHILD_PROCESS_INIT;
>> +	int ret = -1;
>> +	size_t bottom;
>> +	struct strbuf signer_stderr = STRBUF_INIT;
>> +	struct tempfile *temp = NULL, *buffer_file = NULL;
>> +	char *ssh_signing_key_file = NULL;
>> +	struct strbuf ssh_signature_filename = STRBUF_INIT;
>> +
>> +	if (!signing_key || signing_key[0] == '\0')
>> +		return error(
>> +			_("user.signingkey needs to be set for ssh signing"));
>> +
>> +	if (istarts_with(signing_key, "ssh-")) {
> Is it common in the ssh world to treat ssh- prefix as case
> insensitive?  Not a strong objection but I tend to prefer to start
> strict unless there is a good reason to be loose when we do not have
> to, as loosening after the fact is much easier than tightening after
> starting with a loose definition.
I don't think so. I will make it case sensitive.
>
>> +		/* A literal ssh key */
>> +		temp = mks_tempfile_t(".git_signing_key_tmpXXXXXX");
>> +		if (!temp)
>> +			return error_errno(
>> +				_("could not create temporary file"));
>> +		if (write_in_full(temp->fd, signing_key, strlen(signing_key)) <
>> +			    0 ||
> "keylen = strlen(signing_key)" before that line, for example, could
> have easily avoided the line-wrapping at such a place.  Wrapping at
> places like after ||, i.e. after an operator with a low precedence,
> would make the code easier to follow.
agreed.
>
>> +		    close_tempfile_gently(temp) < 0) {
>> +			error_errno(_("failed writing ssh signing key to '%s'"),
>> +				    temp->filename.buf);
>> +			goto out;
>> +		}
>> +		ssh_signing_key_file = temp->filename.buf;
> It is kind'a sad that we need a fresh temporary file every time, but
> we can easily tell the user in the documentation that they can use a
> file with a key in it to avoid it, so it's OK (actually, better than
> OK, as without this, we may not consume temporary files but we won't
> offer an ability to take a literal key string).
>
> Is ".git_whatever file in the current directory" a good place to
> have this temporary file?  I would have expected that we would use
> either $GIT_DIR, $HOME, or $TMPDIR for a thing like this (with
> different pros-and-cons discussion).  At least it is consistent with
> how a temporary file for the payload to be sign-verified is created,
> so let's leave it as-is.
Intuitively i thought just using mks_tempfile_t() would choose a good 
dir for such files.
>
>> +	} else {
>> +		/* We assume a file */
>> +		ssh_signing_key_file = expand_user_path(signing_key, 1);
>> +	}
>> +
>> +	buffer_file = mks_tempfile_t(".git_signing_buffer_tmpXXXXXX");
>> +	if (!buffer_file) {
>> +		error_errno(_("could not create temporary file"));
>> +		goto out;
>> +	}
>> +
>> +	if (write_in_full(buffer_file->fd, buffer->buf, buffer->len) < 0 ||
>> +	    close_tempfile_gently(buffer_file) < 0) {
>> +		error_errno(_("failed writing ssh signing key buffer to '%s'"),
>> +			    buffer_file->filename.buf);
>> +		goto out;
>> +	}
>> +
>> +	strvec_pushl(&signer.args, use_format->program, "-Y", "sign", "-n",
>> +		     "git", "-f", ssh_signing_key_file,
> Wrap the line before "-n" to keep "-n" and "git" together, if "git"
> is meant as an argument to the "-n" option.
done. some things clang-format can't really understand. overall it is 
quite helpful but a few things i still had to reformat.
>
>> +		     buffer_file->filename.buf, NULL);
>> +
>> +	sigchain_push(SIGPIPE, SIG_IGN);
>> +	ret = pipe_command(&signer, NULL, 0, NULL, 0, &signer_stderr, 0);
>> +	sigchain_pop(SIGPIPE);
>> +
>> +	if (ret && strstr(signer_stderr.buf, "usage:")) {
>> +		error(_("ssh-keygen -Y sign is needed for ssh signing (available in openssh version 8.2p1+)"));
>> +		goto out;
> This error message is important to give to the end users, but is it
> enough?  That is, unless "usage:" does not appear, we show the whole
> raw error message and that would help end users and those helping
> them to diagnose the issue, but once the underlying program says
> "usage:", no matter what else it says, it is hidden by this code,
> since we assume it is a wrong version of openssh.
>
>> +	}
>> +
>> +	if (ret) {
>> +		error("%s", signer_stderr.buf);
>> +		goto out;
>> +	}
> Also, prehaps
>
> 	if (ret) {
> 		if (strstr(..., "usage"))
> 			error(_("ssh-keygen -Y sign is needed..."));
> 		else
>                          error("%s", signer_stderr.buf);
> 		goto out;
> 	}
>
> would be easier to follow.

I have changed this to:
if (ret) {
     if (strstr(..., "usage"))
         error(_("ssh-keygen -Y sign is needed..."));

     error("%s", signer_stderr.buf);
     goto out;
}
and removed the if (ret) further down in the function that had no effect.

I had removed the raw stderr output from verify & sign because it 
becomes quite unreadable when doing a "git log --show-signature" with 
ssh signatures present and not support in ssh for it.
I think in case of signing the full output is good. The user is taking 
an active action (wanting to sign something) so we should give them all 
the help we can when things go wrong.
The output for verification is debatable. The config might have a 
"log.showSignature" for verifying gpg signatures and when ssh signatures 
show up we should tell them it's not supported on their setup but 
probably not showing endless lines of errors when they do a "git log". A 
"git verify-commit" might be a different case. But code-path-wise this 
is the same thing at the moment.

>> +		error(_("ssh failed to sign the data"));
>> +		goto out;
>> +	}
>> +
>> +	/* Strip CR from the line endings, in case we are on Windows. */
>> +	strbuf_trim_trailing_cr(signature, bottom);
>> +
>> +out:
>> +	if (temp)
>> +		delete_tempfile(&temp);
>> +	if (buffer_file)
>> +		delete_tempfile(&buffer_file);
> It is clear that the latter one was holding the contents of the
> buffer to be signed, but reminding the readers what "temp" was about
> would be a good move.  Perhaps renaming the variable to "key_file"
> or something may help?
renamed to "key_file"
>
>> +	strbuf_release(&signer_stderr);
>> +	strbuf_release(&ssh_signature_filename);
>> +	return ret;
>> +}
> Looking good, except for the "when does 'ret' get updated?
> shouldn't we refrain from reading the resulting buffer when it is
> set?" question.
>
> Thanks for a pleasant read.
Thanks a lot for your support with this!
>


^ permalink raw reply	[relevance 4%]

* Re: Bug: branch checkout is detached if the case doesn't match
  2021-06-20 22:03  5% ` Ævar Arnfjörð Bjarmason
@ 2021-06-21 17:20  0%   ` Tim Hutt
  0 siblings, 0 replies; 200+ results
From: Tim Hutt @ 2021-06-21 17:20 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason; +Cc: git

Ah of course!

> git pack-refs --all

Yeah that "fixes" things so you get `fatal: invalid reference: MASTER`.

I guess `git checkout` checks whether `MASTER` exists (yes, according
to MacOS), but git log checks whether the current branch (`MASTER`)
matches `master` (it doesn't).

Very unfortunate, but I guess it's not worth fixing.

Cheers,

Tim

On Sun, 20 Jun 2021 at 23:09, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
>
>
> On Sun, Jun 20 2021, Tim Hutt wrote:
>
> > If you try to switch to a branch (e.g. `master`), but get the case wrong, e.g:
> >
> >     git switch MASTER
> >     git checkout MASTER
> >     git switch Master
> >     git checkout Master
> >
> > etc. then it autocorrects the case (bad idea but ok), but it also
> > enables the `--detach` flag! In other words
> >
> >     git switch Master
> >
> > acts like
> >
> >     git switch -d master
> >
> > Very unexpected!
>
> This behavior isn't intentionaly, but ultimately isn't with Git, but
> with your running of Git on a filesystem that doesn't respect POSIX
> semantics.
>
> The default FS on OSX is case insensitive, we store the "master"
> reference (unpacked) under that name on the FS, so this is emergent
> behavior. Can you reproduce this after a:
>
>     git pack-refs --all
>
> ?
>
> Even after that we'll have a .git/HEAD, and I know on OSX e.g. "git log
> head...<branch>" unintentionally resolved to "HEAD" too at some point
> (probably still).
>
> There's various workarounds in git's code to deal with funny behavior on
> OSX, but it's hard to catch them all as it means having to second-guess
> standard library calls. I think you're best off creating a
> case-sensitive partition on your computer and using git there if you
> want to avoid these cases entirely.
>
> > [System Info]
> > git version:
> > git version 2.32.0
> > cpu: x86_64
> > no commit associated with this build
> > sizeof-long: 8
> > sizeof-size_t: 8
> > shell-path: /bin/sh
> > uname: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Mar  5 01:14:14
> > PST 2021; root:xnu-7195.101.1~3/RELEASE_X86_64 x86_64
> > compiler info: clang: 12.0.5 (clang-1205.0.22.9)
> > libc info: no libc information available
> > $SHELL (typically, interactive shell): /bin/zsh
> >
> > [Enabled Hooks]
>

^ permalink raw reply	[relevance 0%]

* Re: Bug: branch checkout is detached if the case doesn't match
  @ 2021-06-20 22:03  5% ` Ævar Arnfjörð Bjarmason
  2021-06-21 17:20  0%   ` Tim Hutt
  0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-06-20 22:03 UTC (permalink / raw)
  To: Tim Hutt; +Cc: git


On Sun, Jun 20 2021, Tim Hutt wrote:

> If you try to switch to a branch (e.g. `master`), but get the case wrong, e.g:
>
>     git switch MASTER
>     git checkout MASTER
>     git switch Master
>     git checkout Master
>
> etc. then it autocorrects the case (bad idea but ok), but it also
> enables the `--detach` flag! In other words
>
>     git switch Master
>
> acts like
>
>     git switch -d master
>
> Very unexpected!

This behavior isn't intentionaly, but ultimately isn't with Git, but
with your running of Git on a filesystem that doesn't respect POSIX
semantics.

The default FS on OSX is case insensitive, we store the "master"
reference (unpacked) under that name on the FS, so this is emergent
behavior. Can you reproduce this after a:

    git pack-refs --all

?

Even after that we'll have a .git/HEAD, and I know on OSX e.g. "git log
head...<branch>" unintentionally resolved to "HEAD" too at some point
(probably still).

There's various workarounds in git's code to deal with funny behavior on
OSX, but it's hard to catch them all as it means having to second-guess
standard library calls. I think you're best off creating a
case-sensitive partition on your computer and using git there if you
want to avoid these cases entirely.

> [System Info]
> git version:
> git version 2.32.0
> cpu: x86_64
> no commit associated with this build
> sizeof-long: 8
> sizeof-size_t: 8
> shell-path: /bin/sh
> uname: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Mar  5 01:14:14
> PST 2021; root:xnu-7195.101.1~3/RELEASE_X86_64 x86_64
> compiler info: clang: 12.0.5 (clang-1205.0.22.9)
> libc info: no libc information available
> $SHELL (typically, interactive shell): /bin/zsh
>
> [Enabled Hooks]


^ permalink raw reply	[relevance 5%]

* [PATCH] multimail: stop shipping a copy
@ 2021-06-10  8:29  1% Johannes Schindelin via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin via GitGitGadget @ 2021-06-10  8:29 UTC (permalink / raw)
  To: git; +Cc: Johannes Schindelin, Johannes Schindelin

From: Johannes Schindelin <johannes.schindelin@gmx.de>

The multimail project is developed independently and has its own project
page. Traditionally, we shipped a copy in contrib/.

However, such a copy is prone to become stale, and users are much better
served to be directed to the actual project instead.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
    Stop shipping a (potentially stale) copy of multimail
    
    The project is maintained elsewhere.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-977%2Fdscho%2Fstub-out-contrib-multimail-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-977/dscho/stub-out-contrib-multimail-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/977

 contrib/hooks/multimail/CHANGES               |  285 --
 contrib/hooks/multimail/CONTRIBUTING.rst      |   60 -
 contrib/hooks/multimail/README.Git            |   12 +-
 .../README.migrate-from-post-receive-email    |  145 -
 contrib/hooks/multimail/README.rst            |  774 ---
 .../multimail/doc/customizing-emails.rst      |   56 -
 contrib/hooks/multimail/doc/gerrit.rst        |   56 -
 contrib/hooks/multimail/doc/gitolite.rst      |  118 -
 .../hooks/multimail/doc/troubleshooting.rst   |   78 -
 contrib/hooks/multimail/git_multimail.py      | 4346 -----------------
 .../hooks/multimail/migrate-mailhook-config   |  274 --
 contrib/hooks/multimail/post-receive.example  |  101 -
 12 files changed, 2 insertions(+), 6303 deletions(-)
 delete mode 100644 contrib/hooks/multimail/CHANGES
 delete mode 100644 contrib/hooks/multimail/CONTRIBUTING.rst
 delete mode 100644 contrib/hooks/multimail/README.migrate-from-post-receive-email
 delete mode 100644 contrib/hooks/multimail/README.rst
 delete mode 100644 contrib/hooks/multimail/doc/customizing-emails.rst
 delete mode 100644 contrib/hooks/multimail/doc/gerrit.rst
 delete mode 100644 contrib/hooks/multimail/doc/gitolite.rst
 delete mode 100644 contrib/hooks/multimail/doc/troubleshooting.rst
 delete mode 100755 contrib/hooks/multimail/git_multimail.py
 delete mode 100755 contrib/hooks/multimail/migrate-mailhook-config
 delete mode 100755 contrib/hooks/multimail/post-receive.example

diff --git a/contrib/hooks/multimail/CHANGES b/contrib/hooks/multimail/CHANGES
deleted file mode 100644
index 35791fd02c21..000000000000
--- a/contrib/hooks/multimail/CHANGES
+++ /dev/null
@@ -1,285 +0,0 @@
-Release 1.5.0
-=============
-
-Backward-incompatible change
-----------------------------
-
-The name of classes for environment was misnamed as `*Environement`.
-It is now `*Environment`.
-
-New features
-------------
-
-* A Thread-Index header is now added to each email sent (except for
-  combined emails where it would not make sense), so that MS Outlook
-  properly groups messages by threads even though they have a
-  different subject line. Unfortunately, even adding this header the
-  threading still seems to be unreliable, but it is unclear whether
-  this is an issue on our side or on MS Outlook's side (see discussion
-  here: https://github.com/git-multimail/git-multimail/pull/194).
-
-* A new variable multimailhook.ExcludeMergeRevisions was added to send
-  notification emails only for non-merge commits.
-
-* For gitolite environment, it is now possible to specify the mail map
-  in a separate file in addition to gitolite.conf, using the variable
-  multimailhook.MailaddressMap.
-
-Internal changes
-----------------
-
-* The testsuite now uses GIT_PRINT_SHA1_ELLIPSIS where needed for
-  compatibility with recent Git versions. Only tests are affected.
-
-* We don't try to install pyflakes in the continuous integration job
-  for old Python versions where it's no longer available.
-
-* Stop using the deprecated cgi.escape in Python 3.
-
-* New flake8 warnings have been fixed.
-
-* Python 3.6 is now tested against on Travis-CI.
-
-* A bunch of lgtm.com warnings have been fixed.
-
-Bug fixes
----------
-
-* SMTPMailer logs in only once now. It used to re-login for each email
-  sent which triggered errors for some SMTP servers.
-
-* migrate-mailhook-config was broken by internal refactoring, it
-  should now work again.
-
-This version was tested with Python 2.6 to 3.7. It was tested with Git
-1.7.10.406.gdc801, 2.15.1 and 2.20.1.98.gecbdaf0.
-
-Release 1.4.0
-=============
-
-New features to troubleshoot a git-multimail installation
----------------------------------------------------------
-
-* One can now perform a basic check of git-multimail's setup by
-  running the hook with the environment variable
-  GIT_MULTIMAIL_CHECK_SETUP set to a non-empty string. See
-  doc/troubleshooting.rst for details.
-
-* A new log files system was added. See the multimailhook.logFile,
-  multimailhook.errorLogFile and multimailhook.debugLogFile variables.
-
-* git_multimail.py can now be made more verbose using
-  multimailhook.verbose.
-
-* A new option --check-ref-filter is now available to help debugging
-  the refFilter* options.
-
-Formatting emails
------------------
-
-* Formatting of emails was made slightly more compact, to reduce the
-  odds of having long subject lines truncated or wrapped in short list
-  of commits.
-
-* multimailhook.emailPrefix may now use the '%(repo_shortname)s'
-  placeholder for the repository's short name.
-
-* A new option multimailhook.subjectMaxLength is available to truncate
-  overly long subject lines.
-
-Bug fixes and minor changes
----------------------------
-
-* Options refFilterDoSendRegex and refFilterDontSendRegex were
-  essentially broken. They should work now.
-
-* The behavior when both refFilter{Do,Dont}SendRegex and
-  refFilter{Exclusion,Inclusion}Regex are set have been slightly
-  changed. Exclusion/Inclusion is now strictly stronger than
-  DoSend/DontSend.
-
-* The management of precedence when a setting can be computed in
-  multiple ways has been considerably refactored and modified.
-  multimailhook.from and multimailhook.reponame now have precedence
-  over the environment-specific settings ($GL_REPO/$GL_USER for
-  gitolite, --stash-user/repo for Stash, --submitter/--project for
-  Gerrit).
-
-* The coverage of the testsuite has been considerably improved. All
-  configuration variables now appear at least once in the testsuite.
-
-This version was tested with Python 2.6 to 3.5. It also mostly works
-with Python 2.4, but there is one known breakage in the testsuite
-related to non-ascii characters. It was tested with Git
-1.7.10.406.gdc801, 1.8.5.6, 2.1.4, and 2.10.0.rc0.1.g07c9292.
-
-Release 1.3.1 (bugfix-only release)
-===================================
-
-* Generate links to commits in combined emails (it was done only for
-  commit emails in 1.3.0).
-
-* Fix broken links on PyPi.
-
-Release 1.3.0
-=============
-
-* New options multimailhook.htmlInIntro and multimailhook.htmlInFooter
-  now allow using HTML in the introduction and footer of emails (e.g.
-  for a more pleasant formatting or to insert a link to the commit on
-  a web interface).
-
-* A new option multimailhook.commitBrowseURL gives a simpler (and less
-  flexible) way to add a link to a web interface for commit emails
-  than multimailhook.htmlInIntro and multimailhook.htmlInFooter.
-
-* A new public function config.add_config_parameters was added to
-  allow custom hooks to set specific Git configuration variables
-  without modifying the configuration files. See an example in
-  post-receive.example.
-
-* Error handling for SMTP has been improved (we used to print Python
-  backtraces for legitimate errors).
-
-* The SMTP mailer can now check TLS certificates when the newly added
-  configuration variable multimailhook.smtpCACerts.
-
-* Python 3 portability has been improved.
-
-* The documentation's formatting has been improved.
-
-* The testsuite has been improved (we now use pyflakes to check for
-  errors in the code).
-
-This version has been tested with Python 2.4 and 2.6 to 3.5, and Git
-v1.7.10-406-gdc801e7, 2.1.4 and 2.8.1.339.g3ad15fd.
-
-No change since 1.3 RC1.
-
-Release 1.2.0
-=============
-
-* It is now possible to exclude some refs (e.g. exclude some branches
-  or tags). See refFilterDoSendRegex, refFilterDontSendRegex,
-  refFilterInclusionRegex and refFilterExclusionRegex.
-
-* New commitEmailFormat option which can be set to "html" to generate
-  simple colorized diffs using HTML for the commit emails.
-
-* git-multimail can now be ran as a Gerrit ref-updated hook, or from
-  Atlassian BitBucket Server (formerly known as Atlassian Stash).
-
-* The From: field is now more customizeable. It can be set
-  independently for refchange emails and commit emails (see
-  fromCommit, fromRefChange). The special values pusher and author can
-  be used in these configuration variable.
-
-* A new command-line option, --version, was added. The version is also
-  available in the X-Git-Multimail-Version header of sent emails.
-
-* Set X-Git-NotificationType header to differentiate the various types
-  of notifications. Current values are: diff, ref_changed_plus_diff,
-  ref_changed.
-
-* Preliminary support for Python 3. The testsuite passes with Python 3,
-  but it has not received as much testing as the Python 2 version yet.
-
-* Several encoding-related fixes. UTF-8 characters work in more
-  situations (but non-ascii characters in email address are still not
-  supported).
-
-* The testsuite and its documentation has been greatly improved.
-
-Plus all the bugfixes from version 1.1.1.
-
-This version has been tested with Python 2.4 and 2.6 to 3.5, and Git
-v1.7.10-406-gdc801e7, git-1.8.2.3 and 2.6.0. Git versions prior to
-v1.7.10-406-gdc801e7 probably work, but cannot run the testsuite
-properly.
-
-Release 1.1.1 (bugfix-only release)
-===================================
-
-* The SMTP mailer was not working with Python 2.4.
-
-Release 1.1.0
-=============
-
-* When a single commit is pushed, omit the reference changed email.
-  Set multimailhook.combineWhenSingleCommit to false to disable this
-  new feature.
-
-* In gitolite environments, the pusher's email address can be used as
-  the From address by creating a specially formatted comment block in
-  gitolite.conf (see multimailhook.from in README).
-
-* Support for SMTP authentication and SSL/TLS encryption was added,
-  see smtpUser, smtpPass, smtpEncryption in README.
-
-* A new option scanCommitForCc was added to allow git-multimail to
-  search the commit message for 'Cc: ...' lines, and add the
-  corresponding emails in Cc.
-
-* If $USER is not set, use the variable $USERNAME. This is needed on
-  Windows platform to recognize the pusher.
-
-* The emailPrefix variable can now be set to an empty string to remove
-  the prefix.
-
-* A short tutorial was added in doc/gitolite.rst to set up
-  git-multimail with gitolite.
-
-* The post-receive file was renamed to post-receive.example. It has
-  always been an example (the standard way to call git-multimail is to
-  call git_multimail.py), but it was unclear to many users.
-
-* A new refchangeShowGraph option was added to make it possible to
-  include both a graph and a log in the summary emails.  The options
-  to control the graph formatting can be set via the new graphOpts
-  option.
-
-* New option --force-send was added to disable new commit detection
-  for update hook. One use-case is to run git_multimail.py after
-  running "git fetch" to send emails about commits that have just been
-  fetched (the detection of new commits was unreliable in this mode).
-
-* The testing infrastructure was considerably improved (continuous
-  integration with travis-ci, automatic check of PEP8 and RST syntax,
-  many improvements to the test scripts).
-
-This version has been tested with Python 2.4 to 2.7, and Git 1.7.1 to
-2.4.
-
-Release 1.0.0
-=============
-
-* Fix encoding of non-ASCII email addresses in email headers.
-
-* Fix backwards-compatibility bugs for older Python 2.x versions.
-
-* Fix a backwards-compatibility bug for Git 1.7.1.
-
-* Add an option commitDiffOpts to customize logs for revisions.
-
-* Pass "-oi" to sendmail by default to prevent premature termination
-  on a line containing only ".".
-
-* Stagger email "Date:" values in an attempt to help mail clients
-  thread the emails in the right order.
-
-* If a mailing list setting is missing, just skip sending the
-  corresponding email (with a warning) instead of failing.
-
-* Add a X-Git-Host header that can be used for email filtering.
-
-* Allow the sender's fully-qualified domain name to be configured.
-
-* Minor documentation improvements.
-
-* Add this CHANGES file.
-
-
-Release 0.9.0
-=============
-
-* Initial release.
diff --git a/contrib/hooks/multimail/CONTRIBUTING.rst b/contrib/hooks/multimail/CONTRIBUTING.rst
deleted file mode 100644
index de20a5428730..000000000000
--- a/contrib/hooks/multimail/CONTRIBUTING.rst
+++ /dev/null
@@ -1,60 +0,0 @@
-Contributing
-============
-
-git-multimail is an open-source project, built by volunteers. We would
-welcome your help!
-
-The current maintainers are `Matthieu Moy <http://matthieu-moy.fr>`__ and
-`Michael Haggerty <https://github.com/mhagger>`__.
-
-Please note that although a copy of git-multimail is distributed in
-the "contrib" section of the main Git project, development takes place
-in a separate `git-multimail repository on GitHub`_.
-
-Whenever enough changes to git-multimail have accumulated, a new
-code-drop of git-multimail will be submitted for inclusion in the Git
-project.
-
-We use the GitHub issue tracker to keep track of bugs and feature
-requests, and we use GitHub pull requests to exchange patches (though,
-if you prefer, you can send patches via the Git mailing list with CC
-to the maintainers). Please sign off your patches as per the `Git
-project practice
-<https://github.com/git/git/blob/master/Documentation/SubmittingPatches#L234>`__.
-
-Please vote for issues you would like to be addressed in priority
-(click "add your reaction" and then the "+1" thumbs-up button on the
-GitHub issue).
-
-General discussion of git-multimail can take place on the main `Git
-mailing list`_.
-
-Please CC emails regarding git-multimail to the maintainers so that we
-don't overlook them.
-
-Help needed: testers/maintainer for specific environments/OS
-------------------------------------------------------------
-
-The current maintainer uses and tests git-multimail on Linux with the
-Generic environment. More testers, or better contributors are needed
-to test git-multimail on other real-life setups:
-
-* Mac OS X, Windows: git-multimail is currently not supported on these
-  platforms. But since we have no external dependencies and try to
-  write code as portable as possible, it is possible that
-  git-multimail already runs there and if not, it is likely that it
-  could be ported easily.
-
-  Patches to improve support for Windows and OS X are welcome.
-  Ideally, there would be a sub-maintainer for each OS who would test
-  at least once before each release (around twice a year).
-
-* Gerrit, Stash, Gitolite environments: although the testsuite
-  contains tests for these environments, a tester/maintainer for each
-  environment would be welcome to test and report failure (or success)
-  on real-life environments periodically (here also, feedback before
-  each release would be highly appreciated).
-
-
-.. _`git-multimail repository on GitHub`: https://github.com/git-multimail/git-multimail
-.. _`Git mailing list`: git@vger.kernel.org
diff --git a/contrib/hooks/multimail/README.Git b/contrib/hooks/multimail/README.Git
index 044444245d09..c427efc7bd8e 100644
--- a/contrib/hooks/multimail/README.Git
+++ b/contrib/hooks/multimail/README.Git
@@ -1,15 +1,7 @@
-This copy of git-multimail is distributed as part of the "contrib"
-section of the Git project as a convenience to Git users.
 git-multimail is developed as an independent project at the following
 website:
 
     https://github.com/git-multimail/git-multimail
 
-The version in this directory was obtained from the upstream project
-on January 07 2019 and consists of the "git-multimail" subdirectory from
-revision
-
-    04e80e6c40be465cc62b6c246f0fcb8fd2cfd454 refs/tags/1.5.0
-
-Please see the README file in this directory for information about how
-to report bugs or contribute to git-multimail.
+Please refer to that project page for information about how to report
+bugs or contribute to git-multimail.
diff --git a/contrib/hooks/multimail/README.migrate-from-post-receive-email b/contrib/hooks/multimail/README.migrate-from-post-receive-email
deleted file mode 100644
index 1e6a976699aa..000000000000
--- a/contrib/hooks/multimail/README.migrate-from-post-receive-email
+++ /dev/null
@@ -1,145 +0,0 @@
-git-multimail is close to, but not exactly, a plug-in replacement for
-the old Git project script contrib/hooks/post-receive-email.  This
-document describes the differences and explains how to configure
-git-multimail to get behavior closest to that of post-receive-email.
-
-If you are in a hurry
-=====================
-
-A script called migrate-mailhook-config is included with
-git-multimail.  If you run this script within a Git repository that is
-configured to use post-receive-email, it will convert the
-configuration settings into the approximate equivalent settings for
-git-multimail.  For more information, run
-
-    migrate-mailhook-config --help
-
-
-Configuration differences
-=========================
-
-* The names of the config options for git-multimail are in namespace
-  "multimailhook.*" instead of "hooks.*".  (Editorial comment:
-  post-receive-email should never have used such a generic top-level
-  namespace.)
-
-* In emails about new annotated tags, post-receive-email includes a
-  shortlog of all changes since the previous annotated tag.  To get
-  this behavior with git-multimail, you need to set
-  multimailhook.announceshortlog to true:
-
-      git config multimailhook.announceshortlog true
-
-* multimailhook.commitlist -- This is a new configuration variable.
-  Recipients listed here will receive a separate email for each new
-  commit.  However, if this variable is *not* set, it defaults to the
-  value of multimailhook.mailinglist.  Therefore, if you *don't* want
-  the members of multimailhook.mailinglist to receive one email per
-  commit, then set this value to the empty string:
-
-      git config multimailhook.commitlist ''
-
-* multimailhook.emailprefix -- If this value is not set, then the
-  subjects of generated emails are prefixed with the short name of the
-  repository enclosed in square brackets; e.g., "[myrepo]".
-  post-receive-email defaults to prefix "[SCM]" if this option is not
-  set.  So if you were using the old default and want to retain it
-  (for example, to avoid having to change your email filters), set
-  this variable explicitly to the old value:
-
-      git config multimailhook.emailprefix "[SCM]"
-
-* The "multimailhook.showrev" configuration option is not supported.
-  Its main use is obsoleted by the one-email-per-commit feature of
-  git-multimail.
-
-
-Other differences
-=================
-
-This section describes other differences in the behavior of
-git-multimail vs. post-receive-email.  For full details, please refer
-to the main README file:
-
-* One email per commit.  For each reference change, the script first
-  outputs one email summarizing the reference change (including
-  one-line summaries of the new commits), then it outputs a separate
-  email for each new commit that was introduced, including patches.
-  These one-email-per-commit emails go to the addresses listed in
-  multimailhook.commitlist.  post-receive-email sends only one email
-  for each *reference* that is changed, no matter how many commits
-  were added to the reference.
-
-* Better algorithm for detecting new commits.  post-receive-email
-  processes one reference change at a time, which causes it to fail to
-  describe new commits that were included in multiple branches.  For
-  example, if a single push adds the "*" commits in the diagram below,
-  then post-receive-email would never include the details of the two
-  commits that are common to "master" and "branch" in its
-  notifications.
-
-      o---o---o---*---*---*    <-- master
-                       \
-                        *---*  <-- branch
-
-  git-multimail analyzes all reference modifications to determine
-  which commits were not present before the change, therefore avoiding
-  that error.
-
-* In reference change emails, git-multimail tells which commits have
-  been added to the reference vs. are entirely new to the repository,
-  and which commits that have been omitted from the reference
-  vs. entirely discarded from the repository.
-
-* The environment in which Git is running can be configured via an
-  "Environment" abstraction.
-
-* Built-in support for Gitolite-managed repositories.
-
-* Instead of using full SHA1 object names in emails, git-multimail
-  mostly uses abbreviated SHA1s, plus one-line log message summaries
-  where appropriate.
-
-* In the schematic diagrams that explain non-fast-forward commits,
-  git-multimail shows the names of the branches involved.
-
-* The emails generated by git-multimail include the name of the Git
-  repository that was modified; this is convenient for recipients who
-  are monitoring multiple repositories.
-
-* git-multimail allows the email "From" addresses to be configured.
-
-* The recipients lists (multimailhook.mailinglist,
-  multimailhook.refchangelist, multimailhook.announcelist, and
-  multimailhook.commitlist) can be comma-separated values and/or
-  multivalued settings in the config file; e.g.,
-
-      [multimailhook]
-              mailinglist = mr.brown@example.com, mr.black@example.com
-              announcelist = Him <him@example.com>
-              announcelist = Jim <jim@example.com>
-              announcelist = pop@example.com
-
-  This might make it easier to maintain short recipients lists without
-  requiring full-fledged mailing list software.
-
-* By default, git-multimail sets email "Reply-To" headers to reply to
-  the pusher (for reference updates) and to the author (for commit
-  notifications).  By default, the pusher's email address is
-  constructed by appending "multimailhook.emaildomain" to the pusher's
-  username.
-
-* The generated emails contain a configurable footer.  By default, it
-  lists the name of the administrator who should be contacted to
-  unsubscribe from notification emails.
-
-* New option multimailhook.emailmaxlinelength to limit the length of
-  lines in the main part of the email body.  The default limit is 500
-  characters.
-
-* New option multimailhook.emailstrictutf8 to ensure that the main
-  part of the email body is valid UTF-8.  Invalid characters are
-  turned into the Unicode replacement character, U+FFFD.  By default
-  this option is turned on.
-
-* Written in Python.  Easier to add new features.
diff --git a/contrib/hooks/multimail/README.rst b/contrib/hooks/multimail/README.rst
deleted file mode 100644
index 7c0fc4a6ef00..000000000000
--- a/contrib/hooks/multimail/README.rst
+++ /dev/null
@@ -1,774 +0,0 @@
-git-multimail version 1.5.0
-===========================
-
-.. image:: https://travis-ci.org/git-multimail/git-multimail.svg?branch=master
-    :target: https://travis-ci.org/git-multimail/git-multimail
-
-git-multimail is a tool for sending notification emails on pushes to a
-Git repository.  It includes a Python module called ``git_multimail.py``,
-which can either be used as a hook script directly or can be imported
-as a Python module into another script.
-
-git-multimail is derived from the Git project's old
-contrib/hooks/post-receive-email, and is mostly compatible with that
-script.  See README.migrate-from-post-receive-email for details about
-the differences and for how to migrate from post-receive-email to
-git-multimail.
-
-git-multimail, like the rest of the Git project, is licensed under
-GPLv2 (see the COPYING file for details).
-
-Please note: although, as a convenience, git-multimail may be
-distributed along with the main Git project, development of
-git-multimail takes place in its own, separate project.  Please, read
-`<CONTRIBUTING.rst>`__ for more information.
-
-
-By default, for each push received by the repository, git-multimail:
-
-1. Outputs one email summarizing each reference that was changed.
-   These "reference change" (called "refchange" below) emails describe
-   the nature of the change (e.g., was the reference created, deleted,
-   fast-forwarded, etc.) and include a one-line summary of each commit
-   that was added to the reference.
-
-2. Outputs one email for each new commit that was introduced by the
-   reference change.  These "commit" emails include a list of the
-   files changed by the commit, followed by the diffs of files
-   modified by the commit.  The commit emails are threaded to the
-   corresponding reference change email via "In-Reply-To".  This style
-   (similar to the "git format-patch" style used on the Git mailing
-   list) makes it easy to scan through the emails, jump to patches
-   that need further attention, and write comments about specific
-   commits.  Commits are handled in reverse topological order (i.e.,
-   parents shown before children).  For example::
-
-     [git] branch master updated
-     + [git] 01/08: doc: fix xref link from api docs to manual pages
-     + [git] 02/08: api-credentials.txt: show the big picture first
-     + [git] 03/08: api-credentials.txt: mention credential.helper explicitly
-     + [git] 04/08: api-credentials.txt: add "see also" section
-     + [git] 05/08: t3510 (cherry-pick-sequence): add missing '&&'
-     + [git] 06/08: Merge branch 'rr/maint-t3510-cascade-fix'
-     + [git] 07/08: Merge branch 'mm/api-credentials-doc'
-     + [git] 08/08: Git 1.7.11-rc2
-
-   By default, each commit appears in exactly one commit email, the
-   first time that it is pushed to the repository.  If a commit is later
-   merged into another branch, then a one-line summary of the commit
-   is included in the reference change email (as usual), but no
-   additional commit email is generated. See
-   `multimailhook.refFilter(Inclusion|Exclusion|DoSend|DontSend)Regex`
-   below to configure which branches and tags are watched by the hook.
-
-   By default, reference change emails have their "Reply-To" field set
-   to the person who pushed the change, and commit emails have their
-   "Reply-To" field set to the author of the commit.
-
-3. Output one "announce" mail for each new annotated tag, including
-   information about the tag and optionally a shortlog describing the
-   changes since the previous tag.  Such emails might be useful if you
-   use annotated tags to mark releases of your project.
-
-
-Requirements
-------------
-
-* Python 2.x, version 2.4 or later.  No non-standard Python modules
-  are required.  git-multimail has preliminary support for Python 3
-  (but it has been better tested with Python 2).
-
-* The ``git`` command must be in your PATH.  git-multimail is known to
-  work with Git versions back to 1.7.1.  (Earlier versions have not
-  been tested; if you do so, please report your results.)
-
-* To send emails using the default configuration, a standard sendmail
-  program must be located at '/usr/sbin/sendmail' or
-  '/usr/lib/sendmail' and must be configured correctly to send emails.
-  If this is not the case, set multimailhook.sendmailCommand, or see
-  the multimailhook.mailer configuration variable below for how to
-  configure git-multimail to send emails via an SMTP server.
-
-* git-multimail is currently tested only on Linux. It may or may not
-  work on other platforms such as Windows and Mac OS. See
-  `<CONTRIBUTING.rst>`__ to improve the situation.
-
-
-Invocation
-----------
-
-``git_multimail.py`` is designed to be used as a ``post-receive`` hook in a
-Git repository (see githooks(5)).  Link or copy it to
-$GIT_DIR/hooks/post-receive within the repository for which email
-notifications are desired.  Usually it should be installed on the
-central repository for a project, to which all commits are eventually
-pushed.
-
-For use on pre-v1.5.1 Git servers, ``git_multimail.py`` can also work as
-an ``update`` hook, taking its arguments on the command line.  To use
-this script in this manner, link or copy it to $GIT_DIR/hooks/update.
-Please note that the script is not completely reliable in this mode
-[1]_.
-
-Alternatively, ``git_multimail.py`` can be imported as a Python module
-into your own Python post-receive script.  This method is a bit more
-work, but allows the behavior of the hook to be customized using
-arbitrary Python code.  For example, you can use a custom environment
-(perhaps inheriting from GenericEnvironment or GitoliteEnvironment) to
-
-* change how the user who did the push is determined
-
-* read users' email addresses from an LDAP server or from a database
-
-* decide which users should be notified about which commits based on
-  the contents of the commits (e.g., for users who want to be notified
-  only about changes affecting particular files or subdirectories)
-
-Or you can change how emails are sent by writing your own Mailer
-class.  The ``post-receive`` script in this directory demonstrates how
-to use ``git_multimail.py`` as a Python module.  (If you make interesting
-changes of this type, please consider sharing them with the
-community.)
-
-
-Troubleshooting/FAQ
--------------------
-
-Please read `<doc/troubleshooting.rst>`__ for frequently asked
-questions and common issues with git-multimail.
-
-
-Configuration
--------------
-
-By default, git-multimail mostly takes its configuration from the
-following ``git config`` settings:
-
-multimailhook.environment
-    This describes the general environment of the repository. In most
-    cases, you do not need to specify a value for this variable:
-    `git-multimail` will autodetect which environment to use.
-    Currently supported values:
-
-    generic
-      the username of the pusher is read from $USER or $USERNAME and
-      the repository name is derived from the repository's path.
-
-    gitolite
-      Environment to use when ``git-multimail`` is ran as a gitolite_
-      hook.
-
-      The username of the pusher is read from $GL_USER, the repository
-      name is read from $GL_REPO, and the From: header value is
-      optionally read from gitolite.conf (see multimailhook.from).
-
-      For more information about gitolite and git-multimail, read
-      `<doc/gitolite.rst>`__
-
-    stash
-      Environment to use when ``git-multimail`` is ran as an Atlassian
-      BitBucket Server (formerly known as Atlassian Stash) hook.
-
-      **Warning:** this mode was provided by a third-party contributor
-      and never tested by the git-multimail maintainers. It is
-      provided as-is and may or may not work for you.
-
-      This value is automatically assumed when the stash-specific
-      flags (``--stash-user`` and ``--stash-repo``) are specified on
-      the command line. When this environment is active, the username
-      and repo come from these two command line flags, which must be
-      specified.
-
-    gerrit
-      Environment to use when ``git-multimail`` is ran as a
-      ``ref-updated`` Gerrit hook.
-
-      This value is used when the gerrit-specific command line flags
-      (``--oldrev``, ``--newrev``, ``--refname``, ``--project``) for
-      gerrit's ref-updated hook are present. When this environment is
-      active, the username of the pusher is taken from the
-      ``--submitter`` argument if that command line option is passed,
-      otherwise 'Gerrit' is used. The repository name is taken from
-      the ``--project`` option on the command line, which must be passed.
-
-      For more information about gerrit and git-multimail, read
-      `<doc/gerrit.rst>`__
-
-    If none of these environments is suitable for your setup, then you
-    can implement a Python class that inherits from Environment and
-    instantiate it via a script that looks like the example
-    post-receive script.
-
-    The environment value can be specified on the command line using
-    the ``--environment`` option. If it is not specified on the
-    command line or by ``multimailhook.environment``, the value is
-    guessed as follows:
-
-    * If stash-specific (respectively gerrit-specific) command flags
-      are present on the command-line, then ``stash`` (respectively
-      ``gerrit``) is used.
-
-    * If the environment variables $GL_USER and $GL_REPO are set, then
-      ``gitolite`` is used.
-
-    * If none of the above apply, then ``generic`` is used.
-
-multimailhook.repoName
-    A short name of this Git repository, to be used in various places
-    in the notification email text.  The default is to use $GL_REPO
-    for gitolite repositories, or otherwise to derive this value from
-    the repository path name.
-
-multimailhook.mailingList
-    The list of email addresses to which notification emails should be
-    sent, as RFC 2822 email addresses separated by commas.  This
-    configuration option can be multivalued.  Leave it unset or set it
-    to the empty string to not send emails by default.  The next few
-    settings can be used to configure specific address lists for
-    specific types of notification email.
-
-multimailhook.refchangeList
-    The list of email addresses to which summary emails about
-    reference changes should be sent, as RFC 2822 email addresses
-    separated by commas.  This configuration option can be
-    multivalued.  The default is the value in
-    multimailhook.mailingList.  Set this value to "none" (or the empty
-    string) to prevent reference change emails from being sent even if
-    multimailhook.mailingList is set.
-
-multimailhook.announceList
-    The list of email addresses to which emails about new annotated
-    tags should be sent, as RFC 2822 email addresses separated by
-    commas.  This configuration option can be multivalued.  The
-    default is the value in multimailhook.refchangeList or
-    multimailhook.mailingList.  Set this value to "none" (or the empty
-    string) to prevent annotated tag announcement emails from being sent
-    even if one of the other values is set.
-
-multimailhook.commitList
-    The list of email addresses to which emails about individual new
-    commits should be sent, as RFC 2822 email addresses separated by
-    commas.  This configuration option can be multivalued.  The
-    default is the value in multimailhook.mailingList.  Set this value
-    to "none" (or the empty string) to prevent notification emails about
-    individual commits from being sent even if
-    multimailhook.mailingList is set.
-
-multimailhook.announceShortlog
-    If this option is set to true, then emails about changes to
-    annotated tags include a shortlog of changes since the previous
-    tag.  This can be useful if the annotated tags represent releases;
-    then the shortlog will be a kind of rough summary of what has
-    happened since the last release.  But if your tagging policy is
-    not so straightforward, then the shortlog might be confusing
-    rather than useful.  Default is false.
-
-multimailhook.commitEmailFormat
-    The format of email messages for the individual commits, can be "text" or
-    "html". In the latter case, the emails will include diffs using colorized
-    HTML instead of plain text used by default. Note that this  currently the
-    ref change emails are always sent in plain text.
-
-    Note that when using "html", the formatting is done by parsing the
-    output of ``git log`` with ``-p``. When using
-    ``multimailhook.commitLogOpts`` to specify a ``--format`` for
-    ``git log``, one may get false positive (e.g. lines in the body of
-    the message starting with ``+++`` or ``---`` colored in red or
-    green).
-
-    By default, all the message is HTML-escaped. See
-    ``multimailhook.htmlInIntro`` to change this behavior.
-
-multimailhook.commitBrowseURL
-    Used to generate a link to an online repository browser in commit
-    emails. This variable must be a string. Format directives like
-    ``%(<variable>)s`` will be expanded the same way as template
-    strings. In particular, ``%(id)s`` will be replaced by the full
-    Git commit identifier (40-chars hexadecimal).
-
-    If the string does not contain any format directive, then
-    ``%(id)s`` will be automatically added to the string. If you don't
-    want ``%(id)s`` to be automatically added, use the empty format
-    directive ``%()s`` anywhere in the string.
-
-    For example, a suitable value for the git-multimail project itself
-    would be
-    ``https://github.com/git-multimail/git-multimail/commit/%(id)s``.
-
-multimailhook.htmlInIntro, multimailhook.htmlInFooter
-    When generating an HTML message, git-multimail escapes any HTML
-    sequence by default. This means that if a template contains HTML
-    like ``<a href="foo">link</a>``, the reader will see the HTML
-    source code and not a proper link.
-
-    Set ``multimailhook.htmlInIntro`` to true to allow writing HTML
-    formatting in introduction templates. Similarly, set
-    ``multimailhook.htmlInFooter`` for HTML in the footer.
-
-    Variables expanded in the template are still escaped. For example,
-    if a repository's path contains a ``<``, it will be rendered as
-    such in the message.
-
-    Read `<doc/customizing-emails.rst>`__ for more details and
-    examples.
-
-multimailhook.refchangeShowGraph
-    If this option is set to true, then summary emails about reference
-    changes will additionally include:
-
-    * a graph of the added commits (if any)
-
-    * a graph of the discarded commits (if any)
-
-    The log is generated by running ``git log --graph`` with the options
-    specified in graphOpts.  The default is false.
-
-multimailhook.refchangeShowLog
-    If this option is set to true, then summary emails about reference
-    changes will include a detailed log of the added commits in
-    addition to the one line summary.  The log is generated by running
-    ``git log`` with the options specified in multimailhook.logOpts.
-    Default is false.
-
-multimailhook.mailer
-    This option changes the way emails are sent.  Accepted values are:
-
-    * **sendmail (the default)**: use the command ``/usr/sbin/sendmail`` or
-      ``/usr/lib/sendmail`` (or sendmailCommand, if configured).  This
-      mode can be further customized via the following options:
-
-      multimailhook.sendmailCommand
-          The command used by mailer ``sendmail`` to send emails.  Shell
-          quoting is allowed in the value of this setting, but remember that
-          Git requires double-quotes to be escaped; e.g.::
-
-              git config multimailhook.sendmailcommand '/usr/sbin/sendmail -oi -t -F \"Git Repo\"'
-
-          Default is '/usr/sbin/sendmail -oi -t' or
-          '/usr/lib/sendmail -oi -t' (depending on which file is
-          present and executable).
-
-      multimailhook.envelopeSender
-          If set then pass this value to sendmail via the -f option to set
-          the envelope sender address.
-
-    * **smtp**: use Python's smtplib.  This is useful when the sendmail
-      command is not available on the system.  This mode can be
-      further customized via the following options:
-
-      multimailhook.smtpServer
-          The name of the SMTP server to connect to.  The value can
-          also include a colon and a port number; e.g.,
-          ``mail.example.com:25``.  Default is 'localhost' using port 25.
-
-      multimailhook.smtpUser, multimailhook.smtpPass
-          Server username and password. Required if smtpEncryption is 'ssl'.
-          Note that the username and password currently need to be
-          set cleartext in the configuration file, which is not
-          recommended. If you need to use this option, be sure your
-          configuration file is read-only.
-
-      multimailhook.envelopeSender
-        The sender address to be passed to the SMTP server.  If
-        unset, then the value of multimailhook.from is used.
-
-      multimailhook.smtpServerTimeout
-        Timeout in seconds. Default is 10.
-
-      multimailhook.smtpEncryption
-        Set the security type. Allowed values: ``none``, ``ssl``, ``tls`` (starttls).
-        Default is ``none``.
-
-      multimailhook.smtpCACerts
-        Set the path to a list of trusted CA certificate to verify the
-        server certificate, only supported when ``smtpEncryption`` is
-        ``tls``. If unset or empty, the server certificate is not
-        verified. If it targets a file containing a list of trusted CA
-        certificates (PEM format) these CAs will be used to verify the
-        server certificate. For debian, you can set
-        ``/etc/ssl/certs/ca-certificates.crt`` for using the system
-        trusted CAs. For self-signed server, you can add your server
-        certificate to the system store::
-
-            cd /usr/local/share/ca-certificates/
-            openssl s_client -starttls smtp \
-                   -connect mail.example.net:587 -showcerts \
-                   </dev/null 2>/dev/null \
-                 | openssl x509 -outform PEM >mail.example.net.crt
-            update-ca-certificates
-
-        and used the updated ``/etc/ssl/certs/ca-certificates.crt``. Or
-        directly use your ``/path/to/mail.example.net.crt``. Default is
-        unset.
-
-      multimailhook.smtpServerDebugLevel
-        Integer number. Set to greater than 0 to activate debugging.
-
-multimailhook.from, multimailhook.fromCommit, multimailhook.fromRefchange
-    If set, use this value in the From: field of generated emails.
-    ``fromCommit`` is used for commit emails, ``fromRefchange`` is
-    used for refchange emails, and ``from`` is used as fall-back in
-    all cases.
-
-    The value for these variables can be either:
-
-    - An email address, which will be used directly.
-
-    - The value ``pusher``, in which case the pusher's address (if
-      available) will be used.
-
-    - The value ``author`` (meaningful only for ``fromCommit``), in which
-      case the commit author's address will be used.
-
-    If config values are unset, the value of the From: header is
-    determined as follows:
-
-    1. (gitolite environment only)
-       1.a) If ``multimailhook.MailaddressMap`` is set, and is a path
-       to an existing file (if relative, it is considered relative to
-       the place where ``gitolite.conf`` is located), then this file
-       should contain lines like::
-
-           username Firstname Lastname <email@example.com>
-
-       git-multimail will then look for a line where ``$GL_USER``
-       matches the ``username`` part, and use the rest of the line for
-       the ``From:`` header.
-
-       1.b) Parse gitolite.conf, looking for a block of comments that
-       looks like this::
-
-           # BEGIN USER EMAILS
-           # username Firstname Lastname <email@example.com>
-           # END USER EMAILS
-
-       If that block exists, and there is a line between the BEGIN
-       USER EMAILS and END USER EMAILS lines where the first field
-       matches the gitolite username ($GL_USER), use the rest of the
-       line for the From: header.
-
-    2. If the user.email configuration setting is set, use its value
-       (and the value of user.name, if set).
-
-    3. Use the value of multimailhook.envelopeSender.
-
-multimailhook.MailaddressMap
-    (gitolite environment only)
-    File to look for a ``From:`` address based on the user doing the
-    push. Defaults to unset. See ``multimailhook.from`` for details.
-
-multimailhook.administrator
-    The name and/or email address of the administrator of the Git
-    repository; used in FOOTER_TEMPLATE.  Default is
-    multimailhook.envelopesender if it is set; otherwise a generic
-    string is used.
-
-multimailhook.emailPrefix
-    All emails have this string prepended to their subjects, to aid
-    email filtering (though filtering based on the X-Git-* email
-    headers is probably more robust).  Default is the short name of
-    the repository in square brackets; e.g., ``[myrepo]``.  Set this
-    value to the empty string to suppress the email prefix. You may
-    use the placeholder ``%(repo_shortname)s`` for the short name of
-    the repository.
-
-multimailhook.emailMaxLines
-    The maximum number of lines that should be included in the body of
-    a generated email.  If not specified, there is no limit.  Lines
-    beyond the limit are suppressed and counted, and a final line is
-    added indicating the number of suppressed lines.
-
-multimailhook.emailMaxLineLength
-    The maximum length of a line in the email body.  Lines longer than
-    this limit are truncated to this length with a trailing ``[...]``
-    added to indicate the missing text.  The default is 500, because
-    (a) diffs with longer lines are probably from binary files, for
-    which a diff is useless, and (b) even if a text file has such long
-    lines, the diffs are probably unreadable anyway.  To disable line
-    truncation, set this option to 0.
-
-multimailhook.subjectMaxLength
-    The maximum length of the subject line (i.e. the ``oneline`` field
-    in templates, not including the prefix). Lines longer than this
-    limit are truncated to this length with a trailing ``[...]`` added
-    to indicate the missing text. This option The default is to use
-    ``multimailhook.emailMaxLineLength``. This option avoids sending
-    emails with overly long subject lines, but should not be needed if
-    the commit messages follow the Git convention (one short subject
-    line, then a blank line, then the message body). To disable line
-    truncation, set this option to 0.
-
-multimailhook.maxCommitEmails
-    The maximum number of commit emails to send for a given change.
-    When the number of patches is larger that this value, only the
-    summary refchange email is sent.  This can avoid accidental
-    mailbombing, for example on an initial push.  To disable commit
-    emails limit, set this option to 0.  The default is 500.
-
-multimailhook.excludeMergeRevisions
-    When sending out revision emails, do not consider merge commits (the
-    functional equivalent of `rev-list --no-merges`).
-    The default is `false` (send merge commit emails).
-
-multimailhook.emailStrictUTF8
-    If this boolean option is set to `true`, then the main part of the
-    email body is forced to be valid UTF-8.  Any characters that are
-    not valid UTF-8 are converted to the Unicode replacement
-    character, U+FFFD.  The default is `true`.
-
-    This option is ineffective with Python 3, where non-UTF-8
-    characters are unconditionally replaced.
-
-multimailhook.diffOpts
-    Options passed to ``git diff-tree`` when generating the summary
-    information for ReferenceChange emails.  Default is ``--stat
-    --summary --find-copies-harder``.  Add -p to those options to
-    include a unified diff of changes in addition to the usual summary
-    output.  Shell quoting is allowed; see ``multimailhook.logOpts`` for
-    details.
-
-multimailhook.graphOpts
-    Options passed to ``git log --graph`` when generating graphs for the
-    reference change summary emails (used only if refchangeShowGraph
-    is true).  The default is '--oneline --decorate'.
-
-    Shell quoting is allowed; see logOpts for details.
-
-multimailhook.logOpts
-    Options passed to ``git log`` to generate additional info for
-    reference change emails (used only if refchangeShowLog is set).
-    For example, adding -p will show each commit's complete diff.  The
-    default is empty.
-
-    Shell quoting is allowed; for example, a log format that contains
-    spaces can be specified using something like::
-
-      git config multimailhook.logopts '--pretty=format:"%h %aN <%aE>%n%s%n%n%b%n"'
-
-    If you want to set this by editing your configuration file
-    directly, remember that Git requires double-quotes to be escaped
-    (see git-config(1) for more information)::
-
-      [multimailhook]
-              logopts = --pretty=format:\"%h %aN <%aE>%n%s%n%n%b%n\"
-
-multimailhook.commitLogOpts
-    Options passed to ``git log`` to generate additional info for
-    revision change emails.  For example, adding --ignore-all-spaces
-    will suppress whitespace changes.  The default options are ``-C
-    --stat -p --cc``.  Shell quoting is allowed; see
-    multimailhook.logOpts for details.
-
-multimailhook.dateSubstitute
-    String to use as a substitute for ``Date:`` in the output of ``git
-    log`` while formatting commit messages. This is useful to avoid
-    emitting a line that can be interpreted by mailers as the start of
-    a cited message (Zimbra webmail in particular). Defaults to
-    ``CommitDate:``. Set to an empty string or ``none`` to deactivate
-    the behavior.
-
-multimailhook.emailDomain
-    Domain name appended to the username of the person doing the push
-    to convert it into an email address
-    (via ``"%s@%s" % (username, emaildomain)``). More complicated
-    schemes can be implemented by overriding Environment and
-    overriding its get_pusher_email() method.
-
-multimailhook.replyTo, multimailhook.replyToCommit, multimailhook.replyToRefchange
-    Addresses to use in the Reply-To: field for commit emails
-    (replyToCommit) and refchange emails (replyToRefchange).
-    multimailhook.replyTo is used as default when replyToCommit or
-    replyToRefchange is not set. The shortcuts ``pusher`` and
-    ``author`` are allowed with the same semantics as for
-    ``multimailhook.from``. In addition, the value ``none`` can be
-    used to omit the ``Reply-To:`` field.
-
-    The default is ``pusher`` for refchange emails, and ``author`` for
-    commit emails.
-
-multimailhook.quiet
-    Do not output the list of email recipients from the hook
-
-multimailhook.stdout
-    For debugging, send emails to stdout rather than to the
-    mailer.  Equivalent to the --stdout command line option
-
-multimailhook.scanCommitForCc
-    If this option is set to true, than recipients from lines in commit body
-    that starts with ``CC:`` will be added to CC list.
-    Default: false
-
-multimailhook.combineWhenSingleCommit
-    If this option is set to true and a single new commit is pushed to
-    a branch, combine the summary and commit email messages into a
-    single email.
-    Default: true
-
-multimailhook.refFilterInclusionRegex, multimailhook.refFilterExclusionRegex, multimailhook.refFilterDoSendRegex, multimailhook.refFilterDontSendRegex
-    **Warning:** these options are experimental. They should work, but
-    the user-interface is not stable yet (in particular, the option
-    names may change). If you want to participate in stabilizing the
-    feature, please contact the maintainers and/or send pull-requests.
-    If you are happy with the current shape of the feature, please
-    report it too.
-
-    Regular expressions that can be used to limit refs for which email
-    updates will be sent.  It is an error to specify both an inclusion
-    and an exclusion regex.  If a ``refFilterInclusionRegex`` is
-    specified, emails will only be sent for refs which match this
-    regex.  If a ``refFilterExclusionRegex`` regex is specified,
-    emails will be sent for all refs except those that match this
-    regex (or that match a predefined regex specific to the
-    environment, such as "^refs/notes" for most environments and
-    "^refs/notes|^refs/changes" for the gerrit environment).
-
-    The expressions are matched against the complete refname, and is
-    considered to match if any substring matches. For example, to
-    filter-out all tags, set ``refFilterExclusionRegex`` to
-    ``^refs/tags/`` (note the leading ``^`` but no trailing ``$``). If
-    you set ``refFilterExclusionRegex`` to ``master``, then any ref
-    containing ``master`` will be excluded (the ``master`` branch, but
-    also ``refs/tags/master`` or ``refs/heads/foo-master-bar``).
-
-    ``refFilterDoSendRegex`` and ``refFilterDontSendRegex`` are
-    analogous to ``refFilterInclusionRegex`` and
-    ``refFilterExclusionRegex`` with one difference: with
-    ``refFilterDoSendRegex`` and ``refFilterDontSendRegex``, commits
-    introduced by one excluded ref will not be considered as new when
-    they reach an included ref. Typically, if you add a branch ``foo``
-    to  ``refFilterDontSendRegex``, push commits to this branch, and
-    later merge branch ``foo`` into ``master``, then the notification
-    email for ``master`` will contain a commit email only for the
-    merge commit. If you include ``foo`` in
-    ``refFilterExclusionRegex``, then at the time of merge, you will
-    receive one commit email per commit in the branch.
-
-    These variables can be multi-valued, like::
-
-      [multimailhook]
-              refFilterExclusionRegex = ^refs/tags/
-              refFilterExclusionRegex = ^refs/heads/master$
-
-    You can also provide a whitespace-separated list like::
-
-      [multimailhook]
-              refFilterExclusionRegex = ^refs/tags/ ^refs/heads/master$
-
-    Both examples exclude tags and the master branch, and are
-    equivalent to::
-
-      [multimailhook]
-              refFilterExclusionRegex = ^refs/tags/|^refs/heads/master$
-
-    ``refFilterInclusionRegex`` and ``refFilterExclusionRegex`` are
-    strictly stronger than ``refFilterDoSendRegex`` and
-    ``refFilterDontSendRegex``. In other words, adding a ref to a
-    DoSend/DontSend regex has no effect if it is already excluded by a
-    Exclusion/Inclusion regex.
-
-multimailhook.logFile, multimailhook.errorLogFile, multimailhook.debugLogFile
-
-    When set, these variable designate path to files where
-    git-multimail will log some messages. Normal messages and error
-    messages are sent to ``logFile``, and error messages are also sent
-    to ``errorLogFile``. Debug messages and all other messages are
-    sent to ``debugLogFile``. The recommended way is to set only one
-    of these variables, but it is also possible to set several of them
-    (part of the information is then duplicated in several log files,
-    for example errors are duplicated to all log files).
-
-    Relative path are relative to the Git repository where the push is
-    done.
-
-multimailhook.verbose
-
-    Verbosity level of git-multimail on its standard output. By
-    default, show only error and info messages. If set to true, show
-    also debug messages.
-
-Email filtering aids
---------------------
-
-All emails include extra headers to enable fine tuned filtering and
-give information for debugging.  All emails include the headers
-``X-Git-Host``, ``X-Git-Repo``, ``X-Git-Refname``, and ``X-Git-Reftype``.
-ReferenceChange emails also include headers ``X-Git-Oldrev`` and ``X-Git-Newrev``;
-Revision emails also include header ``X-Git-Rev``.
-
-
-Customizing email contents
---------------------------
-
-git-multimail mostly generates emails by expanding templates.  The
-templates can be customized.  To avoid the need to edit
-``git_multimail.py`` directly, the preferred way to change the templates
-is to write a separate Python script that imports ``git_multimail.py`` as
-a module, then replaces the templates in place.  See the provided
-post-receive script for an example of how this is done.
-
-
-Customizing git-multimail for your environment
-----------------------------------------------
-
-git-multimail is mostly customized via an "environment" that describes
-the local environment in which Git is running.  Two types of
-environment are built in:
-
-GenericEnvironment
-    a stand-alone Git repository.
-
-GitoliteEnvironment
-    a Git repository that is managed by gitolite_.  For such
-    repositories, the identity of the pusher is read from
-    environment variable $GL_USER, the name of the repository is read
-    from $GL_REPO (if it is not overridden by multimailhook.reponame),
-    and the From: header value is optionally read from gitolite.conf
-    (see multimailhook.from).
-
-By default, git-multimail assumes GitoliteEnvironment if $GL_USER and
-$GL_REPO are set, and otherwise assumes GenericEnvironment.
-Alternatively, you can choose one of these two environments explicitly
-by setting a ``multimailhook.environment`` config setting (which can
-have the value `generic` or `gitolite`) or by passing an --environment
-option to the script.
-
-If you need to customize the script in ways that are not supported by
-the existing environments, you can define your own environment class
-class using arbitrary Python code.  To do so, you need to import
-``git_multimail.py`` as a Python module, as demonstrated by the example
-post-receive script.  Then implement your environment class; it should
-usually inherit from one of the existing Environment classes and
-possibly one or more of the EnvironmentMixin classes.  Then set the
-``environment`` variable to an instance of your own environment class
-and pass it to ``run_as_post_receive_hook()``.
-
-The standard environment classes, GenericEnvironment and
-GitoliteEnvironment, are in fact themselves put together out of a
-number of mixin classes, each of which handles one aspect of the
-customization.  For the finest control over your configuration, you
-can specify exactly which mixin classes your own environment class
-should inherit from, and override individual methods (or even add your
-own mixin classes) to implement entirely new behaviors.  If you
-implement any mixins that might be useful to other people, please
-consider sharing them with the community!
-
-
-Getting involved
-----------------
-
-Please, read `<CONTRIBUTING.rst>`__ for instructions on how to
-contribute to git-multimail.
-
-
-Footnotes
----------
-
-.. [1] Because of the way information is passed to update hooks, the
-       script's method of determining whether a commit has already
-       been seen does not work when it is used as an ``update`` script.
-       In particular, no notification email will be generated for a
-       new commit that is added to multiple references in the same
-       push. A workaround is to use --force-send to force sending the
-       emails.
-
-.. _gitolite: https://github.com/sitaramc/gitolite
diff --git a/contrib/hooks/multimail/doc/customizing-emails.rst b/contrib/hooks/multimail/doc/customizing-emails.rst
deleted file mode 100644
index 3f5b67f768db..000000000000
--- a/contrib/hooks/multimail/doc/customizing-emails.rst
+++ /dev/null
@@ -1,56 +0,0 @@
-Customizing the content and formatting of emails
-================================================
-
-Overloading template strings
-----------------------------
-
-The content of emails is generated based on template strings defined
-in ``git_multimail.py``. You can customize these template strings
-without changing the script itself, by defining a Python wrapper
-around it. The python wrapper should ``import git_multimail`` and then
-override the ``git_multimail.*`` strings like this::
-
-  import sys  # needed for sys.argv
-
-  # Import and customize git_multimail:
-  import git_multimail
-  git_multimail.REVISION_INTRO_TEMPLATE = """..."""
-  git_multimail.COMBINED_INTRO_TEMPLATE = git_multimail.REVISION_INTRO_TEMPLATE
-
-  # start git_multimail itself:
-  git_multimail.main(sys.argv[1:])
-
-The template strings can use any value already used in the existing
-templates (read the source code).
-
-Using HTML in template strings
-------------------------------
-
-If ``multimailhook.commitEmailFormat`` is set to HTML, then
-git-multimail will generate HTML emails for commit notifications. The
-log and diff will be formatted automatically by git-multimail. By
-default, any HTML special character in the templates will be escaped.
-
-To use HTML formatting in the introduction of the email, set
-``multimailhook.htmlInIntro`` to ``true``. Then, the template can
-contain any HTML tags, that will be sent as-is in the email. For
-example, to add some formatting and a link to the online commit, use
-a format like::
-
-  git_multimail.REVISION_INTRO_TEMPLATE = """\
-  <span style="color:#808080">This is an automated email from the git hooks/post-receive script.</span><br /><br />
-
-  <strong>%(pusher)s</strong> pushed a commit to %(refname_type)s %(short_refname)s
-  in repository %(repo_shortname)s.<br />
-
-  <a href="https://github.com/git-multimail/git-multimail/commit/%(newrev)s">View on GitHub</a>.
-  """
-
-Note that the values expanded from ``%(variable)s`` in the format
-strings will still be escaped.
-
-For a less flexible but easier to set up way to add a link to commit
-emails, see ``multimailhook.commitBrowseURL``.
-
-Similarly, one can set ``multimailhook.htmlInFooter`` and override any
-of the ``*_FOOTER*`` template strings.
diff --git a/contrib/hooks/multimail/doc/gerrit.rst b/contrib/hooks/multimail/doc/gerrit.rst
deleted file mode 100644
index 8011d05dec03..000000000000
--- a/contrib/hooks/multimail/doc/gerrit.rst
+++ /dev/null
@@ -1,56 +0,0 @@
-Setting up git-multimail on Gerrit
-==================================
-
-Gerrit has its own email-sending system, but you may prefer using
-``git-multimail`` instead. It supports Gerrit natively as a Gerrit
-``ref-updated`` hook (Warning: `Gerrit hooks
-<https://gerrit-review.googlesource.com/Documentation/config-hooks.html>`__
-are distinct from Git hooks). Setting up ``git-multimail`` on a Gerrit
-installation can be done following the instructions below.
-
-The explanations show an easy way to set up ``git-multimail``,
-but leave ``git-multimail`` installed and unconfigured for a while. If
-you run Gerrit on a production server, it is advised that you
-execute the step "Set up the hook" last to avoid confusing your users
-in the meantime.
-
-Set up the hook
----------------
-
-Create a directory ``$site_path/hooks/`` if it does not exist (if you
-don't know what ``$site_path`` is, run ``gerrit.sh status`` and look
-for a ``GERRIT_SITE`` line). Either copy ``git_multimail.py`` to
-``$site_path/hooks/ref-updated`` or create a wrapper script like
-this::
-
-  #! /bin/sh
-  exec /path/to/git_multimail.py "$@"
-
-In both cases, make sure the file is named exactly
-``$site_path/hooks/ref-updated`` and is executable.
-
-(Alternatively, you may configure the ``[hooks]`` section of
-gerrit.config)
-
-Configuration
--------------
-
-Log on the gerrit server and edit ``$site_path/git/$project/config``
-to configure ``git-multimail``.
-
-Troubleshooting
----------------
-
-Warning: this will disable ``git-multimail`` during the debug, and
-could confuse your users. Don't run on a production server.
-
-To debug configuration issues with ``git-multimail``, you can add the
-``--stdout`` option when calling ``git_multimail.py`` like this::
-
-  #!/bin/sh
-  exec /path/to/git-multimail/git-multimail/git_multimail.py \
-    --stdout "$@" >> /tmp/log.txt
-
-and try pushing from a test repository. You should see the source of
-the email that would have been sent in the output of ``git push`` in
-the file ``/tmp/log.txt``.
diff --git a/contrib/hooks/multimail/doc/gitolite.rst b/contrib/hooks/multimail/doc/gitolite.rst
deleted file mode 100644
index 505483310552..000000000000
--- a/contrib/hooks/multimail/doc/gitolite.rst
+++ /dev/null
@@ -1,118 +0,0 @@
-Setting up git-multimail on gitolite
-====================================
-
-``git-multimail`` supports gitolite 3 natively.
-The explanations below show an easy way to set up ``git-multimail``,
-but leave ``git-multimail`` installed and unconfigured for a while. If
-you run gitolite on a production server, it is advised that you
-execute the step "Set up the hook" last to avoid confusing your users
-in the meantime.
-
-Set up the hook
----------------
-
-Log in as your gitolite user.
-
-Create a file ``.gitolite/hooks/common/post-receive`` on your gitolite
-account containing (adapt the path, obviously)::
-
-  #!/bin/sh
-  exec /path/to/git-multimail/git-multimail/git_multimail.py "$@"
-
-Make sure it's executable (``chmod +x``). Record the hook in
-gitolite::
-
-  gitolite setup
-
-Configuration
--------------
-
-First, you have to allow the admin to set Git configuration variables.
-
-As gitolite user, edit the line containing ``GIT_CONFIG_KEYS`` in file
-``.gitolite.rc``, to make it look like::
-
-  GIT_CONFIG_KEYS                 =>  'multimailhook\..*',
-
-You can now log out and return to your normal user.
-
-In the ``gitolite-admin`` clone, edit the file ``conf/gitolite.conf``
-and add::
-
-  repo @all
-      # Not strictly needed as git_multimail.py will chose gitolite if
-      # $GL_USER is set.
-      config multimailhook.environment = gitolite
-      config multimailhook.mailingList = # Where emails should be sent
-      config multimailhook.from = # From address to use
-
-Note that by default, gitolite forbids ``<`` and ``>`` in variable
-values (for security/paranoia reasons, see
-`compensating for UNSAFE_PATT
-<http://gitolite.com/gitolite/git-config/index.html#compensating-for-unsafe95patt>`__
-in gitolite's documentation for explanations and a way to disable
-this). As a consequence, you will not be able to use ``First Last
-<First.Last@example.com>`` as recipient email, but specifying
-``First.Last@example.com`` alone works.
-
-Obviously, you can customize all parameters on a per-repository basis by
-adding these ``config multimailhook.*`` lines in the section
-corresponding to a repository or set of repositories.
-
-To activate ``git-multimail`` on a per-repository basis, do not set
-``multimailhook.mailingList`` in the ``@all`` section and set it only
-for repositories for which you want ``git-multimail``.
-
-Alternatively, you can set up the ``From:`` field on a per-user basis
-by adding a ``BEGIN USER EMAILS``/``END USER EMAILS`` section (see
-``../README``).
-
-Specificities of Gitolite for Configuration
--------------------------------------------
-
-Empty configuration variables
-.............................
-
-With gitolite, the syntax ``config multimailhook.commitList = ""``
-unsets the variable instead of setting it to an empty string (see
-`here
-<http://gitolite.com/gitolite/git-config.html#an-important-warning-about-deleting-a-config-line>`__).
-As a result, there is no way to set a variable to the empty string.
-In all most places where an empty value is required, git-multimail
-now allows to specify special ``"none"`` value (case-sensitive) to
-mean the same.
-
-Alternatively, one can use ``" "`` (a single space) instead of ``""``.
-In most cases (in particular ``multimailhook.*List`` variables), this
-will be equivalent to an empty string.
-
-If you have a use-case where ``"none"`` is not an acceptable value and
-you need ``" "`` or  ``""`` instead, please report it as a bug to
-git-multimail.
-
-Allowing Regular Expressions in Configuration
-.............................................
-
-gitolite has a mechanism to prevent unsafe configuration variable
-values, which prevent characters like ``|`` commonly used in regular
-expressions. If you do not need the safety feature of gitolite and
-need to use regular expressions in your configuration (e.g. for
-``multimailhook.refFilter*`` variables), set
-`UNSAFE_PATT
-<http://gitolite.com/gitolite/git-config.html#unsafe-patt>`__ to a
-less restrictive value.
-
-Troubleshooting
----------------
-
-Warning: this will disable ``git-multimail`` during the debug, and
-could confuse your users. Don't run on a production server.
-
-To debug configuration issues with ``git-multimail``, you can add the
-``--stdout`` option when calling ``git_multimail.py`` like this::
-
-  #!/bin/sh
-  exec /path/to/git-multimail/git-multimail/git_multimail.py --stdout "$@"
-
-and try pushing from a test repository. You should see the source of
-the email that would have been sent in the output of ``git push``.
diff --git a/contrib/hooks/multimail/doc/troubleshooting.rst b/contrib/hooks/multimail/doc/troubleshooting.rst
deleted file mode 100644
index 651b509ee66c..000000000000
--- a/contrib/hooks/multimail/doc/troubleshooting.rst
+++ /dev/null
@@ -1,78 +0,0 @@
-Troubleshooting issues with git-multimail: a FAQ
-================================================
-
-How to check that git-multimail is properly set up?
----------------------------------------------------
-
-Since version 1.4.0, git-multimail allows a simple self-checking of
-its configuration: run it with the environment variable
-``GIT_MULTIMAIL_CHECK_SETUP`` set to a non-empty string. You should
-get something like this::
-
-  $ GIT_MULTIMAIL_CHECK_SETUP=true /home/moy/dev/git-multimail/git-multimail/git_multimail.py
-  Environment values:
-      administrator : 'the administrator of this repository'
-      charset : 'utf-8'
-      emailprefix : '[git-multimail] '
-      fqdn : 'anie'
-      projectdesc : 'UNNAMED PROJECT'
-      pusher : 'moy'
-      repo_path : '/home/moy/dev/git-multimail'
-      repo_shortname : 'git-multimail'
-
-  Now, checking that git-multimail's standard input is properly set ...
-  Please type some text and then press Return
-  foo
-  You have just entered:
-  foo
-  git-multimail seems properly set up.
-
-If you forgot to set an important variable, you may get instead::
-
-  $ GIT_MULTIMAIL_CHECK_SETUP=true /home/moy/dev/git-multimail/git-multimail/git_multimail.py
-  No email recipients configured!
-
-Do not set ``$GIT_MULTIMAIL_CHECK_SETUP`` other than for testing your
-configuration: it would disable the hook completely.
-
-Git is not using the right address in the From/To/Reply-To field
-----------------------------------------------------------------
-
-First, make sure that git-multimail actually uses what you think it is
-using. A lot happens to your email (especially when posting to a
-mailing-list) between the time `git_multimail.py` sends it and the
-time it reaches your inbox.
-
-A simple test (to do on a test repository, do not use in production as
-it would disable email sending): change your post-receive hook to call
-`git_multimail.py` with the `--stdout` option, and try to push to the
-repository. You should see something like::
-
-  Counting objects: 3, done.
-  Writing objects: 100% (3/3), 263 bytes | 0 bytes/s, done.
-  Total 3 (delta 0), reused 0 (delta 0)
-  remote: Sending notification emails to: foo.bar@example.com
-  remote: ===========================================================================
-  remote: Date: Mon, 25 Apr 2016 18:39:59 +0200
-  remote: To: foo.bar@example.com
-  remote: Subject: [git] branch master updated: foo
-  remote: MIME-Version: 1.0
-  remote: Content-Type: text/plain; charset=utf-8
-  remote: Content-Transfer-Encoding: 8bit
-  remote: Message-ID: <20160425163959.2311.20498@anie>
-  remote: From: Auth Or <Foo.Bar@example.com>
-  remote: Reply-To: Auth Or <Foo.Bar@example.com>
-  remote: X-Git-Host: example
-  ...
-  remote: --
-  remote: To stop receiving notification emails like this one, please contact
-  remote: the administrator of this repository.
-  remote: ===========================================================================
-  To /path/to/repo
-     6278f04..e173f20  master -> master
-
-Note: this does not include the sender (Return-Path: header), as it is
-not part of the message content but passed to the mailer. Some mailer
-show the ``Sender:`` field instead of the ``From:`` field (for
-example, Zimbra Webmail shows ``From: <sender-field> on behalf of
-<from-field>``).
diff --git a/contrib/hooks/multimail/git_multimail.py b/contrib/hooks/multimail/git_multimail.py
deleted file mode 100755
index f563be82fc7e..000000000000
--- a/contrib/hooks/multimail/git_multimail.py
+++ /dev/null
@@ -1,4346 +0,0 @@
-#! /usr/bin/env python
-
-__version__ = '1.5.0'
-
-# Copyright (c) 2015-2016 Matthieu Moy and others
-# Copyright (c) 2012-2014 Michael Haggerty and others
-# Derived from contrib/hooks/post-receive-email, which is
-# Copyright (c) 2007 Andy Parkins
-# and also includes contributions by other authors.
-#
-# This file is part of git-multimail.
-#
-# git-multimail is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License version
-# 2 as published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-
-"""Generate notification emails for pushes to a git repository.
-
-This hook sends emails describing changes introduced by pushes to a
-git repository.  For each reference that was changed, it emits one
-ReferenceChange email summarizing how the reference was changed,
-followed by one Revision email for each new commit that was introduced
-by the reference change.
-
-Each commit is announced in exactly one Revision email.  If the same
-commit is merged into another branch in the same or a later push, then
-the ReferenceChange email will list the commit's SHA1 and its one-line
-summary, but no new Revision email will be generated.
-
-This script is designed to be used as a "post-receive" hook in a git
-repository (see githooks(5)).  It can also be used as an "update"
-script, but this usage is not completely reliable and is deprecated.
-
-To help with debugging, this script accepts a --stdout option, which
-causes the emails to be written to standard output rather than sent
-using sendmail.
-
-See the accompanying README file for the complete documentation.
-
-"""
-
-import sys
-import os
-import re
-import bisect
-import socket
-import subprocess
-import shlex
-import optparse
-import logging
-import smtplib
-try:
-    import ssl
-except ImportError:
-    # Python < 2.6 do not have ssl, but that's OK if we don't use it.
-    pass
-import time
-
-import uuid
-import base64
-
-PYTHON3 = sys.version_info >= (3, 0)
-
-if sys.version_info <= (2, 5):
-    def all(iterable):
-        for element in iterable:
-            if not element:
-                return False
-        return True
-
-
-def is_ascii(s):
-    return all(ord(c) < 128 and ord(c) > 0 for c in s)
-
-
-if PYTHON3:
-    def is_string(s):
-        return isinstance(s, str)
-
-    def str_to_bytes(s):
-        return s.encode(ENCODING)
-
-    def bytes_to_str(s, errors='strict'):
-        return s.decode(ENCODING, errors)
-
-    unicode = str
-
-    def write_str(f, msg):
-        # Try outputting with the default encoding. If it fails,
-        # try UTF-8.
-        try:
-            f.buffer.write(msg.encode(sys.getdefaultencoding()))
-        except UnicodeEncodeError:
-            f.buffer.write(msg.encode(ENCODING))
-
-    def read_line(f):
-        # Try reading with the default encoding. If it fails,
-        # try UTF-8.
-        out = f.buffer.readline()
-        try:
-            return out.decode(sys.getdefaultencoding())
-        except UnicodeEncodeError:
-            return out.decode(ENCODING)
-
-    import html
-
-    def html_escape(s):
-        return html.escape(s)
-
-else:
-    def is_string(s):
-        try:
-            return isinstance(s, basestring)
-        except NameError:  # Silence Pyflakes warning
-            raise
-
-    def str_to_bytes(s):
-        return s
-
-    def bytes_to_str(s, errors='strict'):
-        return s
-
-    def write_str(f, msg):
-        f.write(msg)
-
-    def read_line(f):
-        return f.readline()
-
-    def next(it):
-        return it.next()
-
-    import cgi
-
-    def html_escape(s):
-        return cgi.escape(s, True)
-
-try:
-    from email.charset import Charset
-    from email.utils import make_msgid
-    from email.utils import getaddresses
-    from email.utils import formataddr
-    from email.utils import formatdate
-    from email.header import Header
-except ImportError:
-    # Prior to Python 2.5, the email module used different names:
-    from email.Charset import Charset
-    from email.Utils import make_msgid
-    from email.Utils import getaddresses
-    from email.Utils import formataddr
-    from email.Utils import formatdate
-    from email.Header import Header
-
-
-DEBUG = False
-
-ZEROS = '0' * 40
-LOGBEGIN = '- Log -----------------------------------------------------------------\n'
-LOGEND = '-----------------------------------------------------------------------\n'
-
-ADDR_HEADERS = set(['from', 'to', 'cc', 'bcc', 'reply-to', 'sender'])
-
-# It is assumed in many places that the encoding is uniformly UTF-8,
-# so changing these constants is unsupported.  But define them here
-# anyway, to make it easier to find (at least most of) the places
-# where the encoding is important.
-(ENCODING, CHARSET) = ('UTF-8', 'utf-8')
-
-
-REF_CREATED_SUBJECT_TEMPLATE = (
-    '%(emailprefix)s%(refname_type)s %(short_refname)s created'
-    ' (now %(newrev_short)s)'
-    )
-REF_UPDATED_SUBJECT_TEMPLATE = (
-    '%(emailprefix)s%(refname_type)s %(short_refname)s updated'
-    ' (%(oldrev_short)s -> %(newrev_short)s)'
-    )
-REF_DELETED_SUBJECT_TEMPLATE = (
-    '%(emailprefix)s%(refname_type)s %(short_refname)s deleted'
-    ' (was %(oldrev_short)s)'
-    )
-
-COMBINED_REFCHANGE_REVISION_SUBJECT_TEMPLATE = (
-    '%(emailprefix)s%(refname_type)s %(short_refname)s updated: %(oneline)s'
-    )
-
-REFCHANGE_HEADER_TEMPLATE = """\
-Date: %(send_date)s
-To: %(recipients)s
-Subject: %(subject)s
-MIME-Version: 1.0
-Content-Type: text/%(contenttype)s; charset=%(charset)s
-Content-Transfer-Encoding: 8bit
-Message-ID: %(msgid)s
-From: %(fromaddr)s
-Reply-To: %(reply_to)s
-Thread-Index: %(thread_index)s
-X-Git-Host: %(fqdn)s
-X-Git-Repo: %(repo_shortname)s
-X-Git-Refname: %(refname)s
-X-Git-Reftype: %(refname_type)s
-X-Git-Oldrev: %(oldrev)s
-X-Git-Newrev: %(newrev)s
-X-Git-NotificationType: ref_changed
-X-Git-Multimail-Version: %(multimail_version)s
-Auto-Submitted: auto-generated
-"""
-
-REFCHANGE_INTRO_TEMPLATE = """\
-This is an automated email from the git hooks/post-receive script.
-
-%(pusher)s pushed a change to %(refname_type)s %(short_refname)s
-in repository %(repo_shortname)s.
-
-"""
-
-
-FOOTER_TEMPLATE = """\
-
--- \n\
-To stop receiving notification emails like this one, please contact
-%(administrator)s.
-"""
-
-
-REWIND_ONLY_TEMPLATE = """\
-This update removed existing revisions from the reference, leaving the
-reference pointing at a previous point in the repository history.
-
- * -- * -- N   %(refname)s (%(newrev_short)s)
-            \\
-             O -- O -- O   (%(oldrev_short)s)
-
-Any revisions marked "omit" are not gone; other references still
-refer to them.  Any revisions marked "discard" are gone forever.
-"""
-
-
-NON_FF_TEMPLATE = """\
-This update added new revisions after undoing existing revisions.
-That is to say, some revisions that were in the old version of the
-%(refname_type)s are not in the new version.  This situation occurs
-when a user --force pushes a change and generates a repository
-containing something like this:
-
- * -- * -- B -- O -- O -- O   (%(oldrev_short)s)
-            \\
-             N -- N -- N   %(refname)s (%(newrev_short)s)
-
-You should already have received notification emails for all of the O
-revisions, and so the following emails describe only the N revisions
-from the common base, B.
-
-Any revisions marked "omit" are not gone; other references still
-refer to them.  Any revisions marked "discard" are gone forever.
-"""
-
-
-NO_NEW_REVISIONS_TEMPLATE = """\
-No new revisions were added by this update.
-"""
-
-
-DISCARDED_REVISIONS_TEMPLATE = """\
-This change permanently discards the following revisions:
-"""
-
-
-NO_DISCARDED_REVISIONS_TEMPLATE = """\
-The revisions that were on this %(refname_type)s are still contained in
-other references; therefore, this change does not discard any commits
-from the repository.
-"""
-
-
-NEW_REVISIONS_TEMPLATE = """\
-The %(tot)s revisions listed above as "new" are entirely new to this
-repository and will be described in separate emails.  The revisions
-listed as "add" were already present in the repository and have only
-been added to this reference.
-
-"""
-
-
-TAG_CREATED_TEMPLATE = """\
-      at %(newrev_short)-8s (%(newrev_type)s)
-"""
-
-
-TAG_UPDATED_TEMPLATE = """\
-*** WARNING: tag %(short_refname)s was modified! ***
-
-    from %(oldrev_short)-8s (%(oldrev_type)s)
-      to %(newrev_short)-8s (%(newrev_type)s)
-"""
-
-
-TAG_DELETED_TEMPLATE = """\
-*** WARNING: tag %(short_refname)s was deleted! ***
-
-"""
-
-
-# The template used in summary tables.  It looks best if this uses the
-# same alignment as TAG_CREATED_TEMPLATE and TAG_UPDATED_TEMPLATE.
-BRIEF_SUMMARY_TEMPLATE = """\
-%(action)8s %(rev_short)-8s %(text)s
-"""
-
-
-NON_COMMIT_UPDATE_TEMPLATE = """\
-This is an unusual reference change because the reference did not
-refer to a commit either before or after the change.  We do not know
-how to provide full information about this reference change.
-"""
-
-
-REVISION_HEADER_TEMPLATE = """\
-Date: %(send_date)s
-To: %(recipients)s
-Cc: %(cc_recipients)s
-Subject: %(emailprefix)s%(num)02d/%(tot)02d: %(oneline)s
-MIME-Version: 1.0
-Content-Type: text/%(contenttype)s; charset=%(charset)s
-Content-Transfer-Encoding: 8bit
-From: %(fromaddr)s
-Reply-To: %(reply_to)s
-In-Reply-To: %(reply_to_msgid)s
-References: %(reply_to_msgid)s
-Thread-Index: %(thread_index)s
-X-Git-Host: %(fqdn)s
-X-Git-Repo: %(repo_shortname)s
-X-Git-Refname: %(refname)s
-X-Git-Reftype: %(refname_type)s
-X-Git-Rev: %(rev)s
-X-Git-NotificationType: diff
-X-Git-Multimail-Version: %(multimail_version)s
-Auto-Submitted: auto-generated
-"""
-
-REVISION_INTRO_TEMPLATE = """\
-This is an automated email from the git hooks/post-receive script.
-
-%(pusher)s pushed a commit to %(refname_type)s %(short_refname)s
-in repository %(repo_shortname)s.
-
-"""
-
-LINK_TEXT_TEMPLATE = """\
-View the commit online:
-%(browse_url)s
-
-"""
-
-LINK_HTML_TEMPLATE = """\
-<p><a href="%(browse_url)s">View the commit online</a>.</p>
-"""
-
-
-REVISION_FOOTER_TEMPLATE = FOOTER_TEMPLATE
-
-
-# Combined, meaning refchange+revision email (for single-commit additions)
-COMBINED_HEADER_TEMPLATE = """\
-Date: %(send_date)s
-To: %(recipients)s
-Subject: %(subject)s
-MIME-Version: 1.0
-Content-Type: text/%(contenttype)s; charset=%(charset)s
-Content-Transfer-Encoding: 8bit
-Message-ID: %(msgid)s
-From: %(fromaddr)s
-Reply-To: %(reply_to)s
-X-Git-Host: %(fqdn)s
-X-Git-Repo: %(repo_shortname)s
-X-Git-Refname: %(refname)s
-X-Git-Reftype: %(refname_type)s
-X-Git-Oldrev: %(oldrev)s
-X-Git-Newrev: %(newrev)s
-X-Git-Rev: %(rev)s
-X-Git-NotificationType: ref_changed_plus_diff
-X-Git-Multimail-Version: %(multimail_version)s
-Auto-Submitted: auto-generated
-"""
-
-COMBINED_INTRO_TEMPLATE = """\
-This is an automated email from the git hooks/post-receive script.
-
-%(pusher)s pushed a commit to %(refname_type)s %(short_refname)s
-in repository %(repo_shortname)s.
-
-"""
-
-COMBINED_FOOTER_TEMPLATE = FOOTER_TEMPLATE
-
-
-class CommandError(Exception):
-    def __init__(self, cmd, retcode):
-        self.cmd = cmd
-        self.retcode = retcode
-        Exception.__init__(
-            self,
-            'Command "%s" failed with retcode %s' % (' '.join(cmd), retcode,)
-            )
-
-
-class ConfigurationException(Exception):
-    pass
-
-
-# The "git" program (this could be changed to include a full path):
-GIT_EXECUTABLE = 'git'
-
-
-# How "git" should be invoked (including global arguments), as a list
-# of words.  This variable is usually initialized automatically by
-# read_git_output() via choose_git_command(), but if a value is set
-# here then it will be used unconditionally.
-GIT_CMD = None
-
-
-def choose_git_command():
-    """Decide how to invoke git, and record the choice in GIT_CMD."""
-
-    global GIT_CMD
-
-    if GIT_CMD is None:
-        try:
-            # Check to see whether the "-c" option is accepted (it was
-            # only added in Git 1.7.2).  We don't actually use the
-            # output of "git --version", though if we needed more
-            # specific version information this would be the place to
-            # do it.
-            cmd = [GIT_EXECUTABLE, '-c', 'foo.bar=baz', '--version']
-            read_output(cmd)
-            GIT_CMD = [GIT_EXECUTABLE, '-c', 'i18n.logoutputencoding=%s' % (ENCODING,)]
-        except CommandError:
-            GIT_CMD = [GIT_EXECUTABLE]
-
-
-def read_git_output(args, input=None, keepends=False, **kw):
-    """Read the output of a Git command."""
-
-    if GIT_CMD is None:
-        choose_git_command()
-
-    return read_output(GIT_CMD + args, input=input, keepends=keepends, **kw)
-
-
-def read_output(cmd, input=None, keepends=False, **kw):
-    if input:
-        stdin = subprocess.PIPE
-        input = str_to_bytes(input)
-    else:
-        stdin = None
-    errors = 'strict'
-    if 'errors' in kw:
-        errors = kw['errors']
-        del kw['errors']
-    p = subprocess.Popen(
-        tuple(str_to_bytes(w) for w in cmd),
-        stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kw
-        )
-    (out, err) = p.communicate(input)
-    out = bytes_to_str(out, errors=errors)
-    retcode = p.wait()
-    if retcode:
-        raise CommandError(cmd, retcode)
-    if not keepends:
-        out = out.rstrip('\n\r')
-    return out
-
-
-def read_git_lines(args, keepends=False, **kw):
-    """Return the lines output by Git command.
-
-    Return as single lines, with newlines stripped off."""
-
-    return read_git_output(args, keepends=True, **kw).splitlines(keepends)
-
-
-def git_rev_list_ish(cmd, spec, args=None, **kw):
-    """Common functionality for invoking a 'git rev-list'-like command.
-
-    Parameters:
-      * cmd is the Git command to run, e.g., 'rev-list' or 'log'.
-      * spec is a list of revision arguments to pass to the named
-        command.  If None, this function returns an empty list.
-      * args is a list of extra arguments passed to the named command.
-      * All other keyword arguments (if any) are passed to the
-        underlying read_git_lines() function.
-
-    Return the output of the Git command in the form of a list, one
-    entry per output line.
-    """
-    if spec is None:
-        return []
-    if args is None:
-        args = []
-    args = [cmd, '--stdin'] + args
-    spec_stdin = ''.join(s + '\n' for s in spec)
-    return read_git_lines(args, input=spec_stdin, **kw)
-
-
-def git_rev_list(spec, **kw):
-    """Run 'git rev-list' with the given list of revision arguments.
-
-    See git_rev_list_ish() for parameter and return value
-    documentation.
-    """
-    return git_rev_list_ish('rev-list', spec, **kw)
-
-
-def git_log(spec, **kw):
-    """Run 'git log' with the given list of revision arguments.
-
-    See git_rev_list_ish() for parameter and return value
-    documentation.
-    """
-    return git_rev_list_ish('log', spec, **kw)
-
-
-def header_encode(text, header_name=None):
-    """Encode and line-wrap the value of an email header field."""
-
-    # Convert to unicode, if required.
-    if not isinstance(text, unicode):
-        text = unicode(text, 'utf-8')
-
-    if is_ascii(text):
-        charset = 'ascii'
-    else:
-        charset = 'utf-8'
-
-    return Header(text, header_name=header_name, charset=Charset(charset)).encode()
-
-
-def addr_header_encode(text, header_name=None):
-    """Encode and line-wrap the value of an email header field containing
-    email addresses."""
-
-    # Convert to unicode, if required.
-    if not isinstance(text, unicode):
-        text = unicode(text, 'utf-8')
-
-    text = ', '.join(
-        formataddr((header_encode(name), emailaddr))
-        for name, emailaddr in getaddresses([text])
-        )
-
-    if is_ascii(text):
-        charset = 'ascii'
-    else:
-        charset = 'utf-8'
-
-    return Header(text, header_name=header_name, charset=Charset(charset)).encode()
-
-
-class Config(object):
-    def __init__(self, section, git_config=None):
-        """Represent a section of the git configuration.
-
-        If git_config is specified, it is passed to "git config" in
-        the GIT_CONFIG environment variable, meaning that "git config"
-        will read the specified path rather than the Git default
-        config paths."""
-
-        self.section = section
-        if git_config:
-            self.env = os.environ.copy()
-            self.env['GIT_CONFIG'] = git_config
-        else:
-            self.env = None
-
-    @staticmethod
-    def _split(s):
-        """Split NUL-terminated values."""
-
-        words = s.split('\0')
-        assert words[-1] == ''
-        return words[:-1]
-
-    @staticmethod
-    def add_config_parameters(c):
-        """Add configuration parameters to Git.
-
-        c is either an str or a list of str, each element being of the
-        form 'var=val' or 'var', with the same syntax and meaning as
-        the argument of 'git -c var=val'.
-        """
-        if isinstance(c, str):
-            c = (c,)
-        parameters = os.environ.get('GIT_CONFIG_PARAMETERS', '')
-        if parameters:
-            parameters += ' '
-        # git expects GIT_CONFIG_PARAMETERS to be of the form
-        #    "'name1=value1' 'name2=value2' 'name3=value3'"
-        # including everything inside the double quotes (but not the double
-        # quotes themselves).  Spacing is critical.  Also, if a value contains
-        # a literal single quote that quote must be represented using the
-        # four character sequence: '\''
-        parameters += ' '.join("'" + x.replace("'", "'\\''") + "'" for x in c)
-        os.environ['GIT_CONFIG_PARAMETERS'] = parameters
-
-    def get(self, name, default=None):
-        try:
-            values = self._split(read_git_output(
-                ['config', '--get', '--null', '%s.%s' % (self.section, name)],
-                env=self.env, keepends=True,
-                ))
-            assert len(values) == 1
-            return values[0]
-        except CommandError:
-            return default
-
-    def get_bool(self, name, default=None):
-        try:
-            value = read_git_output(
-                ['config', '--get', '--bool', '%s.%s' % (self.section, name)],
-                env=self.env,
-                )
-        except CommandError:
-            return default
-        return value == 'true'
-
-    def get_all(self, name, default=None):
-        """Read a (possibly multivalued) setting from the configuration.
-
-        Return the result as a list of values, or default if the name
-        is unset."""
-
-        try:
-            return self._split(read_git_output(
-                ['config', '--get-all', '--null', '%s.%s' % (self.section, name)],
-                env=self.env, keepends=True,
-                ))
-        except CommandError:
-            t, e, traceback = sys.exc_info()
-            if e.retcode == 1:
-                # "the section or key is invalid"; i.e., there is no
-                # value for the specified key.
-                return default
-            else:
-                raise
-
-    def set(self, name, value):
-        read_git_output(
-            ['config', '%s.%s' % (self.section, name), value],
-            env=self.env,
-            )
-
-    def add(self, name, value):
-        read_git_output(
-            ['config', '--add', '%s.%s' % (self.section, name), value],
-            env=self.env,
-            )
-
-    def __contains__(self, name):
-        return self.get_all(name, default=None) is not None
-
-    # We don't use this method anymore internally, but keep it here in
-    # case somebody is calling it from their own code:
-    def has_key(self, name):
-        return name in self
-
-    def unset_all(self, name):
-        try:
-            read_git_output(
-                ['config', '--unset-all', '%s.%s' % (self.section, name)],
-                env=self.env,
-                )
-        except CommandError:
-            t, e, traceback = sys.exc_info()
-            if e.retcode == 5:
-                # The name doesn't exist, which is what we wanted anyway...
-                pass
-            else:
-                raise
-
-    def set_recipients(self, name, value):
-        self.unset_all(name)
-        for pair in getaddresses([value]):
-            self.add(name, formataddr(pair))
-
-
-def generate_summaries(*log_args):
-    """Generate a brief summary for each revision requested.
-
-    log_args are strings that will be passed directly to "git log" as
-    revision selectors.  Iterate over (sha1_short, subject) for each
-    commit specified by log_args (subject is the first line of the
-    commit message as a string without EOLs)."""
-
-    cmd = [
-        'log', '--abbrev', '--format=%h %s',
-        ] + list(log_args) + ['--']
-    for line in read_git_lines(cmd):
-        yield tuple(line.split(' ', 1))
-
-
-def limit_lines(lines, max_lines):
-    for (index, line) in enumerate(lines):
-        if index < max_lines:
-            yield line
-
-    if index >= max_lines:
-        yield '... %d lines suppressed ...\n' % (index + 1 - max_lines,)
-
-
-def limit_linelength(lines, max_linelength):
-    for line in lines:
-        # Don't forget that lines always include a trailing newline.
-        if len(line) > max_linelength + 1:
-            line = line[:max_linelength - 7] + ' [...]\n'
-        yield line
-
-
-class CommitSet(object):
-    """A (constant) set of object names.
-
-    The set should be initialized with full SHA1 object names.  The
-    __contains__() method returns True iff its argument is an
-    abbreviation of any the names in the set."""
-
-    def __init__(self, names):
-        self._names = sorted(names)
-
-    def __len__(self):
-        return len(self._names)
-
-    def __contains__(self, sha1_abbrev):
-        """Return True iff this set contains sha1_abbrev (which might be abbreviated)."""
-
-        i = bisect.bisect_left(self._names, sha1_abbrev)
-        return i < len(self) and self._names[i].startswith(sha1_abbrev)
-
-
-class GitObject(object):
-    def __init__(self, sha1, type=None):
-        if sha1 == ZEROS:
-            self.sha1 = self.type = self.commit_sha1 = None
-        else:
-            self.sha1 = sha1
-            self.type = type or read_git_output(['cat-file', '-t', self.sha1])
-
-            if self.type == 'commit':
-                self.commit_sha1 = self.sha1
-            elif self.type == 'tag':
-                try:
-                    self.commit_sha1 = read_git_output(
-                        ['rev-parse', '--verify', '%s^0' % (self.sha1,)]
-                        )
-                except CommandError:
-                    # Cannot deref tag to determine commit_sha1
-                    self.commit_sha1 = None
-            else:
-                self.commit_sha1 = None
-
-        self.short = read_git_output(['rev-parse', '--short', sha1])
-
-    def get_summary(self):
-        """Return (sha1_short, subject) for this commit."""
-
-        if not self.sha1:
-            raise ValueError('Empty commit has no summary')
-
-        return next(iter(generate_summaries('--no-walk', self.sha1)))
-
-    def __eq__(self, other):
-        return isinstance(other, GitObject) and self.sha1 == other.sha1
-
-    def __ne__(self, other):
-        return not self == other
-
-    def __hash__(self):
-        return hash(self.sha1)
-
-    def __nonzero__(self):
-        return bool(self.sha1)
-
-    def __bool__(self):
-        """Python 2 backward compatibility"""
-        return self.__nonzero__()
-
-    def __str__(self):
-        return self.sha1 or ZEROS
-
-
-class Change(object):
-    """A Change that has been made to the Git repository.
-
-    Abstract class from which both Revisions and ReferenceChanges are
-    derived.  A Change knows how to generate a notification email
-    describing itself."""
-
-    def __init__(self, environment):
-        self.environment = environment
-        self._values = None
-        self._contains_html_diff = False
-
-    def _contains_diff(self):
-        # We do contain a diff, should it be rendered in HTML?
-        if self.environment.commit_email_format == "html":
-            self._contains_html_diff = True
-
-    def _compute_values(self):
-        """Return a dictionary {keyword: expansion} for this Change.
-
-        Derived classes overload this method to add more entries to
-        the return value.  This method is used internally by
-        get_values().  The return value should always be a new
-        dictionary."""
-
-        values = self.environment.get_values()
-        fromaddr = self.environment.get_fromaddr(change=self)
-        if fromaddr is not None:
-            values['fromaddr'] = fromaddr
-        values['multimail_version'] = get_version()
-        return values
-
-    # Aliases usable in template strings. Tuple of pairs (destination,
-    # source).
-    VALUES_ALIAS = (
-        ("id", "newrev"),
-        )
-
-    def get_values(self, **extra_values):
-        """Return a dictionary {keyword: expansion} for this Change.
-
-        Return a dictionary mapping keywords to the values that they
-        should be expanded to for this Change (used when interpolating
-        template strings).  If any keyword arguments are supplied, add
-        those to the return value as well.  The return value is always
-        a new dictionary."""
-
-        if self._values is None:
-            self._values = self._compute_values()
-
-        values = self._values.copy()
-        if extra_values:
-            values.update(extra_values)
-
-        for alias, val in self.VALUES_ALIAS:
-            values[alias] = values[val]
-        return values
-
-    def expand(self, template, **extra_values):
-        """Expand template.
-
-        Expand the template (which should be a string) using string
-        interpolation of the values for this Change.  If any keyword
-        arguments are provided, also include those in the keywords
-        available for interpolation."""
-
-        return template % self.get_values(**extra_values)
-
-    def expand_lines(self, template, html_escape_val=False, **extra_values):
-        """Break template into lines and expand each line."""
-
-        values = self.get_values(**extra_values)
-        if html_escape_val:
-            for k in values:
-                if is_string(values[k]):
-                    values[k] = html_escape(values[k])
-        for line in template.splitlines(True):
-            yield line % values
-
-    def expand_header_lines(self, template, **extra_values):
-        """Break template into lines and expand each line as an RFC 2822 header.
-
-        Encode values and split up lines that are too long.  Silently
-        skip lines that contain references to unknown variables."""
-
-        values = self.get_values(**extra_values)
-        if self._contains_html_diff:
-            self._content_type = 'html'
-        else:
-            self._content_type = 'plain'
-        values['contenttype'] = self._content_type
-
-        for line in template.splitlines():
-            (name, value) = line.split(': ', 1)
-
-            try:
-                value = value % values
-            except KeyError:
-                t, e, traceback = sys.exc_info()
-                if DEBUG:
-                    self.environment.log_warning(
-                        'Warning: unknown variable %r in the following line; line skipped:\n'
-                        '    %s\n'
-                        % (e.args[0], line,)
-                        )
-            else:
-                if name.lower() in ADDR_HEADERS:
-                    value = addr_header_encode(value, name)
-                else:
-                    value = header_encode(value, name)
-                for splitline in ('%s: %s\n' % (name, value)).splitlines(True):
-                    yield splitline
-
-    def generate_email_header(self):
-        """Generate the RFC 2822 email headers for this Change, a line at a time.
-
-        The output should not include the trailing blank line."""
-
-        raise NotImplementedError()
-
-    def generate_browse_link(self, base_url):
-        """Generate a link to an online repository browser."""
-        return iter(())
-
-    def generate_email_intro(self, html_escape_val=False):
-        """Generate the email intro for this Change, a line at a time.
-
-        The output will be used as the standard boilerplate at the top
-        of the email body."""
-
-        raise NotImplementedError()
-
-    def generate_email_body(self, push):
-        """Generate the main part of the email body, a line at a time.
-
-        The text in the body might be truncated after a specified
-        number of lines (see multimailhook.emailmaxlines)."""
-
-        raise NotImplementedError()
-
-    def generate_email_footer(self, html_escape_val):
-        """Generate the footer of the email, a line at a time.
-
-        The footer is always included, irrespective of
-        multimailhook.emailmaxlines."""
-
-        raise NotImplementedError()
-
-    def _wrap_for_html(self, lines):
-        """Wrap the lines in HTML <pre> tag when using HTML format.
-
-        Escape special HTML characters and add <pre> and </pre> tags around
-        the given lines if we should be generating HTML as indicated by
-        self._contains_html_diff being set to true.
-        """
-        if self._contains_html_diff:
-            yield "<pre style='margin:0'>\n"
-
-            for line in lines:
-                yield html_escape(line)
-
-            yield '</pre>\n'
-        else:
-            for line in lines:
-                yield line
-
-    def generate_email(self, push, body_filter=None, extra_header_values={}):
-        """Generate an email describing this change.
-
-        Iterate over the lines (including the header lines) of an
-        email describing this change.  If body_filter is not None,
-        then use it to filter the lines that are intended for the
-        email body.
-
-        The extra_header_values field is received as a dict and not as
-        **kwargs, to allow passing other keyword arguments in the
-        future (e.g. passing extra values to generate_email_intro()"""
-
-        for line in self.generate_email_header(**extra_header_values):
-            yield line
-        yield '\n'
-        html_escape_val = (self.environment.html_in_intro and
-                           self._contains_html_diff)
-        intro = self.generate_email_intro(html_escape_val)
-        if not self.environment.html_in_intro:
-            intro = self._wrap_for_html(intro)
-        for line in intro:
-            yield line
-
-        if self.environment.commitBrowseURL:
-            for line in self.generate_browse_link(self.environment.commitBrowseURL):
-                yield line
-
-        body = self.generate_email_body(push)
-        if body_filter is not None:
-            body = body_filter(body)
-
-        diff_started = False
-        if self._contains_html_diff:
-            # "white-space: pre" is the default, but we need to
-            # specify it again in case the message is viewed in a
-            # webmail which wraps it in an element setting white-space
-            # to something else (Zimbra does this and sets
-            # white-space: pre-line).
-            yield '<pre style="white-space: pre; background: #F8F8F8">'
-        for line in body:
-            if self._contains_html_diff:
-                # This is very, very naive. It would be much better to really
-                # parse the diff, i.e. look at how many lines do we have in
-                # the hunk headers instead of blindly highlighting everything
-                # that looks like it might be part of a diff.
-                bgcolor = ''
-                fgcolor = ''
-                if line.startswith('--- a/'):
-                    diff_started = True
-                    bgcolor = 'e0e0ff'
-                elif line.startswith('diff ') or line.startswith('index '):
-                    diff_started = True
-                    fgcolor = '808080'
-                elif diff_started:
-                    if line.startswith('+++ '):
-                        bgcolor = 'e0e0ff'
-                    elif line.startswith('@@'):
-                        bgcolor = 'e0e0e0'
-                    elif line.startswith('+'):
-                        bgcolor = 'e0ffe0'
-                    elif line.startswith('-'):
-                        bgcolor = 'ffe0e0'
-                elif line.startswith('commit '):
-                    fgcolor = '808000'
-                elif line.startswith('    '):
-                    fgcolor = '404040'
-
-                # Chop the trailing LF, we don't want it inside <pre>.
-                line = html_escape(line[:-1])
-
-                if bgcolor or fgcolor:
-                    style = 'display:block; white-space:pre;'
-                    if bgcolor:
-                        style += 'background:#' + bgcolor + ';'
-                    if fgcolor:
-                        style += 'color:#' + fgcolor + ';'
-                    # Use a <span style='display:block> to color the
-                    # whole line. The newline must be inside the span
-                    # to display properly both in Firefox and in
-                    # text-based browser.
-                    line = "<span style='%s'>%s\n</span>" % (style, line)
-                else:
-                    line = line + '\n'
-
-            yield line
-        if self._contains_html_diff:
-            yield '</pre>'
-        html_escape_val = (self.environment.html_in_footer and
-                           self._contains_html_diff)
-        footer = self.generate_email_footer(html_escape_val)
-        if not self.environment.html_in_footer:
-            footer = self._wrap_for_html(footer)
-        for line in footer:
-            yield line
-
-    def get_specific_fromaddr(self):
-        """For kinds of Changes which specify it, return the kind-specific
-        From address to use."""
-        return None
-
-
-class Revision(Change):
-    """A Change consisting of a single git commit."""
-
-    CC_RE = re.compile(r'^\s*C[Cc]:\s*(?P<to>[^#]+@[^\s#]*)\s*(#.*)?$')
-
-    def __init__(self, reference_change, rev, num, tot):
-        Change.__init__(self, reference_change.environment)
-        self.reference_change = reference_change
-        self.rev = rev
-        self.change_type = self.reference_change.change_type
-        self.refname = self.reference_change.refname
-        self.num = num
-        self.tot = tot
-        self.author = read_git_output(['log', '--no-walk', '--format=%aN <%aE>', self.rev.sha1])
-        self.recipients = self.environment.get_revision_recipients(self)
-
-        # -s is short for --no-patch, but -s works on older git's (e.g. 1.7)
-        self.parents = read_git_lines(['show', '-s', '--format=%P',
-                                      self.rev.sha1])[0].split()
-
-        self.cc_recipients = ''
-        if self.environment.get_scancommitforcc():
-            self.cc_recipients = ', '.join(to.strip() for to in self._cc_recipients())
-            if self.cc_recipients:
-                self.environment.log_msg(
-                    'Add %s to CC for %s' % (self.cc_recipients, self.rev.sha1))
-
-    def _cc_recipients(self):
-        cc_recipients = []
-        message = read_git_output(['log', '--no-walk', '--format=%b', self.rev.sha1])
-        lines = message.strip().split('\n')
-        for line in lines:
-            m = re.match(self.CC_RE, line)
-            if m:
-                cc_recipients.append(m.group('to'))
-
-        return cc_recipients
-
-    def _compute_values(self):
-        values = Change._compute_values(self)
-
-        oneline = read_git_output(
-            ['log', '--format=%s', '--no-walk', self.rev.sha1]
-            )
-
-        max_subject_length = self.environment.get_max_subject_length()
-        if max_subject_length > 0 and len(oneline) > max_subject_length:
-            oneline = oneline[:max_subject_length - 6] + ' [...]'
-
-        values['rev'] = self.rev.sha1
-        values['parents'] = ' '.join(self.parents)
-        values['rev_short'] = self.rev.short
-        values['change_type'] = self.change_type
-        values['refname'] = self.refname
-        values['newrev'] = self.rev.sha1
-        values['short_refname'] = self.reference_change.short_refname
-        values['refname_type'] = self.reference_change.refname_type
-        values['reply_to_msgid'] = self.reference_change.msgid
-        values['thread_index'] = self.reference_change.thread_index
-        values['num'] = self.num
-        values['tot'] = self.tot
-        values['recipients'] = self.recipients
-        if self.cc_recipients:
-            values['cc_recipients'] = self.cc_recipients
-        values['oneline'] = oneline
-        values['author'] = self.author
-
-        reply_to = self.environment.get_reply_to_commit(self)
-        if reply_to:
-            values['reply_to'] = reply_to
-
-        return values
-
-    def generate_email_header(self, **extra_values):
-        for line in self.expand_header_lines(
-                REVISION_HEADER_TEMPLATE, **extra_values
-                ):
-            yield line
-
-    def generate_browse_link(self, base_url):
-        if '%(' not in base_url:
-            base_url += '%(id)s'
-        url = "".join(self.expand_lines(base_url))
-        if self._content_type == 'html':
-            for line in self.expand_lines(LINK_HTML_TEMPLATE,
-                                          html_escape_val=True,
-                                          browse_url=url):
-                yield line
-        elif self._content_type == 'plain':
-            for line in self.expand_lines(LINK_TEXT_TEMPLATE,
-                                          html_escape_val=False,
-                                          browse_url=url):
-                yield line
-        else:
-            raise NotImplementedError("Content-type %s unsupported. Please report it as a bug.")
-
-    def generate_email_intro(self, html_escape_val=False):
-        for line in self.expand_lines(REVISION_INTRO_TEMPLATE,
-                                      html_escape_val=html_escape_val):
-            yield line
-
-    def generate_email_body(self, push):
-        """Show this revision."""
-
-        for line in read_git_lines(
-                ['log'] + self.environment.commitlogopts + ['-1', self.rev.sha1],
-                keepends=True,
-                errors='replace'):
-            if line.startswith('Date:   ') and self.environment.date_substitute:
-                yield self.environment.date_substitute + line[len('Date:   '):]
-            else:
-                yield line
-
-    def generate_email_footer(self, html_escape_val):
-        return self.expand_lines(REVISION_FOOTER_TEMPLATE,
-                                 html_escape_val=html_escape_val)
-
-    def generate_email(self, push, body_filter=None, extra_header_values={}):
-        self._contains_diff()
-        return Change.generate_email(self, push, body_filter, extra_header_values)
-
-    def get_specific_fromaddr(self):
-        return self.environment.from_commit
-
-
-class ReferenceChange(Change):
-    """A Change to a Git reference.
-
-    An abstract class representing a create, update, or delete of a
-    Git reference.  Derived classes handle specific types of reference
-    (e.g., tags vs. branches).  These classes generate the main
-    reference change email summarizing the reference change and
-    whether it caused any any commits to be added or removed.
-
-    ReferenceChange objects are usually created using the static
-    create() method, which has the logic to decide which derived class
-    to instantiate."""
-
-    REF_RE = re.compile(r'^refs\/(?P<area>[^\/]+)\/(?P<shortname>.*)$')
-
-    @staticmethod
-    def create(environment, oldrev, newrev, refname):
-        """Return a ReferenceChange object representing the change.
-
-        Return an object that represents the type of change that is being
-        made. oldrev and newrev should be SHA1s or ZEROS."""
-
-        old = GitObject(oldrev)
-        new = GitObject(newrev)
-        rev = new or old
-
-        # The revision type tells us what type the commit is, combined with
-        # the location of the ref we can decide between
-        #  - working branch
-        #  - tracking branch
-        #  - unannotated tag
-        #  - annotated tag
-        m = ReferenceChange.REF_RE.match(refname)
-        if m:
-            area = m.group('area')
-            short_refname = m.group('shortname')
-        else:
-            area = ''
-            short_refname = refname
-
-        if rev.type == 'tag':
-            # Annotated tag:
-            klass = AnnotatedTagChange
-        elif rev.type == 'commit':
-            if area == 'tags':
-                # Non-annotated tag:
-                klass = NonAnnotatedTagChange
-            elif area == 'heads':
-                # Branch:
-                klass = BranchChange
-            elif area == 'remotes':
-                # Tracking branch:
-                environment.log_warning(
-                    '*** Push-update of tracking branch %r\n'
-                    '***  - incomplete email generated.'
-                    % (refname,)
-                    )
-                klass = OtherReferenceChange
-            else:
-                # Some other reference namespace:
-                environment.log_warning(
-                    '*** Push-update of strange reference %r\n'
-                    '***  - incomplete email generated.'
-                    % (refname,)
-                    )
-                klass = OtherReferenceChange
-        else:
-            # Anything else (is there anything else?)
-            environment.log_warning(
-                '*** Unknown type of update to %r (%s)\n'
-                '***  - incomplete email generated.'
-                % (refname, rev.type,)
-                )
-            klass = OtherReferenceChange
-
-        return klass(
-            environment,
-            refname=refname, short_refname=short_refname,
-            old=old, new=new, rev=rev,
-            )
-
-    @staticmethod
-    def make_thread_index():
-        """Return a string appropriate for the Thread-Index header,
-        needed by MS Outlook to get threading right.
-
-        The format is (base64-encoded):
-        - 1 byte must be 1
-        - 5 bytes encode a date (hardcoded here)
-        - 16 bytes for a globally unique identifier
-
-        FIXME: Unfortunately, even with the Thread-Index field, MS
-        Outlook doesn't seem to do the threading reliably (see
-        https://github.com/git-multimail/git-multimail/pull/194).
-        """
-        thread_index = b'\x01\x00\x00\x12\x34\x56' + uuid.uuid4().bytes
-        return base64.standard_b64encode(thread_index).decode('ascii')
-
-    def __init__(self, environment, refname, short_refname, old, new, rev):
-        Change.__init__(self, environment)
-        self.change_type = {
-            (False, True): 'create',
-            (True, True): 'update',
-            (True, False): 'delete',
-            }[bool(old), bool(new)]
-        self.refname = refname
-        self.short_refname = short_refname
-        self.old = old
-        self.new = new
-        self.rev = rev
-        self.msgid = make_msgid()
-        self.thread_index = self.make_thread_index()
-        self.diffopts = environment.diffopts
-        self.graphopts = environment.graphopts
-        self.logopts = environment.logopts
-        self.commitlogopts = environment.commitlogopts
-        self.showgraph = environment.refchange_showgraph
-        self.showlog = environment.refchange_showlog
-
-        self.header_template = REFCHANGE_HEADER_TEMPLATE
-        self.intro_template = REFCHANGE_INTRO_TEMPLATE
-        self.footer_template = FOOTER_TEMPLATE
-
-    def _compute_values(self):
-        values = Change._compute_values(self)
-
-        values['change_type'] = self.change_type
-        values['refname_type'] = self.refname_type
-        values['refname'] = self.refname
-        values['short_refname'] = self.short_refname
-        values['msgid'] = self.msgid
-        values['thread_index'] = self.thread_index
-        values['recipients'] = self.recipients
-        values['oldrev'] = str(self.old)
-        values['oldrev_short'] = self.old.short
-        values['newrev'] = str(self.new)
-        values['newrev_short'] = self.new.short
-
-        if self.old:
-            values['oldrev_type'] = self.old.type
-        if self.new:
-            values['newrev_type'] = self.new.type
-
-        reply_to = self.environment.get_reply_to_refchange(self)
-        if reply_to:
-            values['reply_to'] = reply_to
-
-        return values
-
-    def send_single_combined_email(self, known_added_sha1s):
-        """Determine if a combined refchange/revision email should be sent
-
-        If there is only a single new (non-merge) commit added by a
-        change, it is useful to combine the ReferenceChange and
-        Revision emails into one.  In such a case, return the single
-        revision; otherwise, return None.
-
-        This method is overridden in BranchChange."""
-
-        return None
-
-    def generate_combined_email(self, push, revision, body_filter=None, extra_header_values={}):
-        """Generate an email describing this change AND specified revision.
-
-        Iterate over the lines (including the header lines) of an
-        email describing this change.  If body_filter is not None,
-        then use it to filter the lines that are intended for the
-        email body.
-
-        The extra_header_values field is received as a dict and not as
-        **kwargs, to allow passing other keyword arguments in the
-        future (e.g. passing extra values to generate_email_intro()
-
-        This method is overridden in BranchChange."""
-
-        raise NotImplementedError
-
-    def get_subject(self):
-        template = {
-            'create': REF_CREATED_SUBJECT_TEMPLATE,
-            'update': REF_UPDATED_SUBJECT_TEMPLATE,
-            'delete': REF_DELETED_SUBJECT_TEMPLATE,
-            }[self.change_type]
-        return self.expand(template)
-
-    def generate_email_header(self, **extra_values):
-        if 'subject' not in extra_values:
-            extra_values['subject'] = self.get_subject()
-
-        for line in self.expand_header_lines(
-                self.header_template, **extra_values
-                ):
-            yield line
-
-    def generate_email_intro(self, html_escape_val=False):
-        for line in self.expand_lines(self.intro_template,
-                                      html_escape_val=html_escape_val):
-            yield line
-
-    def generate_email_body(self, push):
-        """Call the appropriate body-generation routine.
-
-        Call one of generate_create_summary() /
-        generate_update_summary() / generate_delete_summary()."""
-
-        change_summary = {
-            'create': self.generate_create_summary,
-            'delete': self.generate_delete_summary,
-            'update': self.generate_update_summary,
-            }[self.change_type](push)
-        for line in change_summary:
-            yield line
-
-        for line in self.generate_revision_change_summary(push):
-            yield line
-
-    def generate_email_footer(self, html_escape_val):
-        return self.expand_lines(self.footer_template,
-                                 html_escape_val=html_escape_val)
-
-    def generate_revision_change_graph(self, push):
-        if self.showgraph:
-            args = ['--graph'] + self.graphopts
-            for newold in ('new', 'old'):
-                has_newold = False
-                spec = push.get_commits_spec(newold, self)
-                for line in git_log(spec, args=args, keepends=True):
-                    if not has_newold:
-                        has_newold = True
-                        yield '\n'
-                        yield 'Graph of %s commits:\n\n' % (
-                            {'new': 'new', 'old': 'discarded'}[newold],)
-                    yield '  ' + line
-                if has_newold:
-                    yield '\n'
-
-    def generate_revision_change_log(self, new_commits_list):
-        if self.showlog:
-            yield '\n'
-            yield 'Detailed log of new commits:\n\n'
-            for line in read_git_lines(
-                    ['log', '--no-walk'] +
-                    self.logopts +
-                    new_commits_list +
-                    ['--'],
-                    keepends=True,
-                    ):
-                yield line
-
-    def generate_new_revision_summary(self, tot, new_commits_list, push):
-        for line in self.expand_lines(NEW_REVISIONS_TEMPLATE, tot=tot):
-            yield line
-        for line in self.generate_revision_change_graph(push):
-            yield line
-        for line in self.generate_revision_change_log(new_commits_list):
-            yield line
-
-    def generate_revision_change_summary(self, push):
-        """Generate a summary of the revisions added/removed by this change."""
-
-        if self.new.commit_sha1 and not self.old.commit_sha1:
-            # A new reference was created.  List the new revisions
-            # brought by the new reference (i.e., those revisions that
-            # were not in the repository before this reference
-            # change).
-            sha1s = list(push.get_new_commits(self))
-            sha1s.reverse()
-            tot = len(sha1s)
-            new_revisions = [
-                Revision(self, GitObject(sha1), num=i + 1, tot=tot)
-                for (i, sha1) in enumerate(sha1s)
-                ]
-
-            if new_revisions:
-                yield self.expand('This %(refname_type)s includes the following new commits:\n')
-                yield '\n'
-                for r in new_revisions:
-                    (sha1, subject) = r.rev.get_summary()
-                    yield r.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action='new', text=subject,
-                        )
-                yield '\n'
-                for line in self.generate_new_revision_summary(
-                        tot, [r.rev.sha1 for r in new_revisions], push):
-                    yield line
-            else:
-                for line in self.expand_lines(NO_NEW_REVISIONS_TEMPLATE):
-                    yield line
-
-        elif self.new.commit_sha1 and self.old.commit_sha1:
-            # A reference was changed to point at a different commit.
-            # List the revisions that were removed and/or added *from
-            # that reference* by this reference change, along with a
-            # diff between the trees for its old and new values.
-
-            # List of the revisions that were added to the branch by
-            # this update.  Note this list can include revisions that
-            # have already had notification emails; we want such
-            # revisions in the summary even though we will not send
-            # new notification emails for them.
-            adds = list(generate_summaries(
-                '--topo-order', '--reverse', '%s..%s'
-                % (self.old.commit_sha1, self.new.commit_sha1,)
-                ))
-
-            # List of the revisions that were removed from the branch
-            # by this update.  This will be empty except for
-            # non-fast-forward updates.
-            discards = list(generate_summaries(
-                '%s..%s' % (self.new.commit_sha1, self.old.commit_sha1,)
-                ))
-
-            if adds:
-                new_commits_list = push.get_new_commits(self)
-            else:
-                new_commits_list = []
-            new_commits = CommitSet(new_commits_list)
-
-            if discards:
-                discarded_commits = CommitSet(push.get_discarded_commits(self))
-            else:
-                discarded_commits = CommitSet([])
-
-            if discards and adds:
-                for (sha1, subject) in discards:
-                    if sha1 in discarded_commits:
-                        action = 'discard'
-                    else:
-                        action = 'omit'
-                    yield self.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action=action,
-                        rev_short=sha1, text=subject,
-                        )
-                for (sha1, subject) in adds:
-                    if sha1 in new_commits:
-                        action = 'new'
-                    else:
-                        action = 'add'
-                    yield self.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action=action,
-                        rev_short=sha1, text=subject,
-                        )
-                yield '\n'
-                for line in self.expand_lines(NON_FF_TEMPLATE):
-                    yield line
-
-            elif discards:
-                for (sha1, subject) in discards:
-                    if sha1 in discarded_commits:
-                        action = 'discard'
-                    else:
-                        action = 'omit'
-                    yield self.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action=action,
-                        rev_short=sha1, text=subject,
-                        )
-                yield '\n'
-                for line in self.expand_lines(REWIND_ONLY_TEMPLATE):
-                    yield line
-
-            elif adds:
-                (sha1, subject) = self.old.get_summary()
-                yield self.expand(
-                    BRIEF_SUMMARY_TEMPLATE, action='from',
-                    rev_short=sha1, text=subject,
-                    )
-                for (sha1, subject) in adds:
-                    if sha1 in new_commits:
-                        action = 'new'
-                    else:
-                        action = 'add'
-                    yield self.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action=action,
-                        rev_short=sha1, text=subject,
-                        )
-
-            yield '\n'
-
-            if new_commits:
-                for line in self.generate_new_revision_summary(
-                        len(new_commits), new_commits_list, push):
-                    yield line
-            else:
-                for line in self.expand_lines(NO_NEW_REVISIONS_TEMPLATE):
-                    yield line
-                for line in self.generate_revision_change_graph(push):
-                    yield line
-
-            # The diffstat is shown from the old revision to the new
-            # revision.  This is to show the truth of what happened in
-            # this change.  There's no point showing the stat from the
-            # base to the new revision because the base is effectively a
-            # random revision at this point - the user will be interested
-            # in what this revision changed - including the undoing of
-            # previous revisions in the case of non-fast-forward updates.
-            yield '\n'
-            yield 'Summary of changes:\n'
-            for line in read_git_lines(
-                    ['diff-tree'] +
-                    self.diffopts +
-                    ['%s..%s' % (self.old.commit_sha1, self.new.commit_sha1,)],
-                    keepends=True,
-                    ):
-                yield line
-
-        elif self.old.commit_sha1 and not self.new.commit_sha1:
-            # A reference was deleted.  List the revisions that were
-            # removed from the repository by this reference change.
-
-            sha1s = list(push.get_discarded_commits(self))
-            tot = len(sha1s)
-            discarded_revisions = [
-                Revision(self, GitObject(sha1), num=i + 1, tot=tot)
-                for (i, sha1) in enumerate(sha1s)
-                ]
-
-            if discarded_revisions:
-                for line in self.expand_lines(DISCARDED_REVISIONS_TEMPLATE):
-                    yield line
-                yield '\n'
-                for r in discarded_revisions:
-                    (sha1, subject) = r.rev.get_summary()
-                    yield r.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action='discard', text=subject,
-                        )
-                for line in self.generate_revision_change_graph(push):
-                    yield line
-            else:
-                for line in self.expand_lines(NO_DISCARDED_REVISIONS_TEMPLATE):
-                    yield line
-
-        elif not self.old.commit_sha1 and not self.new.commit_sha1:
-            for line in self.expand_lines(NON_COMMIT_UPDATE_TEMPLATE):
-                yield line
-
-    def generate_create_summary(self, push):
-        """Called for the creation of a reference."""
-
-        # This is a new reference and so oldrev is not valid
-        (sha1, subject) = self.new.get_summary()
-        yield self.expand(
-            BRIEF_SUMMARY_TEMPLATE, action='at',
-            rev_short=sha1, text=subject,
-            )
-        yield '\n'
-
-    def generate_update_summary(self, push):
-        """Called for the change of a pre-existing branch."""
-
-        return iter([])
-
-    def generate_delete_summary(self, push):
-        """Called for the deletion of any type of reference."""
-
-        (sha1, subject) = self.old.get_summary()
-        yield self.expand(
-            BRIEF_SUMMARY_TEMPLATE, action='was',
-            rev_short=sha1, text=subject,
-            )
-        yield '\n'
-
-    def get_specific_fromaddr(self):
-        return self.environment.from_refchange
-
-
-class BranchChange(ReferenceChange):
-    refname_type = 'branch'
-
-    def __init__(self, environment, refname, short_refname, old, new, rev):
-        ReferenceChange.__init__(
-            self, environment,
-            refname=refname, short_refname=short_refname,
-            old=old, new=new, rev=rev,
-            )
-        self.recipients = environment.get_refchange_recipients(self)
-        self._single_revision = None
-
-    def send_single_combined_email(self, known_added_sha1s):
-        if not self.environment.combine_when_single_commit:
-            return None
-
-        # In the sadly-all-too-frequent usecase of people pushing only
-        # one of their commits at a time to a repository, users feel
-        # the reference change summary emails are noise rather than
-        # important signal.  This is because, in this particular
-        # usecase, there is a reference change summary email for each
-        # new commit, and all these summaries do is point out that
-        # there is one new commit (which can readily be inferred by
-        # the existence of the individual revision email that is also
-        # sent).  In such cases, our users prefer there to be a combined
-        # reference change summary/new revision email.
-        #
-        # So, if the change is an update and it doesn't discard any
-        # commits, and it adds exactly one non-merge commit (gerrit
-        # forces a workflow where every commit is individually merged
-        # and the git-multimail hook fired off for just this one
-        # change), then we send a combined refchange/revision email.
-        try:
-            # If this change is a reference update that doesn't discard
-            # any commits...
-            if self.change_type != 'update':
-                return None
-
-            if read_git_lines(
-                    ['merge-base', self.old.sha1, self.new.sha1]
-                    ) != [self.old.sha1]:
-                return None
-
-            # Check if this update introduced exactly one non-merge
-            # commit:
-
-            def split_line(line):
-                """Split line into (sha1, [parent,...])."""
-
-                words = line.split()
-                return (words[0], words[1:])
-
-            # Get the new commits introduced by the push as a list of
-            # (sha1, [parent,...])
-            new_commits = [
-                split_line(line)
-                for line in read_git_lines(
-                    [
-                        'log', '-3', '--format=%H %P',
-                        '%s..%s' % (self.old.sha1, self.new.sha1),
-                        ]
-                    )
-                ]
-
-            if not new_commits:
-                return None
-
-            # If the newest commit is a merge, save it for a later check
-            # but otherwise ignore it
-            merge = None
-            tot = len(new_commits)
-            if len(new_commits[0][1]) > 1:
-                merge = new_commits[0][0]
-                del new_commits[0]
-
-            # Our primary check: we can't combine if more than one commit
-            # is introduced.  We also currently only combine if the new
-            # commit is a non-merge commit, though it may make sense to
-            # combine if it is a merge as well.
-            if not (
-                    len(new_commits) == 1 and
-                    len(new_commits[0][1]) == 1 and
-                    new_commits[0][0] in known_added_sha1s
-                    ):
-                return None
-
-            # We do not want to combine revision and refchange emails if
-            # those go to separate locations.
-            rev = Revision(self, GitObject(new_commits[0][0]), 1, tot)
-            if rev.recipients != self.recipients:
-                return None
-
-            # We ignored the newest commit if it was just a merge of the one
-            # commit being introduced.  But we don't want to ignore that
-            # merge commit it it involved conflict resolutions.  Check that.
-            if merge and merge != read_git_output(['diff-tree', '--cc', merge]):
-                return None
-
-            # We can combine the refchange and one new revision emails
-            # into one.  Return the Revision that a combined email should
-            # be sent about.
-            return rev
-        except CommandError:
-            # Cannot determine number of commits in old..new or new..old;
-            # don't combine reference/revision emails:
-            return None
-
-    def generate_combined_email(self, push, revision, body_filter=None, extra_header_values={}):
-        values = revision.get_values()
-        if extra_header_values:
-            values.update(extra_header_values)
-        if 'subject' not in extra_header_values:
-            values['subject'] = self.expand(COMBINED_REFCHANGE_REVISION_SUBJECT_TEMPLATE, **values)
-
-        self._single_revision = revision
-        self._contains_diff()
-        self.header_template = COMBINED_HEADER_TEMPLATE
-        self.intro_template = COMBINED_INTRO_TEMPLATE
-        self.footer_template = COMBINED_FOOTER_TEMPLATE
-
-        def revision_gen_link(base_url):
-            # revision is used only to generate the body, and
-            # _content_type is set while generating headers. Get it
-            # from the BranchChange object.
-            revision._content_type = self._content_type
-            return revision.generate_browse_link(base_url)
-        self.generate_browse_link = revision_gen_link
-        for line in self.generate_email(push, body_filter, values):
-            yield line
-
-    def generate_email_body(self, push):
-        '''Call the appropriate body generation routine.
-
-        If this is a combined refchange/revision email, the special logic
-        for handling this combined email comes from this function.  For
-        other cases, we just use the normal handling.'''
-
-        # If self._single_revision isn't set; don't override
-        if not self._single_revision:
-            for line in super(BranchChange, self).generate_email_body(push):
-                yield line
-            return
-
-        # This is a combined refchange/revision email; we first provide
-        # some info from the refchange portion, and then call the revision
-        # generate_email_body function to handle the revision portion.
-        adds = list(generate_summaries(
-            '--topo-order', '--reverse', '%s..%s'
-            % (self.old.commit_sha1, self.new.commit_sha1,)
-            ))
-
-        yield self.expand("The following commit(s) were added to %(refname)s by this push:\n")
-        for (sha1, subject) in adds:
-            yield self.expand(
-                BRIEF_SUMMARY_TEMPLATE, action='new',
-                rev_short=sha1, text=subject,
-                )
-
-        yield self._single_revision.rev.short + " is described below\n"
-        yield '\n'
-
-        for line in self._single_revision.generate_email_body(push):
-            yield line
-
-
-class AnnotatedTagChange(ReferenceChange):
-    refname_type = 'annotated tag'
-
-    def __init__(self, environment, refname, short_refname, old, new, rev):
-        ReferenceChange.__init__(
-            self, environment,
-            refname=refname, short_refname=short_refname,
-            old=old, new=new, rev=rev,
-            )
-        self.recipients = environment.get_announce_recipients(self)
-        self.show_shortlog = environment.announce_show_shortlog
-
-    ANNOTATED_TAG_FORMAT = (
-        '%(*objectname)\n'
-        '%(*objecttype)\n'
-        '%(taggername)\n'
-        '%(taggerdate)'
-        )
-
-    def describe_tag(self, push):
-        """Describe the new value of an annotated tag."""
-
-        # Use git for-each-ref to pull out the individual fields from
-        # the tag
-        [tagobject, tagtype, tagger, tagged] = read_git_lines(
-            ['for-each-ref', '--format=%s' % (self.ANNOTATED_TAG_FORMAT,), self.refname],
-            )
-
-        yield self.expand(
-            BRIEF_SUMMARY_TEMPLATE, action='tagging',
-            rev_short=tagobject, text='(%s)' % (tagtype,),
-            )
-        if tagtype == 'commit':
-            # If the tagged object is a commit, then we assume this is a
-            # release, and so we calculate which tag this tag is
-            # replacing
-            try:
-                prevtag = read_git_output(['describe', '--abbrev=0', '%s^' % (self.new,)])
-            except CommandError:
-                prevtag = None
-            if prevtag:
-                yield ' replaces %s\n' % (prevtag,)
-        else:
-            prevtag = None
-            yield '  length %s bytes\n' % (read_git_output(['cat-file', '-s', tagobject]),)
-
-        yield '      by %s\n' % (tagger,)
-        yield '      on %s\n' % (tagged,)
-        yield '\n'
-
-        # Show the content of the tag message; this might contain a
-        # change log or release notes so is worth displaying.
-        yield LOGBEGIN
-        contents = list(read_git_lines(['cat-file', 'tag', self.new.sha1], keepends=True))
-        contents = contents[contents.index('\n') + 1:]
-        if contents and contents[-1][-1:] != '\n':
-            contents.append('\n')
-        for line in contents:
-            yield line
-
-        if self.show_shortlog and tagtype == 'commit':
-            # Only commit tags make sense to have rev-list operations
-            # performed on them
-            yield '\n'
-            if prevtag:
-                # Show changes since the previous release
-                revlist = read_git_output(
-                    ['rev-list', '--pretty=short', '%s..%s' % (prevtag, self.new,)],
-                    keepends=True,
-                    )
-            else:
-                # No previous tag, show all the changes since time
-                # began
-                revlist = read_git_output(
-                    ['rev-list', '--pretty=short', '%s' % (self.new,)],
-                    keepends=True,
-                    )
-            for line in read_git_lines(['shortlog'], input=revlist, keepends=True):
-                yield line
-
-        yield LOGEND
-        yield '\n'
-
-    def generate_create_summary(self, push):
-        """Called for the creation of an annotated tag."""
-
-        for line in self.expand_lines(TAG_CREATED_TEMPLATE):
-            yield line
-
-        for line in self.describe_tag(push):
-            yield line
-
-    def generate_update_summary(self, push):
-        """Called for the update of an annotated tag.
-
-        This is probably a rare event and may not even be allowed."""
-
-        for line in self.expand_lines(TAG_UPDATED_TEMPLATE):
-            yield line
-
-        for line in self.describe_tag(push):
-            yield line
-
-    def generate_delete_summary(self, push):
-        """Called when a non-annotated reference is updated."""
-
-        for line in self.expand_lines(TAG_DELETED_TEMPLATE):
-            yield line
-
-        yield self.expand('   tag was  %(oldrev_short)s\n')
-        yield '\n'
-
-
-class NonAnnotatedTagChange(ReferenceChange):
-    refname_type = 'tag'
-
-    def __init__(self, environment, refname, short_refname, old, new, rev):
-        ReferenceChange.__init__(
-            self, environment,
-            refname=refname, short_refname=short_refname,
-            old=old, new=new, rev=rev,
-            )
-        self.recipients = environment.get_refchange_recipients(self)
-
-    def generate_create_summary(self, push):
-        """Called for the creation of an annotated tag."""
-
-        for line in self.expand_lines(TAG_CREATED_TEMPLATE):
-            yield line
-
-    def generate_update_summary(self, push):
-        """Called when a non-annotated reference is updated."""
-
-        for line in self.expand_lines(TAG_UPDATED_TEMPLATE):
-            yield line
-
-    def generate_delete_summary(self, push):
-        """Called when a non-annotated reference is updated."""
-
-        for line in self.expand_lines(TAG_DELETED_TEMPLATE):
-            yield line
-
-        for line in ReferenceChange.generate_delete_summary(self, push):
-            yield line
-
-
-class OtherReferenceChange(ReferenceChange):
-    refname_type = 'reference'
-
-    def __init__(self, environment, refname, short_refname, old, new, rev):
-        # We use the full refname as short_refname, because otherwise
-        # the full name of the reference would not be obvious from the
-        # text of the email.
-        ReferenceChange.__init__(
-            self, environment,
-            refname=refname, short_refname=refname,
-            old=old, new=new, rev=rev,
-            )
-        self.recipients = environment.get_refchange_recipients(self)
-
-
-class Mailer(object):
-    """An object that can send emails."""
-
-    def __init__(self, environment):
-        self.environment = environment
-
-    def close(self):
-        pass
-
-    def send(self, lines, to_addrs):
-        """Send an email consisting of lines.
-
-        lines must be an iterable over the lines constituting the
-        header and body of the email.  to_addrs is a list of recipient
-        addresses (can be needed even if lines already contains a
-        "To:" field).  It can be either a string (comma-separated list
-        of email addresses) or a Python list of individual email
-        addresses.
-
-        """
-
-        raise NotImplementedError()
-
-
-class SendMailer(Mailer):
-    """Send emails using 'sendmail -oi -t'."""
-
-    SENDMAIL_CANDIDATES = [
-        '/usr/sbin/sendmail',
-        '/usr/lib/sendmail',
-        ]
-
-    @staticmethod
-    def find_sendmail():
-        for path in SendMailer.SENDMAIL_CANDIDATES:
-            if os.access(path, os.X_OK):
-                return path
-        else:
-            raise ConfigurationException(
-                'No sendmail executable found.  '
-                'Try setting multimailhook.sendmailCommand.'
-                )
-
-    def __init__(self, environment, command=None, envelopesender=None):
-        """Construct a SendMailer instance.
-
-        command should be the command and arguments used to invoke
-        sendmail, as a list of strings.  If an envelopesender is
-        provided, it will also be passed to the command, via '-f
-        envelopesender'."""
-        super(SendMailer, self).__init__(environment)
-        if command:
-            self.command = command[:]
-        else:
-            self.command = [self.find_sendmail(), '-oi', '-t']
-
-        if envelopesender:
-            self.command.extend(['-f', envelopesender])
-
-    def send(self, lines, to_addrs):
-        try:
-            p = subprocess.Popen(self.command, stdin=subprocess.PIPE)
-        except OSError:
-            self.environment.get_logger().error(
-                '*** Cannot execute command: %s\n' % ' '.join(self.command) +
-                '*** %s\n' % sys.exc_info()[1] +
-                '*** Try setting multimailhook.mailer to "smtp"\n' +
-                '*** to send emails without using the sendmail command.\n'
-                )
-            sys.exit(1)
-        try:
-            lines = (str_to_bytes(line) for line in lines)
-            p.stdin.writelines(lines)
-        except Exception:
-            self.environment.get_logger().error(
-                '*** Error while generating commit email\n'
-                '***  - mail sending aborted.\n'
-                )
-            if hasattr(p, 'terminate'):
-                # subprocess.terminate() is not available in Python 2.4
-                p.terminate()
-            else:
-                import signal
-                os.kill(p.pid, signal.SIGTERM)
-            raise
-        else:
-            p.stdin.close()
-            retcode = p.wait()
-            if retcode:
-                raise CommandError(self.command, retcode)
-
-
-class SMTPMailer(Mailer):
-    """Send emails using Python's smtplib."""
-
-    def __init__(self, environment,
-                 envelopesender, smtpserver,
-                 smtpservertimeout=10.0, smtpserverdebuglevel=0,
-                 smtpencryption='none',
-                 smtpuser='', smtppass='',
-                 smtpcacerts=''
-                 ):
-        super(SMTPMailer, self).__init__(environment)
-        if not envelopesender:
-            self.environment.get_logger().error(
-                'fatal: git_multimail: cannot use SMTPMailer without a sender address.\n'
-                'please set either multimailhook.envelopeSender or user.email\n'
-                )
-            sys.exit(1)
-        if smtpencryption == 'ssl' and not (smtpuser and smtppass):
-            raise ConfigurationException(
-                'Cannot use SMTPMailer with security option ssl '
-                'without options username and password.'
-                )
-        self.envelopesender = envelopesender
-        self.smtpserver = smtpserver
-        self.smtpservertimeout = smtpservertimeout
-        self.smtpserverdebuglevel = smtpserverdebuglevel
-        self.security = smtpencryption
-        self.username = smtpuser
-        self.password = smtppass
-        self.smtpcacerts = smtpcacerts
-        self.loggedin = False
-        try:
-            def call(klass, server, timeout):
-                try:
-                    return klass(server, timeout=timeout)
-                except TypeError:
-                    # Old Python versions do not have timeout= argument.
-                    return klass(server)
-            if self.security == 'none':
-                self.smtp = call(smtplib.SMTP, self.smtpserver, timeout=self.smtpservertimeout)
-            elif self.security == 'ssl':
-                if self.smtpcacerts:
-                    raise smtplib.SMTPException(
-                        "Checking certificate is not supported for ssl, prefer starttls"
-                        )
-                self.smtp = call(smtplib.SMTP_SSL, self.smtpserver, timeout=self.smtpservertimeout)
-            elif self.security == 'tls':
-                if 'ssl' not in sys.modules:
-                    self.environment.get_logger().error(
-                        '*** Your Python version does not have the ssl library installed\n'
-                        '*** smtpEncryption=tls is not available.\n'
-                        '*** Either upgrade Python to 2.6 or later\n'
-                        '    or use git_multimail.py version 1.2.\n')
-                if ':' not in self.smtpserver:
-                    self.smtpserver += ':587'  # default port for TLS
-                self.smtp = call(smtplib.SMTP, self.smtpserver, timeout=self.smtpservertimeout)
-                # start: ehlo + starttls
-                # equivalent to
-                #     self.smtp.ehlo()
-                #     self.smtp.starttls()
-                # with access to the ssl layer
-                self.smtp.ehlo()
-                if not self.smtp.has_extn("starttls"):
-                    raise smtplib.SMTPException("STARTTLS extension not supported by server")
-                resp, reply = self.smtp.docmd("STARTTLS")
-                if resp != 220:
-                    raise smtplib.SMTPException("Wrong answer to the STARTTLS command")
-                if self.smtpcacerts:
-                    self.smtp.sock = ssl.wrap_socket(
-                        self.smtp.sock,
-                        ca_certs=self.smtpcacerts,
-                        cert_reqs=ssl.CERT_REQUIRED
-                        )
-                else:
-                    self.smtp.sock = ssl.wrap_socket(
-                        self.smtp.sock,
-                        cert_reqs=ssl.CERT_NONE
-                        )
-                    self.environment.get_logger().error(
-                        '*** Warning, the server certificate is not verified (smtp) ***\n'
-                        '***          set the option smtpCACerts                   ***\n'
-                        )
-                if not hasattr(self.smtp.sock, "read"):
-                    # using httplib.FakeSocket with Python 2.5.x or earlier
-                    self.smtp.sock.read = self.smtp.sock.recv
-                self.smtp.file = smtplib.SSLFakeFile(self.smtp.sock)
-                self.smtp.helo_resp = None
-                self.smtp.ehlo_resp = None
-                self.smtp.esmtp_features = {}
-                self.smtp.does_esmtp = 0
-                # end:   ehlo + starttls
-                self.smtp.ehlo()
-            else:
-                sys.stdout.write('*** Error: Control reached an invalid option. ***')
-                sys.exit(1)
-            if self.smtpserverdebuglevel > 0:
-                sys.stdout.write(
-                    "*** Setting debug on for SMTP server connection (%s) ***\n"
-                    % self.smtpserverdebuglevel)
-                self.smtp.set_debuglevel(self.smtpserverdebuglevel)
-        except Exception:
-            self.environment.get_logger().error(
-                '*** Error establishing SMTP connection to %s ***\n'
-                '*** %s\n'
-                % (self.smtpserver, sys.exc_info()[1]))
-            sys.exit(1)
-
-    def close(self):
-        if hasattr(self, 'smtp'):
-            self.smtp.quit()
-            del self.smtp
-
-    def __del__(self):
-        self.close()
-
-    def send(self, lines, to_addrs):
-        try:
-            if self.username or self.password:
-                if not self.loggedin:
-                    self.smtp.login(self.username, self.password)
-                    self.loggedin = True
-            msg = ''.join(lines)
-            # turn comma-separated list into Python list if needed.
-            if is_string(to_addrs):
-                to_addrs = [email for (name, email) in getaddresses([to_addrs])]
-            self.smtp.sendmail(self.envelopesender, to_addrs, msg)
-        except socket.timeout:
-            self.environment.get_logger().error(
-                '*** Error sending email ***\n'
-                '*** SMTP server timed out (timeout is %s)\n'
-                % self.smtpservertimeout)
-        except smtplib.SMTPResponseException:
-            err = sys.exc_info()[1]
-            self.environment.get_logger().error(
-                '*** Error sending email ***\n'
-                '*** Error %d: %s\n'
-                % (err.smtp_code, bytes_to_str(err.smtp_error)))
-            try:
-                smtp = self.smtp
-                # delete the field before quit() so that in case of
-                # error, self.smtp is deleted anyway.
-                del self.smtp
-                smtp.quit()
-            except:
-                self.environment.get_logger().error(
-                    '*** Error closing the SMTP connection ***\n'
-                    '*** Exiting anyway ... ***\n'
-                    '*** %s\n' % sys.exc_info()[1])
-            sys.exit(1)
-
-
-class OutputMailer(Mailer):
-    """Write emails to an output stream, bracketed by lines of '=' characters.
-
-    This is intended for debugging purposes."""
-
-    SEPARATOR = '=' * 75 + '\n'
-
-    def __init__(self, f, environment=None):
-        super(OutputMailer, self).__init__(environment=environment)
-        self.f = f
-
-    def send(self, lines, to_addrs):
-        write_str(self.f, self.SEPARATOR)
-        for line in lines:
-            write_str(self.f, line)
-        write_str(self.f, self.SEPARATOR)
-
-
-def get_git_dir():
-    """Determine GIT_DIR.
-
-    Determine GIT_DIR either from the GIT_DIR environment variable or
-    from the working directory, using Git's usual rules."""
-
-    try:
-        return read_git_output(['rev-parse', '--git-dir'])
-    except CommandError:
-        sys.stderr.write('fatal: git_multimail: not in a git directory\n')
-        sys.exit(1)
-
-
-class Environment(object):
-    """Describes the environment in which the push is occurring.
-
-    An Environment object encapsulates information about the local
-    environment.  For example, it knows how to determine:
-
-    * the name of the repository to which the push occurred
-
-    * what user did the push
-
-    * what users want to be informed about various types of changes.
-
-    An Environment object is expected to have the following methods:
-
-        get_repo_shortname()
-
-            Return a short name for the repository, for display
-            purposes.
-
-        get_repo_path()
-
-            Return the absolute path to the Git repository.
-
-        get_emailprefix()
-
-            Return a string that will be prefixed to every email's
-            subject.
-
-        get_pusher()
-
-            Return the username of the person who pushed the changes.
-            This value is used in the email body to indicate who
-            pushed the change.
-
-        get_pusher_email() (may return None)
-
-            Return the email address of the person who pushed the
-            changes.  The value should be a single RFC 2822 email
-            address as a string; e.g., "Joe User <user@example.com>"
-            if available, otherwise "user@example.com".  If set, the
-            value is used as the Reply-To address for refchange
-            emails.  If it is impossible to determine the pusher's
-            email, this attribute should be set to None (in which case
-            no Reply-To header will be output).
-
-        get_sender()
-
-            Return the address to be used as the 'From' email address
-            in the email envelope.
-
-        get_fromaddr(change=None)
-
-            Return the 'From' email address used in the email 'From:'
-            headers.  If the change is known when this function is
-            called, it is passed in as the 'change' parameter.  (May
-            be a full RFC 2822 email address like 'Joe User
-            <user@example.com>'.)
-
-        get_administrator()
-
-            Return the name and/or email of the repository
-            administrator.  This value is used in the footer as the
-            person to whom requests to be removed from the
-            notification list should be sent.  Ideally, it should
-            include a valid email address.
-
-        get_reply_to_refchange()
-        get_reply_to_commit()
-
-            Return the address to use in the email "Reply-To" header,
-            as a string.  These can be an RFC 2822 email address, or
-            None to omit the "Reply-To" header.
-            get_reply_to_refchange() is used for refchange emails;
-            get_reply_to_commit() is used for individual commit
-            emails.
-
-        get_ref_filter_regex()
-
-            Return a tuple -- a compiled regex, and a boolean indicating
-            whether the regex picks refs to include (if False, the regex
-            matches on refs to exclude).
-
-        get_default_ref_ignore_regex()
-
-            Return a regex that should be ignored for both what emails
-            to send and when computing what commits are considered new
-            to the repository.  Default is "^refs/notes/".
-
-        get_max_subject_length()
-
-            Return an int giving the maximal length for the subject
-            (git log --oneline).
-
-    They should also define the following attributes:
-
-        announce_show_shortlog (bool)
-
-            True iff announce emails should include a shortlog.
-
-        commit_email_format (string)
-
-            If "html", generate commit emails in HTML instead of plain text
-            used by default.
-
-        html_in_intro (bool)
-        html_in_footer (bool)
-
-            When generating HTML emails, the introduction (respectively,
-            the footer) will be HTML-escaped iff html_in_intro (respectively,
-            the footer) is true. When false, only the values used to expand
-            the template are escaped.
-
-        refchange_showgraph (bool)
-
-            True iff refchanges emails should include a detailed graph.
-
-        refchange_showlog (bool)
-
-            True iff refchanges emails should include a detailed log.
-
-        diffopts (list of strings)
-
-            The options that should be passed to 'git diff' for the
-            summary email.  The value should be a list of strings
-            representing words to be passed to the command.
-
-        graphopts (list of strings)
-
-            Analogous to diffopts, but contains options passed to
-            'git log --graph' when generating the detailed graph for
-            a set of commits (see refchange_showgraph)
-
-        logopts (list of strings)
-
-            Analogous to diffopts, but contains options passed to
-            'git log' when generating the detailed log for a set of
-            commits (see refchange_showlog)
-
-        commitlogopts (list of strings)
-
-            The options that should be passed to 'git log' for each
-            commit mail.  The value should be a list of strings
-            representing words to be passed to the command.
-
-        date_substitute (string)
-
-            String to be used in substitution for 'Date:' at start of
-            line in the output of 'git log'.
-
-        quiet (bool)
-            On success do not write to stderr
-
-        stdout (bool)
-            Write email to stdout rather than emailing. Useful for debugging
-
-        combine_when_single_commit (bool)
-
-            True if a combined email should be produced when a single
-            new commit is pushed to a branch, False otherwise.
-
-        from_refchange, from_commit (strings)
-
-            Addresses to use for the From: field for refchange emails
-            and commit emails respectively.  Set from
-            multimailhook.fromRefchange and multimailhook.fromCommit
-            by ConfigEnvironmentMixin.
-
-        log_file, error_log_file, debug_log_file (string)
-
-            Name of a file to which logs should be sent.
-
-        verbose (int)
-
-            How verbose the system should be.
-            - 0 (default): show info, errors, ...
-            - 1 : show basic debug info
-    """
-
-    REPO_NAME_RE = re.compile(r'^(?P<name>.+?)(?:\.git)$')
-
-    def __init__(self, osenv=None):
-        self.osenv = osenv or os.environ
-        self.announce_show_shortlog = False
-        self.commit_email_format = "text"
-        self.html_in_intro = False
-        self.html_in_footer = False
-        self.commitBrowseURL = None
-        self.maxcommitemails = 500
-        self.excludemergerevisions = False
-        self.diffopts = ['--stat', '--summary', '--find-copies-harder']
-        self.graphopts = ['--oneline', '--decorate']
-        self.logopts = []
-        self.refchange_showgraph = False
-        self.refchange_showlog = False
-        self.commitlogopts = ['-C', '--stat', '-p', '--cc']
-        self.date_substitute = 'AuthorDate: '
-        self.quiet = False
-        self.stdout = False
-        self.combine_when_single_commit = True
-        self.logger = None
-
-        self.COMPUTED_KEYS = [
-            'administrator',
-            'charset',
-            'emailprefix',
-            'pusher',
-            'pusher_email',
-            'repo_path',
-            'repo_shortname',
-            'sender',
-            ]
-
-        self._values = None
-
-    def get_logger(self):
-        """Get (possibly creates) the logger associated to this environment."""
-        if self.logger is None:
-            self.logger = Logger(self)
-        return self.logger
-
-    def get_repo_shortname(self):
-        """Use the last part of the repo path, with ".git" stripped off if present."""
-
-        basename = os.path.basename(os.path.abspath(self.get_repo_path()))
-        m = self.REPO_NAME_RE.match(basename)
-        if m:
-            return m.group('name')
-        else:
-            return basename
-
-    def get_pusher(self):
-        raise NotImplementedError()
-
-    def get_pusher_email(self):
-        return None
-
-    def get_fromaddr(self, change=None):
-        config = Config('user')
-        fromname = config.get('name', default='')
-        fromemail = config.get('email', default='')
-        if fromemail:
-            return formataddr([fromname, fromemail])
-        return self.get_sender()
-
-    def get_administrator(self):
-        return 'the administrator of this repository'
-
-    def get_emailprefix(self):
-        return ''
-
-    def get_repo_path(self):
-        if read_git_output(['rev-parse', '--is-bare-repository']) == 'true':
-            path = get_git_dir()
-        else:
-            path = read_git_output(['rev-parse', '--show-toplevel'])
-        return os.path.abspath(path)
-
-    def get_charset(self):
-        return CHARSET
-
-    def get_values(self):
-        """Return a dictionary {keyword: expansion} for this Environment.
-
-        This method is called by Change._compute_values().  The keys
-        in the returned dictionary are available to be used in any of
-        the templates.  The dictionary is created by calling
-        self.get_NAME() for each of the attributes named in
-        COMPUTED_KEYS and recording those that do not return None.
-        The return value is always a new dictionary."""
-
-        if self._values is None:
-            values = {'': ''}  # %()s expands to the empty string.
-
-            for key in self.COMPUTED_KEYS:
-                value = getattr(self, 'get_%s' % (key,))()
-                if value is not None:
-                    values[key] = value
-
-            self._values = values
-
-        return self._values.copy()
-
-    def get_refchange_recipients(self, refchange):
-        """Return the recipients for notifications about refchange.
-
-        Return the list of email addresses to which notifications
-        about the specified ReferenceChange should be sent."""
-
-        raise NotImplementedError()
-
-    def get_announce_recipients(self, annotated_tag_change):
-        """Return the recipients for notifications about annotated_tag_change.
-
-        Return the list of email addresses to which notifications
-        about the specified AnnotatedTagChange should be sent."""
-
-        raise NotImplementedError()
-
-    def get_reply_to_refchange(self, refchange):
-        return self.get_pusher_email()
-
-    def get_revision_recipients(self, revision):
-        """Return the recipients for messages about revision.
-
-        Return the list of email addresses to which notifications
-        about the specified Revision should be sent.  This method
-        could be overridden, for example, to take into account the
-        contents of the revision when deciding whom to notify about
-        it.  For example, there could be a scheme for users to express
-        interest in particular files or subdirectories, and only
-        receive notification emails for revisions that affecting those
-        files."""
-
-        raise NotImplementedError()
-
-    def get_reply_to_commit(self, revision):
-        return revision.author
-
-    def get_default_ref_ignore_regex(self):
-        # The commit messages of git notes are essentially meaningless
-        # and "filenames" in git notes commits are an implementational
-        # detail that might surprise users at first.  As such, we
-        # would need a completely different method for handling emails
-        # of git notes in order for them to be of benefit for users,
-        # which we simply do not have right now.
-        return "^refs/notes/"
-
-    def get_max_subject_length(self):
-        """Return the maximal subject line (git log --oneline) length.
-        Longer subject lines will be truncated."""
-        raise NotImplementedError()
-
-    def filter_body(self, lines):
-        """Filter the lines intended for an email body.
-
-        lines is an iterable over the lines that would go into the
-        email body.  Filter it (e.g., limit the number of lines, the
-        line length, character set, etc.), returning another iterable.
-        See FilterLinesEnvironmentMixin and MaxlinesEnvironmentMixin
-        for classes implementing this functionality."""
-
-        return lines
-
-    def log_msg(self, msg):
-        """Write the string msg on a log file or on stderr.
-
-        Sends the text to stderr by default, override to change the behavior."""
-        self.get_logger().info(msg)
-
-    def log_warning(self, msg):
-        """Write the string msg on a log file or on stderr.
-
-        Sends the text to stderr by default, override to change the behavior."""
-        self.get_logger().warning(msg)
-
-    def log_error(self, msg):
-        """Write the string msg on a log file or on stderr.
-
-        Sends the text to stderr by default, override to change the behavior."""
-        self.get_logger().error(msg)
-
-    def check(self):
-        pass
-
-
-class ConfigEnvironmentMixin(Environment):
-    """A mixin that sets self.config to its constructor's config argument.
-
-    This class's constructor consumes the "config" argument.
-
-    Mixins that need to inspect the config should inherit from this
-    class (1) to make sure that "config" is still in the constructor
-    arguments with its own constructor runs and/or (2) to be sure that
-    self.config is set after construction."""
-
-    def __init__(self, config, **kw):
-        super(ConfigEnvironmentMixin, self).__init__(**kw)
-        self.config = config
-
-
-class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
-    """An Environment that reads most of its information from "git config"."""
-
-    @staticmethod
-    def forbid_field_values(name, value, forbidden):
-        for forbidden_val in forbidden:
-            if value is not None and value.lower() == forbidden:
-                raise ConfigurationException(
-                    '"%s" is not an allowed setting for %s' % (value, name)
-                    )
-
-    def __init__(self, config, **kw):
-        super(ConfigOptionsEnvironmentMixin, self).__init__(
-            config=config, **kw
-            )
-
-        for var, cfg in (
-                ('announce_show_shortlog', 'announceshortlog'),
-                ('refchange_showgraph', 'refchangeShowGraph'),
-                ('refchange_showlog', 'refchangeshowlog'),
-                ('quiet', 'quiet'),
-                ('stdout', 'stdout'),
-                ):
-            val = config.get_bool(cfg)
-            if val is not None:
-                setattr(self, var, val)
-
-        commit_email_format = config.get('commitEmailFormat')
-        if commit_email_format is not None:
-            if commit_email_format != "html" and commit_email_format != "text":
-                self.log_warning(
-                    '*** Unknown value for multimailhook.commitEmailFormat: %s\n' %
-                    commit_email_format +
-                    '*** Expected either "text" or "html".  Ignoring.\n'
-                    )
-            else:
-                self.commit_email_format = commit_email_format
-
-        html_in_intro = config.get_bool('htmlInIntro')
-        if html_in_intro is not None:
-            self.html_in_intro = html_in_intro
-
-        html_in_footer = config.get_bool('htmlInFooter')
-        if html_in_footer is not None:
-            self.html_in_footer = html_in_footer
-
-        self.commitBrowseURL = config.get('commitBrowseURL')
-
-        self.excludemergerevisions = config.get('excludeMergeRevisions')
-
-        maxcommitemails = config.get('maxcommitemails')
-        if maxcommitemails is not None:
-            try:
-                self.maxcommitemails = int(maxcommitemails)
-            except ValueError:
-                self.log_warning(
-                    '*** Malformed value for multimailhook.maxCommitEmails: %s\n'
-                    % maxcommitemails +
-                    '*** Expected a number.  Ignoring.\n'
-                    )
-
-        diffopts = config.get('diffopts')
-        if diffopts is not None:
-            self.diffopts = shlex.split(diffopts)
-
-        graphopts = config.get('graphOpts')
-        if graphopts is not None:
-            self.graphopts = shlex.split(graphopts)
-
-        logopts = config.get('logopts')
-        if logopts is not None:
-            self.logopts = shlex.split(logopts)
-
-        commitlogopts = config.get('commitlogopts')
-        if commitlogopts is not None:
-            self.commitlogopts = shlex.split(commitlogopts)
-
-        date_substitute = config.get('dateSubstitute')
-        if date_substitute == 'none':
-            self.date_substitute = None
-        elif date_substitute is not None:
-            self.date_substitute = date_substitute
-
-        reply_to = config.get('replyTo')
-        self.__reply_to_refchange = config.get('replyToRefchange', default=reply_to)
-        self.forbid_field_values('replyToRefchange',
-                                 self.__reply_to_refchange,
-                                 ['author'])
-        self.__reply_to_commit = config.get('replyToCommit', default=reply_to)
-
-        self.from_refchange = config.get('fromRefchange')
-        self.forbid_field_values('fromRefchange',
-                                 self.from_refchange,
-                                 ['author', 'none'])
-        self.from_commit = config.get('fromCommit')
-        self.forbid_field_values('fromCommit',
-                                 self.from_commit,
-                                 ['none'])
-
-        combine = config.get_bool('combineWhenSingleCommit')
-        if combine is not None:
-            self.combine_when_single_commit = combine
-
-        self.log_file = config.get('logFile', default=None)
-        self.error_log_file = config.get('errorLogFile', default=None)
-        self.debug_log_file = config.get('debugLogFile', default=None)
-        if config.get_bool('Verbose', default=False):
-            self.verbose = 1
-        else:
-            self.verbose = 0
-
-    def get_administrator(self):
-        return (
-            self.config.get('administrator') or
-            self.get_sender() or
-            super(ConfigOptionsEnvironmentMixin, self).get_administrator()
-            )
-
-    def get_repo_shortname(self):
-        return (
-            self.config.get('reponame') or
-            super(ConfigOptionsEnvironmentMixin, self).get_repo_shortname()
-            )
-
-    def get_emailprefix(self):
-        emailprefix = self.config.get('emailprefix')
-        if emailprefix is not None:
-            emailprefix = emailprefix.strip()
-            if emailprefix:
-                emailprefix += ' '
-        else:
-            emailprefix = '[%(repo_shortname)s] '
-        short_name = self.get_repo_shortname()
-        try:
-            return emailprefix % {'repo_shortname': short_name}
-        except:
-            self.get_logger().error(
-                '*** Invalid multimailhook.emailPrefix: %s\n' % emailprefix +
-                '*** %s\n' % sys.exc_info()[1] +
-                "*** Only the '%(repo_shortname)s' placeholder is allowed\n"
-                )
-            raise ConfigurationException(
-                '"%s" is not an allowed setting for emailPrefix' % emailprefix
-                )
-
-    def get_sender(self):
-        return self.config.get('envelopesender')
-
-    def process_addr(self, addr, change):
-        if addr.lower() == 'author':
-            if hasattr(change, 'author'):
-                return change.author
-            else:
-                return None
-        elif addr.lower() == 'pusher':
-            return self.get_pusher_email()
-        elif addr.lower() == 'none':
-            return None
-        else:
-            return addr
-
-    def get_fromaddr(self, change=None):
-        fromaddr = self.config.get('from')
-        if change:
-            specific_fromaddr = change.get_specific_fromaddr()
-            if specific_fromaddr:
-                fromaddr = specific_fromaddr
-        if fromaddr:
-            fromaddr = self.process_addr(fromaddr, change)
-        if fromaddr:
-            return fromaddr
-        return super(ConfigOptionsEnvironmentMixin, self).get_fromaddr(change)
-
-    def get_reply_to_refchange(self, refchange):
-        if self.__reply_to_refchange is None:
-            return super(ConfigOptionsEnvironmentMixin, self).get_reply_to_refchange(refchange)
-        else:
-            return self.process_addr(self.__reply_to_refchange, refchange)
-
-    def get_reply_to_commit(self, revision):
-        if self.__reply_to_commit is None:
-            return super(ConfigOptionsEnvironmentMixin, self).get_reply_to_commit(revision)
-        else:
-            return self.process_addr(self.__reply_to_commit, revision)
-
-    def get_scancommitforcc(self):
-        return self.config.get('scancommitforcc')
-
-
-class FilterLinesEnvironmentMixin(Environment):
-    """Handle encoding and maximum line length of body lines.
-
-        email_max_line_length (int or None)
-
-            The maximum length of any single line in the email body.
-            Longer lines are truncated at that length with ' [...]'
-            appended.
-
-        strict_utf8 (bool)
-
-            If this field is set to True, then the email body text is
-            expected to be UTF-8.  Any invalid characters are
-            converted to U+FFFD, the Unicode replacement character
-            (encoded as UTF-8, of course).
-
-    """
-
-    def __init__(self, strict_utf8=True,
-                 email_max_line_length=500, max_subject_length=500,
-                 **kw):
-        super(FilterLinesEnvironmentMixin, self).__init__(**kw)
-        self.__strict_utf8 = strict_utf8
-        self.__email_max_line_length = email_max_line_length
-        self.__max_subject_length = max_subject_length
-
-    def filter_body(self, lines):
-        lines = super(FilterLinesEnvironmentMixin, self).filter_body(lines)
-        if self.__strict_utf8:
-            if not PYTHON3:
-                lines = (line.decode(ENCODING, 'replace') for line in lines)
-            # Limit the line length in Unicode-space to avoid
-            # splitting characters:
-            if self.__email_max_line_length > 0:
-                lines = limit_linelength(lines, self.__email_max_line_length)
-            if not PYTHON3:
-                lines = (line.encode(ENCODING, 'replace') for line in lines)
-        elif self.__email_max_line_length:
-            lines = limit_linelength(lines, self.__email_max_line_length)
-
-        return lines
-
-    def get_max_subject_length(self):
-        return self.__max_subject_length
-
-
-class ConfigFilterLinesEnvironmentMixin(
-        ConfigEnvironmentMixin,
-        FilterLinesEnvironmentMixin,
-        ):
-    """Handle encoding and maximum line length based on config."""
-
-    def __init__(self, config, **kw):
-        strict_utf8 = config.get_bool('emailstrictutf8', default=None)
-        if strict_utf8 is not None:
-            kw['strict_utf8'] = strict_utf8
-
-        email_max_line_length = config.get('emailmaxlinelength')
-        if email_max_line_length is not None:
-            kw['email_max_line_length'] = int(email_max_line_length)
-
-        max_subject_length = config.get('subjectMaxLength', default=email_max_line_length)
-        if max_subject_length is not None:
-            kw['max_subject_length'] = int(max_subject_length)
-
-        super(ConfigFilterLinesEnvironmentMixin, self).__init__(
-            config=config, **kw
-            )
-
-
-class MaxlinesEnvironmentMixin(Environment):
-    """Limit the email body to a specified number of lines."""
-
-    def __init__(self, emailmaxlines, **kw):
-        super(MaxlinesEnvironmentMixin, self).__init__(**kw)
-        self.__emailmaxlines = emailmaxlines
-
-    def filter_body(self, lines):
-        lines = super(MaxlinesEnvironmentMixin, self).filter_body(lines)
-        if self.__emailmaxlines > 0:
-            lines = limit_lines(lines, self.__emailmaxlines)
-        return lines
-
-
-class ConfigMaxlinesEnvironmentMixin(
-        ConfigEnvironmentMixin,
-        MaxlinesEnvironmentMixin,
-        ):
-    """Limit the email body to the number of lines specified in config."""
-
-    def __init__(self, config, **kw):
-        emailmaxlines = int(config.get('emailmaxlines', default='0'))
-        super(ConfigMaxlinesEnvironmentMixin, self).__init__(
-            config=config,
-            emailmaxlines=emailmaxlines,
-            **kw
-            )
-
-
-class FQDNEnvironmentMixin(Environment):
-    """A mixin that sets the host's FQDN to its constructor argument."""
-
-    def __init__(self, fqdn, **kw):
-        super(FQDNEnvironmentMixin, self).__init__(**kw)
-        self.COMPUTED_KEYS += ['fqdn']
-        self.__fqdn = fqdn
-
-    def get_fqdn(self):
-        """Return the fully-qualified domain name for this host.
-
-        Return None if it is unavailable or unwanted."""
-
-        return self.__fqdn
-
-
-class ConfigFQDNEnvironmentMixin(
-        ConfigEnvironmentMixin,
-        FQDNEnvironmentMixin,
-        ):
-    """Read the FQDN from the config."""
-
-    def __init__(self, config, **kw):
-        fqdn = config.get('fqdn')
-        super(ConfigFQDNEnvironmentMixin, self).__init__(
-            config=config,
-            fqdn=fqdn,
-            **kw
-            )
-
-
-class ComputeFQDNEnvironmentMixin(FQDNEnvironmentMixin):
-    """Get the FQDN by calling socket.getfqdn()."""
-
-    def __init__(self, **kw):
-        super(ComputeFQDNEnvironmentMixin, self).__init__(
-            fqdn=socket.getfqdn(),
-            **kw
-            )
-
-
-class PusherDomainEnvironmentMixin(ConfigEnvironmentMixin):
-    """Deduce pusher_email from pusher by appending an emaildomain."""
-
-    def __init__(self, **kw):
-        super(PusherDomainEnvironmentMixin, self).__init__(**kw)
-        self.__emaildomain = self.config.get('emaildomain')
-
-    def get_pusher_email(self):
-        if self.__emaildomain:
-            # Derive the pusher's full email address in the default way:
-            return '%s@%s' % (self.get_pusher(), self.__emaildomain)
-        else:
-            return super(PusherDomainEnvironmentMixin, self).get_pusher_email()
-
-
-class StaticRecipientsEnvironmentMixin(Environment):
-    """Set recipients statically based on constructor parameters."""
-
-    def __init__(
-            self,
-            refchange_recipients, announce_recipients, revision_recipients, scancommitforcc,
-            **kw
-            ):
-        super(StaticRecipientsEnvironmentMixin, self).__init__(**kw)
-
-        # The recipients for various types of notification emails, as
-        # RFC 2822 email addresses separated by commas (or the empty
-        # string if no recipients are configured).  Although there is
-        # a mechanism to choose the recipient lists based on on the
-        # actual *contents* of the change being reported, we only
-        # choose based on the *type* of the change.  Therefore we can
-        # compute them once and for all:
-        self.__refchange_recipients = refchange_recipients
-        self.__announce_recipients = announce_recipients
-        self.__revision_recipients = revision_recipients
-
-    def check(self):
-        if not (self.get_refchange_recipients(None) or
-                self.get_announce_recipients(None) or
-                self.get_revision_recipients(None) or
-                self.get_scancommitforcc()):
-            raise ConfigurationException('No email recipients configured!')
-        super(StaticRecipientsEnvironmentMixin, self).check()
-
-    def get_refchange_recipients(self, refchange):
-        if self.__refchange_recipients is None:
-            return super(StaticRecipientsEnvironmentMixin,
-                         self).get_refchange_recipients(refchange)
-        return self.__refchange_recipients
-
-    def get_announce_recipients(self, annotated_tag_change):
-        if self.__announce_recipients is None:
-            return super(StaticRecipientsEnvironmentMixin,
-                         self).get_refchange_recipients(annotated_tag_change)
-        return self.__announce_recipients
-
-    def get_revision_recipients(self, revision):
-        if self.__revision_recipients is None:
-            return super(StaticRecipientsEnvironmentMixin,
-                         self).get_refchange_recipients(revision)
-        return self.__revision_recipients
-
-
-class CLIRecipientsEnvironmentMixin(Environment):
-    """Mixin storing recipients information coming from the
-    command-line."""
-
-    def __init__(self, cli_recipients=None, **kw):
-        super(CLIRecipientsEnvironmentMixin, self).__init__(**kw)
-        self.__cli_recipients = cli_recipients
-
-    def get_refchange_recipients(self, refchange):
-        if self.__cli_recipients is None:
-            return super(CLIRecipientsEnvironmentMixin,
-                         self).get_refchange_recipients(refchange)
-        return self.__cli_recipients
-
-    def get_announce_recipients(self, annotated_tag_change):
-        if self.__cli_recipients is None:
-            return super(CLIRecipientsEnvironmentMixin,
-                         self).get_announce_recipients(annotated_tag_change)
-        return self.__cli_recipients
-
-    def get_revision_recipients(self, revision):
-        if self.__cli_recipients is None:
-            return super(CLIRecipientsEnvironmentMixin,
-                         self).get_revision_recipients(revision)
-        return self.__cli_recipients
-
-
-class ConfigRecipientsEnvironmentMixin(
-        ConfigEnvironmentMixin,
-        StaticRecipientsEnvironmentMixin
-        ):
-    """Determine recipients statically based on config."""
-
-    def __init__(self, config, **kw):
-        super(ConfigRecipientsEnvironmentMixin, self).__init__(
-            config=config,
-            refchange_recipients=self._get_recipients(
-                config, 'refchangelist', 'mailinglist',
-                ),
-            announce_recipients=self._get_recipients(
-                config, 'announcelist', 'refchangelist', 'mailinglist',
-                ),
-            revision_recipients=self._get_recipients(
-                config, 'commitlist', 'mailinglist',
-                ),
-            scancommitforcc=config.get('scancommitforcc'),
-            **kw
-            )
-
-    def _get_recipients(self, config, *names):
-        """Return the recipients for a particular type of message.
-
-        Return the list of email addresses to which a particular type
-        of notification email should be sent, by looking at the config
-        value for "multimailhook.$name" for each of names.  Use the
-        value from the first name that is configured.  The return
-        value is a (possibly empty) string containing RFC 2822 email
-        addresses separated by commas.  If no configuration could be
-        found, raise a ConfigurationException."""
-
-        for name in names:
-            lines = config.get_all(name)
-            if lines is not None:
-                lines = [line.strip() for line in lines]
-                # Single "none" is a special value equivalen to empty string.
-                if lines == ['none']:
-                    lines = ['']
-                return ', '.join(lines)
-        else:
-            return ''
-
-
-class StaticRefFilterEnvironmentMixin(Environment):
-    """Set branch filter statically based on constructor parameters."""
-
-    def __init__(self, ref_filter_incl_regex, ref_filter_excl_regex,
-                 ref_filter_do_send_regex, ref_filter_dont_send_regex,
-                 **kw):
-        super(StaticRefFilterEnvironmentMixin, self).__init__(**kw)
-
-        if ref_filter_incl_regex and ref_filter_excl_regex:
-            raise ConfigurationException(
-                "Cannot specify both a ref inclusion and exclusion regex.")
-        self.__is_inclusion_filter = bool(ref_filter_incl_regex)
-        default_exclude = self.get_default_ref_ignore_regex()
-        if ref_filter_incl_regex:
-            ref_filter_regex = ref_filter_incl_regex
-        elif ref_filter_excl_regex:
-            ref_filter_regex = ref_filter_excl_regex + '|' + default_exclude
-        else:
-            ref_filter_regex = default_exclude
-        try:
-            self.__compiled_regex = re.compile(ref_filter_regex)
-        except Exception:
-            raise ConfigurationException(
-                'Invalid Ref Filter Regex "%s": %s' % (ref_filter_regex, sys.exc_info()[1]))
-
-        if ref_filter_do_send_regex and ref_filter_dont_send_regex:
-            raise ConfigurationException(
-                "Cannot specify both a ref doSend and dontSend regex.")
-        self.__is_do_send_filter = bool(ref_filter_do_send_regex)
-        if ref_filter_do_send_regex:
-            ref_filter_send_regex = ref_filter_do_send_regex
-        elif ref_filter_dont_send_regex:
-            ref_filter_send_regex = ref_filter_dont_send_regex
-        else:
-            ref_filter_send_regex = '.*'
-            self.__is_do_send_filter = True
-        try:
-            self.__send_compiled_regex = re.compile(ref_filter_send_regex)
-        except Exception:
-            raise ConfigurationException(
-                'Invalid Ref Filter Regex "%s": %s' %
-                (ref_filter_send_regex, sys.exc_info()[1]))
-
-    def get_ref_filter_regex(self, send_filter=False):
-        if send_filter:
-            return self.__send_compiled_regex, self.__is_do_send_filter
-        else:
-            return self.__compiled_regex, self.__is_inclusion_filter
-
-
-class ConfigRefFilterEnvironmentMixin(
-        ConfigEnvironmentMixin,
-        StaticRefFilterEnvironmentMixin
-        ):
-    """Determine branch filtering statically based on config."""
-
-    def _get_regex(self, config, key):
-        """Get a list of whitespace-separated regex. The refFilter* config
-        variables are multivalued (hence the use of get_all), and we
-        allow each entry to be a whitespace-separated list (hence the
-        split on each line). The whole thing is glued into a single regex."""
-        values = config.get_all(key)
-        if values is None:
-            return values
-        items = []
-        for line in values:
-            for i in line.split():
-                items.append(i)
-        if items == []:
-            return None
-        return '|'.join(items)
-
-    def __init__(self, config, **kw):
-        super(ConfigRefFilterEnvironmentMixin, self).__init__(
-            config=config,
-            ref_filter_incl_regex=self._get_regex(config, 'refFilterInclusionRegex'),
-            ref_filter_excl_regex=self._get_regex(config, 'refFilterExclusionRegex'),
-            ref_filter_do_send_regex=self._get_regex(config, 'refFilterDoSendRegex'),
-            ref_filter_dont_send_regex=self._get_regex(config, 'refFilterDontSendRegex'),
-            **kw
-            )
-
-
-class ProjectdescEnvironmentMixin(Environment):
-    """Make a "projectdesc" value available for templates.
-
-    By default, it is set to the first line of $GIT_DIR/description
-    (if that file is present and appears to be set meaningfully)."""
-
-    def __init__(self, **kw):
-        super(ProjectdescEnvironmentMixin, self).__init__(**kw)
-        self.COMPUTED_KEYS += ['projectdesc']
-
-    def get_projectdesc(self):
-        """Return a one-line description of the project."""
-
-        git_dir = get_git_dir()
-        try:
-            projectdesc = open(os.path.join(git_dir, 'description')).readline().strip()
-            if projectdesc and not projectdesc.startswith('Unnamed repository'):
-                return projectdesc
-        except IOError:
-            pass
-
-        return 'UNNAMED PROJECT'
-
-
-class GenericEnvironmentMixin(Environment):
-    def get_pusher(self):
-        return self.osenv.get('USER', self.osenv.get('USERNAME', 'unknown user'))
-
-
-class GitoliteEnvironmentHighPrecMixin(Environment):
-    def get_pusher(self):
-        return self.osenv.get('GL_USER', 'unknown user')
-
-
-class GitoliteEnvironmentLowPrecMixin(
-        ConfigEnvironmentMixin,
-        Environment):
-
-    def get_repo_shortname(self):
-        # The gitolite environment variable $GL_REPO is a pretty good
-        # repo_shortname (though it's probably not as good as a value
-        # the user might have explicitly put in his config).
-        return (
-            self.osenv.get('GL_REPO', None) or
-            super(GitoliteEnvironmentLowPrecMixin, self).get_repo_shortname()
-            )
-
-    @staticmethod
-    def _compile_regex(re_template):
-        return (
-            re.compile(re_template % x)
-            for x in (
-                r'BEGIN\s+USER\s+EMAILS',
-                r'([^\s]+)\s+(.*)',
-                r'END\s+USER\s+EMAILS',
-                ))
-
-    def get_fromaddr(self, change=None):
-        GL_USER = self.osenv.get('GL_USER')
-        if GL_USER is not None:
-            # Find the path to gitolite.conf.  Note that gitolite v3
-            # did away with the GL_ADMINDIR and GL_CONF environment
-            # variables (they are now hard-coded).
-            GL_ADMINDIR = self.osenv.get(
-                'GL_ADMINDIR',
-                os.path.expanduser(os.path.join('~', '.gitolite')))
-            GL_CONF = self.osenv.get(
-                'GL_CONF',
-                os.path.join(GL_ADMINDIR, 'conf', 'gitolite.conf'))
-
-            mailaddress_map = self.config.get('MailaddressMap')
-            # If relative, consider relative to GL_CONF:
-            if mailaddress_map:
-                mailaddress_map = os.path.join(os.path.dirname(GL_CONF),
-                                               mailaddress_map)
-                if os.path.isfile(mailaddress_map):
-                    f = open(mailaddress_map, 'rU')
-                    try:
-                        # Leading '#' is optional
-                        re_begin, re_user, re_end = self._compile_regex(
-                            r'^(?:\s*#)?\s*%s\s*$')
-                        for l in f:
-                            l = l.rstrip('\n')
-                            if re_begin.match(l) or re_end.match(l):
-                                continue  # Ignore these lines
-                            m = re_user.match(l)
-                            if m:
-                                if m.group(1) == GL_USER:
-                                    return m.group(2)
-                                else:
-                                    continue  # Not this user, but not an error
-                            raise ConfigurationException(
-                                "Syntax error in mail address map.\n"
-                                "Check file {}.\n"
-                                "Line: {}".format(mailaddress_map, l))
-
-                    finally:
-                        f.close()
-
-            if os.path.isfile(GL_CONF):
-                f = open(GL_CONF, 'rU')
-                try:
-                    in_user_emails_section = False
-                    re_begin, re_user, re_end = self._compile_regex(
-                        r'^\s*#\s*%s\s*$')
-                    for l in f:
-                        l = l.rstrip('\n')
-                        if not in_user_emails_section:
-                            if re_begin.match(l):
-                                in_user_emails_section = True
-                            continue
-                        if re_end.match(l):
-                            break
-                        m = re_user.match(l)
-                        if m and m.group(1) == GL_USER:
-                            return m.group(2)
-                finally:
-                    f.close()
-        return super(GitoliteEnvironmentLowPrecMixin, self).get_fromaddr(change)
-
-
-class IncrementalDateTime(object):
-    """Simple wrapper to give incremental date/times.
-
-    Each call will result in a date/time a second later than the
-    previous call.  This can be used to falsify email headers, to
-    increase the likelihood that email clients sort the emails
-    correctly."""
-
-    def __init__(self):
-        self.time = time.time()
-        self.next = self.__next__  # Python 2 backward compatibility
-
-    def __next__(self):
-        formatted = formatdate(self.time, True)
-        self.time += 1
-        return formatted
-
-
-class StashEnvironmentHighPrecMixin(Environment):
-    def __init__(self, user=None, repo=None, **kw):
-        super(StashEnvironmentHighPrecMixin,
-              self).__init__(user=user, repo=repo, **kw)
-        self.__user = user
-        self.__repo = repo
-
-    def get_pusher(self):
-        return re.match(r'(.*?)\s*<', self.__user).group(1)
-
-    def get_pusher_email(self):
-        return self.__user
-
-
-class StashEnvironmentLowPrecMixin(Environment):
-    def __init__(self, user=None, repo=None, **kw):
-        super(StashEnvironmentLowPrecMixin, self).__init__(**kw)
-        self.__repo = repo
-        self.__user = user
-
-    def get_repo_shortname(self):
-        return self.__repo
-
-    def get_fromaddr(self, change=None):
-        return self.__user
-
-
-class GerritEnvironmentHighPrecMixin(Environment):
-    def __init__(self, project=None, submitter=None, update_method=None, **kw):
-        super(GerritEnvironmentHighPrecMixin,
-              self).__init__(submitter=submitter, project=project, **kw)
-        self.__project = project
-        self.__submitter = submitter
-        self.__update_method = update_method
-        "Make an 'update_method' value available for templates."
-        self.COMPUTED_KEYS += ['update_method']
-
-    def get_pusher(self):
-        if self.__submitter:
-            if self.__submitter.find('<') != -1:
-                # Submitter has a configured email, we transformed
-                # __submitter into an RFC 2822 string already.
-                return re.match(r'(.*?)\s*<', self.__submitter).group(1)
-            else:
-                # Submitter has no configured email, it's just his name.
-                return self.__submitter
-        else:
-            # If we arrive here, this means someone pushed "Submit" from
-            # the gerrit web UI for the CR (or used one of the programmatic
-            # APIs to do the same, such as gerrit review) and the
-            # merge/push was done by the Gerrit user.  It was technically
-            # triggered by someone else, but sadly we have no way of
-            # determining who that someone else is at this point.
-            return 'Gerrit'  # 'unknown user'?
-
-    def get_pusher_email(self):
-        if self.__submitter:
-            return self.__submitter
-        else:
-            return super(GerritEnvironmentHighPrecMixin, self).get_pusher_email()
-
-    def get_default_ref_ignore_regex(self):
-        default = super(GerritEnvironmentHighPrecMixin, self).get_default_ref_ignore_regex()
-        return default + '|^refs/changes/|^refs/cache-automerge/|^refs/meta/'
-
-    def get_revision_recipients(self, revision):
-        # Merge commits created by Gerrit when users hit "Submit this patchset"
-        # in the Web UI (or do equivalently with REST APIs or the gerrit review
-        # command) are not something users want to see an individual email for.
-        # Filter them out.
-        committer = read_git_output(['log', '--no-walk', '--format=%cN',
-                                     revision.rev.sha1])
-        if committer == 'Gerrit Code Review':
-            return []
-        else:
-            return super(GerritEnvironmentHighPrecMixin, self).get_revision_recipients(revision)
-
-    def get_update_method(self):
-        return self.__update_method
-
-
-class GerritEnvironmentLowPrecMixin(Environment):
-    def __init__(self, project=None, submitter=None, **kw):
-        super(GerritEnvironmentLowPrecMixin, self).__init__(**kw)
-        self.__project = project
-        self.__submitter = submitter
-
-    def get_repo_shortname(self):
-        return self.__project
-
-    def get_fromaddr(self, change=None):
-        if self.__submitter and self.__submitter.find('<') != -1:
-            return self.__submitter
-        else:
-            return super(GerritEnvironmentLowPrecMixin, self).get_fromaddr(change)
-
-
-class Push(object):
-    """Represent an entire push (i.e., a group of ReferenceChanges).
-
-    It is easy to figure out what commits were added to a *branch* by
-    a Reference change:
-
-        git rev-list change.old..change.new
-
-    or removed from a *branch*:
-
-        git rev-list change.new..change.old
-
-    But it is not quite so trivial to determine which entirely new
-    commits were added to the *repository* by a push and which old
-    commits were discarded by a push.  A big part of the job of this
-    class is to figure out these things, and to make sure that new
-    commits are only detailed once even if they were added to multiple
-    references.
-
-    The first step is to determine the "other" references--those
-    unaffected by the current push.  They are computed by listing all
-    references then removing any affected by this push.  The results
-    are stored in Push._other_ref_sha1s.
-
-    The commits contained in the repository before this push were
-
-        git rev-list other1 other2 other3 ... change1.old change2.old ...
-
-    Where "changeN.old" is the old value of one of the references
-    affected by this push.
-
-    The commits contained in the repository after this push are
-
-        git rev-list other1 other2 other3 ... change1.new change2.new ...
-
-    The commits added by this push are the difference between these
-    two sets, which can be written
-
-        git rev-list \
-            ^other1 ^other2 ... \
-            ^change1.old ^change2.old ... \
-            change1.new change2.new ...
-
-    The commits removed by this push can be computed by
-
-        git rev-list \
-            ^other1 ^other2 ... \
-            ^change1.new ^change2.new ... \
-            change1.old change2.old ...
-
-    The last point is that it is possible that other pushes are
-    occurring simultaneously to this one, so reference values can
-    change at any time.  It is impossible to eliminate all race
-    conditions, but we reduce the window of time during which problems
-    can occur by translating reference names to SHA1s as soon as
-    possible and working with SHA1s thereafter (because SHA1s are
-    immutable)."""
-
-    # A map {(changeclass, changetype): integer} specifying the order
-    # that reference changes will be processed if multiple reference
-    # changes are included in a single push.  The order is significant
-    # mostly because new commit notifications are threaded together
-    # with the first reference change that includes the commit.  The
-    # following order thus causes commits to be grouped with branch
-    # changes (as opposed to tag changes) if possible.
-    SORT_ORDER = dict(
-        (value, i) for (i, value) in enumerate([
-            (BranchChange, 'update'),
-            (BranchChange, 'create'),
-            (AnnotatedTagChange, 'update'),
-            (AnnotatedTagChange, 'create'),
-            (NonAnnotatedTagChange, 'update'),
-            (NonAnnotatedTagChange, 'create'),
-            (BranchChange, 'delete'),
-            (AnnotatedTagChange, 'delete'),
-            (NonAnnotatedTagChange, 'delete'),
-            (OtherReferenceChange, 'update'),
-            (OtherReferenceChange, 'create'),
-            (OtherReferenceChange, 'delete'),
-            ])
-        )
-
-    def __init__(self, environment, changes, ignore_other_refs=False):
-        self.changes = sorted(changes, key=self._sort_key)
-        self.__other_ref_sha1s = None
-        self.__cached_commits_spec = {}
-        self.environment = environment
-
-        if ignore_other_refs:
-            self.__other_ref_sha1s = set()
-
-    @classmethod
-    def _sort_key(klass, change):
-        return (klass.SORT_ORDER[change.__class__, change.change_type], change.refname,)
-
-    @property
-    def _other_ref_sha1s(self):
-        """The GitObjects referred to by references unaffected by this push.
-        """
-        if self.__other_ref_sha1s is None:
-            # The refnames being changed by this push:
-            updated_refs = set(
-                change.refname
-                for change in self.changes
-                )
-
-            # The SHA-1s of commits referred to by all references in this
-            # repository *except* updated_refs:
-            sha1s = set()
-            fmt = (
-                '%(objectname) %(objecttype) %(refname)\n'
-                '%(*objectname) %(*objecttype) %(refname)'
-                )
-            ref_filter_regex, is_inclusion_filter = \
-                self.environment.get_ref_filter_regex()
-            for line in read_git_lines(
-                    ['for-each-ref', '--format=%s' % (fmt,)]):
-                (sha1, type, name) = line.split(' ', 2)
-                if (sha1 and type == 'commit' and
-                        name not in updated_refs and
-                        include_ref(name, ref_filter_regex, is_inclusion_filter)):
-                    sha1s.add(sha1)
-
-            self.__other_ref_sha1s = sha1s
-
-        return self.__other_ref_sha1s
-
-    def _get_commits_spec_incl(self, new_or_old, reference_change=None):
-        """Get new or old SHA-1 from one or each of the changed refs.
-
-        Return a list of SHA-1 commit identifier strings suitable as
-        arguments to 'git rev-list' (or 'git log' or ...).  The
-        returned identifiers are either the old or new values from one
-        or all of the changed references, depending on the values of
-        new_or_old and reference_change.
-
-        new_or_old is either the string 'new' or the string 'old'.  If
-        'new', the returned SHA-1 identifiers are the new values from
-        each changed reference.  If 'old', the SHA-1 identifiers are
-        the old values from each changed reference.
-
-        If reference_change is specified and not None, only the new or
-        old reference from the specified reference is included in the
-        return value.
-
-        This function returns None if there are no matching revisions
-        (e.g., because a branch was deleted and new_or_old is 'new').
-        """
-
-        if not reference_change:
-            incl_spec = sorted(
-                getattr(change, new_or_old).sha1
-                for change in self.changes
-                if getattr(change, new_or_old)
-                )
-            if not incl_spec:
-                incl_spec = None
-        elif not getattr(reference_change, new_or_old).commit_sha1:
-            incl_spec = None
-        else:
-            incl_spec = [getattr(reference_change, new_or_old).commit_sha1]
-        return incl_spec
-
-    def _get_commits_spec_excl(self, new_or_old):
-        """Get exclusion revisions for determining new or discarded commits.
-
-        Return a list of strings suitable as arguments to 'git
-        rev-list' (or 'git log' or ...) that will exclude all
-        commits that, depending on the value of new_or_old, were
-        either previously in the repository (useful for determining
-        which commits are new to the repository) or currently in the
-        repository (useful for determining which commits were
-        discarded from the repository).
-
-        new_or_old is either the string 'new' or the string 'old'.  If
-        'new', the commits to be excluded are those that were in the
-        repository before the push.  If 'old', the commits to be
-        excluded are those that are currently in the repository.  """
-
-        old_or_new = {'old': 'new', 'new': 'old'}[new_or_old]
-        excl_revs = self._other_ref_sha1s.union(
-            getattr(change, old_or_new).sha1
-            for change in self.changes
-            if getattr(change, old_or_new).type in ['commit', 'tag']
-            )
-        return ['^' + sha1 for sha1 in sorted(excl_revs)]
-
-    def get_commits_spec(self, new_or_old, reference_change=None):
-        """Get rev-list arguments for added or discarded commits.
-
-        Return a list of strings suitable as arguments to 'git
-        rev-list' (or 'git log' or ...) that select those commits
-        that, depending on the value of new_or_old, are either new to
-        the repository or were discarded from the repository.
-
-        new_or_old is either the string 'new' or the string 'old'.  If
-        'new', the returned list is used to select commits that are
-        new to the repository.  If 'old', the returned value is used
-        to select the commits that have been discarded from the
-        repository.
-
-        If reference_change is specified and not None, the new or
-        discarded commits are limited to those that are reachable from
-        the new or old value of the specified reference.
-
-        This function returns None if there are no added (or discarded)
-        revisions.
-        """
-        key = (new_or_old, reference_change)
-        if key not in self.__cached_commits_spec:
-            ret = self._get_commits_spec_incl(new_or_old, reference_change)
-            if ret is not None:
-                ret.extend(self._get_commits_spec_excl(new_or_old))
-            self.__cached_commits_spec[key] = ret
-        return self.__cached_commits_spec[key]
-
-    def get_new_commits(self, reference_change=None):
-        """Return a list of commits added by this push.
-
-        Return a list of the object names of commits that were added
-        by the part of this push represented by reference_change.  If
-        reference_change is None, then return a list of *all* commits
-        added by this push."""
-
-        spec = self.get_commits_spec('new', reference_change)
-        return git_rev_list(spec)
-
-    def get_discarded_commits(self, reference_change):
-        """Return a list of commits discarded by this push.
-
-        Return a list of the object names of commits that were
-        entirely discarded from the repository by the part of this
-        push represented by reference_change."""
-
-        spec = self.get_commits_spec('old', reference_change)
-        return git_rev_list(spec)
-
-    def send_emails(self, mailer, body_filter=None):
-        """Use send all of the notification emails needed for this push.
-
-        Use send all of the notification emails (including reference
-        change emails and commit emails) needed for this push.  Send
-        the emails using mailer.  If body_filter is not None, then use
-        it to filter the lines that are intended for the email
-        body."""
-
-        # The sha1s of commits that were introduced by this push.
-        # They will be removed from this set as they are processed, to
-        # guarantee that one (and only one) email is generated for
-        # each new commit.
-        unhandled_sha1s = set(self.get_new_commits())
-        send_date = IncrementalDateTime()
-        for change in self.changes:
-            sha1s = []
-            for sha1 in reversed(list(self.get_new_commits(change))):
-                if sha1 in unhandled_sha1s:
-                    sha1s.append(sha1)
-                    unhandled_sha1s.remove(sha1)
-
-            # Check if we've got anyone to send to
-            if not change.recipients:
-                change.environment.log_warning(
-                    '*** no recipients configured so no email will be sent\n'
-                    '*** for %r update %s->%s'
-                    % (change.refname, change.old.sha1, change.new.sha1,)
-                    )
-            else:
-                if not change.environment.quiet:
-                    change.environment.log_msg(
-                        'Sending notification emails to: %s' % (change.recipients,))
-                extra_values = {'send_date': next(send_date)}
-
-                rev = change.send_single_combined_email(sha1s)
-                if rev:
-                    mailer.send(
-                        change.generate_combined_email(self, rev, body_filter, extra_values),
-                        rev.recipients,
-                        )
-                    # This change is now fully handled; no need to handle
-                    # individual revisions any further.
-                    continue
-                else:
-                    mailer.send(
-                        change.generate_email(self, body_filter, extra_values),
-                        change.recipients,
-                        )
-
-            max_emails = change.environment.maxcommitemails
-            if max_emails and len(sha1s) > max_emails:
-                change.environment.log_warning(
-                    '*** Too many new commits (%d), not sending commit emails.\n' % len(sha1s) +
-                    '*** Try setting multimailhook.maxCommitEmails to a greater value\n' +
-                    '*** Currently, multimailhook.maxCommitEmails=%d' % max_emails
-                    )
-                return
-
-            for (num, sha1) in enumerate(sha1s):
-                rev = Revision(change, GitObject(sha1), num=num + 1, tot=len(sha1s))
-                if len(rev.parents) > 1 and change.environment.excludemergerevisions:
-                    # skipping a merge commit
-                    continue
-                if not rev.recipients and rev.cc_recipients:
-                    change.environment.log_msg('*** Replacing Cc: with To:')
-                    rev.recipients = rev.cc_recipients
-                    rev.cc_recipients = None
-                if rev.recipients:
-                    extra_values = {'send_date': next(send_date)}
-                    mailer.send(
-                        rev.generate_email(self, body_filter, extra_values),
-                        rev.recipients,
-                        )
-
-        # Consistency check:
-        if unhandled_sha1s:
-            change.environment.log_error(
-                'ERROR: No emails were sent for the following new commits:\n'
-                '    %s'
-                % ('\n    '.join(sorted(unhandled_sha1s)),)
-                )
-
-
-def include_ref(refname, ref_filter_regex, is_inclusion_filter):
-    does_match = bool(ref_filter_regex.search(refname))
-    if is_inclusion_filter:
-        return does_match
-    else:  # exclusion filter -- we include the ref if the regex doesn't match
-        return not does_match
-
-
-def run_as_post_receive_hook(environment, mailer):
-    environment.check()
-    send_filter_regex, send_is_inclusion_filter = environment.get_ref_filter_regex(True)
-    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(False)
-    changes = []
-    while True:
-        line = read_line(sys.stdin)
-        if line == '':
-            break
-        (oldrev, newrev, refname) = line.strip().split(' ', 2)
-        environment.get_logger().debug(
-            "run_as_post_receive_hook: oldrev=%s, newrev=%s, refname=%s" %
-            (oldrev, newrev, refname))
-
-        if not include_ref(refname, ref_filter_regex, is_inclusion_filter):
-            continue
-        if not include_ref(refname, send_filter_regex, send_is_inclusion_filter):
-            continue
-        changes.append(
-            ReferenceChange.create(environment, oldrev, newrev, refname)
-            )
-    if not changes:
-        mailer.close()
-        return
-    push = Push(environment, changes)
-    try:
-        push.send_emails(mailer, body_filter=environment.filter_body)
-    finally:
-        mailer.close()
-
-
-def run_as_update_hook(environment, mailer, refname, oldrev, newrev, force_send=False):
-    environment.check()
-    send_filter_regex, send_is_inclusion_filter = environment.get_ref_filter_regex(True)
-    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(False)
-    if not include_ref(refname, ref_filter_regex, is_inclusion_filter):
-        return
-    if not include_ref(refname, send_filter_regex, send_is_inclusion_filter):
-        return
-    changes = [
-        ReferenceChange.create(
-            environment,
-            read_git_output(['rev-parse', '--verify', oldrev]),
-            read_git_output(['rev-parse', '--verify', newrev]),
-            refname,
-            ),
-        ]
-    if not changes:
-        mailer.close()
-        return
-    push = Push(environment, changes, force_send)
-    try:
-        push.send_emails(mailer, body_filter=environment.filter_body)
-    finally:
-        mailer.close()
-
-
-def check_ref_filter(environment):
-    send_filter_regex, send_is_inclusion = environment.get_ref_filter_regex(True)
-    ref_filter_regex, ref_is_inclusion = environment.get_ref_filter_regex(False)
-
-    def inc_exc_lusion(b):
-        if b:
-            return 'inclusion'
-        else:
-            return 'exclusion'
-
-    if send_filter_regex:
-        sys.stdout.write("DoSend/DontSend filter regex (" +
-                         (inc_exc_lusion(send_is_inclusion)) +
-                         '): ' + send_filter_regex.pattern +
-                         '\n')
-    if send_filter_regex:
-        sys.stdout.write("Include/Exclude filter regex (" +
-                         (inc_exc_lusion(ref_is_inclusion)) +
-                         '): ' + ref_filter_regex.pattern +
-                         '\n')
-    sys.stdout.write(os.linesep)
-
-    sys.stdout.write(
-        "Refs marked as EXCLUDE are excluded by either refFilterInclusionRegex\n"
-        "or refFilterExclusionRegex. No emails will be sent for commits included\n"
-        "in these refs.\n"
-        "Refs marked as DONT-SEND are excluded by either refFilterDoSendRegex or\n"
-        "refFilterDontSendRegex, but not by either refFilterInclusionRegex or\n"
-        "refFilterExclusionRegex. Emails will be sent for commits included in these\n"
-        "refs only when the commit reaches a ref which isn't excluded.\n"
-        "Refs marked as DO-SEND are not excluded by any filter. Emails will\n"
-        "be sent normally for commits included in these refs.\n")
-
-    sys.stdout.write(os.linesep)
-
-    for refname in read_git_lines(['for-each-ref', '--format', '%(refname)']):
-        sys.stdout.write(refname)
-        if not include_ref(refname, ref_filter_regex, ref_is_inclusion):
-            sys.stdout.write(' EXCLUDE')
-        elif not include_ref(refname, send_filter_regex, send_is_inclusion):
-            sys.stdout.write(' DONT-SEND')
-        else:
-            sys.stdout.write(' DO-SEND')
-
-        sys.stdout.write(os.linesep)
-
-
-def show_env(environment, out):
-    out.write('Environment values:\n')
-    for (k, v) in sorted(environment.get_values().items()):
-        if k:  # Don't show the {'' : ''} pair.
-            out.write('    %s : %r\n' % (k, v))
-    out.write('\n')
-    # Flush to avoid interleaving with further log output
-    out.flush()
-
-
-def check_setup(environment):
-    environment.check()
-    show_env(environment, sys.stdout)
-    sys.stdout.write("Now, checking that git-multimail's standard input "
-                     "is properly set ..." + os.linesep)
-    sys.stdout.write("Please type some text and then press Return" + os.linesep)
-    stdin = sys.stdin.readline()
-    sys.stdout.write("You have just entered:" + os.linesep)
-    sys.stdout.write(stdin)
-    sys.stdout.write("git-multimail seems properly set up." + os.linesep)
-
-
-def choose_mailer(config, environment):
-    mailer = config.get('mailer', default='sendmail')
-
-    if mailer == 'smtp':
-        smtpserver = config.get('smtpserver', default='localhost')
-        smtpservertimeout = float(config.get('smtpservertimeout', default=10.0))
-        smtpserverdebuglevel = int(config.get('smtpserverdebuglevel', default=0))
-        smtpencryption = config.get('smtpencryption', default='none')
-        smtpuser = config.get('smtpuser', default='')
-        smtppass = config.get('smtppass', default='')
-        smtpcacerts = config.get('smtpcacerts', default='')
-        mailer = SMTPMailer(
-            environment,
-            envelopesender=(environment.get_sender() or environment.get_fromaddr()),
-            smtpserver=smtpserver, smtpservertimeout=smtpservertimeout,
-            smtpserverdebuglevel=smtpserverdebuglevel,
-            smtpencryption=smtpencryption,
-            smtpuser=smtpuser,
-            smtppass=smtppass,
-            smtpcacerts=smtpcacerts
-            )
-    elif mailer == 'sendmail':
-        command = config.get('sendmailcommand')
-        if command:
-            command = shlex.split(command)
-        mailer = SendMailer(environment,
-                            command=command, envelopesender=environment.get_sender())
-    else:
-        environment.log_error(
-            'fatal: multimailhook.mailer is set to an incorrect value: "%s"\n' % mailer +
-            'please use one of "smtp" or "sendmail".'
-            )
-        sys.exit(1)
-    return mailer
-
-
-KNOWN_ENVIRONMENTS = {
-    'generic': {'highprec': GenericEnvironmentMixin},
-    'gitolite': {'highprec': GitoliteEnvironmentHighPrecMixin,
-                 'lowprec': GitoliteEnvironmentLowPrecMixin},
-    'stash': {'highprec': StashEnvironmentHighPrecMixin,
-              'lowprec': StashEnvironmentLowPrecMixin},
-    'gerrit': {'highprec': GerritEnvironmentHighPrecMixin,
-               'lowprec': GerritEnvironmentLowPrecMixin},
-    }
-
-
-def choose_environment(config, osenv=None, env=None, recipients=None,
-                       hook_info=None):
-    env_name = choose_environment_name(config, env, osenv)
-    environment_klass = build_environment_klass(env_name)
-    env = build_environment(environment_klass, env_name, config,
-                            osenv, recipients, hook_info)
-    return env
-
-
-def choose_environment_name(config, env, osenv):
-    if not osenv:
-        osenv = os.environ
-
-    if not env:
-        env = config.get('environment')
-
-    if not env:
-        if 'GL_USER' in osenv and 'GL_REPO' in osenv:
-            env = 'gitolite'
-        else:
-            env = 'generic'
-    return env
-
-
-COMMON_ENVIRONMENT_MIXINS = [
-    ConfigRecipientsEnvironmentMixin,
-    CLIRecipientsEnvironmentMixin,
-    ConfigRefFilterEnvironmentMixin,
-    ProjectdescEnvironmentMixin,
-    ConfigMaxlinesEnvironmentMixin,
-    ComputeFQDNEnvironmentMixin,
-    ConfigFilterLinesEnvironmentMixin,
-    PusherDomainEnvironmentMixin,
-    ConfigOptionsEnvironmentMixin,
-    ]
-
-
-def build_environment_klass(env_name):
-    if 'class' in KNOWN_ENVIRONMENTS[env_name]:
-        return KNOWN_ENVIRONMENTS[env_name]['class']
-
-    environment_mixins = []
-    known_env = KNOWN_ENVIRONMENTS[env_name]
-    if 'highprec' in known_env:
-        high_prec_mixin = known_env['highprec']
-        environment_mixins.append(high_prec_mixin)
-    environment_mixins = environment_mixins + COMMON_ENVIRONMENT_MIXINS
-    if 'lowprec' in known_env:
-        low_prec_mixin = known_env['lowprec']
-        environment_mixins.append(low_prec_mixin)
-    environment_mixins.append(Environment)
-    klass_name = env_name.capitalize() + 'Environment'
-    environment_klass = type(
-        klass_name,
-        tuple(environment_mixins),
-        {},
-        )
-    KNOWN_ENVIRONMENTS[env_name]['class'] = environment_klass
-    return environment_klass
-
-
-GerritEnvironment = build_environment_klass('gerrit')
-StashEnvironment = build_environment_klass('stash')
-GitoliteEnvironment = build_environment_klass('gitolite')
-GenericEnvironment = build_environment_klass('generic')
-
-
-def build_environment(environment_klass, env, config,
-                      osenv, recipients, hook_info):
-    environment_kw = {
-        'osenv': osenv,
-        'config': config,
-        }
-
-    if env == 'stash':
-        environment_kw['user'] = hook_info['stash_user']
-        environment_kw['repo'] = hook_info['stash_repo']
-    elif env == 'gerrit':
-        environment_kw['project'] = hook_info['project']
-        environment_kw['submitter'] = hook_info['submitter']
-        environment_kw['update_method'] = hook_info['update_method']
-
-    environment_kw['cli_recipients'] = recipients
-
-    return environment_klass(**environment_kw)
-
-
-def get_version():
-    oldcwd = os.getcwd()
-    try:
-        try:
-            os.chdir(os.path.dirname(os.path.realpath(__file__)))
-            git_version = read_git_output(['describe', '--tags', 'HEAD'])
-            if git_version == __version__:
-                return git_version
-            else:
-                return '%s (%s)' % (__version__, git_version)
-        except:
-            pass
-    finally:
-        os.chdir(oldcwd)
-    return __version__
-
-
-def compute_gerrit_options(options, args, required_gerrit_options,
-                           raw_refname):
-    if None in required_gerrit_options:
-        raise SystemExit("Error: Specify all of --oldrev, --newrev, --refname, "
-                         "and --project; or none of them.")
-
-    if options.environment not in (None, 'gerrit'):
-        raise SystemExit("Non-gerrit environments incompatible with --oldrev, "
-                         "--newrev, --refname, and --project")
-    options.environment = 'gerrit'
-
-    if args:
-        raise SystemExit("Error: Positional parameters not allowed with "
-                         "--oldrev, --newrev, and --refname.")
-
-    # Gerrit oddly omits 'refs/heads/' in the refname when calling
-    # ref-updated hook; put it back.
-    git_dir = get_git_dir()
-    if (not os.path.exists(os.path.join(git_dir, raw_refname)) and
-        os.path.exists(os.path.join(git_dir, 'refs', 'heads',
-                                    raw_refname))):
-        options.refname = 'refs/heads/' + options.refname
-
-    # New revisions can appear in a gerrit repository either due to someone
-    # pushing directly (in which case options.submitter will be set), or they
-    # can press "Submit this patchset" in the web UI for some CR (in which
-    # case options.submitter will not be set and gerrit will not have provided
-    # us the information about who pressed the button).
-    #
-    # Note for the nit-picky: I'm lumping in REST API calls and the ssh
-    # gerrit review command in with "Submit this patchset" button, since they
-    # have the same effect.
-    if options.submitter:
-        update_method = 'pushed'
-        # The submitter argument is almost an RFC 2822 email address; change it
-        # from 'User Name (email@domain)' to 'User Name <email@domain>' so it is
-        options.submitter = options.submitter.replace('(', '<').replace(')', '>')
-    else:
-        update_method = 'submitted'
-        # Gerrit knew who submitted this patchset, but threw that information
-        # away when it invoked this hook.  However, *IF* Gerrit created a
-        # merge to bring the patchset in (project 'Submit Type' is either
-        # "Always Merge", or is "Merge if Necessary" and happens to be
-        # necessary for this particular CR), then it will have the committer
-        # of that merge be 'Gerrit Code Review' and the author will be the
-        # person who requested the submission of the CR.  Since this is fairly
-        # likely for most gerrit installations (of a reasonable size), it's
-        # worth the extra effort to try to determine the actual submitter.
-        rev_info = read_git_lines(['log', '--no-walk', '--merges',
-                                   '--format=%cN%n%aN <%aE>', options.newrev])
-        if rev_info and rev_info[0] == 'Gerrit Code Review':
-            options.submitter = rev_info[1]
-
-    # We pass back refname, oldrev, newrev as args because then the
-    # gerrit ref-updated hook is much like the git update hook
-    return (options,
-            [options.refname, options.oldrev, options.newrev],
-            {'project': options.project, 'submitter': options.submitter,
-             'update_method': update_method})
-
-
-def check_hook_specific_args(options, args):
-    raw_refname = options.refname
-    # Convert each string option unicode for Python3.
-    if PYTHON3:
-        opts = ['environment', 'recipients', 'oldrev', 'newrev', 'refname',
-                'project', 'submitter', 'stash_user', 'stash_repo']
-        for opt in opts:
-            if not hasattr(options, opt):
-                continue
-            obj = getattr(options, opt)
-            if obj:
-                enc = obj.encode('utf-8', 'surrogateescape')
-                dec = enc.decode('utf-8', 'replace')
-                setattr(options, opt, dec)
-
-    # First check for stash arguments
-    if (options.stash_user is None) != (options.stash_repo is None):
-        raise SystemExit("Error: Specify both of --stash-user and "
-                         "--stash-repo or neither.")
-    if options.stash_user:
-        options.environment = 'stash'
-        return options, args, {'stash_user': options.stash_user,
-                               'stash_repo': options.stash_repo}
-
-    # Finally, check for gerrit specific arguments
-    required_gerrit_options = (options.oldrev, options.newrev, options.refname,
-                               options.project)
-    if required_gerrit_options != (None,) * 4:
-        return compute_gerrit_options(options, args, required_gerrit_options,
-                                      raw_refname)
-
-    # No special options in use, just return what we started with
-    return options, args, {}
-
-
-class Logger(object):
-    def parse_verbose(self, verbose):
-        if verbose > 0:
-            return logging.DEBUG
-        else:
-            return logging.INFO
-
-    def create_log_file(self, environment, name, path, verbosity):
-        log_file = logging.getLogger(name)
-        file_handler = logging.FileHandler(path)
-        log_fmt = logging.Formatter("%(asctime)s [%(levelname)-5.5s]  %(message)s")
-        file_handler.setFormatter(log_fmt)
-        log_file.addHandler(file_handler)
-        log_file.setLevel(verbosity)
-        return log_file
-
-    def __init__(self, environment):
-        self.environment = environment
-        self.loggers = []
-        stderr_log = logging.getLogger('git_multimail.stderr')
-
-        class EncodedStderr(object):
-            def write(self, x):
-                write_str(sys.stderr, x)
-
-            def flush(self):
-                sys.stderr.flush()
-
-        stderr_handler = logging.StreamHandler(EncodedStderr())
-        stderr_log.addHandler(stderr_handler)
-        stderr_log.setLevel(self.parse_verbose(environment.verbose))
-        self.loggers.append(stderr_log)
-
-        if environment.debug_log_file is not None:
-            debug_log_file = self.create_log_file(
-                environment, 'git_multimail.debug', environment.debug_log_file, logging.DEBUG)
-            self.loggers.append(debug_log_file)
-
-        if environment.log_file is not None:
-            log_file = self.create_log_file(
-                environment, 'git_multimail.file', environment.log_file, logging.INFO)
-            self.loggers.append(log_file)
-
-        if environment.error_log_file is not None:
-            error_log_file = self.create_log_file(
-                environment, 'git_multimail.error', environment.error_log_file, logging.ERROR)
-            self.loggers.append(error_log_file)
-
-    def info(self, msg, *args, **kwargs):
-        for l in self.loggers:
-            l.info(msg, *args, **kwargs)
-
-    def debug(self, msg, *args, **kwargs):
-        for l in self.loggers:
-            l.debug(msg, *args, **kwargs)
-
-    def warning(self, msg, *args, **kwargs):
-        for l in self.loggers:
-            l.warning(msg, *args, **kwargs)
-
-    def error(self, msg, *args, **kwargs):
-        for l in self.loggers:
-            l.error(msg, *args, **kwargs)
-
-
-def main(args):
-    parser = optparse.OptionParser(
-        description=__doc__,
-        usage='%prog [OPTIONS]\n   or: %prog [OPTIONS] REFNAME OLDREV NEWREV',
-        )
-
-    parser.add_option(
-        '--environment', '--env', action='store', type='choice',
-        choices=list(KNOWN_ENVIRONMENTS.keys()), default=None,
-        help=(
-            'Choose type of environment is in use.  Default is taken from '
-            'multimailhook.environment if set; otherwise "generic".'
-            ),
-        )
-    parser.add_option(
-        '--stdout', action='store_true', default=False,
-        help='Output emails to stdout rather than sending them.',
-        )
-    parser.add_option(
-        '--recipients', action='store', default=None,
-        help='Set list of email recipients for all types of emails.',
-        )
-    parser.add_option(
-        '--show-env', action='store_true', default=False,
-        help=(
-            'Write to stderr the values determined for the environment '
-            '(intended for debugging purposes), then proceed normally.'
-            ),
-        )
-    parser.add_option(
-        '--force-send', action='store_true', default=False,
-        help=(
-            'Force sending refchange email when using as an update hook. '
-            'This is useful to work around the unreliable new commits '
-            'detection in this mode.'
-            ),
-        )
-    parser.add_option(
-        '-c', metavar="<name>=<value>", action='append',
-        help=(
-            'Pass a configuration parameter through to git.  The value given '
-            'will override values from configuration files.  See the -c option '
-            'of git(1) for more details.  (Only works with git >= 1.7.3)'
-            ),
-        )
-    parser.add_option(
-        '--version', '-v', action='store_true', default=False,
-        help=(
-            "Display git-multimail's version"
-            ),
-        )
-
-    parser.add_option(
-        '--python-version', action='store_true', default=False,
-        help=(
-            "Display the version of Python used by git-multimail"
-            ),
-        )
-
-    parser.add_option(
-        '--check-ref-filter', action='store_true', default=False,
-        help=(
-            'List refs and show information on how git-multimail '
-            'will process them.'
-            )
-        )
-
-    # The following options permit this script to be run as a gerrit
-    # ref-updated hook.  See e.g.
-    # code.google.com/p/gerrit/source/browse/Documentation/config-hooks.txt
-    # We suppress help for these items, since these are specific to gerrit,
-    # and we don't want users directly using them any way other than how the
-    # gerrit ref-updated hook is called.
-    parser.add_option('--oldrev', action='store', help=optparse.SUPPRESS_HELP)
-    parser.add_option('--newrev', action='store', help=optparse.SUPPRESS_HELP)
-    parser.add_option('--refname', action='store', help=optparse.SUPPRESS_HELP)
-    parser.add_option('--project', action='store', help=optparse.SUPPRESS_HELP)
-    parser.add_option('--submitter', action='store', help=optparse.SUPPRESS_HELP)
-
-    # The following allow this to be run as a stash asynchronous post-receive
-    # hook (almost identical to a git post-receive hook but triggered also for
-    # merges of pull requests from the UI).  We suppress help for these items,
-    # since these are specific to stash.
-    parser.add_option('--stash-user', action='store', help=optparse.SUPPRESS_HELP)
-    parser.add_option('--stash-repo', action='store', help=optparse.SUPPRESS_HELP)
-
-    (options, args) = parser.parse_args(args)
-    (options, args, hook_info) = check_hook_specific_args(options, args)
-
-    if options.version:
-        sys.stdout.write('git-multimail version ' + get_version() + '\n')
-        return
-
-    if options.python_version:
-        sys.stdout.write('Python version ' + sys.version + '\n')
-        return
-
-    if options.c:
-        Config.add_config_parameters(options.c)
-
-    config = Config('multimailhook')
-
-    environment = None
-    try:
-        environment = choose_environment(
-            config, osenv=os.environ,
-            env=options.environment,
-            recipients=options.recipients,
-            hook_info=hook_info,
-            )
-
-        if options.show_env:
-            show_env(environment, sys.stderr)
-
-        if options.stdout or environment.stdout:
-            mailer = OutputMailer(sys.stdout, environment)
-        else:
-            mailer = choose_mailer(config, environment)
-
-        must_check_setup = os.environ.get('GIT_MULTIMAIL_CHECK_SETUP')
-        if must_check_setup == '':
-            must_check_setup = False
-        if options.check_ref_filter:
-            check_ref_filter(environment)
-        elif must_check_setup:
-            check_setup(environment)
-        # Dual mode: if arguments were specified on the command line, run
-        # like an update hook; otherwise, run as a post-receive hook.
-        elif args:
-            if len(args) != 3:
-                parser.error('Need zero or three non-option arguments')
-            (refname, oldrev, newrev) = args
-            environment.get_logger().debug(
-                "run_as_update_hook: refname=%s, oldrev=%s, newrev=%s, force_send=%s" %
-                (refname, oldrev, newrev, options.force_send))
-            run_as_update_hook(environment, mailer, refname, oldrev, newrev, options.force_send)
-        else:
-            run_as_post_receive_hook(environment, mailer)
-    except ConfigurationException:
-        sys.exit(sys.exc_info()[1])
-    except SystemExit:
-        raise
-    except Exception:
-        t, e, tb = sys.exc_info()
-        import traceback
-        sys.stderr.write('\n')  # Avoid mixing message with previous output
-        msg = (
-            'Exception \'' + t.__name__ +
-            '\' raised. Please report this as a bug to\n'
-            'https://github.com/git-multimail/git-multimail/issues\n'
-            'with the information below:\n\n'
-            'git-multimail version ' + get_version() + '\n'
-            'Python version ' + sys.version + '\n' +
-            traceback.format_exc())
-        try:
-            environment.get_logger().error(msg)
-        except:
-            sys.stderr.write(msg)
-        sys.exit(1)
-
-
-if __name__ == '__main__':
-    main(sys.argv[1:])
diff --git a/contrib/hooks/multimail/migrate-mailhook-config b/contrib/hooks/multimail/migrate-mailhook-config
deleted file mode 100755
index 241ba22fa3c8..000000000000
--- a/contrib/hooks/multimail/migrate-mailhook-config
+++ /dev/null
@@ -1,274 +0,0 @@
-#! /usr/bin/env python
-
-"""Migrate a post-receive-email configuration to be usable with git_multimail.py.
-
-See README.migrate-from-post-receive-email for more information.
-
-"""
-
-import sys
-import optparse
-
-from git_multimail import CommandError
-from git_multimail import Config
-from git_multimail import read_output
-
-
-OLD_NAMES = [
-    'mailinglist',
-    'announcelist',
-    'envelopesender',
-    'emailprefix',
-    'showrev',
-    'emailmaxlines',
-    'diffopts',
-    'scancommitforcc',
-    ]
-
-NEW_NAMES = [
-    'environment',
-    'reponame',
-    'mailinglist',
-    'refchangelist',
-    'commitlist',
-    'announcelist',
-    'announceshortlog',
-    'envelopesender',
-    'administrator',
-    'emailprefix',
-    'emailmaxlines',
-    'diffopts',
-    'emaildomain',
-    'scancommitforcc',
-    ]
-
-
-INFO = """\
-
-SUCCESS!
-
-Your post-receive-email configuration has been converted to
-git-multimail format.  Please see README and
-README.migrate-from-post-receive-email to learn about other
-git-multimail configuration possibilities.
-
-For example, git-multimail has the following new options with no
-equivalent in post-receive-email.  You might want to read about them
-to see if they would be useful in your situation:
-
-"""
-
-
-def _check_old_config_exists(old):
-    """Check that at least one old configuration value is set."""
-
-    for name in OLD_NAMES:
-        if name in old:
-            return True
-
-    return False
-
-
-def _check_new_config_clear(new):
-    """Check that none of the new configuration names are set."""
-
-    retval = True
-    for name in NEW_NAMES:
-        if name in new:
-            if retval:
-                sys.stderr.write('INFO: The following configuration values already exist:\n\n')
-            sys.stderr.write('    "%s.%s"\n' % (new.section, name))
-            retval = False
-
-    return retval
-
-
-def erase_values(config, names):
-    for name in names:
-        if name in config:
-            try:
-                sys.stderr.write('...unsetting "%s.%s"\n' % (config.section, name))
-                config.unset_all(name)
-            except CommandError:
-                sys.stderr.write(
-                    '\nWARNING: could not unset "%s.%s".  '
-                    'Perhaps it is not set at the --local level?\n\n'
-                    % (config.section, name)
-                    )
-
-
-def is_section_empty(section, local):
-    """Return True iff the specified configuration section is empty.
-
-    Iff local is True, use the --local option when invoking 'git
-    config'."""
-
-    if local:
-        local_option = ['--local']
-    else:
-        local_option = []
-
-    try:
-        read_output(
-            ['git', 'config'] +
-            local_option +
-            ['--get-regexp', '^%s\.' % (section,)]
-            )
-    except CommandError:
-        t, e, traceback = sys.exc_info()
-        if e.retcode == 1:
-            # This means that no settings were found.
-            return True
-        else:
-            raise
-    else:
-        return False
-
-
-def remove_section_if_empty(section):
-    """If the specified configuration section is empty, delete it."""
-
-    try:
-        empty = is_section_empty(section, local=True)
-    except CommandError:
-        # Older versions of git do not support the --local option, so
-        # if the first attempt fails, try without --local.
-        try:
-            empty = is_section_empty(section, local=False)
-        except CommandError:
-            sys.stderr.write(
-                '\nINFO: If configuration section "%s.*" is empty, you might want '
-                'to delete it.\n\n'
-                % (section,)
-                )
-            return
-
-    if empty:
-        sys.stderr.write('...removing section "%s.*"\n' % (section,))
-        read_output(['git', 'config', '--remove-section', section])
-    else:
-        sys.stderr.write(
-            '\nINFO: Configuration section "%s.*" still has contents.  '
-            'It will not be deleted.\n\n'
-            % (section,)
-            )
-
-
-def migrate_config(strict=False, retain=False, overwrite=False):
-    old = Config('hooks')
-    new = Config('multimailhook')
-    if not _check_old_config_exists(old):
-        sys.exit(
-            'Your repository has no post-receive-email configuration.  '
-            'Nothing to do.'
-            )
-    if not _check_new_config_clear(new):
-        if overwrite:
-            sys.stderr.write('\nWARNING: Erasing the above values...\n\n')
-            erase_values(new, NEW_NAMES)
-        else:
-            sys.exit(
-                '\nERROR: Refusing to overwrite existing values.  Use the --overwrite\n'
-                'option to continue anyway.'
-                )
-
-    name = 'showrev'
-    if name in old:
-        msg = 'git-multimail does not support "%s.%s"' % (old.section, name,)
-        if strict:
-            sys.exit(
-                'ERROR: %s.\n'
-                'Please unset that value then try again, or run without --strict.'
-                % (msg,)
-                )
-        else:
-            sys.stderr.write('\nWARNING: %s (ignoring).\n\n' % (msg,))
-
-    for name in ['mailinglist', 'announcelist']:
-        if name in old:
-            sys.stderr.write(
-                '...copying "%s.%s" to "%s.%s"\n' % (old.section, name, new.section, name)
-                )
-            old_recipients = old.get_all(name, default=None)
-            old_recipients = ', '.join(o.strip() for o in old_recipients)
-            new.set_recipients(name, old_recipients)
-
-    if strict:
-        sys.stderr.write(
-            '...setting "%s.commitlist" to the empty string\n' % (new.section,)
-            )
-        new.set_recipients('commitlist', '')
-        sys.stderr.write(
-            '...setting "%s.announceshortlog" to "true"\n' % (new.section,)
-            )
-        new.set('announceshortlog', 'true')
-
-    for name in ['envelopesender', 'emailmaxlines', 'diffopts', 'scancommitforcc']:
-        if name in old:
-            sys.stderr.write(
-                '...copying "%s.%s" to "%s.%s"\n' % (old.section, name, new.section, name)
-                )
-            new.set(name, old.get(name))
-
-    name = 'emailprefix'
-    if name in old:
-        sys.stderr.write(
-            '...copying "%s.%s" to "%s.%s"\n' % (old.section, name, new.section, name)
-            )
-        new.set(name, old.get(name))
-    elif strict:
-        sys.stderr.write(
-            '...setting "%s.%s" to "[SCM]" to preserve old subject lines\n'
-            % (new.section, name)
-            )
-        new.set(name, '[SCM]')
-
-    if not retain:
-        erase_values(old, OLD_NAMES)
-        remove_section_if_empty(old.section)
-
-    sys.stderr.write(INFO)
-    for name in NEW_NAMES:
-        if name not in OLD_NAMES:
-            sys.stderr.write('    "%s.%s"\n' % (new.section, name,))
-    sys.stderr.write('\n')
-
-
-def main(args):
-    parser = optparse.OptionParser(
-        description=__doc__,
-        usage='%prog [OPTIONS]',
-        )
-
-    parser.add_option(
-        '--strict', action='store_true', default=False,
-        help=(
-            'Slavishly configure git-multimail as closely as possible to '
-            'the post-receive-email configuration.  Default is to turn '
-            'on some new features that have no equivalent in post-receive-email.'
-            ),
-        )
-    parser.add_option(
-        '--retain', action='store_true', default=False,
-        help=(
-            'Retain the post-receive-email configuration values.  '
-            'Default is to delete them after the new values are set.'
-            ),
-        )
-    parser.add_option(
-        '--overwrite', action='store_true', default=False,
-        help=(
-            'Overwrite any existing git-multimail configuration settings.  '
-            'Default is to abort if such settings already exist.'
-            ),
-        )
-
-    (options, args) = parser.parse_args(args)
-
-    if args:
-        parser.error('Unexpected arguments: %s' % (' '.join(args),))
-
-    migrate_config(strict=options.strict, retain=options.retain, overwrite=options.overwrite)
-
-
-main(sys.argv[1:])
diff --git a/contrib/hooks/multimail/post-receive.example b/contrib/hooks/multimail/post-receive.example
deleted file mode 100755
index 0f98c5a23db1..000000000000
--- a/contrib/hooks/multimail/post-receive.example
+++ /dev/null
@@ -1,101 +0,0 @@
-#! /usr/bin/env python
-
-"""Example post-receive hook based on git-multimail.
-
-The simplest way to use git-multimail is to use the script
-git_multimail.py directly as a post-receive hook, and to configure it
-using Git's configuration files and command-line parameters.  You can
-also write your own Python wrapper for more advanced configurability,
-using git_multimail.py as a Python module.
-
-This script is a simple example of such a post-receive hook.  It is
-intended to be customized before use; see the comments in the script
-to help you get started.
-
-Using git-multimail as a Python module as done here provides more
-flexibility.  It has the following advantages:
-
-* The tool's behavior can be customized using arbitrary Python code,
-  without having to edit git_multimail.py.
-
-* Configuration settings can be read from other sources; for example,
-  user names and email addresses could be read from LDAP or from a
-  database.  Or the settings can even be hardcoded in the importing
-  Python script, if this is preferred.
-
-This script is a very basic example of how to use git_multimail.py as
-a module.  The comments below explain some of the points at which the
-script's behavior could be changed or customized.
-
-"""
-
-import sys
-
-# If necessary, add the path to the directory containing
-# git_multimail.py to the Python path as follows.  (This is not
-# necessary if git_multimail.py is in the same directory as this
-# script):
-
-#LIBDIR = 'path/to/directory/containing/module'
-#sys.path.insert(0, LIBDIR)
-
-import git_multimail
-
-# It is possible to modify the output templates here; e.g.:
-
-#git_multimail.FOOTER_TEMPLATE = """\
-#
-#-- \n\
-#This email was generated by the wonderful git-multimail tool.
-#"""
-
-
-# Specify which "git config" section contains the configuration for
-# git-multimail:
-config = git_multimail.Config('multimailhook')
-
-# Set some Git configuration variables. Equivalent to passing var=val
-# to "git -c var=val" each time git is called, or to adding the
-# configuration in .git/config (must come before instantiating the
-# environment) :
-#git_multimail.Config.add_config_parameters('multimailhook.commitEmailFormat=html')
-#git_multimail.Config.add_config_parameters(('user.name=foo', 'user.email=foo@example.com'))
-
-# Select the type of environment:
-try:
-    environment = git_multimail.GenericEnvironment(config=config)
-    #environment = git_multimail.GitoliteEnvironment(config=config)
-except git_multimail.ConfigurationException:
-    sys.stderr.write('*** %s\n' % sys.exc_info()[1])
-    sys.exit(1)
-
-
-# Choose the method of sending emails based on the git config:
-mailer = git_multimail.choose_mailer(config, environment)
-
-# Alternatively, you may hardcode the mailer using code like one of
-# the following:
-
-# Use "/usr/sbin/sendmail -oi -t" to send emails.  The envelopesender
-# argument is optional:
-#mailer = git_multimail.SendMailer(
-#    command=['/usr/sbin/sendmail', '-oi', '-t'],
-#    envelopesender='git-repo@example.com',
-#    )
-
-# Use Python's smtplib to send emails.  Both arguments are required.
-#mailer = git_multimail.SMTPMailer(
-#    environment=environment,
-#    envelopesender='git-repo@example.com',
-#    # The smtpserver argument can also include a port number; e.g.,
-#    #     smtpserver='mail.example.com:25'
-#    smtpserver='mail.example.com',
-#    )
-
-# OutputMailer is intended only for testing; it writes the emails to
-# the specified file stream.
-#mailer = git_multimail.OutputMailer(sys.stdout)
-
-
-# Read changes from stdin and send notification emails:
-git_multimail.run_as_post_receive_hook(environment, mailer)

base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
-- 
gitgitgadget

^ permalink raw reply related	[relevance 1%]

* Re: Bug: Changing folder case with `git mv` crashes on case-insensitive file system
  2021-05-06  9:12  6%       ` Mark Amery
@ 2021-05-06 14:53  0%         ` Torsten Bögershausen
  0 siblings, 0 replies; 200+ results
From: Torsten Bögershausen @ 2021-05-06 14:53 UTC (permalink / raw)
  To: Mark Amery; +Cc: Junio C Hamano, git

On Thu, May 06, 2021 at 10:12:40AM +0100, Mark Amery wrote:
> So, I'm just a dumb Git user who doesn't even write C, so much of this
> discussion is over my head, but I have a few thoughts that may be
> helpful:
>
> • The mv utility on Mac is capable of doing `mv bär.txt bÄr.txt` just
> fine. Maybe `git mv` can learn something from whatever `mv` does?

Yes, Git can do the same.
The thing is, that Git avoids to overwrite of existing files.
Just to be nice.
In that sense, if the destination exists, Git refuses the mv,
unless you use git mv -f
Having said that,
git mv bär.txt bÄr.txt will not work (without the -f)

git mv bear.txt BEAR.txt does work,

>
> • On a case-insensitive file system, `git mv somedir sOMEdir` is a
> rename. But on a case-sensitive file system, it might NOT be a rename;
> it might be the case that `somedir` and `sOMEdir` both exist and that
> the command should put `somedir` inside `sOMEdir`. I mention this
> because I can imagine some naive attempts at fixing the original bug
> by doing a case-insensitive comparison of the two names ending up
> breaking this behaviour on case-sensitive file systems by wrongly
> treating such a command as a rename. It's probably worth having a test
> that this scenario gets handled cleanly on case-sensitive file
> systems? (I haven't checked whether Torsten's proposed diff falls into
> this trap or not.)

Tests are needed - I should have started with those.
But I didn't intend to send a patch (yet), just sharing
ideas and knowledge. Which may enable someone to write a patch.

>
> • Above, Torsten mentions that there are filesystem-specific rules
> about what names are equal to each other that Git can't easily handle,
> because they go beyond just ASCII case changes. In that case, maybe
> the right solution is to always defer the question to the filesystem
> rather than Git trying to figure out the answer "in its head"?

There are different trade-offs:
So far I am only aware of people asking for the
git mv bear.txt BEAR.txt rename.
Just because they are all SW developers ? I don't know.
And just because SW developers are developping Git,
the case-insensitive string compare is good enough,
it is working for them/us.
So things are as they are.

>
>   That is: first check the inode or file ID of the src and dst passed
> to `git mv`. If they are different and the second one is a folder,
> move src inside the existing folder. If either they are the same or
> the second one is not a folder, then do a rename.

Yes. In short: patches are welcome.
In long: inodes don't work on Windows (without a major effort)

>
>   It seems to me that this approach automatically handles stuff like
> `git mv bär.txt bÄr.txt` plus any other rules about names being equal
> (like two different sequences of code points that both express "à"),
> all without Git ever needing to explicitly check whether two names are
> case-insensitively equal. Am I missing something?

That could be a solution. There may are situations/configurations,
where inodes don't work:
What happens if a Windows server exports a file system to MacOs ?
To Linux ?
Do we have working inodes ?
What about other networking combinations ?
Our code should handle them well as well.

>
> Sorry if any of the above is dumb or if I'm reiterating things others
> have already said without realising it.

No problem. Actually I realized that we used top-posting here,
So I remove the reset to make it more readable.

[]

^ permalink raw reply	[relevance 0%]

* Re: Bug: Changing folder case with `git mv` crashes on case-insensitive file system
  @ 2021-05-06  9:12  6%       ` Mark Amery
  2021-05-06 14:53  0%         ` Torsten Bögershausen
  0 siblings, 1 reply; 200+ results
From: Mark Amery @ 2021-05-06  9:12 UTC (permalink / raw)
  To: Torsten Bögershausen; +Cc: Junio C Hamano, git

So, I'm just a dumb Git user who doesn't even write C, so much of this
discussion is over my head, but I have a few thoughts that may be
helpful:

• The mv utility on Mac is capable of doing `mv bär.txt bÄr.txt` just
fine. Maybe `git mv` can learn something from whatever `mv` does?

• On a case-insensitive file system, `git mv somedir sOMEdir` is a
rename. But on a case-sensitive file system, it might NOT be a rename;
it might be the case that `somedir` and `sOMEdir` both exist and that
the command should put `somedir` inside `sOMEdir`. I mention this
because I can imagine some naive attempts at fixing the original bug
by doing a case-insensitive comparison of the two names ending up
breaking this behaviour on case-sensitive file systems by wrongly
treating such a command as a rename. It's probably worth having a test
that this scenario gets handled cleanly on case-sensitive file
systems? (I haven't checked whether Torsten's proposed diff falls into
this trap or not.)

• Above, Torsten mentions that there are filesystem-specific rules
about what names are equal to each other that Git can't easily handle,
because they go beyond just ASCII case changes. In that case, maybe
the right solution is to always defer the question to the filesystem
rather than Git trying to figure out the answer "in its head"?

  That is: first check the inode or file ID of the src and dst passed
to `git mv`. If they are different and the second one is a folder,
move src inside the existing folder. If either they are the same or
the second one is not a folder, then do a rename.

  It seems to me that this approach automatically handles stuff like
`git mv bär.txt bÄr.txt` plus any other rules about names being equal
(like two different sequences of code points that both express "à"),
all without Git ever needing to explicitly check whether two names are
case-insensitively equal. Am I missing something?

Sorry if any of the above is dumb or if I'm reiterating things others
have already said without realising it.

On Thu, May 6, 2021 at 5:34 AM Torsten Bögershausen <tboegi@web.de> wrote:
>
> On Wed, May 05, 2021 at 09:23:05AM +0900, Junio C Hamano wrote:
> > Torsten Bögershausen <tboegi@web.de> writes:
> >
> > > To my undestanding we try to rename
> > > foo/ into FOO/.
> > > But because FOO/ already "exists" as directory,
> > > Git tries to move foo/ into FOO/foo, which fails.
> > >
> > > And no, the problem is probably not restricted to MacOs,
> > > Windows and all case-insenstive file systems should show
> > > the same, but I haven't tested yet, so it's more a suspicion.
> > >
> > > The following diff allows to move foo/ into FOO/
> > > If someone wants to make a patch out if, that would be good.
> >
> > Is strcasecmp() sufficient for macOS whose filesystem has not just
> > case insensitivity but UTF-8 normalization issues?
> >
>
> Strictly speaking: no.
>
> The Git code doesn't handle UTF-8 uppper/lower case at all:
> git mv bar.txt BAR.TXT works because strcasecmp() is catching it.
>
> git mv bär.txt BÄR.TXT needs the long way:
> git mv bär.txt baer.txt && git mv baer.txt BÄR.TXT
>
> We have been restricting the case-change-is-allowed to ASCII filenames
> all the time.
> There is no information, which code points map onto each other in Git,
> since this is all file system dependent.
> NTFS has one way, HFS+, APFS another, VFAT a third one, and if I expose
> ext4 via SAMBA we probably have another one.
> Not mentioniong that ext4 can be use case-insensitve on later Linux kernels,
> which sticks to unicode.
> Or Git repos running on machines using ISO-8859-1, those should be rare these
> days.
>
> That said, people are renaming files in ASCII only and are happy,
> and in that sense renaming directories in ASCII can be supported
> without major hassle.
>
> And the inode approach mentioned as well:
> This could go on top of strcasecmp() to cover non-ASCII filenames
> or other oddities, if someone implements it.
>
>

^ permalink raw reply	[relevance 6%]

* Re: Bug: Changing folder case with `git mv` crashes on case-insensitive file system
  2021-05-03 17:25  5% Bug: Changing folder case with `git mv` crashes on case-insensitive file system Mark Amery
  2021-05-03 22:58  4% ` brian m. carlson
@ 2021-05-04 15:19  0% ` Torsten Bögershausen
    1 sibling, 1 reply; 200+ results
From: Torsten Bögershausen @ 2021-05-04 15:19 UTC (permalink / raw)
  To: Mark Amery; +Cc: git

On Mon, May 03, 2021 at 06:25:43PM +0100, Mark Amery wrote:
> Attempting to change the case of a folder's name using a command like
> `git mv foo FOO` crashes on case-insensitive file systems, like the
> default APFS used on Apple Macs.
>
> Here are simple steps to repro this:
>
>     $ mkdir testrepo && cd testrepo && git init
>     Initialized empty Git repository in /Users/markamery/testrepo/.git/
>     $ mkdir foo && touch foo/bar && git add foo && git commit -m bla
>     [master (root-commit) a7e9f5f] bla
>     1 file changed, 0 insertions(+), 0 deletions(-)
>     create mode 100644 foo/bar
>     $ git mv foo FOO
>     fatal: renaming 'foo' failed: Invalid argument
>     $ echo $?
>     128
>     $ git status
>     On branch master
>     nothing to commit, working tree clean
>
> If I create a case-sensitive APFS volume using Disk Utility and try
> the commands above on that volume, `git mv foo FOO` works correctly:
> it emits no output, exits with a 0 status code, and stages a change
> renaming `foo/bar` to `FOO/bar`. However, on my main case-insensitive
> volume, `git mv` behaves as shown above: it exits with code 128,
> prints an "Invalid argument" error message, and does not stage any
> changes.
>
> The command still fails in the same way if you use `git mv --force`
> instead of just `git mv`.
>
> Note that previously, `git mv` could not change the case of *file*
> names on case-insensitive file systems, until that was fixed in commit
> https://github.com/git/git/commit/baa37bff9a845471754d3f47957d58a6ccc30058.
> I'm guessing there's a different code path that needs fixing for
> changing the case of *folders*.
>
> As far as I can tell, this error has never been reported to the Git
> mailing list, but it seems to be encountered frequently;
> https://stackoverflow.com/questions/3011625/git-mv-and-only-change-case-of-directory
> mentions this bug and has 86000 views.
>
> In case it's relevant, here's my system info as output by `git bugreport`:
>
>     [System Info]
>     git version:
>     git version 2.31.1
>     cpu: x86_64
>     no commit associated with this build
>     sizeof-long: 8
>     sizeof-size_t: 8
>     shell-path: /bin/sh
>     uname: Darwin 18.7.0 Darwin Kernel Version 18.7.0: Mon Apr 27
> 20:09:39 PDT 2020; root:xnu-4903.278.35~1/RELEASE_X86_64 x86_64
>     compiler info: clang: 11.0.0 (clang-1100.0.33.17)
>     libc info: no libc information available
>     $SHELL (typically, interactive shell): /bin/bash


Thanks for reporting - that's always good.

To my undestanding we try to rename
foo/ into FOO/.
But because FOO/ already "exists" as directory,
Git tries to move foo/ into FOO/foo, which fails.

And no, the problem is probably not restricted to MacOs,
Windows and all case-insenstive file systems should show
the same, but I haven't tested yet, so it's more a suspicion.

The following diff allows to move foo/ into FOO/
If someone wants to make a patch out if, that would be good.



diff --git a/builtin/mv.c b/builtin/mv.c
index 3fccdcb6452..fbf184bcfa9 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -163,8 +163,10 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	else if (!lstat(dest_path[0], &st) &&
 			S_ISDIR(st.st_mode)) {
-		dest_path[0] = add_slash(dest_path[0]);
-		destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+		if (!ignore_case || strcasecmp(source[0], dest_path[0])) {
+			dest_path[0] = add_slash(dest_path[0]);
+			destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+		}
 	} else {
 		if (argc != 1)
 			die(_("destination '%s' is not a directory"), dest_path[0]);
@@ -187,9 +189,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				(dst[length] == 0 || dst[length] == '/')) {
 			bad = _("can not move directory into itself");
 		} else if ((src_is_dir = S_ISDIR(st.st_mode))
-				&& lstat(dst, &st) == 0)
-			bad = _("cannot move directory over file");
-		else if (src_is_dir) {
+			   && lstat(dst, &st) == 0) {
+			if (!ignore_case || strcasecmp(src, dst)){
+				bad = _("cannot move directory over file");
+			}
+		}
+		if (!bad && src_is_dir) {
 			int first = cache_name_pos(src, length), last;

 			if (first >= 0)
@@ -277,7 +282,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		if (mode != INDEX && rename(src, dst) < 0) {
 			if (ignore_errors)
 				continue;
-			die_errno(_("renaming '%s' failed"), src);
+			die_errno(_("renaming '%s' into '%s' failed"), src, dst);
 		}
 		if (submodule_gitfile[i]) {
 			if (!update_path_in_gitmodules(src, dst))

^ permalink raw reply related	[relevance 0%]

* Re: Bug: Changing folder case with `git mv` crashes on case-insensitive file system
  2021-05-03 17:25  5% Bug: Changing folder case with `git mv` crashes on case-insensitive file system Mark Amery
@ 2021-05-03 22:58  4% ` brian m. carlson
  2021-05-04 15:19  0% ` Torsten Bögershausen
  1 sibling, 0 replies; 200+ results
From: brian m. carlson @ 2021-05-03 22:58 UTC (permalink / raw)
  To: Mark Amery; +Cc: git

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

On 2021-05-03 at 17:25:43, Mark Amery wrote:
> Attempting to change the case of a folder's name using a command like
> `git mv foo FOO` crashes on case-insensitive file systems, like the
> default APFS used on Apple Macs.
> 
> Here are simple steps to repro this:
> 
>     $ mkdir testrepo && cd testrepo && git init
>     Initialized empty Git repository in /Users/markamery/testrepo/.git/
>     $ mkdir foo && touch foo/bar && git add foo && git commit -m bla
>     [master (root-commit) a7e9f5f] bla
>     1 file changed, 0 insertions(+), 0 deletions(-)
>     create mode 100644 foo/bar
>     $ git mv foo FOO
>     fatal: renaming 'foo' failed: Invalid argument
>     $ echo $?
>     128
>     $ git status
>     On branch master
>     nothing to commit, working tree clean
> 
> If I create a case-sensitive APFS volume using Disk Utility and try
> the commands above on that volume, `git mv foo FOO` works correctly:
> it emits no output, exits with a 0 status code, and stages a change
> renaming `foo/bar` to `FOO/bar`. However, on my main case-insensitive
> volume, `git mv` behaves as shown above: it exits with code 128,
> prints an "Invalid argument" error message, and does not stage any
> changes.

Yeah, this is because your operating system returns EINVAL in this case.
POSIX specifies EINVAL when you're trying to make a directory a
subdirectory of itself.  Which, I mean, I guess is a valid
interpretation here, but it of course makes renaming the path needlessly
difficult.

> The command still fails in the same way if you use `git mv --force`
> instead of just `git mv`.
> 
> Note that previously, `git mv` could not change the case of *file*
> names on case-insensitive file systems, until that was fixed in commit
> https://github.com/git/git/commit/baa37bff9a845471754d3f47957d58a6ccc30058.
> I'm guessing there's a different code path that needs fixing for
> changing the case of *folders*.

My guess is this is because when the argument is a directory, the mode
is set to WORKING_DIRECTORY, and then we check that the mode isn't INDEX
and so rename(2) gets called.  However, I believe there is a -k option
which should make this work, since we ignore the errors.

I suspect part of the problem here is two fold: on macOS we can't
distinguish an attempt to rename the path due to it folding or
canonicalizing to the same thing from a real attempt to move an actual
directory into itself.  The latter would be a problem we'd want to
report, and the former is not.  Unfortunately, detecting this is
difficult because that means we'd have to implement the macOS
canonicalization algorithm in Git and we don't want to do that.

Maybe someone who frequently uses a macOS system that uses a
case-sensitive file system can chime in here, but for now, I think -k
should do what you want.
-- 
brian m. carlson (he/him or they/them)
Houston, Texas, US

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

^ permalink raw reply	[relevance 4%]

* Bug: Changing folder case with `git mv` crashes on case-insensitive file system
@ 2021-05-03 17:25  5% Mark Amery
  2021-05-03 22:58  4% ` brian m. carlson
  2021-05-04 15:19  0% ` Torsten Bögershausen
  0 siblings, 2 replies; 200+ results
From: Mark Amery @ 2021-05-03 17:25 UTC (permalink / raw)
  To: git

Attempting to change the case of a folder's name using a command like
`git mv foo FOO` crashes on case-insensitive file systems, like the
default APFS used on Apple Macs.

Here are simple steps to repro this:

    $ mkdir testrepo && cd testrepo && git init
    Initialized empty Git repository in /Users/markamery/testrepo/.git/
    $ mkdir foo && touch foo/bar && git add foo && git commit -m bla
    [master (root-commit) a7e9f5f] bla
    1 file changed, 0 insertions(+), 0 deletions(-)
    create mode 100644 foo/bar
    $ git mv foo FOO
    fatal: renaming 'foo' failed: Invalid argument
    $ echo $?
    128
    $ git status
    On branch master
    nothing to commit, working tree clean

If I create a case-sensitive APFS volume using Disk Utility and try
the commands above on that volume, `git mv foo FOO` works correctly:
it emits no output, exits with a 0 status code, and stages a change
renaming `foo/bar` to `FOO/bar`. However, on my main case-insensitive
volume, `git mv` behaves as shown above: it exits with code 128,
prints an "Invalid argument" error message, and does not stage any
changes.

The command still fails in the same way if you use `git mv --force`
instead of just `git mv`.

Note that previously, `git mv` could not change the case of *file*
names on case-insensitive file systems, until that was fixed in commit
https://github.com/git/git/commit/baa37bff9a845471754d3f47957d58a6ccc30058.
I'm guessing there's a different code path that needs fixing for
changing the case of *folders*.

As far as I can tell, this error has never been reported to the Git
mailing list, but it seems to be encountered frequently;
https://stackoverflow.com/questions/3011625/git-mv-and-only-change-case-of-directory
mentions this bug and has 86000 views.

In case it's relevant, here's my system info as output by `git bugreport`:

    [System Info]
    git version:
    git version 2.31.1
    cpu: x86_64
    no commit associated with this build
    sizeof-long: 8
    sizeof-size_t: 8
    shell-path: /bin/sh
    uname: Darwin 18.7.0 Darwin Kernel Version 18.7.0: Mon Apr 27
20:09:39 PDT 2020; root:xnu-4903.278.35~1/RELEASE_X86_64 x86_64
    compiler info: clang: 11.0.0 (clang-1100.0.33.17)
    libc info: no libc information available
    $SHELL (typically, interactive shell): /bin/bash

^ permalink raw reply	[relevance 5%]

* [PATCH v4 1/5] unpack-trees: add basic support for parallel checkout
  @ 2021-04-19 19:53  2% ` Matheus Tavares
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares @ 2021-04-19 19:53 UTC (permalink / raw)
  To: gitster; +Cc: git, christian.couder, git

This new interface allows us to enqueue some of the entries being
checked out to later uncompress them, apply in-process filters, and
write out the files in parallel. For now, the parallel checkout
machinery is enabled by default and there is no user configuration, but
run_parallel_checkout() just writes the queued entries in sequence
(without spawning additional workers). The next patch will actually
implement the parallelism and, later, we will make it configurable.

Note that, to avoid potential data races, not all entries are eligible
for parallel checkout. Also, paths that collide on disk (e.g.
case-sensitive paths in case-insensitive file systems), are detected by
the parallel checkout code and skipped, so that they can be safely
sequentially handled later. The collision detection works like the
following:

- If the collision was at basename (e.g. 'a/b' and 'a/B'), the framework
  detects it by looking for EEXIST and EISDIR errors after an
  open(O_CREAT | O_EXCL) failure.

- If the collision was at dirname (e.g. 'a/b' and 'A'), it is detected
  at the has_dirs_only_path() check, which is done for the leading path
  of each item in the parallel checkout queue.

Both verifications rely on the fact that, before enqueueing an entry for
parallel checkout, checkout_entry() makes sure that there is no file at
the entry's path and that its leading components are all real
directories. So, any later change in these conditions indicates that
there was a collision (either between two parallel-eligible entries or
between an eligible and an ineligible one).

After all parallel-eligible entries have been processed, the collided
(and thus, skipped) entries are sequentially fed to checkout_entry()
again. This is similar to the way the current code deals with
collisions, overwriting the previously checked out entries with the
subsequent ones. The only difference is that, since we no longer create
the files in the same order that they appear on index, we are not able
to determine which of the colliding entries will survive on disk (for
the classic code, it is always the last entry).

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 Makefile            |   1 +
 entry.c             |  17 ++-
 parallel-checkout.c | 365 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  32 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 418 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index a6a73c5741..99734cc2ea 100644
--- a/Makefile
+++ b/Makefile
@@ -946,6 +946,7 @@ 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
diff --git a/entry.c b/entry.c
index 2dc94ba5cc..d7ed38aa40 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout doesn't create the files in index
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..590e2a3046
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,365 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items; /* The parallel checkout queue. */
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout;
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	/*
+	 * Symlinks cannot be checked out in parallel as, in case of path
+	 * collision, they could racily replace leading directories of other
+	 * entries being checked out. Submodules are checked out in child
+	 * processes, which have their own parallel checkout queues.
+	 */
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have its stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error("parallel checkout finished with pending entries");
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of '%s'", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file '%s'", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *blob;
+	unsigned long size;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	blob = read_blob_entry(pc_item->ce, &size);
+	if (!blob)
+		return error("cannot read object %s '%s'",
+			     oid_to_hex(&pc_item->ce->oid), pc_item->ce->name);
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 blob, size, &buf, NULL);
+
+	if (ret) {
+		size_t newsize;
+		free(blob);
+		blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, blob, size);
+	free(blob);
+	if (wrote < 0)
+		return error("unable to write file '%s'", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+	const char *dir_sep;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	dir_sep = find_last_dir_sep(path.buf);
+
+	/*
+	 * The leading dirs should have been already created by now. But, in
+	 * case of path collisions, one of the dirs could have been replaced by
+	 * a symlink (checked out after we enqueued this entry for parallel
+	 * checkout). Thus, we must check the leading dirs again.
+	 */
+	if (dir_sep && !has_dirs_only_path(path.buf, dir_sep - path.buf,
+					   state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but the above has_dirs_only_path()
+			 * call should have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file '%s'", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		close_and_clear(&fd);
+		unlink(path.buf);
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file '%s'", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file '%s'",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; i++)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..4ad2a519b3
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,32 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+
+/*
+ * Put parallel checkout into the PC_ACCEPTING_ENTRIES state. Should be used
+ * only when in the PC_UNINITIALIZED state.
+ */
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not accepting entries or if the
+ * entry is not eligible for parallel checkout. Otherwise, enqueue the entry
+ * for later write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index 8a1afbc1e4..f0430d458d 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -441,7 +442,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -464,6 +464,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -477,6 +480,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.30.1


^ permalink raw reply related	[relevance 2%]

* [PATCH v3 1/5] unpack-trees: add basic support for parallel checkout
  @ 2021-04-19  0:14  2% ` Matheus Tavares
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares @ 2021-04-19  0:14 UTC (permalink / raw)
  To: gitster; +Cc: git, christian.couder, git

This new interface allows us to enqueue some of the entries being
checked out to later uncompress them, apply in-process filters, and
write out the files in parallel. For now, the parallel checkout
machinery is enabled by default and there is no user configuration, but
run_parallel_checkout() just writes the queued entries in sequence
(without spawning additional workers). The next patch will actually
implement the parallelism and, later, we will make it configurable.

Note that, to avoid potential data races, not all entries are eligible
for parallel checkout. Also, paths that collide on disk (e.g.
case-sensitive paths in case-insensitive file systems), are detected by
the parallel checkout code and skipped, so that they can be safely
sequentially handled later. The collision detection works like the
following:

- If the collision was at basename (e.g. 'a/b' and 'a/B'), the framework
  detects it by looking for EEXIST and EISDIR errors after an
  open(O_CREAT | O_EXCL) failure.

- If the collision was at dirname (e.g. 'a/b' and 'A'), it is detected
  at the has_dirs_only_path() check, which is done for the leading path
  of each item in the parallel checkout queue.

Both verifications rely on the fact that, before enqueueing an entry for
parallel checkout, checkout_entry() makes sure that there is no file at
the entry's path and that its leading components are all real
directories. So, any later change in these conditions indicates that
there was a collision (either between two parallel-eligible entries or
between an eligible and an ineligible one).

After all parallel-eligible entries have been processed, the collided
(and thus, skipped) entries are sequentially fed to checkout_entry()
again. This is similar to the way the current code deals with
collisions, overwriting the previously checked out entries with the
subsequent ones. The only difference is that, since we no longer create
the files in the same order that they appear on index, we are not able
to determine which of the colliding entries will survive on disk (for
the classic code, it is always the last entry).

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 Makefile            |   1 +
 entry.c             |  17 ++-
 parallel-checkout.c | 365 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  32 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 418 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index a6a73c5741..99734cc2ea 100644
--- a/Makefile
+++ b/Makefile
@@ -946,6 +946,7 @@ 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
diff --git a/entry.c b/entry.c
index 2dc94ba5cc..d7ed38aa40 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout doesn't create the files in index
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..590e2a3046
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,365 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items; /* The parallel checkout queue. */
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout;
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	/*
+	 * Symlinks cannot be checked out in parallel as, in case of path
+	 * collision, they could racily replace leading directories of other
+	 * entries being checked out. Submodules are checked out in child
+	 * processes, which have their own parallel checkout queues.
+	 */
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have its stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error("parallel checkout finished with pending entries");
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of '%s'", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file '%s'", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *blob;
+	unsigned long size;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	blob = read_blob_entry(pc_item->ce, &size);
+	if (!blob)
+		return error("cannot read object %s '%s'",
+			     oid_to_hex(&pc_item->ce->oid), pc_item->ce->name);
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 blob, size, &buf, NULL);
+
+	if (ret) {
+		size_t newsize;
+		free(blob);
+		blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, blob, size);
+	free(blob);
+	if (wrote < 0)
+		return error("unable to write file '%s'", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+	const char *dir_sep;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	dir_sep = find_last_dir_sep(path.buf);
+
+	/*
+	 * The leading dirs should have been already created by now. But, in
+	 * case of path collisions, one of the dirs could have been replaced by
+	 * a symlink (checked out after we enqueued this entry for parallel
+	 * checkout). Thus, we must check the leading dirs again.
+	 */
+	if (dir_sep && !has_dirs_only_path(path.buf, dir_sep - path.buf,
+					   state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but the above has_dirs_only_path()
+			 * call should have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file '%s'", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		close_and_clear(&fd);
+		unlink(path.buf);
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file '%s'", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file '%s'",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; i++)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..4ad2a519b3
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,32 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+
+/*
+ * Put parallel checkout into the PC_ACCEPTING_ENTRIES state. Should be used
+ * only when in the PC_UNINITIALIZED state.
+ */
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not accepting entries or if the
+ * entry is not eligible for parallel checkout. Otherwise, enqueue the entry
+ * for later write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index 8a1afbc1e4..f0430d458d 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -441,7 +442,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -464,6 +464,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -477,6 +480,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.30.1


^ permalink raw reply related	[relevance 2%]

* [RFC PATCH v1 09/13] doc: typeset command/option/value entries in monospace
    2021-04-09  4:02  1% ` [RFC PATCH v1 01/13] doc: typeset command-line options in monospace Firmin Martin
@ 2021-04-09  4:02  1% ` Firmin Martin
  1 sibling, 0 replies; 200+ results
From: Firmin Martin @ 2021-04-09  4:02 UTC (permalink / raw)
  To: git; +Cc: Firmin Martin

Automatically wrap command-line option entries (i.e. something of the form
<entry>[::|;;]<description>) with backticks as indicated in the
CodingGuidelines. As an intended side effect, also wrap with backticks
some configuration options and values entries.

The following command and regex has performed the whole substitution
(without manual intervention).

    REGEX="^([[:space:]]*?)[\"']?([][a-zA-Z-=<>]+)[\"']?(::|;;)([[:space:]]+|\$)" &&
    perl -pi -e "s/$REGEX/\$1\`\$2\`\$3\$4/g" $(grep -Pl "$REGEX" *.txt --exclude-dir=RelNotes)

Signed-off-by: Firmin Martin <firminmartin24@gmail.com>
---
 Documentation/blame-options.txt          |  30 +--
 Documentation/config.txt                 |  12 +-
 Documentation/diff-options.txt           | 222 +++++++++++------------
 Documentation/fetch-options.txt          |  88 ++++-----
 Documentation/git-add.txt                |  66 +++----
 Documentation/git-am.txt                 |  82 ++++-----
 Documentation/git-apply.txt              |  60 +++---
 Documentation/git-archimport.txt         |  12 +-
 Documentation/git-archive.txt            |  30 +--
 Documentation/git-bisect.txt             |   4 +-
 Documentation/git-blame.txt              |  22 +--
 Documentation/git-branch.txt             |  88 ++++-----
 Documentation/git-bundle.txt             |  14 +-
 Documentation/git-cat-file.txt           |  36 ++--
 Documentation/git-check-attr.txt         |  14 +-
 Documentation/git-check-ignore.txt       |   6 +-
 Documentation/git-check-mailmap.txt      |   2 +-
 Documentation/git-check-ref-format.txt   |   6 +-
 Documentation/git-checkout-index.txt     |  28 +--
 Documentation/git-checkout.txt           |  66 +++----
 Documentation/git-cherry-pick.txt        |  42 ++---
 Documentation/git-cherry.txt             |   8 +-
 Documentation/git-clean.txt              |  30 +--
 Documentation/git-clone.txt              |  58 +++---
 Documentation/git-commit-graph.txt       |   8 +-
 Documentation/git-commit-tree.txt        |   8 +-
 Documentation/git-commit.txt             | 106 +++++------
 Documentation/git-config.txt             |  60 +++---
 Documentation/git-count-objects.txt      |   8 +-
 Documentation/git-cvsexportcommit.txt    |  24 +--
 Documentation/git-cvsimport.txt          |  16 +-
 Documentation/git-cvsserver.txt          |  16 +-
 Documentation/git-daemon.txt             |  66 +++----
 Documentation/git-describe.txt           |  24 +--
 Documentation/git-diff-files.txt         |   6 +-
 Documentation/git-diff-index.txt         |   8 +-
 Documentation/git-diff-tree.txt          |  28 +--
 Documentation/git-difftool.txt           |  28 +--
 Documentation/git-fast-export.txt        |  28 +--
 Documentation/git-fast-import.txt        |  56 +++---
 Documentation/git-fetch-pack.txt         |  36 ++--
 Documentation/git-fetch.txt              |  12 +-
 Documentation/git-filter-branch.txt      |   6 +-
 Documentation/git-fmt-merge-msg.txt      |   6 +-
 Documentation/git-for-each-ref.txt       |  54 +++---
 Documentation/git-format-patch.txt       |  86 ++++-----
 Documentation/git-fsck.txt               |  28 +--
 Documentation/git-gc.txt                 |  14 +-
 Documentation/git-grep.txt               | 126 ++++++-------
 Documentation/git-gui.txt                |   8 +-
 Documentation/git-hash-object.txt        |  12 +-
 Documentation/git-help.txt               |  26 +--
 Documentation/git-http-backend.txt       |   2 +-
 Documentation/git-http-fetch.txt         |  12 +-
 Documentation/git-http-push.txt          |  12 +-
 Documentation/git-imap-send.txt          |  12 +-
 Documentation/git-index-pack.txt         |  24 +--
 Documentation/git-init.txt               |  10 +-
 Documentation/git-instaweb.txt           |  32 ++--
 Documentation/git-interpret-trailers.txt |  20 +-
 Documentation/git-log.txt                |  18 +-
 Documentation/git-ls-files.txt           |  82 ++++-----
 Documentation/git-ls-remote.txt          |  28 +--
 Documentation/git-ls-tree.txt            |  24 +--
 Documentation/git-mailinfo.txt           |  22 +--
 Documentation/git-mailsplit.txt          |  16 +-
 Documentation/git-maintenance.txt        |  30 +--
 Documentation/git-merge-base.txt         |  12 +-
 Documentation/git-merge-file.txt         |  10 +-
 Documentation/git-merge-index.txt        |   6 +-
 Documentation/git-merge.txt              |  16 +-
 Documentation/git-mergetool.txt          |  18 +-
 Documentation/git-mktag.txt              |   2 +-
 Documentation/git-mktree.txt             |   6 +-
 Documentation/git-multi-pack-index.txt   |  14 +-
 Documentation/git-mv.txt                 |  14 +-
 Documentation/git-name-rev.txt           |  16 +-
 Documentation/git-notes.txt              |  56 +++---
 Documentation/git-p4.txt                 |  38 ++--
 Documentation/git-pack-objects.txt       |  74 ++++----
 Documentation/git-pack-redundant.txt     |   6 +-
 Documentation/git-pack-refs.txt          |   4 +-
 Documentation/git-patch-id.txt           |   4 +-
 Documentation/git-prune-packed.txt       |   8 +-
 Documentation/git-prune.txt              |  10 +-
 Documentation/git-pull.txt               |  12 +-
 Documentation/git-push.txt               |  76 ++++----
 Documentation/git-quiltimport.txt        |   6 +-
 Documentation/git-range-diff.txt         |  10 +-
 Documentation/git-read-tree.txt          |  34 ++--
 Documentation/git-rebase.txt             | 114 ++++++------
 Documentation/git-reflog.txt             |  20 +-
 Documentation/git-remote.txt             |  26 +--
 Documentation/git-repack.txt             |  48 ++---
 Documentation/git-replace.txt            |  14 +-
 Documentation/git-request-pull.txt       |   8 +-
 Documentation/git-rerere.txt             |  10 +-
 Documentation/git-reset.txt              |  22 +--
 Documentation/git-restore.txt            |  48 ++---
 Documentation/git-rev-parse.txt          |  82 ++++-----
 Documentation/git-revert.txt             |  32 ++--
 Documentation/git-rm.txt                 |  22 +--
 Documentation/git-send-email.txt         |  84 ++++-----
 Documentation/git-send-pack.txt          |  26 +--
 Documentation/git-sh-i18n.txt            |   2 +-
 Documentation/git-sh-setup.txt           |   4 +-
 Documentation/git-shortlog.txt           |  20 +-
 Documentation/git-show-branch.txt        |  38 ++--
 Documentation/git-show-ref.txt           |  24 +--
 Documentation/git-sparse-checkout.txt    |  12 +-
 Documentation/git-stash.txt              |  40 ++--
 Documentation/git-status.txt             |  42 ++---
 Documentation/git-stripspace.txt         |   8 +-
 Documentation/git-submodule.txt          |  56 +++---
 Documentation/git-svn.txt                | 150 +++++++--------
 Documentation/git-switch.txt             |  46 ++---
 Documentation/git-symbolic-ref.txt       |  12 +-
 Documentation/git-tag.txt                |  62 +++----
 Documentation/git-unpack-objects.txt     |  10 +-
 Documentation/git-update-index.txt       |  62 +++----
 Documentation/git-update-ref.txt         |  18 +-
 Documentation/git-upload-pack.txt        |  10 +-
 Documentation/git-var.txt                |   2 +-
 Documentation/git-verify-commit.txt      |   6 +-
 Documentation/git-verify-pack.txt        |   8 +-
 Documentation/git-verify-tag.txt         |   6 +-
 Documentation/git-worktree.txt           |  44 ++---
 Documentation/git-write-tree.txt         |   2 +-
 Documentation/git.txt                    |  66 +++----
 Documentation/gitattributes.txt          |  42 ++---
 Documentation/gitcli.txt                 |   4 +-
 Documentation/gitcore-tutorial.txt       |   2 +-
 Documentation/gitcredentials.txt         |  10 +-
 Documentation/githooks.txt               |   2 +-
 Documentation/gitk.txt                   |  28 +--
 Documentation/gitmodules.txt             |   8 +-
 Documentation/gitremote-helpers.txt      |  38 ++--
 Documentation/gitrepository-layout.txt   |  32 ++--
 Documentation/gitweb.conf.txt            |  34 ++--
 Documentation/gitweb.txt                 |  44 ++---
 Documentation/glossary-content.txt       |  12 +-
 Documentation/merge-options.txt          |  70 +++----
 Documentation/merge-strategies.txt       |  36 ++--
 Documentation/pretty-options.txt         |  28 +--
 Documentation/rev-list-options.txt       | 204 ++++++++++-----------
 Documentation/sequencer.txt              |   8 +-
 Documentation/signoff-option.txt         |   6 +-
 147 files changed, 2320 insertions(+), 2320 deletions(-)

diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index 1d36a176bb..c58d30a648 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -1,12 +1,12 @@
--b::
+`-b`::
 	Show blank SHA-1 for boundary commits.  This can also
 	be controlled via the `blame.blankBoundary` config option.
 
---root::
+`--root`::
 	Do not treat root commits as boundaries.  This can also be
 	controlled via the `blame.showRoot` config option.
 
---show-stats::
+`--show-stats`::
 	Include additional statistics at the end of blame output.
 
 -L <start>,<end>::
@@ -20,10 +20,10 @@
 +
 include::line-range-format.txt[]
 
--l::
+`-l`::
 	Show long rev (Default: off).
 
--t::
+`-t`::
 	Show raw timestamp (Default: off).
 
 -S <revs-file>::
@@ -37,26 +37,26 @@ include::line-range-format.txt[]
 	START.  `git blame --reverse START` is taken as `git blame
 	--reverse START..HEAD` for convenience.
 
---first-parent::
+`--first-parent`::
 	Follow only the first parent commit upon seeing a merge
 	commit. This option can be used to determine when a line
 	was introduced to a particular integration branch, rather
 	than when it was introduced to the history overall.
 
--p::
---porcelain::
+`-p`::
+`--porcelain`::
 	Show in a format designed for machine consumption.
 
---line-porcelain::
+`--line-porcelain`::
 	Show the porcelain format, but output commit information for
 	each line, not just the first time a commit is referenced.
 	Implies `--porcelain`.
 
---incremental::
+`--incremental`::
 	Show the result incrementally in a format designed for
 	machine consumption.
 
---encoding=<encoding>::
+`--encoding=<encoding>`::
 	Specifies the encoding used to output author names
 	and commit summaries. Setting it to `none` makes blame
 	output unconverted data. For more information see the
@@ -77,14 +77,14 @@ include::line-range-format.txt[]
 	iso format is used. For supported values, see the discussion
 	of the `--date` option at linkgit:git-log[1].
 
---[no-]progress::
+`--[no-]progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal. This flag
 	enables progress reporting even if not attached to a
 	terminal. Can't use `--progress` together with `--porcelain`
 	or `--incremental`.
 
--M[<num>]::
+`-M[<num>]`::
 	Detect moved or copied lines within a file. When a commit
 	moves or copies a block of lines (e.g. the original file
 	has A and then B, and the commit changes it to B and then
@@ -100,7 +100,7 @@ alphanumeric characters that Git must detect as moving/copying
 within a file for it to associate those lines with the parent
 commit. The default value is 20.
 
--C[<num>]::
+`-C[<num>]`::
 	In addition to `-M`, detect lines moved or copied from other
 	files that were modified in the same commit.  This is
 	useful when you reorganize your program and move code
@@ -136,5 +136,5 @@ take effect.
 	option.  An empty file name, `""`, will clear the list of revs from
 	previously processed files.
 
--h::
+`-h`::
 	Show help message.
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 68529ad9db..6f83ce52a2 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -235,29 +235,29 @@ Values of many variables are treated as a simple string, but there
 are variables that take values of specific types and there are rules
 as to how to spell them.
 
-boolean::
+`boolean`::
 
        When a variable is said to take a boolean value, many
        synonyms are accepted for 'true' and 'false'; these are all
        case-insensitive.
 
-	true;; Boolean true literals are `yes`, `on`, `true`,
+	`true`;; Boolean true literals are `yes`, `on`, `true`,
 		and `1`.  Also, a variable defined without `= <value>`
 		is taken as true.
 
-	false;; Boolean false literals are `no`, `off`, `false`,
+	`false`;; Boolean false literals are `no`, `off`, `false`,
 		`0` and the empty string.
 +
 When converting a value to its canonical form using the `--type=bool` type
 specifier, `git config` will ensure that the output is "true" or
 "false" (spelled in lowercase).
 
-integer::
+`integer`::
        The value for many variables that specify various sizes can
        be suffixed with `k`, `M`,... to mean "scale the number by
        1024", "by 1024x1024", etc.
 
-color::
+`color`::
        The value for a variable that takes a color is a list of
        colors (at most two, one for foreground and one for background)
        and attributes (as many as you want), separated by spaces.
@@ -292,7 +292,7 @@ output) is set to be painted with `bold` or some other attribute.
 However, custom log formats may do more complicated and layered
 coloring, and the negated forms may be useful there.
 
-pathname::
+`pathname`::
 	A variable that takes a pathname value can be given a
 	string that begins with "`~/`" or "`~user/`", and the usual
 	tilde expansion happens to such a string: `~/`
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 34570aa445..1b594732aa 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -13,29 +13,29 @@ endif::git-diff[]
 endif::git-format-patch[]
 
 ifdef::git-format-patch[]
--p::
---no-stat::
+`-p`::
+`--no-stat`::
 	Generate plain patches without any diffstats.
 endif::git-format-patch[]
 
 ifndef::git-format-patch[]
--p::
--u::
---patch::
+`-p`::
+`-u`::
+`--patch`::
 	Generate patch (see section on generating patches).
 ifdef::git-diff[]
 	This is the default.
 endif::git-diff[]
 
--s::
---no-patch::
+`-s`::
+`--no-patch`::
 	Suppress diff output. Useful for commands like `git show` that
 	show the patch by default, or to cancel the effect of `--patch`.
 endif::git-format-patch[]
 
 ifdef::git-log[]
 --diff-merges=(off|none|first-parent|1|separate|m|combined|c|dense-combined|cc)::
---no-diff-merges::
+`--no-diff-merges`::
 	Specify diff format to be used for merge commits. Default is
 	{diff-merges-default} unless `--first-parent` is in use, in which case
 	`first-parent` is the default.
@@ -76,7 +76,7 @@ ifdef::git-log[]
 	two variants and the merge result picks one of them without
 	modification.  `--cc` implies `-p`.
 
---combined-all-paths::
+`--combined-all-paths`::
 	This flag causes combined diffs (used for merge commits) to
 	list the name of the file from all parents.  It thus only has
 	effect when `--diff-merges=[dense-]combined` is in use, and
@@ -84,26 +84,26 @@ ifdef::git-log[]
 	when either rename or copy detection have been requested).
 endif::git-log[]
 
--U<n>::
---unified=<n>::
+`-U<n>`::
+`--unified=<n>`::
 	Generate diffs with <n> lines of context instead of
 	the usual three.
 ifndef::git-format-patch[]
 	Implies `--patch`.
 endif::git-format-patch[]
 
---output=<file>::
+`--output=<file>`::
 	Output to a specific file instead of stdout.
 
---output-indicator-new=<char>::
---output-indicator-old=<char>::
---output-indicator-context=<char>::
+`--output-indicator-new=<char>`::
+`--output-indicator-old=<char>`::
+`--output-indicator-context=<char>`::
 	Specify the character used to indicate new, old or context
 	lines in the generated patch. Normally they are '+', '-' and
 	' ' respectively.
 
 ifndef::git-format-patch[]
---raw::
+`--raw`::
 ifndef::git-log[]
 	Generate the diff in raw format.
 ifdef::git-diff-core[]
@@ -120,33 +120,33 @@ endif::git-log[]
 endif::git-format-patch[]
 
 ifndef::git-format-patch[]
---patch-with-raw::
+`--patch-with-raw`::
 	Synonym for `-p --raw`.
 endif::git-format-patch[]
 
 ifdef::git-log[]
--t::
+`-t`::
 	Show the tree objects in the diff output.
 endif::git-log[]
 
---indent-heuristic::
+`--indent-heuristic`::
 	Enable the heuristic that shifts diff hunk boundaries to make patches
 	easier to read. This is the default.
 
---no-indent-heuristic::
+`--no-indent-heuristic`::
 	Disable the indent heuristic.
 
---minimal::
+`--minimal`::
 	Spend extra time to make sure the smallest possible
 	diff is produced.
 
---patience::
+`--patience`::
 	Generate a diff using the "patience diff" algorithm.
 
---histogram::
+`--histogram`::
 	Generate a diff using the "histogram diff" algorithm.
 
---anchored=<text>::
+`--anchored=<text>`::
 	Generate a diff using the "anchored diff" algorithm.
 +
 This option may be specified more than once.
@@ -194,7 +194,7 @@ have to use `--diff-algorithm=default` option.
 These parameters can also be set individually with `--stat-width=<width>`,
 `--stat-name-width=<name-width>` and `--stat-count=<count>`.
 
---compact-summary::
+`--compact-summary`::
 	Output a condensed summary of extended header information such
 	as file creations or deletions ("new" or "gone", optionally "+l"
 	if it's a symlink) and mode changes ("+x" or "-x" for adding
@@ -202,14 +202,14 @@ These parameters can also be set individually with `--stat-width=<width>`,
 	information is put between the filename part and the graph
 	part. Implies `--stat`.
 
---numstat::
+`--numstat`::
 	Similar to `--stat`, but shows number of added and
 	deleted lines in decimal notation and pathname without
 	abbreviation, to make it more machine friendly.  For
 	binary files, outputs two `-` instead of saying
 	`0 0`.
 
---shortstat::
+`--shortstat`::
 	Output only the last line of the `--stat` format containing total
 	number of modified files, as well as number of added and deleted
 	lines.
@@ -248,7 +248,7 @@ These parameters can also be set individually with `--stat-width=<width>`,
 	Note that when using `cumulative`, the sum of the percentages
 	reported may exceed 100%. The default (non-cumulative) behavior can
 	be specified with the `noncumulative` parameter.
-<limit>;;
+`<limit>`;;
 	An integer parameter specifies a cut-off percent (3% by default).
 	Directories contributing less than this percentage of the changes
 	are not shown in the output.
@@ -259,24 +259,24 @@ directories with less than 10% of the total amount of changed files,
 and accumulating child directory counts in the parent directories:
 `--dirstat=files,10,cumulative`.
 
---cumulative::
+`--cumulative`::
 	Synonym for --dirstat=cumulative
 
 --dirstat-by-file[=<param1,param2>...]::
 	Synonym for --dirstat=files,param1,param2...
 
---summary::
+`--summary`::
 	Output a condensed summary of extended header information
 	such as creations, renames and mode changes.
 
 ifndef::git-format-patch[]
---patch-with-stat::
+`--patch-with-stat`::
 	Synonym for `-p --stat`.
 endif::git-format-patch[]
 
 ifndef::git-format-patch[]
 
--z::
+`-z`::
 ifdef::git-log[]
 	Separate the commits with NULs instead of with new newlines.
 +
@@ -292,14 +292,14 @@ Without this option, pathnames with "unusual" characters are quoted as
 explained for the configuration variable `core.quotePath` (see
 linkgit:git-config[1]).
 
---name-only::
+`--name-only`::
 	Show only names of changed files.
 
---name-status::
+`--name-status`::
 	Show only names and status of changed files. See the description
 	of the `--diff-filter` option on what the status letters mean.
 
---submodule[=<format>]::
+`--submodule[=<format>]`::
 	Specify how differences in submodules are shown.  When specifying
 	`--submodule=short` the 'short' format is used.  This format just
 	shows the names of the commits at the beginning and end of the range.
@@ -311,7 +311,7 @@ linkgit:git-config[1]).
 	commit range.  Defaults to `diff.submodule` or the 'short' format
 	if the config option is unset.
 
---color[=<when>]::
+`--color[=<when>]`::
 	Show colored diff.
 	`--color` (i.e. without '=<when>') is the same as `--color=always`.
 	'<when>' can be one of `always`, `never`, or `auto`.
@@ -320,14 +320,14 @@ ifdef::git-diff[]
 	configuration settings.
 endif::git-diff[]
 
---no-color::
+`--no-color`::
 	Turn off colored diff.
 ifdef::git-diff[]
 	This can be used to override configuration settings.
 endif::git-diff[]
 	It is the same as `--color=never`.
 
---color-moved[=<mode>]::
+`--color-moved[=<mode>]`::
 	Moved lines of code are colored differently.
 ifdef::git-diff[]
 	It can be changed by the `diff.colorMoved` configuration setting.
@@ -337,40 +337,40 @@ endif::git-diff[]
 	The mode must be one of:
 +
 --
-no::
+`no`::
 	Moved lines are not highlighted.
-default::
+`default`::
 	Is a synonym for `zebra`. This may change to a more sensible mode
 	in the future.
-plain::
+`plain`::
 	Any line that is added in one location and was removed
 	in another location will be colored with `color.diff.newMoved`.
 	Similarly `color.diff.oldMoved` will be used for removed lines
 	that are added somewhere else in the diff. This mode picks up any
 	moved line, but it is not very useful in a review to determine
 	if a block of code was moved without permutation.
-blocks::
+`blocks`::
 	Blocks of moved text of at least 20 alphanumeric characters
 	are detected greedily. The detected blocks are
 	painted using either the `color.diff.{old,new}Moved` color.
 	Adjacent blocks cannot be told apart.
-zebra::
+`zebra`::
 	Blocks of moved text are detected as in 'blocks' mode. The blocks
 	are painted using either the `color.diff.{old,new}Moved` color or
 	`color.diff.{old,new}MovedAlternative`. The change between
 	the two colors indicates that a new block was detected.
-dimmed-zebra::
+`dimmed-zebra`::
 	Similar to 'zebra', but additional dimming of uninteresting parts
 	of moved code is performed. The bordering lines of two adjacent
 	blocks are considered interesting, the rest is uninteresting.
 	`dimmed_zebra` is a deprecated synonym.
 --
 
---no-color-moved::
+`--no-color-moved`::
 	Turn off move detection. This can be used to override configuration
 	settings. It is the same as `--color-moved=no`.
 
---color-moved-ws=<modes>::
+`--color-moved-ws=<modes>`::
 	This configures how whitespace is ignored when performing the
 	move detection for `--color-moved`.
 ifdef::git-diff[]
@@ -379,57 +379,57 @@ endif::git-diff[]
 	These modes can be given as a comma separated list:
 +
 --
-no::
+`no`::
 	Do not ignore whitespace when performing move detection.
-ignore-space-at-eol::
+`ignore-space-at-eol`::
 	Ignore changes in whitespace at EOL.
-ignore-space-change::
+`ignore-space-change`::
 	Ignore changes in amount of whitespace.  This ignores whitespace
 	at line end, and considers all other sequences of one or
 	more whitespace characters to be equivalent.
-ignore-all-space::
+`ignore-all-space`::
 	Ignore whitespace when comparing lines. This ignores differences
 	even if one line has whitespace where the other line has none.
-allow-indentation-change::
+`allow-indentation-change`::
 	Initially ignore any whitespace in the move detection, then
 	group the moved code blocks only into a block if the change in
 	whitespace is the same per line. This is incompatible with the
 	other modes.
 --
 
---no-color-moved-ws::
+`--no-color-moved-ws`::
 	Do not ignore whitespace when performing move detection. This can be
 	used to override configuration settings. It is the same as
 	`--color-moved-ws=no`.
 
---word-diff[=<mode>]::
+`--word-diff[=<mode>]`::
 	Show a word diff, using the <mode> to delimit changed words.
 	By default, words are delimited by whitespace; see
 	`--word-diff-regex` below.  The <mode> defaults to 'plain', and
 	must be one of:
 +
 --
-color::
+`color`::
 	Highlight changed words using only colors.  Implies `--color`.
-plain::
+`plain`::
 	Show words as `[-removed-]` and `{+added+}`.  Makes no
 	attempts to escape the delimiters if they appear in the input,
 	so the output may be ambiguous.
-porcelain::
+`porcelain`::
 	Use a special line-based format intended for script
 	consumption.  Added/removed/unchanged runs are printed in the
 	usual unified diff format, starting with a `+`/`-`/` `
 	character at the beginning of the line and extending to the
 	end of the line.  Newlines in the input are represented by a
 	tilde `~` on a line of its own.
-none::
+`none`::
 	Disable word diff again.
 --
 +
 Note that despite the name of the first mode, color is used to
 highlight the changed parts in all modes if enabled.
 
---word-diff-regex=<regex>::
+`--word-diff-regex=<regex>`::
 	Use <regex> to decide what a word is, instead of considering
 	runs of non-whitespace to be a word.  Also implies
 	`--word-diff` unless it was already enabled.
@@ -450,20 +450,20 @@ linkgit:gitattributes[5] or linkgit:git-config[1].  Giving it explicitly
 overrides any diff driver or configuration setting.  Diff drivers
 override configuration settings.
 
---color-words[=<regex>]::
+`--color-words[=<regex>]`::
 	Equivalent to `--word-diff=color` plus (if a regex was
 	specified) `--word-diff-regex=<regex>`.
 endif::git-format-patch[]
 
---no-renames::
+`--no-renames`::
 	Turn off rename detection, even when the configuration
 	file gives the default to do so.
 
---[no-]rename-empty::
+`--[no-]rename-empty`::
 	Whether to use empty blobs as rename source.
 
 ifndef::git-format-patch[]
---check::
+`--check`::
 	Warn if changes introduce conflict markers or whitespace errors.
 	What are considered whitespace errors is controlled by `core.whitespace`
 	configuration.  By default, trailing whitespaces (including
@@ -473,7 +473,7 @@ ifndef::git-format-patch[]
 	Exits with non-zero status if problems are found. Not compatible
 	with `--exit-code`.
 
---ws-error-highlight=<kind>::
+`--ws-error-highlight=<kind>`::
 	Highlight whitespace errors in the `context`, `old` or `new`
 	lines of the diff.  Multiple values are separated by comma,
 	`none` resets previous values, `default` reset the list to
@@ -485,19 +485,19 @@ ifndef::git-format-patch[]
 
 endif::git-format-patch[]
 
---full-index::
+`--full-index`::
 	Instead of the first handful of characters, show the full
 	pre- and post-image blob object names on the "index"
 	line when generating patch format output.
 
---binary::
+`--binary`::
 	In addition to `--full-index`, output a binary diff that
 	can be applied with `git-apply`.
 ifndef::git-format-patch[]
 	Implies `--patch`.
 endif::git-format-patch[]
 
---abbrev[=<n>]::
+`--abbrev[=<n>]`::
 	Instead of showing the full 40-byte hexadecimal object
 	name in diff-raw format output and diff-tree header
 	lines, show the shortest prefix that is at least '<n>'
@@ -530,8 +530,8 @@ addition and deletion compared to 20% or more of the file's size are
 eligible for being picked up as a possible source of a rename to
 another file.
 
--M[<n>]::
---find-renames[=<n>]::
+`-M[<n>]`::
+`--find-renames[=<n>]`::
 ifndef::git-log[]
 	Detect renames.
 endif::git-log[]
@@ -550,12 +550,12 @@ endif::git-log[]
 	the same as `-M5%`.  To limit detection to exact renames, use
 	`-M100%`.  The default similarity index is 50%.
 
--C[<n>]::
---find-copies[=<n>]::
+`-C[<n>]`::
+`--find-copies[=<n>]`::
 	Detect copies as well as renames.  See also `--find-copies-harder`.
 	If `n` is specified, it has the same meaning as for `-M<n>`.
 
---find-copies-harder::
+`--find-copies-harder`::
 	For performance reasons, by default, `-C` option finds copies only
 	if the original file of the copy was modified in the same
 	changeset.  This flag makes the command
@@ -564,8 +564,8 @@ endif::git-log[]
 	projects, so use it with caution.  Giving more than one
 	`-C` option has the same effect.
 
--D::
---irreversible-delete::
+`-D`::
+`--irreversible-delete`::
 	Omit the preimage for deletes, i.e. print only the header but not
 	the diff between the preimage and `/dev/null`. The resulting patch
 	is not meant to be applied with `patch` or `git apply`; this is
@@ -577,7 +577,7 @@ endif::git-log[]
 When used together with `-B`, omit also the preimage in the deletion part
 of a delete/create pair.
 
--l<num>::
+`-l<num>`::
 	The `-M` and `-C` options require O(n^2) processing time where n
 	is the number of potential rename/copy targets.  This
 	option prevents rename/copy detection from running if
@@ -606,7 +606,7 @@ from the index to the working tree can never have Added entries
 the index).  Similarly, copied and renamed entries cannot appear if
 detection for those types is disabled.
 
--S<string>::
+`-S<string>`::
 	Look for differences that change the number of occurrences of
 	the specified string (i.e. addition/deletion) in a file.
 	Intended for the scripter's use.
@@ -619,7 +619,7 @@ very first version of the block.
 +
 Binary files are searched as well.
 
--G<regex>::
+`-G<regex>`::
 	Look for differences whose patch text contains added/removed
 	lines that match <regex>.
 +
@@ -643,7 +643,7 @@ filter will be ignored.
 See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
 information.
 
---find-object=<object-id>::
+`--find-object=<object-id>`::
 	Look for differences that change the number of occurrences of
 	the specified object. Similar to `-S`, just the argument is different
 	in that it doesn't search for a specific string but for a specific
@@ -652,18 +652,18 @@ information.
 The object can be a blob or a submodule commit. It implies the `-t` option in
 `git-log` to also find trees.
 
---pickaxe-all::
+`--pickaxe-all`::
 	When `-S` or `-G` finds a change, show all the changes in that
 	changeset, not just the files that contain the change
 	in <string>.
 
---pickaxe-regex::
+`--pickaxe-regex`::
 	Treat the <string> given to `-S` as an extended POSIX regular
 	expression to match.
 
 endif::git-format-patch[]
 
--O<orderfile>::
+`-O<orderfile>`::
 	Control the order in which files appear in the output.
 	This overrides the `diff.orderFile` configuration variable
 	(see linkgit:git-config[1]).  To cancel `diff.orderFile`,
@@ -700,8 +700,8 @@ matches a pattern if removing any number of the final pathname
 components matches the pattern.  For example, the pattern "`foo*bar`"
 matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`".
 
---skip-to=<file>::
---rotate-to=<file>::
+`--skip-to=<file>`::
+`--rotate-to=<file>`::
 	Discard the files before the named <file> from the output
 	(i.e. 'skip to'), or move them to the end of the output
 	(i.e. 'rotate to').  These were invented primarily for use
@@ -709,13 +709,13 @@ matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`".
 	otherwise.
 
 ifndef::git-format-patch[]
--R::
+`-R`::
 	Swap two inputs; that is, show differences from index or
 	on-disk file to tree contents.
 endif::git-format-patch[]
 
---relative[=<path>]::
---no-relative::
+`--relative[=<path>]`::
+`--no-relative`::
 	When run from a subdirectory of the project, it can be
 	told to exclude changes outside the directory and show
 	pathnames relative to it with this option.  When you are
@@ -725,44 +725,44 @@ endif::git-format-patch[]
 	`--no-relative` can be used to countermand both `diff.relative` config
 	option and previous `--relative`.
 
--a::
---text::
+`-a`::
+`--text`::
 	Treat all files as text.
 
---ignore-cr-at-eol::
+`--ignore-cr-at-eol`::
 	Ignore carriage-return at the end of line when doing a comparison.
 
---ignore-space-at-eol::
+`--ignore-space-at-eol`::
 	Ignore changes in whitespace at EOL.
 
--b::
---ignore-space-change::
+`-b`::
+`--ignore-space-change`::
 	Ignore changes in amount of whitespace.  This ignores whitespace
 	at line end, and considers all other sequences of one or
 	more whitespace characters to be equivalent.
 
--w::
---ignore-all-space::
+`-w`::
+`--ignore-all-space`::
 	Ignore whitespace when comparing lines.  This ignores
 	differences even if one line has whitespace where the other
 	line has none.
 
---ignore-blank-lines::
+`--ignore-blank-lines`::
 	Ignore changes whose lines are all blank.
 
--I<regex>::
---ignore-matching-lines=<regex>::
+`-I<regex>`::
+`--ignore-matching-lines=<regex>`::
 	Ignore changes whose all lines match <regex>.  This option may
 	be specified more than once.
 
---inter-hunk-context=<lines>::
+`--inter-hunk-context=<lines>`::
 	Show the context between diff hunks, up to the specified number
 	of lines, thereby fusing hunks that are close to each other.
 	Defaults to `diff.interHunkContext` or 0 if the config option
 	is unset.
 
--W::
---function-context::
+`-W`::
+`--function-context`::
 	Show whole function as context lines for each change.
 	The function names are determined in the same way as
 	`git diff` works out patch hunk headers (see 'Defining a
@@ -770,26 +770,26 @@ endif::git-format-patch[]
 
 ifndef::git-format-patch[]
 ifndef::git-log[]
---exit-code::
+`--exit-code`::
 	Make the program exit with codes similar to diff(1).
 	That is, it exits with 1 if there were differences and
 	0 means no differences.
 
---quiet::
+`--quiet`::
 	Disable all output of the program. Implies `--exit-code`.
 endif::git-log[]
 endif::git-format-patch[]
 
---ext-diff::
+`--ext-diff`::
 	Allow an external diff helper to be executed. If you set an
 	external diff driver with linkgit:gitattributes[5], you need
 	to use this option with linkgit:git-log[1] and friends.
 
---no-ext-diff::
+`--no-ext-diff`::
 	Disallow external diff drivers.
 
---textconv::
---no-textconv::
+`--textconv`::
+`--no-textconv`::
 	Allow (or disallow) external text conversion filters to be run
 	when comparing binary files. See linkgit:gitattributes[5] for
 	details. Because textconv filters are typically a one-way
@@ -799,7 +799,7 @@ endif::git-format-patch[]
 	linkgit:git-log[1], but not for linkgit:git-format-patch[1] or
 	diff plumbing commands.
 
---ignore-submodules[=<when>]::
+`--ignore-submodules[=<when>]`::
 	Ignore changes to submodules in the diff generation. <when> can be
 	either "none", "untracked", "dirty" or "all", which is the default.
 	Using "none" will consider the submodule modified when it either contains
@@ -812,19 +812,19 @@ endif::git-format-patch[]
 	only changes to the commits stored in the superproject are shown (this was
 	the behavior until 1.7.0). Using "all" hides all changes to submodules.
 
---src-prefix=<prefix>::
+`--src-prefix=<prefix>`::
 	Show the given source prefix instead of "a/".
 
---dst-prefix=<prefix>::
+`--dst-prefix=<prefix>`::
 	Show the given destination prefix instead of "b/".
 
---no-prefix::
+`--no-prefix`::
 	Do not show any source or destination prefix.
 
---line-prefix=<prefix>::
+`--line-prefix=<prefix>`::
 	Prepend an additional prefix to every line of output.
 
---ita-invisible-in-index::
+`--ita-invisible-in-index`::
 	By default entries added by `git add -N` appear as an existing
 	empty file in `git diff` and a new file in `git diff --cached`.
 	This option makes the entry appear as a new file in `git diff`
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 94de13eec8..fcee0ad87d 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -1,38 +1,38 @@
---all::
+`--all`::
 	Fetch all remotes.
 
--a::
---append::
+`-a`::
+`--append`::
 	Append ref names and object names of fetched refs to the
 	existing contents of `.git/FETCH_HEAD`.  Without this
 	option old data in `.git/FETCH_HEAD` will be overwritten.
 
---atomic::
+`--atomic`::
 	Use an atomic transaction to update local refs. Either all refs are
 	updated, or on error, no refs are updated.
 
---depth=<depth>::
+`--depth=<depth>`::
 	Limit fetching to the specified number of commits from the tip of
 	each remote branch history. If fetching to a 'shallow' repository
 	created by `git clone` with `--depth=<depth>` option (see
 	linkgit:git-clone[1]), deepen or shorten the history to the specified
 	number of commits. Tags for the deepened commits are not fetched.
 
---deepen=<depth>::
+`--deepen=<depth>`::
 	Similar to --depth, except it specifies the number of commits
 	from the current shallow boundary instead of from the tip of
 	each remote branch history.
 
---shallow-since=<date>::
+`--shallow-since=<date>`::
 	Deepen or shorten the history of a shallow repository to
 	include all reachable commits after <date>.
 
---shallow-exclude=<revision>::
+`--shallow-exclude=<revision>`::
 	Deepen or shorten the history of a shallow repository to
 	exclude commits reachable from a specified remote branch or tag.
 	This option can be specified multiple times.
 
---unshallow::
+`--unshallow`::
 	If the source repository is complete, convert a shallow
 	repository to a complete one, removing all the limitations
 	imposed by shallow repositories.
@@ -40,7 +40,7 @@
 If the source repository is shallow, fetch as much as possible so that
 the current repository has the same history as the source repository.
 
---update-shallow::
+`--update-shallow`::
 	By default when fetching from a shallow repository,
 	`git fetch` refuses refs that require updating
 	`.git/shallow`. This option updates `.git/shallow` and accept such
@@ -65,11 +65,11 @@ this option multiple times, one for each matching ref name.
 See also the `fetch.negotiationAlgorithm` configuration variable
 documented in linkgit:git-config[1].
 
---dry-run::
+`--dry-run`::
 	Show what would be done, without making any changes.
 
 ifndef::git-pull[]
---[no-]write-fetch-head::
+`--[no-]write-fetch-head`::
 	Write the list of remote refs fetched in the `FETCH_HEAD`
 	file directly under `$GIT_DIR`.  This is the default.
 	Passing `--no-write-fetch-head` from the command line tells
@@ -77,8 +77,8 @@ ifndef::git-pull[]
 	file is never written.
 endif::git-pull[]
 
--f::
---force::
+`-f`::
+`--force`::
 	When `git fetch` is used with `<src>:<dst>` refspec it may
 	refuse to update the local branch as discussed
 ifdef::git-pull[]
@@ -90,28 +90,28 @@ ifndef::git-pull[]
 endif::git-pull[]
 	This option overrides that check.
 
--k::
---keep::
+`-k`::
+`--keep`::
 	Keep downloaded pack.
 
 ifndef::git-pull[]
---multiple::
+`--multiple`::
 	Allow several <repository> and <group> arguments to be
 	specified. No <refspec>s may be specified.
 
---[no-]auto-maintenance::
---[no-]auto-gc::
+`--[no-]auto-maintenance`::
+`--[no-]auto-gc`::
 	Run `git maintenance run --auto` at the end to perform automatic
 	repository maintenance if needed. (`--[no-]auto-gc` is a synonym.)
 	This is enabled by default.
 
---[no-]write-commit-graph::
+`--[no-]write-commit-graph`::
 	Write a commit-graph after fetching. This overrides the config
 	setting `fetch.writeCommitGraph`.
 endif::git-pull[]
 
--p::
---prune::
+`-p`::
+`--prune`::
 	Before fetching, remove any remote-tracking references that no
 	longer exist on the remote.  Tags are not subject to pruning
 	if they are fetched only because of the default tag
@@ -125,8 +125,8 @@ ifndef::git-pull[]
 +
 See the PRUNING section below for more details.
 
--P::
---prune-tags::
+`-P`::
+`--prune-tags`::
 	Before fetching, remove any local tags that no longer exist on
 	the remote if `--prune` is enabled. This option should be used
 	more carefully, unlike `--prune` it will remove any local
@@ -139,16 +139,16 @@ See the PRUNING section below for more details.
 endif::git-pull[]
 
 ifndef::git-pull[]
--n::
+`-n`::
 endif::git-pull[]
---no-tags::
+`--no-tags`::
 	By default, tags that point at objects that are downloaded
 	from the remote repository are fetched and stored locally.
 	This option disables this automatic tag following. The default
 	behavior for a remote may be specified with the remote.<name>.tagOpt
 	setting. See linkgit:git-config[1].
 
---refmap=<refspec>::
+`--refmap=<refspec>`::
 	When fetching refs listed on the command line, use the
 	specified refspec (can be given more than once) to map the
 	refs to remote-tracking branches, instead of the values of
@@ -159,8 +159,8 @@ endif::git-pull[]
 	command-line arguments. See section on "Configured Remote-tracking
 	Branches" for details.
 
--t::
---tags::
+`-t`::
+`--tags`::
 	Fetch all tags from the remote (i.e., fetch remote tags
 	`refs/tags/*` into local tags with the same name), in addition
 	to whatever else would otherwise be fetched.  Using this
@@ -182,8 +182,8 @@ ifndef::git-pull[]
 	`fetch.recurseSubmodules` is set (see linkgit:git-config[1]).
 endif::git-pull[]
 
--j::
---jobs=<n>::
+`-j`::
+`--jobs=<n>`::
 	Number of parallel children to be used for all forms of fetching.
 +
 If the `--multiple` option was specified, the different remotes will be fetched
@@ -195,12 +195,12 @@ Typically, parallel recursive and multi-remote fetches will be faster. By
 default fetches are performed sequentially, not in parallel.
 
 ifndef::git-pull[]
---no-recurse-submodules::
+`--no-recurse-submodules`::
 	Disable recursive fetching of submodules (this has the same effect as
 	using the `--recurse-submodules=no` option).
 endif::git-pull[]
 
---set-upstream::
+`--set-upstream`::
 	If the remote is fetched successfully, add upstream
 	(tracking) reference, used by argument-less
 	linkgit:git-pull[1] and other commands. For more information,
@@ -208,7 +208,7 @@ endif::git-pull[]
 	linkgit:git-config[1].
 
 ifndef::git-pull[]
---submodule-prefix=<path>::
+`--submodule-prefix=<path>`::
 	Prepend <path> to paths printed in informative messages
 	such as "Fetching submodule foo".  This option is used
 	internally when recursing over submodules.
@@ -221,8 +221,8 @@ ifndef::git-pull[]
 	linkgit:git-config[1]) override this option, as does
 	specifying --[no-]recurse-submodules directly.
 
--u::
---update-head-ok::
+`-u`::
+`--update-head-ok`::
 	By default `git fetch` refuses to update the head which
 	corresponds to the current branch.  This flag disables the
 	check.  This is purely for the internal use for `git pull`
@@ -238,25 +238,25 @@ endif::git-pull[]
 	run on the other end.
 
 ifndef::git-pull[]
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Pass `--quiet` to `git-fetch-pack` and silence any other internally
 	used `git` commands. Progress is not reported to the standard error
 	stream.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Be verbose.
 endif::git-pull[]
 
---progress::
+`--progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless -q
 	is specified. This flag forces progress status even if the
 	standard error stream is not directed to a terminal.
 
 -o <option>::
---server-option=<option>::
+`--server-option=<option>`::
 	Transmit the given string to the server when communicating using
 	protocol version 2.  The given string must not contain a NUL or LF
 	character.  The server's handling of server options, including
@@ -264,13 +264,13 @@ endif::git-pull[]
 	When multiple `--server-option=<option>` are given, they are all
 	sent to the other side in the order listed on the command line.
 
---show-forced-updates::
+`--show-forced-updates`::
 	By default, `git` checks if a branch is force-updated during
 	fetch. This can be disabled through `fetch.showForcedUpdates`, but
 	the `--show-forced-updates` option guarantees this check occurs.
 	See linkgit:git-config[1].
 
---no-show-forced-updates::
+`--no-show-forced-updates`::
 	By default, `git` checks if a branch is force-updated during
 	fetch. Pass `--no-show-forced-updates` or set `fetch.showForcedUpdates`
 	to false to skip this check for performance reasons. If used during
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index 786c31fc60..646951cf7e 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -66,28 +66,28 @@ OPTIONS
 For more details about the <pathspec> syntax, see the 'pathspec' entry
 in linkgit:gitglossary[7].
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Don't actually add the file(s), just show if they exist and/or will
 	be ignored.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
         Be verbose.
 
--f::
---force::
+`-f`::
+`--force`::
 	Allow adding otherwise ignored files.
 
--i::
---interactive::
+`-i`::
+`--interactive`::
 	Add modified contents in the working tree interactively to
 	the index. Optional path arguments may be supplied to limit
 	operation to a subset of the working tree. See ``Interactive
 	mode'' for details.
 
--p::
---patch::
+`-p`::
+`--patch`::
 	Interactively choose hunks of patch between the index and the
 	work tree and add them to the index. This gives the user a chance
 	to review the difference before adding modified contents to the
@@ -97,8 +97,8 @@ This effectively runs `add --interactive`, but bypasses the
 initial command menu and directly jumps to the `patch` subcommand.
 See ``Interactive mode'' for details.
 
--e::
---edit::
+`-e`::
+`--edit`::
 	Open the diff vs. the index in an editor and let the user
 	edit it.  After the editor was closed, adjust the hunk headers
 	and apply the patch to the index.
@@ -109,8 +109,8 @@ quicker and more flexible than using the interactive hunk selector.
 However, it is easy to confuse oneself and create a patch that does not
 apply to the index. See EDITING PATCHES below.
 
--u::
---update::
+`-u`::
+`--update`::
 	Update the index just where it already has an entry matching
 	<pathspec>.  This removes as well as modifies index entries to
 	match the working tree, but adds no new files.
@@ -120,9 +120,9 @@ tracked files in the entire working tree are updated (old versions
 of Git used to limit the update to the current directory and its
 subdirectories).
 
--A::
---all::
---no-ignore-removal::
+`-A`::
+`--all`::
+`--no-ignore-removal`::
 	Update the index not only where the working tree has a file
 	matching <pathspec> but also where the index already has an
 	entry. This adds, modifies, and removes index entries to
@@ -133,8 +133,8 @@ files in the entire working tree are updated (old versions
 of Git used to limit the update to the current directory and its
 subdirectories).
 
---no-all::
---ignore-removal::
+`--no-all`::
+`--ignore-removal`::
 	Update the index by adding new files that are unknown to the
 	index and files modified in the working tree, but ignore
 	files that have been removed from the working tree.  This
@@ -144,39 +144,39 @@ This option is primarily to help users who are used to older
 versions of Git, whose `git add <pathspec>...` was a synonym
 for `git add --no-all <pathspec>...`, i.e. ignored removed files.
 
--N::
---intent-to-add::
+`-N`::
+`--intent-to-add`::
 	Record only the fact that the path will be added later. An entry
 	for the path is placed in the index with no content. This is
 	useful for, among other things, showing the unstaged content of
 	such files with `git diff` and committing them with `git commit
 	-a`.
 
---refresh::
+`--refresh`::
 	Don't add the file(s), but only refresh their stat()
 	information in the index.
 
---ignore-errors::
+`--ignore-errors`::
 	If some files could not be added because of errors indexing
 	them, do not abort the operation, but continue adding the
 	others. The command shall still exit with non-zero status.
 	The configuration variable `add.ignoreErrors` can be set to
 	true to make this the default behaviour.
 
---ignore-missing::
+`--ignore-missing`::
 	This option can only be used together with `--dry-run`. By using
 	this option the user can check if any of the given files would
 	be ignored, no matter if they are already present in the work
 	tree or not.
 
---no-warn-embedded-repo::
+`--no-warn-embedded-repo`::
 	By default, `git add` will warn when adding an embedded
 	repository to the index without using `git submodule add` to
 	create an entry in `.gitmodules`. This option will suppress the
 	warning (e.g., if you are manually performing operations on
 	submodules).
 
---renormalize::
+`--renormalize`::
 	Apply the "clean" process freshly to all tracked files to
 	forcibly add them again to the index.  This is useful after
 	changing `core.autocrlf` configuration or the `text` attribute
@@ -188,7 +188,7 @@ for `git add --no-all <pathspec>...`, i.e. ignored removed files.
 	bit is only changed in the index, the files on disk are left
 	unchanged.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	Pathspec is passed in `<file>` instead of commandline args. If
 	`<file>` is exactly `-` then standard input is used. Pathspec
 	elements are separated by LF or CR/LF. Pathspec elements can be
@@ -196,7 +196,7 @@ for `git add --no-all <pathspec>...`, i.e. ignored removed files.
 	(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 	global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	Only meaningful with `--pathspec-from-file`. Pathspec elements are
 	separated with NUL character and all other characters are taken
 	literally (including newlines and quotes).
@@ -254,7 +254,7 @@ choice is unique.
 
 The main command loop has 6 subcommands (plus help and quit).
 
-status::
+`status`::
 
    This shows the change between `HEAD` and index (i.e. what will be
    committed if you say `git commit`), and between index and
@@ -278,7 +278,7 @@ and 35 lines deleted if you commit what is in the index, but
 working tree file has further modifications (one addition and
 one deletion).
 
-update::
+`update`::
 
    This shows the status information and issues an "Update>>"
    prompt.  When the prompt ends with double '>>', you can
@@ -307,7 +307,7 @@ Update>> -2
 After making the selection, answer with an empty line to stage the
 contents of working tree files for selected paths in the index.
 
-revert::
+`revert`::
 
   This has a very similar UI to 'update', and the staged
   information for selected paths are reverted to that of the
@@ -318,7 +318,7 @@ add untracked::
   This has a very similar UI to 'update' and
   'revert', and lets you add untracked paths to the index.
 
-patch::
+`patch`::
 
   This lets you choose one path out of a 'status' like selection.
   After choosing the path, it presents the diff between the index
@@ -347,7 +347,7 @@ that was chosen, the index is updated with the selected hunks.
 You can omit having to type return here, by setting the configuration
 variable `interactive.singleKey` to `true`.
 
-diff::
+`diff`::
 
   This lets you review what will be committed (i.e. between
   `HEAD` and index).
diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index 80f2f89cbd..c8560bacad 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.txt
@@ -31,50 +31,50 @@ OPTIONS
 	supply this argument, the command reads from the standard input.
 	If you supply directories, they will be treated as Maildirs.
 
--s::
---signoff::
+`-s`::
+`--signoff`::
 	Add a `Signed-off-by` trailer to the commit message, using
 	the committer identity of yourself.
 	See the signoff option in linkgit:git-commit[1] for more information.
 
--k::
---keep::
+`-k`::
+`--keep`::
 	Pass `-k` flag to `git mailinfo` (see linkgit:git-mailinfo[1]).
 
---keep-non-patch::
+`--keep-non-patch`::
 	Pass `-b` flag to `git mailinfo` (see linkgit:git-mailinfo[1]).
 
---[no-]keep-cr::
+`--[no-]keep-cr`::
 	With `--keep-cr`, call `git mailsplit` (see linkgit:git-mailsplit[1])
 	with the same option, to prevent it from stripping CR at the end of
 	lines. `am.keepcr` configuration variable can be used to specify the
 	default behaviour.  `--no-keep-cr` is useful to override `am.keepcr`.
 
--c::
---scissors::
+`-c`::
+`--scissors`::
 	Remove everything in body before a scissors line (see
 	linkgit:git-mailinfo[1]). Can be activated by default using
 	the `mailinfo.scissors` configuration variable.
 
---no-scissors::
+`--no-scissors`::
 	Ignore scissors lines (see linkgit:git-mailinfo[1]).
 
--m::
---message-id::
+`-m`::
+`--message-id`::
 	Pass the `-m` flag to `git mailinfo` (see linkgit:git-mailinfo[1]),
 	so that the Message-ID header is added to the commit message.
 	The `am.messageid` configuration variable can be used to specify
 	the default behaviour.
 
---no-message-id::
+`--no-message-id`::
 	Do not add the Message-ID header to the commit message.
 	`no-message-id` is useful to override `am.messageid`.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Be quiet. Only print error messages.
 
--u::
+`-u`::
 --utf8::
 	Pass `-u` flag to `git mailinfo` (see linkgit:git-mailinfo[1]).
 	The proposed commit log message taken from the e-mail
@@ -99,65 +99,65 @@ default.   You can use `--no-utf8` to override this.
 	am.threeWay configuration variable. For more information,
 	see `am.threeWay` in linkgit:git-config[1].
 
---rerere-autoupdate::
---no-rerere-autoupdate::
+`--rerere-autoupdate`::
+`--no-rerere-autoupdate`::
 	Allow the rerere mechanism to update the index with the
 	result of auto-conflict resolution if possible.
 
---ignore-space-change::
---ignore-whitespace::
---whitespace=<option>::
--C<n>::
--p<n>::
---directory=<dir>::
---exclude=<path>::
---include=<path>::
---reject::
+`--ignore-space-change`::
+`--ignore-whitespace`::
+`--whitespace=<option>`::
+`-C<n>`::
+`-p<n>`::
+`--directory=<dir>`::
+`--exclude=<path>`::
+`--include=<path>`::
+`--reject`::
 	These flags are passed to the `git apply` (see linkgit:git-apply[1])
 	program that applies
 	the patch.
 
---patch-format::
+`--patch-format`::
 	By default the command will try to detect the patch format
 	automatically. This option allows the user to bypass the automatic
 	detection and specify the patch format that the patch(es) should be
 	interpreted as. Valid formats are mbox, mboxrd,
 	stgit, stgit-series and hg.
 
--i::
---interactive::
+`-i`::
+`--interactive`::
 	Run interactively.
 
---committer-date-is-author-date::
+`--committer-date-is-author-date`::
 	By default the command records the date from the e-mail
 	message as the commit author date, and uses the time of
 	commit creation as the committer date. This allows the
 	user to lie about the committer date by using the same
 	value as the author date.
 
---ignore-date::
+`--ignore-date`::
 	By default the command records the date from the e-mail
 	message as the commit author date, and uses the time of
 	commit creation as the committer date. This allows the
 	user to lie about the author date by using the same
 	value as the committer date.
 
---skip::
+`--skip`::
 	Skip the current patch.  This is only meaningful when
 	restarting an aborted patch.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign commits. The `keyid` argument is optional and
 	defaults to the committer identity; if specified, it must be
 	stuck to the option without a space. `--no-gpg-sign` is useful to
 	countermand both `commit.gpgSign` configuration variable, and
 	earlier `--gpg-sign`.
 
---continue::
--r::
---resolved::
+`--continue`::
+`-r`::
+`--resolved`::
 	After a patch failure (e.g. attempting to apply
 	conflicting patch), the user has applied it by hand and
 	the index file stores the result of the application.
@@ -165,17 +165,17 @@ default.   You can use `--no-utf8` to override this.
 	extracted from the e-mail message and the current index
 	file, and continue.
 
---resolvemsg=<msg>::
+`--resolvemsg=<msg>`::
 	When a patch failure occurs, <msg> will be printed
 	to the screen before exiting.  This overrides the
 	standard message informing you to use `--continue`
 	or `--skip` to handle the failure.  This is solely
 	for internal use between `git rebase` and `git am`.
 
---abort::
+`--abort`::
 	Restore the original branch and abort the patching operation.
 
---quit::
+`--quit`::
 	Abort the patching operation but keep `HEAD` and the index
 	untouched.
 
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt
index a836021d5e..88cdddb178 100644
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.txt
@@ -38,29 +38,29 @@ OPTIONS
 	The files to read the patch from.  '-' can be used to read
 	from the standard input.
 
---stat::
+`--stat`::
 	Instead of applying the patch, output diffstat for the
 	input.  Turns off "apply".
 
---numstat::
+`--numstat`::
 	Similar to `--stat`, but shows the number of added and
 	deleted lines in decimal notation and the pathname without
 	abbreviation, to make it more machine friendly.  For
 	binary files, outputs two `-` instead of saying
 	`0 0`.  Turns off "apply".
 
---summary::
+`--summary`::
 	Instead of applying the patch, output a condensed
 	summary of information obtained from `git diff` extended
 	headers, such as creations, renames and mode changes.
 	Turns off "apply".
 
---check::
+`--check`::
 	Instead of applying the patch, see if the patch is
 	applicable to the current working tree and/or the index
 	file and detects errors.  Turns off "apply".
 
---index::
+`--index`::
 	Apply the patch to both the index and the working tree (or
 	merely check that it would apply cleanly to both if `--check` is
 	in effect). Note that `--index` expects index entries and
@@ -69,12 +69,12 @@ OPTIONS
 	raise an error if they are not, even if the patch would apply
 	cleanly to both the index and the working tree in isolation.
 
---cached::
+`--cached`::
 	Apply the patch to just the index, without touching the working
 	tree. If `--check` is in effect, merely check that it would
 	apply cleanly to the index entry.
 
---intent-to-add::
+`--intent-to-add`::
 	When applying the patch only to the working tree, mark new
 	files to be added to the index later (see `--intent-to-add`
 	option in linkgit:git-add[1]). This option is ignored unless
@@ -91,7 +91,7 @@ OPTIONS
 	resolve.  This option implies the `--index` option, and is incompatible
 	with the `--reject` and the `--cached` options.
 
---build-fake-ancestor=<file>::
+`--build-fake-ancestor=<file>`::
 	Newer `git diff` output has embedded 'index information'
 	for each blob to help identify the original version that
 	the patch applies to.  When this flag is given, and if
@@ -101,18 +101,18 @@ OPTIONS
 When a pure mode change is encountered (which has no index information),
 the information is read from the current index instead.
 
--R::
---reverse::
+`-R`::
+`--reverse`::
 	Apply the patch in reverse.
 
---reject::
+`--reject`::
 	For atomicity, `git apply` by default fails the whole patch and
 	does not touch the working tree when some of the hunks
 	do not apply.  This option makes it apply
 	the parts of the patch that are applicable, and leave the
 	rejected hunks in corresponding *.rej files.
 
--z::
+`-z`::
 	When `--numstat` has been given, do not munge pathnames,
 	but use a NUL-terminated machine-readable format.
 +
@@ -120,19 +120,19 @@ Without this option, pathnames with "unusual" characters are quoted as
 explained for the configuration variable `core.quotePath` (see
 linkgit:git-config[1]).
 
--p<n>::
+`-p<n>`::
 	Remove <n> leading path components (separated by slashes) from
 	traditional diff paths. E.g., with `-p2`, a patch against
 	`a/dir/file` will be applied directly to `file`. The default is
 	1.
 
--C<n>::
+`-C<n>`::
 	Ensure at least <n> lines of surrounding context match before
 	and after each change.  When fewer lines of surrounding
 	context exist they all must match.  By default no context is
 	ever ignored.
 
---unidiff-zero::
+`--unidiff-zero`::
 	By default, `git apply` expects that the patch being
 	applied is a unified diff with at least one line of context.
 	This provides good safety measures, but breaks down when
@@ -142,33 +142,33 @@ linkgit:git-config[1]).
 Note, for the reasons stated above usage of context-free patches is
 discouraged.
 
---apply::
+`--apply`::
 	If you use any of the options marked "Turns off
 	'apply'" above, `git apply` reads and outputs the
 	requested information without actually applying the
 	patch.  Give this flag after those flags to also apply
 	the patch.
 
---no-add::
+`--no-add`::
 	When applying a patch, ignore additions made by the
 	patch.  This can be used to extract the common part between
 	two files by first running 'diff' on them and applying
 	the result with this option, which would apply the
 	deletion part but not the addition part.
 
---allow-binary-replacement::
---binary::
+`--allow-binary-replacement`::
+`--binary`::
 	Historically we did not allow binary patch applied
 	without an explicit permission from the user, and this
 	flag was the way to do so.  Currently we always allow binary
 	patch application, so this is a no-op.
 
---exclude=<path-pattern>::
+`--exclude=<path-pattern>`::
 	Don't apply changes to files matching the given path pattern. This can
 	be useful when importing patchsets, where you want to exclude certain
 	files or directories.
 
---include=<path-pattern>::
+`--include=<path-pattern>`::
 	Apply changes to files matching the given path pattern. This can
 	be useful when importing patchsets, where you want to include certain
 	files or directories.
@@ -179,15 +179,15 @@ patch to each path is used.  A patch to a path that does not match any
 include/exclude pattern is used by default if there is no include pattern
 on the command line, and ignored if there is any include pattern.
 
---ignore-space-change::
---ignore-whitespace::
+`--ignore-space-change`::
+`--ignore-whitespace`::
 	When applying a patch, ignore changes in whitespace in context
 	lines if necessary.
 	Context lines will preserve their whitespace, and they will not
 	undergo whitespace fixing regardless of the value of the
 	`--whitespace` option. New lines will still be fixed, though.
 
---whitespace=<action>::
+`--whitespace=<action>`::
 	When applying a patch, detect a new or modified line that has
 	whitespace errors.  What are considered whitespace errors is
 	controlled by `core.whitespace` configuration.  By default,
@@ -214,25 +214,25 @@ behavior:
   to apply the patch.
 * `error-all` is similar to `error` but shows all errors.
 
---inaccurate-eof::
+`--inaccurate-eof`::
 	Under certain circumstances, some versions of 'diff' do not correctly
 	detect a missing new-line at the end of the file. As a result, patches
 	created by such 'diff' programs do not record incomplete lines
 	correctly. This option adds support for applying such patches by
 	working around this bug.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Report progress to stderr. By default, only a message about the
 	current patch being applied will be printed. This option will cause
 	additional information to be reported.
 
---recount::
+`--recount`::
 	Do not trust the line counts in the hunk headers, but infer them
 	by inspecting the patch (e.g. after editing the patch without
 	adjusting the hunk headers appropriately).
 
---directory=<root>::
+`--directory=<root>`::
 	Prepend <root> to all filenames.  If a `-p` argument was also passed,
 	it is applied before prepending the new root.
 +
@@ -240,7 +240,7 @@ For example, a patch that talks about updating `a/git-gui.sh` to `b/git-gui.sh`
 can be applied to the file in the working tree `modules/git-gui/git-gui.sh` by
 running `git apply --directory=modules/git-gui`.
 
---unsafe-paths::
+`--unsafe-paths`::
 	By default, a patch that affects outside the working area
 	(either a Git controlled working tree, or the current working
 	directory when `git apply` is used as a replacement of GNU
diff --git a/Documentation/git-archimport.txt b/Documentation/git-archimport.txt
index 72237659d9..8ea76463bf 100644
--- a/Documentation/git-archimport.txt
+++ b/Documentation/git-archimport.txt
@@ -68,22 +68,22 @@ patches that have been traded out-of-sequence between the branches.
 OPTIONS
 -------
 
--h::
+`-h`::
 	Display usage.
 
--v::
+`-v`::
 	Verbose output.
 
--T::
+`-T`::
 	Many tags. Will create a tag for every commit, reflecting the commit
 	name in the Arch repository.
 
--f::
+`-f`::
 	Use the fast patchset import strategy.  This can be significantly
 	faster for large trees, but cannot handle directory renames or
 	permissions changes.  The default strategy is slow and safe.
 
--o::
+`-o`::
 	Use this for compatibility with old-style branch names used by
 	earlier versions of `git archimport`.  Old-style branch names
 	were category{litdd}branch, whereas new-style branch names are
@@ -96,7 +96,7 @@ OPTIONS
 	merged from.  Specify a depth greater than 1 if patch logs have been
 	pruned.
 
--a::
+`-a`::
 	Attempt to auto-register archives at http://mirrors.sourcecontrol.net
 	This is particularly useful with the `-D` option.
 
diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt
index 4bd6299046..d0ca1241a2 100644
--- a/Documentation/git-archive.txt
+++ b/Documentation/git-archive.txt
@@ -33,57 +33,57 @@ comment.
 OPTIONS
 -------
 
---format=<fmt>::
+`--format=<fmt>`::
 	Format of the resulting archive: 'tar' or 'zip'. If this option
 	is not given, and the output file is specified, the format is
 	inferred from the filename if possible (e.g. writing to "foo.zip"
 	makes the output to be in the zip format). Otherwise the output
 	format is `tar`.
 
--l::
---list::
+`-l`::
+`--list`::
 	Show all available formats.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Report progress to stderr.
 
 --prefix=<prefix>/::
 	Prepend <prefix>/ to each filename in the archive.
 
 -o <file>::
---output=<file>::
+`--output=<file>`::
 	Write the archive to <file> instead of stdout.
 
---add-file=<file>::
+`--add-file=<file>`::
 	Add a non-tracked file to the archive.  Can be repeated to add
 	multiple files.  The path of the file in the archive is built
 	by concatenating the value for `--prefix` (if any) and the
 	basename of <file>.
 
---worktree-attributes::
+`--worktree-attributes`::
 	Look for attributes in .gitattributes files in the working tree
 	as well (see <<ATTRIBUTES>>).
 
-<extra>::
+`<extra>`::
 	This can be any options that the archiver backend understands.
 	See next section.
 
---remote=<repo>::
+`--remote=<repo>`::
 	Instead of making a tar archive from the local repository,
 	retrieve a tar archive from a remote repository. Note that the
 	remote repository may place restrictions on which sha1
 	expressions may be allowed in `<tree-ish>`. See
 	linkgit:git-upload-archive[1] for details.
 
---exec=<git-upload-archive>::
+`--exec=<git-upload-archive>`::
 	Used with `--remote` to specify the path to the
 	`git-upload-archive` on the remote side.
 
-<tree-ish>::
+`<tree-ish>`::
 	The tree or commit to produce an archive for.
 
-<path>::
+`<path>`::
 	Without an optional path parameter, all files and subdirectories
 	of the current working directory are included in the archive.
 	If one or more paths are specified, only these are included.
@@ -134,11 +134,11 @@ tar.<format>.remote::
 ATTRIBUTES
 ----------
 
-export-ignore::
+`export-ignore`::
 	Files and directories with the attribute export-ignore won't be
 	added to archive files.  See linkgit:gitattributes[5] for details.
 
-export-subst::
+`export-subst`::
 	If the attribute export-subst is set for a file then Git will
 	expand several placeholders when adding this file to an archive.
 	See linkgit:gitattributes[5] for details.
diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt
index d59422636b..476835938f 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.txt
@@ -354,7 +354,7 @@ determine the eventual outcome of the bisect session.
 
 OPTIONS
 -------
---no-checkout::
+`--no-checkout`::
 +
 Do not checkout the new working tree at each iteration of the bisection
 process. Instead just update a special reference named `BISECT_HEAD` to make
@@ -365,7 +365,7 @@ does not require a checked out tree.
 +
 If the repository is bare, `--no-checkout` is assumed.
 
---first-parent::
+`--first-parent`::
 +
 Follow only the first parent commit upon seeing a merge commit.
 +
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index aa1b5d56d3..b3d60d241a 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -50,10 +50,10 @@ OPTIONS
 -------
 include::blame-options.txt[]
 
--c::
+`-c`::
 	Use the same output mode as linkgit:git-annotate[1] (Default: off).
 
---score-debug::
+`--score-debug`::
 	Include debugging information related to the movement of
 	lines between files (see `-C`) and lines moved within a
 	file (see `-M`).  The first number listed is the score.
@@ -62,30 +62,30 @@ include::blame-options.txt[]
 	a certain threshold for `git blame` to consider those lines
 	of code to have been moved.
 
--f::
---show-name::
+`-f`::
+`--show-name`::
 	Show the filename in the original commit.  By default
 	the filename is shown if there is any line that came from a
 	file with a different name, due to rename detection.
 
--n::
---show-number::
+`-n`::
+`--show-number`::
 	Show the line number in the original commit (Default: off).
 
--s::
+`-s`::
 	Suppress the author name and timestamp from the output.
 
--e::
---show-email::
+`-e`::
+`--show-email`::
 	Show the author email instead of author name (Default: off).
 	This can also be controlled via the `blame.showEmail` config
 	option.
 
--w::
+`-w`::
 	Ignore whitespace when comparing the parent's version and
 	the child's to find where the lines came from.
 
---abbrev=<n>::
+`--abbrev=<n>`::
 	Instead of using the default 7+1 hexadecimal digits as the
 	abbreviated object name, use <m>+1 digits, where <m> is at
 	least <n> but ensures the commit object names are unique.
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 6f37f11b33..b9f65c4d52 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -94,16 +94,16 @@ way to clean up all obsolete remote-tracking branches.
 
 OPTIONS
 -------
--d::
---delete::
+`-d`::
+`--delete`::
 	Delete a branch. The branch must be fully merged in its
 	upstream branch, or in `HEAD` if no upstream was set with
 	`--track` or `--set-upstream-to`.
 
--D::
+`-D`::
 	Shortcut for `--delete --force`.
 
---create-reflog::
+`--create-reflog`::
 	Create the branch's reflog.  This activates recording of
 	all changes made to the branch ref, enabling use of date
 	based sha1 expressions such as "<branchname>@\{yesterday}".
@@ -113,8 +113,8 @@ OPTIONS
 	`--create-reflog`, but currently does not negate the setting of
 	`core.logAllRefUpdates`.
 
--f::
---force::
+`-f`::
+`--force`::
 	Reset <branchname> to <startpoint>, even if <branchname> exists
 	already. Without `-f`, `git branch` refuses to change an existing branch.
 	In combination with `-d` (or `--delete`), allow deleting the
@@ -122,65 +122,65 @@ OPTIONS
 	`-m` (or `--move`), allow renaming the branch even if the new
 	branch name already exists, the same applies for `-c` (or `--copy`).
 
--m::
---move::
+`-m`::
+`--move`::
 	Move/rename a branch and the corresponding reflog.
 
--M::
+`-M`::
 	Shortcut for `--move --force`.
 
--c::
---copy::
+`-c`::
+`--copy`::
 	Copy a branch and the corresponding reflog.
 
--C::
+`-C`::
 	Shortcut for `--copy --force`.
 
---color[=<when>]::
+`--color[=<when>]`::
 	Color branches to highlight current, local, and
 	remote-tracking branches.
 	The value must be always (the default), never, or auto.
 
---no-color::
+`--no-color`::
 	Turn off branch colors, even when the configuration file gives the
 	default to color output.
 	Same as `--color=never`.
 
--i::
---ignore-case::
+`-i`::
+`--ignore-case`::
 	Sorting and filtering branches are case insensitive.
 
---column[=<options>]::
---no-column::
+`--column[=<options>]`::
+`--no-column`::
 	Display branch listing in columns. See configuration variable
 	`column.branch` for option syntax. `--column` and `--no-column`
 	without options are equivalent to 'always' and 'never' respectively.
 +
 This option is only applicable in non-verbose mode.
 
--r::
---remotes::
+`-r`::
+`--remotes`::
 	List or delete (if used with -d) the remote-tracking branches.
 	Combine with `--list` to match the optional pattern(s).
 
--a::
---all::
+`-a`::
+`--all`::
 	List both remote-tracking branches and local branches.
 	Combine with `--list` to match optional pattern(s).
 
--l::
---list::
+`-l`::
+`--list`::
 	List branches.  With optional `<pattern>...`, e.g. `git
 	branch --list 'maint-*'`, list only the branches that match
 	the pattern(s).
 
---show-current::
+`--show-current`::
 	Print the name of the current branch. In detached `HEAD` state,
 	nothing is printed.
 
--v::
--vv::
---verbose::
+`-v`::
+`-vv`::
+`--verbose`::
 	When in list mode,
 	show sha1 and commit subject line for each head, along with
 	relationship to upstream branch (if any). If given twice, print
@@ -189,23 +189,23 @@ This option is only applicable in non-verbose mode.
 	current worktree's `HEAD` will not have its path printed (it will always
 	be your current directory).
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Be more quiet when creating or deleting a branch, suppressing
 	non-error messages.
 
---abbrev=<n>::
+`--abbrev=<n>`::
 	In the verbose listing that show the commit object name,
 	show the shortest prefix that is at least '<n>' hexdigits
 	long that uniquely refers the object.
 	The default value is 7 and can be overridden by the `core.abbrev`
 	config option.
 
---no-abbrev::
+`--no-abbrev`::
 	Display the full sha1s in the output listing rather than abbreviating them.
 
--t::
---track::
+`-t`::
+`--track`::
 	When creating a new branch, set up `branch.<name>.remote` and
 	`branch.<name>.merge` configuration entries to mark the
 	start-point branch as "upstream" from the new branch. This
@@ -220,25 +220,25 @@ want `git switch`, `git checkout` and `git branch` to always behave as if `--no-
 were given. Set it to `always` if you want this behavior when the
 start-point is either a local or remote-tracking branch.
 
---no-track::
+`--no-track`::
 	Do not set up "upstream" configuration, even if the
 	branch.autoSetupMerge configuration variable is true.
 
---set-upstream::
+`--set-upstream`::
 	As this option had confusing syntax, it is no longer supported.
 	Please use `--track` or `--set-upstream-to` instead.
 
 -u <upstream>::
---set-upstream-to=<upstream>::
+`--set-upstream-to=<upstream>`::
 	Set up <branchname>'s tracking information so <upstream> is
 	considered <branchname>'s upstream branch. If no <branchname>
 	is specified, then it defaults to the current branch.
 
---unset-upstream::
+`--unset-upstream`::
 	Remove the upstream information for <branchname>. If no branch
 	is specified it defaults to the current branch.
 
---edit-description::
+`--edit-description`::
 	Open an editor and edit the text to explain what the branch is
 	for, to be used by various other commands (e.g. `format-patch`,
 	`request-pull`, and `merge` (if enabled)). Multi-line explanations
@@ -260,25 +260,25 @@ start-point is either a local or remote-tracking branch.
 	Only list branches whose tips are not reachable from the
 	specified commit (`HEAD` if not specified). Implies `--list`.
 
-<branchname>::
+`<branchname>`::
 	The name of the branch to create or delete.
 	The new branch name must pass all checks defined by
 	linkgit:git-check-ref-format[1].  Some of these checks
 	may restrict the characters allowed in a branch name.
 
-<start-point>::
+`<start-point>`::
 	The new branch head will point to this commit.  It may be
 	given as a branch name, a commit-id, or a tag.  If this
 	option is omitted, the current `HEAD` will be used instead.
 
-<oldbranch>::
+`<oldbranch>`::
 	The name of an existing branch to rename.
 
-<newbranch>::
+`<newbranch>`::
 	The new name for an existing branch. The same restrictions as for
 	<branchname> apply.
 
---sort=<key>::
+`--sort=<key>`::
 	Sort based on the key given. Prefix `-` to sort in descending
 	order of the value. You may use the `--sort=<key>` option
 	multiple times, in which case the last key becomes the primary
diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt
index 51f8dd463f..92499c452d 100644
--- a/Documentation/git-bundle.txt
+++ b/Documentation/git-bundle.txt
@@ -63,7 +63,7 @@ unbundle <file>::
 	references matching those in the list are printed. This command is
 	really plumbing, intended to be called only by `git fetch`.
 
-<git-rev-list-args>::
+`<git-rev-list-args>`::
 	A list of arguments, acceptable to `git rev-parse` and
 	`git rev-list` (and containing a named ref, see SPECIFYING REFERENCES
 	below), that specifies the specific objects and references
@@ -81,13 +81,13 @@ unbundle <file>::
 	necessarily everything in the pack (in this case, `git bundle` acts
 	like `git fetch-pack`).
 
---progress::
+`--progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless -q
 	is specified. This flag forces progress status even if
 	the standard error stream is not directed to a terminal.
 
---all-progress::
+`--all-progress`::
 	When `--stdout` is specified then progress report is
 	displayed during the object count and compression phases
 	but inhibited during the write-out phase. The reason is
@@ -98,19 +98,19 @@ unbundle <file>::
 	report for the write-out phase as well even if `--stdout` is
 	used.
 
---all-progress-implied::
+`--all-progress-implied`::
 	This is used to imply `--all-progress` whenever progress display
 	is activated.  Unlike `--all-progress` this flag doesn't actually
 	force any progress display by itself.
 
---version=<version>::
+`--version=<version>`::
 	Specify the bundle version.  Version 2 is the older format and can only be
 	used with SHA-1 repositories; the newer version 3 contains capabilities that
 	permit extensions. The default is the oldest supported format, based on the
 	hash algorithm in use.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	This flag makes the command not to report its progress
 	on the standard error stream.
 
diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt
index 3ac3d44fcb..ace67493f6 100644
--- a/Documentation/git-cat-file.txt
+++ b/Documentation/git-cat-file.txt
@@ -28,28 +28,28 @@ whitespace, so that the appropriate drivers can be determined.
 
 OPTIONS
 -------
-<object>::
+`<object>`::
 	The name of the object to show.
 	For a more complete list of ways to spell object names, see
 	the "SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].
 
--t::
+`-t`::
 	Instead of the content, show the object type identified by
 	`<object>`.
 
--s::
+`-s`::
 	Instead of the content, show the object size identified by
 	`<object>`.
 
--e::
+`-e`::
 	Exit with zero status if `<object>` exists and is a valid
 	object. If `<object>` is of an invalid format exit with non-zero and
 	emits an error on stderr.
 
--p::
+`-p`::
 	Pretty-print the contents of `<object>` based on its type.
 
-<type>::
+`<type>`::
 	Typically this matches the real type of `<object>` but asking
 	for a type that can trivially be dereferenced from the given
 	`<object>` is also permitted.  An example is to ask for a
@@ -57,54 +57,54 @@ OPTIONS
 	or to ask for a "blob" with `<object>` being a tag object that
 	points at it.
 
---textconv::
+`--textconv`::
 	Show the content as transformed by a textconv filter. In this case,
 	`<object>` has to be of the form `<tree-ish>:<path>`, or `:<path>` in
 	order to apply the filter to the content recorded in the index at
 	`<path>`.
 
---filters::
+`--filters`::
 	Show the content as converted by the filters configured in
 	the current working tree for the given `<path>` (i.e. smudge filters,
 	end-of-line conversion, etc). In this case, `<object>` has to be of
 	the form `<tree-ish>:<path>`, or `:<path>`.
 
---path=<path>::
+`--path=<path>`::
 	For use with `--textconv` or `--filters`, to allow specifying an object
 	name and a path separately, e.g. when it is difficult to figure out
 	the revision from which the blob came.
 
---batch::
---batch=<format>::
+`--batch`::
+`--batch=<format>`::
 	Print object information and contents for each object provided
 	on stdin.  May not be combined with any other options or arguments
 	except `--textconv` or `--filters`, in which case the input lines
 	also need to specify the path, separated by whitespace.  See the
 	section `BATCH OUTPUT` below for details.
 
---batch-check::
---batch-check=<format>::
+`--batch-check`::
+`--batch-check=<format>`::
 	Print object information for each object provided on stdin.  May
 	not be combined with any other options or arguments except
 	`--textconv` or `--filters`, in which case the input lines also
 	need to specify the path, separated by whitespace.  See the
 	section `BATCH OUTPUT` below for details.
 
---batch-all-objects::
+`--batch-all-objects`::
 	Instead of reading a list of objects on stdin, perform the
 	requested batch operation on all objects in the repository and
 	any alternate object stores (not just reachable objects).
 	Requires `--batch` or `--batch-check` be specified. Note that
 	the objects are visited in order sorted by their hashes.
 
---buffer::
+`--buffer`::
 	Normally batch output is flushed after each object is output, so
 	that a process can interactively read and write from
 	`cat-file`. With this option, the output uses normal stdio
 	buffering; this is much more efficient when invoking
 	`--batch-check` on a large number of objects.
 
---unordered::
+`--unordered`::
 	When `--batch-all-objects` is in use, visit objects in an
 	order which may be more efficient for accessing the object
 	contents than hash order. The exact details of the order are
@@ -114,10 +114,10 @@ OPTIONS
 	only once, even if it is stored multiple times in the
 	repository.
 
---allow-unknown-type::
+`--allow-unknown-type`::
 	Allow `-s` or `-t` to query broken/corrupt objects of unknown type.
 
---follow-symlinks::
+`--follow-symlinks`::
 	With `--batch` or `--batch-check`, follow symlinks inside the
 	repository when requesting objects with extended SHA-1
 	expressions of the form tree-ish:path-in-tree.  Instead of
diff --git a/Documentation/git-check-attr.txt b/Documentation/git-check-attr.txt
index 0ac496700e..45ec659231 100644
--- a/Documentation/git-check-attr.txt
+++ b/Documentation/git-check-attr.txt
@@ -24,14 +24,14 @@ OPTIONS
 	paths.  If this option is used, then 'unspecified' attributes
 	will not be included in the output.
 
---cached::
+`--cached`::
 	Consider `.gitattributes` in the index only, ignoring the working tree.
 
---stdin::
+`--stdin`::
 	Read pathnames from the standard input, one per line,
 	instead of from the command-line.
 
--z::
+`-z`::
 	The output format is modified to be machine-parsable.
 	If `--stdin` is also given, input paths are separated
 	with a NUL character instead of a linefeed character.
@@ -57,10 +57,10 @@ unless `-z` is in effect, in which case NUL is used as delimiter:
 <path> is the path of a file being queried, <attribute> is an attribute
 being queried and <info> can be either:
 
-'unspecified';; when the attribute is not defined for the path.
-'unset';;	when the attribute is defined as false.
-'set';;		when the attribute is defined as true.
-<value>;;	when a value has been assigned to the attribute.
+`unspecified`;; when the attribute is not defined for the path.
+`unset`;;	when the attribute is defined as false.
+`set`;;		when the attribute is defined as true.
+`<value>`;;	when a value has been assigned to the attribute.
 
 Buffering happens as documented under the `GIT_FLUSH` option in
 linkgit:git[1].  The caller is responsible for avoiding deadlocks
diff --git a/Documentation/git-check-ignore.txt b/Documentation/git-check-ignore.txt
index 56a4f655c8..eabe8467ef 100644
--- a/Documentation/git-check-ignore.txt
+++ b/Documentation/git-check-ignore.txt
@@ -40,11 +40,11 @@ OPTIONS
 For precedence rules within and between exclude sources, see
 linkgit:gitignore[5].
 
---stdin::
+`--stdin`::
 	Read pathnames from the standard input, one per line,
 	instead of from the command-line.
 
--z::
+`-z`::
 	The output format is modified to be machine-parsable (see
 	below).  If `--stdin` is also given, input paths are separated
 	with a NUL character instead of a linefeed character.
@@ -55,7 +55,7 @@ linkgit:gitignore[5].
 	not be possible to distinguish between paths which match a
 	pattern and those which don't.
 
---no-index::
+`--no-index`::
 	Don't look in the index when undertaking the checks. This can
 	be used to debug why a path became tracked by e.g. `git add .`
 	and was not ignored by the rules as expected by the user or when
diff --git a/Documentation/git-check-mailmap.txt b/Documentation/git-check-mailmap.txt
index 302049afe4..d9a8e368c6 100644
--- a/Documentation/git-check-mailmap.txt
+++ b/Documentation/git-check-mailmap.txt
@@ -23,7 +23,7 @@ otherwise print the input as-is.
 
 OPTIONS
 -------
---stdin::
+`--stdin`::
 	Read contacts, one per line, from the standard input after exhausting
 	contacts provided on the command-line.
 
diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt
index 77beb46e98..d97ee8892f 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.txt
@@ -98,19 +98,19 @@ a branch.
 
 OPTIONS
 -------
---[no-]allow-onelevel::
+`--[no-]allow-onelevel`::
 	Controls whether one-level refnames are accepted (i.e.,
 	refnames that do not contain multiple `/`-separated
 	components).  The default is `--no-allow-onelevel`.
 
---refspec-pattern::
+`--refspec-pattern`::
 	Interpret <refname> as a reference name pattern for a refspec
 	(as used with remote repositories).  If this option is
 	enabled, <refname> is allowed to contain a single `*`
 	in the refspec (e.g., `foo/bar*/baz` or `foo/bar*baz/`
 	but not `foo/bar*/baz*`).
 
---normalize::
+`--normalize`::
 	Normalize 'refname' by removing any leading slash (`/`)
 	characters and collapsing runs of adjacent slashes between
 	name components into a single slash.  If the normalized
diff --git a/Documentation/git-checkout-index.txt b/Documentation/git-checkout-index.txt
index 6e49062ea3..8b70168926 100644
--- a/Documentation/git-checkout-index.txt
+++ b/Documentation/git-checkout-index.txt
@@ -22,30 +22,30 @@ Will copy all files listed from the index to the working directory
 
 OPTIONS
 -------
--u::
---index::
+`-u`::
+`--index`::
 	update stat information for the checked out entries in
 	the index file.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	be quiet if files exist or are not in the index
 
--f::
---force::
+`-f`::
+`--force`::
 	forces overwrite of existing files
 
--a::
---all::
+`-a`::
+`--all`::
 	checks out all files in the index.  Cannot be used
 	together with explicit filenames.
 
--n::
---no-create::
+`-n`::
+`--no-create`::
 	Don't checkout new files, only refresh files already checked
 	out.
 
---prefix=<string>::
+`--prefix=<string>`::
 	When creating files, prepend <string> (usually a directory
 	including a trailing /)
 
@@ -54,17 +54,17 @@ OPTIONS
 	files from named stage.  <number> must be between 1 and 3.
 	Note: `--stage=all` automatically implies `--temp`.
 
---temp::
+`--temp`::
 	Instead of copying the files to the working directory
 	write the content to temporary files.  The temporary name
 	associations will be written to stdout.
 
---stdin::
+`--stdin`::
 	Instead of taking list of paths from the command line,
 	read list of paths from the standard input.  Paths are
 	separated by LF (i.e. one path per line) by default.
 
--z::
+`-z`::
 	Only meaningful with `--stdin`; paths are separated with
 	NUL character instead of LF.
 
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 15f9690e37..a6cd887e3c 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -104,19 +104,19 @@ file can be discarded to re-create the original conflicted merge result.
 
 OPTIONS
 -------
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Quiet, suppress feedback messages.
 
---progress::
---no-progress::
+`--progress`::
+`--no-progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless `--quiet`
 	is specified. This flag enables progress reporting even if not
 	attached to a terminal, regardless of `--quiet`.
 
--f::
---force::
+`-f`::
+`--force`::
 	When switching branches, proceed even if the index or the
 	working tree differs from `HEAD`.  This is used to throw away
 	local changes.
@@ -124,8 +124,8 @@ OPTIONS
 When checking out paths from the index, do not fail upon unmerged
 entries; instead, unmerged entries are ignored.
 
---ours::
---theirs::
+`--ours`::
+`--theirs`::
 	When checking out paths from the index, check out stage #2
 	('ours') or #3 ('theirs') for unmerged paths.
 +
@@ -154,8 +154,8 @@ of it").
 	equivalent to running `git branch` with `-f`; see
 	linkgit:git-branch[1] for details.
 
--t::
---track::
+`-t`::
+`--track`::
 	When creating a new branch, set up "upstream" configuration. See
 	`--track` in linkgit:git-branch[1] for details.
 +
@@ -169,12 +169,12 @@ off of `origin/hack` (or `remotes/origin/hack`, or even
 guessing results in an empty name, the guessing is aborted.  You can
 explicitly give a name with `-b` in such a case.
 
---no-track::
+`--no-track`::
 	Do not set up "upstream" configuration, even if the
 	`branch.autoSetupMerge` configuration variable is true.
 
---guess::
---no-guess::
+`--guess`::
+`--no-guess`::
 	If `<branch>` is not found but there does exist a tracking
 	branch in exactly one remote (call it `<remote>`) with a
 	matching name, treat as equivalent to
@@ -197,12 +197,12 @@ linkgit:git-config[1].
 The default behavior can be set via the `checkout.guess` configuration
 variable.
 
--l::
+`-l`::
 	Create the new branch's reflog; see linkgit:git-branch[1] for
 	details.
 
--d::
---detach::
+`-d`::
+`--detach`::
 	Rather than checking out a branch to work on it, check out a
 	commit for inspection and discardable experiments.
 	This is the default behavior of `git checkout <commit>` when
@@ -234,14 +234,14 @@ branch by running `git rm -rf .` from the top level of the working tree.
 Afterwards you will be ready to prepare your new files, repopulating the
 working tree, by copying them from elsewhere, extracting a tarball, etc.
 
---ignore-skip-worktree-bits::
+`--ignore-skip-worktree-bits`::
 	In sparse checkout mode, `git checkout -- <paths>` would
 	update only entries matched by `<paths>` and sparse patterns
 	in `$GIT_DIR/info/sparse-checkout`. This option ignores
 	the sparse patterns and adds back any files in `<paths>`.
 
--m::
---merge::
+`-m`::
+`--merge`::
 	When switching branches,
 	if you have local modifications to one or more files that
 	are different between the current branch and the branch to
@@ -261,15 +261,15 @@ the conflicted merge in the specified paths.
 +
 When switching branches with `--merge`, staged changes may be lost.
 
---conflict=<style>::
+`--conflict=<style>`::
 	The same as `--merge` option above, but changes the way the
 	conflicting hunks are presented, overriding the
 	`merge.conflictStyle` configuration variable.  Possible values are
 	"merge" (default) and "diff3" (in addition to what is shown by
 	"merge" style, shows the original contents).
 
--p::
---patch::
+`-p`::
+`--patch`::
 	Interactively select hunks in the difference between the
 	`<tree-ish>` (or the index, if unspecified) and the working
 	tree.  The chosen hunks are then applied in reverse to the
@@ -282,20 +282,20 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
 Note that this option uses the no overlay mode by default (see also
 `--overlay`), and currently doesn't support overlay mode.
 
---ignore-other-worktrees::
+`--ignore-other-worktrees`::
 	`git checkout` refuses when the wanted ref is already checked
 	out by another worktree. This option makes it check the ref
 	out anyway. In other words, the ref can be held by more than one
 	worktree.
 
---overwrite-ignore::
---no-overwrite-ignore::
+`--overwrite-ignore`::
+`--no-overwrite-ignore`::
 	Silently overwrite ignored files when switching branches. This
 	is the default behavior. Use `--no-overwrite-ignore` to abort
 	the operation when the new branch contains ignored files.
 
---recurse-submodules::
---no-recurse-submodules::
+`--recurse-submodules`::
+`--no-recurse-submodules`::
 	Using `--recurse-submodules` will update the content of all active
 	submodules according to the commit recorded in the superproject. If
 	local modifications in a submodule would be overwritten the checkout
@@ -304,15 +304,15 @@ Note that this option uses the no overlay mode by default (see also
 	Just like linkgit:git-submodule[1], this will detach `HEAD` of the
 	submodule.
 
---overlay::
---no-overlay::
+`--overlay`::
+`--no-overlay`::
 	In the default overlay mode, `git checkout` never
 	removes files from the index or the working tree.  When
 	specifying `--no-overlay`, files that appear in the index and
 	working tree, but not in `<tree-ish>` are removed, to make them
 	match `<tree-ish>` exactly.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	Pathspec is passed in `<file>` instead of commandline args. If
 	`<file>` is exactly `-` then standard input is used. Pathspec
 	elements are separated by LF or CR/LF. Pathspec elements can be
@@ -320,12 +320,12 @@ Note that this option uses the no overlay mode by default (see also
 	(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 	global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	Only meaningful with `--pathspec-from-file`. Pathspec elements are
 	separated with NUL character and all other characters are taken
 	literally (including newlines and quotes).
 
-<branch>::
+`<branch>`::
 	Branch to checkout; if it refers to a branch (i.e., a name that,
 	when prepended with `refs/heads/`, is a valid ref), then that
 	branch is checked out. Otherwise, if it refers to a valid
@@ -351,7 +351,7 @@ As a special case, you may use `"A...B"` as a shortcut for the
 merge base of `A` and `B` if there is exactly one merge base. You can
 leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
 
-<tree-ish>::
+`<tree-ish>`::
 	Tree to checkout from (when paths are given). If not specified,
 	the index will be used.
 +
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index fb12a67778..5d6021e4ca 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -50,19 +50,19 @@ OPTIONS
 	feed all <commit>... arguments to a single revision walk
 	(see a later example that uses 'maint master..next').
 
--e::
---edit::
+`-e`::
+`--edit`::
 	With this option, `git cherry-pick` will let you edit the commit
 	message prior to committing.
 
---cleanup=<mode>::
+`--cleanup=<mode>`::
 	This option determines how the commit message will be cleaned up before
 	being passed on to the commit machinery. See linkgit:git-commit[1] for more
 	details. In particular, if the '<mode>' is given a value of `scissors`,
 	scissors will be appended to `MERGE_MSG` before being passed on in the case
 	of a conflict.
 
--x::
+`-x`::
 	When recording the commit, append a line that says
 	"(cherry picked from commit ...)" to the original commit
 	message in order to indicate which commit this change was
@@ -76,7 +76,7 @@ OPTIONS
 	development branch), adding this information can be
 	useful.
 
--r::
+`-r`::
 	It used to be that the command defaulted to do `-x`
 	described above, and `-r` was to disable it.  Now the
 	default is not to do `-x` so this option is a no-op.
@@ -89,8 +89,8 @@ OPTIONS
 	the mainline and allows cherry-pick to replay the change
 	relative to the specified parent.
 
--n::
---no-commit::
+`-n`::
+`--no-commit`::
 	Usually the command automatically creates a sequence of commits.
 	This flag applies the changes necessary to cherry-pick
 	each named commit to your working tree and the index,
@@ -102,26 +102,26 @@ OPTIONS
 This is useful when cherry-picking more than one commits'
 effect to your index in a row.
 
--s::
---signoff::
+`-s`::
+`--signoff`::
 	Add a `Signed-off-by` trailer at the end of the commit message.
 	See the signoff option in linkgit:git-commit[1] for more information.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign commits. The `keyid` argument is optional and
 	defaults to the committer identity; if specified, it must be
 	stuck to the option without a space. `--no-gpg-sign` is useful to
 	countermand both `commit.gpgSign` configuration variable, and
 	earlier `--gpg-sign`.
 
---ff::
+`--ff`::
 	If the current `HEAD` is the same as the parent of the
 	cherry-pick'ed commit, then a fast forward to this commit will
 	be performed.
 
---allow-empty::
+`--allow-empty`::
 	By default, cherry-picking an empty commit will fail,
 	indicating that an explicit invocation of `git commit
 	--allow-empty` is required. This option overrides that
@@ -134,30 +134,30 @@ effect to your index in a row.
 	previous commit are dropped.  To force the inclusion of those commits
 	use `--keep-redundant-commits`.
 
---allow-empty-message::
+`--allow-empty-message`::
 	By default, cherry-picking a commit with an empty message will fail.
 	This option overrides that behavior, allowing commits with empty
 	messages to be cherry picked.
 
---keep-redundant-commits::
+`--keep-redundant-commits`::
 	If a commit being cherry picked duplicates a commit already in the
 	current history, it will become empty.  By default these
 	redundant commits cause `cherry-pick` to stop so the user can
 	examine the commit. This option overrides that behavior and
 	creates an empty commit object.  Implies `--allow-empty`.
 
---strategy=<strategy>::
+`--strategy=<strategy>`::
 	Use the given merge strategy.  Should only be used once.
 	See the MERGE STRATEGIES section in linkgit:git-merge[1]
 	for details.
 
--X<option>::
---strategy-option=<option>::
+`-X<option>`::
+`--strategy-option=<option>`::
 	Pass the merge strategy-specific option through to the
 	merge strategy.  See linkgit:git-merge[1] for details.
 
---rerere-autoupdate::
---no-rerere-autoupdate::
+`--rerere-autoupdate`::
+`--no-rerere-autoupdate`::
 	Allow the rerere mechanism to update the index with the
 	result of auto-conflict resolution if possible.
 
diff --git a/Documentation/git-cherry.txt b/Documentation/git-cherry.txt
index ab55060668..ff57fd3329 100644
--- a/Documentation/git-cherry.txt
+++ b/Documentation/git-cherry.txt
@@ -26,17 +26,17 @@ commits that do not.
 
 OPTIONS
 -------
--v::
+`-v`::
 	Show the commit subjects next to the SHA1s.
 
-<upstream>::
+`<upstream>`::
 	Upstream branch to search for equivalent commits.
 	Defaults to the upstream branch of `HEAD`.
 
-<head>::
+`<head>`::
 	Working branch; defaults to `HEAD`.
 
-<limit>::
+`<limit>`::
 	Do not report commits up to (and including) limit.
 
 EXAMPLES
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 7923ae27a5..e782f48c2c 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -25,7 +25,7 @@ are affected.
 
 OPTIONS
 -------
--d::
+`-d`::
 	Normally, when no <path> is specified, `git clean` will not
 	recurse into untracked directories to avoid removing too much.
 	Specify `-d` to have it recurse into such directories as well.
@@ -33,34 +33,34 @@ OPTIONS
 	files matching the specified paths (with exceptions for nested
 	`git` directories mentioned under `--force`) will be removed.
 
--f::
---force::
+`-f`::
+`--force`::
 	If the Git configuration variable `clean.requireForce` is not set
 	to false, `git clean` will refuse to delete files or directories
 	unless given `-f` or `-i`.  Git will refuse to modify untracked
 	nested `git` repositories (directories with a .git subdirectory)
 	unless a second `-f` is given.
 
--i::
---interactive::
+`-i`::
+`--interactive`::
 	Show what would be done and clean files interactively. See
 	``Interactive mode'' for details.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Don't actually remove anything, just show what would be done.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Be quiet, only report errors, but not the files that are
 	successfully removed.
 
 -e <pattern>::
---exclude=<pattern>::
+`--exclude=<pattern>`::
 	Use the given exclude pattern in addition to the standard ignore rules
 	(see linkgit:gitignore[5]).
 
--x::
+`-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
 	line.  This allows removing all untracked
@@ -68,7 +68,7 @@ OPTIONS
 	conjunction with `git restore` or `git reset`) to create a pristine
 	working directory to test a clean build.
 
--X::
+`-X`::
 	Remove only files ignored by Git.  This may be useful to rebuild
 	everything from scratch, but keep manually created files.
 
@@ -94,7 +94,7 @@ You also could say `c` or `clean` above as long as the choice is unique.
 
 The main command loop has 6 subcommands.
 
-clean::
+`clean`::
 
    Start cleaning files and directories, and then quit.
 
@@ -125,11 +125,11 @@ ask each::
   to delete items. Please note that this action is not as efficient
   as the above two actions.
 
-quit::
+`quit`::
 
   This lets you quit without do cleaning.
 
-help::
+`help`::
 
   Show brief usage of interactive `git-clean`.
 
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index b8ca823467..935d191ae1 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -42,8 +42,8 @@ configuration variables.
 
 OPTIONS
 -------
--l::
---local::
+`-l`::
+`--local`::
 	When the repository to clone from is on a local machine,
 	this flag bypasses the normal "Git aware" transport
 	mechanism and clones the repository by making a copy of
@@ -62,14 +62,14 @@ Git transport instead.
 source repository, similar to running `cp -r src dst` while modifying
 `src`.
 
---no-hardlinks::
+`--no-hardlinks`::
 	Force the cloning process from a repository on a local
 	filesystem to copy the files under the `.git/objects`
 	directory instead of using hardlinks. This may be desirable
 	if you are trying to make a back-up of your repository.
 
--s::
---shared::
+`-s`::
+`--shared`::
 	When the repository to clone is on the local machine,
 	instead of using hard links, automatically setup
 	`.git/objects/info/alternates` to share the objects
@@ -110,7 +110,7 @@ objects from the source repository into a pack in the cloned repository.
 *NOTE*: see the NOTE for the `--shared` option, and also the
 `--dissociate` option.
 
---dissociate::
+`--dissociate`::
 	Borrow the objects from reference repositories specified
 	with the `--reference` options only to reduce network
 	transfer, and stop borrowing from them after a clone is made
@@ -121,23 +121,23 @@ objects from the source repository into a pack in the cloned repository.
 	same repository, and this option can be used to stop the
 	borrowing.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Operate quietly.  Progress is not reported to the standard
 	error stream.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Run verbosely. Does not affect the reporting of progress status
 	to the standard error stream.
 
---progress::
+`--progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless `--quiet`
 	is specified. This flag forces progress status even if the
 	standard error stream is not directed to a terminal.
 
---server-option=<option>::
+`--server-option=<option>`::
 	Transmit the given string to the server when communicating using
 	protocol version 2.  The given string must not contain a NUL or LF
 	character.  The server's handling of server options, including
@@ -145,16 +145,16 @@ objects from the source repository into a pack in the cloned repository.
 	When multiple `--server-option=<option>` are given, they are all
 	sent to the other side in the order listed on the command line.
 
--n::
---no-checkout::
+`-n`::
+`--no-checkout`::
 	No checkout of `HEAD` is performed after the clone is complete.
 
---[no-]reject-shallow::
+`--[no-]reject-shallow`::
 	Fail if the source repository is a shallow repository.
-	The 'clone.rejectShallow' configuration variable can be used to
+	The `clone.rejectShallow` configuration variable can be used to
 	specify the default.
 
---bare::
+`--bare`::
 	Make a 'bare' Git repository.  That is, instead of
 	creating `<directory>` and placing the administrative
 	files in `<directory>/.git`, make the `<directory>`
@@ -166,13 +166,13 @@ objects from the source repository into a pack in the cloned repository.
 	used, neither remote-tracking branches nor the related
 	configuration variables are created.
 
---sparse::
+`--sparse`::
 	Initialize the sparse-checkout file so the working
 	directory starts with only the files in the root
 	of the repository. The sparse-checkout file can be
 	modified to grow the working directory as needed.
 
---filter=<filter-spec>::
+`--filter=<filter-spec>`::
 	Use the partial clone feature and request that the server sends
 	a subset of reachable objects according to a given object filter.
 	When using `--filter`, the supplied `<filter-spec>` is used for
@@ -182,7 +182,7 @@ objects from the source repository into a pack in the cloned repository.
 	at least `<size>`. For more details on filter specifications, see
 	the `--filter` option in linkgit:git-rev-list[1].
 
---mirror::
+`--mirror`::
 	Set up a mirror of the source repository.  This implies `--bare`.
 	Compared to `--bare`, `--mirror` not only maps local branches of the
 	source to local branches of the target, it maps all refs (including
@@ -239,15 +239,15 @@ corresponding `--mirror` and `--no-tags` options instead.
 	tips of all branches. If you want to clone submodules shallowly,
 	also pass `--shallow-submodules`.
 
---shallow-since=<date>::
+`--shallow-since=<date>`::
 	Create a shallow clone with a history after the specified time.
 
---shallow-exclude=<revision>::
+`--shallow-exclude=<revision>`::
 	Create a shallow clone with a history, excluding commits
 	reachable from a specified remote branch or tag.  This option
 	can be specified multiple times.
 
---[no-]single-branch::
+`--[no-]single-branch`::
 	Clone only the history leading to the tip of a single branch,
 	either specified by the `--branch` option or the primary
 	branch remote's `HEAD` points at.
@@ -257,7 +257,7 @@ corresponding `--mirror` and `--no-tags` options instead.
 	branch when `--single-branch` clone was made, no remote-tracking
 	branch is created.
 
---no-tags::
+`--no-tags`::
 	Don't clone any tags, and set
 	`remote.<remote>.tagOpt=--no-tags` in the config, ensuring
 	that future `git pull` and `git fetch` operations won't follow
@@ -269,7 +269,7 @@ maintain a branch with no references other than a single cloned
 branch. This is useful e.g. to maintain minimal clones of the default
 branch of some repository for search indexing.
 
---recurse-submodules[=<pathspec>]::
+`--recurse-submodules[=<pathspec>]`::
 	After the clone is created, initialize and clone submodules
 	within based on the provided pathspec.  If no pathspec is
 	provided, all submodules are initialized and cloned.
@@ -285,10 +285,10 @@ the clone is finished. This option is ignored if the cloned repository does
 not have a worktree/checkout (i.e. if any of `--no-checkout`/`-n`, `--bare`,
 or `--mirror` is given)
 
---[no-]shallow-submodules::
+`--[no-]shallow-submodules`::
 	All submodules which are cloned will be shallow with a depth of 1.
 
---[no-]remote-submodules::
+`--[no-]remote-submodules`::
 	All submodules which are cloned will use the status of the submodule's
 	remote-tracking branch to update the submodule, rather than the
 	superproject's recorded SHA-1. Equivalent to passing `--remote` to
@@ -306,12 +306,12 @@ or `--mirror` is given)
 	The number of submodules fetched at the same time.
 	Defaults to the `submodule.fetchJobs` option.
 
-<repository>::
+`<repository>`::
 	The (possibly remote) repository to clone from.  See the
 	<<URLS,GIT URLS>> section below for more information on specifying
 	repositories.
 
-<directory>::
+`<directory>`::
 	The name of a new directory to clone into.  The "humanish"
 	part of the source repository is used if no directory is
 	explicitly given (`repo` for `/path/to/repo.git` and `foo`
diff --git a/Documentation/git-commit-graph.txt b/Documentation/git-commit-graph.txt
index 3246616b10..1e6db29d4a 100644
--- a/Documentation/git-commit-graph.txt
+++ b/Documentation/git-commit-graph.txt
@@ -21,7 +21,7 @@ Manage the serialized commit-graph file.
 
 OPTIONS
 -------
---object-dir::
+`--object-dir`::
 	Use given directory for the location of packfiles and commit-graph
 	file. This parameter exists to specify the location of an alternate
 	that only has the objects directory, not a full `.git` directory. The
@@ -31,13 +31,13 @@ OPTIONS
 	object directory, `git commit-graph ...` will exit with non-zero
 	status.
 
---[no-]progress::
+`--[no-]progress`::
 	Turn progress on/off explicitly. If neither is specified, progress is
 	shown if standard error is connected to a terminal.
 
 COMMANDS
 --------
-'write'::
+`write`::
 
 Write a commit-graph file based on the commits found in packfiles. If
 the config option `core.commitGraph` is disabled, then this command will
@@ -103,7 +103,7 @@ Finally, if `--expire-time=<datetime>` is not specified, let `datetime`
 be the current time. After writing the split commit-graph, delete all
 unused commit-graph whose modified times are older than `datetime`.
 
-'verify'::
+`verify`::
 
 Read the commit-graph file and verify its contents against the object
 database. Used to check for corrupted data.
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt
index 48a76dd029..47f21f4bcc 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.txt
@@ -44,7 +44,7 @@ state was.
 
 OPTIONS
 -------
-<tree>::
+`<tree>`::
 	An existing tree object.
 
 -p <parent>::
@@ -59,9 +59,9 @@ OPTIONS
 	from the standard input. This can be given more than once and the
 	content of each file becomes its own paragraph.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign commits. The `keyid` argument is optional and
 	defaults to the committer identity; if specified, it must be
 	stuck to the option without a space. `--no-gpg-sign` is useful to
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 3b22ba718c..48be5646c4 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -64,26 +64,26 @@ that, you can recover from it with `git reset`.
 
 OPTIONS
 -------
--a::
---all::
+`-a`::
+`--all`::
 	Tell the command to automatically stage files that have
 	been modified and deleted, but new files you have not
 	told Git about are not affected.
 
--p::
---patch::
+`-p`::
+`--patch`::
 	Use the interactive patch selection interface to chose
 	which changes to commit. See linkgit:git-add[1] for
 	details.
 
 -C <commit>::
---reuse-message=<commit>::
+`--reuse-message=<commit>`::
 	Take an existing commit object, and reuse the log message
 	and the authorship information (including the timestamp)
 	when creating the commit.
 
 -c <commit>::
---reedit-message=<commit>::
+`--reedit-message=<commit>`::
 	Like `-C`, but with `-c` the editor is invoked, so that
 	the user can further edit the commit message.
 
@@ -126,37 +126,37 @@ Neither "fixup!" nor "amend!" commits change authorship of
 `<commit>` when applied by `git rebase --autosquash`.
 See linkgit:git-rebase[1] for details.
 
---squash=<commit>::
+`--squash=<commit>`::
 	Construct a commit message for use with `rebase --autosquash`.
 	The commit message subject line is taken from the specified
 	commit with a prefix of "squash! ".  Can be used with additional
 	commit message options (`-m`/`-c`/`-C`/`-F`). See
 	linkgit:git-rebase[1] for details.
 
---reset-author::
+`--reset-author`::
 	When used with `-C`/`-c`/`--amend` options, or when committing after a
 	conflicting cherry-pick, declare that the authorship of the
 	resulting commit now belongs to the committer. This also renews
 	the author timestamp.
 
---short::
+`--short`::
 	When doing a dry-run, give the output in the short-format. See
 	linkgit:git-status[1] for details. Implies `--dry-run`.
 
---branch::
+`--branch`::
 	Show the branch and tracking info even in short-format.
 
---porcelain::
+`--porcelain`::
 	When doing a dry-run, give the output in a porcelain-ready
 	format. See linkgit:git-status[1] for details. Implies
 	`--dry-run`.
 
---long::
+`--long`::
 	When doing a dry-run, give the output in the long-format.
 	Implies `--dry-run`.
 
--z::
---null::
+`-z`::
+`--null`::
 	When showing `short` or `porcelain` status output, print the
 	filename verbatim and terminate the entries with NUL, instead of LF.
 	If no format is given, implies the `--porcelain` output format.
@@ -165,22 +165,22 @@ See linkgit:git-rebase[1] for details.
 	(see linkgit:git-config[1]).
 
 -F <file>::
---file=<file>::
+`--file=<file>`::
 	Take the commit message from the given file.  Use '-' to
 	read the message from the standard input.
 
---author=<author>::
+`--author=<author>`::
 	Override the commit author. Specify an explicit author using the
 	standard `A U Thor <author@example.com>` format. Otherwise <author>
 	is assumed to be a pattern and is used to search for an existing
 	commit by that author (i.e. `git rev-list --all -i --author=<author>`);
 	the commit author is then copied from the first such commit found.
 
---date=<date>::
+`--date=<date>`::
 	Override the author date used in the commit.
 
 -m <msg>::
---message=<msg>::
+`--message=<msg>`::
 	Use the given <msg> as the commit message.
 	If multiple `-m` options are given, their values are
 	concatenated as separate paragraphs.
@@ -188,7 +188,7 @@ See linkgit:git-rebase[1] for details.
 The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
 
 -t <file>::
---template=<file>::
+`--template=<file>`::
 	When editing the commit message, start the editor with the
 	contents in the given file.  The `commit.template` configuration
 	variable is often used to give this option implicitly to the
@@ -200,7 +200,7 @@ The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
 
 include::signoff-option.txt[]
 
---trailer <token>[(=|:)<value>]::
+`--trailer <token>[(=|:)<value>]`::
 	Specify a (<token>, <value>) pair that should be applied as a
 	trailer. (e.g. `git commit --trailer "Signed-off-by:C O Mitter \
 	<committer@example.com>" --trailer "Helped-by:C O Mitter \
@@ -211,44 +211,44 @@ include::signoff-option.txt[]
 	a duplicated trailer is omitted, where in the run of trailers
 	each trailer would appear, and other details.
 
--n::
---no-verify::
+`-n`::
+`--no-verify`::
 	This option bypasses the pre-commit and commit-msg hooks.
 	See also linkgit:githooks[5].
 
---allow-empty::
+`--allow-empty`::
 	Usually recording a commit that has the exact same tree as its
 	sole parent commit is a mistake, and the command prevents you
 	from making such a commit.  This option bypasses the safety, and
 	is primarily for use by foreign SCM interface scripts.
 
---allow-empty-message::
+`--allow-empty-message`::
        Like `--allow-empty` this command is primarily for use by foreign
        SCM interface scripts. It allows you to create a commit with an
        empty commit message without using plumbing commands like
        linkgit:git-commit-tree[1].
 
---cleanup=<mode>::
+`--cleanup=<mode>`::
 	This option determines how the supplied commit message should be
 	cleaned up before committing.  The '<mode>' can be `strip`,
 	`whitespace`, `verbatim`, `scissors` or `default`.
 +
 --
-strip::
+`strip`::
 	Strip leading and trailing empty lines, trailing whitespace,
 	commentary and collapse consecutive empty lines.
-whitespace::
+`whitespace`::
 	Same as `strip` except #commentary is not removed.
-verbatim::
+`verbatim`::
 	Do not change the message at all.
-scissors::
+`scissors`::
 	Same as `whitespace` except that everything from (and including)
 	the line found below is truncated, if the message is to be edited.
 	"`#`" can be customized with `core.commentChar`.
 
 		# ------------------------ >8 ------------------------
 
-default::
+`default`::
 	Same as `strip` if the message is to be edited.
 	Otherwise `whitespace`.
 --
@@ -256,19 +256,19 @@ default::
 The default can be changed by the `commit.cleanup` configuration
 variable (see linkgit:git-config[1]).
 
--e::
---edit::
+`-e`::
+`--edit`::
 	The message taken from file with `-F`, command line with
 	`-m`, and from commit object with `-C` are usually used as
 	the commit log message unmodified. This option lets you
 	further edit the message taken from these sources.
 
---no-edit::
+`--no-edit`::
 	Use the selected commit message without launching an editor.
 	For example, `git commit --amend --no-edit` amends a commit
 	without changing its commit message.
 
---amend::
+`--amend`::
 	Replace the tip of the current branch by creating a new
 	commit. The recorded tree is prepared as usual (including
 	the effect of the `-i` and `-o` options and explicit
@@ -294,18 +294,18 @@ You should understand the implications of rewriting history if you
 amend a commit that has already been published.  (See the "RECOVERING
 FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
 
---no-post-rewrite::
+`--no-post-rewrite`::
 	Bypass the post-rewrite hook.
 
--i::
---include::
+`-i`::
+`--include`::
 	Before making a commit out of staged contents so far,
 	stage the contents of paths given on the command line
 	as well.  This is usually not what you want unless you
 	are concluding a conflicted merge.
 
--o::
---only::
+`-o`::
+`--only`::
 	Make a commit by taking the updated working tree contents
 	of the paths specified on the
 	command line, disregarding any contents that have been
@@ -318,7 +318,7 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
 	already been staged. If used together with `--allow-empty`
 	paths are also not required, and an empty commit will be created.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	Pathspec is passed in `<file>` instead of commandline args. If
 	`<file>` is exactly `-` then standard input is used. Pathspec
 	elements are separated by LF or CR/LF. Pathspec elements can be
@@ -326,13 +326,13 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
 	(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 	global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	Only meaningful with `--pathspec-from-file`. Pathspec elements are
 	separated with NUL character and all other characters are taken
 	literally (including newlines and quotes).
 
--u[<mode>]::
---untracked-files[=<mode>]::
+`-u[<mode>]`::
+`--untracked-files[=<mode>]`::
 	Show untracked files.
 +
 --
@@ -350,8 +350,8 @@ The default can be changed using the `status.showUntrackedFiles`
 configuration variable documented in linkgit:git-config[1].
 --
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Show unified diff between the `HEAD` commit and what
 	would be committed at the bottom of the commit message
 	template to help the user describe the commit by reminding
@@ -365,29 +365,29 @@ If specified twice, show in addition the unified diff between
 what would be committed and the worktree files, i.e. the unstaged
 changes to tracked files.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Suppress commit summary message.
 
---dry-run::
+`--dry-run`::
 	Do not create a commit, but show a list of paths that are
 	to be committed, paths with local changes that will be left
 	uncommitted and paths that are untracked.
 
---status::
+`--status`::
 	Include the output of linkgit:git-status[1] in the commit
 	message template when using an editor to prepare the commit
 	message.  Defaults to on, but can be used to override
 	configuration variable `commit.status`.
 
---no-status::
+`--no-status`::
 	Do not include the output of linkgit:git-status[1] in the
 	commit message template when using an editor to prepare the
 	default commit message.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign commits. The `keyid` argument is optional and
 	defaults to the committer identity; if specified, it must be
 	stuck to the option without a space. `--no-gpg-sign` is useful to
diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 80b646b895..b70aad6e0f 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -74,24 +74,24 @@ On success, the command returns the exit code 0.
 OPTIONS
 -------
 
---replace-all::
+`--replace-all`::
 	Default behavior is to replace at most one line. This replaces
 	all lines matching the key (and optionally the `value-pattern`).
 
---add::
+`--add`::
 	Adds a new line to the option without altering any existing
 	values.  This is the same as providing '^$' as the `value-pattern`
 	in `--replace-all`.
 
---get::
+`--get`::
 	Get the value for a given key (optionally filtered by a regex
 	matching the value). Returns error code 1 if the key was not
 	found and the last value if multiple key values were found.
 
---get-all::
+`--get-all`::
 	Like get, but returns all values for a multi-valued key.
 
---get-regexp::
+`--get-regexp`::
 	Like `--get-all`, but interprets the name as a regular expression and
 	writes out the key names.  Regular expression matching is currently
 	case-sensitive and done against a canonicalized version of the key
@@ -106,7 +106,7 @@ OPTIONS
 	section as name, do so for all the keys in the section and
 	list them.  Returns error code 1 if no value is found.
 
---global::
+`--global`::
 	For writing options: write to global `~/.gitconfig` file
 	rather than the repository `.git/config`, write to
 	`$XDG_CONFIG_HOME/git/config` file if this file exists and the
@@ -117,7 +117,7 @@ For reading options: read only from global `~/.gitconfig` and from
 +
 See also <<FILES>>.
 
---system::
+`--system`::
 	For writing options: write to system-wide
 	`$(prefix)/etc/gitconfig` rather than the repository
 	`.git/config`.
@@ -127,7 +127,7 @@ rather than from all available files.
 +
 See also <<FILES>>.
 
---local::
+`--local`::
 	For writing options: write to the repository `.git/config` file.
 	This is the default behavior.
 +
@@ -136,7 +136,7 @@ from all available files.
 +
 See also <<FILES>>.
 
---worktree::
+`--worktree`::
 	Similar to `--local` except that `.git/config.worktree` is
 	read from or written to if `extensions.worktreeConfig` is
 	present. If not it's the same as `--local`.
@@ -152,23 +152,23 @@ See also <<FILES>>.
 	section in linkgit:gitrevisions[7] for a more complete list of
 	ways to spell blob names.
 
---remove-section::
+`--remove-section`::
 	Remove the given section from the configuration file.
 
---rename-section::
+`--rename-section`::
 	Rename the given section to a new name.
 
---unset::
+`--unset`::
 	Remove the line matching the key from config file.
 
---unset-all::
+`--unset-all`::
 	Remove all lines matching the key from config file.
 
--l::
---list::
+`-l`::
+`--list`::
 	List all variables set in config file, along with their values.
 
---fixed-value::
+`--fixed-value`::
 	When used with the `value-pattern` argument, treat `value-pattern` as
 	an exact string instead of a regular expression. This will restrict
 	the name/value pairs that are matched to only those where the value
@@ -199,21 +199,21 @@ Valid `<type>`'s include:
   as-is.
 +
 
---bool::
---int::
---bool-or-int::
---path::
---expiry-date::
+`--bool`::
+`--int`::
+`--bool-or-int`::
+`--path`::
+`--expiry-date`::
   Historical options for selecting a type specifier. Prefer instead `--type`
   (see above).
 
---no-type::
+`--no-type`::
   Un-sets the previously set type specifier (if one was previously set). This
   option requests that `git config` not canonicalize the retrieved variable.
   `--no-type` has no effect without `--type=<type>` or `--<type>`.
 
--z::
---null::
+`-z`::
+`--null`::
 	For all options that output values and/or keys, always
 	end values with the null character (instead of a
 	newline). Use newline instead as a delimiter between
@@ -221,17 +221,17 @@ Valid `<type>`'s include:
 	output without getting confused e.g. by values that
 	contain line breaks.
 
---name-only::
+`--name-only`::
 	Output only the names of config variables for `--list` or
 	`--get-regexp`.
 
---show-origin::
+`--show-origin`::
 	Augment the output of all queried config options with the
 	origin type (file, standard input, blob, command line) and
 	the actual origin (config file path, ref, or blob id if
 	applicable).
 
---show-scope::
+`--show-scope`::
 	Similar to `--show-origin` in that it augments the output of
 	all queried config options with the scope of that value
 	(local, global, system, command).
@@ -258,12 +258,12 @@ Valid `<type>`'s include:
 (but note that `--get-color` will omit the trailing newline printed by
 `--type=color`).
 
--e::
---edit::
+`-e`::
+`--edit`::
 	Opens an editor to modify the specified config file; either
 	`--system`, `--global`, or repository (default).
 
---[no-]includes::
+`--[no-]includes`::
 	Respect `include.*` directives in config files when looking up
 	values. Defaults to `off` when a specific file is given (e.g.,
 	using `--file`, `--global`, etc) and `on` when searching all
diff --git a/Documentation/git-count-objects.txt b/Documentation/git-count-objects.txt
index a52bd618c4..6033087dbd 100644
--- a/Documentation/git-count-objects.txt
+++ b/Documentation/git-count-objects.txt
@@ -18,8 +18,8 @@ them, to help you decide when it is a good time to repack.
 
 OPTIONS
 -------
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Report in more detail:
 +
 count: the number of loose objects
@@ -44,8 +44,8 @@ multiple times, one line per path. Note that if the path contains
 non-printable characters, it may be surrounded by double-quotes and
 contain C-style backslashed escape sequences.
 
--H::
---human-readable::
+`-H`::
+`--human-readable`::
 
 Print sizes in human readable format
 
diff --git a/Documentation/git-cvsexportcommit.txt b/Documentation/git-cvsexportcommit.txt
index 596512ec73..64e98c4f1d 100644
--- a/Documentation/git-cvsexportcommit.txt
+++ b/Documentation/git-cvsexportcommit.txt
@@ -34,52 +34,52 @@ parent the changeset should be done against.
 OPTIONS
 -------
 
--c::
+`-c`::
 	Commit automatically if the patch applied cleanly. It will not
 	commit if any hunks fail to apply or there were other problems.
 
--p::
+`-p`::
 	Be pedantic (paranoid) when applying patches. Invokes patch with
 	`--fuzz=0`
 
--a::
+`-a`::
 	Add authorship information. Adds Author line, and Committer (if
 	different from Author) to the message.
 
--d::
+`-d`::
 	Set an alternative CVSROOT to use.  This corresponds to the CVS
 	`-d` parameter.  Usually users will not want to set this, except
 	if using CVS in an asymmetric fashion.
 
--f::
+`-f`::
 	Force the merge even if the files are not up to date.
 
--P::
+`-P`::
 	Force the parent commit, even if it is not a direct parent.
 
--m::
+`-m`::
 	Prepend the commit message with the provided prefix.
 	Useful for patch series and the like.
 
--u::
+`-u`::
 	Update affected files from CVS repository before attempting export.
 
--k::
+`-k`::
 	Reverse CVS keyword expansion (e.g. $Revision: 1.2.3.4$
 	becomes $Revision$) in working CVS checkout before applying patch.
 
--w::
+`-w`::
 	Specify the location of the CVS checkout to use for the export. This
 	option does not require GIT_DIR to be set before execution if the
 	current directory is within a Git repository.  The default is the
 	value of `cvsexportcommit.cvsdir`.
 
--W::
+`-W`::
 	Tell cvsexportcommit that the current working directory is not only
 	a Git checkout, but also the CVS checkout.  Therefore, Git will
 	reset the working directory to the parent commit before proceeding.
 
--v::
+`-v`::
 	Verbose.
 
 CONFIGURATION
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index ead844944e..5caeed88ed 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -49,7 +49,7 @@ See linkgit:gitcvs-migration[7].
 
 OPTIONS
 -------
--v::
+`-v`::
 	Verbosity: let 'cvsimport' report what it is doing.
 
 -d <CVSROOT>::
@@ -85,17 +85,17 @@ OPTIONS
 Use `-o master` for continuing an import that was initially done by
 the old cvs2git tool.
 
--i::
+`-i`::
 	Import-only: don't perform a checkout after importing.  This option
 	ensures the working directory and index remain untouched and will
 	not create them if they do not exist.
 
--k::
+`-k`::
 	Kill keywords: will extract files with `-kk` from the CVS archive
 	to avoid noisy changesets. Highly recommended, but off by default
 	to preserve compatibility with early imported trees.
 
--u::
+`-u`::
 	Convert underscores in tag and branch names to dots.
 
 -s <subst>::
@@ -115,7 +115,7 @@ If you need to pass multiple options, separate them with a comma.
 	Instead of calling cvsps, read the provided cvsps output file. Useful
 	for debugging or when cvsps is being handled outside cvsimport.
 
--m::
+`-m`::
 	Attempt to detect merges based on the commit message. This option
 	will enable default regexes that try to capture the source
 	branch name from the commit message.
@@ -132,7 +132,7 @@ This option can be used several times to provide several detection regexes.
 -S <regex>::
 	Skip paths matching the regex.
 
--a::
+`-a`::
 	Import all commits, including recent ones. cvsimport by default
 	skips commits that have a timestamp less than 10 minutes ago.
 
@@ -165,7 +165,7 @@ It is not recommended to use this feature if you intend to
 export changes back to CVS again later with
 `git cvsexportcommit`.
 
--R::
+`-R`::
 	Generate a `$GIT_DIR/cvs-revisions` file containing a mapping from CVS
 	revision numbers to newly-created Git commit IDs.  The generated file
 	will contain one line for each (filename, revision) pair imported;
@@ -181,7 +181,7 @@ doing incremental imports.
 This option may be useful if you have CVS revision numbers stored in commit
 messages, bug-tracking systems, email archives, and the like.
 
--h::
+`-h`::
 	Print a short usage message and exit.
 
 OUTPUT
diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt
index bf53d16a7f..5b7bfe6dc0 100644
--- a/Documentation/git-cvsserver.txt
+++ b/Documentation/git-cvsserver.txt
@@ -34,23 +34,23 @@ closely as possible.
 --base-path <path>::
 Prepend 'path' to requested CVSROOT
 
---strict-paths::
+`--strict-paths`::
 Don't allow recursing into subdirectories
 
---export-all::
+`--export-all`::
 Don't check for `gitcvs.enabled` in config. You also have to specify a list
 of allowed directories (see below) if you want to use this option.
 
--V::
---version::
+`-V`::
+`--version`::
 Print version information and exit
 
--h::
--H::
---help::
+`-h`::
+`-H`::
+`--help`::
 Print usage information and exit
 
-<directory>::
+`<directory>`::
 You can specify a list of allowed directories. If no directories
 are given, all are allowed. This is an additional restriction, gitcvs
 access still needs to be enabled by the `gitcvs.enabled` config option
diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt
index 3f684378f4..533be2b997 100644
--- a/Documentation/git-daemon.txt
+++ b/Documentation/git-daemon.txt
@@ -46,26 +46,26 @@ An `upload-archive` also exists to serve `git archive`.
 
 OPTIONS
 -------
---strict-paths::
+`--strict-paths`::
 	Match paths exactly (i.e. don't allow "/foo/repo" when the real path is
 	"/foo/repo.git" or "/foo/repo/.git") and don't do user-relative paths.
 	`git daemon` will refuse to start when this option is enabled and no
 	whitelist is specified.
 
---base-path=<path>::
+`--base-path=<path>`::
 	Remap all the path requests as relative to the given path.
 	This is sort of "Git root" - if you run `git daemon` with
 	`--base-path=/srv/git` on `example.com`, then if you later try to pull
 	`git://example.com/hello.git`, `git daemon` will interpret the path
 	as `/srv/git/hello.git`.
 
---base-path-relaxed::
+`--base-path-relaxed`::
 	If `--base-path` is enabled and repo lookup fails, with this option
 	`git daemon` will attempt to lookup without prefixing the base path.
 	This is useful for switching to `--base-path` usage, while still
 	allowing the old paths.
 
---interpolated-path=<pathtemplate>::
+`--interpolated-path=<pathtemplate>`::
 	To support virtual hosting, an interpolated path template can be
 	used to dynamically construct alternate paths.  The template
 	supports %H for the target hostname as supplied by the client but
@@ -75,12 +75,12 @@ OPTIONS
 	After interpolation, the path is validated against the directory
 	whitelist.
 
---export-all::
+`--export-all`::
 	Allow pulling from all directories that look like Git repositories
 	(have the 'objects' and 'refs' subdirectories), even if they
 	do not have the `git-daemon-export-ok` file.
 
---inetd::
+`--inetd`::
 	Have the server run as an inetd service. Implies `--syslog` (may be
 	overridden with `--log-destination=`).
 	Incompatible with `--detach`, `--port`, `--listen`, `--user` and `--group`
@@ -94,49 +94,49 @@ OPTIONS
 	Can be given more than once.
 	Incompatible with `--inetd` option.
 
---port=<n>::
+`--port=<n>`::
 	Listen on an alternative port.  Incompatible with `--inetd` option.
 
---init-timeout=<n>::
+`--init-timeout=<n>`::
 	Timeout (in seconds) between the moment the connection is established
 	and the client request is received (typically a rather low value, since
 	that should be basically immediate).
 
---timeout=<n>::
+`--timeout=<n>`::
 	Timeout (in seconds) for specific client sub-requests. This includes
 	the time it takes for the server to process the sub-request and the
 	time spent waiting for the next client's request.
 
---max-connections=<n>::
+`--max-connections=<n>`::
 	Maximum number of concurrent clients, defaults to 32.  Set it to
 	zero for no limit.
 
---syslog::
+`--syslog`::
 	Short for `--log-destination=syslog`.
 
---log-destination=<destination>::
+`--log-destination=<destination>`::
 	Send log messages to the specified destination.
 	Note that this option does not imply `--verbose`,
 	thus by default only error conditions will be logged.
 	The <destination> must be one of:
 +
 --
-stderr::
+`stderr`::
 	Write to standard error.
 	Note that if `--detach` is specified,
 	the process disconnects from the real standard error,
 	making this destination effectively equivalent to `none`.
-syslog::
+`syslog`::
 	Write to syslog, using the `git-daemon` identifier.
-none::
+`none`::
 	Disable all logging.
 --
 +
 The default destination is `syslog` if `--inetd` or `--detach` is specified,
 otherwise `stderr`.
 
---user-path::
---user-path=<path>::
+`--user-path`::
+`--user-path=<path>`::
 	Allow {tilde}user notation to be used in requests.  When
 	specified with no parameter, requests to
 	`git://host/~alice/foo` is taken as a request to access
@@ -145,23 +145,23 @@ otherwise `stderr`.
 	taken as a request to access `path/foo` repository in
 	the home directory of user `alice`.
 
---verbose::
+`--verbose`::
 	Log details about the incoming connections and requested files.
 
---reuseaddr::
+`--reuseaddr`::
 	Use SO_REUSEADDR when binding the listening socket.
 	This allows the server to restart without waiting for
 	old connections to time out.
 
---detach::
+`--detach`::
 	Detach from the shell. Implies `--syslog`.
 
---pid-file=<file>::
+`--pid-file=<file>`::
 	Save the process id in 'file'.  Ignored when the daemon
 	is run under `--inetd`.
 
---user=<user>::
---group=<group>::
+`--user=<user>`::
+`--group=<group>`::
 	Change daemon's uid and gid before entering the service loop.
 	When only `--user` is given without `--group`, the
 	primary group ID for the user is used.  The values of
@@ -179,21 +179,21 @@ may also want to set and export `HOME` to point at the home
 directory of `<user>` before starting the daemon, and make sure any
 Git configuration files in that directory are readable by `<user>`.
 
---enable=<service>::
---disable=<service>::
+`--enable=<service>`::
+`--disable=<service>`::
 	Enable/disable the service site-wide per default.  Note
 	that a service disabled site-wide can still be enabled
 	per repository if it is marked overridable and the
 	repository enables the service with a configuration
 	item.
 
---allow-override=<service>::
---forbid-override=<service>::
+`--allow-override=<service>`::
+`--forbid-override=<service>`::
 	Allow/forbid overriding the site-wide default with per
 	repository configuration.  By default, all the services
 	may be overridden.
 
---[no-]informative-errors::
+`--[no-]informative-errors`::
 	When informative errors are turned on, `git-daemon` will report
 	more verbose errors to the client, differentiating conditions
 	like "no such repository" from "repository not exported". This
@@ -202,7 +202,7 @@ Git configuration files in that directory are readable by `<user>`.
 	errors are not enabled, all errors report "access denied" to the
 	client. The default is `--no-informative-errors`.
 
---access-hook=<path>::
+`--access-hook=<path>`::
 	Every time a client connects, first run an external command
 	specified by the <path> with service name (e.g. "upload-pack"),
 	path to the repository, hostname (%H), canonical hostname
@@ -217,7 +217,7 @@ The external command can optionally write a single line to its
 standard output to be sent to the requestor as an error message when
 it declines the service.
 
-<directory>::
+`<directory>`::
 	A directory to add to the whitelist of allowed directories. Unless
 	`--strict-paths` is specified this will also include subdirectories
 	of each named directory.
@@ -232,18 +232,18 @@ against only in a few selected repositories the daemon serves),
 the per-repository configuration file can be used to enable or
 disable them.
 
-upload-pack::
+`upload-pack`::
 	This serves `git fetch-pack` and `git ls-remote`
 	clients.  It is enabled by default, but a repository can
 	disable it by setting `daemon.uploadpack` configuration
 	item to `false`.
 
-upload-archive::
+`upload-archive`::
 	This serves `git archive --remote`.  It is disabled by
 	default, but a repository can enable it by setting
 	`daemon.uploadarch` configuration item to `true`.
 
-receive-pack::
+`receive-pack`::
 	This serves `git send-pack` clients, allowing anonymous
 	push.  It is disabled by default, as there is _no_
 	authentication in the protocol (in other words, anybody
diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt
index a21eafa025..39cecb4ce6 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.txt
@@ -37,8 +37,8 @@ OPTIONS
 <commit-ish>...::
 	Commit-ish object names to describe.  Defaults to `HEAD` if omitted.
 
---dirty[=<mark>]::
---broken[=<mark>]::
+`--dirty[=<mark>]`::
+`--broken[=<mark>]`::
 	Describe the state of the working tree.  When the working
 	tree matches `HEAD`, the output is the same as `git describe
 	HEAD`.  If the working tree has local modification "-dirty"
@@ -47,44 +47,44 @@ OPTIONS
 	error out, unless `--broken' is given, which appends
 	the suffix "-broken" instead.
 
---all::
+`--all`::
 	Instead of using only the annotated tags, use any ref
 	found in `refs/` namespace.  This option enables matching
 	any known branch, remote-tracking branch, or lightweight tag.
 
---tags::
+`--tags`::
 	Instead of using only the annotated tags, use any tag
 	found in `refs/tags` namespace.  This option enables matching
 	a lightweight (non-annotated) tag.
 
---contains::
+`--contains`::
 	Instead of finding the tag that predates the commit, find
 	the tag that comes after the commit, and thus contains it.
 	Automatically implies `--tags`.
 
---abbrev=<n>::
+`--abbrev=<n>`::
 	Instead of using the default 7 hexadecimal digits as the
 	abbreviated object name, use <n> digits, or as many digits
 	as needed to form a unique object name.  An <n> of 0
 	will suppress long format, only showing the closest tag.
 
---candidates=<n>::
+`--candidates=<n>`::
 	Instead of considering only the 10 most recent tags as
 	candidates to describe the input commit-ish consider
 	up to <n> candidates.  Increasing <n> above 10 will take
 	slightly longer but may produce a more accurate result.
 	An <n> of 0 will cause only exact matches to be output.
 
---exact-match::
+`--exact-match`::
 	Only output exact matches (a tag directly references the
 	supplied commit).  This is a synonym for `--candidates=0`.
 
---debug::
+`--debug`::
 	Verbosely display information about the searching strategy
 	being employed to standard error.  The tag name will still
 	be printed to standard out.
 
---long::
+`--long`::
 	Always output the long format (the tag, the number of commits
 	and the abbreviated commit name) even when it matches a tag.
 	This is useful when you want to see parts of the commit object name
@@ -115,10 +115,10 @@ OPTIONS
 	match any of the `--exclude` patterns. Use `--no-exclude` to clear and
 	reset the list of patterns.
 
---always::
+`--always`::
 	Show uniquely abbreviated commit object as fallback.
 
---first-parent::
+`--first-parent`::
 	Follow only the first parent commit upon seeing a merge commit.
 	This is useful when you wish to not match tags on branches merged
 	in the history of the target commit.
diff --git a/Documentation/git-diff-files.txt b/Documentation/git-diff-files.txt
index b0fb276b99..5a993a309f 100644
--- a/Documentation/git-diff-files.txt
+++ b/Documentation/git-diff-files.txt
@@ -34,14 +34,14 @@ The default is to diff against our branch (-2) and the
 cleanly resolved paths.  The option -0 can be given to
 omit diff output for unmerged entries and just show "Unmerged".
 
--c::
---cc::
+`-c`::
+`--cc`::
 	This compares stage 2 (our branch), stage 3 (their
 	branch) and the working tree file and outputs a combined
 	diff, similar to the way 'diff-tree' shows a merge
 	commit with these flags.
 
--q::
+`-q`::
 	Remain silent even on nonexistent files
 
 
diff --git a/Documentation/git-diff-index.txt b/Documentation/git-diff-index.txt
index 87db234e77..e95e997e2b 100644
--- a/Documentation/git-diff-index.txt
+++ b/Documentation/git-diff-index.txt
@@ -23,18 +23,18 @@ OPTIONS
 -------
 include::diff-options.txt[]
 
-<tree-ish>::
+`<tree-ish>`::
 	The id of a tree object to diff against.
 
---cached::
+`--cached`::
 	Do not consider the on-disk file at all.
 
---merge-base::
+`--merge-base`::
 	Instead of comparing <tree-ish> directly, use the merge base
 	between <tree-ish> and `HEAD` instead.  <tree-ish> must be a
 	commit.
 
--m::
+`-m`::
 	By default, files recorded in the index but not checked
 	out are reported as deleted.  This flag makes
 	`git diff-index` say that all non-checked-out files are up
diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt
index 56354886a4..098e67f872 100644
--- a/Documentation/git-diff-tree.txt
+++ b/Documentation/git-diff-tree.txt
@@ -26,29 +26,29 @@ OPTIONS
 -------
 include::diff-options.txt[]
 
-<tree-ish>::
+`<tree-ish>`::
 	The id of a tree object.
 
 <path>...::
 	If provided, the results are limited to a subset of files
 	matching one of the provided pathspecs.
 
--r::
+`-r`::
         recurse into sub-trees
 
--t::
+`-t`::
 	show tree entry itself as well as subtrees.  Implies `-r`.
 
---root::
+`--root`::
 	When `--root` is specified the initial commit will be shown as a big
 	creation event. This is equivalent to a diff against the NULL tree.
 
---merge-base::
+`--merge-base`::
 	Instead of comparing the <tree-ish>s directly, use the merge
 	base between the two <tree-ish>s as the "before" side.  There
 	must be two <tree-ish>s given and they must both be commits.
 
---stdin::
+`--stdin`::
 	When `--stdin` is specified, the command does not take
 	<tree-ish> arguments from the command line.  Instead, it
 	reads lines containing either two <tree>, one <commit>, or a
@@ -68,29 +68,29 @@ newline, is printed.
 The following flags further affect the behavior when comparing
 commits (but not trees).
 
--m::
+`-m`::
 	By default, `git diff-tree --stdin` does not show
 	differences for merge commits.  With this flag, it shows
 	differences to that commit from all of its parents. See
 	also `-c`.
 
--s::
+`-s`::
 	By default, `git diff-tree --stdin` shows differences,
 	either in machine-readable form (without `-p`) or in patch
 	form (with `-p`).  This output can be suppressed.  It is
 	only useful with `-v` flag.
 
--v::
+`-v`::
 	This flag causes `git diff-tree --stdin` to also show
 	the commit message before the differences.
 
 include::pretty-options.txt[]
 
---no-commit-id::
+`--no-commit-id`::
 	`git diff-tree` outputs a line with the commit ID when
 	applicable.  This flag suppressed the commit ID output.
 
--c::
+`-c`::
 	This flag changes the way a merge commit is displayed
 	(which means it is useful only when the command is given
 	one <tree-ish>, or `--stdin`).  It shows the differences
@@ -100,7 +100,7 @@ include::pretty-options.txt[]
 	Furthermore, it lists only files which were modified
 	from all parents.
 
---cc::
+`--cc`::
 	This flag changes the way a merge commit patch is displayed,
 	in a similar way to the `-c` option. It implies the `-c`
 	and `-p` options and further compresses the patch output
@@ -110,14 +110,14 @@ include::pretty-options.txt[]
 	itself and the commit log message is not shown, just like in any other
 	"empty diff" case.
 
---combined-all-paths::
+`--combined-all-paths`::
 	This flag causes combined diffs (used for merge commits) to
 	list the name of the file from all parents.  It thus only has
 	effect when `-c` or `--cc` are specified, and is likely only
 	useful if filename changes are detected (i.e. when either
 	rename or copy detection have been requested).
 
---always::
+`--always`::
 	Show the commit itself and the commit log message even
 	if the diff itself is empty.
 
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index b646654941..f8b1e83404 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -19,31 +19,31 @@ linkgit:git-diff[1].
 
 OPTIONS
 -------
--d::
---dir-diff::
+`-d`::
+`--dir-diff`::
 	Copy the modified files to a temporary location and perform
 	a directory diff on them. This mode never prompts before
 	launching the diff tool.
 
--y::
---no-prompt::
+`-y`::
+`--no-prompt`::
 	Do not prompt before launching a diff tool.
 
---prompt::
+`--prompt`::
 	Prompt before each invocation of the diff tool.
 	This is the default behaviour; the option is provided to
 	override any configuration settings.
 
---rotate-to=<file>::
+`--rotate-to=<file>`::
 	Start showing the diff for the given path,
 	the paths before it will move to end and output.
 
---skip-to=<file>::
+`--skip-to=<file>`::
 	Start showing the diff for the given path, skipping all
 	the paths before it.
 
 -t <tool>::
---tool=<tool>::
+`--tool=<tool>`::
 	Use the diff tool specified by <tool>.  Valid values include
 	emerge, kompare, meld, and vimdiff. Run `git difftool --tool-help`
 	for the list of valid <tool> settings.
@@ -74,10 +74,10 @@ of the diff post-image.  `$MERGED` is the name of the file which is
 being compared. `$BASE` is provided for compatibility
 with custom merge tool commands and has the same value as `$MERGED`.
 
---tool-help::
+`--tool-help`::
 	Print a list of diff tools that may be used with `--tool`.
 
---[no-]symlinks::
+`--[no-]symlinks`::
 	`git difftool`'s default behavior is create symlinks to the
 	working tree when run in `--dir-diff` mode and the right-hand
 	side of the comparison yields the same content as the file in
@@ -87,14 +87,14 @@ Specifying `--no-symlinks` instructs `git difftool` to create copies
 instead.  `--no-symlinks` is the default on Windows.
 
 -x <command>::
---extcmd=<command>::
+`--extcmd=<command>`::
 	Specify a custom command for viewing diffs.
 	`git-difftool` ignores the configured defaults and runs
 	`$command $LOCAL $REMOTE` when this option is specified.
 	Additionally, `$BASE` is set in the environment.
 
--g::
---[no-]gui::
+`-g`::
+`--[no-]gui`::
 	When `git-difftool` is invoked with the `-g` or `--gui` option
 	the default diff tool will be read from the configured
 	`diff.guitool` variable instead of `diff.tool`. The `--no-gui`
@@ -102,7 +102,7 @@ instead.  `--no-symlinks` is the default on Windows.
 	is not set, we will fallback in the order of `merge.guitool`,
 	`diff.tool`, `merge.tool` until a tool is found.
 
---[no-]trust-exit-code::
+`--[no-]trust-exit-code`::
 	`git-difftool` invokes a diff tool individually on each file.
 	Errors reported by the diff tool are ignored by default.
 	Use `--trust-exit-code` to make `git-difftool` exit when an
diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt
index 0e1db78aee..b50751b344 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.txt
@@ -23,7 +23,7 @@ relied on by tools like `git filter-repo`).
 
 OPTIONS
 -------
---progress=<n>::
+`--progress=<n>`::
 	Insert 'progress' statements every <n> objects, to be shown by
 	`git fast-import` during import.
 
@@ -50,8 +50,8 @@ the output.  With 'rewrite', if the tagged object is a commit, it will
 rewrite the tag to tag an ancestor commit (via parent rewriting; see
 linkgit:git-rev-list[1])
 
--M::
--C::
+`-M`::
+`-C`::
 	Perform move and/or copy detection, as described in the
 	linkgit:git-diff[1] manual page, and use it to generate
 	rename and copy commands in the output dump.
@@ -59,7 +59,7 @@ linkgit:git-rev-list[1])
 Note that earlier versions of this command did not complain and
 produced incorrect results if you gave these options.
 
---export-marks=<file>::
+`--export-marks=<file>`::
 	Dumps the internal marks table to <file> when complete.
 	Marks are written one per line as `:markid SHA-1`. Only marks
 	for revisions are dumped; marks for blobs are ignored.
@@ -71,12 +71,12 @@ produced incorrect results if you gave these options.
 	The file will not be written if no new object has been
 	marked/exported.
 
---import-marks=<file>::
+`--import-marks=<file>`::
 	Before processing any input, load the marks specified in
 	<file>.  The input file must exist, must be readable, and
 	must use the same format as produced by `--export-marks`.
 
---mark-tags::
+`--mark-tags`::
 	In addition to labelling blobs and commits with mark ids, also
 	label tags.  This is useful in conjunction with
 	`--export-marks` and `--import-marks`, and is also useful (and
@@ -90,17 +90,17 @@ exported again.  If the backend uses a similar `--import-marks` file,
 this allows for incremental bidirectional exporting of the repository
 by keeping the marks the same across runs.
 
---fake-missing-tagger::
+`--fake-missing-tagger`::
 	Some old repositories have tags without a tagger.  The
 	fast-import protocol was pretty strict about that, and did not
 	allow that.  So fake a tagger to be able to fast-import the
 	output.
 
---use-done-feature::
+`--use-done-feature`::
 	Start the stream with a 'feature done' stanza, and terminate
 	it with a 'done' command.
 
---no-data::
+`--no-data`::
 	Skip output of blob objects and instead refer to blobs via
 	their original SHA-1 hash.  This is useful when rewriting the
 	directory structure or history of a repository without
@@ -108,13 +108,13 @@ by keeping the marks the same across runs.
 	resulting stream can only be used by a repository which
 	already contains the necessary objects.
 
---full-tree::
+`--full-tree`::
 	This option will cause fast-export to issue a "deleteall"
 	directive for each commit followed by a full list of all files
 	in the commit (as opposed to just listing the files which are
 	different from the commit's first parent).
 
---anonymize::
+`--anonymize`::
 	Anonymize the contents of the repository while still retaining
 	the shape of the history and stored tree.  See the section on
 	`ANONYMIZING` below.
@@ -124,7 +124,7 @@ by keeping the marks the same across runs.
 	`<to>` is omitted, map `<from>` to itself (i.e., do not
 	anonymize it). See the section on `ANONYMIZING` below.
 
---reference-excluded-parents::
+`--reference-excluded-parents`::
 	By default, running a command such as `git fast-export
 	master~5..master` will not include the commit `master~5`
 	and will make `master~4` no longer have `master~5` as
@@ -136,7 +136,7 @@ by keeping the marks the same across runs.
 	repository which already contains the necessary parent
 	commits.
 
---show-original-ids::
+`--show-original-ids`::
 	Add an extra directive to the output for commits and blobs,
 	`original-oid <SHA1SUM>`.  While such directives will likely be
 	ignored by importers such as `git-fast-import`, it may be useful
@@ -150,7 +150,7 @@ by keeping the marks the same across runs.
 	message will be re-encoded into UTF-8.  With 'no', the original
 	encoding will be preserved.
 
---refspec::
+`--refspec`::
 	Apply the specified refspec to each ref exported. Multiple of them can
 	be specified.
 
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index 7b801de61a..cfbb47665f 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -34,24 +34,24 @@ the frontend program in use.
 OPTIONS
 -------
 
---force::
+`--force`::
 	Force updating modified existing branches, even if doing
 	so would cause commits to be lost (as the new commit does
 	not contain the old commit).
 
---quiet::
+`--quiet`::
 	Disable the output shown by `--stats`, making fast-import usually
 	be silent when it is successful.  However, if the import stream
 	has directives intended to show user output (e.g. `progress`
 	directives), the corresponding messages will still be shown.
 
---stats::
+`--stats`::
 	Display some basic statistics about the objects fast-import has
 	created, the packfiles they were stored into, and the
 	memory used by fast-import during this run.  Showing this output
 	is currently the default, but can be disabled with `--quiet`.
 
---allow-unsafe-features::
+`--allow-unsafe-features`::
 	Many command-line options can be provided as part of the
 	fast-import stream itself by using the `feature` or `option`
 	commands. However, some of these options are unsafe (e.g.,
@@ -69,19 +69,19 @@ OPTIONS
 Options for Frontends
 ~~~~~~~~~~~~~~~~~~~~~
 
---cat-blob-fd=<fd>::
+`--cat-blob-fd=<fd>`::
 	Write responses to `get-mark`, `cat-blob`, and `ls` queries to the
 	file descriptor <fd> instead of `stdout`.  Allows `progress`
 	output intended for the end-user to be separated from other
 	output.
 
---date-format=<fmt>::
+`--date-format=<fmt>`::
 	Specify the type of dates the frontend will supply to
 	fast-import within `author`, `committer` and `tagger` commands.
 	See ``Date Formats'' below for details about which formats
 	are supported, and their syntax.
 
---done::
+`--done`::
 	Terminate with error if there is no `done` command at the end of
 	the stream.  This option might be useful for detecting errors
 	that cause the frontend to terminate before it has started to
@@ -90,7 +90,7 @@ Options for Frontends
 Locations of Marks Files
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
---export-marks=<file>::
+`--export-marks=<file>`::
 	Dumps the internal marks table to <file> when complete.
 	Marks are written one per line as `:markid SHA-1`.
 	Frontends can use this file to validate imports after they
@@ -99,7 +99,7 @@ Locations of Marks Files
 	at checkpoint (or completion) the same path can also be
 	safely given to `--import-marks`.
 
---import-marks=<file>::
+`--import-marks=<file>`::
 	Before processing any input, load the marks specified in
 	<file>.  The input file must exist, must be readable, and
 	must use the same format as produced by `--export-marks`.
@@ -107,11 +107,11 @@ Locations of Marks Files
 	set of marks.  If a mark is defined to different values,
 	the last file wins.
 
---import-marks-if-exists=<file>::
+`--import-marks-if-exists=<file>`::
 	Like `--import-marks` but instead of erroring out, silently
 	skips the file if it does not exist.
 
---[no-]relative-marks::
+`--[no-]relative-marks`::
 	After specifying `--relative-marks` the paths specified
 	with `--import-marks`= and `--export-marks`= are relative
 	to an internal directory in the current repository.
@@ -145,21 +145,21 @@ algorithm.
 Performance and Compression Tuning
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
---active-branches=<n>::
+`--active-branches=<n>`::
 	Maximum number of branches to maintain active at once.
 	See ``Memory Utilization'' below for details.  Default is 5.
 
---big-file-threshold=<n>::
+`--big-file-threshold=<n>`::
 	Maximum size of a blob that fast-import will attempt to
 	create a delta for, expressed in bytes.  The default is 512m
 	(512 MiB).  Some importers may wish to lower this on systems
 	with constrained memory.
 
---depth=<n>::
+`--depth=<n>`::
 	Maximum delta depth, for blob and tree deltification.
 	Default is 50.
 
---export-pack-edges=<file>::
+`--export-pack-edges=<file>`::
 	After creating a packfile, print a line of data to
 	<file> listing the filename of the packfile and the last
 	commit on each branch that was written to that packfile.
@@ -168,7 +168,7 @@ Performance and Compression Tuning
 	as these commits can be used as edge points during calls
 	to `git pack-objects`.
 
---max-pack-size=<n>::
+`--max-pack-size=<n>`::
 	Maximum size of each output packfile.
 	The default is unlimited.
 
@@ -1141,17 +1141,17 @@ it does not.
 
 The <feature> part of the command may be any one of the following:
 
-date-format::
-export-marks::
-relative-marks::
-no-relative-marks::
-force::
+`date-format`::
+`export-marks`::
+`relative-marks`::
+`no-relative-marks`::
+`force`::
 	Act as though the corresponding command-line option with
 	a leading `--` was passed on the command line
 	(see OPTIONS, above).
 
-import-marks::
-import-marks-if-exists::
+`import-marks`::
+`import-marks-if-exists`::
 	Like `--import-marks` except in two respects: first, only one
 	"feature import-marks" or "feature import-marks-if-exists"
 	command is allowed per stream; second, an `--import-marks=`
@@ -1160,9 +1160,9 @@ import-marks-if-exists::
 	"feature import-marks-if-exists" like a corresponding
 	command-line option silently skips a nonexistent file.
 
-get-mark::
-cat-blob::
-ls::
+`get-mark`::
+`cat-blob`::
+`ls`::
 	Require that the backend support the 'get-mark', 'cat-blob',
 	or 'ls' command respectively.
 	Versions of fast-import not supporting the specified command
@@ -1171,13 +1171,13 @@ ls::
 	rather than wasting time on the early part of an import
 	before the unsupported command is detected.
 
-notes::
+`notes`::
 	Require that the backend support the 'notemodify' (N)
 	subcommand to the 'commit' command.
 	Versions of fast-import not supporting notes will exit
 	with a message indicating so.
 
-done::
+`done`::
 	Error out if the stream ends without a 'done' command.
 	Without this feature, errors causing the frontend to end
 	abruptly at a convenient point in the stream can go
diff --git a/Documentation/git-fetch-pack.txt b/Documentation/git-fetch-pack.txt
index 3d829538b0..e7e4ed214a 100644
--- a/Documentation/git-fetch-pack.txt
+++ b/Documentation/git-fetch-pack.txt
@@ -32,10 +32,10 @@ have a common ancestor commit.
 
 OPTIONS
 -------
---all::
+`--all`::
 	Fetch all remote refs.
 
---stdin::
+`--stdin`::
 	Take the list of refs from stdin, one per line. If there
 	are refs specified on the command line in addition to this
 	option, then the refs from stdin are processed after those
@@ -45,29 +45,29 @@ If `--stateless-rpc` is specified together with this option then
 the list of refs must be in packet format (pkt-line). Each ref must
 be in a separate packet, and the list must end with a flush packet.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Pass `-q` flag to `git unpack-objects`; this makes the
 	cloning process less verbose.
 
--k::
---keep::
+`-k`::
+`--keep`::
 	Do not invoke `git unpack-objects` on received data, but
 	create a single packfile out of it instead, and store it
 	in the object database. If provided twice then the pack is
 	locked against repacking.
 
---thin::
+`--thin`::
 	Fetch a "thin" pack, which records objects in deltified form based
 	on objects not included in the pack to reduce network traffic.
 
---include-tag::
+`--include-tag`::
 	If the remote side supports it, annotated tags objects will
 	be downloaded on the same connection as the other objects if
 	the object the tag references is downloaded.  The caller must
 	otherwise determine the tags this option made available.
 
---upload-pack=<git-upload-pack>::
+`--upload-pack=<git-upload-pack>`::
 	Use this to specify the path to `git-upload-pack` on the
 	remote side, if is not found on your `$PATH`.
 	Installations of sshd ignores the user's environment
@@ -79,39 +79,39 @@ be in a separate packet, and the list must end with a flush packet.
 	shells by having a lean `.bashrc` file (they set most of
 	the things up in `.bash_profile`).
 
---exec=<git-upload-pack>::
+`--exec=<git-upload-pack>`::
 	Same as `--upload-pack`=<git-upload-pack>.
 
---depth=<n>::
+`--depth=<n>`::
 	Limit fetching to ancestor-chains not longer than n.
 	`git-upload-pack` treats the special depth 2147483647 as
 	infinite even if there is an ancestor-chain that long.
 
---shallow-since=<date>::
+`--shallow-since=<date>`::
 	Deepen or shorten the history of a shallow repository to
 	include all reachable commits after <date>.
 
---shallow-exclude=<revision>::
+`--shallow-exclude=<revision>`::
 	Deepen or shorten the history of a shallow repository to
 	exclude commits reachable from a specified remote branch or tag.
 	This option can be specified multiple times.
 
---deepen-relative::
+`--deepen-relative`::
 	Argument `--depth` specifies the number of commits from the
 	current shallow boundary instead of from the tip of each
 	remote branch history.
 
---no-progress::
+`--no-progress`::
 	Do not show the progress.
 
---check-self-contained-and-connected::
+`--check-self-contained-and-connected`::
 	Output "connectivity-ok" if the received pack is
 	self-contained and connected.
 
--v::
+`-v`::
 	Run verbosely.
 
-<repository>::
+`<repository>`::
 	The URL to the remote repository.
 
 <refs>...::
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index 11ee865969..79c7f15904 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -48,7 +48,7 @@ include::fetch-options.txt[]
 
 include::pull-fetch-param.txt[]
 
---stdin::
+`--stdin`::
 	Read refspecs, one per line, from stdin in addition to those provided
 	as arguments. The "tag <name>" format is not supported.
 
@@ -212,7 +212,7 @@ In compact output mode, specified with configuration variable
 other string, it will be substituted with `*` in the other string. For
 example, `master -> origin/master` becomes `master -> origin/*`.
 
-flag::
+`flag`::
 	A single character indicating the status of the ref:
 (space);; for a successfully fetched fast-forward;
 `+`;; for a successful forced update;
@@ -222,22 +222,22 @@ flag::
 `!`;; for a ref that was rejected or failed to update; and
 `=`;; for a ref that was up to date and did not need fetching.
 
-summary::
+`summary`::
 	For a successfully fetched ref, the summary shows the old and new
 	values of the ref in a form suitable for using as an argument to
 	`git log` (this is `<old>..<new>` in most cases, and
 	`<old>...<new>` for forced non-fast-forward updates).
 
-from::
+`from`::
 	The name of the remote ref being fetched from, minus its
 	`refs/<type>/` prefix. In the case of deletion, the name of
 	the remote ref is "(none)".
 
-to::
+`to`::
 	The name of the local ref being updated, minus its
 	`refs/<type>/` prefix.
 
-reason::
+`reason`::
 	A human-readable explanation. In the case of successfully fetched
 	refs, no explanation is needed. For a failed ref, the reason for
 	failure is described.
diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt
index 8b19805695..4a72e4ce44 100644
--- a/Documentation/git-filter-branch.txt
+++ b/Documentation/git-filter-branch.txt
@@ -185,7 +185,7 @@ be removed, buyer beware. There is also no support for changing the
 author or timestamp (or the tag message for that matter). Tags which point
 to other tags will be rewritten to point to the underlying commit.
 
---prune-empty::
+`--prune-empty`::
 	Some filters will generate empty commits that leave the tree untouched.
 	This option instructs `git-filter-branch` to remove such commits if they
 	have exactly one or zero non-pruned parents; merge commits will
@@ -205,8 +205,8 @@ to other tags will be rewritten to point to the underlying commit.
 	does this in the `.git-rewrite/` directory but you can override
 	that choice by this parameter.
 
--f::
---force::
+`-f`::
+`--force`::
 	`git filter-branch` refuses to start with an existing temporary
 	directory or when there are already refs starting with
 	`refs/original/`, unless forced.
diff --git a/Documentation/git-fmt-merge-msg.txt b/Documentation/git-fmt-merge-msg.txt
index a8e9ab914d..283bb59199 100644
--- a/Documentation/git-fmt-merge-msg.txt
+++ b/Documentation/git-fmt-merge-msg.txt
@@ -24,18 +24,18 @@ automatically invoking `git merge`.
 OPTIONS
 -------
 
---log[=<n>]::
+`--log[=<n>]`::
 	In addition to branch names, populate the log message with
 	one-line descriptions from the actual commits that are being
 	merged.  At most <n> commits from each merge parent will be
 	used (20 if <n> is omitted).  This overrides the `merge.log`
 	configuration variable.
 
---no-log::
+`--no-log`::
 	Do not list one-line descriptions from the actual commits being
 	merged.
 
---[no-]summary::
+`--[no-]summary`::
 	Synonyms to `--log` and `--no-log`; these are deprecated and will be
 	removed in the future.
 
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 518f040fcd..74be946d9d 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -32,19 +32,19 @@ OPTIONS
 	literally, in the latter case matching completely or from the
 	beginning up to a slash.
 
---count=<count>::
+`--count=<count>`::
 	By default the command shows all refs that match
 	`<pattern>`.  This option makes it stop after showing
 	that many refs.
 
---sort=<key>::
+`--sort=<key>`::
 	A field name to sort on.  Prefix `-` to sort in
 	descending order of the value.  When unspecified,
 	`refname` is used.  You may use the `--sort=<key>` option
 	multiple times, in which case the last key becomes the primary
 	key.
 
---format=<format>::
+`--format=<format>`::
 	A string that interpolates `%(fieldname)` from a ref being shown
 	and the object it points at.  If `fieldname`
 	is prefixed with an asterisk (`*`) and the ref points
@@ -57,40 +57,40 @@ OPTIONS
 	`xx`; for example `%00` interpolates to `\0` (NUL),
 	`%09` to `\t` (TAB) and `%0a` to `\n` (LF).
 
---color[=<when>]::
+`--color[=<when>]`::
 	Respect any colors specified in the `--format` option. The
 	`<when>` field must be one of `always`, `never`, or `auto` (if
 	`<when>` is absent, behave as if `always` was given).
 
---shell::
---perl::
---python::
---tcl::
+`--shell`::
+`--perl`::
+`--python`::
+`--tcl`::
 	If given, strings that substitute `%(fieldname)`
 	placeholders are quoted as string literals suitable for
 	the specified host language.  This is meant to produce
 	a scriptlet that can directly be `eval`ed.
 
---points-at=<object>::
+`--points-at=<object>`::
 	Only list refs which points at the given object.
 
---merged[=<object>]::
+`--merged[=<object>]`::
 	Only list refs whose tips are reachable from the
 	specified commit (`HEAD` if not specified).
 
---no-merged[=<object>]::
+`--no-merged[=<object>]`::
 	Only list refs whose tips are not reachable from the
 	specified commit (`HEAD` if not specified).
 
---contains[=<object>]::
+`--contains[=<object>]`::
 	Only list refs which contain the specified commit (`HEAD` if not
 	specified).
 
---no-contains[=<object>]::
+`--no-contains[=<object>]`::
 	Only list refs which don't contain the specified commit (`HEAD`
 	if not specified).
 
---ignore-case::
+`--ignore-case`::
 	Sorting and filtering refs are case insensitive.
 
 FIELD NAMES
@@ -102,7 +102,7 @@ keys.
 
 For all objects, the following names can be used:
 
-refname::
+`refname`::
 	The name of the ref (the part after `$GIT_DIR`/).
 	For a non-ambiguous short name of the ref append `:short`.
 	The option `core.warnAmbiguousRefs` is used to select the strict
@@ -121,25 +121,25 @@ refname::
 +
 `strip` can be used as a synonym to `lstrip`.
 
-objecttype::
+`objecttype`::
 	The type of the object (`blob`, `tree`, `commit`, `tag`).
 
-objectsize::
+`objectsize`::
 	The size of the object (the same as `git cat-file -s` reports).
 	Append `:disk` to get the size, in bytes, that the object takes up on
 	disk. See the note about on-disk sizes in the `CAVEATS` section below.
-objectname::
+`objectname`::
 	The object name (aka SHA-1).
 	For a non-ambiguous abbreviation of the object name append `:short`.
 	For an abbreviation of the object name with desired length append
 	`:short=<length>`, where the minimum length is MINIMUM_ABBREV. The
 	length may be exceeded to ensure unique object names.
-deltabase::
+`deltabase`::
 	This expands to the object name of the delta base for the
 	given object, if it is stored as a delta.  Otherwise it
 	expands to the null object name (all zeroes).
 
-upstream::
+`upstream`::
 	The name of a local ref which can be considered ``upstream''
 	from the displayed ref. Respects `:short`, `:lstrip` and
 	`:rstrip` in the same way as `refname` above.  Additionally
@@ -161,24 +161,24 @@ Has no effect if the ref does not have tracking information associated
 with it.  All the options apart from `nobracket` are mutually exclusive,
 but if used together the last option is selected.
 
-push::
+`push`::
 	The name of a local ref which represents the `@{push}`
 	location for the displayed ref. Respects `:short`, `:lstrip`,
 	`:rstrip`, `:track`, `:trackshort`, `:remotename`, and `:remoteref`
 	options as `upstream` does. Produces an empty string if no `@{push}`
 	ref is configured.
 
-HEAD::
+`HEAD`::
 	'*' if `HEAD` matches current ref (the checked out branch), ' '
 	otherwise.
 
-color::
+`color`::
 	Change output color. Followed by `:<colorname>`, where color
 	names are described under Values in the "CONFIGURATION FILE"
 	section of linkgit:git-config[1].  For example,
 	`%(color:bold red)`.
 
-align::
+`align`::
 	Left-, middle-, or right-align the content between
 	%(align:...) and %(end). The "align:" is followed by
 	`width=<width>` and `position=<position>` in any order
@@ -193,7 +193,7 @@ align::
 	quoted, but if nested then only the topmost level performs
 	quoting.
 
-if::
+`if`::
 	Used as %(if)...%(then)...%(end) or
 	%(if)...%(then)...%(else)...%(end).  If there is an atom with
 	value or string literal after the %(if) then everything after
@@ -206,13 +206,13 @@ if::
 	the value between the %(if:...) and %(then) atoms with the
 	given string.
 
-symref::
+`symref`::
 	The ref which the given symbolic ref refers to. If not a
 	symbolic ref, nothing is printed. Respects the `:short`,
 	`:lstrip` and `:rstrip` options in the same way as `refname`
 	above.
 
-worktreepath::
+`worktreepath`::
 	The absolute path to the worktree in which the ref is checked
 	out, if it is checked out in any linked worktree. Empty string
 	otherwise.
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 3b10a6f7ea..3372e13868 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -107,7 +107,7 @@ OPTIONS
 :git-format-patch: 1
 include::diff-options.txt[]
 
--<n>::
+`-<n>`::
 	Prepare patches from the topmost <n> commits.
 
 -o <dir>::
@@ -115,52 +115,52 @@ include::diff-options.txt[]
 	Use <dir> to store the resulting files, instead of the
 	current working directory.
 
--n::
---numbered::
+`-n`::
+`--numbered`::
 	Name output in '[PATCH n/m]' format, even with a single patch.
 
--N::
---no-numbered::
+`-N`::
+`--no-numbered`::
 	Name output in '[PATCH]' format.
 
 --start-number <n>::
 	Start numbering the patches at <n> instead of 1.
 
---numbered-files::
+`--numbered-files`::
 	Output file names will be a simple number sequence
 	without the default first line of the commit appended.
 
--k::
---keep-subject::
+`-k`::
+`--keep-subject`::
 	Do not strip/add '[PATCH]' from the first line of the
 	commit log message.
 
--s::
---signoff::
+`-s`::
+`--signoff`::
 	Add a `Signed-off-by` trailer to the commit message, using
 	the committer identity of yourself.
 	See the signoff option in linkgit:git-commit[1] for more information.
 
---stdout::
+`--stdout`::
 	Print all commits to the standard output in mbox format,
 	instead of creating a file for each one.
 
---attach[=<boundary>]::
+`--attach[=<boundary>]`::
 	Create multipart/mixed attachment, the first part of
 	which is the commit message and the patch itself in the
 	second part, with `Content-Disposition: attachment`.
 
---no-attach::
+`--no-attach`::
 	Disable the creation of an attachment, overriding the
 	configuration setting.
 
---inline[=<boundary>]::
+`--inline[=<boundary>]`::
 	Create multipart/mixed attachment, the first part of
 	which is the commit message and the patch itself in the
 	second part, with `Content-Disposition: inline`.
 
---thread[=<style>]::
---no-thread::
+`--thread[=<style>]`::
+`--no-thread`::
 	Controls addition of `In-Reply-To` and `References` headers to
 	make the second and subsequent mails appear as replies to the
 	first.  Also controls generation of the `Message-Id` header to
@@ -185,14 +185,14 @@ will want to ensure that threading is disabled for `git send-email`.
 	reply to the given <message id>, which avoids breaking threads to
 	provide a new patch series.
 
---ignore-if-in-upstream::
+`--ignore-if-in-upstream`::
 	Do not include a patch that matches a commit in
 	<until>..<since>.  This will examine all patches reachable
 	from <since> but not from <until> and compare them with the
 	patches being generated, and any patch that matches is
 	ignored.
 
---cover-from-description=<mode>::
+`--cover-from-description=<mode>`::
 	Controls which parts of the cover letter will be automatically
 	populated using the branch's description.
 +
@@ -218,20 +218,20 @@ populated with placeholder text.
 	allows for useful naming of a patch series, and can be
 	combined with the `--numbered` option.
 
---filename-max-length=<n>::
+`--filename-max-length=<n>`::
 	Instead of the standard 64 bytes, chomp the generated output
 	filenames at around '<n>' bytes (too short a value will be
 	silently raised to a reasonable length).  Defaults to the
 	value of the `format.filenameMaxLength` configuration
 	variable, or 64 if unconfigured.
 
---rfc::
+`--rfc`::
 	Alias for `--subject-prefix="RFC PATCH"`. RFC means "Request For
 	Comments"; use this when sending an experimental patch for
 	discussion rather than application.
 
 -v <n>::
---reroll-count=<n>::
+`--reroll-count=<n>`::
 	Mark the series as the <n>-th iteration of the topic. The
 	output filenames have `v<n>` prepended to them, and the
 	subject prefix ("PATCH" by default, but configurable via the
@@ -244,20 +244,20 @@ populated with placeholder text.
 	with the previous version does not state exactly which
 	version the new interation is compared against.
 
---to=<email>::
+`--to=<email>`::
 	Add a `To:` header to the email headers. This is in addition
 	to any configured headers, and may be used multiple times.
 	The negated form `--no-to` discards all `To:` headers added so
 	far (from config or command line).
 
---cc=<email>::
+`--cc=<email>`::
 	Add a `Cc:` header to the email headers. This is in addition
 	to any configured headers, and may be used multiple times.
 	The negated form `--no-cc` discards all `Cc:` headers added so
 	far (from config or command line).
 
---from::
---from=<ident>::
+`--from`::
+`--from=<ident>`::
 	Use `ident` in the `From:` header of each commit email. If the
 	author ident of the commit is not textually identical to the
 	provided `ident`, place a `From:` header in the body of the
@@ -271,7 +271,7 @@ header). Note also that `git send-email` already handles this
 transformation for you, and this option should not be used if you are
 feeding the result to `git send-email`.
 
---add-header=<header>::
+`--add-header=<header>`::
 	Add an arbitrary header to the email headers.  This is in addition
 	to any configured headers, and may be used multiple times.
 	For example, `--add-header="Organization: git-foo"`.
@@ -279,19 +279,19 @@ feeding the result to `git send-email`.
 	`Cc:`, and custom) headers added so far from config or command
 	line.
 
---[no-]cover-letter::
+`--[no-]cover-letter`::
 	In addition to the patches, generate a cover letter file
 	containing the branch description, shortlog and the overall diffstat.  You can
 	fill in a description in the file before sending it out.
 
---encode-email-headers::
---no-encode-email-headers::
+`--encode-email-headers`::
+`--no-encode-email-headers`::
 	Encode email headers that have non-ASCII characters with
 	"Q-encoding" (described in RFC 2047), instead of outputting the
 	headers verbatim. Defaults to the value of the
 	`format.encodeEmailHeaders` configuration variable.
 
---interdiff=<previous>::
+`--interdiff=<previous>`::
 	As a reviewer aid, insert an interdiff into the cover letter,
 	or as commentary of the lone patch of a 1-patch series, showing
 	the differences between the previous version of the patch series and
@@ -300,7 +300,7 @@ feeding the result to `git send-email`.
 	the series being formatted (for example `git format-patch
 	--cover-letter --interdiff=feature/v1 -3 feature/v2`).
 
---range-diff=<previous>::
+`--range-diff=<previous>`::
 	As a reviewer aid, insert a range-diff (see linkgit:git-range-diff[1])
 	into the cover letter, or as commentary of the lone patch of a
 	1-patch series, showing the differences between the previous
@@ -317,14 +317,14 @@ product of `format-patch` is generated, and they are not passed to
 the underlying `range-diff` machinery used to generate the cover-letter
 material (this may change in the future).
 
---creation-factor=<percent>::
+`--creation-factor=<percent>`::
 	Used with `--range-diff`, tweak the heuristic which matches up commits
 	between the previous and current series of patches by adjusting the
 	creation/deletion cost fudge factor. See linkgit:git-range-diff[1])
 	for details.
 
---notes[=<ref>]::
---no-notes::
+`--notes[=<ref>]`::
+`--no-notes`::
 	Append the notes (see linkgit:git-notes[1]) for the commit
 	after the three-dash line.
 +
@@ -339,13 +339,13 @@ configuration options in linkgit:git-notes[1] to use this workflow).
 The default is `--no-notes`, unless the `format.notes` configuration is
 set.
 
---[no-]signature=<signature>::
+`--[no-]signature=<signature>`::
 	Add a signature to each message produced. Per RFC 3676 the signature
 	is separated from the body by a line with '-- ' on it. If the
 	signature option is omitted the signature defaults to the Git version
 	number.
 
---signature-file=<file>::
+`--signature-file=<file>`::
 	Works just like `--signature` except the signature is read from a file.
 
 --suffix=.<sfx>::
@@ -357,35 +357,35 @@ set.
 Note that the leading character does not have to be a dot; for example,
 you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Do not print the names of the generated files to standard output.
 
---no-binary::
+`--no-binary`::
 	Do not output contents of changes in binary files, instead
 	display a notice that those files changed.  Patches generated
 	using this option cannot be applied properly, but they are
 	still useful for code review.
 
---zero-commit::
+`--zero-commit`::
   Output an all-zero hash in each patch's From header instead
   of the hash of the commit.
 
---[no-]base[=<commit>]::
+`--[no-]base[=<commit>]`::
 	Record the base tree information to identify the state the
 	patch series applies to.  See the BASE TREE INFORMATION section
 	below for details. If <commit> is "auto", a base commit is
 	automatically chosen. The `--no-base` option overrides a
 	`format.useAutoBase` configuration.
 
---root::
+`--root`::
 	Treat the revision argument as a <revision range>, even if it
 	is just a single commit (that would normally be treated as a
 	<since>).  Note that root commits included in the specified
 	range are always formatted as creation patches, independently
 	of this flag.
 
---progress::
+`--progress`::
 	Show progress reports on stderr as patches are generated.
 
 CONFIGURATION
diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt
index 2d90384355..f942c5a7a6 100644
--- a/Documentation/git-fsck.txt
+++ b/Documentation/git-fsck.txt
@@ -20,38 +20,38 @@ Verifies the connectivity and validity of the objects in the database.
 
 OPTIONS
 -------
-<object>::
+`<object>`::
 	An object to treat as the head of an unreachability trace.
 +
 If no objects are given, `git fsck` defaults to using the
 index file, all SHA-1 references in `refs` namespace, and all reflogs
 (unless `--no-reflogs` is given) as heads.
 
---unreachable::
+`--unreachable`::
 	Print out objects that exist but that aren't reachable from any
 	of the reference nodes.
 
---[no-]dangling::
+`--[no-]dangling`::
 	Print objects that exist but that are never 'directly' used (default).
 	`--no-dangling` can be used to omit this information from the output.
 
---root::
+`--root`::
 	Report root nodes.
 
---tags::
+`--tags`::
 	Report tags.
 
---cache::
+`--cache`::
 	Consider any object recorded in the index also as a head node for
 	an unreachability trace.
 
---no-reflogs::
+`--no-reflogs`::
 	Do not consider commits that are referenced only by an
 	entry in a reflog to be reachable.  This option is meant
 	only to search for commits that used to be in a ref, but
 	now aren't, but are still in that corresponding reflog.
 
---full::
+`--full`::
 	Check not just objects in GIT_OBJECT_DIRECTORY
 	(`$GIT_DIR/objects`), but also the ones found in alternate
 	object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES
@@ -61,7 +61,7 @@ index file, all SHA-1 references in `refs` namespace, and all reflogs
 	object pools.  This is now default; you can turn it off
 	with `--no-full`.
 
---connectivity-only::
+`--connectivity-only`::
 	Check only the connectivity of reachable objects, making sure
 	that any objects referenced by a reachable tag, commit, or tree
 	is present. This speeds up the operation by avoiding reading
@@ -74,7 +74,7 @@ Unreachable tags, commits, and trees will also be accessed to find the
 tips of dangling segments of history. Use `--no-dangling` if you don't
 care about this output and want to speed it up further.
 
---strict::
+`--strict`::
 	Enable more strict checking, namely to catch a file mode
 	recorded with g+w bit set, which was created by older
 	versions of Git.  Existing repositories, including the
@@ -82,22 +82,22 @@ care about this output and want to speed it up further.
 	objects that triggers this check, but it is recommended
 	to check new projects with this flag.
 
---verbose::
+`--verbose`::
 	Be chatty.
 
---lost-found::
+`--lost-found`::
 	Write dangling objects into `.git/lost-found/commit/` or
 	`.git/lost-found/other/`, depending on type.  If the object is
 	a blob, the contents are written into the file, rather than
 	its object name.
 
---name-objects::
+`--name-objects`::
 	When displaying names of reachable objects, in addition to the
 	SHA-1 also display a name that describes *how* they are reachable,
 	compatible with linkgit:git-rev-parse[1], e.g.
 	`HEAD@{1234567890}~25^2:src/`.
 
---[no-]progress::
+`--[no-]progress`::
 	Progress status is reported on the standard error stream by
 	default when it is attached to a terminal, unless
 	`--no-progress` or `--verbose` is specified. `--progress` forces
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index c5c71febf5..831dbe74e0 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -34,14 +34,14 @@ linkgit:git-fast-import[1] for more details on the import case.
 OPTIONS
 -------
 
---aggressive::
+`--aggressive`::
 	Usually `git gc` runs very quickly while providing good disk
 	space utilization and performance.  This option will cause
 	`git gc` to more aggressively optimize the repository at the expense
 	of taking much more time.  The effects of this optimization are
 	mostly persistent. See the "AGGRESSIVE" section below for details.
 
---auto::
+`--auto`::
 	With this option, `git gc` checks whether any housekeeping is
 	required; if not, it exits without performing any work.
 +
@@ -54,7 +54,7 @@ other housekeeping tasks (e.g. rerere, working trees, reflog...) will
 be performed as well.
 
 
---prune=<date>::
+`--prune=<date>`::
 	Prune loose objects older than date (default is 2 weeks ago,
 	overridable by the config variable `gc.pruneExpire`).
 	`--prune=now` prunes loose objects regardless of their age and
@@ -62,17 +62,17 @@ be performed as well.
 	the repository concurrently; see "NOTES" below. `--prune` is on by
 	default.
 
---no-prune::
+`--no-prune`::
 	Do not prune any loose objects.
 
---quiet::
+`--quiet`::
 	Suppress all progress reports.
 
---force::
+`--force`::
 	Force `git gc` to run even if there may be another `git gc`
 	instance running on this repository.
 
---keep-largest-pack::
+`--keep-largest-pack`::
 	All packs except the largest pack and those marked with a
 	`.keep` files are consolidated into a single pack. When this
 	option is used, `gc.bigPackThreshold` is ignored.
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index b10a3f6bb4..478abece38 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -72,50 +72,50 @@ grep.fallbackToNoIndex::
 
 OPTIONS
 -------
---cached::
+`--cached`::
 	Instead of searching tracked files in the working tree, search
 	blobs registered in the index file.
 
---no-index::
+`--no-index`::
 	Search files in the current directory that is not managed by Git.
 
---untracked::
+`--untracked`::
 	In addition to searching in the tracked files in the working
 	tree, search also in untracked files.
 
---no-exclude-standard::
+`--no-exclude-standard`::
 	Also search in ignored files by not honoring the `.gitignore`
 	mechanism. Only useful with `--untracked`.
 
---exclude-standard::
+`--exclude-standard`::
 	Do not pay attention to ignored files specified via the `.gitignore`
 	mechanism.  Only useful when searching files in the current directory
 	with `--no-index`.
 
---recurse-submodules::
+`--recurse-submodules`::
 	Recursively search in each submodule that is active and
 	checked out in the repository.  When used in combination with the
 	<tree> option the prefix of all submodule output will be the name of
 	the parent project's <tree> object. This option has no effect
 	if `--no-index` is given.
 
--a::
---text::
+`-a`::
+`--text`::
 	Process binary files as if they were text.
 
---textconv::
+`--textconv`::
 	Honor textconv filter settings.
 
---no-textconv::
+`--no-textconv`::
 	Do not honor textconv filter settings.
 	This is the default.
 
--i::
---ignore-case::
+`-i`::
+`--ignore-case`::
 	Ignore case differences between the patterns and the
 	files.
 
--I::
+`-I`::
 	Don't match the pattern in binary files.
 
 --max-depth <depth>::
@@ -125,77 +125,77 @@ OPTIONS
 	In other words if "a*" matches a directory named "a*",
 	"*" is matched literally so `--max-depth` is still effective.
 
--r::
---recursive::
+`-r`::
+`--recursive`::
 	Same as `--max-depth=-1`; this is the default.
 
---no-recursive::
+`--no-recursive`::
 	Same as `--max-depth=0`.
 
--w::
---word-regexp::
+`-w`::
+`--word-regexp`::
 	Match the pattern only at word boundary (either begin at the
 	beginning of a line, or preceded by a non-word character; end at
 	the end of a line or followed by a non-word character).
 
--v::
---invert-match::
+`-v`::
+`--invert-match`::
 	Select non-matching lines.
 
--h::
--H::
+`-h`::
+`-H`::
 	By default, the command shows the filename for each
 	match.  `-h` option is used to suppress this output.
 	`-H` is there for completeness and does not do anything
 	except it overrides `-h` given earlier on the command
 	line.
 
---full-name::
+`--full-name`::
 	When run from a subdirectory, the command usually
 	outputs paths relative to the current directory.  This
 	option forces paths to be output relative to the project
 	top directory.
 
--E::
---extended-regexp::
--G::
---basic-regexp::
+`-E`::
+`--extended-regexp`::
+`-G`::
+`--basic-regexp`::
 	Use POSIX extended/basic regexp for patterns.  Default
 	is to use basic regexp.
 
--P::
---perl-regexp::
+`-P`::
+`--perl-regexp`::
 	Use Perl-compatible regular expressions for patterns.
 +
 Support for these types of regular expressions is an optional
 compile-time dependency. If Git wasn't compiled with support for them
 providing this option will cause it to die.
 
--F::
---fixed-strings::
+`-F`::
+`--fixed-strings`::
 	Use fixed strings for patterns (don't interpret pattern
 	as a regex).
 
--n::
---line-number::
+`-n`::
+`--line-number`::
 	Prefix the line number to matching lines.
 
---column::
+`--column`::
 	Prefix the 1-indexed byte-offset of the first match from the start of the
 	matching line.
 
--l::
---files-with-matches::
---name-only::
--L::
---files-without-match::
+`-l`::
+`--files-with-matches`::
+`--name-only`::
+`-L`::
+`--files-without-match`::
 	Instead of showing every matched line, show only the
 	names of files that contain (or do not contain) matches.
 	For better compatibility with `git diff`, `--name-only` is a
 	synonym for `--files-with-matches`.
 
--O[<pager>]::
---open-files-in-pager[=<pager>]::
+`-O[<pager>]`::
+`--open-files-in-pager[=<pager>]`::
 	Open the matching files in the pager (not the output of 'grep').
 	If the pager happens to be `less` or `vi`, and the user
 	specified only one pattern, the first file is positioned at
@@ -204,48 +204,48 @@ providing this option will cause it to die.
 	without a space. If `pager` is unspecified, the default pager
 	will be used (see `core.pager` in linkgit:git-config[1]).
 
--z::
---null::
+`-z`::
+`--null`::
 	Use \0 as the delimiter for pathnames in the output, and print
 	them verbatim. Without this option, pathnames with "unusual"
 	characters are quoted as explained for the configuration
 	variable `core.quotePath` (see linkgit:git-config[1]).
 
--o::
---only-matching::
+`-o`::
+`--only-matching`::
 	Print only the matched (non-empty) parts of a matching line, with each such
 	part on a separate output line.
 
--c::
---count::
+`-c`::
+`--count`::
 	Instead of showing every matched line, show the number of
 	lines that match.
 
---color[=<when>]::
+`--color[=<when>]`::
 	Show colored matches.
 	The value must be always (the default), never, or auto.
 
---no-color::
+`--no-color`::
 	Turn off match highlighting, even when the configuration file
 	gives the default to color output.
 	Same as `--color=never`.
 
---break::
+`--break`::
 	Print an empty line between matches from different files.
 
---heading::
+`--heading`::
 	Show the filename above the matches in that file instead of
 	at the start of each shown line.
 
--p::
---show-function::
+`-p`::
+`--show-function`::
 	Show the preceding line that contains the function name of
 	the match, unless the matching line is a function name itself.
 	The name is determined in the same way as `git diff` works out
 	patch hunk headers (see 'Defining a custom hunk-header' in
 	linkgit:gitattributes[5]).
 
--<num>::
+`-<num>`::
 -C <num>::
 --context <num>::
 	Show <num> leading and trailing lines, and place a line
@@ -261,8 +261,8 @@ providing this option will cause it to die.
 	Show <num> leading lines, and place a line containing
 	`--` between contiguous groups of matches.
 
--W::
---function-context::
+`-W`::
+`--function-context`::
 	Show the surrounding text from the previous line containing a
 	function name up to the one before the next function name,
 	effectively showing the whole function in which the match was
@@ -294,28 +294,28 @@ In future versions we may learn to support patterns containing \0 for
 more search backends, until then we'll die when the pattern type in
 question doesn't support them.
 
--e::
+`-e`::
 	The next parameter is the pattern. This option has to be
 	used for patterns starting with `-` and should be used in
 	scripts passing user input to grep.  Multiple patterns are
 	combined by 'or'.
 
---and::
---or::
---not::
+`--and`::
+`--or`::
+`--not`::
 ( ... )::
 	Specify how multiple patterns are combined using Boolean
 	expressions.  `--or` is the default operator.  `--and` has
 	higher precedence than `--or`.  `-e` has to be used for all
 	patterns.
 
---all-match::
+`--all-match`::
 	When giving multiple pattern expressions combined with `--or`,
 	this flag is specified to limit the match to files that
 	have lines to match all of them.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Do not output matched lines; instead, exit with status 0 when
 	there is a match and with non-zero status when there isn't.
 
diff --git a/Documentation/git-gui.txt b/Documentation/git-gui.txt
index ff66c5b1d0..ed6fe4871e 100644
--- a/Documentation/git-gui.txt
+++ b/Documentation/git-gui.txt
@@ -29,22 +29,22 @@ a fairly native interface for users.
 
 COMMANDS
 --------
-blame::
+`blame`::
 	Start a blame viewer on the specified file on the given
 	version (or working directory if not specified).
 
-browser::
+`browser`::
 	Start a tree browser showing all files in the specified
 	commit.  Files selected through the
 	browser are opened in the blame viewer.
 
-citool::
+`citool`::
 	Start `git gui` and arrange to make exactly one commit before
 	exiting and returning to the shell.  The interface is limited
 	to only commit actions, slightly reducing the application's
 	startup time and simplifying the menubar.
 
-version::
+`version`::
 	Display the currently running version of `git gui`.
 
 
diff --git a/Documentation/git-hash-object.txt b/Documentation/git-hash-object.txt
index 15c2945345..40f5574afe 100644
--- a/Documentation/git-hash-object.txt
+++ b/Documentation/git-hash-object.txt
@@ -26,17 +26,17 @@ OPTIONS
 -t <type>::
 	Specify the type (default: "blob").
 
--w::
+`-w`::
 	Actually write the object into the object database.
 
---stdin::
+`--stdin`::
 	Read the object from standard input instead of from a file.
 
---stdin-paths::
+`--stdin-paths`::
 	Read file names from the standard input, one per line, instead
 	of from the command-line.
 
---path::
+`--path`::
 	Hash object as it were located at the given path. The location of
 	file does not directly influence on the hash value, but path is
 	used to determine what Git filters should be applied to the object
@@ -46,13 +46,13 @@ OPTIONS
 	temporary files located outside of the working directory or files
 	read from stdin.
 
---no-filters::
+`--no-filters`::
 	Hash the contents as is, ignoring any input filter that would
 	have been chosen by the attributes mechanism, including the end-of-line
 	conversion. If the file is read from standard input then this
 	is always implied, unless the `--path` option is given.
 
---literally::
+`--literally`::
 	Allow `--stdin` to hash any garbage into a loose object which might not
 	otherwise pass standard object parsing or `git-fsck` checks. Useful for
 	stress-testing Git itself or reproducing characteristics of corrupt or
diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt
index 2d5660f47a..070ef46a8d 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.txt
@@ -42,32 +42,32 @@ This page can be displayed with `git help help` or `git help --help`
 
 OPTIONS
 -------
--a::
---all::
+`-a`::
+`--all`::
 	Prints all the available commands on the standard output. This
 	option overrides any given command or guide name.
 
---verbose::
+`--verbose`::
 	When used with `--all` print description for all recognized
 	commands. This is the default.
 
--c::
---config::
+`-c`::
+`--config`::
 	List all available configuration variables. This is a short
 	summary of the list in linkgit:git-config[1].
 
--g::
---guides::
+`-g`::
+`--guides`::
 	Prints a list of the Git concept guides on the standard output. This
 	option overrides any given command or guide name.
 
--i::
---info::
+`-i`::
+`--info`::
 	Display manual page for the command in the 'info' format. The
 	'info' program will be used for that purpose.
 
--m::
---man::
+`-m`::
+`--man`::
 	Display manual page for the command in the 'man' format. This
 	option may be used to override a value set in the
 	`help.format` configuration variable.
@@ -76,8 +76,8 @@ By default the 'man' program will be used to display the manual page,
 but the `man.viewer` configuration variable may be used to choose
 other display programs (see below).
 
--w::
---web::
+`-w`::
+`--web`::
 	Display manual page for the command in the 'web' (HTML)
 	format. A web browser will be used for that purpose.
 +
diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.txt
index 4bbf4811c0..d512add556 100644
--- a/Documentation/git-http-backend.txt
+++ b/Documentation/git-http-backend.txt
@@ -190,7 +190,7 @@ ScriptAliasMatch \
 ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
 ----------------------------------------------------------------
 
-Lighttpd::
+`Lighttpd`::
 	Ensure that `mod_cgi`, `mod_alias`, `mod_auth`, `mod_setenv` are
 	loaded, then set `GIT_PROJECT_ROOT` appropriately and redirect
 	all requests to the CGI:
diff --git a/Documentation/git-http-fetch.txt b/Documentation/git-http-fetch.txt
index 58e92f22c6..63e447642e 100644
--- a/Documentation/git-http-fetch.txt
+++ b/Documentation/git-http-fetch.txt
@@ -21,26 +21,26 @@ silently ignored.
 
 OPTIONS
 -------
-commit-id::
+`commit-id`::
         Either the hash or the filename under [URL]/refs/ to
         pull.
 
 -a, -c, -t::
 	These options are ignored for historical reasons.
--v::
+`-v`::
 	Report what is downloaded.
 
 -w <filename>::
         Writes the commit-id into the filename under `$GIT_DIR/refs/<filename>` on
         the local end after the transfer is complete.
 
---stdin::
+`--stdin`::
 	Instead of a commit id on the command line (which is not expected in this
 	case), `git http-fetch` expects lines on stdin in the format
 
 		<commit-id>['\t'<filename-as-in--w>]
 
---packfile=<hash>::
+`--packfile=<hash>`::
 	For internal use only. Instead of a commit id on the command
 	line (which is not expected in
 	this case), `git http-fetch` fetches the packfile directly at the given
@@ -49,11 +49,11 @@ commit-id::
 	arbitrary. The output of index-pack is printed to stdout. Requires
 	`--index-pack-args`.
 
---index-pack-args=<args>::
+`--index-pack-args=<args>`::
 	For internal use only. The command to run on the contents of the
 	downloaded pack. Arguments are URL-encoded separated by spaces.
 
---recover::
+`--recover`::
 	Verify that everything reachable from target is fetched.  Used after
 	an earlier fetch is interrupted.
 
diff --git a/Documentation/git-http-push.txt b/Documentation/git-http-push.txt
index a2932ba27f..d43f84dccd 100644
--- a/Documentation/git-http-push.txt
+++ b/Documentation/git-http-push.txt
@@ -22,27 +22,27 @@ not to work and sometimes corrupts repository.
 
 OPTIONS
 -------
---all::
+`--all`::
 	Do not assume that the remote repository is complete in its
 	current state, and verify all objects in the entire local
 	ref's history exist in the remote repository.
 
---force::
+`--force`::
 	Usually, the command refuses to update a remote ref that
 	is not an ancestor of the local ref used to overwrite it.
 	This flag disables the check.  What this means is that
 	the remote repository can lose commits; use it with
 	care.
 
---dry-run::
+`--dry-run`::
 	Do everything except actually send the updates.
 
---verbose::
+`--verbose`::
 	Report the list of objects being walked locally and the
 	list of objects successfully sent to the remote repository.
 
--d::
--D::
+`-d`::
+`-D`::
 	Remove <ref> from remote repository.  The specified branch
 	cannot be the remote `HEAD`.  If `-d` is specified the following
 	other conditions must also be met:
diff --git a/Documentation/git-imap-send.txt b/Documentation/git-imap-send.txt
index 68b1fb19e2..644fa7e847 100644
--- a/Documentation/git-imap-send.txt
+++ b/Documentation/git-imap-send.txt
@@ -29,20 +29,20 @@ git format-patch --signoff --stdout --attach origin | git imap-send
 OPTIONS
 -------
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Be verbose.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Be quiet.
 
---curl::
+`--curl`::
 	Use libcurl to communicate with the IMAP server, unless tunneling
 	into it.  Ignored if Git was built without the USE_CURL_FOR_IMAP_SEND
 	option set.
 
---no-curl::
+`--no-curl`::
 	Talk to the IMAP server using git's own IMAP routines instead of
 	using libcurl.  Ignored if Git was built with the NO_OPENSSL option
 	set.
diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.txt
index fa859f759d..b42e095f3e 100644
--- a/Documentation/git-index-pack.txt
+++ b/Documentation/git-index-pack.txt
@@ -25,7 +25,7 @@ the objects/pack/ directory of a Git repository.
 
 OPTIONS
 -------
--v::
+`-v`::
 	Be verbose about what is going on, including progress status.
 
 -o <index-file>::
@@ -36,14 +36,14 @@ OPTIONS
 	fails if the name of packed archive does not end
 	with .pack).
 
---[no-]rev-index::
+`--[no-]rev-index`::
 	When this flag is provided, generate a reverse index
 	(a `.rev` file) corresponding to the given pack. If
 	`--verify` is given, ensure that the existing
 	reverse index is correct. Takes precedence over
 	`pack.writeReverseIndex`.
 
---stdin::
+`--stdin`::
 	When this flag is provided, the pack is read from stdin
 	instead and a copy is then written to <pack-file>. If
 	<pack-file> is not specified, the pack is written to
@@ -53,13 +53,13 @@ OPTIONS
 	prevent a race condition between this process and
 	`git repack`.
 
---fix-thin::
+`--fix-thin`::
 	Fix a "thin" pack produced by `git pack-objects --thin` (see
 	linkgit:git-pack-objects[1] for details) by adding the
 	excluded objects the deltified objects are based on to the
 	pack. This option only makes sense in conjunction with `--stdin`.
 
---keep::
+`--keep`::
 	Before moving the index into its final destination
 	create an empty .keep file for the associated pack file.
 	This option is usually necessary with `--stdin` to prevent a
@@ -67,7 +67,7 @@ OPTIONS
 	the newly constructed pack and index before refs can be
 	updated to use objects contained in the pack.
 
---keep=<msg>::
+`--keep=<msg>`::
 	Like `--keep` create a .keep file before moving the index into
 	its final destination, but rather than creating an empty file
 	place '<msg>' followed by an LF into the .keep file.  The '<msg>'
@@ -79,13 +79,13 @@ OPTIONS
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---strict::
+`--strict`::
 	Die, if the pack contains broken objects or links.
 
---check-self-contained-and-connected::
+`--check-self-contained-and-connected`::
 	Die if the pack contains broken links. For internal use only.
 
---fsck-objects::
+`--fsck-objects`::
 	For internal use only.
 +
 Die if the pack contains broken objects. If the pack contains a tree
@@ -93,7 +93,7 @@ pointing to a .gitmodules blob that does not exist, prints the hash of
 that blob (for the caller to check) after the hash that goes into the
 name of the pack/idx file (see "Notes").
 
---threads=<n>::
+`--threads=<n>`::
 	Specifies the number of threads to spawn when resolving
 	deltas. This requires that index-pack be compiled with
 	pthreads otherwise this option is ignored with a warning.
@@ -103,10 +103,10 @@ name of the pack/idx file (see "Notes").
 	Specifying 0 will cause Git to auto-detect the number of CPU's
 	and use maximum 3 threads.
 
---max-input-size=<size>::
+`--max-input-size=<size>`::
 	Die, if the pack is larger than <size>.
 
---object-format=<hash-algorithm>::
+`--object-format=<hash-algorithm>`::
 	Specify the given object format (hash algorithm) for the pack.  The valid
 	values are 'sha1' and (if enabled) 'sha256'.  The default is the algorithm for
 	the current repository (set by `extensions.objectFormat`), or 'sha1' if no
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index 2ee178a81c..cfa190859e 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -40,17 +40,17 @@ the repository to another place if `--separate-git-dir` is given).
 OPTIONS
 -------
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 
 Only print error and warning messages; all other output will be suppressed.
 
---bare::
+`--bare`::
 
 Create a bare repository. If `GIT_DIR` environment is not set, it is set to the
 current working directory.
 
---object-format=<format>::
+`--object-format=<format>`::
 
 Specify the given object format (hash algorithm) for the repository.  The valid
 values are 'sha1' and (if enabled) 'sha256'.  'sha1' is the default.
@@ -72,7 +72,7 @@ repository.
 If this is reinitialization, the repository will be moved to the specified path.
 
 -b <branch-name>::
---initial-branch=<branch-name>::
+`--initial-branch=<branch-name>`::
 
 Use the specified name for the initial branch in the newly created
 repository.  If not specified, fall back to the default name (currently
diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt
index a8876b74ca..f23cebccd9 100644
--- a/Documentation/git-instaweb.txt
+++ b/Documentation/git-instaweb.txt
@@ -20,12 +20,12 @@ repository.
 OPTIONS
 -------
 
--l::
---local::
+`-l`::
+`--local`::
 	Only bind the web server to the local IP (127.0.0.1).
 
--d::
---httpd::
+`-d`::
+`--httpd`::
 	The HTTP daemon command-line that will be executed.
 	Command-line options may be specified here, and the
 	configuration file will be added at the end of the command-line.
@@ -33,36 +33,36 @@ OPTIONS
 	webrick are supported.
 	(Default: lighttpd)
 
--m::
---module-path::
+`-m`::
+`--module-path`::
 	The module path (only needed if httpd is Apache).
 	(Default: /usr/lib/apache2/modules)
 
--p::
---port::
+`-p`::
+`--port`::
 	The port number to bind the httpd to.  (Default: 1234)
 
--b::
---browser::
+`-b`::
+`--browser`::
 	The web browser that should be used to view the `gitweb`
 	page. This will be passed to the `git web--browse` helper
 	script along with the URL of the `gitweb` instance. See
 	linkgit:git-web{litdd}browse[1] for more information about this. If
 	the script fails, the URL will be printed to stdout.
 
-start::
---start::
+`start`::
+`--start`::
 	Start the httpd instance and exit.  Regenerate configuration files
 	as necessary for spawning a new instance.
 
-stop::
---stop::
+`stop`::
+`--stop`::
 	Stop the httpd instance and exit.  This does not generate
 	any of the configuration files for spawning a new instance,
 	nor does it close the browser.
 
-restart::
---restart::
+`restart`::
+`--restart`::
 	Restart the httpd instance and exit.  Regenerate configuration files
 	as necessary for spawning a new instance.
 
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt
index b687701104..dc2974c611 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/Documentation/git-interpret-trailers.txt
@@ -71,10 +71,10 @@ the encoding rules and probably many other rules.
 
 OPTIONS
 -------
---in-place::
+`--in-place`::
 	Edit the files in place.
 
---trim-empty::
+`--trim-empty`::
 	If the <value> part of any trailer contains only whitespace,
 	the whole trailer will be removed from the resulting message.
 	This applies to existing trailers as well as new trailers.
@@ -85,7 +85,7 @@ OPTIONS
 	command.
 
 --where <placement>::
---no-where::
+`--no-where`::
 	Specify where all new trailers will be added.  A setting
 	provided with `--where` overrides all configuration variables
 	and applies to all `--trailer` options until the next occurrence of
@@ -93,7 +93,7 @@ OPTIONS
 	`end` or `start`.
 
 --if-exists <action>::
---no-if-exists::
+`--no-if-exists`::
 	Specify what action will be performed when there is already at
 	least one trailer with the same <token> in the message.  A setting
 	provided with `--if-exists` overrides all configuration variables
@@ -102,7 +102,7 @@ OPTIONS
 	`addIfDifferentNeighbor`, `add`, `replace` and `doNothing`.
 
 --if-missing <action>::
---no-if-missing::
+`--no-if-missing`::
 	Specify what action will be performed when there is no other
 	trailer with the same <token> in the message.  A setting
 	provided with `--if-missing` overrides all configuration variables
@@ -110,23 +110,23 @@ OPTIONS
 	`--if-missing` or `--no-if-missing`. Possible actions are `doNothing`
 	or `add`.
 
---only-trailers::
+`--only-trailers`::
 	Output only the trailers, not any other parts of the input.
 
---only-input::
+`--only-input`::
 	Output only trailers that exist in the input; do not add any
 	from the command-line or by following configured `trailer.*`
 	rules.
 
---unfold::
+`--unfold`::
 	Remove any whitespace-continuation in trailers, so that each
 	trailer appears on a line by itself with its full content.
 
---parse::
+`--parse`::
 	A convenience alias for `--only-trailers --only-input
 	--unfold`.
 
---no-divider::
+`--no-divider`::
 	Do not treat `---` as the end of the commit message. Use this
 	when you know your input contains just the commit message itself
 	(and not an email or the output of `git format-patch`).
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index 43f9a5c69e..21f9328681 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -27,11 +27,11 @@ each commit introduces are shown.
 OPTIONS
 -------
 
---follow::
+`--follow`::
 	Continue listing the history of a file beyond renames
 	(works only for a single file).
 
---no-decorate::
+`--no-decorate`::
 --decorate[=short|full|auto|no]::
 	Print out the ref names of any commits that are shown. If 'short' is
 	specified, the ref name prefixes `refs/heads/`, `refs/tags/` and
@@ -41,8 +41,8 @@ OPTIONS
 	are shown as if 'short' were given, otherwise no ref names are
 	shown. The default option is 'short'.
 
---decorate-refs=<pattern>::
---decorate-refs-exclude=<pattern>::
+`--decorate-refs=<pattern>`::
+`--decorate-refs-exclude=<pattern>`::
 	If no `--decorate-refs` is given, pretend as if all refs were
 	included.  For each candidate, do not use it for decoration if it
 	matches any patterns given to `--decorate-refs-exclude` or if it
@@ -51,17 +51,17 @@ OPTIONS
 	the decorations, but an explicit `--decorate-refs` pattern will
 	override a match in `log.excludeDecoration`.
 
---source::
+`--source`::
 	Print out the ref name given on the command line by which each
 	commit was reached.
 
---[no-]mailmap::
---[no-]use-mailmap::
+`--[no-]mailmap`::
+`--[no-]use-mailmap`::
 	Use mailmap file to map author and committer names and email
 	addresses to canonical real names and email addresses. See
 	linkgit:git-shortlog[1].
 
---full-diff::
+`--full-diff`::
 	Without this flag, `git log -p <path>...` shows commits that
 	touch the specified paths, and diffs about the same specified
 	paths.  With this, the full diff is shown for commits that touch
@@ -71,7 +71,7 @@ OPTIONS
 Note that this affects all diff-based output types, e.g. those
 produced by `--stat`, etc.
 
---log-size::
+`--log-size`::
 	Include a line ``log size <number>'' in the output for each commit,
 	where <number> is the length of that commit's message in bytes.
 	Intended to speed up tools that read log messages from `git log`
diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
index 3557823de9..0e26aafc63 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.txt
@@ -32,56 +32,56 @@ shown:
 
 OPTIONS
 -------
--c::
---cached::
+`-c`::
+`--cached`::
 	Show cached files in the output (default)
 
--d::
---deleted::
+`-d`::
+`--deleted`::
 	Show deleted files in the output
 
--m::
---modified::
+`-m`::
+`--modified`::
 	Show modified files in the output
 
--o::
---others::
+`-o`::
+`--others`::
 	Show other (i.e. untracked) files in the output
 
--i::
---ignored::
+`-i`::
+`--ignored`::
 	Show only ignored files in the output. When showing files in the
 	index, print only those matched by an exclude pattern. When
 	showing "other" files, show only those matched by an exclude
 	pattern. Standard ignore rules are not automatically activated,
 	therefore at least one of the `--exclude*` options is required.
 
--s::
---stage::
+`-s`::
+`--stage`::
 	Show staged contents' mode bits, object name and stage number in the output.
 
---directory::
+`--directory`::
 	If a whole directory is classified as "other", show just its
 	name (with a trailing slash) and not its whole contents.
 
---no-empty-directory::
+`--no-empty-directory`::
 	Do not list empty directories. Has no effect without `--directory`.
 
--u::
---unmerged::
+`-u`::
+`--unmerged`::
 	Show unmerged files in the output (forces `--stage`)
 
--k::
---killed::
+`-k`::
+`--killed`::
 	Show files on the filesystem that need to be removed due
 	to file/directory conflicts for checkout-index to
 	succeed.
 
--z::
+`-z`::
 	\0 line termination on output and do not quote filenames.
 	See OUTPUT below for more information.
 
---deduplicate::
+`--deduplicate`::
 	When only filenames are shown, suppress duplicates that may
 	come from having multiple stages during a merge, or giving
 	`--deleted` and `--modified` option at the same time.
@@ -89,35 +89,35 @@ OPTIONS
 	in use, this option has no effect.
 
 -x <pattern>::
---exclude=<pattern>::
+`--exclude=<pattern>`::
 	Skip untracked files matching pattern.
 	Note that pattern is a shell wildcard pattern. See EXCLUDE PATTERNS
 	below for more information.
 
 -X <file>::
---exclude-from=<file>::
+`--exclude-from=<file>`::
 	Read exclude patterns from <file>; 1 per line.
 
---exclude-per-directory=<file>::
+`--exclude-per-directory=<file>`::
 	Read additional exclude patterns that apply only to the
 	directory and its subdirectories in <file>.
 
---exclude-standard::
+`--exclude-standard`::
 	Add the standard Git exclusions: `.git/info/exclude`, `.gitignore`
 	in each directory, and the user's global exclusion file.
 
---error-unmatch::
+`--error-unmatch`::
 	If any <file> does not appear in the index, treat this as an
 	error (return 1).
 
---with-tree=<tree-ish>::
+`--with-tree=<tree-ish>`::
 	When using `--error-unmatch` to expand the user supplied
 	<file> (i.e. path pattern) arguments to paths, pretend
 	that paths which were removed in the index since the
 	named <tree-ish> are still present.  Using this option
 	with `-s` or `-u` options does not make any sense.
 
--t::
+`-t`::
 	This feature is semi-deprecated. For scripting purpose,
 	linkgit:git-status[1] `--porcelain` and
 	linkgit:git-diff-files[1] `--name-status` are almost always
@@ -129,48 +129,48 @@ OPTIONS
 This option identifies the file status with the following tags (followed by
 a space) at the start of each line:
 
-	H::	cached
-	S::	skip-worktree
-	M::	unmerged
-	R::	removed/deleted
-	C::	modified/changed
-	K::	to be killed
+	`H`::	cached
+	`S`::	skip-worktree
+	`M`::	unmerged
+	`R`::	removed/deleted
+	`C`::	modified/changed
+	`K`::	to be killed
 	?::	other
 --
 
--v::
+`-v`::
 	Similar to `-t`, but use lowercase letters for files
 	that are marked as 'assume unchanged' (see
 	linkgit:git-update-index[1]).
 
--f::
+`-f`::
 	Similar to `-t`, but use lowercase letters for files
 	that are marked as 'fsmonitor valid' (see
 	linkgit:git-update-index[1]).
 
---full-name::
+`--full-name`::
 	When run from a subdirectory, the command usually
 	outputs paths relative to the current directory.  This
 	option forces paths to be output relative to the project
 	top directory.
 
---recurse-submodules::
+`--recurse-submodules`::
 	Recursively calls ls-files on each active submodule in the repository.
 	Currently there is only support for the `--cached` mode.
 
---abbrev[=<n>]::
+`--abbrev[=<n>]`::
 	Instead of showing the full 40-byte hexadecimal object
 	lines, show the shortest prefix that is at least '<n>'
 	hexdigits long that uniquely refers the object.
 	Non default number of digits can be specified with `--abbrev=<n>`.
 
---debug::
+`--debug`::
 	After each line that describes a file, add more data about its
 	cache entry.  This is intended to show as much information as
 	possible for manual inspection; the exact format may change at
 	any time.
 
---eol::
+`--eol`::
 	Show <eolinfo> and <eolattr> of files.
 	<eolinfo> is the file content identification used by Git when
 	the "text" attribute is "auto" (or not set and `core.autocrlf` is not false).
@@ -190,7 +190,7 @@ followed by the  ("attr/<eolattr>").
 \--::
 	Do not interpret any more arguments as options.
 
-<file>::
+`<file>`::
 	Files to show. If no files are given all files which match the other
 	specified criteria are shown.
 
diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt
index cc1525f487..6dc89de377 100644
--- a/Documentation/git-ls-remote.txt
+++ b/Documentation/git-ls-remote.txt
@@ -21,10 +21,10 @@ commit IDs.
 
 OPTIONS
 -------
--h::
---heads::
--t::
---tags::
+`-h`::
+`--heads`::
+`-t`::
+`--tags`::
 	Limit to only refs/heads and refs/tags, respectively.
 	These options are _not_ mutually exclusive; when given
 	both, references stored in refs/heads and refs/tags are
@@ -32,37 +32,37 @@ OPTIONS
 	anything else on the command line gives help, consistent
 	with other `git` subcommands.
 
---refs::
+`--refs`::
 	Do not show peeled tags or pseudorefs like `HEAD` in the output.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Do not print remote URL to stderr.
 
---upload-pack=<exec>::
+`--upload-pack=<exec>`::
 	Specify the full path of `git-upload-pack` on the remote
 	host. This allows listing references from repositories accessed via
 	SSH and where the SSH daemon does not use the PATH configured by the
 	user.
 
---exit-code::
+`--exit-code`::
 	Exit with status "2" when no matching refs are found in the remote
 	repository. Usually the command exits with status "0" to indicate
 	it successfully talked with the remote repository, whether it
 	found any matching refs.
 
---get-url::
+`--get-url`::
 	Expand the URL of the given remote repository taking into account any
 	`url.<base>.insteadOf` config setting (See linkgit:git-config[1]) and
 	exit without talking to the remote.
 
---symref::
+`--symref`::
 	In addition to the object pointed by it, show the underlying
 	ref pointed by it when showing a symbolic ref.  Currently,
 	upload-pack only shows the symref `HEAD`, so it will be the only
 	one shown by ls-remote.
 
---sort=<key>::
+`--sort=<key>`::
 	Sort based on the key given. Prefix `-` to sort in descending order
 	of the value. Supports "version:refname" or "v:refname" (tag names
 	are treated as versions). The "version:refname" sort order can also
@@ -73,14 +73,14 @@ OPTIONS
 	fetched from the remote, and will give a `missing object` error.
 
 -o <option>::
---server-option=<option>::
+`--server-option=<option>`::
 	Transmit the given string to the server when communicating using
 	protocol version 2.  The given string must not contain a NUL or LF
 	character.
 	When multiple `--server-option=<option>` are given, they are all
 	sent to the other side in the order listed on the command line.
 
-<repository>::
+`<repository>`::
 	The "remote" repository to query.  This parameter can be
 	either a URL or the name of a remote (see the GIT URLS and
 	REMOTES sections of linkgit:git-fetch[1]).
diff --git a/Documentation/git-ls-tree.txt b/Documentation/git-ls-tree.txt
index 82c802d918..11c25fe451 100644
--- a/Documentation/git-ls-tree.txt
+++ b/Documentation/git-ls-tree.txt
@@ -35,42 +35,42 @@ in the current working directory.  Note that:
 
 OPTIONS
 -------
-<tree-ish>::
+`<tree-ish>`::
 	Id of a tree-ish.
 
--d::
+`-d`::
 	Show only the named tree entry itself, not its children.
 
--r::
+`-r`::
 	Recurse into sub-trees.
 
--t::
+`-t`::
 	Show tree entries even when going to recurse them. Has no effect
 	if `-r` was not passed. `-d` implies `-t`.
 
--l::
---long::
+`-l`::
+`--long`::
 	Show object size of blob (file) entries.
 
--z::
+`-z`::
 	\0 line termination on output and do not quote filenames.
 	See OUTPUT FORMAT below for more information.
 
---name-only::
---name-status::
+`--name-only`::
+`--name-status`::
 	List only filenames (instead of the "long" output), one per line.
 
---abbrev[=<n>]::
+`--abbrev[=<n>]`::
 	Instead of showing the full 40-byte hexadecimal object
 	lines, show the shortest prefix that is at least '<n>'
 	hexdigits long that uniquely refers the object.
 	Non default number of digits can be specified with `--abbrev`=<n>.
 
---full-name::
+`--full-name`::
 	Instead of showing the path names relative to the current working
 	directory, show the full path names.
 
---full-tree::
+`--full-tree`::
 	Do not limit the listing to the current working directory.
 	Implies `--full-name`.
 
diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.txt
index b47e92ee57..5898b9ee89 100644
--- a/Documentation/git-mailinfo.txt
+++ b/Documentation/git-mailinfo.txt
@@ -24,7 +24,7 @@ command directly.  See linkgit:git-am[1] instead.
 
 OPTIONS
 -------
--k::
+`-k`::
 	Usually the program removes email cruft from the Subject:
 	header line to extract the title line for the commit log
 	message.  This option prevents this munging, and is most
@@ -44,12 +44,12 @@ Specifically, the following are removed until none of them remain:
 Finally, runs of whitespace are normalized to a single ASCII space
 character.
 
--b::
+`-b`::
 	When `-k` is not in effect, all leading strings bracketed with '['
 	and ']' pairs are stripped.  This option limits the stripping to
 	only the pairs whose bracketed string contains the word "PATCH".
 
--u::
+`-u`::
 	The commit log message, author name and author email are
 	taken from the e-mail, and after minimally decoding MIME
 	transfer encoding, re-coded in the charset specified by
@@ -59,19 +59,19 @@ character.
 Note that the patch is always used as-is without charset
 conversion, even with this flag.
 
---encoding=<encoding>::
+`--encoding=<encoding>`::
 	Similar to `-u`.  But when re-coding, the charset specified here is
 	used instead of the one specified by `i18n.commitEncoding` or UTF-8.
 
--n::
+`-n`::
 	Disable all charset re-coding of the metadata.
 
--m::
---message-id::
+`-m`::
+`--message-id`::
 	Copy the Message-ID header at the end of the commit message.  This
 	is useful in order to associate commits with mailing list discussions.
 
---scissors::
+`--scissors`::
 	Remove everything in body before a scissors line (e.g. "-- >8 --").
 	The line represents scissors and perforation marks, and is used to
 	request the reader to cut the message at that line.  If that line
@@ -86,14 +86,14 @@ beginning of the proposed commit log message with a scissors line.
 +
 This can be enabled by default with the configuration option `mailinfo.scissors`.
 
---no-scissors::
+`--no-scissors`::
 	Ignore scissors lines. Useful for overriding `mailinfo.scissors` settings.
 
-<msg>::
+`<msg>`::
 	The commit log message extracted from e-mail, usually
 	except the title line which comes from e-mail Subject.
 
-<patch>::
+`<patch>`::
 	The patch extracted from e-mail.
 
 GIT
diff --git a/Documentation/git-mailsplit.txt b/Documentation/git-mailsplit.txt
index 151c4f96be..1446a1588f 100644
--- a/Documentation/git-mailsplit.txt
+++ b/Documentation/git-mailsplit.txt
@@ -21,34 +21,34 @@ patches in the correct order.
 
 OPTIONS
 -------
-<mbox>::
+`<mbox>`::
 	Mbox file to split.  If not given, the mbox is read from
 	the standard input.
 
-<Maildir>::
+`<Maildir>`::
 	Root of the Maildir to split. This directory should contain the cur, tmp
 	and new subdirectories.
 
--o<directory>::
+`-o<directory>`::
 	Directory in which to place the individual messages.
 
--b::
+`-b`::
 	If any file doesn't begin with a From line, assume it is a
 	single mail message instead of signaling error.
 
--d<prec>::
+`-d<prec>`::
 	Instead of the default 4 digits with leading zeros,
 	different precision can be specified for the generated
 	filenames.
 
--f<nn>::
+`-f<nn>`::
 	Skip the first <nn> numbers, for example if `-f`3 is specified,
 	start the numbering with 0004.
 
---keep-cr::
+`--keep-cr`::
 	Do not remove `\r` from lines ending with `\r\n`.
 
---mboxrd::
+`--mboxrd`::
 	Input is of the "mboxrd" format and "^>+From " line escaping is
 	reversed.
 
diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt
index c69b3cec4f..b333fd2cd9 100644
--- a/Documentation/git-maintenance.txt
+++ b/Documentation/git-maintenance.txt
@@ -29,7 +29,7 @@ Git repository.
 SUBCOMMANDS
 -----------
 
-register::
+`register`::
 	Initialize Git config values so any scheduled maintenance will
 	start running on this repository. This adds the repository to the
 	`maintenance.repo` config variable in the current user's global
@@ -55,25 +55,25 @@ task:
 setting `maintenance.auto = false` in the current repository. This config
 setting will remain after a `git maintenance unregister` command.
 
-run::
+`run`::
 	Run one or more maintenance tasks. If one or more `--task` options
 	are specified, then those tasks are run in that order. Otherwise,
 	the tasks are determined by which `maintenance.<task>.enabled`
 	config options are true. By default, only `maintenance.gc.enabled`
 	is true.
 
-start::
+`start`::
 	Start running maintenance on the current repository. This performs
 	the same config updates as the `register` subcommand, then updates
 	the background scheduler to run `git maintenance run --scheduled`
 	on an hourly basis.
 
-stop::
+`stop`::
 	Halt the background maintenance schedule. The current repository
 	is not removed from the list of maintained repositories, in case
 	the background maintenance is restarted later.
 
-unregister::
+`unregister`::
 	Remove the current repository from background maintenance. This
 	only removes the repository from the configured list. It does not
 	stop the background maintenance processes from running.
@@ -81,7 +81,7 @@ unregister::
 TASKS
 -----
 
-commit-graph::
+`commit-graph`::
 	The `commit-graph` job updates the `commit-graph` files incrementally,
 	then verifies that the written data is correct. The incremental
 	write is safe to run alongside concurrent Git processes since it
@@ -89,7 +89,7 @@ commit-graph::
 	`commit-graph-chain` file. They will be deleted by a later run based
 	on the expiration delay.
 
-prefetch::
+`prefetch`::
 	The `prefetch` task updates the object directory with the latest
 	objects from all registered remotes. For each remote, a `git fetch`
 	command is run. The refmap is custom to avoid updating local or remote
@@ -104,7 +104,7 @@ already be obtained, so the real fetch would go faster.  In the ideal case,
 it will just become an update to a bunch of remote-tracking branches without
 any object transfer.
 
-gc::
+`gc`::
 	Clean up unnecessary files and optimize the local repository. "GC"
 	stands for "garbage collection," but this task performs many
 	smaller tasks. This task can be expensive for large repositories,
@@ -112,7 +112,7 @@ gc::
 	be disruptive in some situations, as it deletes stale data. See
 	linkgit:git-gc[1] for more details on garbage collection in Git.
 
-loose-objects::
+`loose-objects`::
 	The `loose-objects` job cleans up loose objects and places them into
 	pack-files. In order to prevent race conditions with concurrent Git
 	commands, it follows a two-step process. First, it deletes any loose
@@ -127,7 +127,7 @@ loose-objects::
 	advisable to enable both the `loose-objects` and `gc` tasks at the
 	same time.
 
-incremental-repack::
+`incremental-repack`::
 	The `incremental-repack` job repacks the object directory
 	using the `multi-pack-index` feature. In order to prevent race
 	conditions with concurrent Git commands, it follows a two-step
@@ -145,7 +145,7 @@ incremental-repack::
 	which is a special case that attempts to repack all pack-files
 	into a single pack-file.
 
-pack-refs::
+`pack-refs`::
 	The `pack-refs` task collects the loose reference files and
 	collects them into a single file. This speeds up operations that
 	need to iterate across many references. See linkgit:git-pack-refs[1]
@@ -153,7 +153,7 @@ pack-refs::
 
 OPTIONS
 -------
---auto::
+`--auto`::
 	When combined with the `run` subcommand, run maintenance tasks
 	only if certain thresholds are met. For example, the `gc` task
 	runs when the number of loose objects exceeds the number stored
@@ -161,7 +161,7 @@ OPTIONS
 	exceeds the `gc.autoPackLimit` config setting. Not compatible with
 	the `--schedule` option.
 
---schedule::
+`--schedule`::
 	When combined with the `run` subcommand, run maintenance tasks
 	only if certain time conditions are met, as specified by the
 	`maintenance.<task>.schedule` config value for each `<task>`.
@@ -171,10 +171,10 @@ OPTIONS
 	the `--task=<task>` option(s) or those with
 	`maintenance.<task>.enabled` set to true.
 
---quiet::
+`--quiet`::
 	Do not report progress or other information over `stderr`.
 
---task=<task>::
+`--task=<task>`::
 	If this option is specified one or more times, then only run the
 	specified tasks in the specified order. If no `--task=<task>`
 	arguments are specified, then only the tasks with
diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt
index 323bc045bf..272ef445e3 100644
--- a/Documentation/git-merge-base.txt
+++ b/Documentation/git-merge-base.txt
@@ -40,24 +40,24 @@ As a consequence, the 'merge base' is not necessarily contained in each of the
 commit arguments if more than two commits are specified. This is different
 from linkgit:git-show-branch[1] when used with the `--merge-base` option.
 
---octopus::
+`--octopus`::
 	Compute the best common ancestors of all supplied commits,
 	in preparation for an n-way merge.  This mimics the behavior
 	of `git show-branch --merge-base`.
 
---independent::
+`--independent`::
 	Instead of printing merge bases, print a minimal subset of
 	the supplied commits with the same ancestors.  In other words,
 	among the commits given, list those which cannot be reached
 	from any other.  This mimics the behavior of `git show-branch
 	--independent`.
 
---is-ancestor::
+`--is-ancestor`::
 	Check if the first <commit> is an ancestor of the second <commit>,
 	and exit with status 0 if true, or with status 1 if not.
 	Errors are signaled by a non-zero status that is not 1.
 
---fork-point::
+`--fork-point`::
 	Find the point at which a branch (or any history that leads
 	to <commit>) forked from another branch (or any reference)
 	<ref>. This does not just look for the common ancestor of
@@ -68,8 +68,8 @@ from linkgit:git-show-branch[1] when used with the `--merge-base` option.
 
 OPTIONS
 -------
--a::
---all::
+`-a`::
+`--all`::
 	Output all merge bases for the commits, instead of just one.
 
 DISCUSSION
diff --git a/Documentation/git-merge-file.txt b/Documentation/git-merge-file.txt
index 427f93cd8c..d7605b60f0 100644
--- a/Documentation/git-merge-file.txt
+++ b/Documentation/git-merge-file.txt
@@ -60,19 +60,19 @@ OPTIONS
 	looks like it came from files x, y and z instead of
 	from files a, b and c.
 
--p::
+`-p`::
 	Send results to standard output instead of overwriting
 	`<current-file>`.
 
--q::
+`-q`::
 	Quiet; do not warn about conflicts.
 
 --diff3::
 	Show conflicts in "diff3" style.
 
---ours::
---theirs::
---union::
+`--ours`::
+`--theirs`::
+`--union`::
 	Instead of leaving conflicts in the file, resolve conflicts
 	favouring our (or their or both) side of the lines.
 
diff --git a/Documentation/git-merge-index.txt b/Documentation/git-merge-index.txt
index be978144d5..a1cef44c33 100644
--- a/Documentation/git-merge-index.txt
+++ b/Documentation/git-merge-index.txt
@@ -23,16 +23,16 @@ OPTIONS
 \--::
 	Do not interpret any more arguments as options.
 
--a::
+`-a`::
 	Run merge against all files in the index that need merging.
 
--o::
+`-o`::
 	Instead of stopping at the first failed merge, do all of them
 	in one shot - continue with merging even when previous merges
 	returned errors, and only return the error code after all the
 	merges.
 
--q::
+`-q`::
 	Do not complain about a failed merge program (a merge program
 	failure usually indicates conflicts during the merge). This is for
 	porcelains which might want to emit custom messages.
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index 029c7807db..de57a4fb54 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -75,24 +75,24 @@ used to give a good default for automated `git merge`
 invocations. The automated message can include the branch description.
 
 -F <file>::
---file=<file>::
+`--file=<file>`::
 	Read the commit message to be used for the merge commit (in
 	case one is created).
 +
 If `--log` is specified, a shortlog of the commits being merged
 will be appended to the specified message.
 
---rerere-autoupdate::
---no-rerere-autoupdate::
+`--rerere-autoupdate`::
+`--no-rerere-autoupdate`::
 	Allow the rerere mechanism to update the index with the
 	result of auto-conflict resolution if possible.
 
---overwrite-ignore::
---no-overwrite-ignore::
+`--overwrite-ignore`::
+`--no-overwrite-ignore`::
 	Silently overwrite ignored files from the merge result. This
 	is the default behavior. Use `--no-overwrite-ignore` to abort.
 
---abort::
+`--abort`::
 	Abort the current conflict resolution process, and
 	try to reconstruct the pre-merge state. If an autostash entry is
 	present, apply it to the worktree.
@@ -108,12 +108,12 @@ which case `git merge --abort` applies the stash entry to the worktree
 whereas `git reset --merge` will save the stashed changes in the stash
 list.
 
---quit::
+`--quit`::
 	Forget about the current merge in progress. Leave the index
 	and the working tree as-is. If `MERGE_AUTOSTASH` is present, the
 	stash entry will be saved to the stash list.
 
---continue::
+`--continue`::
 	After a `git merge` stops due to conflicts you can conclude the
 	merge by running `git merge --continue` (see "HOW TO RESOLVE
 	CONFLICTS" section below).
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
index 530f8a278f..1a5b30b293 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.txt
@@ -25,7 +25,7 @@ the merge tool program on every file with merge conflicts.
 OPTIONS
 -------
 -t <tool>::
---tool=<tool>::
+`--tool=<tool>`::
 	Use the merge resolution program specified by <tool>.
 	Valid values include emerge, gvimdiff, kdiff3,
 	meld, vimdiff, and tortoisemerge. Run `git mergetool --tool-help`
@@ -64,35 +64,35 @@ variable `mergetool.<tool>.trustExitCode` can be set to `true`.
 Otherwise, `git mergetool` will prompt the user to indicate the
 success of the resolution after the custom tool has exited.
 
---tool-help::
+`--tool-help`::
 	Print a list of merge tools that may be used with `--tool`.
 
--y::
---no-prompt::
+`-y`::
+`--no-prompt`::
 	Don't prompt before each invocation of the merge resolution
 	program.
 	This is the default if the merge resolution program is
 	explicitly specified with the `--tool` option or with the
 	`merge.tool` configuration variable.
 
---prompt::
+`--prompt`::
 	Prompt before each invocation of the merge resolution program
 	to give the user a chance to skip the path.
 
--g::
---gui::
+`-g`::
+`--gui`::
 	When `git-mergetool` is invoked with the `-g` or `--gui` option
 	the default merge tool will be read from the configured
 	`merge.guitool` variable instead of `merge.tool`. If
 	`merge.guitool` is not set, we will fallback to the tool
 	configured under `merge.tool`.
 
---no-gui::
+`--no-gui`::
 	This overrides a previous `-g` or `--gui` setting and reads the
 	default merge tool will be read from the configured `merge.tool`
 	variable.
 
--O<orderfile>::
+`-O<orderfile>`::
 	Process files in the order specified in the
 	<orderfile>, which has one shell glob pattern per line.
 	This overrides the `diff.orderFile` configuration variable
diff --git a/Documentation/git-mktag.txt b/Documentation/git-mktag.txt
index 1ba01b1a9b..2a38aeae34 100644
--- a/Documentation/git-mktag.txt
+++ b/Documentation/git-mktag.txt
@@ -14,7 +14,7 @@ SYNOPSIS
 OPTIONS
 -------
 
---strict::
+`--strict`::
 	By default mktag turns on the equivalent of
 	linkgit:git-fsck[1] `--strict` mode. Use `--no-strict` to
 	disable it.
diff --git a/Documentation/git-mktree.txt b/Documentation/git-mktree.txt
index 709e05ab6f..0f6e9fcecc 100644
--- a/Documentation/git-mktree.txt
+++ b/Documentation/git-mktree.txt
@@ -20,16 +20,16 @@ built is written to the standard output.
 
 OPTIONS
 -------
--z::
+`-z`::
 	Read the NUL-terminated `ls-tree -z` output instead.
 
---missing::
+`--missing`::
 	Allow missing objects.  The default behaviour (without this option)
 	is to verify that each tree entry's sha1 identifies an existing
 	object.  This option has no effect on the treatment of gitlink entries
 	(aka "submodules") which are always allowed to be missing.
 
---batch::
+`--batch`::
 	Allow building of more than one tree object before exiting.  Each
 	tree is separated by as single blank line. The final new-line is
 	optional.  Note - if the `-z` option is used, lines are terminated
diff --git a/Documentation/git-multi-pack-index.txt b/Documentation/git-multi-pack-index.txt
index ff56181795..b269392221 100644
--- a/Documentation/git-multi-pack-index.txt
+++ b/Documentation/git-multi-pack-index.txt
@@ -19,38 +19,38 @@ Write or verify a multi-pack-index (MIDX) file.
 OPTIONS
 -------
 
---object-dir=<dir>::
+`--object-dir=<dir>`::
 	Use given directory for the location of Git objects. We check
 	`<dir>/packs/multi-pack-index` for the current MIDX file, and
 	`<dir>/packs` for the pack-files to index.
 
---[no-]progress::
+`--[no-]progress`::
 	Turn progress on/off explicitly. If neither is specified, progress is
 	shown if standard error is connected to a terminal.
 
 The following subcommands are available:
 
-write::
+`write`::
 	Write a new MIDX file. The following options are available for
 	the `write` sub-command:
 +
 --
-	--preferred-pack=<pack>::
+	`--preferred-pack=<pack>`::
 		Optionally specify the tie-breaking pack used when
 		multiple packs contain the same object. If not given,
 		ties are broken in favor of the pack with the lowest
 		mtime.
 --
 
-verify::
+`verify`::
 	Verify the contents of the MIDX file.
 
-expire::
+`expire`::
 	Delete the pack-files that are tracked 	by the MIDX file, but
 	have no objects referenced by the MIDX. Rewrite the MIDX file
 	afterward to remove all references to these pack-files.
 
-repack::
+`repack`::
 	Create a new pack-file containing objects in small pack-files
 	referenced by the multi-pack-index. If the size given by the
 	`--batch-size=<size>` argument is zero, then create a pack
diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index 183e7d5770..0944651f6a 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -28,20 +28,20 @@ committed.
 
 OPTIONS
 -------
--f::
---force::
+`-f`::
+`--force`::
 	Force renaming or moving of a file even if the target exists
--k::
+`-k`::
 	Skip move or rename actions which would lead to an error
 	condition. An error happens when a source is neither existing nor
 	controlled by Git, or when it would overwrite an existing
 	file unless `-f` is given.
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Do nothing; only show what would happen
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Report the names of files as they are moved.
 
 SUBMODULES
diff --git a/Documentation/git-name-rev.txt b/Documentation/git-name-rev.txt
index c6c1f89117..526914f710 100644
--- a/Documentation/git-name-rev.txt
+++ b/Documentation/git-name-rev.txt
@@ -21,16 +21,16 @@ format parsable by `git rev-parse`.
 OPTIONS
 -------
 
---tags::
+`--tags`::
 	Do not use branch names, but only tags to name the commits
 
---refs=<pattern>::
+`--refs=<pattern>`::
 	Only use refs whose names match a given shell pattern.  The pattern
 	can be one of branch name, tag name or fully qualified ref name. If
 	given multiple times, use refs whose names match any of the given shell
 	patterns. Use `--no-refs` to clear any previous ref patterns given.
 
---exclude=<pattern>::
+`--exclude=<pattern>`::
 	Do not use any ref whose name matches a given shell pattern. The
 	pattern can be one of branch name, tag name or fully qualified ref
 	name. If given multiple times, a ref will be excluded when it matches
@@ -39,26 +39,26 @@ OPTIONS
 	does not match any `--exclude` patterns. Use `--no-exclude` to clear the
 	list of exclude patterns.
 
---all::
+`--all`::
 	List all commits reachable from all refs
 
---stdin::
+`--stdin`::
 	Transform stdin by substituting all the 40-character SHA-1
 	hexes (say $hex) with "$hex ($rev_name)".  When used with
 	`--name-only`, substitute with "$rev_name", omitting $hex
 	altogether.  Intended for the scripter's use.
 
---name-only::
+`--name-only`::
 	Instead of printing both the SHA-1 and the name, print only
 	the name.  If given with `--tags` the usual tag prefix of
 	"tags/" is also omitted from the name, matching the output
 	of `git-describe` more closely.
 
---no-undefined::
+`--no-undefined`::
 	Die with error code != 0 when a reference is undefined,
 	instead of printing `undefined`.
 
---always::
+`--always`::
 	Show uniquely abbreviated commit object as fallback.
 
 EXAMPLES
diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt
index ffc6fc51a7..16afea280d 100644
--- a/Documentation/git-notes.txt
+++ b/Documentation/git-notes.txt
@@ -53,13 +53,13 @@ notes across commands that rewrite commits.
 SUBCOMMANDS
 -----------
 
-list::
+`list`::
 	List the notes object for a given object. If no object is
 	given, show a list of all note objects and the objects they
 	annotate (in the format "<note object> <annotated object>").
 	This is the default subcommand if no subcommand is given.
 
-add::
+`add`::
 	Add notes for a given object (defaults to `HEAD`). Abort if the
 	object already has notes (use `-f` to overwrite existing notes).
 	However, if you're using `add` interactively (using an editor
@@ -67,7 +67,7 @@ add::
 	the existing notes will be opened in the editor (like the `edit`
 	subcommand).
 
-copy::
+`copy`::
 	Copy the notes for the first object onto the second object (defaults to
 	`HEAD`). Abort if the second object already has notes, or if the first
 	object has none (use -f to overwrite existing notes to the
@@ -84,17 +84,17 @@ on standard input, and copy the notes from each <from-object> to its
 corresponding <to-object>.  (The optional `<rest>` is ignored so that
 the command can read the input given to the `post-rewrite` hook.)
 
-append::
+`append`::
 	Append to the notes of an existing object (defaults to `HEAD`).
 	Creates a new notes object if needed.
 
-edit::
+`edit`::
 	Edit the notes for a given object (defaults to `HEAD`).
 
-show::
+`show`::
 	Show the notes for a given object (defaults to `HEAD`).
 
-merge::
+`merge`::
 	Merge the given notes ref into the current notes ref.
 	This will try to merge the changes made by the given
 	notes ref (called "remote") since the merge-base (if
@@ -109,28 +109,28 @@ When done, the user can either finalize the merge with
 `git notes merge --commit`, or abort the merge with
 `git notes merge --abort`.
 
-remove::
+`remove`::
 	Remove the notes for given objects (defaults to `HEAD`). When
 	giving zero or one object from the command line, this is
 	equivalent to specifying an empty note message to
 	the `edit` subcommand.
 
-prune::
+`prune`::
 	Remove all notes for non-existing/unreachable objects.
 
-get-ref::
+`get-ref`::
 	Print the current notes ref. This provides an easy way to
 	retrieve the current notes ref (e.g. from scripts).
 
 OPTIONS
 -------
--f::
---force::
+`-f`::
+`--force`::
 	When adding notes to an object that already has notes,
 	overwrite the existing notes (instead of aborting).
 
 -m <msg>::
---message=<msg>::
+`--message=<msg>`::
 	Use the given note message (instead of prompting).
 	If multiple `-m` options are given, their values
 	are concatenated as separate paragraphs.
@@ -138,24 +138,24 @@ OPTIONS
 	single line between paragraphs will be stripped out.
 
 -F <file>::
---file=<file>::
+`--file=<file>`::
 	Take the note message from the given file.  Use '-' to
 	read the note message from the standard input.
 	Lines starting with `#` and empty lines other than a
 	single line between paragraphs will be stripped out.
 
 -C <object>::
---reuse-message=<object>::
+`--reuse-message=<object>`::
 	Take the given blob object (for example, another note) as the
 	note message. (Use `git notes copy <object>` instead to
 	copy notes between objects.)
 
 -c <object>::
---reedit-message=<object>::
+`--reedit-message=<object>`::
 	Like `-C`, but with `-c` the editor is invoked, so that
 	the user can further edit the note message.
 
---allow-empty::
+`--allow-empty`::
 	Allow an empty note object to be stored. The default behavior is
 	to automatically remove empty notes.
 
@@ -166,22 +166,22 @@ OPTIONS
 	begins with `notes/`, `refs/` and otherwise `refs/notes/` is prefixed
 	to form a full name of the ref.
 
---ignore-missing::
+`--ignore-missing`::
 	Do not consider it an error to request removing notes from an
 	object that does not have notes attached to it.
 
---stdin::
+`--stdin`::
 	Also read the object names to remove notes from the standard
 	input (there is no reason you cannot combine this with object
 	names from the command line).
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Do not remove anything; just report the object names whose notes
 	would be removed.
 
 -s <strategy>::
---strategy=<strategy>::
+`--strategy=<strategy>`::
 	When merging notes, resolve notes conflicts using the given
 	strategy. The following strategies are recognized: "manual"
 	(default), "ours", "theirs", "union" and "cat_sort_uniq".
@@ -189,7 +189,7 @@ OPTIONS
 	See the "NOTES MERGE STRATEGIES" section below for more
 	information on each notes merge strategy.
 
---commit::
+`--commit`::
 	Finalize an in-progress `git notes merge`. Use this option
 	when you have resolved the conflicts that `git notes merge`
 	stored in `.git/NOTES_MERGE_WORKTREE`. This amends the partial
@@ -198,17 +198,17 @@ OPTIONS
 	`.git/NOTES_MERGE_WORKTREE`. The notes ref stored in the
 	`.git/NOTES_MERGE_REF` symref is updated to the resulting commit.
 
---abort::
+`--abort`::
 	Abort/reset an in-progress `git notes merge`, i.e. a notes merge
 	with conflicts. This simply removes all files related to the
 	notes merge.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	When merging notes, operate quietly.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	When merging notes, be more verbose.
 	When pruning notes, report all object names whose notes are
 	removed.
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index a74866d84f..90280af75b 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -205,8 +205,8 @@ All commands except clone accept these options.
 --git-dir <dir>::
 	Set the `GIT_DIR` environment variable.  See linkgit:git[1].
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Provide more progress information.
 
 Sync options
@@ -233,7 +233,7 @@ Git repository:
     $ git p4 sync --branch=refs/remotes/p4/proj2 //depot/proj2
 ----
 
---detect-branches::
+`--detect-branches`::
 	Use the branch detection algorithm to find new paths in p4.  It is
 	documented below in "BRANCH DETECTION".
 
@@ -242,18 +242,18 @@ Git repository:
 	line.  Normally, `git p4` inspects the current p4 repository
 	state and detects the changes it should import.
 
---silent::
+`--silent`::
 	Do not print any progress information.
 
---detect-labels::
+`--detect-labels`::
 	Query p4 for labels associated with the depot paths, and add
 	them as tags in Git. Limited usefulness as only imports labels
 	associated with new changelists. Deprecated.
 
---import-labels::
+`--import-labels`::
 	Import labels from p4 into Git.
 
---import-local::
+`--import-local`::
 	By default, p4 branches are stored in `refs/remotes/p4/`,
 	where they will be treated as remote-tracking branches by
 	linkgit:git-branch[1] and other commands.  This option instead
@@ -277,7 +277,7 @@ Git repository:
 	one block of changes of the given size. The default block size
 	is 500, which should usually be suitable.
 
---keep-path::
+`--keep-path`::
 	The mapping of file names from the p4 depot path to Git, by
 	default, involves removing the entire depot path.  With this
 	option, the full p4 depot path is retained in Git.  For example,
@@ -285,7 +285,7 @@ Git repository:
 	'//depot/main/', becomes 'foo/bar.c'.  With `--keep-path`, the
 	Git path is instead 'depot/main/foo/bar.c'.
 
---use-client-spec::
+`--use-client-spec`::
 	Use a client spec to find the list of interesting files in p4.
 	See the "CLIENT SPEC" section below.
 
@@ -302,7 +302,7 @@ options described above.
 	component in the p4 depot path is used to create a new
 	directory.
 
---bare::
+`--bare`::
 	Perform a bare clone.  See linkgit:git-clone[1].
 
 Submit options
@@ -314,22 +314,22 @@ These options can be used to modify `git p4 submit` behavior.
 	p4.  By default, this is the most recent p4 commit reachable
 	from `HEAD`.
 
--M::
+`-M`::
 	Detect renames.  See linkgit:git-diff[1].  Renames will be
 	represented in p4 using explicit 'move' operations.  There
 	is no corresponding option to detect copies, but there are
 	variables for both moves and copies.
 
---preserve-user::
+`--preserve-user`::
 	Re-author p4 changes before submitting to p4.  This option
 	requires p4 admin privileges.
 
---export-labels::
+`--export-labels`::
 	Export tags from Git as p4 labels. Tags found in Git are applied
 	to the perforce working directory.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Show just what commits would be submitted to p4; do not change
 	state in Git or p4.
 
@@ -340,7 +340,7 @@ These options can be used to modify `git p4 submit` behavior.
 	submit manually or revert.  This option always stops after the
 	first (oldest) commit.  Git tags are not exported to p4.
 
---shelve::
+`--shelve`::
 	Instead of submitting create a series of shelved changelists.
 	After creating each shelve, the relevant files are reverted/deleted.
 	If you have multiple commits pending multiple shelves will be created.
@@ -365,7 +365,7 @@ These options can be used to modify `git p4 submit` behavior.
     Submit only the specified commit or range of commits, instead of the full
     list of changes that are in the current Git branch.
 
---disable-rebase::
+`--disable-rebase`::
     Disable the automatic rebase after all commits have been successfully
     submitted. Can also be set with `git-p4.disableRebase`.
 
@@ -427,13 +427,13 @@ Rebase options
 ~~~~~~~~~~~~~~
 These options can be used to modify `git p4 rebase` behavior.
 
---import-labels::
+`--import-labels`::
 	Import p4 labels.
 
 Unshelve options
 ~~~~~~~~~~~~~~~~
 
---origin::
+`--origin`::
     Sets the `git` refspec against which the shelved P4 changelist is compared.
     Defaults to p4/master.
 
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index 118fdeac35..4a924ccd32 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -48,7 +48,7 @@ transport by their peers.
 
 OPTIONS
 -------
-base-name::
+`base-name`::
 	Write into pairs of files (.pack and .idx), using
 	<base-name> to determine the name of the created file.
 	When this option is used, the two files in a pair are written in
@@ -56,11 +56,11 @@ base-name::
 	based on the pack content and is written to the standard
 	output of the command.
 
---stdout::
+`--stdout`::
 	Write the pack contents (what would have been written to
 	.pack file) out to the standard output.
 
---revs::
+`--revs`::
 	Read the revision arguments from the standard input, instead of
 	individual object names.  The revision arguments are processed
 	the same way as `git rev-list` with the `--objects` flag
@@ -69,23 +69,23 @@ base-name::
 	Besides revisions, `--not` or `--shallow <SHA-1>` lines are
 	also accepted.
 
---unpacked::
+`--unpacked`::
 	This implies `--revs`.  When processing the list of
 	revision arguments read from the standard input, limit
 	the objects packed to those that are not already packed.
 
---all::
+`--all`::
 	This implies `--revs`.  In addition to the list of
 	revision arguments read from the standard input, pretend
 	as if all refs under `refs/` are specified to be
 	included.
 
---include-tag::
+`--include-tag`::
 	Include unasked-for annotated tags if the object they
 	reference was included in the resulting packfile.  This
 	can be useful to send new tags to native Git clients.
 
---stdin-packs::
+`--stdin-packs`::
 	Read the basenames of packfiles (e.g., `pack-1234abcd.pack`)
 	from the standard input, instead of object names or revision
 	arguments. The resulting pack contains all objects listed in the
@@ -95,8 +95,8 @@ base-name::
 Incompatible with `--revs`, or options that imply `--revs` (such as
 `--all`), with the exception of `--unpacked`, which is compatible.
 
---window=<n>::
---depth=<n>::
+`--window=<n>`::
+`--depth=<n>`::
 	These two options affect how the objects contained in
 	the pack are stored using delta compression.  The
 	objects are first internally sorted by type, size and
@@ -110,7 +110,7 @@ Incompatible with `--revs`, or options that imply `--revs` (such as
 The default value for `--window` is 10 and `--depth` is 50. The maximum
 depth is 4095.
 
---window-memory=<n>::
+`--window-memory=<n>`::
 	This option provides an additional limit on top of `--window`;
 	the window size will dynamically scale down so as to not take
 	up more than '<n>' bytes in memory.  This is useful in
@@ -121,7 +121,7 @@ depth is 4095.
 	`--window-memory=0` makes memory usage unlimited.  The default
 	is taken from the `pack.windowMemory` configuration variable.
 
---max-pack-size=<n>::
+`--max-pack-size=<n>`::
 	In unusual scenarios, you may not be able to create files
 	larger than a certain size on your filesystem, and this option
 	can be used to tell the command to split the output packfile
@@ -133,38 +133,38 @@ depth is 4095.
 	The default is unlimited, unless the config variable
 	`pack.packSizeLimit` is set.
 
---honor-pack-keep::
+`--honor-pack-keep`::
 	This flag causes an object already in a local pack that
 	has a .keep file to be ignored, even if it would have
 	otherwise been packed.
 
---keep-pack=<pack-name>::
+`--keep-pack=<pack-name>`::
 	This flag causes an object already in the given pack to be
 	ignored, even if it would have otherwise been
 	packed. `<pack-name>` is the pack file name without
 	leading directory (e.g. `pack-123.pack`). The option could be
 	specified multiple times to keep multiple packs.
 
---incremental::
+`--incremental`::
 	This flag causes an object already in a pack to be ignored
 	even if it would have otherwise been packed.
 
---local::
+`--local`::
 	This flag causes an object that is borrowed from an alternate
 	object store to be ignored even if it would have otherwise been
 	packed.
 
---non-empty::
+`--non-empty`::
         Only create a packed archive if it would contain at
         least one object.
 
---progress::
+`--progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless -q
 	is specified. This flag forces progress status even if
 	the standard error stream is not directed to a terminal.
 
---all-progress::
+`--all-progress`::
 	When `--stdout` is specified then progress report is
 	displayed during the object count and compression phases
 	but inhibited during the write-out phase. The reason is
@@ -175,30 +175,30 @@ depth is 4095.
 	report for the write-out phase as well even if `--stdout` is
 	used.
 
---all-progress-implied::
+`--all-progress-implied`::
 	This is used to imply `--all-progress` whenever progress display
 	is activated.  Unlike `--all-progress` this flag doesn't actually
 	force any progress display by itself.
 
--q::
+`-q`::
 	This flag makes the command not to report its progress
 	on the standard error stream.
 
---no-reuse-delta::
+`--no-reuse-delta`::
 	When creating a packed archive in a repository that
 	has existing packs, the command reuses existing deltas.
 	This sometimes results in a slightly suboptimal pack.
 	This flag tells the command not to reuse existing deltas
 	but compute them from scratch.
 
---no-reuse-object::
+`--no-reuse-object`::
 	This flag tells the command not to reuse existing object data at all,
 	including non deltified object, forcing recompression of everything.
 	This implies `--no-reuse-delta`. Useful only in the obscure case where
 	wholesale enforcement of a different compression level on the
 	packed data is desired.
 
---compression=<n>::
+`--compression=<n>`::
 	Specifies compression level for newly-compressed data in the
 	generated pack.  If not specified,  pack compression level is
 	determined first by pack.compression,  then by core.compression,
@@ -206,7 +206,7 @@ depth is 4095.
 	Add `--no-reuse-object` if you want to force a uniform compression
 	level on all data no matter the source.
 
---[no-]sparse::
+`--[no-]sparse`::
 	Toggle the "sparse" algorithm to determine which objects to include in
 	the pack, when combined with the `--revs` option. This algorithm
 	only walks trees that appear in paths that introduce new objects.
@@ -217,7 +217,7 @@ depth is 4095.
 	it defaults to the value of `pack.useSparse`, which is true unless
 	otherwise specified.
 
---thin::
+`--thin`::
 	Create a "thin" pack by omitting the common objects between a
 	sender and a receiver in order to reduce network transfer. This
 	option only makes sense in conjunction with `--stdout`.
@@ -227,12 +227,12 @@ required objects and is thus unusable by Git without making it
 self-contained. Use `git index-pack --fix-thin`
 (see linkgit:git-index-pack[1]) to restore the self-contained property.
 
---shallow::
+`--shallow`::
 	Optimize a pack that will be provided to a client with a shallow
 	repository.  This option, combined with `--thin`, can result in a
 	smaller pack at the cost of speed.
 
---delta-base-offset::
+`--delta-base-offset`::
 	A packed archive can express the base object of a delta as
 	either a 20-byte object name or as an offset in the
 	stream, but ancient versions of Git don't understand the
@@ -248,7 +248,7 @@ Note: Porcelain commands such as `git gc` (see linkgit:git-gc[1]),
 in modern Git when they put objects in your repository into pack files.
 So does `git bundle` (see linkgit:git-bundle[1]) when it creates a bundle.
 
---threads=<n>::
+`--threads=<n>`::
 	Specifies the number of threads to spawn when searching for best
 	delta matches.  This requires that pack-objects be compiled with
 	pthreads otherwise this option is ignored with a warning.
@@ -263,19 +263,19 @@ So does `git bundle` (see linkgit:git-bundle[1]) when it creates a bundle.
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---keep-true-parents::
+`--keep-true-parents`::
 	With this option, parents that are hidden by grafts are packed
 	nevertheless.
 
---filter=<filter-spec>::
+`--filter=<filter-spec>`::
 	Requires `--stdout`.  Omits certain objects (usually blobs) from
 	the resulting packfile.  See linkgit:git-rev-list[1] for valid
 	`<filter-spec>` forms.
 
---no-filter::
+`--no-filter`::
 	Turns off any previous `--filter=` argument.
 
---missing=<missing-action>::
+`--missing=<missing-action>`::
 	A debug option to help with future "partial clone" development.
 	This option specifies how missing objects are handled.
 +
@@ -293,27 +293,27 @@ allow object traversal to continue for EXPECTED promisor missing objects.
 No fetch of a missing object will occur.  An unexpected missing object will
 raise an error.
 
---exclude-promisor-objects::
+`--exclude-promisor-objects`::
 	Omit objects that are known to be in the promisor remote.  (This
 	option has the purpose of operating only on locally created objects,
 	so that when we repack, we still maintain a distinction between
 	locally created objects [without .promisor] and objects from the
 	promisor remote [with .promisor].)  This is used with partial clone.
 
---keep-unreachable::
+`--keep-unreachable`::
 	Objects unreachable from the refs in packs named with
 	`--unpacked`= option are added to the resulting pack, in
 	addition to the reachable objects that are not in packs marked
 	with *.keep files. This implies `--revs`.
 
---pack-loose-unreachable::
+`--pack-loose-unreachable`::
 	Pack unreachable loose objects (and their loose counterparts
 	removed). This implies `--revs`.
 
---unpack-unreachable::
+`--unpack-unreachable`::
 	Keep unreachable objects in loose form. This implies `--revs`.
 
---delta-islands::
+`--delta-islands`::
 	Restrict delta matches based on "islands". See DELTA ISLANDS
 	below.
 
diff --git a/Documentation/git-pack-redundant.txt b/Documentation/git-pack-redundant.txt
index a288be2c12..cc028d80de 100644
--- a/Documentation/git-pack-redundant.txt
+++ b/Documentation/git-pack-redundant.txt
@@ -29,14 +29,14 @@ OPTIONS
 -------
 
 
---all::
+`--all`::
 	Processes all packs. Any filenames on the command line are ignored.
 
---alt-odb::
+`--alt-odb`::
 	Don't require objects present in packs from alternate object
 	directories to be present in local packs.
 
---verbose::
+`--verbose`::
 	Outputs some statistics to stderr. Has a small performance penalty.
 
 SEE ALSO
diff --git a/Documentation/git-pack-refs.txt b/Documentation/git-pack-refs.txt
index f77bd0e27f..3235e5129e 100644
--- a/Documentation/git-pack-refs.txt
+++ b/Documentation/git-pack-refs.txt
@@ -45,7 +45,7 @@ unpacked.
 OPTIONS
 -------
 
---all::
+`--all`::
 
 The command by default packs all tags and refs that are already
 packed, and leaves other refs
@@ -54,7 +54,7 @@ developed and packing their tips does not help performance.
 This option causes branch tips to be packed as well.  Useful for
 a repository with many branches of historical interests.
 
---no-prune::
+`--no-prune`::
 
 The command usually removes loose refs under `$GIT_DIR/refs`
 hierarchy after packing them.  This option tells it not to.
diff --git a/Documentation/git-patch-id.txt b/Documentation/git-patch-id.txt
index 5e8747f673..e50d13c6ed 100644
--- a/Documentation/git-patch-id.txt
+++ b/Documentation/git-patch-id.txt
@@ -30,7 +30,7 @@ This can be used to make a mapping from patch ID to commit ID.
 OPTIONS
 -------
 
---stable::
+`--stable`::
 	Use a "stable" sum of hashes as the patch ID. With this option:
 	 - Reordering file diffs that make up a patch does not affect the ID.
 	   In particular, two patches produced by comparing the same two trees
@@ -47,7 +47,7 @@ OPTIONS
 
 	This is the default if `patchid.stable` is set to true.
 
---unstable::
+`--unstable`::
 	Use an "unstable" hash as the patch ID. With this option,
 	the result produced is compatible with the patch-id value produced
 	by `git` 1.9 and older.  Users with pre-existing databases storing
diff --git a/Documentation/git-prune-packed.txt b/Documentation/git-prune-packed.txt
index 77603fd5e2..9b4414a34e 100644
--- a/Documentation/git-prune-packed.txt
+++ b/Documentation/git-prune-packed.txt
@@ -28,13 +28,13 @@ disk storage, etc.
 
 OPTIONS
 -------
--n::
---dry-run::
+`-n`::
+`--dry-run`::
         Don't actually remove any objects, only show those that would have been
         removed.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Squelch the progress indicator.
 
 SEE ALSO
diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.txt
index 382e5f70f4..1e4a2a648f 100644
--- a/Documentation/git-prune.txt
+++ b/Documentation/git-prune.txt
@@ -33,16 +33,16 @@ not desired, see linkgit:git-repack[1].
 OPTIONS
 -------
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Do not remove anything; just report what it would
 	remove.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Report all removed objects.
 
---progress::
+`--progress`::
 	Show progress.
 
 --expire <time>::
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index a64a137a89..7b83ac3577 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -74,14 +74,14 @@ pulling or stash them away with linkgit:git-stash[1].
 OPTIONS
 -------
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	This is passed to both underlying `git-fetch` to squelch reporting of
 	during transfer, and underlying `git-merge` to squelch output during
 	merging.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Pass `--verbose` to `git-fetch` and `git-merge`.
 
 --[no-]recurse-submodules[=yes|on-demand|no]::
@@ -101,7 +101,7 @@ Options related to merging
 
 include::merge-options.txt[]
 
--r::
+`-r`::
 --rebase[=false|true|merges|preserve|interactive]::
 	When true, rebase the current branch on top of the upstream
 	branch after fetching. If there is a remote-tracking branch
@@ -131,7 +131,7 @@ It rewrites history, which does not bode well when you
 published that history already.  Do *not* use this option
 unless you have read linkgit:git-rebase[1] carefully.
 
---no-rebase::
+`--no-rebase`::
 	Override earlier `--rebase`.
 
 Options related to fetching
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index 7811e2c73b..c33ebe5f4a 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -47,7 +47,7 @@ local one.
 
 OPTIONS[[OPTIONS]]
 ------------------
-<repository>::
+`<repository>`::
 	The "remote" repository that is destination of a push
 	operation.  This parameter can be either a URL
 	(see the section <<URLS,GIT URLS>> below) or the name
@@ -146,11 +146,11 @@ already exists on the remote side.
 +
 `tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`.
 
---all::
+`--all`::
 	Push all branches (i.e. refs under `refs/heads/`); cannot be
 	used with other <refspec>.
 
---prune::
+`--prune`::
 	Remove remote branches that don't have a local counterpart. For example
 	a remote branch `tmp` will be removed if a local branch with the same
 	name doesn't exist any more. This also respects refspecs, e.g.
@@ -158,7 +158,7 @@ already exists on the remote side.
 	make sure that remote `refs/tmp/foo` will be removed if `refs/heads/foo`
 	doesn't exist.
 
---mirror::
+`--mirror`::
 	Instead of naming each ref to push, specifies that all
 	refs under `refs/` (which includes but is not
 	limited to `refs/heads/`, `refs/remotes/`, and `refs/tags/`)
@@ -169,26 +169,26 @@ already exists on the remote side.
 	if the configuration option `remote.<remote>.mirror` is
 	set.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Do everything except actually send the updates.
 
---porcelain::
+`--porcelain`::
 	Produce machine-readable output.  The output status line for each ref
 	will be tab-separated and sent to stdout instead of stderr.  The full
 	symbolic names of the refs will be given.
 
--d::
---delete::
+`-d`::
+`--delete`::
 	All listed refs are deleted from the remote repository. This is
 	the same as prefixing all refs with a colon.
 
---tags::
+`--tags`::
 	All refs under `refs/tags` are pushed, in
 	addition to refspecs explicitly listed on the command
 	line.
 
---follow-tags::
+`--follow-tags`::
 	Push all the refs that would be pushed without this option,
 	and also push annotated tags in `refs/tags` that are missing
 	from the remote but are pointing at commit-ish that are
@@ -196,7 +196,7 @@ already exists on the remote side.
 	with configuration variable `push.followTags`.  For more
 	information, see `push.followTags` in linkgit:git-config[1].
 
---[no-]signed::
+`--[no-]signed`::
 --signed=(true|false|if-asked)::
 	GPG-sign the push request to update refs on the receiving
 	side, to allow it to be checked by the hooks and/or be
@@ -207,13 +207,13 @@ already exists on the remote side.
 	will also fail if the actual call to `gpg --sign` fails.  See
 	linkgit:git-receive-pack[1] for the details on the receiving end.
 
---[no-]atomic::
+`--[no-]atomic`::
 	Use an atomic transaction on the remote side if available.
 	Either all refs are updated, or on error, no refs are updated.
 	If the server does not support atomic pushes the push will fail.
 
 -o <option>::
---push-option=<option>::
+`--push-option=<option>`::
 	Transmit the given string to the server, which passes them to
 	the pre-receive as well as the post-receive hook. The given string
 	must not contain a NUL or LF character.
@@ -224,15 +224,15 @@ already exists on the remote side.
 	line, the values of configuration variable `push.pushOption`
 	are used instead.
 
---receive-pack=<git-receive-pack>::
---exec=<git-receive-pack>::
+`--receive-pack=<git-receive-pack>`::
+`--exec=<git-receive-pack>`::
 	Path to the `git-receive-pack` program on the remote
 	end.  Sometimes useful when pushing to a remote
 	repository over ssh, and you do not have the program in
 	a directory on the default `$PATH`.
 
---[no-]force-with-lease::
---force-with-lease=<refname>::
+`--[no-]force-with-lease`::
+`--force-with-lease=<refname>`::
 --force-with-lease=<refname>:<expect>::
 	Usually, `git push` refuses to update a remote ref that is
 	not an ancestor of the local ref used to overwrite it.
@@ -329,8 +329,8 @@ verify if updates from the remote-tracking refs that may have been
 implicitly updated in the background are integrated locally before
 allowing a forced update.
 
--f::
---force::
+`-f`::
+`--force`::
 	Usually, the command refuses to update a remote ref that is
 	not an ancestor of the local ref used to overwrite it.
 	Also, when `--force-with-lease` option is used, the command refuses
@@ -349,7 +349,7 @@ one branch, use a `+` in front of the refspec to push (e.g `git push
 origin +master` to force a push to the `master` branch). See the
 `<refspec>...` section above for details.
 
---[no-]force-if-includes::
+`--[no-]force-if-includes`::
 	Force an update only if the tip of the remote-tracking ref
 	has been integrated locally.
 +
@@ -365,40 +365,40 @@ a "no-op".
 +
 Specifying `--no-force-if-includes` disables this behavior.
 
---repo=<repository>::
+`--repo=<repository>`::
 	This option is equivalent to the <repository> argument. If both
 	are specified, the command-line argument takes precedence.
 
--u::
---set-upstream::
+`-u`::
+`--set-upstream`::
 	For every branch that is up to date or successfully pushed, add
 	upstream (tracking) reference, used by argument-less
 	linkgit:git-pull[1] and other commands. For more information,
 	see `branch.<name>.merge` in linkgit:git-config[1].
 
---[no-]thin::
+`--[no-]thin`::
 	These options are passed to linkgit:git-send-pack[1]. A thin transfer
 	significantly reduces the amount of sent data when the sender and
 	receiver share many of the same objects in common. The default is
 	`--thin`.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Suppress all output, including the listing of updated refs,
 	unless an error occurs. Progress is not reported to the standard
 	error stream.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Run verbosely.
 
---progress::
+`--progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless -q
 	is specified. This flag forces progress status even if the
 	standard error stream is not directed to a terminal.
 
---no-recurse-submodules::
+`--no-recurse-submodules`::
 --recurse-submodules=check|on-demand|only|no::
 	May be used to make sure all submodule commits used by the
 	revisions to be pushed are available on a remote-tracking branch.
@@ -414,7 +414,7 @@ Specifying `--no-force-if-includes` disables this behavior.
 	to override the `push.recurseSubmodules` configuration variable when no
 	submodule recursion is required.
 
---[no-]verify::
+`--[no-]verify`::
 	Toggle the pre-push hook (see linkgit:githooks[5]).  The
 	default is `--verify`, giving the hook a chance to prevent the
 	push.  With `--no-verify`, the hook is bypassed completely.
@@ -452,7 +452,7 @@ If `--porcelain` is used, then each line of the output is of the form:
 The status of up-to-date refs is shown only if `--porcelain` or `--verbose`
 option is used.
 
-flag::
+`flag`::
 	A single character indicating the status of the ref:
 (space);; for a successfully pushed fast-forward;
 `+`;; for a successful forced update;
@@ -461,7 +461,7 @@ flag::
 `!`;; for a ref that was rejected or failed to push; and
 `=`;; for a ref that was up to date and did not need pushing.
 
-summary::
+`summary`::
 	For a successfully pushed ref, the summary shows the old and new
 	values of the ref in a form suitable for using as an argument to
 	`git log` (this is `<old>..<new>` in most cases, and
@@ -470,7 +470,7 @@ summary::
 For a failed update, more details are given:
 +
 --
-rejected::
+`rejected`::
 	Git did not try to send the ref at all, typically because it
 	is not a fast-forward and you did not force the update.
 
@@ -489,16 +489,16 @@ remote failure::
 	break in the network connection, or other transient error.
 --
 
-from::
+`from`::
 	The name of the local ref being pushed, minus its
 	`refs/<type>/` prefix. In the case of deletion, the
 	name of the local ref is omitted.
 
-to::
+`to`::
 	The name of the remote ref being updated, minus its
 	`refs/<type>/` prefix.
 
-reason::
+`reason`::
 	A human-readable explanation. In the case of successfully pushed
 	refs, no explanation is needed. For a failed ref, the reason for
 	failure is described.
diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt
index 831bf55ed8..c3ec9efe38 100644
--- a/Documentation/git-quiltimport.txt
+++ b/Documentation/git-quiltimport.txt
@@ -31,8 +31,8 @@ preserved as the 1 line subject in the Git description.
 OPTIONS
 -------
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Walk through the patches in the series and warn
 	if we cannot find all of the necessary information to commit
 	a patch.  At the time of this writing only missing author
@@ -56,7 +56,7 @@ The default for the series file is <patches>/series
 or the value of the `$QUILT_SERIES` environment
 variable.
 
---keep-non-patch::
+`--keep-non-patch`::
 	Pass `-b` flag to `git mailinfo` (see linkgit:git-mailinfo[1]).
 
 GIT
diff --git a/Documentation/git-range-diff.txt b/Documentation/git-range-diff.txt
index 2de9ca2d08..8703bef8ef 100644
--- a/Documentation/git-range-diff.txt
+++ b/Documentation/git-range-diff.txt
@@ -43,7 +43,7 @@ There are three ways to specify the commit ranges:
 
 OPTIONS
 -------
---no-dual-color::
+`--no-dual-color`::
 	When the commit diffs differ, `git range-diff` recreates the
 	original diffs' coloring, and adds outer -/+ diff markers with
 	the *background* being red/green to make it easier to see e.g.
@@ -61,7 +61,7 @@ This is known to `range-diff` as "dual coloring". Use `--no-dual-color`
 to revert to color all lines according to the outer diff markers
 (and completely ignore the inner diff when it comes to color).
 
---creation-factor=<percent>::
+`--creation-factor=<percent>`::
 	Set the creation/deletion cost fudge factor to `<percent>`.
 	Defaults to 60. Try a larger value if `git range-diff` erroneously
 	considers a large change a total rewrite (deletion of one commit
@@ -69,15 +69,15 @@ to revert to color all lines according to the outer diff markers
 	See the ``Algorithm`` section below for an explanation why this is
 	needed.
 
---left-only::
+`--left-only`::
 	Suppress commits that are missing from the first specified range
 	(or the "left range" when using the `<rev1>...<rev2>` format).
 
---right-only::
+`--right-only`::
 	Suppress commits that are missing from the second specified range
 	(or the "right range" when using the `<rev1>...<rev2>` format).
 
---[no-]notes[=<ref>]::
+`--[no-]notes[=<ref>]`::
 	This flag is passed to the `git log` program
 	(see linkgit:git-log[1]) that generates the patches.
 
diff --git a/Documentation/git-read-tree.txt b/Documentation/git-read-tree.txt
index 2b2bd665e0..e242a2553a 100644
--- a/Documentation/git-read-tree.txt
+++ b/Documentation/git-read-tree.txt
@@ -31,22 +31,22 @@ will be in unmerged state when `git read-tree` returns.
 
 OPTIONS
 -------
--m::
+`-m`::
 	Perform a merge, not just a read.  The command will
 	refuse to run if your index file has unmerged entries,
 	indicating that you have not finished previous merge you
 	started.
 
---reset::
+`--reset`::
 	Same as `-m`, except that unmerged entries are discarded instead
 	of failing. When used with `-u`, updates leading to loss of
 	working tree changes will not abort the operation.
 
--u::
+`-u`::
 	After a successful merge, update the files in the work
 	tree with the result of the merge.
 
--i::
+`-i`::
 	Usually a merge requires the index file as well as the
 	files in the working tree to be up to date with the
 	current head commit, in order not to lose local
@@ -55,21 +55,21 @@ OPTIONS
 	trees that are not directly related to the current
 	working tree status into a temporary index file.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Check if the command would error out, without updating the index
 	or the files in the working tree for real.
 
--v::
+`-v`::
 	Show the progress of checking files out.
 
---trivial::
+`--trivial`::
 	Restrict three-way merge by `git read-tree` to happen
 	only if there is no file-level merging required, instead
 	of resolving merge for trivial cases and leaving
 	conflicting files unresolved in the index.
 
---aggressive::
+`--aggressive`::
 	Usually a three-way merge by `git read-tree` resolves
 	the merge for really trivial cases and leaves other
 	cases unresolved in the index, so that porcelains can
@@ -82,13 +82,13 @@ OPTIONS
 * when both sides add a path identically.  The resolution
   is to add that path.
 
---prefix=<prefix>::
+`--prefix=<prefix>`::
 	Keep the current index contents, and read the contents
 	of the named tree-ish under the directory at `<prefix>`.
 	The command will refuse to overwrite entries that already
 	existed in the original index file.
 
---exclude-per-directory=<gitignore>::
+`--exclude-per-directory=<gitignore>`::
 	When running the command with `-u` and `-m` options, the
 	merge result may need to overwrite paths that are not
 	tracked in the current branch.  The command usually
@@ -103,7 +103,7 @@ OPTIONS
 	file (usually '.gitignore') and allows such an untracked
 	but explicitly ignored file to be overwritten.
 
---index-output=<file>::
+`--index-output=<file>`::
 	Instead of writing the results out to `$GIT_INDEX_FILE`,
 	write the resulting index in the named file.  While the
 	command is operating, the original index file is locked
@@ -115,22 +115,22 @@ OPTIONS
 	directories the index file and index output file are
 	located in.
 
---[no-]recurse-submodules::
+`--[no-]recurse-submodules`::
 	Using `--recurse-submodules` will update the content of all active
 	submodules according to the commit recorded in the superproject by
 	calling read-tree recursively, also setting the submodules' `HEAD` to be
 	detached at that commit.
 
---no-sparse-checkout::
+`--no-sparse-checkout`::
 	Disable sparse checkout support even if `core.sparseCheckout`
 	is true.
 
---empty::
+`--empty`::
 	Instead of reading tree object(s) into the index, just empty
 	it.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Quiet, suppress feedback messages.
 
 <tree-ish#>::
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 1c5eaf8cf7..f32ffaa011 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -218,7 +218,7 @@ As a special case, you may use "A\...B" as a shortcut for the
 merge base of A and B if there is exactly one merge base. You can
 leave out at most one of A and B, in which case it defaults to `HEAD`.
 
---keep-base::
+`--keep-base`::
 	Set the starting point at which to create the new commits to the
 	merge base of <upstream> <branch>. Running
 	`git rebase --keep-base <upstream> <branch>` is equivalent to
@@ -236,31 +236,31 @@ the merge base to determine the _set of commits_ which will be rebased.
 +
 See also INCOMPATIBLE OPTIONS below.
 
-<upstream>::
+`<upstream>`::
 	Upstream branch to compare against.  May be any valid commit,
 	not just an existing branch name. Defaults to the configured
 	upstream for the current branch.
 
-<branch>::
+`<branch>`::
 	Working branch; defaults to `HEAD`.
 
---continue::
+`--continue`::
 	Restart the rebasing process after having resolved a merge conflict.
 
---abort::
+`--abort`::
 	Abort the rebase operation and reset `HEAD` to the original
 	branch. If <branch> was provided when the rebase operation was
 	started, then `HEAD` will be reset to <branch>. Otherwise `HEAD`
 	will be reset to where it was when the rebase operation was
 	started.
 
---quit::
+`--quit`::
 	Abort the rebase operation but `HEAD` is not reset back to the
 	original branch. The index and working tree are also left
 	unchanged as a result. If a temporary stash entry was created
 	using `--autostash`, it will be saved to the stash list.
 
---apply::
+`--apply`::
 	Use applying strategies to rebase (calling `git-am`
 	internally).  This option may become a no-op in the future
 	once the merge backend handles everything the apply one does.
@@ -286,8 +286,8 @@ preliminary step (unless `--reapply-cherry-picks` is passed).
 +
 See also INCOMPATIBLE OPTIONS below.
 
---no-keep-empty::
---keep-empty::
+`--no-keep-empty`::
+`--keep-empty`::
 	Do not keep commits that start empty before the rebase
 	(i.e. that do not change anything from its parent) in the
 	result.  The default is to keep commits which start empty,
@@ -307,8 +307,8 @@ see the `--empty` flag.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---reapply-cherry-picks::
---no-reapply-cherry-picks::
+`--reapply-cherry-picks`::
+`--no-reapply-cherry-picks`::
 	Reapply all clean cherry-picks of any upstream commit instead
 	of preemptively dropping them. (If these commits then become
 	empty after rebasing, because they contain a subset of already
@@ -325,7 +325,7 @@ commits, potentially improving performance.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---allow-empty-message::
+`--allow-empty-message`::
 	No-op.  Rebasing commits with an empty message used to fail
 	and this option would override that behavior, allowing commits
 	with empty messages to be rebased.  Now commits with an empty
@@ -333,19 +333,19 @@ See also INCOMPATIBLE OPTIONS below.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---skip::
+`--skip`::
 	Restart the rebasing process by skipping the current patch.
 
---edit-todo::
+`--edit-todo`::
 	Edit the todo list during an interactive rebase.
 
---show-current-patch::
+`--show-current-patch`::
 	Show the current patch in an interactive rebase or when rebase
 	is stopped because of conflicts. This is the equivalent of
 	`git show REBASE_HEAD`.
 
--m::
---merge::
+`-m`::
+`--merge`::
 	Use merging strategies to rebase.  When the recursive (default) merge
 	strategy is used, this allows rebase to be aware of renames on the
 	upstream side.  This is the default.
@@ -359,7 +359,7 @@ other words, the sides are swapped.
 See also INCOMPATIBLE OPTIONS below.
 
 -s <strategy>::
---strategy=<strategy>::
+`--strategy=<strategy>`::
 	Use the given merge strategy.
 	If there is no `-s` option `git merge-recursive` is used
 	instead.  This implies `--merge`.
@@ -372,7 +372,7 @@ which makes little sense.
 See also INCOMPATIBLE OPTIONS below.
 
 -X <strategy-option>::
---strategy-option=<strategy-option>::
+`--strategy-option=<strategy-option>`::
 	Pass the <strategy-option> through to the merge strategy.
 	This implies `--merge` and, if no strategy has been
 	specified, `-s recursive`.  Note the reversal of 'ours' and
@@ -380,44 +380,44 @@ See also INCOMPATIBLE OPTIONS below.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---rerere-autoupdate::
---no-rerere-autoupdate::
+`--rerere-autoupdate`::
+`--no-rerere-autoupdate`::
 	Allow the rerere mechanism to update the index with the
 	result of auto-conflict resolution if possible.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign commits. The `keyid` argument is optional and
 	defaults to the committer identity; if specified, it must be
 	stuck to the option without a space. `--no-gpg-sign` is useful to
 	countermand both `commit.gpgSign` configuration variable, and
 	earlier `--gpg-sign`.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Be quiet. Implies `--no-stat`.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Be verbose. Implies `--stat`.
 
---stat::
+`--stat`::
 	Show a diffstat of what changed upstream since the last rebase. The
 	diffstat is also controlled by the configuration option `rebase.stat`.
 
--n::
---no-stat::
+`-n`::
+`--no-stat`::
 	Do not show a diffstat as part of the rebase process.
 
---no-verify::
+`--no-verify`::
 	This option bypasses the pre-rebase hook.  See also linkgit:githooks[5].
 
---verify::
+`--verify`::
 	Allows the pre-rebase hook to run, which is the default.  This option can
 	be used to override `--no-verify`.  See also linkgit:githooks[5].
 
--C<n>::
+`-C<n>`::
 	Ensure at least <n> lines of surrounding context match before
 	and after each change.  When fewer lines of surrounding
 	context exist they all must match.  By default no context is
@@ -425,9 +425,9 @@ See also INCOMPATIBLE OPTIONS below.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---no-ff::
---force-rebase::
--f::
+`--no-ff`::
+`--force-rebase`::
+`-f`::
 	Individually replay all rebased commits instead of fast-forwarding
 	over the unchanged ones.  This ensures that the entire history of
 	the rebased branch is composed of new commits.
@@ -438,8 +438,8 @@ successfully without needing to "revert the reversion" (see the
 link:howto/revert-a-faulty-merge.html[revert-a-faulty-merge How-To] for
 details).
 
---fork-point::
---no-fork-point::
+`--fork-point`::
+`--no-fork-point`::
 	Use reflog to find a better common ancestor between <upstream>
 	and <branch> when calculating which commits have been
 	introduced by <branch>.
@@ -459,7 +459,7 @@ with `--keep-base` in order to drop those commits from your branch.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---ignore-whitespace::
+`--ignore-whitespace`::
 	Ignore whitespace differences when trying to reconcile
 differences. Currently, each backend implements an approximation of
 this behavior:
@@ -475,35 +475,35 @@ when merging. Unfortunately, this means that any patch hunks that were
 intended to modify whitespace and nothing else will be dropped, even
 if the other side had no changes that conflicted.
 
---whitespace=<option>::
+`--whitespace=<option>`::
 	This flag is passed to the `git apply` program
 	(see linkgit:git-apply[1]) that applies the patch.
 	Implies `--apply`.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---committer-date-is-author-date::
+`--committer-date-is-author-date`::
 	Instead of using the current time as the committer date, use
 	the author date of the commit being rebased as the committer
 	date. This option implies `--force-rebase`.
 
---ignore-date::
---reset-author-date::
+`--ignore-date`::
+`--reset-author-date`::
 	Instead of using the author date of the original commit, use
 	the current time as the	author date of the rebased commit.  This
 	option implies `--force-rebase`.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---signoff::
+`--signoff`::
 	Add a `Signed-off-by` trailer to all the rebased commits. Note
 	that if `--interactive` is given then only commits marked to be
 	picked, edited or reworded will have the trailer added.
 +
 See also INCOMPATIBLE OPTIONS below.
 
--i::
---interactive::
+`-i`::
+`--interactive`::
 	Make a list of the commits which are about to be rebased.  Let the
 	user edit that list before rebasing.  This mode can also be used to
 	split commits (see SPLITTING COMMITS below).
@@ -514,7 +514,7 @@ have the long commit hash prepended to the format.
 +
 See also INCOMPATIBLE OPTIONS below.
 
--r::
+`-r`::
 --rebase-merges[=(rebase-cousins|no-rebase-cousins)]::
 	By default, a rebase will simply drop merge commits from the todo
 	list, and put the rebased commits into a single, linear branch.
@@ -541,8 +541,8 @@ explicit `exec git merge -s <strategy> [...]` commands.
 +
 See also REBASING MERGES and INCOMPATIBLE OPTIONS below.
 
--p::
---preserve-merges::
+`-p`::
+`--preserve-merges`::
 	[DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
 	instead of flattening the history by replaying commits a merge commit
 	introduces. Merge conflict resolutions or manual amendments to merge
@@ -579,7 +579,7 @@ without an explicit `--interactive`.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---root::
+`--root`::
 	Rebase all commits reachable from <branch>, instead of
 	limiting them with an <upstream>.  This allows you to rebase
 	the root commit(s) on a branch.  When used with `--onto`, it
@@ -591,8 +591,8 @@ See also INCOMPATIBLE OPTIONS below.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---autosquash::
---no-autosquash::
+`--autosquash`::
+`--no-autosquash`::
 	When the commit log message begins with "squash! ..." or "fixup! ..."
 	or "amend! ...", and there is already a commit in the todo list that
 	matches the same `...`, automatically modify the todo list of
@@ -611,16 +611,16 @@ used to override and disable this setting.
 +
 See also INCOMPATIBLE OPTIONS below.
 
---autostash::
---no-autostash::
+`--autostash`::
+`--no-autostash`::
 	Automatically create a temporary stash entry before the operation
 	begins, and apply it after the operation ends.  This means
 	that you can run rebase on a dirty worktree.  However, use
 	with care: the final stash application after a successful
 	rebase might result in non-trivial conflicts.
 
---reschedule-failed-exec::
---no-reschedule-failed-exec::
+`--reschedule-failed-exec`::
+`--no-reschedule-failed-exec`::
 	Automatically reschedule `exec` commands that failed. This only makes
 	sense in interactive mode (or when an `--exec` option was provided).
 
diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt
index c33a577a00..6aca5d9fa2 100644
--- a/Documentation/git-reflog.txt
+++ b/Documentation/git-reflog.txt
@@ -69,15 +69,15 @@ Options for `show`
 Options for `expire`
 ~~~~~~~~~~~~~~~~~~~~
 
---all::
+`--all`::
 	Process the reflogs of all references.
 
---single-worktree::
+`--single-worktree`::
 	By default when `--all` is specified, reflogs from all working
 	trees are processed. This option limits the processing to reflogs
 	from the current working tree only.
 
---expire=<time>::
+`--expire=<time>`::
 	Prune entries older than the specified time. If this option is
 	not specified, the expiration time is taken from the
 	configuration setting `gc.reflogExpire`, which in turn
@@ -85,7 +85,7 @@ Options for `expire`
 	of their age; `--expire=never` turns off pruning of reachable
 	entries (but see `--expire-unreachable`).
 
---expire-unreachable=<time>::
+`--expire-unreachable=<time>`::
 	Prune entries older than `<time>` that are not reachable from
 	the current tip of the branch. If this option is not
 	specified, the expiration time is taken from the configuration
@@ -95,17 +95,17 @@ Options for `expire`
 	turns off early pruning of unreachable entries (but see
 	`--expire`).
 
---updateref::
+`--updateref`::
 	Update the reference to the value of the top reflog entry (i.e.
 	<ref>@\{0\}) if the previous top entry was pruned.  (This
 	option is ignored for symbolic references.)
 
---rewrite::
+`--rewrite`::
 	If a reflog entry's predecessor is pruned, adjust its "old"
 	SHA-1 to be equal to the "new" SHA-1 field of the entry that
 	now precedes it.
 
---stale-fix::
+`--stale-fix`::
 	Prune any reflog entries that point to "broken commits". A
 	broken commit is a commit that is not reachable from any of
 	the reference tips and that refers, directly or indirectly, to
@@ -116,12 +116,12 @@ has the same cost as `git prune`.  It is primarily intended to fix
 corruption caused by garbage collecting using older versions of Git,
 which didn't protect objects referred to by reflogs.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Do not actually prune any entries; just show what would have
 	been pruned.
 
---verbose::
+`--verbose`::
 	Print extra information on screen.
 
 
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 318b2220a2..f2d8f3723d 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -32,8 +32,8 @@ Manage the set of repositories ("remotes") whose branches you track.
 OPTIONS
 -------
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Be a little more verbose and show remote url after name.
 	NOTE: This must be placed between `remote` and subcommand.
 
@@ -44,7 +44,7 @@ COMMANDS
 With no arguments, shows a list of existing remotes.  Several
 subcommands are available to perform operations on the remotes.
 
-'add'::
+`add`::
 
 Add a remote named <name> for the repository at
 <url>.  The command `git fetch <name>` can then be used to create and
@@ -80,7 +80,7 @@ because a fetch would overwrite any local commits.
 When a push mirror is created with `--mirror=push`, then `git push`
 will always behave as if `--mirror` was passed.
 
-'rename'::
+`rename`::
 
 Rename the remote named <old> to <new>. All remote-tracking branches and
 configuration settings for the remote are updated.
@@ -89,13 +89,13 @@ In case <old> and <new> are the same, and <old> is a file under
 `$GIT_DIR/remotes` or `$GIT_DIR/branches`, the remote is converted to
 the configuration file format.
 
-'remove'::
-'rm'::
+`remove`::
+`rm`::
 
 Remove the remote named <name>. All remote-tracking branches and
 configuration settings for the remote are removed.
 
-'set-head'::
+`set-head`::
 
 Sets or deletes the default branch (i.e. the target of the
 symbolic-ref `refs/remotes/<name>/HEAD`) for
@@ -120,7 +120,7 @@ remote set-head origin master` will set the symbolic-ref `refs/remotes/origin/HE
 `refs/remotes/origin/master` already exists; if not it must be fetched first.
 +
 
-'set-branches'::
+`set-branches`::
 
 Changes the list of branches tracked by the named remote.
 This can be used to track a subset of the available remote branches
@@ -132,7 +132,7 @@ The named branches will be interpreted as if specified with the
 With `--add`, instead of replacing the list of currently tracked
 branches, adds to that list.
 
-'get-url'::
+`get-url`::
 
 Retrieves the URLs for a remote. Configurations for `insteadOf` and
 `pushInsteadOf` are expanded here. By default, only the first URL is listed.
@@ -141,7 +141,7 @@ With `--push`, push URLs are queried rather than fetch URLs.
 +
 With `--all`, all URLs for the remote will be listed.
 
-'set-url'::
+`set-url`::
 
 Changes URLs for the remote. Sets first URL for remote <name> that matches
 regex <oldurl> (first URL if no <oldurl> is given) to <newurl>. If
@@ -163,14 +163,14 @@ fetch from one place (e.g. your upstream) and push to another (e.g.
 your publishing repository), use two separate remotes.
 
 
-'show'::
+`show`::
 
 Gives some information about the remote <name>.
 +
 With `-n` option, the remote heads are not queried first with
 `git ls-remote <name>`; cached information is used instead.
 
-'prune'::
+`prune`::
 
 Deletes stale references associated with <name>. By default, stale
 remote-tracking branches under <name> are deleted, but depending on
@@ -184,7 +184,7 @@ depending on various configuration.
 With `--dry-run` option, report what branches would be pruned, but do not
 actually prune them.
 
-'update'::
+`update`::
 
 Fetch updates for remotes or remote groups in the repository as defined by
 `remotes.<group>`. If neither group nor remote is specified on the command line,
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index c99a70e426..864196273b 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -28,7 +28,7 @@ engines, disk storage, etc.
 OPTIONS
 -------
 
--a::
+`-a`::
 	Instead of incrementally packing the unpacked objects,
 	pack everything referenced into a single pack.
 	Especially useful when packing a repository that is used
@@ -46,7 +46,7 @@ have an associated ".promisor" file, these packfiles will be repacked
 into another separate pack, and an empty ".promisor" file corresponding
 to the new separate pack will be written.
 
--A::
+`-A`::
 	Same as `-a`, unless `-d` is used.  Then any unreachable
 	objects in a previous pack become loose, unpacked objects,
 	instead of being left in the old pack.  Unreachable objects
@@ -57,37 +57,37 @@ to the new separate pack will be written.
 	will be pruned according to normal expiry rules
 	with the next `git gc` invocation. See linkgit:git-gc[1].
 
--d::
+`-d`::
 	After packing, if the newly created packs make some
 	existing packs redundant, remove the redundant packs.
 	Also run  `git prune-packed` to remove redundant
 	loose object files.
 
--l::
+`-l`::
 	Pass the `--local` option to `git pack-objects`. See
 	linkgit:git-pack-objects[1].
 
--f::
+`-f`::
 	Pass the `--no-reuse-delta` option to `git-pack-objects`, see
 	linkgit:git-pack-objects[1].
 
--F::
+`-F`::
 	Pass the `--no-reuse-object` option to `git-pack-objects`, see
 	linkgit:git-pack-objects[1].
 
--q::
+`-q`::
 	Pass the `-q` option to `git pack-objects`. See
 	linkgit:git-pack-objects[1].
 
--n::
+`-n`::
 	Do not update the server information with
 	`git update-server-info`.  This option skips
 	updating local catalog files needed to publish
 	this repository (or a direct copy of it)
 	over HTTP or FTP.  See linkgit:git-update-server-info[1].
 
---window=<n>::
---depth=<n>::
+`--window=<n>`::
+`--depth=<n>`::
 	These two options affect how the objects contained in the pack are
 	stored using delta compression. The objects are first internally
 	sorted by type, size and optionally names and compared against the
@@ -99,10 +99,10 @@ to the new separate pack will be written.
 The default value for `--window` is 10 and `--depth` is 50. The maximum
 depth is 4095.
 
---threads=<n>::
+`--threads=<n>`::
 	This option is passed through to `git pack-objects`.
 
---window-memory=<n>::
+`--window-memory=<n>`::
 	This option provides an additional limit on top of `--window`;
 	the window size will dynamically scale down so as to not take
 	up more than '<n>' bytes in memory.  This is useful in
@@ -115,7 +115,7 @@ depth is 4095.
 	Note that the actual memory usage will be the limit multiplied
 	by the number of threads used by linkgit:git-pack-objects[1].
 
---max-pack-size=<n>::
+`--max-pack-size=<n>`::
 	Maximum size of each output pack file. The size can be suffixed with
 	"k", "m", or "g". The minimum size allowed is limited to 1 MiB.
 	If specified, multiple packfiles may be created, which also
@@ -123,15 +123,15 @@ depth is 4095.
 	The default is unlimited, unless the config variable
 	`pack.packSizeLimit` is set.
 
--b::
---write-bitmap-index::
+`-b`::
+`--write-bitmap-index`::
 	Write a reachability bitmap index as part of the repack. This
 	only makes sense when used with `-a` or `-A`, as the bitmaps
 	must be able to refer to all reachable objects. This option
 	overrides the setting of `repack.writeBitmaps`.  This option
 	has no effect if multiple packfiles are created.
 
---pack-kept-objects::
+`--pack-kept-objects`::
 	Include objects in `.keep` files when repacking.  Note that we
 	still do not delete `.keep` packs after `pack-objects` finishes.
 	This means that we may duplicate objects, but this makes the
@@ -140,33 +140,33 @@ depth is 4095.
 	with `-b` or `repack.writeBitmaps`, as it ensures that the
 	bitmapped packfile has the necessary objects.
 
---keep-pack=<pack-name>::
+`--keep-pack=<pack-name>`::
 	Exclude the given pack from repacking. This is the equivalent
 	of having `.keep` file on the pack. `<pack-name>` is the
 	pack file name without leading directory (e.g. `pack-123.pack`).
 	The option could be specified multiple times to keep multiple
 	packs.
 
---unpack-unreachable=<when>::
+`--unpack-unreachable=<when>`::
 	When loosening unreachable objects, do not bother loosening any
 	objects older than `<when>`. This can be used to optimize out
 	the write of any objects that would be immediately pruned by
 	a follow-up `git prune`.
 
--k::
---keep-unreachable::
+`-k`::
+`--keep-unreachable`::
 	When used with `-ad`, any unreachable objects from existing
 	packs will be appended to the end of the packfile instead of
 	being removed. In addition, any unreachable loose objects will
 	be packed (and their loose counterparts removed).
 
--i::
---delta-islands::
+`-i`::
+`--delta-islands`::
 	Pass the `--delta-islands` option to `git-pack-objects`, see
 	linkgit:git-pack-objects[1].
 
--g=<factor>::
---geometric=<factor>::
+`-g=<factor>`::
+`--geometric=<factor>`::
 	Arrange resulting pack structure so that each successive pack
 	contains at least `<factor>` times the number of objects as the
 	next-largest pack.
diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.txt
index 3da7c4de90..fc6fc6ae6f 100644
--- a/Documentation/git-replace.txt
+++ b/Documentation/git-replace.txt
@@ -57,13 +57,13 @@ achieve the same effect as the `--no-replace-objects` option.
 
 OPTIONS
 -------
--f::
---force::
+`-f`::
+`--force`::
 	If an existing replace ref for the same object exists, it will
 	be overwritten (instead of failing).
 
--d::
---delete::
+`-d`::
+`--delete`::
 	Delete existing replace refs for the given objects.
 
 --edit <object>::
@@ -75,7 +75,7 @@ OPTIONS
 	newly created object. See linkgit:git-var[1] for details about
 	how the editor will be chosen.
 
---raw::
+`--raw`::
 	When editing, provide the raw object contents rather than
 	pretty-printed ones. Currently this only affects trees, which
 	will be shown in their binary form. This is harder to work with,
@@ -91,7 +91,7 @@ OPTIONS
 	commit. Use `--convert-graft-file` to convert a
 	`$GIT_DIR/info/grafts` file and use replace refs instead.
 
---convert-graft-file::
+`--convert-graft-file`::
 	Creates graft commits for all entries in `$GIT_DIR/info/grafts`
 	and deletes that file upon success. The purpose is to help users
 	with transitioning off of the now-deprecated graft file.
@@ -103,7 +103,7 @@ OPTIONS
 	Typing `git replace` without arguments, also lists all replace
 	refs.
 
---format=<format>::
+`--format=<format>`::
 	When listing, use the specified <format>, which can be one of
 	'short', 'medium' and 'long'. When omitted, the format
 	defaults to 'short'.
diff --git a/Documentation/git-request-pull.txt b/Documentation/git-request-pull.txt
index e9e703a814..58b5b5dd08 100644
--- a/Documentation/git-request-pull.txt
+++ b/Documentation/git-request-pull.txt
@@ -26,17 +26,17 @@ the repository named by `<url>`.
 
 OPTIONS
 -------
--p::
+`-p`::
 	Include patch text in the output.
 
-<start>::
+`<start>`::
 	Commit to start at.  This names a commit that is already in
 	the upstream history.
 
-<url>::
+`<url>`::
 	The repository URL to be pulled from.
 
-<end>::
+`<end>`::
 	Commit to end at (defaults to `HEAD`).  This names the commit
 	at the tip of the history you are asking to be pulled.
 +
diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt
index 687b08d56c..2e5e6329a2 100644
--- a/Documentation/git-rerere.txt
+++ b/Documentation/git-rerere.txt
@@ -35,7 +35,7 @@ Normally, `git rerere` is run without arguments or user-intervention.
 However, it has several commands that allow it to interact with
 its working state.
 
-'clear'::
+`clear`::
 
 Reset the metadata used by rerere if a merge resolution is to be
 aborted.  Calling `git am [--skip|--abort]` or `git rebase [--skip|--abort]`
@@ -46,24 +46,24 @@ will automatically invoke this command.
 Reset the conflict resolutions which rerere has recorded for the current
 conflict in <pathspec>.
 
-'diff'::
+`diff`::
 
 Display diffs for the current state of the resolution.  It is
 useful for tracking what has changed while the user is resolving
 conflicts.  Additional arguments are passed directly to the system
 'diff' command installed in PATH.
 
-'status'::
+`status`::
 
 Print paths with conflicts whose merge resolution rerere will record.
 
-'remaining'::
+`remaining`::
 
 Print paths with conflicts that have not been autoresolved by rerere.
 This includes paths whose resolutions cannot be tracked by rerere,
 such as conflicting submodules.
 
-'gc'::
+`gc`::
 
 Prune records of conflicted merges that
 occurred a long time ago.  By default, unresolved conflicts older
diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt
index 58fe574e71..7e44572383 100644
--- a/Documentation/git-reset.txt
+++ b/Documentation/git-reset.txt
@@ -53,13 +53,13 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
 	defaults to `--mixed`. The `<mode>` must be one of the following:
 +
 --
---soft::
+`--soft`::
 	Does not touch the index file or the working tree at all (but
 	resets the head to `<commit>`, just like all modes do). This leaves
 	all your changed files "Changes to be committed", as `git status`
 	would put it.
 
---mixed::
+`--mixed`::
 	Resets the index but not the working tree (i.e., the changed files
 	are preserved but not marked for commit) and reports what has not
 	been updated. This is the default action.
@@ -67,11 +67,11 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
 If `-N` is specified, removed paths are marked as intent-to-add (see
 linkgit:git-add[1]).
 
---hard::
+`--hard`::
 	Resets the index and working tree. Any changes to tracked files in the
 	working tree since `<commit>` are discarded.
 
---merge::
+`--merge`::
 	Resets the index and updates the files in the working tree that are
 	different between `<commit>` and `HEAD`, but keeps those which are
 	different between the index and working tree (i.e. which have changes
@@ -82,13 +82,13 @@ linkgit:git-add[1]).
 In other words, `--merge` does something like a `git read-tree -u -m <commit>`,
 but carries forward unmerged index entries.
 
---keep::
+`--keep`::
 	Resets index entries and updates files in the working tree that are
 	different between `<commit>` and `HEAD`.
 	If a file that is different between `<commit>` and `HEAD` has local
 	changes, reset is aborted.
 
---[no-]recurse-submodules::
+`--[no-]recurse-submodules`::
 	When the working tree is updated, using `--recurse-submodules` will
 	also recursively reset the working tree of all active submodules
 	according to the commit recorded in the superproject, also setting
@@ -102,14 +102,14 @@ between the three commands.
 OPTIONS
 -------
 
--q::
---quiet::
---no-quiet::
+`-q`::
+`--quiet`::
+`--no-quiet`::
 	Be quiet, only report errors. The default behavior is set by the
 	`reset.quiet` config option. `--quiet` and `--no-quiet` will
 	override the default behavior.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	Pathspec is passed in `<file>` instead of commandline args. If
 	`<file>` is exactly `-` then standard input is used. Pathspec
 	elements are separated by LF or CR/LF. Pathspec elements can be
@@ -117,7 +117,7 @@ OPTIONS
 	(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 	global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	Only meaningful with `--pathspec-from-file`. Pathspec elements are
 	separated with NUL character and all other characters are taken
 	literally (including newlines and quotes).
diff --git a/Documentation/git-restore.txt b/Documentation/git-restore.txt
index 19ca46df30..25a7160aab 100644
--- a/Documentation/git-restore.txt
+++ b/Documentation/git-restore.txt
@@ -33,7 +33,7 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
 OPTIONS
 -------
 -s <tree>::
---source=<tree>::
+`--source=<tree>`::
 	Restore the working tree files with the content from the given
 	tree. It is common to specify the source tree by naming a
 	commit, branch or tag associated with it.
@@ -45,8 +45,8 @@ As a special case, you may use `"A...B"` as a shortcut for the
 merge base of `A` and `B` if there is exactly one merge base. You can
 leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
 
--p::
---patch::
+`-p`::
+`--patch`::
 	Interactively select hunks in the difference between the
 	restore source and the restore location. See the ``Interactive
 	Mode'' section of linkgit:git-add[1] to learn how to operate
@@ -55,27 +55,27 @@ leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
 Note that `--patch` can accept no pathspec and will prompt to restore
 all modified paths.
 
--W::
---worktree::
--S::
---staged::
+`-W`::
+`--worktree`::
+`-S`::
+`--staged`::
 	Specify the restore location. If neither option is specified,
 	by default the working tree is restored. Specifying `--staged`
 	will only restore the index. Specifying both restores both.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Quiet, suppress feedback messages. Implies `--no-progress`.
 
---progress::
---no-progress::
+`--progress`::
+`--no-progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless `--quiet`
 	is specified. This flag enables progress reporting even if not
 	attached to a terminal, regardless of `--quiet`.
 
---ours::
---theirs::
+`--ours`::
+`--theirs`::
 	When restoring files in the working tree from the index, use
 	stage #2 ('ours') or #3 ('theirs') for unmerged paths.
 +
@@ -83,33 +83,33 @@ Note that during `git rebase` and `git pull --rebase`, 'ours' and
 'theirs' may appear swapped. See the explanation of the same options
 in linkgit:git-checkout[1] for details.
 
--m::
---merge::
+`-m`::
+`--merge`::
 	When restoring files on the working tree from the index,
 	recreate the conflicted merge in the unmerged paths.
 
---conflict=<style>::
+`--conflict=<style>`::
 	The same as `--merge` option above, but changes the way the
 	conflicting hunks are presented, overriding the
 	`merge.conflictStyle` configuration variable.  Possible values
 	are "merge" (default) and "diff3" (in addition to what is
 	shown by "merge" style, shows the original contents).
 
---ignore-unmerged::
+`--ignore-unmerged`::
 	When restoring files on the working tree from the index, do
 	not abort the operation if there are unmerged entries and
 	neither `--ours`, `--theirs`, `--merge` or `--conflict` is
 	specified. Unmerged paths on the working tree are left alone.
 
---ignore-skip-worktree-bits::
+`--ignore-skip-worktree-bits`::
 	In sparse checkout mode, by default is to only update entries
 	matched by `<pathspec>` and sparse patterns in
 	`$GIT_DIR/info/sparse-checkout`. This option ignores the sparse
 	patterns and unconditionally restores any files in
 	`<pathspec>`.
 
---recurse-submodules::
---no-recurse-submodules::
+`--recurse-submodules`::
+`--no-recurse-submodules`::
 	If `<pathspec>` names an active submodule and the restore location
 	includes the working tree, the submodule will only be updated if
 	this option is given, in which case its working tree will be
@@ -119,14 +119,14 @@ in linkgit:git-checkout[1] for details.
 	not be updated. Just like linkgit:git-checkout[1], this will detach
 	`HEAD` of the submodule.
 
---overlay::
---no-overlay::
+`--overlay`::
+`--no-overlay`::
 	In overlay mode, the command never removes files when
 	restoring. In no-overlay mode, tracked files that do not
 	appear in the `--source` tree are removed, to make them match
 	`<tree>` exactly. The default is no-overlay mode.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	Pathspec is passed in `<file>` instead of commandline args. If
 	`<file>` is exactly `-` then standard input is used. Pathspec
 	elements are separated by LF or CR/LF. Pathspec elements can be
@@ -134,7 +134,7 @@ in linkgit:git-checkout[1] for details.
 	(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 	global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	Only meaningful with `--pathspec-from-file`. Pathspec elements are
 	separated with NUL character and all other characters are taken
 	literally (including newlines and quotes).
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index bbace2dc5e..d84a853018 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -30,10 +30,10 @@ Operation Modes
 
 Each of these options must appear first on the command line.
 
---parseopt::
+`--parseopt`::
 	Use `git rev-parse` in option parsing mode (see PARSEOPT section below).
 
---sq-quote::
+`--sq-quote`::
 	Use `git rev-parse` in shell quoting mode (see SQ-QUOTE
 	section below). In contrast to the `--sq` option below, this
 	mode does only quoting. Nothing else is done to command input.
@@ -41,34 +41,34 @@ Each of these options must appear first on the command line.
 Options for --parseopt
 ~~~~~~~~~~~~~~~~~~~~~~
 
---keep-dashdash::
+`--keep-dashdash`::
 	Only meaningful in `--parseopt` mode. Tells the option parser to echo
 	out the first `--` met instead of skipping it.
 
---stop-at-non-option::
+`--stop-at-non-option`::
 	Only meaningful in `--parseopt` mode.  Lets the option parser stop at
 	the first non-option argument.  This can be used to parse sub-commands
 	that take options themselves.
 
---stuck-long::
+`--stuck-long`::
 	Only meaningful in `--parseopt` mode. Output the options in their
 	long form if available, and with their arguments stuck.
 
 Options for Filtering
 ~~~~~~~~~~~~~~~~~~~~~
 
---revs-only::
+`--revs-only`::
 	Do not output flags and parameters not meant for
 	`git rev-list` command.
 
---no-revs::
+`--no-revs`::
 	Do not output flags and parameters meant for
 	`git rev-list` command.
 
---flags::
+`--flags`::
 	Do not output non-flag parameters.
 
---no-flags::
+`--no-flags`::
 	Do not output flag parameters.
 
 Options for Output
@@ -95,7 +95,7 @@ cd "$(git rev-parse --show-toplevel)"
 eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
 ----
 
---verify::
+`--verify`::
 	Verify that exactly one parameter is provided, and that it
 	can be turned into a raw 20-byte SHA-1 that can be used to
 	access the object database. If so, emit it to the standard
@@ -114,14 +114,14 @@ Note that if you are verifying a name from an untrusted source, it is
 wise to use `--end-of-options` so that the name argument is not mistaken
 for another option.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Only meaningful in `--verify` mode. Do not output an error
 	message if the first argument is not a valid object name;
 	instead exit with non-zero status silently.
 	SHA-1s for valid object names are printed to stdout on success.
 
---sq::
+`--sq`::
 	Usually the output is made one line per flag and
 	parameter.  This option makes output a single line,
 	properly quoted for consumption by shell.  Useful when
@@ -130,13 +130,13 @@ for another option.
 	`git diff-*`). In contrast to the `--sq-quote` option,
 	the command input is still interpreted as usual.
 
---short[=length]::
+`--short[=length]`::
 	Same as `--verify` but shortens the object name to a unique
 	prefix with at least `length` characters. The minimum length
 	is 4, the default is the effective value of the `core.abbrev`
 	configuration variable (see linkgit:git-config[1]).
 
---not::
+`--not`::
 	When showing object names, prefix them with '{caret}' and
 	strip '{caret}' prefix from the object names that already have
 	one.
@@ -146,12 +146,12 @@ for another option.
 	The option `core.warnAmbiguousRefs` is used to select the strict
 	abbreviation mode.
 
---symbolic::
+`--symbolic`::
 	Usually the object names are output in SHA-1 form (with
 	possible '{caret}' prefix); this option makes them output in a
 	form as close to the original input as possible.
 
---symbolic-full-name::
+`--symbolic-full-name`::
 	This is similar to `--symbolic`, but it omits input that
 	are not refs (i.e. branch or tag names; or more
 	explicitly disambiguating "heads/master" form, when you
@@ -162,12 +162,12 @@ for another option.
 Options for Objects
 ~~~~~~~~~~~~~~~~~~~
 
---all::
+`--all`::
 	Show all refs found in `refs/`.
 
---branches[=pattern]::
---tags[=pattern]::
---remotes[=pattern]::
+`--branches[=pattern]`::
+`--tags[=pattern]`::
+`--remotes[=pattern]`::
 	Show all branches, tags, or remote-tracking branches,
 	respectively (i.e., refs found in `refs/heads`,
 	`refs/tags`, or `refs/remotes`, respectively).
@@ -176,14 +176,14 @@ If a `pattern` is given, only refs matching the given shell glob are
 shown.  If the pattern does not contain a globbing character (`?`,
 `*`, or `[`), it is turned into a prefix match by appending `/*`.
 
---glob=pattern::
+`--glob=pattern`::
 	Show all refs matching the shell glob pattern `pattern`. If
 	the pattern does not start with `refs/`, this is automatically
 	prepended.  If the pattern does not contain a globbing
 	character (`?`, `*`, or `[`), it is turned into a prefix
 	match by appending `/*`.
 
---exclude=<glob-pattern>::
+`--exclude=<glob-pattern>`::
 	Do not include refs matching '<glob-pattern>' that the next `--all`,
 	`--branches`, `--tags`, `--remotes`, or `--glob` would otherwise
 	consider. Repetitions of this option accumulate exclusion patterns
@@ -197,7 +197,7 @@ respectively, and they must begin with `refs/` when applied to `--glob`
 or `--all`. If a trailing '/{asterisk}' is intended, it must be given
 explicitly.
 
---disambiguate=<prefix>::
+`--disambiguate=<prefix>`::
 	Show every object whose name begins with the given prefix.
 	The <prefix> must be at least 4 hexadecimal digits long to
 	avoid listing each and every object in the repository by
@@ -206,7 +206,7 @@ explicitly.
 Options for Files
 ~~~~~~~~~~~~~~~~~
 
---local-env-vars::
+`--local-env-vars`::
 	List the GIT_* environment variables that are local to the
 	repository (e.g. GIT_DIR or GIT_WORK_TREE, but not GIT_EDITOR).
 	Only the names of the variables are listed, not their value,
@@ -224,7 +224,7 @@ instance of this option.
 
 The following options are modified by `--path-format`:
 
---git-dir::
+`--git-dir`::
 	Show `$GIT_DIR` if defined. Otherwise show the path to
 	the .git directory. The path shown, when relative, is
 	relative to the current working directory.
@@ -233,7 +233,7 @@ If `$GIT_DIR` is not defined and the current directory
 is not detected to lie in a Git repository or work tree
 print a message to stderr and exit with nonzero status.
 
---git-common-dir::
+`--git-common-dir`::
 	Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
 
 --resolve-git-dir <path>::
@@ -249,46 +249,46 @@ print a message to stderr and exit with nonzero status.
 	`$GIT_OBJECT_DIRECTORY` is set to /foo/bar then `git rev-parse
 	--git-path objects/abc` returns /foo/bar/abc.
 
---show-toplevel::
+`--show-toplevel`::
 	Show the (by default, absolute) path of the top-level directory
 	of the working tree. If there is no working tree, report an error.
 
---show-superproject-working-tree::
+`--show-superproject-working-tree`::
 	Show the absolute path of the root of the superproject's
 	working tree (if exists) that uses the current repository as
 	its submodule.  Outputs nothing if the current repository is
 	not used as a submodule by any project.
 
---shared-index-path::
+`--shared-index-path`::
 	Show the path to the shared index file in split index mode, or
 	empty if not in split-index mode.
 
 The following options are unaffected by `--path-format`:
 
---absolute-git-dir::
+`--absolute-git-dir`::
 	Like `--git-dir`, but its output is always the canonicalized
 	absolute path.
 
---is-inside-git-dir::
+`--is-inside-git-dir`::
 	When the current working directory is below the repository
 	directory print "true", otherwise "false".
 
---is-inside-work-tree::
+`--is-inside-work-tree`::
 	When the current working directory is inside the work tree of the
 	repository print "true", otherwise "false".
 
---is-bare-repository::
+`--is-bare-repository`::
 	When the repository is bare print "true", otherwise "false".
 
---is-shallow-repository::
+`--is-shallow-repository`::
 	When the repository is shallow print "true", otherwise "false".
 
---show-cdup::
+`--show-cdup`::
 	When the command is invoked from a subdirectory, show the
 	path of the top-level directory relative to the current
 	directory (typically a sequence of "../", or an empty string).
 
---show-prefix::
+`--show-prefix`::
 	When the command is invoked from a subdirectory, show the
 	path of the current directory relative to the top-level
 	directory.
@@ -303,13 +303,13 @@ The following options are unaffected by `--path-format`:
 Other Options
 ~~~~~~~~~~~~~
 
---since=datestring::
---after=datestring::
+`--since=datestring`::
+`--after=datestring`::
 	Parse the date string, and output the corresponding
 	`--max-age`= parameter for `git rev-list`.
 
---until=datestring::
---before=datestring::
+`--until=datestring`::
+`--before=datestring`::
 	Parse the date string, and output the corresponding
 	`--min-age`= parameter for `git rev-list`.
 
diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt
index 0ebe45153e..5fde44478f 100644
--- a/Documentation/git-revert.txt
+++ b/Documentation/git-revert.txt
@@ -41,8 +41,8 @@ OPTIONS
 	default, see linkgit:git-rev-list[1] and its `--no-walk`
 	option.
 
--e::
---edit::
+`-e`::
+`--edit`::
 	With this option, `git revert` will let you edit the commit
 	message prior to committing the revert. This is the default if
 	you run the command from a terminal.
@@ -63,19 +63,19 @@ reverted merge.  This may or may not be what you want.
 See the link:howto/revert-a-faulty-merge.html[revert-a-faulty-merge How-To] for
 more details.
 
---no-edit::
+`--no-edit`::
 	With this option, `git revert` will not start the commit
 	message editor.
 
---cleanup=<mode>::
+`--cleanup=<mode>`::
 	This option determines how the commit message will be cleaned up before
 	being passed on to the commit machinery. See linkgit:git-commit[1] for more
 	details. In particular, if the '<mode>' is given a value of `scissors`,
 	scissors will be appended to `MERGE_MSG` before being passed on in the case
 	of a conflict.
 
--n::
---no-commit::
+`-n`::
+`--no-commit`::
 	Usually the command automatically creates some commits with
 	commit log messages stating which commits were
 	reverted.  This flag applies the changes necessary
@@ -88,32 +88,32 @@ more details.
 This is useful when reverting more than one commits'
 effect to your index in a row.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign commits. The `keyid` argument is optional and
 	defaults to the committer identity; if specified, it must be
 	stuck to the option without a space. `--no-gpg-sign` is useful to
 	countermand both `commit.gpgSign` configuration variable, and
 	earlier `--gpg-sign`.
 
--s::
---signoff::
+`-s`::
+`--signoff`::
 	Add a `Signed-off-by` trailer at the end of the commit message.
 	See the signoff option in linkgit:git-commit[1] for more information.
 
---strategy=<strategy>::
+`--strategy=<strategy>`::
 	Use the given merge strategy.  Should only be used once.
 	See the MERGE STRATEGIES section in linkgit:git-merge[1]
 	for details.
 
--X<option>::
---strategy-option=<option>::
+`-X<option>`::
+`--strategy-option=<option>`::
 	Pass the merge strategy-specific option through to the
 	merge strategy.  See linkgit:git-merge[1] for details.
 
---rerere-autoupdate::
---no-rerere-autoupdate::
+`--rerere-autoupdate`::
+`--no-rerere-autoupdate`::
 	Allow the rerere mechanism to update the index with the
 	result of auto-conflict resolution if possible.
 
diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt
index 24eb799d6e..d1f49a0bea 100644
--- a/Documentation/git-rm.txt
+++ b/Documentation/git-rm.txt
@@ -43,17 +43,17 @@ of directory `d2`.
 +
 For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
 
--f::
---force::
+`-f`::
+`--force`::
 	Override the up-to-date check.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	Don't actually remove any file(s).  Instead, just show
 	if they exist in the index and would otherwise be removed
 	by the command.
 
--r::
+`-r`::
         Allow recursive removal when a leading directory name is
         given.
 
@@ -62,20 +62,20 @@ For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
 	the list of files, (useful when filenames might be mistaken
 	for command-line options).
 
---cached::
+`--cached`::
 	Use this option to unstage and remove paths only from the index.
 	Working tree files, whether modified or not, will be
 	left alone.
 
---ignore-unmatch::
+`--ignore-unmatch`::
 	Exit with a zero status even if no files matched.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	`git rm` normally outputs one line (in the form of an `rm` command)
 	for each file removed. This option suppresses that output.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	Pathspec is passed in `<file>` instead of commandline args. If
 	`<file>` is exactly `-` then standard input is used. Pathspec
 	elements are separated by LF or CR/LF. Pathspec elements can be
@@ -83,7 +83,7 @@ For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
 	(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 	global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	Only meaningful with `--pathspec-from-file`. Pathspec elements are
 	separated with NUL character and all other characters are taken
 	literally (including newlines and quotes).
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 9455d4c654..6e96c23492 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -45,7 +45,7 @@ OPTIONS
 Composing
 ~~~~~~~~~
 
---annotate::
+`--annotate`::
 	Review and edit each patch you're about to send. Default is the value
 	of `sendemail.annotate`. See the CONFIGURATION section for
 	`sendemail.multiEdit`.
@@ -62,7 +62,7 @@ This option may be specified multiple times.
 +
 This option may be specified multiple times.
 
---compose::
+`--compose`::
 	Invoke a text editor (see GIT_EDITOR in linkgit:git-var[1])
 	to edit an introductory message for the patch series.
 +
@@ -76,7 +76,7 @@ Missing From or In-Reply-To headers will be prompted for.
 +
 See the CONFIGURATION section for `sendemail.multiEdit`.
 
---from=<address>::
+`--from=<address>`::
 	Specify the sender of the emails.  If not specified on the command line,
 	the value of the `sendemail.from` configuration option is used.  If
 	neither the command-line option nor `sendemail.from` are set, then the
@@ -84,12 +84,12 @@ See the CONFIGURATION section for `sendemail.multiEdit`.
 	the value of GIT_AUTHOR_IDENT, or GIT_COMMITTER_IDENT if that is not
 	set, as returned by `git var -l`.
 
---reply-to=<address>::
+`--reply-to=<address>`::
 	Specify the address where replies from recipients should go to.
 	Use this if replies to messages should go to another address than what
 	is specified with the `--from` parameter.
 
---in-reply-to=<identifier>::
+`--in-reply-to=<identifier>`::
 	Make the first mail (or all the mails with `--no-thread`) appear as a
 	reply to the given Message-Id, which avoids breaking threads to
 	provide a new patch series.
@@ -111,7 +111,7 @@ illustration below where `[PATCH v2 0/3]` is in reply to `[PATCH 0/2]`:
 Only necessary if `--compose` is also set.  If `--compose`
 is not set, this will be prompted for.
 
---subject=<string>::
+`--subject=<string>`::
 	Specify the initial subject of the email thread.
 	Only necessary if `--compose` is also set.  If `--compose`
 	is not set, this will be prompted for.
@@ -133,7 +133,7 @@ This option may be specified multiple times.
 +
 Note that no attempts whatsoever are made to validate the encoding.
 
---compose-encoding=<encoding>::
+`--compose-encoding=<encoding>`::
 	Specify encoding of compose message. Default is the value of the
 	`sendemail.composeencoding`; if that is unspecified, UTF-8 is assumed.
 
@@ -149,8 +149,8 @@ Note that no attempts whatsoever are made to validate the encoding.
 Default is the value of the `sendemail.transferEncoding` configuration
 value; if that is unspecified, default to `auto`.
 
---xmailer::
---no-xmailer::
+`--xmailer`::
+`--no-xmailer`::
 	Add (or prevent adding) the "X-Mailer:" header.  By default,
 	the header is added, but it can be turned off by setting the
 	`sendemail.xmailer` configuration variable to `false`.
@@ -158,7 +158,7 @@ value; if that is unspecified, default to `auto`.
 Sending
 ~~~~~~~
 
---envelope-sender=<address>::
+`--envelope-sender=<address>`::
 	Specify the envelope sender used to send the emails.
 	This is useful if your default address is not the address that is
 	subscribed to a list. In order to use the 'From' address, set the
@@ -167,19 +167,19 @@ Sending
 	`sendemail.envelopeSender` configuration variable; if that is
 	unspecified, choosing the envelope sender is left to your MTA.
 
---smtp-encryption=<encryption>::
+`--smtp-encryption=<encryption>`::
 	Specify the encryption to use, either 'ssl' or 'tls'.  Any other
 	value reverts to plain SMTP.  Default is the value of
 	`sendemail.smtpEncryption`.
 
---smtp-domain=<FQDN>::
+`--smtp-domain=<FQDN>`::
 	Specifies the Fully Qualified Domain Name (FQDN) used in the
 	HELO/EHLO command to the SMTP server.  Some servers require the
 	FQDN to match your IP address.  If not set, `git send-email` attempts
 	to determine your FQDN automatically.  Default is the value of
 	`sendemail.smtpDomain`.
 
---smtp-auth=<mechanisms>::
+`--smtp-auth=<mechanisms>`::
 	Whitespace-separated list of allowed SMTP-AUTH mechanisms. This setting
 	forces using only the listed mechanisms. Example:
 +
@@ -194,7 +194,7 @@ is specified, all mechanisms supported by the SASL library can be used. The
 special value 'none' maybe specified to completely disable authentication
 independently of `--smtp-user`
 
---smtp-pass[=<password>]::
+`--smtp-pass[=<password>]`::
 	Password for SMTP-AUTH. The argument is optional: If no
 	argument is specified, then the empty string is used as
 	the password. Default is the value of `sendemail.smtpPass`,
@@ -206,10 +206,10 @@ or on the command line. If a username has been specified (with
 specified (with `--smtp-pass` or `sendemail.smtpPass`), then
 a password is obtained using `git-credential`.
 
---no-smtp-auth::
+`--no-smtp-auth`::
 	Disable SMTP authentication. Short hand for `--smtp-auth=none`
 
---smtp-server=<host>::
+`--smtp-server=<host>`::
 	If set, specifies the outgoing SMTP server to use (e.g.
 	`smtp.example.com` or a raw IP address).  Alternatively it can
 	specify a full pathname of a sendmail-like program instead;
@@ -219,7 +219,7 @@ a password is obtained using `git-credential`.
 	`/usr/sbin`, `/usr/lib` and `$PATH` if such program is
 	available, falling back to `localhost` otherwise.
 
---smtp-server-port=<port>::
+`--smtp-server-port=<port>`::
 	Specifies a port different from the default port (SMTP
 	servers typically listen to smtp port 25, but may also listen to
 	submission port 587, or the common SSL smtp port 465);
@@ -227,7 +227,7 @@ a password is obtained using `git-credential`.
 	are also accepted. The port can also be set with the
 	`sendemail.smtpServerPort` configuration variable.
 
---smtp-server-option=<option>::
+`--smtp-server-option=<option>`::
 	If set, specifies the outgoing SMTP server option to use.
 	Default value can be specified by the `sendemail.smtpServerOption`
 	configuration option.
@@ -236,10 +236,10 @@ The `--smtp-server-option` option must be repeated for each option you want
 to pass to the server. Likewise, different lines in the configuration files
 must be used for each option.
 
---smtp-ssl::
+`--smtp-ssl`::
 	Legacy alias for `--smtp-encryption ssl`.
 
---smtp-ssl-cert-path::
+`--smtp-ssl-cert-path`::
 	Path to a store of trusted CA certificates for SMTP SSL/TLS
 	certificate validation (either a directory that has been processed
 	by 'c_rehash', or a single file containing one or more PEM format
@@ -250,7 +250,7 @@ must be used for each option.
 	backing SSL library's compiled-in default otherwise (which should
 	be the best choice on most platforms).
 
---smtp-user=<user>::
+`--smtp-user=<user>`::
 	Username for SMTP-AUTH. Default is the value of `sendemail.smtpUser`;
 	if a username is not specified (with `--smtp-user` or `sendemail.smtpUser`),
 	then authentication is not attempted.
@@ -260,7 +260,7 @@ must be used for each option.
 	commands and replies will be printed. Useful to debug TLS
 	connection and authentication problems.
 
---batch-size=<num>::
+`--batch-size=<num>`::
 	Some email servers (e.g. smtp.163.com) limit the number emails to be
 	sent per session (connection) and this will lead to a failure when
 	sending many messages.  With this option, send-email will disconnect after
@@ -270,7 +270,7 @@ must be used for each option.
 	your password every time this happens.  Defaults to the
 	`sendemail.smtpBatchSize` configuration variable.
 
---relogin-delay=<int>::
+`--relogin-delay=<int>`::
 	Waiting $<int> seconds before reconnecting to SMTP server. Used together
 	with `--batch-size` option.  Defaults to the `sendemail.smtpReloginDelay`
 	configuration variable.
@@ -282,23 +282,23 @@ Automating
 	Clears any list of "To:", "Cc:", "Bcc:" addresses previously
 	set via config.
 
---no-identity::
+`--no-identity`::
 	Clears the previously read value of `sendemail.identity` set
 	via config, if any.
 
---to-cmd=<command>::
+`--to-cmd=<command>`::
 	Specify a command to execute once per patch file which
 	should generate patch file specific "To:" entries.
 	Output of this command must be single email address per line.
 	Default is the value of `sendemail.tocmd` configuration value.
 
---cc-cmd=<command>::
+`--cc-cmd=<command>`::
 	Specify a command to execute once per patch file which
 	should generate patch file specific "Cc:" entries.
 	Output of this command must be single email address per line.
 	Default is the value of `sendemail.ccCmd` configuration value.
 
---[no-]chain-reply-to::
+`--[no-]chain-reply-to`::
 	If this is set, each email will be sent as a reply to the previous
 	email sent.  If disabled with `--no-chain-reply-to`, all emails after
 	the first will be sent as replies to the first email sent.  When using
@@ -306,30 +306,30 @@ Automating
 	entire patch series. Disabled by default, but the `sendemail.chainReplyTo`
 	configuration variable can be used to enable it.
 
---identity=<identity>::
+`--identity=<identity>`::
 	A configuration identity. When given, causes values in the
 	`sendemail.<identity>` subsection to take precedence over
 	values in the `sendemail` section. The default identity is
 	the value of `sendemail.identity`.
 
---[no-]signed-off-by-cc::
+`--[no-]signed-off-by-cc`::
 	If this is set, add emails found in the `Signed-off-by` trailer or Cc: lines to the
 	cc list. Default is the value of `sendemail.signedoffbycc` configuration
 	value; if that is unspecified, default to `--signed-off-by-cc`.
 
---[no-]cc-cover::
+`--[no-]cc-cover`::
 	If this is set, emails found in Cc: headers in the first patch of
 	the series (typically the cover letter) are added to the cc list
 	for each email set. Default is the value of `sendemail.cccover`
 	configuration value; if that is unspecified, default to `--no-cc-cover`.
 
---[no-]to-cover::
+`--[no-]to-cover`::
 	If this is set, emails found in To: headers in the first patch of
 	the series (typically the cover letter) are added to the to list
 	for each email set. Default is the value of `sendemail.tocover`
 	configuration value; if that is unspecified, default to `--no-to-cover`.
 
---suppress-cc=<category>::
+`--suppress-cc=<category>`::
 	Specify an additional category of recipients to suppress the
 	auto-cc of:
 +
@@ -354,12 +354,12 @@ Default is the value of `sendemail.suppresscc` configuration value; if
 that is unspecified, default to 'self' if `--suppress-from` is
 specified, as well as 'body' if `--no-signed-off-cc` is specified.
 
---[no-]suppress-from::
+`--[no-]suppress-from`::
 	If this is set, do not add the From: address to the cc: list.
 	Default is the value of `sendemail.suppressFrom` configuration
 	value; if that is unspecified, default to `--no-suppress-from`.
 
---[no-]thread::
+`--[no-]thread`::
 	If this is set, the In-Reply-To and References headers will be
 	added to each email sent.  Whether each mail refers to the
 	previous email (`deep` threading per `git format-patch`
@@ -381,7 +381,7 @@ recipient's MUA.
 Administering
 ~~~~~~~~~~~~~
 
---confirm=<mode>::
+`--confirm=<mode>`::
 	Confirm just before sending:
 +
 --
@@ -397,20 +397,20 @@ Default is the value of `sendemail.confirm` configuration value; if that
 is unspecified, default to 'auto' unless any of the suppress options
 have been specified, in which case default to 'compose'.
 
---dry-run::
+`--dry-run`::
 	Do everything except actually send the emails.
 
---[no-]format-patch::
+`--[no-]format-patch`::
 	When an argument may be understood either as a reference or as a file name,
 	choose to understand it as a format-patch argument (`--format-patch`)
 	or as a file name (`--no-format-patch`). By default, when such a conflict
 	occurs, `git send-email` will fail.
 
---quiet::
+`--quiet`::
 	Make `git-send-email` less verbose.  One line per email should be
 	all that is output.
 
---[no-]validate::
+`--[no-]validate`::
 	Perform sanity checks on patches.
 	Currently, validation means the following:
 +
@@ -426,14 +426,14 @@ have been specified, in which case default to 'compose'.
 Default is the value of `sendemail.validate`; if this is not set,
 default to `--validate`.
 
---force::
+`--force`::
 	Send emails even if safety checks would prevent it.
 
 
 Information
 ~~~~~~~~~~~
 
---dump-aliases::
+`--dump-aliases`::
 	Instead of the normal operation, dump the shorthand alias names from
 	the configured alias file(s), one per line in alphabetical order. Note,
 	this only includes the alias name and not its expanded email addresses.
@@ -457,7 +457,7 @@ differences and limitations from the standard formats are
 described below:
 +
 --
-sendmail;;
+`sendmail`;;
 *	Quoted aliases and quoted addresses are not supported: lines that
 	contain a `"` symbol are ignored.
 *	Redirection to a file (`/path/name`) or pipe (`|command`) is not
diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt
index c0303d72eb..2852d3981b 100644
--- a/Documentation/git-send-pack.txt
+++ b/Documentation/git-send-pack.txt
@@ -25,20 +25,20 @@ updates it from the current repository, sending named refs.
 
 OPTIONS
 -------
---receive-pack=<git-receive-pack>::
+`--receive-pack=<git-receive-pack>`::
 	Path to the `git-receive-pack` program on the remote
 	end.  Sometimes useful when pushing to a remote
 	repository over ssh, and you do not have the program in
 	a directory on the default `$PATH`.
 
---exec=<git-receive-pack>::
+`--exec=<git-receive-pack>`::
 	Same as `--receive-pack`=<git-receive-pack>.
 
---all::
+`--all`::
 	Instead of explicitly specifying which refs to update,
 	update all heads that locally exist.
 
---stdin::
+`--stdin`::
 	Take the list of refs from stdin, one per line. If there
 	are refs specified on the command line in addition to this
 	option, then the refs from stdin are processed after those
@@ -48,29 +48,29 @@ If `--stateless-rpc` is specified together with this option then
 the list of refs must be in packet format (pkt-line). Each ref must
 be in a separate packet, and the list must end with a flush packet.
 
---dry-run::
+`--dry-run`::
 	Do everything except actually send the updates.
 
---force::
+`--force`::
 	Usually, the command refuses to update a remote ref that
 	is not an ancestor of the local ref used to overwrite it.
 	This flag disables the check.  What this means is that
 	the remote repository can lose commits; use it with
 	care.
 
---verbose::
+`--verbose`::
 	Run verbosely.
 
---thin::
+`--thin`::
 	Send a "thin" pack, which records objects in deltified form based
 	on objects not included in the pack to reduce network traffic.
 
---atomic::
+`--atomic`::
 	Use an atomic transaction for updating the refs. If any of the refs
 	fails to update then the entire push will fail without changing any
 	refs.
 
---[no-]signed::
+`--[no-]signed`::
 --signed=(true|false|if-asked)::
 	GPG-sign the push request to update refs on the receiving
 	side, to allow it to be checked by the hooks and/or be
@@ -81,18 +81,18 @@ be in a separate packet, and the list must end with a flush packet.
 	will also fail if the actual call to `gpg --sign` fails.  See
 	linkgit:git-receive-pack[1] for the details on the receiving end.
 
---push-option=<string>::
+`--push-option=<string>`::
 	Pass the specified string as a push option for consumption by
 	hooks on the server side.  If the server doesn't support push
 	options, error out.  See linkgit:git-push[1] and
 	linkgit:githooks[5] for details.
 
-<host>::
+`<host>`::
 	A remote host to house the repository.  When this
 	part is specified, `git-receive-pack` is invoked via
 	ssh.
 
-<directory>::
+`<directory>`::
 	The repository to update.
 
 <ref>...::
diff --git a/Documentation/git-sh-i18n.txt b/Documentation/git-sh-i18n.txt
index 23c504bbd8..ea8fc781e8 100644
--- a/Documentation/git-sh-i18n.txt
+++ b/Documentation/git-sh-i18n.txt
@@ -27,7 +27,7 @@ without GNU gettext.
 FUNCTIONS
 ---------
 
-gettext::
+`gettext`::
 	Currently a dummy fall-through function implemented as a wrapper
 	around `printf(1)`. Will be replaced by a real gettext
 	implementation in a later version.
diff --git a/Documentation/git-sh-setup.txt b/Documentation/git-sh-setup.txt
index ed33a46a77..d1e999d60e 100644
--- a/Documentation/git-sh-setup.txt
+++ b/Documentation/git-sh-setup.txt
@@ -33,11 +33,11 @@ variables, but does *not* export them to the environment.
 FUNCTIONS
 ---------
 
-die::
+`die`::
 	exit after emitting the supplied error message to the
 	standard error stream.
 
-usage::
+`usage`::
 	die with the usage message.
 
 set_reflog_action::
diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt
index d9226b63da..c3f6997d2e 100644
--- a/Documentation/git-shortlog.txt
+++ b/Documentation/git-shortlog.txt
@@ -26,20 +26,20 @@ reference to the current repository.
 OPTIONS
 -------
 
--n::
---numbered::
+`-n`::
+`--numbered`::
 	Sort output according to the number of commits per author instead
 	of author alphabetic order.
 
--s::
---summary::
+`-s`::
+`--summary`::
 	Suppress commit description and provide a commit count summary only.
 
--e::
---email::
+`-e`::
+`--email`::
 	Show the email address of each author.
 
---format[=<format>]::
+`--format[=<format>]`::
 	Instead of the commit subject, use some other information to
 	describe each commit.  '<format>' can be any string accepted
 	by the `--format` option of `git log`, such as '* [%h] %s'.
@@ -47,7 +47,7 @@ OPTIONS
 
 	Each pretty-printed commit will be rewrapped before it is shown.
 
---group=<type>::
+`--group=<type>`::
 	Group commits based on `<type>`. If no `--group` option is
 	specified, the default is `author`. `<type>` is one of:
 +
@@ -76,8 +76,8 @@ value (but again, only once per unique value in that commit). For
 example, `git shortlog --group=author --group=trailer:co-authored-by`
 counts both authors and co-authors.
 
--c::
---committer::
+`-c`::
+`--committer`::
 	This is an alias for `--group=committer`.
 
 -w[<width>[,<indent1>[,<indent2>]]]::
diff --git a/Documentation/git-show-branch.txt b/Documentation/git-show-branch.txt
index 79f65ce0aa..017390e1ed 100644
--- a/Documentation/git-show-branch.txt
+++ b/Documentation/git-show-branch.txt
@@ -30,46 +30,46 @@ no <rev> or <glob> is given on the command line.
 
 OPTIONS
 -------
-<rev>::
+`<rev>`::
 	Arbitrary extended SHA-1 expression (see linkgit:gitrevisions[7])
 	that typically names a branch head or a tag.
 
-<glob>::
+`<glob>`::
 	A glob pattern that matches branch or tag names under
 	refs/.  For example, if you have many topic
 	branches under refs/heads/topic, giving
 	`topic/*` would show all of them.
 
--r::
---remotes::
+`-r`::
+`--remotes`::
 	Show the remote-tracking branches.
 
--a::
---all::
+`-a`::
+`--all`::
 	Show both remote-tracking branches and local branches.
 
---current::
+`--current`::
 	With this option, the command includes the current
 	branch to the list of revs to be shown when it is not
 	given on the command line.
 
---topo-order::
+`--topo-order`::
         By default, the branches and their commits are shown in
         reverse chronological order.  This option makes them
         appear in topological order (i.e., descendant commits
         are shown before their parents).
 
---date-order::
+`--date-order`::
 	This option is similar to `--topo-order` in the sense that no
 	parent comes before all of its children, but otherwise commits
 	are ordered according to their commit date.
 
---sparse::
+`--sparse`::
 	By default, the output omits merges that are reachable
 	from only one tip being shown.  This option makes them
 	visible.
 
---more=<n>::
+`--more=<n>`::
 	Usually the command stops output upon showing the commit
 	that is the common ancestor of all the branches.  This
 	flag tells the command to go <n> more common commits
@@ -77,21 +77,21 @@ OPTIONS
 	<reference>s given, without showing the commit ancestry
 	tree.
 
---list::
+`--list`::
 	Synonym to `--more=-1`
 
---merge-base::
+`--merge-base`::
 	Instead of showing the commit list, determine possible
 	merge bases for the specified commits. All merge bases
 	will be contained in all specified commits. This is
 	different from how linkgit:git-merge-base[1] handles
 	the case of three or more commits.
 
---independent::
+`--independent`::
 	Among the <reference>s given, display only the ones that
 	cannot be reached from any other <reference>.
 
---no-name::
+`--no-name`::
 	Do not show naming strings for each commit.
 
 --sha1-name::
@@ -100,7 +100,7 @@ OPTIONS
 	of "master"), name them with the unique prefix of their
 	object names.
 
---topics::
+`--topics`::
 	Shows only commits that are NOT on the first branch given.
 	This helps track topic branches by hiding any commit that
 	is already in the main line of development.  When given
@@ -108,7 +108,7 @@ OPTIONS
 	will show the revisions given by `git rev-list {caret}master
 	topic1 topic2`
 
--g::
+`-g`::
 --reflog[=<n>[,<base>]] [<ref>]::
 	Shows <n> most recent ref-log entries for the given
 	ref.  If <base> is given, <n> entries going back from
@@ -116,12 +116,12 @@ OPTIONS
 	When no explicit <ref> parameter is given, it defaults to the
 	current branch (or `HEAD` if it is detached).
 
---color[=<when>]::
+`--color[=<when>]`::
 	Color the status sign (one of these: `*` `!` `+` `-`) of each commit
 	corresponding to the branch it's in.
 	The value must be always (the default), never, or auto.
 
---no-color::
+`--no-color`::
 	Turn off colored output, even when the configuration file gives the
 	default to color output.
 	Same as `--color=never`.
diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt
index 2a3699cb7f..3d8e1f455b 100644
--- a/Documentation/git-show-ref.txt
+++ b/Documentation/git-show-ref.txt
@@ -33,47 +33,47 @@ the `.git` directory.
 OPTIONS
 -------
 
---head::
+`--head`::
 
 	Show the `HEAD` reference, even if it would normally be filtered out.
 
---heads::
---tags::
+`--heads`::
+`--tags`::
 
 	Limit to `refs/heads` and `refs/tags`, respectively.  These options
 	are not mutually exclusive; when given both, references stored in
 	`refs/heads` and `refs/tags` are displayed.
 
--d::
---dereference::
+`-d`::
+`--dereference`::
 
 	Dereference tags into object IDs as well. They will be shown with "{caret}{}"
 	appended.
 
--s::
---hash[=<n>]::
+`-s`::
+`--hash[=<n>]`::
 
 	Only show the SHA-1 hash, not the reference name. When combined with
 	`--dereference` the dereferenced tag will still be shown after the SHA-1.
 
---verify::
+`--verify`::
 
 	Enable stricter reference checking by requiring an exact ref path.
 	Aside from returning an error code of 1, it will also print an error
 	message if `--quiet` was not specified.
 
---abbrev[=<n>]::
+`--abbrev[=<n>]`::
 
 	Abbreviate the object name.  When using `--hash`, you do
 	not have to say `--hash --abbrev`; `--hash=n` would do.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 
 	Do not print any results to stdout. When combined with `--verify` this
 	can be used to silently check if a reference exists.
 
---exclude-existing[=<pattern>]::
+`--exclude-existing[=<pattern>]`::
 
 	Make `git show-ref` act as a filter that reads refs from stdin of the
 	form "`^(?:<anything>\s)?<refname>(?:\^{})?$`"
diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.txt
index efadc656e8..1655282b58 100644
--- a/Documentation/git-sparse-checkout.txt
+++ b/Documentation/git-sparse-checkout.txt
@@ -27,10 +27,10 @@ THE FUTURE.
 
 COMMANDS
 --------
-'list'::
+`list`::
 	Describe the patterns in the sparse-checkout file.
 
-'init'::
+`init`::
 	Enable the `core.sparseCheckout` setting. If the
 	sparse-checkout file does not exist, then populate it with
 	patterns that match every file in the root directory and
@@ -46,7 +46,7 @@ When `--cone` is provided, the `core.sparseCheckoutCone` setting is
 also set, allowing for better performance with a limited set of
 patterns (see 'CONE PATTERN SET' below).
 
-'set'::
+`set`::
 	Write a set of patterns to the sparse-checkout file, as given as
 	a list of arguments following the 'set' subcommand. Update the
 	working directory to match the new patterns. Enable the
@@ -63,14 +63,14 @@ directories. The input format matches the output of `git ls-tree --name-only`.
 This includes interpreting pathnames that begin with a double quote (") as
 C-style quoted strings.
 
-'add'::
+`add`::
 	Update the sparse-checkout file to include additional patterns.
 	By default, these patterns are read from the command-line arguments,
 	but they can be read from stdin using the `--stdin` option. When
 	`core.sparseCheckoutCone` is enabled, the given patterns are interpreted
 	as directory names as in the 'set' subcommand.
 
-'reapply'::
+`reapply`::
 	Reapply the sparsity pattern rules to paths in the working tree.
 	Commands like merge or rebase can materialize paths to do their
 	work (e.g. in order to show you a conflict), and other
@@ -80,7 +80,7 @@ C-style quoted strings.
 	after cleaning up affected paths (e.g. resolving conflicts, undoing
 	or committing changes, etc.).
 
-'disable'::
+`disable`::
 	Disable the `core.sparseCheckout` config setting, and restore the
 	working directory to include all files. Leaves the sparse-checkout
 	file intact so a later `git sparse-checkout init` command may
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index 142e5f3751..974b16963c 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -125,7 +125,7 @@ the stash entry is applied on top of the commit that was `HEAD` at the
 time `git stash` was run, it restores the originally stashed state
 with no conflicts.
 
-clear::
+`clear`::
 	Remove all the stash entries. Note that those entries will then
 	be subject to pruning, and may be impossible to recover (see
 	'Examples' below for a possible strategy).
@@ -134,7 +134,7 @@ drop [-q|--quiet] [<stash>]::
 
 	Remove a single stash entry from the list of stash entries.
 
-create::
+`create`::
 
 	Create a stash entry (which is a regular commit object) and
 	return its object name, without storing it anywhere in the ref
@@ -142,7 +142,7 @@ create::
 	This is intended to be useful for scripts.  It is probably not
 	the command you want to use; see "push" above.
 
-store::
+`store`::
 
 	Store a given stash created via `git stash create` (which is a
 	dangling merge commit) in the stash ref, updating the stash
@@ -151,16 +151,16 @@ store::
 
 OPTIONS
 -------
--a::
---all::
+`-a`::
+`--all`::
 	This option is only valid for `push` and `save` commands.
 +
 All ignored and untracked files are also stashed and then cleaned
 up with `git clean`.
 
--u::
---include-untracked::
---no-include-untracked::
+`-u`::
+`--include-untracked`::
+`--no-include-untracked`::
 	When used with the `push` and `save` commands,
 	all untracked files are also stashed and then cleaned up with
 	`git clean`.
@@ -168,12 +168,12 @@ up with `git clean`.
 When used with the `show` command, show the untracked files in the stash
 entry as part of the diff.
 
---only-untracked::
+`--only-untracked`::
 	This option is only valid for the `show` command.
 +
 Show only the untracked files in the stash entry as part of the diff.
 
---index::
+`--index`::
 	This option is only valid for `pop` and `apply` commands.
 +
 Tries to reinstate not only the working tree's changes, but also
@@ -181,15 +181,15 @@ the index's ones. However, this can fail, when you have conflicts
 (which are stored in the index, where you therefore can no longer
 apply the changes as they were originally).
 
--k::
---keep-index::
---no-keep-index::
+`-k`::
+`--keep-index`::
+`--no-keep-index`::
 	This option is only valid for `push` and `save` commands.
 +
 All changes already added to the index are left intact.
 
--p::
---patch::
+`-p`::
+`--patch`::
 	This option is only valid for `push` and `save` commands.
 +
 Interactively select hunks from the diff between `HEAD` and the
@@ -203,7 +203,7 @@ to learn how to operate the `--patch` mode.
 The `--patch` option implies `--keep-index`.  You can use
 `--no-keep-index` to override this.
 
---pathspec-from-file=<file>::
+`--pathspec-from-file=<file>`::
 	This option is only valid for `push` command.
 +
 Pathspec is passed in `<file>` instead of commandline args. If
@@ -213,15 +213,15 @@ quoted as explained for the configuration variable `core.quotePath`
 (see linkgit:git-config[1]). See also `--pathspec-file-nul` and
 global `--literal-pathspecs`.
 
---pathspec-file-nul::
+`--pathspec-file-nul`::
 	This option is only valid for `push` command.
 +
 Only meaningful with `--pathspec-from-file`. Pathspec elements are
 separated with NUL character and all other characters are taken
 literally (including newlines and quotes).
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	This option is only valid for `apply`, `drop`, `pop`, `push`,
 	`save`, `store` commands.
 +
@@ -242,7 +242,7 @@ too, leaving files that do not match the pathspec intact.
 +
 For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
 
-<stash>::
+`<stash>`::
 	This option is only valid for `apply`, `branch`, `drop`, `pop`,
 	`show` commands.
 +
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index 2abb6d69f5..bb8f0f4bdd 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -24,18 +24,18 @@ third are what you _could_ commit by running `git add` before running
 OPTIONS
 -------
 
--s::
---short::
+`-s`::
+`--short`::
 	Give the output in the short-format.
 
--b::
---branch::
+`-b`::
+`--branch`::
 	Show the branch and tracking info even in short-format.
 
---show-stash::
+`--show-stash`::
 	Show the number of entries currently stashed away.
 
---porcelain[=<version>]::
+`--porcelain[=<version>]`::
 	Give the output in an easy-to-parse format for scripts.
 	This is similar to the short output, but will remain stable
 	across Git versions and regardless of user configuration. See
@@ -44,19 +44,19 @@ OPTIONS
 The version parameter is used to specify the format version.
 This is optional and defaults to the original version 'v1' format.
 
---long::
+`--long`::
 	Give the output in the long-format. This is the default.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	In addition to the names of files that have been changed, also
 	show the textual changes that are staged to be committed
 	(i.e., like the output of `git diff --cached`). If `-v` is specified
 	twice, then also show the changes in the working tree that
 	have not yet been staged (i.e., like the output of `git diff`).
 
--u[<mode>]::
---untracked-files[=<mode>]::
+`-u[<mode>]`::
+`--untracked-files[=<mode>]`::
 	Show untracked files.
 +
 --
@@ -84,7 +84,7 @@ The default can be changed using the `status.showUntrackedFiles`
 configuration variable documented in linkgit:git-config[1].
 --
 
---ignore-submodules[=<when>]::
+`--ignore-submodules[=<when>]`::
 	Ignore changes to submodules when looking for changes. <when> can be
 	either "none", "untracked", "dirty" or "all", which is the default.
 	Using "none" will consider the submodule modified when it either contains
@@ -99,7 +99,7 @@ configuration variable documented in linkgit:git-config[1].
 	(and suppresses the output of submodule summaries when the config option
 	`status.submoduleSummary` is set).
 
---ignored[=<mode>]::
+`--ignored[=<mode>]`::
 	Show ignored files as well.
 +
 --
@@ -123,28 +123,28 @@ a directory does not match an ignore pattern, but all contents are
 ignored, then the directory is not shown, but all contents are shown.
 --
 
--z::
+`-z`::
 	Terminate entries with NUL, instead of LF.  This implies
 	the `--porcelain=v1` output format if no other format is given.
 
---column[=<options>]::
---no-column::
+`--column[=<options>]`::
+`--no-column`::
 	Display untracked files in columns. See configuration variable
 	`column.status` for option syntax. `--column` and `--no-column`
 	without options are equivalent to 'always' and 'never'
 	respectively.
 
---ahead-behind::
---no-ahead-behind::
+`--ahead-behind`::
+`--no-ahead-behind`::
 	Display or do not display detailed ahead/behind counts for the
 	branch relative to its upstream branch.  Defaults to true.
 
---renames::
---no-renames::
+`--renames`::
+`--no-renames`::
 	Turn on/off rename detection regardless of user configuration.
 	See also linkgit:git-diff[1] `--no-renames`.
 
---find-renames[=<n>]::
+`--find-renames[=<n>]`::
 	Turn on rename detection, optionally setting the similarity
 	threshold.
 	See also linkgit:git-diff[1] `--find-renames`.
diff --git a/Documentation/git-stripspace.txt b/Documentation/git-stripspace.txt
index 6397de9cb3..bed4f35d0b 100644
--- a/Documentation/git-stripspace.txt
+++ b/Documentation/git-stripspace.txt
@@ -35,12 +35,12 @@ the repository.
 
 OPTIONS
 -------
--s::
---strip-comments::
+`-s`::
+`--strip-comments`::
 	Skip and remove all lines starting with comment character (default '#').
 
--c::
---comment-lines::
+`-c`::
+`--comment-lines`::
 	Prepend comment character and blank to each line. Lines will automatically
 	be terminated with a newline. On empty lines, only the comment character
 	will be prepended.
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 6cbf6a9ba1..95868792c9 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -146,7 +146,7 @@ the configuration variable. If neither is given, a 'checkout' is performed.
 The 'update' procedures supported both from the command line as well as
 through the `submodule.<name>.update` configuration are:
 
-	checkout;; the commit recorded in the superproject will be
+	`checkout`;; the commit recorded in the superproject will be
 	    checked out in the submodule on a detached `HEAD`.
 +
 If `--force` is specified, the submodule will be checked out (using
@@ -154,10 +154,10 @@ If `--force` is specified, the submodule will be checked out (using
 in the index of the containing repository already matches the commit
 checked out in the submodule.
 
-	rebase;; the current branch of the submodule will be rebased
+	`rebase`;; the current branch of the submodule will be rebased
 	    onto the commit recorded in the superproject.
 
-	merge;; the commit recorded in the superproject will be merged
+	`merge`;; the commit recorded in the superproject will be merged
 	    into the current branch in the submodule.
 
 The following 'update' procedures are only available via the
@@ -169,7 +169,7 @@ The following 'update' procedures are only available via the
 	    is set to '!command', the remainder after the exclamation mark
 	    is the custom command.
 
-	none;; the submodule is not updated.
+	`none`;; the submodule is not updated.
 
 If the submodule is not yet initialized, and you just want to use the
 setting as stored in `.gitmodules`, you can automatically initialize the
@@ -246,7 +246,7 @@ sync [--recursive] [--] [<path>...]::
 If `--recursive` is specified, this command will recurse into the
 registered submodules, and sync any nested submodules within.
 
-absorbgitdirs::
+`absorbgitdirs`::
 	If a `git` directory of a submodule is inside the submodule,
 	move the `git` directory of the submodule into its superproject's
 	`$GIT_DIR/modules` path and then connect the `git` directory and
@@ -262,18 +262,18 @@ This command is recursive by default.
 
 OPTIONS
 -------
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Only print error messages.
 
---progress::
+`--progress`::
 	This option is only valid for add and update commands.
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless -q
 	is specified. This flag forces progress status even if the
 	standard error stream is not directed to a terminal.
 
---all::
+`--all`::
 	This option is only valid for the deinit command. Unregister all
 	submodules in the working tree.
 
@@ -286,8 +286,8 @@ OPTIONS
 	same name as the current branch in the current repository.  If the
 	option is not specified, it defaults to the remote `HEAD`.
 
--f::
---force::
+`-f`::
+`--force`::
 	This option is only valid for add, deinit and update commands.
 	When running add, allow adding an otherwise ignored submodule path.
 	When running deinit the submodule working trees will be removed even
@@ -299,25 +299,25 @@ OPTIONS
 	containing repository matches the commit checked out in the
 	submodule.
 
---cached::
+`--cached`::
 	This option is only valid for status and summary commands.  These
 	commands typically use the commit found in the submodule `HEAD`, but
 	with this option, the commit stored in the index is used instead.
 
---files::
+`--files`::
 	This option is only valid for the summary command. This command
 	compares the commit in the index with that in the submodule `HEAD`
 	when this option is used.
 
--n::
---summary-limit::
+`-n`::
+`--summary-limit`::
 	This option is only valid for the summary command.
 	Limit the summary size (number of commits shown in total).
 	Giving 0 will disable the summary; a negative number means unlimited
 	(the default). This limit only applies to modified submodules. The
 	size is always limited to 1 for added/deleted/typechanged submodules.
 
---remote::
+`--remote`::
 	This option is only valid for the update command.  Instead of using
 	the superproject's recorded SHA-1 to update the submodule, use the
 	status of the submodule's remote-tracking branch.  The remote used
@@ -348,12 +348,12 @@ to distribute the default upstream branch with the superproject and
 `branch.<name>.merge` if you want a more native feel while working in
 the submodule itself.
 
--N::
---no-fetch::
+`-N`::
+`--no-fetch`::
 	This option is only valid for the update command.
 	Don't fetch new objects from the remote site.
 
---checkout::
+`--checkout`::
 	This option is only valid for the update command.
 	Checkout the commit recorded in the superproject on a detached `HEAD`
 	in the submodule. This is the default behavior, the main use of
@@ -362,7 +362,7 @@ the submodule itself.
 	If the key `submodule.$name.update` is either not explicitly set or
 	set to `checkout`, this option is implicit.
 
---merge::
+`--merge`::
 	This option is only valid for the update command.
 	Merge the commit recorded in the superproject into the current branch
 	of the submodule. If this option is given, the submodule's `HEAD` will
@@ -372,7 +372,7 @@ the submodule itself.
 	If the key `submodule.$name.update` is set to `merge`, this option is
 	implicit.
 
---rebase::
+`--rebase`::
 	This option is only valid for the update command.
 	Rebase the current branch onto the commit recorded in the
 	superproject. If this option is given, the submodule's `HEAD` will not
@@ -381,12 +381,12 @@ the submodule itself.
 	If the key `submodule.$name.update` is set to `rebase`, this option is
 	implicit.
 
---init::
+`--init`::
 	This option is only valid for the update command.
 	Initialize all submodules for which `git submodule init` has not been
 	called so far before updating.
 
---name::
+`--name`::
 	This option is only valid for the add command. It sets the submodule's
 	name to the given string instead of defaulting to its path. The name
 	must be valid as a directory name and may not end with a '/'.
@@ -400,25 +400,25 @@ the submodule itself.
 for linkgit:git-clone[1]'s `--reference`, `--shared`, and `--dissociate`
 options carefully.
 
---dissociate::
+`--dissociate`::
 	This option is only valid for add and update commands.  These
 	commands sometimes need to clone a remote repository. In this case,
 	this option will be passed to the linkgit:git-clone[1] command.
 +
 *NOTE*: see the NOTE for the `--reference` option.
 
---recursive::
+`--recursive`::
 	This option is only valid for foreach, update, status and sync commands.
 	Traverse submodules recursively. The operation is performed not
 	only in the submodules of the current repo, but also
 	in any nested submodules inside those submodules (and so on).
 
---depth::
+`--depth`::
 	This option is valid for add and update commands. Create a 'shallow'
 	clone with a history truncated to the specified number of revisions.
 	See linkgit:git-clone[1]
 
---[no-]recommend-shallow::
+`--[no-]recommend-shallow`::
 	This option is only valid for the update command.
 	The initial clone of a submodule will use the recommended
 	`submodule.<name>.shallow` as provided by the `.gitmodules` file
@@ -430,7 +430,7 @@ options carefully.
 	Clone new submodules in parallel with as many jobs.
 	Defaults to the `submodule.fetchJobs` option.
 
---[no-]single-branch::
+`--[no-]single-branch`::
 	This option is only valid for the update command.
 	Clone only one branch during update: `HEAD` or one specified by `--branch`.
 
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 727ea0603c..6fca35c8cb 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -43,8 +43,8 @@ COMMANDS
 --tags=<tags_subdir>;;
 -b<branches_subdir>;;
 --branches=<branches_subdir>;;
--s;;
---stdlayout;;
+`-s`;;
+`--stdlayout`;;
 	These are optional command-line options for `init`.  Each of
 	these flags can point to a relative repository path
 	(`--tags=project/tags`) or a full url
@@ -55,24 +55,24 @@ COMMANDS
 	a shorthand way of setting trunk,tags,branches as the relative paths,
 	which is the Subversion default. If any of the other options are given
 	as well, they take precedence.
---no-metadata;;
+`--no-metadata`;;
 	Set the 'noMetadata' option in the [svn-remote] config.
 	This option is not recommended, please read the `svn.noMetadata`
 	section of this manpage before using this option.
---use-svm-props;;
+`--use-svm-props`;;
 	Set the 'useSvmProps' option in the [svn-remote] config.
---use-svnsync-props;;
+`--use-svnsync-props`;;
 	Set the 'useSvnsyncProps' option in the [svn-remote] config.
---rewrite-root=<URL>;;
+`--rewrite-root=<URL>`;;
 	Set the 'rewriteRoot' option in the [svn-remote] config.
---rewrite-uuid=<UUID>;;
+`--rewrite-uuid=<UUID>`;;
 	Set the 'rewriteUUID' option in the [svn-remote] config.
---username=<user>;;
+`--username=<user>`;;
 	For transports that SVN handles authentication for (http,
 	https, and plain svn), specify the username.  For other
 	transports (e.g. `svn+ssh://`), you must include the username in
 	the URL, e.g. `svn+ssh://foo@svn.bar.com/project`
---prefix=<prefix>;;
+`--prefix=<prefix>`;;
 	This allows one to specify a prefix which is prepended
 	to the names of remotes if trunk/branches/tags are
 	specified.  The prefix does not automatically include a
@@ -95,19 +95,19 @@ If you still want the old default, you can get it by passing
 `--prefix ""` on the command line (`--prefix=""` may not work if
 your Perl's Getopt::Long is < v2.37).
 
---ignore-refs=<regex>;;
+`--ignore-refs=<regex>`;;
 	When passed to `init` or `clone` this regular expression will
 	be preserved as a config key.  See `fetch` for a description
 	of `--ignore-refs`.
---ignore-paths=<regex>;;
+`--ignore-paths=<regex>`;;
 	When passed to `init` or `clone` this regular expression will
 	be preserved as a config key.  See `fetch` for a description
 	of `--ignore-paths`.
---include-paths=<regex>;;
+`--include-paths=<regex>`;;
 	When passed to `init` or `clone` this regular expression will
 	be preserved as a config key.  See `fetch` for a description
 	of `--include-paths`.
---no-minimize-url;;
+`--no-minimize-url`;;
 	When tracking multiple directories (using `--stdlayout`,
 	`--branches`, or `--tags` options), `git svn` will attempt to connect
 	to the root (or highest allowed level) of the Subversion
@@ -128,7 +128,7 @@ your Perl's Getopt::Long is < v2.37).
 This automatically updates the rev_map if needed (see
 `$GIT_DIR/svn/\**/.rev_map.*` in the FILES section below for details).
 
---localtime;;
+`--localtime`;;
 	Store Git commit times in the local time zone instead of UTC.  This
 	makes `git log` (even without `--date=local`) show the same times
 	that `svn log` would in the local time zone.
@@ -139,10 +139,10 @@ repository to be able to interoperate with someone else's local Git
 repository, either don't use this option or you should both use it in
 the same local time zone.
 
---parent;;
+`--parent`;;
 	Fetch only from the SVN parent of the current `HEAD`.
 
---ignore-refs=<regex>;;
+`--ignore-refs=<regex>`;;
 	Ignore refs for branches or tags matching the Perl regular
 	expression. A negative look-ahead assertion like
 	`^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$`
@@ -154,7 +154,7 @@ config key: `svn-remote.<name>.ignore-refs`
 If the ignore-refs configuration key is set, and the command-line
 option is also given, both regular expressions will be used.
 
---ignore-paths=<regex>;;
+`--ignore-paths=<regex>`;;
 	This allows one to specify a Perl regular expression that will
 	cause skipping of all matching paths from checkout from SVN.
 	The `--ignore-paths` option should match for every `fetch`
@@ -183,7 +183,7 @@ Skip "branches" and "tags" of first level directories;;
 ------------------------------------------------------------------------
 --
 
---include-paths=<regex>;;
+`--include-paths=<regex>`;;
 	This allows one to specify a Perl regular expression that will
 	cause the inclusion of only matching paths from checkout from SVN.
 	The `--include-paths` option should match for every `fetch`
@@ -194,7 +194,7 @@ Skip "branches" and "tags" of first level directories;;
 [verse]
 config key: `svn-remote.<name>.include-paths`
 
---log-window-size=<n>;;
+`--log-window-size=<n>`;;
 	Fetch <n> log entries per request when scanning Subversion history.
 	The default is 100. For very large Subversion repositories, larger
 	values may be needed for `clone`/'fetch' to complete in reasonable
@@ -212,14 +212,14 @@ config key: `svn-remote.<name>.include-paths`
 	affecting the working tree; and the `rebase` command will be
 	able to update the working tree with the latest changes.
 
---preserve-empty-dirs;;
+`--preserve-empty-dirs`;;
 	Create a placeholder file in the local Git repository for each
 	empty directory fetched from Subversion.  This includes directories
 	that become empty by removing all entries in the Subversion
 	repository (but not the directory itself).  The placeholder files
 	are also tracked and removed when no longer necessary.
 
---placeholder-filename=<filename>;;
+`--placeholder-filename=<filename>`;;
 	Set the name of placeholder files created by `--preserve-empty-dirs`.
 	Default: "`.gitignore`"
 
@@ -241,8 +241,8 @@ and have no uncommitted changes.
 This automatically updates the rev_map if needed (see
 `$GIT_DIR/svn/\**/.rev_map.*` in the FILES section below for details).
 
--l;;
---local;;
+`-l`;;
+`--local`;;
 	Do not `fetch` remotely; only run `git rebase` against the
 	last fetched commit from the upstream SVN.
 
@@ -258,7 +258,7 @@ branch, not on the current branch.
 +
 Use of `dcommit` is preferred to `set-tree` (below).
 +
---no-rebase;;
+`--no-rebase`;;
 	After committing, do not rebase or reset.
 --commit-url <URL>;;
 	Commit to this SVN URL (the full path).  This is intended to
@@ -278,7 +278,7 @@ If you rather want to set the commit URL for an entire SVN repository use
 Using this option for any other purpose (don't ask) is very strongly
 discouraged.
 
---mergeinfo=<mergeinfo>;;
+`--mergeinfo=<mergeinfo>`;;
 	Add the given merge information during the `dcommit`
 	(e.g. `--mergeinfo="/branches/foo:1-10"`). All svn server versions can
 	store this information (as a property), and svn clients starting from
@@ -294,7 +294,7 @@ svn:mergeinfo property in the SVN repository when possible. Currently, this can
 only be done when dcommitting non-fast-forward merges where all parents but the
 first have already been pushed into SVN.
 
---interactive;;
+`--interactive`;;
 	Ask the user to confirm that a patch set should actually be sent to SVN.
 	For each patch, one may answer "yes" (accept this patch), "no" (discard this
 	patch), "all" (accept all patches), or "quit".
@@ -305,17 +305,17 @@ committing anything to SVN.
 `branch`::
 	Create a branch in the SVN repository.
 
--m;;
---message;;
+`-m`;;
+`--message`;;
 	Allows to specify the commit message.
 
--t;;
---tag;;
+`-t`;;
+`--tag`;;
 	Create a tag by using the tags_subdir instead of the branches_subdir
 	specified during `git svn` init.
 
--d<path>;;
---destination=<path>;;
+`-d<path>`;;
+`--destination=<path>`;;
 
 	If more than one `--branches` (or `--tags`) option was given to the `init`
 	or `clone` command, you must provide the location of the branch (or
@@ -330,11 +330,11 @@ committing anything to SVN.
 where <name> is the name of the SVN repository as specified by the `-R` option to
 `init` (or "svn" by default).
 
---username;;
+`--username`;;
 	Specify the SVN username to perform the commit as.  This option overrides
 	the 'username' configuration property.
 
---commit-url;;
+`--commit-url`;;
 	Use the specified URL to connect to the destination Subversion
 	repository.  This is useful in cases where the source SVN
 	repository is read-only.  This option overrides configuration
@@ -343,7 +343,7 @@ where <name> is the name of the SVN repository as specified by the `-R` option t
 	git config --get-all svn-remote.<name>.commiturl
 +
 
---parents;;
+`--parents`;;
 	Create parent folders. This parameter is equivalent to the parameter
 	`--parents` on svn cp commands and is useful for non-standard repository
 	layouts.
@@ -363,23 +363,23 @@ The following features from `svn log' are supported:
 --revision=<n>[:<n>];;
 	is supported, non-numeric args are not:
 	HEAD, NEXT, BASE, PREV, etc ...
--v;;
---verbose;;
+`-v`;;
+`--verbose`;;
 	it's not completely compatible with the `--verbose`
 	output in svn log, but reasonably close.
---limit=<n>;;
+`--limit=<n>`;;
 	is NOT the same as `--max-count`, doesn't count
 	merged/excluded commits
---incremental;;
+`--incremental`;;
 	supported
 --
 +
 New features:
 +
 --
---show-commit;;
+`--show-commit`;;
 	shows the Git commit sha1, as well
---oneline;;
+`--oneline`;;
 	our version of `--pretty=oneline`
 --
 +
@@ -397,26 +397,26 @@ Any other arguments are passed directly to `git log`
 	the version of the file in the `HEAD` revision is annotated. Unknown
 	arguments are passed directly to `git blame`.
 +
---git-format;;
+`--git-format`;;
 	Produce output in the same format as `git blame`, but with
 	SVN revision numbers instead of Git commit hashes. In this mode,
 	changes that haven't been committed to SVN (including local
 	working-copy edits) are shown as revision 0.
 
-'find-rev'::
+`find-rev`::
 	When given an SVN revision number of the form 'rN', returns the
 	corresponding Git commit hash (this can optionally be followed by a
 	tree-ish to specify which branch should be searched).  When given a
 	tree-ish, returns the corresponding SVN revision number.
 +
--B;;
---before;;
+`-B`;;
+`--before`;;
 	Don't require an exact match if given an SVN revision, instead find
 	the commit corresponding to the state of the SVN repository (on the
 	current branch) at the specified revision.
 +
--A;;
---after;;
+`-A`;;
+`--after`;;
 	Don't require an exact match if given an SVN revision; if there is
 	not an exact match return the closest match searching forward in the
 	history.
@@ -466,12 +466,12 @@ denotes such an object, or it is requested by invoking an editor (see
 `--edit` option below).
 
 -m <msg>;;
---message=<msg>;;
+`--message=<msg>`;;
 	Use the given `msg` as the commit message. This option
 	disables the `--edit` option.
 
 -F <filename>;;
---file=<filename>;;
+`--file=<filename>`;;
 	Take the commit message from the given file. This option
 	disables the `--edit` option.
 
@@ -529,11 +529,11 @@ Follow 'reset' with a `fetch` and then `git reset` or `git rebase` to
 move local branches onto the new tree.
 
 -r <n>;;
---revision=<n>;;
+`--revision=<n>`;;
 	Specify the most recent revision to keep.  All later revisions
 	are discarded.
--p;;
---parent;;
+`-p`;;
+`--parent`;;
 	Discard the specified revision as well, keeping the nearest
 	parent instead.
 Example:;;
@@ -591,15 +591,15 @@ This can allow you to make partial mirrors when running `fetch`;
 but is generally not recommended because history will be skipped
 and lost.
 
--::
---stdin::
+`-`::
+`--stdin`::
 	Only used with the `set-tree` command.
 +
 Read a list of commits from stdin and commit them in reverse
 order.  Only the leading sha1 is read from each line, so
 `git rev-list --pretty=oneline` output can be used.
 
---rmdir::
+`--rmdir`::
 	Only used with the `dcommit`, `set-tree` and `commit-diff` commands.
 +
 Remove directories from the SVN tree if there are no files left
@@ -611,8 +611,8 @@ the commit to SVN act like Git.
 [verse]
 config key: `svn.rmdir`
 
--e::
---edit::
+`-e`::
+`--edit`::
 	Only used with the `dcommit`, `set-tree` and `commit-diff` commands.
 +
 Edit the commit message before committing to SVN.  This is off by
@@ -622,8 +622,8 @@ tree objects.
 [verse]
 config key: `svn.edit`
 
--l<num>::
---find-copies-harder::
+`-l<num>`::
+`--find-copies-harder`::
 	Only used with the `dcommit`, `set-tree` and `commit-diff` commands.
 +
 They are both passed directly to `git diff-tree`; see
@@ -633,8 +633,8 @@ linkgit:git-diff-tree[1] for more information.
 config key: `svn.l`
 config key: `svn.findcopiesharder`
 
--A<filename>::
---authors-file=<filename>::
+`-A<filename>`::
+`--authors-file=<filename>`::
 	Syntax is compatible with the file used by `git cvsimport` but
 	an empty email address can be supplied with '<>':
 +
@@ -651,7 +651,7 @@ after the authors-file is modified should continue operation.
 [verse]
 config key: `svn.authorsfile`
 
---authors-prog=<filename>::
+`--authors-prog=<filename>`::
 	If this option is specified, for each SVN committer name that
 	does not exist in the authors file, the given file is executed
 	with the committer name as the first argument.  The program is
@@ -667,25 +667,25 @@ not found, it is searched like any other command in `$PATH`.
 [verse]
 config key: `svn.authorsProg`
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Make `git svn` less verbose. Specify a second time to make it
 	even less verbose.
 
--m::
---merge::
--s<strategy>::
---strategy=<strategy>::
--p::
---rebase-merges::
+`-m`::
+`--merge`::
+`-s<strategy>`::
+`--strategy=<strategy>`::
+`-p`::
+`--rebase-merges`::
 --preserve-merges (DEPRECATED)::
 	These are only used with the `dcommit` and `rebase` commands.
 +
 Passed directly to `git rebase` when using `dcommit` if a
 `git reset` cannot be used (see `dcommit`).
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	This can be used with the `dcommit`, `rebase`, `branch` and
 	`tag` commands.
 +
@@ -699,7 +699,7 @@ repository that will be fetched from.
 For `branch` and `tag`, display the urls that will be used for copying when
 creating the branch or tag.
 
---use-log-author::
+`--use-log-author`::
 	When retrieving svn commits into Git (as part of `fetch`, `rebase`, or
 	`dcommit` operations), look for the first `From:` line or `Signed-off-by` trailer
 	in the log message and use that as the author string.
@@ -707,7 +707,7 @@ creating the branch or tag.
 [verse]
 config key: `svn.useLogAuthor`
 
---add-author-from::
+`--add-author-from`::
 	When committing to svn from Git (as part of `set-tree` or `dcommit`
 	operations), if the existing log message doesn't already have a
 	`From:` or `Signed-off-by` trailer, append a `From:` line based on the
@@ -733,7 +733,7 @@ ADVANCED OPTIONS
 	this allows SVN multiple repositories to be tracked.
 	Default: "svn"
 
---follow-parent::
+`--follow-parent`::
 	This option is only relevant if we are tracking branches (using
 	one of the repository layout options `--trunk`, `--tags`,
 	`--branches`, `--stdlayout`). For each tracked branch, try to find
diff --git a/Documentation/git-switch.txt b/Documentation/git-switch.txt
index da16df9efa..44ae45e838 100644
--- a/Documentation/git-switch.txt
+++ b/Documentation/git-switch.txt
@@ -33,13 +33,13 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
 
 OPTIONS
 -------
-<branch>::
+`<branch>`::
 	Branch to switch to.
 
-<new-branch>::
+`<new-branch>`::
 	Name for the new branch.
 
-<start-point>::
+`<start-point>`::
 	The starting point for the new branch. Specifying a
 	`<start-point>` allows you to create a branch based on some
 	other point in history than where `HEAD` currently points. (Or,
@@ -78,14 +78,14 @@ $ git branch -f <new-branch>
 $ git switch <new-branch>
 ------------
 
--d::
---detach::
+`-d`::
+`--detach`::
 	Switch to a commit for inspection and discardable
 	experiments. See the "DETACHED HEAD" section in
 	linkgit:git-checkout[1] for details.
 
---guess::
---no-guess::
+`--guess`::
+`--no-guess`::
 	If `<branch>` is not found but there does exist a tracking
 	branch in exactly one remote (call it `<remote>`) with a
 	matching name, treat as equivalent to
@@ -107,19 +107,19 @@ ambiguous but exists on the `origin` remote. See also
 The default behavior can be set via the `checkout.guess` configuration
 variable.
 
--f::
---force::
+`-f`::
+`--force`::
 	An alias for `--discard-changes`.
 
---discard-changes::
+`--discard-changes`::
 	Proceed even if the index or the working tree differs from
 	`HEAD`. Both the index and working tree are restored to match
 	the switching target. If `--recurse-submodules` is specified,
 	submodule content is also restored to match the switching
 	target. This is used to throw away local changes.
 
--m::
---merge::
+`-m`::
+`--merge`::
 	If you have local modifications to one or more files that are
 	different between the current branch and the branch to which
 	you are switching, the command refuses to switch branches in
@@ -133,26 +133,26 @@ paths are left unmerged, and you need to resolve the conflicts
 and mark the resolved paths with `git add` (or `git rm` if the merge
 should result in deletion of the path).
 
---conflict=<style>::
+`--conflict=<style>`::
 	The same as `--merge` option above, but changes the way the
 	conflicting hunks are presented, overriding the
 	`merge.conflictStyle` configuration variable.  Possible values are
 	"merge" (default) and "diff3" (in addition to what is shown by
 	"merge" style, shows the original contents).
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Quiet, suppress feedback messages.
 
---progress::
---no-progress::
+`--progress`::
+`--no-progress`::
 	Progress status is reported on the standard error stream
 	by default when it is attached to a terminal, unless `--quiet`
 	is specified. This flag enables progress reporting even if not
 	attached to a terminal, regardless of `--quiet`.
 
--t::
---track::
+`-t`::
+`--track`::
 	When creating a new branch, set up "upstream" configuration.
 	`-c` is implied. See `--track` in linkgit:git-branch[1] for
 	details.
@@ -167,7 +167,7 @@ given name has no slash, or the above guessing results in an empty
 name, the guessing is aborted.  You can explicitly give a name with
 `-c` in such a case.
 
---no-track::
+`--no-track`::
 	Do not set up "upstream" configuration, even if the
 	`branch.autoSetupMerge` configuration variable is true.
 
@@ -175,14 +175,14 @@ name, the guessing is aborted.  You can explicitly give a name with
 	Create a new 'orphan' branch, named `<new-branch>`. All
 	tracked files are removed.
 
---ignore-other-worktrees::
+`--ignore-other-worktrees`::
 	`git switch` refuses when the wanted ref is already
 	checked out by another worktree. This option makes it check
 	the ref out anyway. In other words, the ref can be held by
 	more than one worktree.
 
---recurse-submodules::
---no-recurse-submodules::
+`--recurse-submodules`::
+`--no-recurse-submodules`::
 	Using `--recurse-submodules` will update the content of all
 	active submodules according to the commit recorded in the
 	superproject. If nothing (or `--no-recurse-submodules`) is
diff --git a/Documentation/git-symbolic-ref.txt b/Documentation/git-symbolic-ref.txt
index 0c19b1e70e..9fa1564a56 100644
--- a/Documentation/git-symbolic-ref.txt
+++ b/Documentation/git-symbolic-ref.txt
@@ -32,21 +32,21 @@ a regular file whose contents is `ref: refs/heads/master`.
 OPTIONS
 -------
 
--d::
---delete::
+`-d`::
+`--delete`::
 	Delete the symbolic ref <name>.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Do not issue an error message if the <name> is not a
 	symbolic ref but a detached `HEAD`; instead exit with
 	non-zero status silently.
 
---short::
+`--short`::
 	When showing the value of <name> as a symbolic ref, try to shorten the
 	value, e.g. from `refs/heads/master` to `master`.
 
--m::
+`-m`::
 	Update the reflog for <name> with <reason>.  This is valid only
 	when creating or updating a symbolic ref.
 
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 6de16cec54..6f125deee3 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -57,38 +57,38 @@ lightweight tags by default.
 
 OPTIONS
 -------
--a::
---annotate::
+`-a`::
+`--annotate`::
 	Make an unsigned, annotated tag object
 
--s::
---sign::
+`-s`::
+`--sign`::
 	Make a GPG-signed tag, using the default e-mail address's key.
 	The default behavior of tag GPG-signing is controlled by `tag.gpgSign`
 	configuration variable if it exists, or disabled otherwise.
 	See linkgit:git-config[1].
 
---no-sign::
+`--no-sign`::
 	Override `tag.gpgSign` configuration variable that is
 	set to force each and every tag to be signed.
 
 -u <keyid>::
---local-user=<keyid>::
+`--local-user=<keyid>`::
 	Make a GPG-signed tag, using the given key.
 
--f::
---force::
+`-f`::
+`--force`::
 	Replace an existing tag with the given name (instead of failing)
 
--d::
---delete::
+`-d`::
+`--delete`::
 	Delete existing tags with the given names.
 
--v::
---verify::
+`-v`::
+`--verify`::
 	Verify the GPG signature of the given tag names.
 
--n<num>::
+`-n<num>`::
 	<num> specifies how many lines from the annotation, if any,
 	are printed when using -l. Implies `--list`.
 +
@@ -96,8 +96,8 @@ The default is not to print any annotation lines.
 If no number is given to `-n`, only the first line is printed.
 If the tag is not annotated, the commit message is displayed instead.
 
--l::
---list::
+`-l`::
+`--list`::
 	List tags. With optional `<pattern>...`, e.g. `git tag --list
 	'v-*'`, list only the tags that match the pattern(s).
 +
@@ -109,7 +109,7 @@ This option is implicitly supplied if any other list-like option such
 as `--contains` is provided. See the documentation for each of those
 options for details.
 
---sort=<key>::
+`--sort=<key>`::
 	Sort based on the key given.  Prefix `-` to sort in
 	descending order of the value. You may use the `--sort=<key>` option
 	multiple times, in which case the last key becomes the primary
@@ -122,17 +122,17 @@ options for details.
 	variable if it exists, or lexicographic order otherwise. See
 	linkgit:git-config[1].
 
---color[=<when>]::
+`--color[=<when>]`::
 	Respect any colors specified in the `--format` option. The
 	`<when>` field must be one of `always`, `never`, or `auto` (if
 	`<when>` is absent, behave as if `always` was given).
 
--i::
---ignore-case::
+`-i`::
+`--ignore-case`::
 	Sorting and filtering tags are case insensitive.
 
---column[=<options>]::
---no-column::
+`--column[=<options>]`::
+`--no-column`::
 	Display tag listing in columns. See configuration variable
 	`column.tag` for option syntax. `--column` and `--no-column`
 	without options are equivalent to 'always' and 'never' respectively.
@@ -160,7 +160,7 @@ This option is only applicable when listing tags without annotation lines.
 	specified). Implies `--list`.
 
 -m <msg>::
---message=<msg>::
+`--message=<msg>`::
 	Use the given tag message (instead of prompting).
 	If multiple `-m` options are given, their values are
 	concatenated as separate paragraphs.
@@ -168,46 +168,46 @@ This option is only applicable when listing tags without annotation lines.
 	is given.
 
 -F <file>::
---file=<file>::
+`--file=<file>`::
 	Take the tag message from the given file.  Use '-' to
 	read the message from the standard input.
 	Implies `-a` if none of `-a`, `-s`, or `-u <keyid>`
 	is given.
 
--e::
---edit::
+`-e`::
+`--edit`::
 	The message taken from file with `-F` and command line with
 	`-m` are usually used as the tag message unmodified.
 	This option lets you further edit the message taken from these sources.
 
---cleanup=<mode>::
+`--cleanup=<mode>`::
 	This option sets how the tag message is cleaned up.
 	The  '<mode>' can be one of 'verbatim', 'whitespace' and 'strip'.  The
 	'strip' mode is default. The 'verbatim' mode does not change message at
 	all, 'whitespace' removes just leading/trailing whitespace lines and
 	'strip' removes both whitespace and commentary.
 
---create-reflog::
+`--create-reflog`::
 	Create a reflog for the tag. To globally enable reflogs for tags, see
 	`core.logAllRefUpdates` in linkgit:git-config[1].
 	The negated form `--no-create-reflog` only overrides an earlier
 	`--create-reflog`, but currently does not negate the setting of
 	`core.logAllRefUpdates`.
 
---format=<format>::
+`--format=<format>`::
 	A string that interpolates `%(fieldname)` from a tag ref being shown
 	and the object it points at.  The format is the same as
 	that of linkgit:git-for-each-ref[1].  When unspecified,
 	defaults to `%(refname:strip=2)`.
 
-<tagname>::
+`<tagname>`::
 	The name of the tag to create, delete, or describe.
 	The new tag name must pass all checks defined by
 	linkgit:git-check-ref-format[1].  Some of these checks
 	may restrict the characters allowed in a tag name.
 
-<commit>::
-<object>::
+`<commit>`::
+`<object>`::
 	The object that the new tag will refer to, usually a commit.
 	Defaults to `HEAD`.
 
diff --git a/Documentation/git-unpack-objects.txt b/Documentation/git-unpack-objects.txt
index ad10299337..cb989b6aac 100644
--- a/Documentation/git-unpack-objects.txt
+++ b/Documentation/git-unpack-objects.txt
@@ -27,24 +27,24 @@ new packs and replace existing ones.
 
 OPTIONS
 -------
--n::
+`-n`::
         Dry run.  Check the pack file without actually unpacking
 	the objects.
 
--q::
+`-q`::
 	The command usually shows percentage progress.  This
 	flag suppresses it.
 
--r::
+`-r`::
 	When unpacking a corrupt packfile, the command dies at
 	the first corruption.  This flag tells it to keep going
 	and make the best effort to recover as many objects as
 	possible.
 
---strict::
+`--strict`::
 	Don't write objects with broken content or links.
 
---max-input-size=<size>::
+`--max-input-size=<size>`::
 	Die, if the pack is larger than <size>.
 
 GIT
diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt
index 02adf7aa81..7a4925b3c6 100644
--- a/Documentation/git-update-index.txt
+++ b/Documentation/git-update-index.txt
@@ -41,35 +41,35 @@ using the various options:
 
 OPTIONS
 -------
---add::
+`--add`::
 	If a specified file isn't in the index already then it's
 	added.
 	Default behaviour is to ignore new files.
 
---remove::
+`--remove`::
 	If a specified file is in the index but is missing then it's
 	removed.
 	Default behavior is to ignore removed file.
 
---refresh::
+`--refresh`::
 	Looks at the current index and checks to see if merges or
 	updates are needed by checking stat() information.
 
--q::
+`-q`::
         Quiet.  If `--refresh` finds that the index needs an update, the
         default behavior is to error out.  This option makes
 	`git update-index` continue anyway.
 
---ignore-submodules::
+`--ignore-submodules`::
 	Do not try to update submodules.  This option is only respected
 	when passed before `--refresh`.
 
---unmerged::
+`--unmerged`::
         If `--refresh` finds unmerged changes in the index, the default
 	behavior is to error out.  This option makes `git update-index`
         continue anyway.
 
---ignore-missing::
+`--ignore-missing`::
 	Ignores missing files during a `--refresh`
 
 --cacheinfo <mode>,<object>,<path>::
@@ -79,13 +79,13 @@ OPTIONS
 	arguments as three separate parameters, but new users are
 	encouraged to use a single-parameter form.
 
---index-info::
+`--index-info`::
         Read index information from stdin.
 
 --chmod=(+|-)x::
         Set the execute permissions on the updated files.
 
---[no-]assume-unchanged::
+`--[no-]assume-unchanged`::
 	When this flag is specified, the object names recorded
 	for the paths are not updated.  Instead, this option
 	sets/unsets the "assume unchanged" bit for the
@@ -103,46 +103,46 @@ in the index e.g. when merging in a commit;
 thus, in case the assumed-untracked file is changed upstream,
 you will need to handle the situation manually.
 
---really-refresh::
+`--really-refresh`::
 	Like `--refresh`, but checks stat information unconditionally,
 	without regard to the "assume unchanged" setting.
 
---[no-]skip-worktree::
+`--[no-]skip-worktree`::
 	When one of these flags is specified, the object name recorded
 	for the paths are not updated. Instead, these options
 	set and unset the "skip-worktree" bit for the paths. See
 	section "Skip-worktree bit" below for more information.
 
 
---[no-]ignore-skip-worktree-entries::
+`--[no-]ignore-skip-worktree-entries`::
 	Do not remove skip-worktree (AKA "index-only") entries even when
 	the `--remove` option was specified.
 
---[no-]fsmonitor-valid::
+`--[no-]fsmonitor-valid`::
 	When one of these flags is specified, the object name recorded
 	for the paths are not updated. Instead, these options
 	set and unset the "fsmonitor valid" bit for the paths. See
 	section "File System Monitor" below for more information.
 
--g::
---again::
+`-g`::
+`--again`::
 	Runs `git update-index` itself on the paths whose index
 	entries are different from those from the `HEAD` commit.
 
---unresolve::
+`--unresolve`::
 	Restores the 'unmerged' or 'needs updating' state of a
 	file during a merge if it was cleared by accident.
 
---info-only::
+`--info-only`::
 	Do not create objects in the object database for all
 	<file> arguments that follow this flag; just insert
 	their object IDs into the index.
 
---force-remove::
+`--force-remove`::
 	Remove the file from the index even when the working directory
 	still has such a file. (Implies `--remove`.)
 
---replace::
+`--replace`::
 	By default, when a file `path` exists in the index,
 	`git update-index` refuses an attempt to add `path/file`.
 	Similarly if a file `path/file` exists, a file `path`
@@ -150,12 +150,12 @@ you will need to handle the situation manually.
 	that conflict with the entry being added are
 	automatically removed with warning messages.
 
---stdin::
+`--stdin`::
 	Instead of taking list of paths from the command line,
 	read list of paths from the standard input.  Paths are
 	separated by LF (i.e. one path per line) by default.
 
---verbose::
+`--verbose`::
         Report what is being added and removed from index.
 
 --index-version <n>::
@@ -170,12 +170,12 @@ time. Version 4 is relatively young (first released in 1.8.0 in
 October 2012). Other Git implementations such as JGit and libgit2
 may not support it yet.
 
--z::
+`-z`::
 	Only meaningful with `--stdin` or `--index-info`; paths are
 	separated with NUL character instead of LF.
 
---split-index::
---no-split-index::
+`--split-index`::
+`--no-split-index`::
 	Enable or disable split index mode. If split-index mode is
 	already enabled and `--split-index` is given again, all
 	changes in `$GIT_DIR/index` are pushed back to the shared index
@@ -187,8 +187,8 @@ emitted when the change goes against the configured value, as the
 configured value will take effect next time the index is read and this
 will remove the intended effect of the option.
 
---untracked-cache::
---no-untracked-cache::
+`--untracked-cache`::
+`--no-untracked-cache`::
 	Enable or disable untracked cache feature. Please use
 	`--test-untracked-cache` before enabling it.
 +
@@ -198,7 +198,7 @@ emitted when the change goes against the configured value, as the
 configured value will take effect next time the index is read and this
 will remove the intended effect of the option.
 
---test-untracked-cache::
+`--test-untracked-cache`::
 	Only perform tests on the working directory to make sure
 	untracked cache can be used. You have to manually enable
 	untracked cache using `--untracked-cache` or
@@ -208,14 +208,14 @@ will remove the intended effect of the option.
 	explains what is not working as needed, otherwise the exit
 	code is 0 and OK is printed.
 
---force-untracked-cache::
+`--force-untracked-cache`::
 	Same as `--untracked-cache`. Provided for backwards
 	compatibility with older versions of Git where
 	`--untracked-cache` used to imply `--test-untracked-cache` but
 	this option would enable the extension unconditionally.
 
---fsmonitor::
---no-fsmonitor::
+`--fsmonitor`::
+`--no-fsmonitor`::
 	Enable or disable files system monitor feature. These options
 	take effect whatever the value of the `core.fsmonitor`
 	configuration variable (see linkgit:git-config[1]). But a warning
@@ -226,7 +226,7 @@ will remove the intended effect of the option.
 \--::
 	Do not interpret any more arguments as options.
 
-<file>::
+`<file>`::
 	Files to act on.
 	Note that files beginning with '.' are discarded. This includes
 	`./file` and `dir/./file`. If you don't want this, then use
diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt
index 794dea70ec..7a81e39a4f 100644
--- a/Documentation/git-update-ref.txt
+++ b/Documentation/git-update-ref.txt
@@ -99,45 +99,45 @@ In either format, values can be specified in any form that Git
 recognizes as an object name.  Commands in any other format or a
 repeated <ref> produce an error.  Command meanings are:
 
-update::
+`update`::
 	Set <ref> to <newvalue> after verifying <oldvalue>, if given.
 	Specify a zero <newvalue> to ensure the ref does not exist
 	after the update and/or a zero <oldvalue> to make sure the
 	ref does not exist before the update.
 
-create::
+`create`::
 	Create <ref> with <newvalue> after verifying it does not
 	exist.  The given <newvalue> may not be zero.
 
-delete::
+`delete`::
 	Delete <ref> after verifying it exists with <oldvalue>, if
 	given.  If given, <oldvalue> may not be zero.
 
-verify::
+`verify`::
 	Verify <ref> against <oldvalue> but do not change it.  If
 	<oldvalue> is zero or missing, the ref must not exist.
 
-option::
+`option`::
 	Modify behavior of the next command naming a <ref>.
 	The only valid option is `no-deref` to avoid dereferencing
 	a symbolic ref.
 
-start::
+`start`::
 	Start a transaction. In contrast to a non-transactional session, a
 	transaction will automatically abort if the session ends without an
 	explicit commit. This command may create a new empty transaction when
 	the current one has been committed or aborted already.
 
-prepare::
+`prepare`::
 	Prepare to commit the transaction. This will create lock files for all
 	queued reference updates. If one reference could not be locked, the
 	transaction will be aborted.
 
-commit::
+`commit`::
 	Commit all reference updates queued for the transaction, ending the
 	transaction.
 
-abort::
+`abort`::
 	Abort the transaction, releasing all locks if the transaction is in
 	prepared state.
 
diff --git a/Documentation/git-upload-pack.txt b/Documentation/git-upload-pack.txt
index fdb7edc727..98e5f7aa3f 100644
--- a/Documentation/git-upload-pack.txt
+++ b/Documentation/git-upload-pack.txt
@@ -25,23 +25,23 @@ repository.  For push operations, see `git send-pack`.
 OPTIONS
 -------
 
---[no-]strict::
+`--[no-]strict`::
 	Do not try `<directory>/.git/` if <directory> is no Git directory.
 
---timeout=<n>::
+`--timeout=<n>`::
 	Interrupt transfer after <n> seconds of inactivity.
 
---stateless-rpc::
+`--stateless-rpc`::
 	Perform only a single read-write cycle with stdin and stdout.
 	This fits with the HTTP POST request processing model where
 	a program may read the request, write a response, and must exit.
 
---advertise-refs::
+`--advertise-refs`::
 	Only the initial ref advertisement is output, and the program exits
 	immediately. This fits with the HTTP GET request model, where
 	no request content is received but a response must be produced.
 
-<directory>::
+`<directory>`::
 	The repository to sync from.
 
 SEE ALSO
diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt
index 1105e8a1cc..a33b76589a 100644
--- a/Documentation/git-var.txt
+++ b/Documentation/git-var.txt
@@ -17,7 +17,7 @@ Prints a Git logical variable.
 
 OPTIONS
 -------
--l::
+`-l`::
 	Cause the logical variables to be listed. In addition, all the
 	variables of the Git configuration file `.git/config` are listed
 	as well. (However, the configuration variables listing functionality
diff --git a/Documentation/git-verify-commit.txt b/Documentation/git-verify-commit.txt
index 87ed1cae5d..9e95556274 100644
--- a/Documentation/git-verify-commit.txt
+++ b/Documentation/git-verify-commit.txt
@@ -16,12 +16,12 @@ Validates the GPG signature created by `git commit -S`.
 
 OPTIONS
 -------
---raw::
+`--raw`::
 	Print the raw gpg status output to standard error instead of the normal
 	human-readable output.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Print the contents of the commit object before validating it.
 
 <commit>...::
diff --git a/Documentation/git-verify-pack.txt b/Documentation/git-verify-pack.txt
index 8163a86940..6e0b6f6a62 100644
--- a/Documentation/git-verify-pack.txt
+++ b/Documentation/git-verify-pack.txt
@@ -23,13 +23,13 @@ OPTIONS
 <pack>.idx ...::
 	The idx files to verify.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	After verifying the pack, show list of objects contained
 	in the pack and a histogram of delta chain length.
 
--s::
---stat-only::
+`-s`::
+`--stat-only`::
 	Do not verify the pack contents; only show the histogram of delta
 	chain length.  With `--verbose`, list of objects is also shown.
 
diff --git a/Documentation/git-verify-tag.txt b/Documentation/git-verify-tag.txt
index 343e209fc5..f89ca539c8 100644
--- a/Documentation/git-verify-tag.txt
+++ b/Documentation/git-verify-tag.txt
@@ -16,12 +16,12 @@ Validates the gpg signature created by `git tag`.
 
 OPTIONS
 -------
---raw::
+`--raw`::
 	Print the raw gpg status output to standard error instead of the normal
 	human-readable output.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Print the contents of the tag object before validating it.
 
 <tag>...::
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 95fa3b673c..d44084a7f4 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -92,7 +92,7 @@ checked out in the new working tree, if it's not checked out anywhere
 else, otherwise the command will refuse to create the working tree (unless
 `--force` is used).
 
-list::
+`list`::
 
 List details of each working tree.  The main working tree is listed first,
 followed by each of the linked working trees.  The output details include
@@ -101,7 +101,7 @@ branch currently checked out (or "detached `HEAD`" if none), "locked" if
 the worktree is locked, "prunable" if the worktree can be pruned by `prune`
 command.
 
-lock::
+`lock`::
 
 If a working tree is on a portable device or network share which
 is not always mounted, lock it to prevent its administrative
@@ -109,7 +109,7 @@ files from being pruned automatically. This also prevents it from
 being moved or deleted. Optionally, specify a reason for the lock
 with `--reason`.
 
-move::
+`move`::
 
 Move a working tree to a new location. Note that the main working tree
 or linked working trees containing submodules cannot be moved with this
@@ -117,11 +117,11 @@ command. (The `git worktree repair` command, however, can reestablish
 the connection with linked working trees if you move the main working
 tree manually.)
 
-prune::
+`prune`::
 
 Prune working tree information in `$GIT_DIR/worktrees`.
 
-remove::
+`remove`::
 
 Remove a working tree. Only clean working trees (no untracked files
 and no modification in tracked files) can be removed. Unclean working
@@ -150,15 +150,15 @@ manually, then running `repair` in the main working tree and specifying the
 new `<path>` of each linked working tree will reestablish all connections
 in both directions.
 
-unlock::
+`unlock`::
 
 Unlock a working tree, allowing it to be pruned, moved or deleted.
 
 OPTIONS
 -------
 
--f::
---force::
+`-f`::
+`--force`::
 	By default, `add` refuses to create a new working tree when
 	`<commit-ish>` is a branch name and is already checked out by
 	another working tree, or if `<path>` is already assigned to some
@@ -183,18 +183,18 @@ To remove a locked working tree, specify `--force` twice.
 	exists. `-B` overrides this safeguard, resetting `<new-branch>` to
 	`<commit-ish>`.
 
--d::
---detach::
+`-d`::
+`--detach`::
 	With `add`, detach `HEAD` in the new working tree. See "DETACHED HEAD"
 	in linkgit:git-checkout[1].
 
---[no-]checkout::
+`--[no-]checkout`::
 	By default, `add` checks out `<commit-ish>`, however, `--no-checkout` can
 	be used to suppress checkout in order to make customizations,
 	such as configuring sparse-checkout. See "Sparse checkout"
 	in linkgit:git-read-tree[1].
 
---[no-]guess-remote::
+`--[no-]guess-remote`::
 	With `worktree add <path>`, without `<commit-ish>`, instead
 	of creating a new branch from `HEAD`, if there exists a tracking
 	branch in exactly one remote matching the basename of `<path>`,
@@ -204,33 +204,33 @@ To remove a locked working tree, specify `--force` twice.
 This can also be set up as the default behaviour by using the
 `worktree.guessRemote` config option.
 
---[no-]track::
+`--[no-]track`::
 	When creating a new branch, if `<commit-ish>` is a branch,
 	mark it as "upstream" from the new branch.  This is the
 	default if `<commit-ish>` is a remote-tracking branch.  See
 	`--track` in linkgit:git-branch[1] for details.
 
---lock::
+`--lock`::
 	Keep the working tree locked after creation. This is the
 	equivalent of `git worktree lock` after `git worktree add`,
 	but without a race condition.
 
--n::
---dry-run::
+`-n`::
+`--dry-run`::
 	With `prune`, do not remove anything; just report what it would
 	remove.
 
---porcelain::
+`--porcelain`::
 	With `list`, output in an easy-to-parse format for scripts.
 	This format will remain stable across Git versions and regardless of user
 	configuration.  See below for details.
 
--q::
---quiet::
+`-q`::
+`--quiet`::
 	With `add`, suppress feedback messages.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	With `prune`, report all removals.
 +
 With `list`, output additional information about worktrees (see below).
@@ -244,7 +244,7 @@ older than `<time>`.
 --reason <string>::
 	With `lock`, an explanation why the working tree is locked.
 
-<worktree>::
+`<worktree>`::
 	Working trees can be identified by path, either relative or
 	absolute.
 +
diff --git a/Documentation/git-write-tree.txt b/Documentation/git-write-tree.txt
index 295a8715cb..6b0156286a 100644
--- a/Documentation/git-write-tree.txt
+++ b/Documentation/git-write-tree.txt
@@ -27,7 +27,7 @@ now, you need to have done a `git update-index` phase before you did the
 
 OPTIONS
 -------
---missing-ok::
+`--missing-ok`::
 	Normally `git write-tree` ensures that the objects referenced by the
 	directory exist in the object database.  This option disables this
 	check.
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 4c6fca3128..d1389f92c1 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -39,10 +39,10 @@ or https://git-scm.com/docs.
 
 OPTIONS
 -------
---version::
+`--version`::
 	Prints the Git suite version that the `git` program came from.
 
---help::
+`--help`::
 	Prints the synopsis and a list of the most commonly used
 	commands. If the option `--all` or `-a` is given then all
 	available commands are printed. If a Git command is named this
@@ -80,7 +80,7 @@ config file). Including the equals but with an empty value (like `git -c
 foo.bar= ...`) sets `foo.bar` to the empty string which `git config
 --type=bool` will convert to `false`.
 
---config-env=<name>=<envvar>::
+`--config-env=<name>=<envvar>`::
 	Like `-c <name>=<value>`, give configuration variable
 	'<name>' a value, where <envvar> is the name of an
 	environment variable from which to retrieve the value. Unlike
@@ -102,36 +102,36 @@ Note that this might add security for variables such as
 the value, but not e.g. `url.<base>.insteadOf` where the
 sensitive information can be part of the key.
 
---exec-path[=<path>]::
+`--exec-path[=<path>]`::
 	Path to wherever your core Git programs are installed.
 	This can also be controlled by setting the GIT_EXEC_PATH
 	environment variable. If no path is given, `git` will print
 	the current setting and then exit.
 
---html-path::
+`--html-path`::
 	Print the path, without trailing slash, where Git's HTML
 	documentation is installed and exit.
 
---man-path::
+`--man-path`::
 	Print the manpath (see `man(1)`) for the man pages for
 	this version of Git and exit.
 
---info-path::
+`--info-path`::
 	Print the path where the Info files documenting this
 	version of Git are installed and exit.
 
--p::
---paginate::
+`-p`::
+`--paginate`::
 	Pipe all output into 'less' (or if set, `$PAGER`) if standard
 	output is a terminal.  This overrides the `pager.<cmd>`
 	configuration options (see the "Configuration Mechanism" section
 	below).
 
--P::
---no-pager::
+`-P`::
+`--no-pager`::
 	Do not pipe Git output into a pager.
 
---git-dir=<path>::
+`--git-dir=<path>`::
 	Set the path to the repository (".git" directory). This can also be
 	controlled by setting the `GIT_DIR` environment variable. It can be
 	an absolute path or relative path to current working directory.
@@ -150,7 +150,7 @@ environment variable)
 If you just want to run `git` as if it was started in `<path>` then use
 `git -C <path>`.
 
---work-tree=<path>::
+`--work-tree=<path>`::
 	Set the path to the working tree. It can be an absolute path
 	or a path relative to the current working directory.
 	This can also be controlled by setting the GIT_WORK_TREE
@@ -158,47 +158,47 @@ If you just want to run `git` as if it was started in `<path>` then use
 	variable (see `core.worktree` in linkgit:git-config[1] for a
 	more detailed discussion).
 
---namespace=<path>::
+`--namespace=<path>`::
 	Set the Git namespace.  See linkgit:gitnamespaces[7] for more
 	details.  Equivalent to setting the `GIT_NAMESPACE` environment
 	variable.
 
---super-prefix=<path>::
+`--super-prefix=<path>`::
 	Currently for internal use only.  Set a prefix which gives a path from
 	above a repository down to its root.  One use is to give submodules
 	context about the superproject that invoked it.
 
---bare::
+`--bare`::
 	Treat the repository as a bare repository.  If GIT_DIR
 	environment is not set, it is set to the current working
 	directory.
 
---no-replace-objects::
+`--no-replace-objects`::
 	Do not use replacement refs to replace Git objects. See
 	linkgit:git-replace[1] for more information.
 
---literal-pathspecs::
+`--literal-pathspecs`::
 	Treat pathspecs literally (i.e. no globbing, no pathspec magic).
 	This is equivalent to setting the `GIT_LITERAL_PATHSPECS` environment
 	variable to `1`.
 
---glob-pathspecs::
+`--glob-pathspecs`::
 	Add "glob" magic to all pathspec. This is equivalent to setting
 	the `GIT_GLOB_PATHSPECS` environment variable to `1`. Disabling
 	globbing on individual pathspecs can be done using pathspec
 	magic ":(literal)"
 
---noglob-pathspecs::
+`--noglob-pathspecs`::
 	Add "literal" magic to all pathspec. This is equivalent to setting
 	the `GIT_NOGLOB_PATHSPECS` environment variable to `1`. Enabling
 	globbing on individual pathspecs can be done using pathspec
 	magic ":(glob)"
 
---icase-pathspecs::
+`--icase-pathspecs`::
 	Add "icase" magic to all pathspec. This is equivalent to setting
 	the `GIT_ICASE_PATHSPECS` environment variable to `1`.
 
---no-optional-locks::
+`--no-optional-locks`::
 	Do not perform optional operations that require locks. This is
 	equivalent to setting the `GIT_OPTIONAL_LOCKS` to `0`.
 
@@ -365,35 +365,35 @@ list and more details about the configuration mechanism.
 
 Identifier Terminology
 ----------------------
-<object>::
+`<object>`::
 	Indicates the object name for any type of object.
 
-<blob>::
+`<blob>`::
 	Indicates a blob object name.
 
-<tree>::
+`<tree>`::
 	Indicates a tree object name.
 
-<commit>::
+`<commit>`::
 	Indicates a commit object name.
 
-<tree-ish>::
+`<tree-ish>`::
 	Indicates a tree, commit or tag object name.  A
 	command that takes a <tree-ish> argument ultimately wants to
 	operate on a <tree> object but automatically dereferences
 	<commit> and <tag> objects that point at a <tree>.
 
-<commit-ish>::
+`<commit-ish>`::
 	Indicates a commit or tag object name.  A
 	command that takes a <commit-ish> argument ultimately wants to
 	operate on a <commit> object but automatically dereferences
 	<tag> objects that point at a <commit>.
 
-<type>::
+`<type>`::
 	Indicates that an object type is required.
 	Currently one of: `blob`, `tree`, `commit`, or `tag`.
 
-<file>::
+`<file>`::
 	Indicates a filename - almost always relative to the
 	root of the tree structure `GIT_INDEX_FILE` describes.
 
@@ -402,14 +402,14 @@ Symbolic Identifiers
 Any Git command accepting any <object> can also use the following
 symbolic notation:
 
-HEAD::
+`HEAD`::
 	indicates the head of the current branch.
 
-<tag>::
+`<tag>`::
 	a valid tag 'name'
 	(i.e. a `refs/tags/<tag>` reference).
 
-<head>::
+`<head>`::
 	a valid head 'name'
 	(i.e. a `refs/heads/<head>` reference).
 
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index a5cfef7f86..0440adf4fc 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -29,13 +29,13 @@ listed on the line are given to the path.
 
 Each attribute can be in one of these states for a given path:
 
-Set::
+`Set`::
 
 	The path has the attribute with special value "true";
 	this is specified by listing only the name of the
 	attribute in the attribute list.
 
-Unset::
+`Unset`::
 
 	The path has the attribute with special value "false";
 	this is specified by listing the name of the attribute
@@ -48,7 +48,7 @@ Set to a value::
 	followed by an equal sign `=` and its value in the
 	attribute list.
 
-Unspecified::
+`Unspecified`::
 
 	No pattern matches the path, and nothing says if
 	the path has or does not have the attribute, the
@@ -129,13 +129,13 @@ Note that setting `core.autocrlf` to `true` or `input` overrides
 `core.eol` (see the definitions of those options in
 linkgit:git-config[1]).
 
-Set::
+`Set`::
 
 	Setting the `text` attribute on a path enables end-of-line
 	normalization and marks the path as a text file.  End-of-line
 	conversion takes place without guessing the content type.
 
-Unset::
+`Unset`::
 
 	Unsetting the `text` attribute on a path tells Git not to
 	attempt any end-of-line conversion upon checkin or checkout.
@@ -147,7 +147,7 @@ Set to string value "auto"::
 	text, its line endings are converted to LF on checkin.
 	When the file has been committed with CRLF, no conversion is done.
 
-Unspecified::
+`Unspecified`::
 
 	If the `text` attribute is unspecified, Git uses the
 	`core.autocrlf` configuration variable to determine if the
@@ -707,26 +707,26 @@ shown on the hunk header `@@ -k,l +n,m @@` line, tell Git to use an
 external command to generate the diff, or ask Git to convert binary
 files to a text format before generating the diff.
 
-Set::
+`Set`::
 
 	A path to which the `diff` attribute is set is treated
 	as text, even when they contain byte values that
 	normally never appear in text files, such as NUL.
 
-Unset::
+`Unset`::
 
 	A path to which the `diff` attribute is unset will
 	generate `Binary files differ` (or a binary patch, if
 	binary patches are enabled).
 
-Unspecified::
+`Unspecified`::
 
 	A path to which the `diff` attribute is unspecified
 	first gets its contents inspected, and if it looks like
 	text and is smaller than `core.bigFileThreshold`, it is treated
 	as text. Otherwise it would generate `Binary files differ`.
 
-String::
+`String`::
 
 	Diff is shown using the specified diff driver.  Each driver may
 	specify one or more options, as described in the following
@@ -1000,20 +1000,20 @@ The attribute `merge` affects how three versions of a file are
 merged when a file-level merge is necessary during `git merge`,
 and other commands such as `git revert` and `git cherry-pick`.
 
-Set::
+`Set`::
 
 	Built-in 3-way merge driver is used to merge the
 	contents in a way similar to 'merge' command of `RCS`
 	suite.  This is suitable for ordinary text files.
 
-Unset::
+`Unset`::
 
 	Take the version from the current branch as the
 	tentative merge result, and declare that the merge has
 	conflicts.  This is suitable for binary files that do
 	not have a well-defined merge semantics.
 
-Unspecified::
+`Unspecified`::
 
 	By default, this uses the same built-in 3-way merge
 	driver as is the case when the `merge` attribute is set.
@@ -1021,7 +1021,7 @@ Unspecified::
 	different merge driver to be used with paths for which the
 	`merge` attribute is unspecified.
 
-String::
+`String`::
 
 	3-way merge is performed using the specified custom
 	merge driver.  The built-in 3-way merge driver can be
@@ -1036,7 +1036,7 @@ Built-in merge drivers
 There are a few built-in low-level merge drivers defined that
 can be asked for via the `merge` attribute.
 
-text::
+`text`::
 
 	Usual 3-way file level merge for text files.  Conflicted
 	regions are marked with conflict markers `<<<<<<<`,
@@ -1045,13 +1045,13 @@ text::
 	from the merged branch appears after the `=======`
 	marker.
 
-binary::
+`binary`::
 
 	Keep the version from your branch in the work tree, but
 	leave the path in the conflicted state for the user to
 	sort out.
 
-union::
+`union`::
 
 	Run 3-way file level merge for text files, but take
 	lines from both versions, instead of leaving conflict
@@ -1132,22 +1132,22 @@ The `core.whitespace` configuration variable allows you to define what
 the project (See linkgit:git-config[1]).  This attribute gives you finer
 control per path.
 
-Set::
+`Set`::
 
 	Notice all types of potential whitespace errors known to Git.
 	The tab width is taken from the value of the `core.whitespace`
 	configuration variable.
 
-Unset::
+`Unset`::
 
 	Do not notice anything as error.
 
-Unspecified::
+`Unspecified`::
 
 	Use the value of the `core.whitespace` configuration variable to
 	decide what to notice as error.
 
-String::
+`String`::
 
 	Specify a comma separate list of common whitespace problems to
 	notice in the same format as the `core.whitespace` configuration
diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt
index 0fb18e3f35..d96e17ef5f 100644
--- a/Documentation/gitcli.txt
+++ b/Documentation/gitcli.txt
@@ -111,7 +111,7 @@ Magic Options
 Commands which have the enhanced option parser activated all understand a
 couple of magic command-line options:
 
--h::
+`-h`::
 	gives a pretty printed usage of the command.
 +
 ---------------------------------------------
@@ -132,7 +132,7 @@ when there are things on the command line other than `-h`, but `git
 subcmd -h` without anything else on the command line is meant to
 consistently give the usage.
 
---help-all::
+`--help-all`::
 	Some Git commands take options that are only used for plumbing or that
 	are deprecated, and such options are hidden from the default usage. This
 	option gives the full list of options.
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt
index aa11b4562b..15c5ca122f 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.txt
@@ -1011,7 +1011,7 @@ $ git fetch <remote-repository>
 One of the following transports can be used to name the
 repository to download from:
 
-SSH::
+`SSH`::
 	`remote.machine:/path/to/repo.git/` or
 +
 `ssh://remote.machine/path/to/repo.git/`
diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.txt
index a11e72ca4c..b3be044e9e 100644
--- a/Documentation/gitcredentials.txt
+++ b/Documentation/gitcredentials.txt
@@ -66,12 +66,12 @@ storage provided by the OS or other programs.
 To use a helper, you must first select one to use. Git currently
 includes the following helpers:
 
-cache::
+`cache`::
 
 	Cache credentials in memory for a short period of time. See
 	linkgit:git-credential-cache[1] for details.
 
-store::
+`store`::
 
 	Store credentials indefinitely on disk. See
 	linkgit:git-credential-store[1] for details.
@@ -152,7 +152,7 @@ above.
 
 The following options are available in either location:
 
-helper::
+`helper`::
 
 	The name of an external credential helper, and any associated options.
 	If the helper name is not an absolute path, then the string `git
@@ -171,11 +171,11 @@ the helper list to empty (so you may override a helper set by a
 lower-priority config file by configuring the empty-string helper,
 followed by whatever set of helpers you would like).
 
-username::
+`username`::
 
 	A default username, if one is not provided in the URL.
 
-useHttpPath::
+`useHttpPath`::
 
 	By default, Git does not consider the "path" component of an http URL
 	to be worth matching via external helpers. This means that a credential
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index ce1aa25d5a..cf3e4b4011 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -571,7 +571,7 @@ thus has access to these notes.
 
 The following command-specific comments apply:
 
-rebase::
+`rebase`::
 	For the 'squash' and 'fixup' operation, all commits that were
 	squashed are listed as being rewritten to the squashed commit.
 	This means that there will be several lines sharing the same
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index bc0cb104cc..4fd7300cc4 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -35,13 +35,13 @@ rev-list options and arguments
 This manual page describes only the most frequently used options.  See
 linkgit:git-rev-list[1] for a complete list.
 
---all::
+`--all`::
 
 	Show all refs (branches, tags, etc.).
 
---branches[=<pattern>]::
---tags[=<pattern>]::
---remotes[=<pattern>]::
+`--branches[=<pattern>]`::
+`--tags[=<pattern>]`::
+`--remotes[=<pattern>]`::
 
 	Pretend as if all the branches (tags, remote branches, resp.)
 	are listed on the command line as '<commit>'. If '<pattern>'
@@ -49,38 +49,38 @@ linkgit:git-rev-list[1] for a complete list.
 	pattern lacks '?', '{asterisk}', or '[', '/{asterisk}' at the
 	end is implied.
 
---since=<date>::
+`--since=<date>`::
 
 	Show commits more recent than a specific date.
 
---until=<date>::
+`--until=<date>`::
 
 	Show commits older than a specific date.
 
---date-order::
+`--date-order`::
 
 	Sort commits by date when possible.
 
---merge::
+`--merge`::
 
 	After an attempt to merge stops with conflicts, show the commits on
 	the history between two branches (i.e. the `HEAD` and the `MERGE_HEAD`)
 	that modify the conflicted files and do not exist on all the heads
 	being merged.
 
---left-right::
+`--left-right`::
 
 	Mark which side of a symmetric difference a commit is reachable
 	from.  Commits from the left side are prefixed with a `<`
 	symbol and those from the right with a `>` symbol.
 
---full-history::
+`--full-history`::
 
 	When filtering history with '<path>...', does not prune some
 	history.  (See "History simplification" in linkgit:git-log[1]
 	for a more detailed explanation.)
 
---simplify-merges::
+`--simplify-merges`::
 
 	Additional option to `--full-history` to remove some needless
 	merges from the resulting history, as there are no selected
@@ -88,7 +88,7 @@ linkgit:git-rev-list[1] for a complete list.
 	simplification" in linkgit:git-log[1] for a more detailed
 	explanation.)
 
---ancestry-path::
+`--ancestry-path`::
 
 	When given a range of commits to display
 	(e.g. 'commit1..commit2' or 'commit2 {caret}commit1'), only
@@ -118,7 +118,7 @@ include::line-range-options.txt[]
 `gitk`-specific options
 ~~~~~~~~~~~~~~~~~~~~~
 
---argscmd=<command>::
+`--argscmd=<command>`::
 
 	Command to be run each time `gitk` has to determine the revision
 	range to show.  The command is expected to print on its
@@ -127,7 +127,7 @@ include::line-range-options.txt[]
 	'<revision range>' if the set of commits to show may vary
 	between refreshes.
 
---select-commit=<ref>::
+`--select-commit=<ref>`::
 
 	Select the specified commit after loading the graph.
 	Default behavior is equivalent to specifying `--select-commit=HEAD`.
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index ea6b4427c6..861a8ae778 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -68,19 +68,19 @@ submodule.<name>.ignore::
 	a submodule as modified. The following values are supported:
 +
 --
-	all;; The submodule will never be considered modified (but will
+	`all`;; The submodule will never be considered modified (but will
 	    nonetheless show up in the output of status and commit when it has
 	    been staged).
 
-	dirty;; All changes to the submodule's work tree will be ignored, only
+	`dirty`;; All changes to the submodule's work tree will be ignored, only
 	    committed differences between the `HEAD` of the submodule and its
 	    recorded state in the superproject are taken into account.
 
-	untracked;; Only untracked files in submodules will be ignored.
+	`untracked`;; Only untracked files in submodules will be ignored.
 	    Committed differences and modifications to tracked files will show
 	    up.
 
-	none;; No modifications to submodules are ignored, all of committed
+	`none`;; No modifications to submodules are ignored, all of committed
 	    differences, and modifications to tracked and untracked files are
 	    shown. This is the default option.
 
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
index e92b9113f2..80681ed5c0 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -94,7 +94,7 @@ must provide.
 
 Capabilities for Pushing
 ^^^^^^^^^^^^^^^^^^^^^^^^
-'connect'::
+`connect`::
 	Can attempt to connect to `git receive-pack` (for pushing),
 	`git upload-pack`, etc for communication using
 	git's native packfile protocol. This
@@ -102,7 +102,7 @@ Capabilities for Pushing
 +
 Supported commands: 'connect'.
 
-'stateless-connect'::
+`stateless-connect`::
 	Experimental; for internal use only.
 	Can attempt to connect to a remote server for communication
 	using git's wire-protocol version 2.  See the documentation
@@ -110,13 +110,13 @@ Supported commands: 'connect'.
 +
 Supported commands: 'stateless-connect'.
 
-'push'::
+`push`::
 	Can discover remote refs and push local commits and the
 	history leading up to them to new or existing remote refs.
 +
 Supported commands: 'list for-push', 'push'.
 
-'export'::
+`export`::
 	Can discover remote refs and push specified objects from a
 	fast-import stream to remote refs.
 +
@@ -128,7 +128,7 @@ connecting (see the 'connect' command under COMMANDS).
 When choosing between 'push' and 'export', Git prefers 'push'.
 Other frontends may have some other order of preference.
 
-'no-private-update'::
+`no-private-update`::
 	When using the 'refspec' capability, `git` normally updates the
 	private ref on successful push. This update is disabled when
 	the remote-helper declares the capability 'no-private-update'.
@@ -136,7 +136,7 @@ Other frontends may have some other order of preference.
 
 Capabilities for Fetching
 ^^^^^^^^^^^^^^^^^^^^^^^^^
-'connect'::
+`connect`::
 	Can try to connect to `git upload-pack` (for fetching),
 	`git receive-pack`, etc for communication using the
 	Git's native packfile protocol. This
@@ -144,7 +144,7 @@ Capabilities for Fetching
 +
 Supported commands: 'connect'.
 
-'stateless-connect'::
+`stateless-connect`::
 	Experimental; for internal use only.
 	Can attempt to connect to a remote server for communication
 	using git's wire-protocol version 2.  See the documentation
@@ -152,19 +152,19 @@ Supported commands: 'connect'.
 +
 Supported commands: 'stateless-connect'.
 
-'fetch'::
+`fetch`::
 	Can discover remote refs and transfer objects reachable from
 	them to the local object store.
 +
 Supported commands: 'list', 'fetch'.
 
-'import'::
+`import`::
 	Can discover remote refs and output objects reachable from
 	them as a stream in fast-import format.
 +
 Supported commands: 'list', 'import'.
 
-'check-connectivity'::
+`check-connectivity`::
 	Can guarantee that when a clone is requested, the received
 	pack is self contained and is connected.
 
@@ -177,7 +177,7 @@ Other frontends may have some other order of preference.
 Miscellaneous capabilities
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-'option'::
+`option`::
 	For specifying settings like `verbosity` (how much output to
 	write to stderr) and `depth` (how much history is wanted in the
 	case of a shallow clone) that affect how other commands are
@@ -208,7 +208,7 @@ interact with, and to let the private namespace refs point to this
 local repository, while the refs/remotes namespace is used to track
 the remote repository.
 
-'bidi-import'::
+`bidi-import`::
 	This modifies the 'import' capability.
 	The fast-import commands 'cat-blob' and 'ls' can be used by remote-helpers
 	to retrieve information about blobs and trees that already exist in
@@ -233,12 +233,12 @@ the remote repository.
 	marks specified in <file> before processing any input. For details,
 	read up on `--import-marks=<file>` in linkgit:git-fast-export[1].
 
-'signed-tags'::
+`signed-tags`::
 	This modifies the 'export' capability, instructing Git to pass
 	`--signed-tags=verbatim` to linkgit:git-fast-export[1].  In the
 	absence of this capability, Git will use `--signed-tags=warn-strip`.
 
-'object-format'::
+`object-format`::
 	This indicates that the helper is able to interact with the remote
 	side using an explicit hash algorithm extension.
 
@@ -248,7 +248,7 @@ COMMANDS
 
 Commands are given by the caller on the helper's standard input, one per line.
 
-'capabilities'::
+`capabilities`::
 	Lists the capabilities of the helper, one per line, ending
 	with a blank line. Each capability may be preceded with '*',
 	which marks them mandatory for Git versions using the remote
@@ -257,7 +257,7 @@ Commands are given by the caller on the helper's standard input, one per line.
 +
 Support for this command is mandatory.
 
-'list'::
+`list`::
 	Lists the refs, one per line, in the format "<value> <name>
 	[<attr> ...]". The value may be a hex sha1 hash, "@<dest>" for
 	a symref, ":<keyword> <value>" for a key-value pair, or
@@ -370,7 +370,7 @@ stdin.
 +
 Supported if the helper has the "import" capability.
 
-'export'::
+`export`::
 	Instructs the remote helper that any subsequent input is
 	part of a fast-import stream (generated by `git fast-export`)
 	containing objects which should be pushed to the remote.
@@ -433,7 +433,7 @@ The 'list' command produces a list of refs in which each ref
 may be followed by a list of attributes. The following ref list
 attributes are defined.
 
-'unchanged'::
+`unchanged`::
 	This ref is unchanged since the last import or fetch, although
 	the helper cannot necessarily determine what value that produced.
 
@@ -443,7 +443,7 @@ REF LIST KEYWORDS
 The 'list' command may produce a list of key-value pairs.
 The following keys are defined.
 
-'object-format'::
+`object-format`::
 	The refs are using the given hash algorithm.  This keyword is only
 	used if the server and client both support the object-format
 	extension.
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt
index 95a98f7802..c639ea8cc6 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.txt
@@ -31,7 +31,7 @@ submodule working tree, without losing the submodule repository.
 
 These things may exist in a Git repository.
 
-objects::
+`objects`::
 	Object store associated with this repository.  Usually
 	an object store is self sufficient (i.e. all the objects
 	that are referred to by an object found in it are also
@@ -91,7 +91,7 @@ objects/info/http-alternates::
 	this object store borrows objects from, to be used when
 	the repository is fetched over HTTP.
 
-refs::
+`refs`::
 	References are stored in subdirectories of this
 	directory.  The `git prune` command knows to preserve
 	objects reachable from refs found in this directory and
@@ -117,13 +117,13 @@ refs/replace/`<obj-sha1>`::
 	maintained by linkgit:git-replace[1]. Such refs can be exchanged
 	between repositories while grafts are not.
 
-packed-refs::
+`packed-refs`::
 	records the same information as refs/heads/, refs/tags/,
 	and friends record in a more efficient way.  See
 	linkgit:git-pack-refs[1]. This file is ignored if `$GIT_COMMON_DIR`
 	is set and `$GIT_COMMON_DIR/packed-refs` will be used instead.
 
-HEAD::
+`HEAD`::
 	A symref (see glossary) to the `refs/heads/` namespace
 	describing the currently active branch.  It does not mean
 	much if the repository is not associated with any working tree
@@ -140,7 +140,7 @@ being a symref to point at the current branch.  Such a state
 is often called 'detached `HEAD`.'  See linkgit:git-checkout[1]
 for details.
 
-config::
+`config`::
 	Repository specific configuration file. This file is ignored
 	if `$GIT_COMMON_DIR` is set and `$GIT_COMMON_DIR/config` will be
 	used instead.
@@ -150,7 +150,7 @@ config.worktree::
 	working directory in multiple working directory setup (see
 	linkgit:git-worktree[1]).
 
-branches::
+`branches`::
 	A slightly deprecated way to store shorthands to be used
 	to specify a URL to `git fetch`, `git pull` and `git push`.
 	A file can be stored as `branches/<name>` and then
@@ -162,7 +162,7 @@ branches::
 	`$GIT_COMMON_DIR/branches` will be used instead.
 
 
-hooks::
+`hooks`::
 	Hooks are customization scripts used by various Git
 	commands.  A handful of sample hooks are installed when
 	`git init` is run, but all of them are disabled by
@@ -172,13 +172,13 @@ hooks::
 	each hook. This directory is ignored if `$GIT_COMMON_DIR` is set
 	and `$GIT_COMMON_DIR/hooks` will be used instead.
 
-common::
+`common`::
 	When multiple working trees are used, most of files in
 	`$GIT_DIR` are per-worktree with a few known exceptions. All
 	files under 'common' however will be shared between all
 	working trees.
 
-index::
+`index`::
 	The current index file for the repository.  It is
 	usually not found in a bare repository.
 
@@ -186,7 +186,7 @@ sharedindex.<SHA-1>::
 	The shared index part, to be referenced by `$GIT_DIR/index` and
 	other temporary index files. Only valid in split index mode.
 
-info::
+`info`::
 	Additional information about the repository is recorded
 	in this directory. This directory is ignored if `$GIT_COMMON_DIR`
 	is set and `$GIT_COMMON_DIR/info` will be used instead.
@@ -228,7 +228,7 @@ info/sparse-checkout::
 	This file stores sparse checkout patterns.
 	See also: linkgit:git-read-tree[1].
 
-remotes::
+`remotes`::
 	Stores shorthands for URL and default refnames for use
 	when interacting with remote repositories via `git fetch`,
 	`git pull` and `git push` commands.  See the REMOTES section
@@ -237,7 +237,7 @@ remotes::
 	directory is ignored if `$GIT_COMMON_DIR` is set and
 	`$GIT_COMMON_DIR/remotes` will be used instead.
 
-logs::
+`logs`::
 	Records of changes made to refs are stored in this directory.
 	See linkgit:git-update-ref[1] for more information. This
 	directory is ignored (except logs/HEAD) if `$GIT_COMMON_DIR` is
@@ -249,24 +249,24 @@ logs/refs/heads/`name`::
 logs/refs/tags/`name`::
 	Records all changes made to the tag named `name`.
 
-shallow::
+`shallow`::
 	This is similar to `info/grafts` but is internally used
 	and maintained by shallow clone mechanism.  See `--depth`
 	option to linkgit:git-clone[1] and linkgit:git-fetch[1]. This
 	file is ignored if `$GIT_COMMON_DIR` is set and
 	`$GIT_COMMON_DIR/shallow` will be used instead.
 
-commondir::
+`commondir`::
 	If this file exists, `$GIT_COMMON_DIR` (see linkgit:git[1]) will
 	be set to the path specified in this file if it is not
 	explicitly set. If the specified path is relative, it is
 	relative to `$GIT_DIR`. The repository with commondir is
 	incomplete without the repository pointed by "commondir".
 
-modules::
+`modules`::
 	Contains the `git`-repositories of the submodules.
 
-worktrees::
+`worktrees`::
 	Contains administrative data for linked
 	working trees. Each subdirectory contains the working tree-related
 	part of a linked working tree. This directory is ignored if
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index 8a8d3f9acf..9cd1e9dc67 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -624,7 +624,7 @@ As one can see it lacks the \'sub' element.
 The meaning of each part of feature configuration is described
 below:
 
-default::
+`default`::
 	List (array reference) of feature parameters (if there are any),
 	used also to toggle (enable or disable) given feature.
 +
@@ -638,7 +638,7 @@ section.
 To disable features that accept parameters (are configurable), you
 need to set this element to empty list i.e. `[]`.
 
-override::
+`override`::
 	If this field has a true value then the given feature is
 	overridable, which means that it can be configured
 	(or enabled/disabled) on a per-repository basis.
@@ -648,7 +648,7 @@ config variable in the per-repository Git configuration file.
 +
 *Note* that no feature is overridable by default.
 
-sub::
+`sub`::
 	Internal detail of implementation.  What is important is that
 	if this field is not present then per-repository override for
 	given feature is not supported.
@@ -663,7 +663,7 @@ below.  This should be a complete list, but ultimately the authoritative
 and complete list is in gitweb.cgi source code, with features described
 in the comments.
 
-blame::
+`blame`::
 	Enable the "blame" and "blame_incremental" blob views, showing for
 	each line the last commit that modified it; see linkgit:git-blame[1].
 	This can be very CPU-intensive and is therefore disabled by default.
@@ -671,7 +671,7 @@ blame::
 This feature can be configured on a per-repository basis via
 repository's `gitweb.blame` configuration variable (boolean).
 
-snapshot::
+`snapshot`::
 	Enable and configure the "snapshot" action, which allows user to
 	download a compressed archive of any tree or commit, as produced
 	by linkgit:git-archive[1] and possibly additionally compressed.
@@ -688,7 +688,7 @@ repository's `gitweb.snapshot` configuration variable, which contains
 a comma separated list of formats or "none" to disable snapshots.
 Unknown values are ignored.
 
-grep::
+`grep`::
 	Enable grep search, which lists the files in currently selected
 	tree (directory) containing the given string; see linkgit:git-grep[1].
 	This can be potentially CPU-intensive, of course.  Enabled by default.
@@ -696,7 +696,7 @@ grep::
 This feature can be configured on a per-repository basis via
 repository's `gitweb.grep` configuration variable (boolean).
 
-pickaxe::
+`pickaxe`::
 	Enable the so called pickaxe search, which will list the commits
 	that introduced or removed a given string in a file.  This can be
 	practical and quite faster alternative to "blame" action, but it is
@@ -709,7 +709,7 @@ linkgit:gitdiffcore[7] for more details).
 This feature can be configured on a per-repository basis by setting
 repository's `gitweb.pickaxe` configuration variable (boolean).
 
-show-sizes::
+`show-sizes`::
 	Enable showing size of blobs (ordinary files) in a "tree" view, in a
 	separate column, similar to what `ls -l` does; see description of
 	`-l` option in linkgit:git-ls-tree[1] manpage.  This costs a bit of
@@ -718,7 +718,7 @@ show-sizes::
 This feature can be configured on a per-repository basis via
 repository's `gitweb.showSizes` configuration variable (boolean).
 
-patches::
+`patches`::
 	Enable and configure "patches" view, which displays list of commits in email
 	(plain text) output format; see also linkgit:git-format-patch[1].
 	The value is the maximum number of patches in a patchset generated
@@ -730,7 +730,7 @@ patches::
 This feature can be configured on a per-repository basis via
 repository's `gitweb.patches` configuration variable (integer).
 
-avatar::
+`avatar`::
 	Avatar support.  When this feature is enabled, views such as
 	"shortlog" or "commit" will display an avatar associated with
 	the email of each committer and author.
@@ -751,7 +751,7 @@ default font sizes or lineheights are changed (e.g. via adding extra
 CSS stylesheet in `@stylesheets`), it may be appropriate to change
 these values.
 
-highlight::
+`highlight`::
 	Server-side syntax highlight support in "blob" view.  It requires
 	`$highlight_bin` program to be available (see the description of
 	this variable in the "Configuration variables" section above),
@@ -773,7 +773,7 @@ repository's `gitweb.remote_heads` configuration variable (boolean).
 
 The remaining features cannot be overridden on a per project basis.
 
-search::
+`search`::
 	Enable text search, which will list the commits which match author,
 	committer or commit text to a given string; see the description of
 	`--author`, `--committer` and `--grep` options in linkgit:git-log[1]
@@ -781,7 +781,7 @@ search::
 +
 Project specific override is not supported.
 
-forks::
+`forks`::
 	If this feature is enabled, `gitweb` considers projects in
 	subdirectories of project root (basename) to be forks of existing
 	projects.  For each project +$projname.git+, projects in the
@@ -797,7 +797,7 @@ in that file.
 +
 Project specific override is not supported.
 
-actions::
+`actions`::
 	Insert custom links to the action bar of all project pages.  This
 	allows you to link to third-party scripts integrating into `gitweb`.
 +
@@ -823,7 +823,7 @@ This adds a link titled "graphiclog" after the "summary" link, leading to
 +
 Project specific override is not supported.
 
-timed::
+`timed`::
 	Enable displaying how much time and how many Git commands it took to
 	generate and display each page in the page footer (at the bottom of
 	page).  For example the footer might contain: "This page took 6.53325
@@ -831,7 +831,7 @@ timed::
 +
 Project specific override is not supported.
 
-javascript-timezone::
+`javascript-timezone`::
 	Enable and configure the ability to change a common time zone for dates
 	in `gitweb` output via JavaScript.  Dates in `gitweb` output include
 	authordate and committerdate in "commit", "commitdiff" and "log"
@@ -859,7 +859,7 @@ time zones in the form of "+/-HHMM", such as "+0200".
 +
 Project specific override is not supported.
 
-extra-branch-refs::
+`extra-branch-refs`::
 	List of additional directories under `refs` which are going to
 	be used as branch refs. For example if you have a gerrit setup
 	where all branches under refs/heads/ are official,
diff --git a/Documentation/gitweb.txt b/Documentation/gitweb.txt
index f164857d83..3ade8b7d72 100644
--- a/Documentation/gitweb.txt
+++ b/Documentation/gitweb.txt
@@ -280,24 +280,24 @@ five components:
 .../gitweb.cgi/<repo>/<action>/<revision>:/<path>?<arguments>
 -----------------------------------------------------------------------
 
-repo::
+`repo`::
 	The repository the action will be performed on.
 +
 All actions except for those that list all available projects,
 in whatever form, require this parameter.
 
-action::
+`action`::
 	The action that will be run.  Defaults to 'projects_list' if repo
 	is not set, and to 'summary' otherwise.
 
-revision::
+`revision`::
 	Revision shown.  Defaults to `HEAD`.
 
-path::
+`path`::
 	The path within the <repository> that the action is performed on,
 	for those actions that require it.
 
-arguments::
+`arguments`::
 	Any arguments that control the behaviour of the action.
 
 Some actions require or allow to specify two revisions, and sometimes even two
@@ -327,21 +327,21 @@ project_list::
 	Lists the available Git repositories.  This is the default command if no
 	repository is specified in the URL.
 
-summary::
+`summary`::
 	Displays summary about given repository.  This is the default command if
 	no action is specified in URL, and only repository is specified.
 
-heads::
-remotes::
+`heads`::
+`remotes`::
 	Lists all local or all remote-tracking branches in given repository.
 +
 The latter is not available by default, unless configured.
 
-tags::
+`tags`::
 	List all tags (lightweight and annotated) in given repository.
 
-blob::
-tree::
+`blob`::
+`tree`::
 	Shows the files and directories in a given repository path, at given
 	revision.  This is default command if no action is specified in the URL,
 	and path is given.
@@ -350,10 +350,10 @@ blob_plain::
 	Returns the raw data for the file in given repository, at given path and
 	revision.  Links to this action are marked 'raw'.
 
-blobdiff::
+`blobdiff`::
 	Shows the difference between two revisions of the same file.
 
-blame::
+`blame`::
 blame_incremental::
 	Shows the blame (also called annotation) information for a file. On a
 	per line basis it shows the revision in which that line was last changed
@@ -363,34 +363,34 @@ blame_incremental::
 +
 This action is disabled by default for performance reasons.
 
-commit::
-commitdiff::
+`commit`::
+`commitdiff`::
 	Shows information about a specific commit in a repository.  The 'commit'
 	view shows information about commit in more detail, the 'commitdiff'
 	action shows changeset for given commit.
 
-patch::
+`patch`::
 	Returns the commit in plain text mail format, suitable for applying with
 	linkgit:git-am[1].
 
-tag::
+`tag`::
 	Display specific annotated tag (tag object).
 
-log::
-shortlog::
+`log`::
+`shortlog`::
 	Shows log information (commit message or just commit subject) for a
 	given branch (starting from given revision).
 +
 The 'shortlog' view is more compact; it shows one commit per line.
 
-history::
+`history`::
 	Shows history of the file or directory in a given repository path,
 	starting from given revision (defaults to `HEAD`, i.e. default branch).
 +
 This view is similar to 'shortlog' view.
 
-rss::
-atom::
+`rss`::
+`atom`::
 	Generates an RSS (or Atom) feed of changes to repository.
 
 
diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt
index cc8bfc5cfb..122b5a71ea 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -352,19 +352,19 @@ A pathspec with only a colon means "there is no pathspec". This form
 should not be combined with other pathspec.
 +
 --
-top;;
+`top`;;
 	The magic word `top` (magic signature: `/`) makes the pattern
 	match from the root of the working tree, even when you are
 	running the command from inside a subdirectory.
 
-literal;;
+`literal`;;
 	Wildcards in the pattern such as `*` or `?` are treated
 	as literal characters.
 
-icase;;
+`icase`;;
 	Case insensitive match.
 
-glob;;
+`glob`;;
 	Git treats the pattern as a shell glob suitable for
 	consumption by fnmatch(3) with the FNM_PATHNAME flag:
 	wildcards in the pattern will not match a / in the pathname.
@@ -393,7 +393,7 @@ full pathname may have special meaning:
 +
 Glob magic is incompatible with literal magic.
 
-attr;;
+`attr`;;
 After `attr:` comes a space separated list of "attribute
 requirements", all of which must be met in order for the
 path to be considered a match; this is in addition to the
@@ -416,7 +416,7 @@ these forms:
 Note that when matching against a tree object, attributes are still
 obtained from working tree, not from the given tree object.
 
-exclude;;
+`exclude`;;
 	After a path matches any non-exclude pathspec, it will be run
 	through all exclude pathspecs (magic signature: `!` or its
 	synonym `^`). If it matches, the path is ignored.  When there
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index 6f6f31874b..ec6b02f79a 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -1,5 +1,5 @@
---commit::
---no-commit::
+`--commit`::
+`--no-commit`::
 	Perform the merge and commit the result. This option can
 	be used to override `--no-commit`.
 +
@@ -12,9 +12,9 @@ therefore there is no way to stop those merges with `--no-commit`.
 Thus, if you want to ensure your branch is not changed or updated
 by the merge command, use `--no-ff` with `--no-commit`.
 
---edit::
--e::
---no-edit::
+`--edit`::
+`-e`::
+`--no-edit`::
 	Invoke an editor before committing successful mechanical merge to
 	further edit the auto-generated merge message, so that the user
 	can explain and justify the merge. The `--no-edit` option can be
@@ -32,16 +32,16 @@ they run `git merge`. To make it easier to adjust such scripts to the
 updated behaviour, the environment variable `GIT_MERGE_AUTOEDIT` can be
 set to `no` at the beginning of them.
 
---cleanup=<mode>::
+`--cleanup=<mode>`::
 	This option determines how the merge message will be cleaned up before
 	committing. See linkgit:git-commit[1] for more details. In addition, if
 	the '<mode>' is given a value of `scissors`, scissors will be appended
 	to `MERGE_MSG` before being passed on to the commit machinery in the
 	case of a merge conflict.
 
---ff::
---no-ff::
---ff-only::
+`--ff`::
+`--no-ff`::
+`--ff-only`::
 	Specifies how a merge is handled when the merged-in history is
 	already a descendant of the current history.  `--ff` is the
 	default unless merging an annotated (and possibly signed) tag
@@ -59,17 +59,17 @@ could instead be resolved as a fast-forward.
 With `--ff-only`, resolve the merge as a fast-forward when possible.
 When not possible, refuse to merge and exit with a non-zero status.
 
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
+`-S[<keyid>]`::
+`--gpg-sign[=<keyid>]`::
+`--no-gpg-sign`::
 	GPG-sign the resulting merge commit. The `keyid` argument is
 	optional and defaults to the committer identity; if specified,
 	it must be stuck to the option without a space. `--no-gpg-sign`
 	is useful to countermand both `commit.gpgSign` configuration variable,
 	and earlier `--gpg-sign`.
 
---log[=<n>]::
---no-log::
+`--log[=<n>]`::
+`--no-log`::
 	In addition to branch names, populate the log message with
 	one-line descriptions from at most <n> actual commits that are being
 	merged. See also linkgit:git-fmt-merge-msg[1].
@@ -79,17 +79,17 @@ actual commits being merged.
 
 include::signoff-option.txt[]
 
---stat::
--n::
---no-stat::
+`--stat`::
+`-n`::
+`--no-stat`::
 	Show a diffstat at the end of the merge. The diffstat is also
 	controlled by the configuration option merge.stat.
 +
 With `-n` or `--no-stat` do not show a diffstat at the end of the
 merge.
 
---squash::
---no-squash::
+`--squash`::
+`--no-squash`::
 	Produce the working tree and index state as if a real merge
 	happened (except for the merge information), but do not actually
 	make a commit, move the `HEAD`, or record `$GIT_DIR/MERGE_HEAD`
@@ -103,12 +103,12 @@ option can be used to override `--squash`.
 +
 With `--squash`, `--commit` is not allowed, and will fail.
 
---no-verify::
+`--no-verify`::
 	This option bypasses the pre-merge and commit-msg hooks.
 	See also linkgit:githooks[5].
 
 -s <strategy>::
---strategy=<strategy>::
+`--strategy=<strategy>`::
 	Use the given merge strategy; can be supplied more than
 	once to specify them in the order they should be tried.
 	If there is no `-s` option, a built-in list of strategies
@@ -116,34 +116,34 @@ With `--squash`, `--commit` is not allowed, and will fail.
 	head, `git merge-octopus` otherwise).
 
 -X <option>::
---strategy-option=<option>::
+`--strategy-option=<option>`::
 	Pass merge strategy specific option through to the merge
 	strategy.
 
---verify-signatures::
---no-verify-signatures::
+`--verify-signatures`::
+`--no-verify-signatures`::
 	Verify that the tip commit of the side branch being merged is
 	signed with a valid key, i.e. a key that has a valid uid: in the
 	default trust model, this means the signing key has been signed by
 	a trusted key.  If the tip commit of the side branch is not signed
 	with a valid key, the merge is aborted.
 
---summary::
---no-summary::
+`--summary`::
+`--no-summary`::
 	Synonyms to `--stat` and `--no-stat`; these are deprecated and will be
 	removed in the future.
 
 ifndef::git-pull[]
--q::
---quiet::
+`-q`::
+`--quiet`::
 	Operate quietly. Implies `--no-progress`.
 
--v::
---verbose::
+`-v`::
+`--verbose`::
 	Be verbose.
 
---progress::
---no-progress::
+`--progress`::
+`--no-progress`::
 	Turn progress on/off explicitly. If neither is specified,
 	progress is shown if standard error is connected to a terminal.
 	Note that not all merge strategies may support progress
@@ -151,15 +151,15 @@ ifndef::git-pull[]
 
 endif::git-pull[]
 
---autostash::
---no-autostash::
+`--autostash`::
+`--no-autostash`::
 	Automatically create a temporary stash entry before the operation
 	begins, and apply it after the operation ends.  This means
 	that you can run the operation on a dirty worktree.  However, use
 	with care: the final stash application after a successful
 	merge might result in non-trivial conflicts.
 
---allow-unrelated-histories::
+`--allow-unrelated-histories`::
 	By default, `git merge` command refuses to merge histories
 	that do not share a common ancestor.  This option can be
 	used to override this safety when merging histories of two
diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt
index 2912de706b..49162dfc20 100644
--- a/Documentation/merge-strategies.txt
+++ b/Documentation/merge-strategies.txt
@@ -6,14 +6,14 @@ backend 'merge strategies' to be chosen with `-s` option.  Some strategies
 can also take their own options, which can be passed by giving `-X<option>`
 arguments to `git merge` and/or `git pull`.
 
-resolve::
+`resolve`::
 	This can only resolve two heads (i.e. the current branch
 	and another branch you pulled from) using a 3-way merge
 	algorithm.  It tries to carefully detect criss-cross
 	merge ambiguities and is considered generally safe and
 	fast.
 
-recursive::
+`recursive`::
 	This can only resolve two heads using a 3-way merge
 	algorithm.  When there is more than one common
 	ancestor that can be used for 3-way merge, it creates a
@@ -29,7 +29,7 @@ recursive::
 +
 The 'recursive' strategy can take the following options:
 
-ours;;
+`ours`;;
 	This option forces conflicting hunks to be auto-resolved cleanly by
 	favoring 'our' version.  Changes from the other tree that do not
 	conflict with our side are reflected in the merge result.
@@ -39,11 +39,11 @@ This should not be confused with the 'ours' merge strategy, which does not
 even look at what the other tree contains at all.  It discards everything
 the other tree did, declaring 'our' history contains all that happened in it.
 
-theirs;;
+`theirs`;;
 	This is the opposite of 'ours'; note that, unlike 'ours', there is
 	no 'theirs' merge strategy to confuse this merge option with.
 
-patience;;
+`patience`;;
 	With this option, 'merge-recursive' spends a little extra time
 	to avoid mismerges that sometimes occur due to unimportant
 	matching lines (e.g., braces from distinct functions).  Use
@@ -56,10 +56,10 @@ diff-algorithm=[patience|minimal|histogram|myers];;
 	lines (such as braces from distinct functions).  See also
 	linkgit:git-diff[1] `--diff-algorithm`.
 
-ignore-space-change;;
-ignore-all-space;;
-ignore-space-at-eol;;
-ignore-cr-at-eol;;
+`ignore-space-change`;;
+`ignore-all-space`;;
+`ignore-space-at-eol`;;
+`ignore-cr-at-eol`;;
 	Treats lines with the indicated type of whitespace change as
 	unchanged for the sake of a three-way merge.  Whitespace
 	changes mixed with other changes to a line are not ignored.
@@ -72,7 +72,7 @@ ignore-cr-at-eol;;
   version includes a substantial change, 'their' version is used;
 * Otherwise, the merge proceeds in the usual way.
 
-renormalize;;
+`renormalize`;;
 	This runs a virtual check-out and check-in of all three stages
 	of a file when resolving a three-way merge.  This option is
 	meant to be used when merging branches with different clean
@@ -80,39 +80,39 @@ renormalize;;
 	branches with differing checkin/checkout attributes" in
 	linkgit:gitattributes[5] for details.
 
-no-renormalize;;
+`no-renormalize`;;
 	Disables the `renormalize` option.  This overrides the
 	`merge.renormalize` configuration variable.
 
-no-renames;;
+`no-renames`;;
 	Turn off rename detection. This overrides the `merge.renames`
 	configuration variable.
 	See also linkgit:git-diff[1] `--no-renames`.
 
-find-renames[=<n>];;
+`find-renames[=<n>]`;;
 	Turn on rename detection, optionally setting the similarity
 	threshold.  This is the default. This overrides the
 	'merge.renames' configuration variable.
 	See also linkgit:git-diff[1] `--find-renames`.
 
-rename-threshold=<n>;;
+`rename-threshold=<n>`;;
 	Deprecated synonym for `find-renames=<n>`.
 
-subtree[=<path>];;
+`subtree[=<path>]`;;
 	This option is a more advanced form of 'subtree' strategy, where
 	the strategy makes a guess on how two trees must be shifted to
 	match with each other when merging.  Instead, the specified path
 	is prefixed (or stripped from the beginning) to make the shape of
 	two trees to match.
 
-octopus::
+`octopus`::
 	This resolves cases with more than two heads, but refuses to do
 	a complex merge that needs manual resolution.  It is
 	primarily meant to be used for bundling topic branch
 	heads together.  This is the default merge strategy when
 	pulling or merging more than one branch.
 
-ours::
+`ours`::
 	This resolves any number of heads, but the resulting tree of the
 	merge is always that of the current branch head, effectively
 	ignoring all changes from all other branches.  It is meant to
@@ -120,7 +120,7 @@ ours::
 	branches.  Note that this is different from the -Xours option to
 	the 'recursive' merge strategy.
 
-subtree::
+`subtree`::
 	This is a modified recursive strategy. When merging trees A and
 	B, if B corresponds to a subtree of A, B is first adjusted to
 	match the tree structure of A, instead of reading the trees at
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt
index f055f56c37..ccb85eabc0 100644
--- a/Documentation/pretty-options.txt
+++ b/Documentation/pretty-options.txt
@@ -1,5 +1,5 @@
---pretty[=<format>]::
---format=<format>::
+`--pretty[=<format>]`::
+`--format=<format>`::
 
 	Pretty-print the contents of the commit logs in a given format,
 	where '<format>' can be one of 'oneline', 'short', 'medium',
@@ -14,7 +14,7 @@ format.  When '=<format>' part is omitted, it defaults to 'medium'.
 Note: you can specify the default pretty format in the repository
 configuration (see linkgit:git-config[1]).
 
---abbrev-commit::
+`--abbrev-commit`::
 	Instead of showing the full 40-byte hexadecimal commit object
 	name, show a prefix that names the object uniquely.
 	`--abbrev=<n>` (which also modifies diff output, if it is displayed)
@@ -23,16 +23,16 @@ configuration (see linkgit:git-config[1]).
 This should make `--pretty=oneline` a whole lot more readable for
 people using 80-column terminals.
 
---no-abbrev-commit::
+`--no-abbrev-commit`::
 	Show the full 40-byte hexadecimal commit object name. This negates
 	`--abbrev-commit`, either explicit or implied by other options such
 	as `--oneline`. It also overrides the `log.abbrevCommit` variable.
 
---oneline::
+`--oneline`::
 	This is a shorthand for `--pretty=oneline --abbrev-commit`
 	used together.
 
---encoding=<encoding>::
+`--encoding=<encoding>`::
 	The commit objects record the encoding used for the log message
 	in their encoding header; this option can be used to tell the
 	command to re-code the commit log message in the encoding
@@ -42,9 +42,9 @@ people using 80-column terminals.
 	verbatim; this means that invalid sequences in the original
 	commit may be copied to the output.
 
---expand-tabs=<n>::
---expand-tabs::
---no-expand-tabs::
+`--expand-tabs=<n>`::
+`--expand-tabs`::
+`--no-expand-tabs`::
 	Perform a tab expansion (replace each tab with enough spaces
 	to fill to the next display column that is multiple of '<n>')
 	in the log message before showing it in the output.
@@ -57,7 +57,7 @@ message by 4 spaces (i.e.  'medium', which is the default, 'full',
 and 'fuller').
 
 ifndef::git-rev-list[]
---notes[=<ref>]::
+`--notes[=<ref>]`::
 	Show the notes (see linkgit:git-notes[1]) that annotate the
 	commit, when showing the commit log message.  This is the default
 	for `git log`, `git show` and `git whatchanged` commands when
@@ -78,19 +78,19 @@ being displayed. Examples: `--notes=foo` will show only notes from
 `refs/notes/foo`; `--notes=foo --notes` will show both notes from
 `refs/notes/foo` and from the default notes ref(s).
 
---no-notes::
+`--no-notes`::
 	Do not show notes. This negates the above `--notes` option, by
 	resetting the list of notes refs from which notes are shown.
 	Options are parsed in the order given on the command line, so e.g.
 	`--notes --notes=foo --no-notes --notes=bar` will only show notes
 	from `refs/notes/bar`.
 
---show-notes[=<ref>]::
---[no-]standard-notes::
+`--show-notes[=<ref>]`::
+`--[no-]standard-notes`::
 	These options are deprecated. Use the above `--notes`/`--no-notes`
 	options instead.
 endif::git-rev-list[]
 
---show-signature::
+`--show-signature`::
 	Check the validity of a signed commit object by passing the signature
 	to `gpg --verify` and show the output.
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index fb491660d6..7053aa6170 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -13,44 +13,44 @@ has a line that matches `<pattern>`), unless otherwise noted.
 Note that these are applied before commit
 ordering and formatting options, such as `--reverse`.
 
--<number>::
+`-<number>`::
 -n <number>::
---max-count=<number>::
+`--max-count=<number>`::
 	Limit the number of commits to output.
 
---skip=<number>::
+`--skip=<number>`::
 	Skip 'number' commits before starting to show the commit output.
 
---since=<date>::
---after=<date>::
+`--since=<date>`::
+`--after=<date>`::
 	Show commits more recent than a specific date.
 
---until=<date>::
---before=<date>::
+`--until=<date>`::
+`--before=<date>`::
 	Show commits older than a specific date.
 
 ifdef::git-rev-list[]
---max-age=<timestamp>::
---min-age=<timestamp>::
+`--max-age=<timestamp>`::
+`--min-age=<timestamp>`::
 	Limit the commits output to specified time range.
 endif::git-rev-list[]
 
---author=<pattern>::
---committer=<pattern>::
+`--author=<pattern>`::
+`--committer=<pattern>`::
 	Limit the commits output to ones with author/committer
 	header lines that match the specified pattern (regular
 	expression).  With more than one `--author=<pattern>`,
 	commits whose author matches any of the given patterns are
 	chosen (similarly for multiple `--committer=<pattern>`).
 
---grep-reflog=<pattern>::
+`--grep-reflog=<pattern>`::
 	Limit the commits output to ones with reflog entries that
 	match the specified pattern (regular expression). With
 	more than one `--grep-reflog`, commits whose reflog message
 	matches any of the given patterns are chosen.  It is an
 	error to use this option unless `--walk-reflogs` is in use.
 
---grep=<pattern>::
+`--grep=<pattern>`::
 	Limit the commits output to ones with log message that
 	matches the specified pattern (regular expression).  With
 	more than one `--grep=<pattern>`, commits whose message
@@ -62,35 +62,35 @@ When `--notes` is in effect, the message from the notes is
 matched as if it were part of the log message.
 endif::git-rev-list[]
 
---all-match::
+`--all-match`::
 	Limit the commits output to ones that match all given `--grep`,
 	instead of ones that match at least one.
 
---invert-grep::
+`--invert-grep`::
 	Limit the commits output to ones with log message that do not
 	match the pattern specified with `--grep=<pattern>`.
 
--i::
---regexp-ignore-case::
+`-i`::
+`--regexp-ignore-case`::
 	Match the regular expression limiting patterns without regard to letter
 	case.
 
---basic-regexp::
+`--basic-regexp`::
 	Consider the limiting patterns to be basic regular expressions;
 	this is the default.
 
--E::
---extended-regexp::
+`-E`::
+`--extended-regexp`::
 	Consider the limiting patterns to be extended regular expressions
 	instead of the default basic regular expressions.
 
--F::
---fixed-strings::
+`-F`::
+`--fixed-strings`::
 	Consider the limiting patterns to be fixed strings (don't interpret
 	pattern as a regular expression).
 
--P::
---perl-regexp::
+`-P`::
+`--perl-regexp`::
 	Consider the limiting patterns to be Perl-compatible regular
 	expressions.
 +
@@ -98,20 +98,20 @@ Support for these types of regular expressions is an optional
 compile-time dependency. If Git wasn't compiled with support for them
 providing this option will cause it to die.
 
---remove-empty::
+`--remove-empty`::
 	Stop when a given path disappears from the tree.
 
---merges::
+`--merges`::
 	Print only merge commits. This is exactly the same as `--min-parents=2`.
 
---no-merges::
+`--no-merges`::
 	Do not print commits with more than one parent. This is
 	exactly the same as `--max-parents=1`.
 
---min-parents=<number>::
---max-parents=<number>::
---no-min-parents::
---no-max-parents::
+`--min-parents=<number>`::
+`--max-parents=<number>`::
+`--no-min-parents`::
+`--no-max-parents`::
 	Show only commits which have at least (or at most) that many parent
 	commits. In particular, `--max-parents=1` is the same as `--no-merges`,
 	`--min-parents=2` is the same as `--merges`.  `--max-parents=0`
@@ -121,7 +121,7 @@ providing this option will cause it to die.
 again.  Equivalent forms are `--min-parents=0` (any commit has 0 or more
 parents) and `--max-parents=-1` (negative numbers denote no upper limit).
 
---first-parent::
+`--first-parent`::
 	Follow only the first parent commit upon seeing a merge
 	commit.  This option can give a better overview when
 	viewing the evolution of a particular topic branch,
@@ -135,39 +135,39 @@ This option also changes default diff format for merge commits
 to `first-parent`, see `--diff-merges=first-parent` for details.
 endif::git-log[]
 
---not::
+`--not`::
 	Reverses the meaning of the '{caret}' prefix (or lack thereof)
 	for all following revision specifiers, up to the next `--not`.
 
---all::
+`--all`::
 	Pretend as if all the refs in `refs/`, along with `HEAD`, are
 	listed on the command line as '<commit>'.
 
---branches[=<pattern>]::
+`--branches[=<pattern>]`::
 	Pretend as if all the refs in `refs/heads` are listed
 	on the command line as '<commit>'. If '<pattern>' is given, limit
 	branches to ones matching given shell glob. If pattern lacks '?',
 	'{asterisk}', or '[', '/{asterisk}' at the end is implied.
 
---tags[=<pattern>]::
+`--tags[=<pattern>]`::
 	Pretend as if all the refs in `refs/tags` are listed
 	on the command line as '<commit>'. If '<pattern>' is given, limit
 	tags to ones matching given shell glob. If pattern lacks '?', '{asterisk}',
 	or '[', '/{asterisk}' at the end is implied.
 
---remotes[=<pattern>]::
+`--remotes[=<pattern>]`::
 	Pretend as if all the refs in `refs/remotes` are listed
 	on the command line as '<commit>'. If '<pattern>' is given, limit
 	remote-tracking branches to ones matching given shell glob.
 	If pattern lacks '?', '{asterisk}', or '[', '/{asterisk}' at the end is implied.
 
---glob=<glob-pattern>::
+`--glob=<glob-pattern>`::
 	Pretend as if all the refs matching shell glob '<glob-pattern>'
 	are listed on the command line as '<commit>'. Leading `refs/`,
 	is automatically prepended if missing. If pattern lacks '?', '{asterisk}',
 	or '[', '/{asterisk}' at the end is implied.
 
---exclude=<glob-pattern>::
+`--exclude=<glob-pattern>`::
 
 	Do not include refs matching '<glob-pattern>' that the next `--all`,
 	`--branches`, `--tags`, `--remotes`, or `--glob` would otherwise
@@ -182,11 +182,11 @@ respectively, and they must begin with `refs/` when applied to `--glob`
 or `--all`. If a trailing '/{asterisk}' is intended, it must be given
 explicitly.
 
---reflog::
+`--reflog`::
 	Pretend as if all objects mentioned by reflogs are listed on the
 	command line as `<commit>`.
 
---alternate-refs::
+`--alternate-refs`::
 	Pretend as if all objects mentioned as ref tips of alternate
 	repositories were listed on the command line. An alternate
 	repository is any repository whose object directory is specified
@@ -194,7 +194,7 @@ explicitly.
 	be modified by `core.alternateRefsCommand`, etc. See
 	linkgit:git-config[1].
 
---single-worktree::
+`--single-worktree`::
 	By default, all working trees will be examined by the
 	following options when there are more than one (see
 	linkgit:git-worktree[1]): `--all`, `--reflog` and
@@ -202,33 +202,33 @@ explicitly.
 	This option forces them to examine the current working tree
 	only.
 
---ignore-missing::
+`--ignore-missing`::
 	Upon seeing an invalid object name in the input, pretend as if
 	the bad input was not given.
 
 ifndef::git-rev-list[]
---bisect::
+`--bisect`::
 	Pretend as if the bad bisection ref `refs/bisect/bad`
 	was listed and as if it was followed by `--not` and the good
 	bisection refs `refs/bisect/good-*` on the command
 	line.
 endif::git-rev-list[]
 
---stdin::
+`--stdin`::
 	In addition to the '<commit>' listed on the command
 	line, read them from the standard input. If a `--` separator is
 	seen, stop reading commits and start reading paths to limit the
 	result.
 
 ifdef::git-rev-list[]
---quiet::
+`--quiet`::
 	Don't print anything to standard output.  This form
 	is primarily meant to allow the caller to
 	test the exit status to see if a range of objects is fully
 	connected (or not).  It is faster than redirecting stdout
 	to `/dev/null` as the output does not have to be formatted.
 
---disk-usage::
+`--disk-usage`::
 	Suppress normal output; instead, print the sum of the bytes used
 	for on-disk storage by the selected commits or objects. This is
 	equivalent to piping the output into `git cat-file
@@ -238,11 +238,11 @@ ifdef::git-rev-list[]
 	"on-disk storage" means.
 endif::git-rev-list[]
 
---cherry-mark::
+`--cherry-mark`::
 	Like `--cherry-pick` (see below) but mark equivalent commits
 	with `=` rather than omitting them, and inequivalent ones with `+`.
 
---cherry-pick::
+`--cherry-pick`::
 	Omit any commit that introduces the same change as
 	another commit on the ``other side'' when the set of
 	commits are limited with symmetric difference.
@@ -255,8 +255,8 @@ cherry-picked from the other branch (for example, ``3rd on b'' may be
 cherry-picked from branch `A`). With this option, such pairs of commits are
 excluded from the output.
 
---left-only::
---right-only::
+`--left-only`::
+`--right-only`::
 	List only commits on the respective side of a symmetric difference,
 	i.e. only those which would be marked `<` resp. `>` by
 	`--left-right`.
@@ -267,15 +267,15 @@ commits from `B` which are in `A` or are patch-equivalent to a commit in
 More precisely, `--cherry-pick --right-only --no-merges` gives the exact
 list.
 
---cherry::
+`--cherry`::
 	A synonym for `--right-only --cherry-mark --no-merges`; useful to
 	limit the output to the commits on our side and mark those that
 	have been applied to the other side of a forked history with
 	`git log --cherry upstream...mybranch`, similar to
 	`git cherry upstream mybranch`.
 
--g::
---walk-reflogs::
+`-g`::
+`--walk-reflogs`::
 	Instead of walking the commit ancestry chain, walk
 	reflog entries from the most recent one to older ones.
 	When this option is used you cannot specify commits to
@@ -309,22 +309,22 @@ See also linkgit:git-reflog[1].
 +
 Under `--pretty=reference`, this information will not be shown at all.
 
---merge::
+`--merge`::
 	After a failed merge, show refs that touch files having a
 	conflict and don't exist on all heads to merge.
 
---boundary::
+`--boundary`::
 	Output excluded boundary commits. Boundary commits are
 	prefixed with `-`.
 
 ifdef::git-rev-list[]
---use-bitmap-index::
+`--use-bitmap-index`::
 
 	Try to speed up the traversal using the pack bitmap index (if
 	one is available). Note that when traversing with `--objects`,
 	trees and blobs will not have their associated path printed.
 
---progress=<header>::
+`--progress=<header>`::
 	Show progress reports on stderr as objects are considered. The
 	`<header>` text will be printed with each progress update.
 endif::git-rev-list[]
@@ -339,10 +339,10 @@ is how to do it, as there are various strategies to simplify the history.
 
 The following options select the commits to be shown:
 
-<paths>::
+`<paths>`::
 	Commits modifying the given <paths> are selected.
 
---simplify-by-decoration::
+`--simplify-by-decoration`::
 	Commits that are referred by some branch or tag are selected.
 
 Note that extra commits can be shown to give a meaningful history.
@@ -355,28 +355,28 @@ Default mode::
 	branches if the end result is the same (i.e. merging branches
 	with the same content)
 
---show-pulls::
+`--show-pulls`::
 	Include all commits from the default mode, but also any merge
 	commits that are not TREESAME to the first parent but are
 	TREESAME to a later parent. This mode is helpful for showing
 	the merge commits that "first introduced" a change to a branch.
 
---full-history::
+`--full-history`::
 	Same as the default mode, but does not prune some history.
 
---dense::
+`--dense`::
 	Only the selected commits are shown, plus some to have a
 	meaningful history.
 
---sparse::
+`--sparse`::
 	All commits in the simplified history are shown.
 
---simplify-merges::
+`--simplify-merges`::
 	Additional option to `--full-history` to remove some needless
 	merges from the resulting history, as there are no selected
 	commits contributing to this merge.
 
---ancestry-path::
+`--ancestry-path`::
 	When given a range of commits to display (e.g. 'commit1..commit2'
 	or 'commit2 {caret}commit1'), only display commits that exist
 	directly on the ancestry chain between the 'commit1' and
@@ -497,18 +497,18 @@ rewritten to contain `E`'s parent `I`.  The same happened for `C` and
 In addition to the above settings, you can change whether TREESAME
 affects inclusion:
 
---dense::
+`--dense`::
 	Commits that are walked are included if they are not TREESAME
 	to any parent.
 
---sparse::
+`--sparse`::
 	All commits that are walked are included.
 +
 Note that without `--full-history`, this still simplifies merges: if
 one of the parents is TREESAME, we follow only that one, so the other
 sides of the merge are never walked.
 
---simplify-merges::
+`--simplify-merges`::
 	First, build a history graph in the same way that
 	`--full-history` with parent rewriting does (see above).
 +
@@ -555,7 +555,7 @@ Note the major differences in `N`, `P`, and `Q` over `--full-history`:
 
 There is another simplification mode available:
 
---ancestry-path::
+`--ancestry-path`::
 	Limit the displayed commits to those directly on the ancestry
 	chain between the ``from'' and ``to'' commits in the given commit
 	range. I.e. only display commits that are ancestor of the ``to''
@@ -685,7 +685,7 @@ into the important branch. This commit may have information about why
 the change `X` came to override the changes from `A` and `B` in its
 commit message.
 
---show-pulls::
+`--show-pulls`::
 	In addition to the commits shown in the default history, show
 	each merge commit that is not TREESAME to its first parent but
 	is TREESAME to a later parent.
@@ -734,7 +734,7 @@ ifdef::git-rev-list[]
 Bisection Helpers
 ~~~~~~~~~~~~~~~~~
 
---bisect::
+`--bisect`::
 	Limit output to the one commit object which is roughly halfway between
 	included and excluded commits. Note that the bad bisection ref
 	`refs/bisect/bad` is added to the included commits (if it
@@ -758,7 +758,7 @@ introduces a regression is thus reduced to a binary search: repeatedly
 generate and test new 'midpoint's until the commit chain is of length
 one.
 
---bisect-vars::
+`--bisect-vars`::
 	This calculates the same as `--bisect`, except that refs in
 	`refs/bisect/` are not used, and except that this outputs
 	text ready to be eval'ed by the shell. These lines will assign the
@@ -770,7 +770,7 @@ one.
 	`bisect_bad`, and the number of commits we are bisecting right now to
 	`bisect_all`.
 
---bisect-all::
+`--bisect-all`::
 	This outputs all the commit objects between the included and excluded
 	commits, ordered by their distance to the included and excluded
 	commits. Refs in `refs/bisect/` are not used. The farthest
@@ -793,15 +793,15 @@ Commit Ordering
 
 By default, the commits are shown in reverse chronological order.
 
---date-order::
+`--date-order`::
 	Show no parents before all of its children are shown, but
 	otherwise show commits in the commit timestamp order.
 
---author-date-order::
+`--author-date-order`::
 	Show no parents before all of its children are shown, but
 	otherwise show commits in the author timestamp order.
 
---topo-order::
+`--topo-order`::
 	Show no parents before all of its children are shown, and
 	avoid showing commits on multiple lines of history
 	intermixed.
@@ -825,7 +825,7 @@ With `--topo-order`, they would show 8 6 5 3 7 4 2 1 (or 8 7 4 2 6 5
 avoid showing the commits from two parallel development track mixed
 together.
 
---reverse::
+`--reverse`::
 	Output the commits chosen to be shown (see Commit Limiting
 	section above) in reverse order. Cannot be combined with
 	`--walk-reflogs`.
@@ -838,49 +838,49 @@ Object Traversal
 These options are mostly targeted for packing of Git repositories.
 
 ifdef::git-rev-list[]
---objects::
+`--objects`::
 	Print the object IDs of any object referenced by the listed
 	commits.  `--objects foo ^bar` thus means ``send me
 	all object IDs which I need to download if I have the commit
 	object _bar_ but not _foo_''.
 
---in-commit-order::
+`--in-commit-order`::
 	Print tree and blob ids in order of the commits. The tree
 	and blob ids are printed after they are first referenced
 	by a commit.
 
---objects-edge::
+`--objects-edge`::
 	Similar to `--objects`, but also print the IDs of excluded
 	commits prefixed with a ``-'' character.  This is used by
 	linkgit:git-pack-objects[1] to build a ``thin'' pack, which records
 	objects in deltified form based on objects contained in these
 	excluded commits to reduce network traffic.
 
---objects-edge-aggressive::
+`--objects-edge-aggressive`::
 	Similar to `--objects-edge`, but it tries harder to find excluded
 	commits at the cost of increased time.  This is used instead of
 	`--objects-edge` to build ``thin'' packs for shallow repositories.
 
---indexed-objects::
+`--indexed-objects`::
 	Pretend as if all trees and blobs used by the index are listed
 	on the command line.  Note that you probably want to use
 	`--objects`, too.
 
---unpacked::
+`--unpacked`::
 	Only useful with `--objects`; print the object IDs that are not
 	in packs.
 
---object-names::
+`--object-names`::
 	Only useful with `--objects`; print the names of the object IDs
 	that are found. This is the default behavior.
 
---no-object-names::
+`--no-object-names`::
 	Only useful with `--objects`; does not print the names of the object
 	IDs that are found. This inverts `--object-names`. This flag allows
 	the output to be more easily parsed by commands such as
 	linkgit:git-cat-file[1].
 
---filter=<filter-spec>::
+`--filter=<filter-spec>`::
 	Only useful with one of the `--objects*`; omits objects (usually
 	blobs) from the list of printed objects.  The '<filter-spec>'
 	may be one of the following:
@@ -927,14 +927,14 @@ Other arbitrary characters can also be encoded. For instance,
 'combine:tree:3+blob:none' and 'combine:tree%3A3+blob%3Anone' are
 equivalent.
 
---no-filter::
+`--no-filter`::
 	Turn off any previous `--filter=` argument.
 
---filter-print-omitted::
+`--filter-print-omitted`::
 	Only useful with `--filter=`; prints a list of the objects omitted
 	by the filter.  Object IDs are prefixed with a ``~'' character.
 
---missing=<missing-action>::
+`--missing=<missing-action>`::
 	A debug option to help with future "partial clone" development.
 	This option specifies how missing objects are handled.
 +
@@ -952,7 +952,7 @@ Unexpected missing objects will raise an error.
 The form `--missing=print` is like 'allow-any', but will also print a
 list of the missing objects.  Object IDs are prefixed with a ``?'' character.
 
---exclude-promisor-objects::
+`--exclude-promisor-objects`::
 	(For internal use only.)  Prefilter object traversal at
 	promisor boundary.  This is used with partial clone.  This is
 	stronger than `--missing=allow-promisor` because it limits the
@@ -969,7 +969,7 @@ endif::git-rev-list[]
 	by commit time.
 	Cannot be combined with `--graph`.
 
---do-walk::
+`--do-walk`::
 	Overrides a previous `--no-walk`.
 endif::git-shortlog[]
 
@@ -985,10 +985,10 @@ endif::git-rev-list[]
 
 include::pretty-options.txt[]
 
---relative-date::
+`--relative-date`::
 	Synonym for `--date=relative`.
 
---date=<format>::
+`--date=<format>`::
 	Only takes effect for dates shown in human-readable format, such
 	as when using `--pretty`. `log.date` config variable sets a default
 	value for the log command's `--date` option. By default, dates
@@ -1053,25 +1053,25 @@ format placeholders. When using `-local`, the correct syntax is
 	- the time zone is omitted when the local time zone is used
 
 ifdef::git-rev-list[]
---header::
+`--header`::
 	Print the contents of the commit in raw-format; each record is
 	separated with a NUL character.
 endif::git-rev-list[]
 
---parents::
+`--parents`::
 	Print also the parents of the commit (in the form "commit parent...").
 	Also enables parent rewriting, see 'History Simplification' above.
 
---children::
+`--children`::
 	Print also the children of the commit (in the form "commit child...").
 	Also enables parent rewriting, see 'History Simplification' above.
 
 ifdef::git-rev-list[]
---timestamp::
+`--timestamp`::
 	Print the raw commit timestamp.
 endif::git-rev-list[]
 
---left-right::
+`--left-right`::
 	Mark which side of a symmetric difference a commit is reachable from.
 	Commits from the left side are prefixed with `<` and those from
 	the right with `>`.  If combined with `--boundary`, those
@@ -1100,7 +1100,7 @@ you would get an output like this:
 	-xxxxxxx... 1st on a
 -----------------------------------------------------------------------
 
---graph::
+`--graph`::
 	Draw a text-based graphical representation of the commit history
 	on the left hand side of the output.  This may cause extra lines
 	to be printed in between commits, in order for the graph history
@@ -1112,7 +1112,7 @@ This enables parent rewriting, see 'History Simplification' above.
 This implies the `--topo-order` option by default, but the
 `--date-order` option may also be specified.
 
---show-linear-break[=<barrier>]::
+`--show-linear-break[=<barrier>]`::
 	When `--graph` is not used, all history branches are flattened
 	which can make it hard to see that the two consecutive commits
 	do not belong to a linear branch. This option puts a barrier
@@ -1120,7 +1120,7 @@ This implies the `--topo-order` option by default, but the
 	is the string that will be shown instead of the default one.
 
 ifdef::git-rev-list[]
---count::
+`--count`::
 	Print a number stating how many commits would have been
 	listed, and suppress all other output.  When used together
 	with `--left-right`, instead print the counts for left and
diff --git a/Documentation/sequencer.txt b/Documentation/sequencer.txt
index 3bceb56474..093d09fcaf 100644
--- a/Documentation/sequencer.txt
+++ b/Documentation/sequencer.txt
@@ -1,16 +1,16 @@
---continue::
+`--continue`::
 	Continue the operation in progress using the information in
 	`.git/sequencer`.  Can be used to continue after resolving
 	conflicts in a failed cherry-pick or revert.
 
---skip::
+`--skip`::
 	Skip the current commit and continue with the rest of the
 	sequence.
 
---quit::
+`--quit`::
 	Forget about the current operation in progress.  Can be used
 	to clear the sequencer state after a failed cherry-pick or
 	revert.
 
---abort::
+`--abort`::
 	Cancel the operation and return to the pre-sequence state.
diff --git a/Documentation/signoff-option.txt b/Documentation/signoff-option.txt
index 597d057c6e..08daf5d568 100644
--- a/Documentation/signoff-option.txt
+++ b/Documentation/signoff-option.txt
@@ -1,8 +1,8 @@
 ifdef::git-commit[]
--s::
+`-s`::
 endif::git-commit[]
---signoff::
---no-signoff::
+`--signoff`::
+`--no-signoff`::
 	Add a `Signed-off-by` trailer by the committer at the end of the commit
 	log message.  The meaning of a signoff depends on the project
 	to which you're committing.  For example, it may certify that
-- 
2.31.1.133.g84d06cdc06


^ permalink raw reply related	[relevance 1%]

* [RFC PATCH v1 01/13] doc: typeset command-line options in monospace
  @ 2021-04-09  4:02  1% ` Firmin Martin
  2021-04-09  4:02  1% ` [RFC PATCH v1 09/13] doc: typeset command/option/value entries " Firmin Martin
  1 sibling, 0 replies; 200+ results
From: Firmin Martin @ 2021-04-09  4:02 UTC (permalink / raw)
  To: git; +Cc: Firmin Martin

Wrap command-line options with backticks as indicated in the
CodingGuidelines.

The following command and regex assisted the process.

    REGEX="^(?![[:blank:]]*[\$]).*[^-\`+<[:punct:][:alnum:]]\-{1,2}[[:alpha:]][a-z0-9-]*(=[\"<]?([[:alnum:]])+[>\"]?)?[^\`-]" &&
    grep -Pn "$REGEX" *.txt --exclude-dir=RelNotes

Signed-off-by: Firmin Martin <firminmartin24@gmail.com>
---
 Documentation/SubmittingPatches               |   2 +-
 Documentation/blame-options.txt               |   6 +-
 Documentation/config/diff.txt                 |   2 +-
 Documentation/config/gitcvs.txt               |   6 +-
 Documentation/diff-generate-patch.txt         |   4 +-
 Documentation/diff-options.txt                |   8 +-
 Documentation/fetch-options.txt               |  16 +--
 Documentation/git-add.txt                     |   2 +-
 Documentation/git-apply.txt                   |   2 +-
 Documentation/git-archimport.txt              |   2 +-
 Documentation/git-archive.txt                 |   2 +-
 Documentation/git-branch.txt                  |   2 +-
 Documentation/git-bundle.txt                  |  10 +-
 Documentation/git-checkout-index.txt          |   6 +-
 Documentation/git-checkout.txt                |   4 +-
 Documentation/git-cherry-pick.txt             |   2 +-
 Documentation/git-clean.txt                   |   8 +-
 Documentation/git-clone.txt                   |   4 +-
 Documentation/git-column.txt                  |   2 +-
 Documentation/git-commit.txt                  |  16 +--
 Documentation/git-config.txt                  |   6 +-
 Documentation/git-count-objects.txt           |   6 +-
 Documentation/git-cvsexportcommit.txt         |   8 +-
 Documentation/git-cvsimport.txt               |  12 +-
 Documentation/git-cvsserver.txt               |  12 +-
 Documentation/git-daemon.txt                  |  22 ++--
 Documentation/git-describe.txt                |  18 +--
 Documentation/git-diff-tree.txt               |   6 +-
 Documentation/git-diff.txt                    |   6 +-
 Documentation/git-fast-export.txt             |  10 +-
 Documentation/git-fast-import.txt             |  42 +++----
 Documentation/git-fetch-pack.txt              |   4 +-
 Documentation/git-fetch.txt                   |   6 +-
 Documentation/git-filter-branch.txt           |  26 ++---
 Documentation/git-fmt-merge-msg.txt           |   2 +-
 Documentation/git-for-each-ref.txt            |   4 +-
 Documentation/git-format-patch.txt            |   6 +-
 Documentation/git-fsck.txt                    |   6 +-
 Documentation/git-gc.txt                      |   4 +-
 Documentation/git-grep.txt                    |   4 +-
 Documentation/git-help.txt                    |   8 +-
 Documentation/git-http-fetch.txt              |   2 +-
 Documentation/git-http-push.txt               |   2 +-
 Documentation/git-index-pack.txt              |  12 +-
 Documentation/git-init.txt                    |   2 +-
 Documentation/git-interpret-trailers.txt      |  18 +--
 Documentation/git-ls-files.txt                |  24 ++--
 Documentation/git-ls-remote.txt               |   2 +-
 Documentation/git-ls-tree.txt                 |   6 +-
 Documentation/git-mailinfo.txt                |   4 +-
 Documentation/git-mailsplit.txt               |   2 +-
 Documentation/git-merge-index.txt             |   2 +-
 Documentation/git-mv.txt                      |   2 +-
 Documentation/git-name-rev.txt                |  10 +-
 Documentation/git-notes.txt                   |   4 +-
 Documentation/git-p4.txt                      |  26 ++---
 Documentation/git-pack-objects.txt            |  36 +++---
 Documentation/git-patch-id.txt                |   6 +-
 Documentation/git-prune.txt                   |   2 +-
 Documentation/git-pull.txt                    |   6 +-
 Documentation/git-push.txt                    |  10 +-
 Documentation/git-quiltimport.txt             |   2 +-
 Documentation/git-read-tree.txt               |   6 +-
 Documentation/git-rebase.txt                  | 108 +++++++++---------
 Documentation/git-repack.txt                  |   2 +-
 Documentation/git-reset.txt                   |   4 +-
 Documentation/git-rev-parse.txt               |   6 +-
 Documentation/git-rm.txt                      |   2 +-
 Documentation/git-send-email.txt              |  42 +++----
 Documentation/git-send-pack.txt               |   2 +-
 Documentation/git-show-branch.txt             |   2 +-
 Documentation/git-show-ref.txt                |  12 +-
 Documentation/git-status.txt                  |  10 +-
 Documentation/git-submodule.txt               |   2 +-
 Documentation/git-svn.txt                     |  76 ++++++------
 Documentation/git-tag.txt                     |   4 +-
 Documentation/git-update-index.txt            |  12 +-
 Documentation/git-update-ref.txt              |   6 +-
 Documentation/git-verify-pack.txt             |   2 +-
 Documentation/git-web--browse.txt             |   2 +-
 Documentation/git-whatchanged.txt             |   2 +-
 Documentation/git.txt                         |   4 +-
 Documentation/gitcore-tutorial.txt            |   2 +-
 Documentation/gitdiffcore.txt                 |  30 ++---
 Documentation/gitk.txt                        |   6 +-
 Documentation/gittutorial-2.txt               |   4 +-
 Documentation/gittutorial.txt                 |   4 +-
 Documentation/gitweb.conf.txt                 |   6 +-
 Documentation/howto/revert-branch-rebase.txt  |   2 +-
 .../howto/setup-git-server-over-http.txt      |   2 +-
 Documentation/merge-options.txt               |  22 ++--
 Documentation/pretty-formats.txt              |  12 +-
 Documentation/pretty-options.txt              |  20 ++--
 Documentation/rev-list-options.txt            |  28 ++---
 Documentation/signoff-option.txt              |   2 +-
 Documentation/urls.txt                        |   4 +-
 Documentation/user-manual.txt                 |   4 +-
 97 files changed, 479 insertions(+), 479 deletions(-)

diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
index 0452db2e67..e7623d967b 100644
--- a/Documentation/SubmittingPatches
+++ b/Documentation/SubmittingPatches
@@ -158,7 +158,7 @@ invocation of `git show`:
 	git show -s --pretty=reference <commit>
 ....
 
-or, on an older version of Git without support for --pretty=reference:
+or, on an older version of Git without support for `--pretty=reference`:
 
 ....
 	git show -s --date=short --pretty='format:%h (%s, %ad)' <commit>
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index 117f4cf806..860e8e2f5c 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -50,7 +50,7 @@ include::line-range-format.txt[]
 --line-porcelain::
 	Show the porcelain format, but output commit information for
 	each line, not just the first time a commit is referenced.
-	Implies --porcelain.
+	Implies `--porcelain`.
 
 --incremental::
 	Show the result incrementally in a format designed for
@@ -71,11 +71,11 @@ include::line-range-format.txt[]
 	`-` to make the command read from the standard input).
 
 --date <format>::
-	Specifies the format used to output dates. If --date is not
+	Specifies the format used to output dates. If `--date` is not
 	provided, the value of the blame.date config variable is
 	used. If the blame.date config variable is also not set, the
 	iso format is used. For supported values, see the discussion
-	of the --date option at linkgit:git-log[1].
+	of the `--date` option at linkgit:git-log[1].
 
 --[no-]progress::
 	Progress status is reported on the standard error stream
diff --git a/Documentation/config/diff.txt b/Documentation/config/diff.txt
index 2d3331f55c..7556df330c 100644
--- a/Documentation/config/diff.txt
+++ b/Documentation/config/diff.txt
@@ -113,7 +113,7 @@ diff.relative::
 
 diff.orderFile::
 	File indicating how to order files within a diff.
-	See the '-O' option to linkgit:git-diff[1] for details.
+	See the `-O` option to linkgit:git-diff[1] for details.
 	If `diff.orderFile` is a relative pathname, it is treated as
 	relative to the top of the working tree.
 
diff --git a/Documentation/config/gitcvs.txt b/Documentation/config/gitcvs.txt
index 02da427fd9..a188638340 100644
--- a/Documentation/config/gitcvs.txt
+++ b/Documentation/config/gitcvs.txt
@@ -16,16 +16,16 @@ gitcvs.usecrlfattr::
 	the attributes force Git to treat a file as text,
 	the `-k` mode will be left blank so CVS clients will
 	treat it as text. If they suppress text conversion, the file
-	will be set with '-kb' mode, which suppresses any newline munging
+	will be set with `-kb` mode, which suppresses any newline munging
 	the client might otherwise do. If the attributes do not allow
 	the file type to be determined, then `gitcvs.allBinary` is
 	used. See linkgit:gitattributes[5].
 
 gitcvs.allBinary::
 	This is used if `gitcvs.usecrlfattr` does not resolve
-	the correct '-kb' mode to use. If true, all
+	the correct `-kb` mode to use. If true, all
 	unresolved files are sent to the client in
-	mode '-kb'. This causes the client to treat them
+	mode `-kb`. This causes the client to treat them
 	as binary files, which suppresses any newline munging it
 	otherwise might do. Alternatively, if it is set to "guess",
 	then the contents of the file are examined to decide if
diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt
index 2db8eacc3e..2615b29cb0 100644
--- a/Documentation/diff-generate-patch.txt
+++ b/Documentation/diff-generate-patch.txt
@@ -13,7 +13,7 @@ You can customize the creation of patch text via the
 `GIT_EXTERNAL_DIFF` and the `GIT_DIFF_OPTS` environment variables
 (see linkgit:git[1]).
 
-What the -p option produces is slightly different from the traditional
+What the `-p` option produces is slightly different from the traditional
 diff format:
 
 1.   It is preceded with a "git diff" header that looks like this:
@@ -149,7 +149,7 @@ Similar to two-line header for traditional 'unified' diff
 format, `/dev/null` is used to signal created or deleted
 files.
 +
-However, if the --combined-all-paths option is provided, instead of a
+However, if the `--combined-all-paths` option is provided, instead of a
 two-line from-file/to-file you get a N+1 line from-file/to-file header,
 where N is the number of parents in the merge commit
 
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index aa2b5c11f2..13e0753862 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -471,7 +471,7 @@ ifndef::git-format-patch[]
 	that is immediately followed by a tab character inside the
 	initial indent of the line are considered whitespace errors.
 	Exits with non-zero status if problems are found. Not compatible
-	with --exit-code.
+	with `--exit-code`.
 
 --ws-error-highlight=<kind>::
 	Highlight whitespace errors in the `context`, `old` or `new`
@@ -522,10 +522,10 @@ original should remain in the result for Git to consider it a total
 rewrite (i.e. otherwise the resulting patch will be a series of
 deletion and insertion mixed together with context lines).
 +
-When used with -M, a totally-rewritten file is also considered as the
-source of a rename (usually -M only considers a file that disappeared
+When used with `-M`, a totally-rewritten file is also considered as the
+source of a rename (usually `-M` only considers a file that disappeared
 as the source of a rename), and the number `n` controls this aspect of
-the -B option (defaults to 50%). `-B20%` specifies that a change with
+the `-B` option (defaults to 50%). `-B20%` specifies that a change with
 addition and deletion compared to 20% or more of the file's size are
 eligible for being picked up as a possible source of a rename to
 another file.
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 07783deee3..4ccd65c166 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -115,10 +115,10 @@ endif::git-pull[]
 	Before fetching, remove any remote-tracking references that no
 	longer exist on the remote.  Tags are not subject to pruning
 	if they are fetched only because of the default tag
-	auto-following or due to a --tags option.  However, if tags
+	auto-following or due to a `--tags` option.  However, if tags
 	are fetched due to an explicit refspec (either on the command
 	line or in the remote configuration, for example if the remote
-	was cloned with the --mirror option), then they are also
+	was cloned with the `--mirror` option), then they are also
 	subject to pruning. Supplying `--prune-tags` is a shorthand for
 	providing the tag refspec.
 ifndef::git-pull[]
@@ -164,7 +164,7 @@ endif::git-pull[]
 	Fetch all tags from the remote (i.e., fetch remote tags
 	`refs/tags/*` into local tags with the same name), in addition
 	to whatever else would otherwise be fetched.  Using this
-	option alone does not subject tags to pruning, even if --prune
+	option alone does not subject tags to pruning, even if `--prune`
 	is used (though tags may be pruned anyway if they are also the
 	destination of an explicit refspec; see `--prune`).
 
@@ -215,7 +215,7 @@ ifndef::git-pull[]
 
 --recurse-submodules-default=[yes|on-demand]::
 	This option is used internally to temporarily provide a
-	non-negative default value for the --recurse-submodules
+	non-negative default value for the `--recurse-submodules`
 	option.  All other methods of configuring fetch's submodule
 	recursion (such as settings in linkgit:gitmodules[5] and
 	linkgit:git-config[1]) override this option, as does
@@ -240,7 +240,7 @@ endif::git-pull[]
 ifndef::git-pull[]
 -q::
 --quiet::
-	Pass --quiet to git-fetch-pack and silence any other internally
+	Pass `--quiet` to git-fetch-pack and silence any other internally
 	used git commands. Progress is not reported to the standard error
 	stream.
 
@@ -267,14 +267,14 @@ endif::git-pull[]
 --show-forced-updates::
 	By default, git checks if a branch is force-updated during
 	fetch. This can be disabled through fetch.showForcedUpdates, but
-	the --show-forced-updates option guarantees this check occurs.
+	the `--show-forced-updates` option guarantees this check occurs.
 	See linkgit:git-config[1].
 
 --no-show-forced-updates::
 	By default, git checks if a branch is force-updated during
-	fetch. Pass --no-show-forced-updates or set fetch.showForcedUpdates
+	fetch. Pass `--no-show-forced-updates` or set fetch.showForcedUpdates
 	to false to skip this check for performance reasons. If used during
-	'git-pull' the --ff-only option will still check for forced updates
+	'git-pull' the `--ff-only` option will still check for forced updates
 	before attempting a fast-forward update. See linkgit:git-config[1].
 
 -4::
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index be5e3ac54b..6a7cb07a8a 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -164,7 +164,7 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files.
 	true to make this the default behaviour.
 
 --ignore-missing::
-	This option can only be used together with --dry-run. By using
+	This option can only be used together with `--dry-run`. By using
 	this option the user can check if any of the given files would
 	be ignored, no matter if they are already present in the work
 	tree or not.
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt
index 91d9a8601c..f1c8098c0b 100644
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.txt
@@ -233,7 +233,7 @@ behavior:
 	adjusting the hunk headers appropriately).
 
 --directory=<root>::
-	Prepend <root> to all filenames.  If a "-p" argument was also passed,
+	Prepend <root> to all filenames.  If a `-p` argument was also passed,
 	it is applied before prepending the new root.
 +
 For example, a patch that talks about updating `a/git-gui.sh` to `b/git-gui.sh`
diff --git a/Documentation/git-archimport.txt b/Documentation/git-archimport.txt
index a595a0ffee..b477e3c495 100644
--- a/Documentation/git-archimport.txt
+++ b/Documentation/git-archimport.txt
@@ -98,7 +98,7 @@ OPTIONS
 
 -a::
 	Attempt to auto-register archives at `http://mirrors.sourcecontrol.net`
-	This is particularly useful with the -D option.
+	This is particularly useful with the `-D` option.
 
 -t <tmpdir>::
 	Override the default tempdir.
diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt
index 9f8172828d..0af18c9df3 100644
--- a/Documentation/git-archive.txt
+++ b/Documentation/git-archive.txt
@@ -77,7 +77,7 @@ OPTIONS
 	linkgit:git-upload-archive[1] for details.
 
 --exec=<git-upload-archive>::
-	Used with --remote to specify the path to the
+	Used with `--remote` to specify the path to the
 	'git-upload-archive' on the remote side.
 
 <tree-ish>::
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 94dc9a54f2..271b4ee34e 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -280,7 +280,7 @@ start-point is either a local or remote-tracking branch.
 
 --sort=<key>::
 	Sort based on the key given. Prefix `-` to sort in descending
-	order of the value. You may use the --sort=<key> option
+	order of the value. You may use the `--sort=<key>` option
 	multiple times, in which case the last key becomes the primary
 	key. The keys supported are the same as those in `git
 	for-each-ref`. Sort order defaults to the value configured for the
diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt
index 53804cad4b..4f1e59a3b2 100644
--- a/Documentation/git-bundle.txt
+++ b/Documentation/git-bundle.txt
@@ -88,19 +88,19 @@ unbundle <file>::
 	the standard error stream is not directed to a terminal.
 
 --all-progress::
-	When --stdout is specified then progress report is
+	When `--stdout` is specified then progress report is
 	displayed during the object count and compression phases
 	but inhibited during the write-out phase. The reason is
 	that in some cases the output stream is directly linked
 	to another command which may wish to display progress
 	status of its own as it processes incoming pack data.
-	This flag is like --progress except that it forces progress
-	report for the write-out phase as well even if --stdout is
+	This flag is like `--progress` except that it forces progress
+	report for the write-out phase as well even if `--stdout` is
 	used.
 
 --all-progress-implied::
-	This is used to imply --all-progress whenever progress display
-	is activated.  Unlike --all-progress this flag doesn't actually
+	This is used to imply `--all-progress` whenever progress display
+	is activated.  Unlike `--all-progress` this flag doesn't actually
 	force any progress display by itself.
 
 --version=<version>::
diff --git a/Documentation/git-checkout-index.txt b/Documentation/git-checkout-index.txt
index 4d33e7be0f..b06d3ae3d9 100644
--- a/Documentation/git-checkout-index.txt
+++ b/Documentation/git-checkout-index.txt
@@ -52,7 +52,7 @@ OPTIONS
 --stage=<number>|all::
 	Instead of checking out unmerged entries, copy out the
 	files from named stage.  <number> must be between 1 and 3.
-	Note: --stage=all automatically implies --temp.
+	Note: `--stage=all` automatically implies `--temp`.
 
 --temp::
 	Instead of copying the files to the working directory
@@ -88,7 +88,7 @@ $ find . -name '*.h' -print0 | xargs -0 git checkout-index -f --
 which will force all existing `*.h` files to be replaced with their
 cached copies. If an empty command line implied "all", then this would
 force-refresh everything in the index, which was not the point.  But
-since 'git checkout-index' accepts --stdin it would be faster to use:
+since 'git checkout-index' accepts `--stdin` it would be faster to use:
 
 ----------------
 $ find . -name '*.h' -print0 | git checkout-index -f -z --stdin
@@ -128,7 +128,7 @@ or `.` if there is no stage entry.  Paths which only have a stage 0
 entry will always be omitted from the output.
 
 In both formats RS (the record separator) is newline by default
-but will be the null byte if -z was passed on the command line.
+but will be the null byte if `-z` was passed on the command line.
 The temporary file names are always safe strings; they will never
 contain directory separators or whitespace characters.  The path
 field is always relative to the current directory and the temporary
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index b1a6fe4499..3336b8dace 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -151,13 +151,13 @@ of it").
 -B <new_branch>::
 	Creates the branch `<new_branch>` and start it at `<start_point>`;
 	if it already exists, then reset it to `<start_point>`. This is
-	equivalent to running "git branch" with "-f"; see
+	equivalent to running "git branch" with `-f`; see
 	linkgit:git-branch[1] for details.
 
 -t::
 --track::
 	When creating a new branch, set up "upstream" configuration. See
-	"--track" in linkgit:git-branch[1] for details.
+	`--track` in linkgit:git-branch[1] for details.
 +
 If no `-b` option is given, the name of the new branch will be
 derived from the remote-tracking branch, by looking at the local part of
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index 5d750314b2..0127f56204 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -126,7 +126,7 @@ effect to your index in a row.
 	indicating that an explicit invocation of `git commit
 	--allow-empty` is required. This option overrides that
 	behavior, allowing empty commits to be preserved automatically
-	in a cherry-pick. Note that when "--ff" is in effect, empty
+	in a cherry-pick. Note that when `--ff` is in effect, empty
 	commits that meet the "fast-forward" requirement will be kept
 	even without this option.  Note also, that use of this option only
 	keeps commits that were initially empty (i.e. the commit recorded the
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index a7f309dff5..f4246300ae 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -28,8 +28,8 @@ OPTIONS
 -d::
 	Normally, when no <path> is specified, git clean will not
 	recurse into untracked directories to avoid removing too much.
-	Specify -d to have it recurse into such directories as well.
-	If any paths are specified, -d is irrelevant; all untracked
+	Specify `-d` to have it recurse into such directories as well.
+	If any paths are specified, `-d` is irrelevant; all untracked
 	files matching the specified paths (with exceptions for nested
 	git directories mentioned under `--force`) will be removed.
 
@@ -37,9 +37,9 @@ OPTIONS
 --force::
 	If the Git configuration variable clean.requireForce is not set
 	to false, 'git clean' will refuse to delete files or directories
-	unless given -f or -i.  Git will refuse to modify untracked
+	unless given `-f` or `-i`.  Git will refuse to modify untracked
 	nested git repositories (directories with a .git subdirectory)
-	unless a second -f is given.
+	unless a second `-f` is given.
 
 -i::
 --interactive::
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index 3fe3810f1c..22334771d1 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -31,7 +31,7 @@ currently active branch.
 After the clone, a plain `git fetch` without arguments will update
 all the remote-tracking branches, and a `git pull` without
 arguments will in addition merge the remote master branch into the
-current master branch, if any (this is untrue when "--single-branch"
+current master branch, if any (this is untrue when `--single-branch`
 is given; see below).
 
 This default configuration is achieved by creating references to
@@ -52,7 +52,7 @@ OPTIONS
 	to save space when possible.
 +
 If the repository is specified as a local path (e.g., `/path/to/repo`),
-this is the default, and --local is essentially a no-op.  If the
+this is the default, and `--local` is essentially a no-op.  If the
 repository is specified as a URL, then this flag is ignored (and we
 never use the local optimizations).  Specifying `--no-local` will
 override the default when `/path/to/repo` is given, using the regular
diff --git a/Documentation/git-column.txt b/Documentation/git-column.txt
index f58e9c43e6..84a02ac15c 100644
--- a/Documentation/git-column.txt
+++ b/Documentation/git-column.txt
@@ -29,7 +29,7 @@ OPTIONS
 	syntax in linkgit:git-config[1].
 
 --raw-mode=<n>::
-	Same as --mode but take mode encoded as a number. This is mainly used
+	Same as `--mode` but take mode encoded as a number. This is mainly used
 	by other commands that have already parsed layout mode.
 
 --width=<width>::
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 340c5fbb48..6d0d663b50 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -36,18 +36,18 @@ The content to be committed can be specified in several ways:
    and the index, again before using the 'commit' command;
 
 3. by listing files as arguments to the 'commit' command
-   (without --interactive or --patch switch), in which
+   (without `--interactive` or `--patch` switch), in which
    case the commit will ignore changes staged in the index, and instead
    record the current content of the listed files (which must already
    be known to Git);
 
-4. by using the -a switch with the 'commit' command to automatically
+4. by using the `-a` switch with the 'commit' command to automatically
    "add" changes from all known files (i.e. all files that are already
    listed in the index) and to automatically "rm" files in the index
    that have been removed from the working tree, and then perform the
    actual commit;
 
-5. by using the --interactive or --patch switches with the 'commit' command
+5. by using the `--interactive` or `--patch` switches with the 'commit' command
    to decide one by one which files or hunks should be part of the commit
    in addition to contents in the index,
    before finalizing the operation. See the ``Interactive Mode'' section of
@@ -84,7 +84,7 @@ OPTIONS
 
 -c <commit>::
 --reedit-message=<commit>::
-	Like '-C', but with `-c` the editor is invoked, so that
+	Like `-C`, but with `-c` the editor is invoked, so that
 	the user can further edit the commit message.
 
 --fixup=[(amend|reword):]<commit>::
@@ -134,7 +134,7 @@ See linkgit:git-rebase[1] for details.
 	linkgit:git-rebase[1] for details.
 
 --reset-author::
-	When used with -C/-c/--amend options, or when committing after a
+	When used with `-C`/`-c`/`--amend` options, or when committing after a
 	conflicting cherry-pick, declare that the authorship of the
 	resulting commit now belongs to the committer. This also renews
 	the author timestamp.
@@ -173,7 +173,7 @@ See linkgit:git-rebase[1] for details.
 	Override the commit author. Specify an explicit author using the
 	standard `A U Thor <author@example.com>` format. Otherwise <author>
 	is assumed to be a pattern and is used to search for an existing
-	commit by that author (i.e. rev-list --all -i --author=<author>);
+	commit by that author (i.e. `git rev-list --all -i --author=<author>`);
 	the commit author is then copied from the first such commit found.
 
 --date=<date>::
@@ -223,7 +223,7 @@ include::signoff-option.txt[]
 	is primarily for use by foreign SCM interface scripts.
 
 --allow-empty-message::
-       Like --allow-empty this command is primarily for use by foreign
+       Like `--allow-empty` this command is primarily for use by foreign
        SCM interface scripts. It allows you to create a commit with an
        empty commit message without using plumbing commands like
        linkgit:git-commit-tree[1].
@@ -337,7 +337,7 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
 +
 --
 The mode parameter is optional (defaults to 'all'), and is used to
-specify the handling of untracked files; when -u is not used, the
+specify the handling of untracked files; when `-u` is not used, the
 default is 'normal', i.e. show untracked files and directories.
 
 The possible options are:
diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 4b4cc5c5e8..b93394ea45 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -92,7 +92,7 @@ OPTIONS
 	Like get, but returns all values for a multi-valued key.
 
 --get-regexp::
-	Like --get-all, but interprets the name as a regular expression and
+	Like `--get-all`, but interprets the name as a regular expression and
 	writes out the key names.  Regular expression matching is currently
 	case-sensitive and done against a canonicalized version of the key
 	in which section and variable names are lowercased, but subsection
@@ -337,8 +337,8 @@ ENVIRONMENT
 
 GIT_CONFIG::
 	Take the configuration from the given file instead of .git/config.
-	Using the "--global" option forces this to ~/.gitconfig. Using the
-	"--system" option forces this to $(prefix)/etc/gitconfig.
+	Using the `--global` option forces this to ~/.gitconfig. Using the
+	`--system` option forces this to $(prefix)/etc/gitconfig.
 
 GIT_CONFIG_NOSYSTEM::
 	Whether to skip reading settings from the system-wide
diff --git a/Documentation/git-count-objects.txt b/Documentation/git-count-objects.txt
index cb9b4d2e46..d12ce08789 100644
--- a/Documentation/git-count-objects.txt
+++ b/Documentation/git-count-objects.txt
@@ -24,11 +24,11 @@ OPTIONS
 +
 count: the number of loose objects
 +
-size: disk space consumed by loose objects, in KiB (unless -H is specified)
+size: disk space consumed by loose objects, in KiB (unless `-H` is specified)
 +
 in-pack: the number of in-pack objects
 +
-size-pack: disk space consumed by the packs, in KiB (unless -H is specified)
+size-pack: disk space consumed by the packs, in KiB (unless `-H` is specified)
 +
 prune-packable: the number of loose objects that are also present in
 the packs. These objects could be pruned using `git prune-packed`.
@@ -36,7 +36,7 @@ the packs. These objects could be pruned using `git prune-packed`.
 garbage: the number of files in object database that are neither valid loose
 objects nor valid packs
 +
-size-garbage: disk space consumed by garbage files, in KiB (unless -H is
+size-garbage: disk space consumed by garbage files, in KiB (unless `-H` is
 specified)
 +
 alternate: absolute path of alternate object databases; may appear
diff --git a/Documentation/git-cvsexportcommit.txt b/Documentation/git-cvsexportcommit.txt
index 00154b6c85..f08ab508af 100644
--- a/Documentation/git-cvsexportcommit.txt
+++ b/Documentation/git-cvsexportcommit.txt
@@ -18,7 +18,7 @@ DESCRIPTION
 Exports a commit from Git to a CVS checkout, making it easier
 to merge patches from a Git repository into a CVS repository.
 
-Specify the name of a CVS checkout using the -w switch or execute it
+Specify the name of a CVS checkout using the `-w` switch or execute it
 from the root of the CVS working copy. In the latter case GIT_DIR must
 be defined. See examples below.
 
@@ -40,7 +40,7 @@ OPTIONS
 
 -p::
 	Be pedantic (paranoid) when applying patches. Invokes patch with
-	--fuzz=0
+	`--fuzz=0`
 
 -a::
 	Add authorship information. Adds Author line, and Committer (if
@@ -48,7 +48,7 @@ OPTIONS
 
 -d::
 	Set an alternative CVSROOT to use.  This corresponds to the CVS
-	-d parameter.  Usually users will not want to set this, except
+	`-d` parameter.  Usually users will not want to set this, except
 	if using CVS in an asymmetric fashion.
 
 -f::
@@ -99,7 +99,7 @@ $ git cvsexportcommit -v <commit-sha1>
 $ cvs commit -F .msg <files>
 ------------
 
-Merge one patch into CVS (-c and -w options). The working directory is within the Git Repo::
+Merge one patch into CVS (`-c` and `-w` options). The working directory is within the Git Repo::
 +
 ------------
 	$ git cvsexportcommit -v -c -w ~/project_cvs_checkout <commit-sha1>
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index de1ebed67d..143c726511 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -38,7 +38,7 @@ created by 'git cvsimport'.  By default initial import will create and populate
 "master" branch from the CVS repository's main branch which you're free
 to work with; after that, you need to 'git merge' incremental imports, or
 any CVS branches, yourself.  It is advisable to specify a named remote via
--r to separate and protect the incoming branches.
+`-r` to separate and protect the incoming branches.
 
 If you intend to set up a shared public repository that all developers can
 read/write, or if you want to use linkgit:git-cvsserver[1], then you
@@ -74,7 +74,7 @@ OPTIONS
 	akin to the way 'git clone' uses 'origin' by default.
 
 -o <branch-for-HEAD>::
-	When no remote is specified (via -r) the `HEAD` branch
+	When no remote is specified (via `-r`) the `HEAD` branch
 	from CVS is imported to the 'origin' branch within the Git
 	repository, as `HEAD` already has a special meaning for Git.
 	When a remote is specified the `HEAD` branch is named
@@ -82,7 +82,7 @@ OPTIONS
 	Use this option if you want to import into a different
 	branch.
 +
-Use '-o master' for continuing an import that was initially done by
+Use `-o master` for continuing an import that was initially done by
 the old cvs2git tool.
 
 -i::
@@ -91,7 +91,7 @@ the old cvs2git tool.
 	not create them if they do not exist.
 
 -k::
-	Kill keywords: will extract files with '-kk' from the CVS archive
+	Kill keywords: will extract files with `-kk` from the CVS archive
 	to avoid noisy changesets. Highly recommended, but off by default
 	to preserve compatibility with early imported trees.
 
@@ -103,7 +103,7 @@ the old cvs2git tool.
 
 -p <options-for-cvsps>::
 	Additional options for cvsps.
-	The options `-u` and '-A' are implicit and should not be used here.
+	The options `-u` and `-A` are implicit and should not be used here.
 +
 If you need to pass multiple options, separate them with a comma.
 
@@ -158,7 +158,7 @@ all along.  If a time zone is specified, GIT_AUTHOR_DATE will
 have the corresponding offset applied.
 +
 For convenience, this data is saved to `$GIT_DIR/cvs-authors`
-each time the '-A' option is provided and read from that same
+each time the `-A` option is provided and read from that same
 file each time 'git cvsimport' is run.
 +
 It is not recommended to use this feature if you intend to
diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt
index 1b1c71ad9d..955bae46c9 100644
--- a/Documentation/git-cvsserver.txt
+++ b/Documentation/git-cvsserver.txt
@@ -119,7 +119,7 @@ for example:
 ------
 You can use the 'htpasswd' facility that comes with Apache to make these
 files, but Apache's MD5 crypt method differs from the one used by most C
-library's crypt() function, so don't use the -m option.
+library's crypt() function, so don't use the `-m` option.
 
 Alternatively you can produce the password with perl's crypt() operator:
 -----
@@ -312,7 +312,7 @@ ENVIRONMENT
 These variables obviate the need for command-line options in some
 circumstances, allowing easier restricted usage through git-shell.
 
-GIT_CVSSERVER_BASE_PATH takes the place of the argument to --base-path.
+GIT_CVSSERVER_BASE_PATH takes the place of the argument to `--base-path`.
 
 GIT_CVSSERVER_ROOT specifies a single-directory whitelist. The
 repository must still be configured to allow access through
@@ -361,7 +361,7 @@ All the operations required for normal use are supported, including
 checkout, diff, status, update, log, add, remove, commit.
 
 Most CVS command arguments that read CVS tags or revision numbers
-(typically -r) work, and also support any git refspec
+(typically `-r`) work, and also support any git refspec
 (tag, branch, commit ID, etc).
 However, CVS revision numbers for non-default branches are not well
 emulated, and cvs log does not show tags or branches at
@@ -374,7 +374,7 @@ As described elsewhere on this page, the "module" parameter
 of cvs checkout is interpreted as a branch name, and it becomes
 the main branch.  It remains the main branch for a given sandbox
 even if you temporarily make another branch sticky with
-cvs update -r.  Alternatively, the -r argument can indicate
+cvs update -r.  Alternatively, the `-r` argument can indicate
 some other branch to actually checkout, even though the module
 is still the "main" branch.  Tradeoffs (as currently
 implemented): Each new "module" creates a new database on disk with
@@ -385,7 +385,7 @@ many operations, like cvs update.
 
 If you want to refer to a git refspec that has characters that are
 not allowed by CVS, you have two options.  First, it may just work
-to supply the git refspec directly to the appropriate CVS -r argument;
+to supply the git refspec directly to the appropriate CVS `-r` argument;
 some CVS clients don't seem to do much sanity checking of the argument.
 Second, if that fails, you can use a special character escape mechanism
 that only uses characters that are valid in CVS tags.  A sequence
@@ -415,7 +415,7 @@ Alternatively, if `gitcvs.usecrlfattr` config is not enabled
 or the attributes do not allow automatic detection for a filename, then
 the server uses the `gitcvs.allBinary` config for the default setting.
 If `gitcvs.allBinary` is set, then file not otherwise
-specified will default to '-kb' mode. Otherwise the `-k` mode
+specified will default to `-kb` mode. Otherwise the `-k` mode
 is left blank. But if `gitcvs.allBinary` is set to "guess", then
 the correct `-k` mode will be guessed based on the contents of
 the file.
diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt
index fdc28c041c..2794a2d0c1 100644
--- a/Documentation/git-daemon.txt
+++ b/Documentation/git-daemon.txt
@@ -55,14 +55,14 @@ OPTIONS
 --base-path=<path>::
 	Remap all the path requests as relative to the given path.
 	This is sort of "Git root" - if you run 'git daemon' with
-	'--base-path=/srv/git' on example.com, then if you later try to pull
+	`--base-path=/srv/git` on example.com, then if you later try to pull
 	'git://example.com/hello.git', 'git daemon' will interpret the path
 	as `/srv/git/hello.git`.
 
 --base-path-relaxed::
-	If --base-path is enabled and repo lookup fails, with this option
+	If `--base-path` is enabled and repo lookup fails, with this option
 	'git daemon' will attempt to lookup without prefixing the base path.
-	This is useful for switching to --base-path usage, while still
+	This is useful for switching to `--base-path` usage, while still
 	allowing the old paths.
 
 --interpolated-path=<pathtemplate>::
@@ -81,16 +81,16 @@ OPTIONS
 	do not have the 'git-daemon-export-ok' file.
 
 --inetd::
-	Have the server run as an inetd service. Implies --syslog (may be
+	Have the server run as an inetd service. Implies `--syslog` (may be
 	overridden with `--log-destination=`).
-	Incompatible with --detach, --port, --listen, --user and --group
+	Incompatible with `--detach`, `--port`, `--listen`, `--user` and `--group`
 	options.
 
 --listen=<host_or_ipaddr>::
 	Listen on a specific IP address or hostname.  IP addresses can
 	be either an IPv4 address or an IPv6 address if supported.  If IPv6
-	is not supported, then --listen=hostname is also not supported and
-	--listen must be given an IPv4 address.
+	is not supported, then `--listen=hostname` is also not supported and
+	`--listen` must be given an IPv4 address.
 	Can be given more than once.
 	Incompatible with `--inetd` option.
 
@@ -116,7 +116,7 @@ OPTIONS
 
 --log-destination=<destination>::
 	Send log messages to the specified destination.
-	Note that this option does not imply --verbose,
+	Note that this option does not imply `--verbose`,
 	thus by default only error conditions will be logged.
 	The <destination> must be one of:
 +
@@ -154,7 +154,7 @@ otherwise `stderr`.
 	old connections to time out.
 
 --detach::
-	Detach from the shell. Implies --syslog.
+	Detach from the shell. Implies `--syslog`.
 
 --pid-file=<file>::
 	Save the process id in 'file'.  Ignored when the daemon
@@ -200,7 +200,7 @@ Git configuration files in that directory are readable by `<user>`.
 	is more convenient for clients, but may leak information about
 	the existence of unexported repositories.  When informative
 	errors are not enabled, all errors report "access denied" to the
-	client. The default is --no-informative-errors.
+	client. The default is `--no-informative-errors`.
 
 --access-hook=<path>::
 	Every time a client connects, first run an external command
@@ -219,7 +219,7 @@ it declines the service.
 
 <directory>::
 	A directory to add to the whitelist of allowed directories. Unless
-	--strict-paths is specified this will also include subdirectories
+	`--strict-paths` is specified this will also include subdirectories
 	of each named directory.
 
 SERVICES
diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt
index a88f6ae2c6..a3f015743b 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.txt
@@ -22,9 +22,9 @@ abbreviated object name of the most recent commit. The result
 is a "human-readable" object name which can also be used to
 identify the commit to other git commands.
 
-By default (without --all or --tags) `git describe` only shows
+By default (without `--all` or `--tags`) `git describe` only shows
 annotated tags.  For more information about creating annotated tags
-see the -a and -s options to linkgit:git-tag[1].
+see the `-a` and `-s` options to linkgit:git-tag[1].
 
 If the given object refers to a blob, it will be described
 as `<commit-ish>:<path>`, such that the blob can be found
@@ -60,7 +60,7 @@ OPTIONS
 --contains::
 	Instead of finding the tag that predates the commit, find
 	the tag that comes after the commit, and thus contains it.
-	Automatically implies --tags.
+	Automatically implies `--tags`.
 
 --abbrev=<n>::
 	Instead of using the default 7 hexadecimal digits as the
@@ -77,7 +77,7 @@ OPTIONS
 
 --exact-match::
 	Only output exact matches (a tag directly references the
-	supplied commit).  This is a synonym for --candidates=0.
+	supplied commit).  This is a synonym for `--candidates=0`.
 
 --debug::
 	Verbosely display information about the searching strategy
@@ -110,9 +110,9 @@ OPTIONS
 	excluding respectively "refs/heads/" and "refs/remotes/" prefix;
 	references of other types are never considered. If given multiple times,
 	a list of patterns will be accumulated and tags matching any of the
-	patterns will be excluded. When combined with --match a tag will be
-	considered when it matches at least one --match pattern and does not
-	match any of the --exclude patterns. Use `--no-exclude` to clear and
+	patterns will be excluded. When combined with `--match` a tag will be
+	considered when it matches at least one `--match` pattern and does not
+	match any of the `--exclude` patterns. Use `--no-exclude` to clear and
 	reset the list of patterns.
 
 --always::
@@ -150,7 +150,7 @@ Doing a 'git describe' on a tag-name will just show the tag name:
 	[torvalds@g5 git]$ git describe v1.0.4
 	v1.0.4
 
-With --all, the command can use branch heads as references, so
+With `--all`, the command can use branch heads as references, so
 the output shows the reference path as well:
 
 	[torvalds@g5 git]$ git describe --all --abbrev=4 v1.0.5^2
@@ -159,7 +159,7 @@ the output shows the reference path as well:
 	[torvalds@g5 git]$ git describe --all --abbrev=4 HEAD^
 	heads/lt/describe-7-g975b
 
-With --abbrev set to 0, the command can be used to find the
+With `--abbrev` set to 0, the command can be used to find the
 closest tagname without any suffix:
 
 	[torvalds@g5 git]$ git describe --abbrev=0 v1.0.5^2
diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt
index 2fc24c542f..b9225cd824 100644
--- a/Documentation/git-diff-tree.txt
+++ b/Documentation/git-diff-tree.txt
@@ -18,7 +18,7 @@ DESCRIPTION
 Compares the content and mode of the blobs found via two tree objects.
 
 If there is only one <tree-ish> given, the commit is compared with its parents
-(see --stdin below).
+(see `--stdin` below).
 
 Note that 'git diff-tree' can use the tree encapsulated in a commit object.
 
@@ -37,7 +37,7 @@ include::diff-options.txt[]
         recurse into sub-trees
 
 -t::
-	show tree entry itself as well as subtrees.  Implies -r.
+	show tree entry itself as well as subtrees.  Implies `-r`.
 
 --root::
 	When `--root` is specified the initial commit will be shown as a big
@@ -113,7 +113,7 @@ include::pretty-options.txt[]
 --combined-all-paths::
 	This flag causes combined diffs (used for merge commits) to
 	list the name of the file from all parents.  It thus only has
-	effect when -c or --cc are specified, and is likely only
+	effect when `-c` or `--cc` are specified, and is likely only
 	useful if filename changes are detected (i.e. when either
 	rename or copy detection have been requested).
 
diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt
index 7f4c8a8ce7..9f4b46c910 100644
--- a/Documentation/git-diff.txt
+++ b/Documentation/git-diff.txt
@@ -48,9 +48,9 @@ files on disk.
 	do not give <commit>, it defaults to HEAD.
 	If HEAD does not exist (e.g. unborn branches) and
 	<commit> is not given, it shows all staged changes.
-	--staged is a synonym of --cached.
+	`--staged` is a synonym of `--cached`.
 +
-If --merge-base is given, instead of using <commit>, use the merge base
+If `--merge-base` is given, instead of using <commit>, use the merge base
 of <commit> and HEAD.  `git diff --merge-base A` is equivalent to
 `git diff $(git merge-base A HEAD)`.
 
@@ -67,7 +67,7 @@ of <commit> and HEAD.  `git diff --merge-base A` is equivalent to
 	This is to view the changes between two arbitrary
 	<commit>.
 +
-If --merge-base is given, use the merge base of the two commits for the
+If `--merge-base` is given, use the merge base of the two commits for the
 "before" side.  `git diff --merge-base A B` is equivalent to
 `git diff $(git merge-base A B) B`.
 
diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt
index 1978dbdc6a..a1c02918f9 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.txt
@@ -67,14 +67,14 @@ produced incorrect results if you gave these options.
 	have been completed, or to save the marks table across
 	incremental runs.  As <file> is only opened and truncated
 	at completion, the same path can also be safely given to
-	--import-marks.
+	`--import-marks`.
 	The file will not be written if no new object has been
 	marked/exported.
 
 --import-marks=<file>::
 	Before processing any input, load the marks specified in
 	<file>.  The input file must exist, must be readable, and
-	must use the same format as produced by --export-marks.
+	must use the same format as produced by `--export-marks`.
 
 --mark-tags::
 	In addition to labelling blobs and commits with mark ids, also
@@ -86,7 +86,7 @@ produced incorrect results if you gave these options.
 	identifiers.
 +
 Any commits (or tags) that have already been marked will not be
-exported again.  If the backend uses a similar --import-marks file,
+exported again.  If the backend uses a similar `--import-marks` file,
 this allows for incremental bidirectional exporting of the repository
 by keeping the marks the same across runs.
 
@@ -130,7 +130,7 @@ by keeping the marks the same across runs.
 	and will make master{tilde}4 no longer have master{tilde}5 as
 	a parent (though both the old master{tilde}4 and new
 	master{tilde}4 will have all the same files).  Use
-	--reference-excluded-parents to instead have the stream
+	`--reference-excluded-parents` to instead have the stream
 	refer to commits in the excluded range of history by their
 	sha1sum.  Note that the resulting stream can only be used by a
 	repository which already contains the necessary parent
@@ -160,7 +160,7 @@ by keeping the marks the same across runs.
 	to export.  For example, `master~10..master` causes the
 	current master reference to be exported along with all objects
 	added since its 10th ancestor commit and (unless the
-	--reference-excluded-parents option is specified) all files
+	`--reference-excluded-parents` option is specified) all files
 	common to master{tilde}9 and master{tilde}10.
 
 EXAMPLES
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index 39cfa05b28..ff67238633 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -40,7 +40,7 @@ OPTIONS
 	not contain the old commit).
 
 --quiet::
-	Disable the output shown by --stats, making fast-import usually
+	Disable the output shown by `--stats`, making fast-import usually
 	be silent when it is successful.  However, if the import stream
 	has directives intended to show user output (e.g. `progress`
 	directives), the corresponding messages will still be shown.
@@ -49,7 +49,7 @@ OPTIONS
 	Display some basic statistics about the objects fast-import has
 	created, the packfiles they were stored into, and the
 	memory used by fast-import during this run.  Showing this output
-	is currently the default, but can be disabled with --quiet.
+	is currently the default, but can be disabled with `--quiet`.
 
 --allow-unsafe-features::
 	Many command-line options can be provided as part of the
@@ -97,23 +97,23 @@ Locations of Marks Files
 	have been completed, or to save the marks table across
 	incremental runs.  As <file> is only opened and truncated
 	at checkpoint (or completion) the same path can also be
-	safely given to --import-marks.
+	safely given to `--import-marks`.
 
 --import-marks=<file>::
 	Before processing any input, load the marks specified in
 	<file>.  The input file must exist, must be readable, and
-	must use the same format as produced by --export-marks.
+	must use the same format as produced by `--export-marks`.
 	Multiple options may be supplied to import more than one
 	set of marks.  If a mark is defined to different values,
 	the last file wins.
 
 --import-marks-if-exists=<file>::
-	Like --import-marks but instead of erroring out, silently
+	Like `--import-marks` but instead of erroring out, silently
 	skips the file if it does not exist.
 
 --[no-]relative-marks::
-	After specifying --relative-marks the paths specified
-	with --import-marks= and --export-marks= are relative
+	After specifying `--relative-marks` the paths specified
+	with `--import-marks`= and `--export-marks`= are relative
 	to an internal directory in the current repository.
 	In git-fast-import this means that the paths are relative
 	to the .git/info/fast-import directory. However, other
@@ -217,8 +217,8 @@ fast-forward update, fast-import will skip updating that ref and instead
 prints a warning message.  fast-import will always attempt to update all
 branch refs, and does not stop on the first failure.
 
-Branch updates can be forced with --force, but it's recommended that
-this only be used on an otherwise quiet repository.  Using --force
+Branch updates can be forced with `--force`, but it's recommended that
+this only be used on an otherwise quiet repository.  Using `--force`
 is not necessary for an initial import into an empty repository.
 
 
@@ -269,11 +269,11 @@ Date Formats
 ~~~~~~~~~~~~
 The following date formats are supported.  A frontend should select
 the format it will use for this import by passing the format name
-in the --date-format=<fmt> command-line option.
+in the `--date-format`=<fmt> command-line option.
 
 `raw`::
 	This is the Git native format and is `<time> SP <offutc>`.
-	It is also fast-import's default format, if --date-format was
+	It is also fast-import's default format, if `--date-format` was
 	not specified.
 +
 The time of the event is specified by `<time>` as the number of
@@ -381,7 +381,7 @@ and control the current import process.  More detailed discussion
 
 `alias`::
 	Record that a mark refers to a given object without first
-	creating any new object.  Using --import-marks and referring
+	creating any new object.  Using `--import-marks` and referring
 	to missing marks will cause fast-import to fail, so aliases
 	can provide a way to set otherwise pruned commits to a valid
 	value (e.g. the nearest non-pruned ancestor).
@@ -501,7 +501,7 @@ the email address from the other fields in the line.  Note that
 of bytes, except `LT`, `GT` and `LF`.  `<name>` is typically UTF-8 encoded.
 
 The time of the change is specified by `<when>` using the date format
-that was selected by the --date-format=<fmt> command-line option.
+that was selected by the `--date-format`=<fmt> command-line option.
 See ``Date Formats'' above for the set of supported formats, and
 their syntax.
 
@@ -989,7 +989,7 @@ save out all current branch refs, tags and marks.
 ....
 
 Note that fast-import automatically switches packfiles when the current
-packfile reaches --max-pack-size, or 4 GiB, whichever limit is
+packfile reaches `--max-pack-size`, or 4 GiB, whichever limit is
 smaller.  During an automatic packfile switch fast-import does not update
 the branch refs, tags or marks.
 
@@ -1152,10 +1152,10 @@ force::
 
 import-marks::
 import-marks-if-exists::
-	Like --import-marks except in two respects: first, only one
+	Like `--import-marks` except in two respects: first, only one
 	"feature import-marks" or "feature import-marks-if-exists"
-	command is allowed per stream; second, an --import-marks=
-	or --import-marks-if-exists command-line option overrides
+	command is allowed per stream; second, an `--import-marks=`
+	or `--import-marks-if-exists` command-line option overrides
 	any of these "feature" commands in the stream; third,
 	"feature import-marks-if-exists" like a corresponding
 	command-line option silently skips a nonexistent file.
@@ -1346,7 +1346,7 @@ users of fast-import, and are offered here as suggestions.
 Use One Mark Per Commit
 ~~~~~~~~~~~~~~~~~~~~~~~
 When doing a repository conversion, use a unique mark per commit
-(`mark :<n>`) and supply the --export-marks option on the command
+(`mark :<n>`) and supply the `--export-marks` option on the command
 line.  fast-import will dump a file which lists every mark and the Git
 object SHA-1 that corresponds to it.  If the frontend can tie
 the marks back to the source repository, it is easy to verify the
@@ -1411,7 +1411,7 @@ even for considerably large projects (100,000+ commits).
 
 However repacking the repository is necessary to improve data
 locality and access performance.  It can also take hours on extremely
-large projects (especially if -f and a large --window parameter is
+large projects (especially if `-f` and a large `--window` parameter is
 used).  Since repacking is safe to run alongside readers and writers,
 run the repack in the background and let it finish when it finishes.
 There is no reason to wait to explore your new Git project!
@@ -1425,7 +1425,7 @@ Repacking Historical Data
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 If you are repacking very old imported data (e.g. older than the
 last year), consider expending some extra CPU time and supplying
---window=50 (or higher) when you run 'git repack'.
+`--window=50` (or higher) when you run 'git repack'.
 This will take longer, but will also produce a smaller packfile.
 You only need to expend the effort once, and everyone using your
 project will benefit from the smaller repository.
@@ -1534,7 +1534,7 @@ branch, their in-memory storage size can grow to a considerable size
 fast-import automatically moves active branches to inactive status based on
 a simple least-recently-used algorithm.  The LRU chain is updated on
 each `commit` command.  The maximum number of active branches can be
-increased or decreased on the command line with --active-branches=.
+increased or decreased on the command line with `--active-branches`=.
 
 per active tree
 ~~~~~~~~~~~~~~~
diff --git a/Documentation/git-fetch-pack.txt b/Documentation/git-fetch-pack.txt
index c975884793..88c2b9d426 100644
--- a/Documentation/git-fetch-pack.txt
+++ b/Documentation/git-fetch-pack.txt
@@ -80,7 +80,7 @@ be in a separate packet, and the list must end with a flush packet.
 	the things up in .bash_profile).
 
 --exec=<git-upload-pack>::
-	Same as --upload-pack=<git-upload-pack>.
+	Same as `--upload-pack`=<git-upload-pack>.
 
 --depth=<n>::
 	Limit fetching to ancestor-chains not longer than n.
@@ -97,7 +97,7 @@ be in a separate packet, and the list must end with a flush packet.
 	This option can be specified multiple times.
 
 --deepen-relative::
-	Argument --depth specifies the number of commits from the
+	Argument `--depth` specifies the number of commits from the
 	current shallow boundary instead of from the tip of each
 	remote branch history.
 
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index 9067c2079e..85b073a61a 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -25,7 +25,7 @@ of <refspec> below for ways to control this behavior).
 By default, any tag that points into the histories being fetched is
 also fetched; the effect is to fetch tags that
 point at branches that you are interested in.  This default behavior
-can be changed by using the --tags or --no-tags options or by
+can be changed by using the `--tags` or `--no-tags` options or by
 configuring remote.<name>.tagOpt.  By using a refspec that fetches tags
 explicitly, you can fetch tags that do not point into branches you
 are interested in as well.
@@ -204,7 +204,7 @@ representing the status of a single ref. Each line is of the form:
  <flag> <summary> <from> -> <to> [<reason>]
 -------------------------------
 
-The status of up-to-date refs is shown only if the --verbose option is
+The status of up-to-date refs is shown only if the `--verbose` option is
 used.
 
 In compact output mode, specified with configuration variable
@@ -287,7 +287,7 @@ include::transfer-data-leaks.txt[]
 
 BUGS
 ----
-Using --recurse-submodules can only fetch new commits in already checked
+Using `--recurse-submodules` can only fetch new commits in already checked
 out submodules right now. When e.g. upstream added a new submodule in the
 just fetched commits of the superproject the submodule itself cannot be
 fetched, making it impossible to check out that submodule later without
diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt
index 62e482a95e..2de3511459 100644
--- a/Documentation/git-filter-branch.txt
+++ b/Documentation/git-filter-branch.txt
@@ -133,8 +133,8 @@ OPTIONS
 	It will receive the parent string on stdin and shall output
 	the new parent string on stdout.  The parent string is in
 	the format described in linkgit:git-commit-tree[1]: empty for
-	the initial commit, "-p parent" for a normal commit and
-	"-p parent1 -p parent2 -p parent3 ..." for a merge commit.
+	the initial commit, `-p parent` for a normal commit and
+	`-p parent1 -p parent2 -p parent3 ...` for a merge commit.
 
 --msg-filter <command>::
 	This is the filter for rewriting the commit messages.
@@ -170,7 +170,7 @@ and that makes no change to the tree.
 	tag name is expected on standard output.
 +
 The original tags are not deleted, but can be overwritten;
-use "--tag-name-filter cat" to simply update the tags.  In this
+use `--tag-name-filter cat` to simply update the tags.  In this
 case, be very careful and make sure you have the old tags
 backed up in case the conversion has run afoul.
 +
@@ -598,12 +598,12 @@ with:
   sensitive files and others which don't.  This comes about in
   multiple different ways:
 
-  ** the default to only doing a partial history rewrite ('--all' is not
+  ** the default to only doing a partial history rewrite (`--all` is not
      the default and few examples show it)
 
   ** the fact that there's no automatic post-run cleanup
 
-  ** the fact that --tag-name-filter (when used to rename tags) doesn't
+  ** the fact that `--tag-name-filter` (when used to rename tags) doesn't
      remove the old tags but just adds new ones with the new name
 
   ** the fact that little educational information is provided to inform
@@ -623,15 +623,15 @@ with:
      git-filter-branch command.  (The backup in refs/original/ is not a
      real backup; it dereferences tags first.)
 
-  ** Running git-filter-branch with either --tags or --all in your
+  ** Running git-filter-branch with either `--tags` or `--all` in your
      <rev-list options>.  In order to retain annotated tags as
-     annotated, you must use --tag-name-filter (and must not have
+     annotated, you must use `--tag-name-filter` (and must not have
      restored from refs/original/ in a previously botched rewrite).
 
 * Any commit messages that specify an encoding will become corrupted
   by the rewrite; git-filter-branch ignores the encoding, takes the
   original bytes, and feeds it to commit-tree without telling it the
-  proper encoding.  (This happens whether or not --msg-filter is
+  proper encoding.  (This happens whether or not `--msg-filter` is
   used.)
 
 * Commit messages (even if they are all UTF-8) by default become
@@ -650,21 +650,21 @@ with:
   dependencies (node_modules or similar) which couldn't have ever been
   functional since it's missing some files.)
 
-* If --prune-empty isn't specified, then the filtering process can
+* If `--prune-empty` isn't specified, then the filtering process can
   create hoards of confusing empty commits
 
-* If --prune-empty is specified, then intentionally placed empty
+* If `--prune-empty` is specified, then intentionally placed empty
   commits from before the filtering operation are also pruned instead
   of just pruning commits that became empty due to filtering rules.
 
-* If --prune-empty is specified, sometimes empty commits are missed
+* If `--prune-empty` is specified, sometimes empty commits are missed
   and left around anyway (a somewhat rare bug, but it happens...)
 
 * A minor issue, but users who have a goal to update all names and
-  emails in a repository may be led to --env-filter which will only
+  emails in a repository may be led to `--env-filter` which will only
   update authors and committers, missing taggers.
 
-* If the user provides a --tag-name-filter that maps multiple tags to
+* If the user provides a `--tag-name-filter` that maps multiple tags to
   the same name, no warning or error is provided; git-filter-branch
   simply overwrites each tag in some undocumented pre-defined order
   resulting in only one tag at the end.  (A git-filter-branch
diff --git a/Documentation/git-fmt-merge-msg.txt b/Documentation/git-fmt-merge-msg.txt
index 6793d8fc05..9004861eae 100644
--- a/Documentation/git-fmt-merge-msg.txt
+++ b/Documentation/git-fmt-merge-msg.txt
@@ -36,7 +36,7 @@ OPTIONS
 	merged.
 
 --[no-]summary::
-	Synonyms to --log and --no-log; these are deprecated and will be
+	Synonyms to `--log` and `--no-log`; these are deprecated and will be
 	removed in the future.
 
 -m <message>::
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 2ae2478de7..e035edf11d 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -40,7 +40,7 @@ OPTIONS
 --sort=<key>::
 	A field name to sort on.  Prefix `-` to sort in
 	descending order of the value.  When unspecified,
-	`refname` is used.  You may use the --sort=<key> option
+	`refname` is used.  You may use the `--sort=<key>` option
 	multiple times, in which case the last key becomes the primary
 	key.
 
@@ -309,7 +309,7 @@ Ref: %(*refname)
 
 
 A simple example showing the use of shell eval on the output,
-demonstrating the use of --shell.  List the prefixes of all heads:
+demonstrating the use of `--shell`.  List the prefixes of all heads:
 ------------
 #!/bin/sh
 
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 911da181a1..ca500ba72c 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -238,8 +238,8 @@ populated with placeholder text.
 	`--subject-prefix` option) has ` v<n>` appended to it.  E.g.
 	`--reroll-count=4` may produce `v4-0001-add-makefile.patch`
 	file that has "Subject: [PATCH v4 1/20] Add makefile" in it.
-	`<n>` does not have to be an integer (e.g. "--reroll-count=4.4",
-	or "--reroll-count=4rev2" are allowed), but the downside of
+	`<n>` does not have to be an integer (e.g. `--reroll-count=4.4`,
+	or `--reroll-count=4rev2` are allowed), but the downside of
 	using such a reroll-count is that the range-diff/interdiff
 	with the previous version does not state exactly which
 	version the new interation is compared against.
@@ -346,7 +346,7 @@ set.
 	number.
 
 --signature-file=<file>::
-	Works just like --signature except the signature is read from a file.
+	Works just like `--signature` except the signature is read from a file.
 
 --suffix=.<sfx>::
 	Instead of using `.patch` as the suffix for generated
diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt
index bd596619c0..e932c75181 100644
--- a/Documentation/git-fsck.txt
+++ b/Documentation/git-fsck.txt
@@ -25,7 +25,7 @@ OPTIONS
 +
 If no objects are given, 'git fsck' defaults to using the
 index file, all SHA-1 references in `refs` namespace, and all reflogs
-(unless --no-reflogs is given) as heads.
+(unless `--no-reflogs` is given) as heads.
 
 --unreachable::
 	Print out objects that exist but that aren't reachable from any
@@ -59,7 +59,7 @@ index file, all SHA-1 references in `refs` namespace, and all reflogs
 	and in packed Git archives found in $GIT_DIR/objects/pack
 	and corresponding pack subdirectories in alternate
 	object pools.  This is now default; you can turn it off
-	with --no-full.
+	with `--no-full`.
 
 --connectivity-only::
 	Check only the connectivity of reachable objects, making sure
@@ -100,7 +100,7 @@ care about this output and want to speed it up further.
 --[no-]progress::
 	Progress status is reported on the standard error stream by
 	default when it is attached to a terminal, unless
-	--no-progress or --verbose is specified. --progress forces
+	`--no-progress` or `--verbose` is specified. `--progress` forces
 	progress status even if the standard error stream is not
 	directed to a terminal.
 
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index 853967dea0..9d27c3a41e 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -57,9 +57,9 @@ be performed as well.
 --prune=<date>::
 	Prune loose objects older than date (default is 2 weeks ago,
 	overridable by the config variable `gc.pruneExpire`).
-	--prune=now prunes loose objects regardless of their age and
+	`--prune=now` prunes loose objects regardless of their age and
 	increases the risk of corruption if another process is writing to
-	the repository concurrently; see "NOTES" below. --prune is on by
+	the repository concurrently; see "NOTES" below. `--prune` is on by
 	default.
 
 --no-prune::
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index 4e0ba8234a..84102cc596 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -66,7 +66,7 @@ grep.fullName::
 	If set to true, enable `--full-name` option by default.
 
 grep.fallbackToNoIndex::
-	If set to true, fall back to git grep --no-index if git grep
+	If set to true, fall back to git grep `--no-index` if git grep
 	is executed outside of a git repository.  Defaults to false.
 
 
@@ -123,7 +123,7 @@ OPTIONS
 	levels of directories. A value of -1 means no limit.
 	This option is ignored if <pathspec> contains active wildcards.
 	In other words if "a*" matches a directory named "a*",
-	"*" is matched literally so --max-depth is still effective.
+	"*" is matched literally so `--max-depth` is still effective.
 
 -r::
 --recursive::
diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt
index 44fe8860b3..a19f275f60 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.txt
@@ -98,16 +98,16 @@ variable will be checked. The following values are supported for this
 variable; they make 'git help' behave as their corresponding command-
 line option:
 
-* "man" corresponds to '-m|--man',
-* "info" corresponds to '-i|--info',
-* "web" or "html" correspond to '-w|--web'.
+* "man" corresponds to `-m`|`--man`,
+* "info" corresponds to `-i`|`--info`,
+* "web" or "html" correspond to `-w`|`--web`.
 
 help.browser, web.browser and browser.<tool>.path
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The `help.browser`, `web.browser` and `browser.<tool>.path` will also
 be checked if the 'web' format is chosen (either by command-line
-option or configuration variable). See '-w|--web' in the OPTIONS
+option or configuration variable). See `-w`|`--web` in the OPTIONS
 section above and linkgit:git-web{litdd}browse[1].
 
 man.viewer
diff --git a/Documentation/git-http-fetch.txt b/Documentation/git-http-fetch.txt
index 9fa17b60e4..969e553e4a 100644
--- a/Documentation/git-http-fetch.txt
+++ b/Documentation/git-http-fetch.txt
@@ -47,7 +47,7 @@ commit-id::
 	URL and uses index-pack to generate corresponding .idx and .keep files.
 	The hash is used to determine the name of the temporary file and is
 	arbitrary. The output of index-pack is printed to stdout. Requires
-	--index-pack-args.
+	`--index-pack-args`.
 
 --index-pack-args=<args>::
 	For internal use only. The command to run on the contents of the
diff --git a/Documentation/git-http-push.txt b/Documentation/git-http-push.txt
index ea03a4eeb0..5dd4d2b63a 100644
--- a/Documentation/git-http-push.txt
+++ b/Documentation/git-http-push.txt
@@ -44,7 +44,7 @@ OPTIONS
 -d::
 -D::
 	Remove <ref> from remote repository.  The specified branch
-	cannot be the remote HEAD.  If -d is specified the following
+	cannot be the remote HEAD.  If `-d` is specified the following
 	other conditions must also be met:
 
 	- Remote HEAD must resolve to an object that exists locally
diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.txt
index 7fa74b9e79..bde1cf4a5c 100644
--- a/Documentation/git-index-pack.txt
+++ b/Documentation/git-index-pack.txt
@@ -49,7 +49,7 @@ OPTIONS
 	<pack-file> is not specified, the pack is written to
 	objects/pack/ directory of the current Git repository with
 	a default name determined from the pack content.  If
-	<pack-file> is not specified consider using --keep to
+	<pack-file> is not specified consider using `--keep` to
 	prevent a race condition between this process and
 	'git repack'.
 
@@ -57,18 +57,18 @@ OPTIONS
 	Fix a "thin" pack produced by `git pack-objects --thin` (see
 	linkgit:git-pack-objects[1] for details) by adding the
 	excluded objects the deltified objects are based on to the
-	pack. This option only makes sense in conjunction with --stdin.
+	pack. This option only makes sense in conjunction with `--stdin`.
 
 --keep::
 	Before moving the index into its final destination
 	create an empty .keep file for the associated pack file.
-	This option is usually necessary with --stdin to prevent a
+	This option is usually necessary with `--stdin` to prevent a
 	simultaneous 'git repack' process from deleting
 	the newly constructed pack and index before refs can be
 	updated to use objects contained in the pack.
 
 --keep=<msg>::
-	Like --keep create a .keep file before moving the index into
+	Like `--keep` create a .keep file before moving the index into
 	its final destination, but rather than creating an empty file
 	place '<msg>' followed by an LF into the .keep file.  The '<msg>'
 	message can later be searched for within all .keep files to
@@ -112,7 +112,7 @@ name of the pack/idx file (see "Notes").
 	the current repository (set by `extensions.objectFormat`), or 'sha1' if no
 	value is set or outside a repository.
 +
-This option cannot be used with --stdin.
+This option cannot be used with `--stdin`.
 +
 include::object-format-disclaimer.txt[]
 
@@ -120,7 +120,7 @@ NOTES
 -----
 
 Once the index has been created, the hash that goes into the name of
-the pack/idx file is printed to stdout. If --stdin was
+the pack/idx file is printed to stdout. If `--stdin` was
 also used then this is prefixed by either "pack\t", or "keep\t" if a
 new .keep file was successfully created. This is useful to remove a
 .keep file used as a lock to prevent the race with 'git repack'
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index b611d80697..a3f061517d 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -35,7 +35,7 @@ directory is used.
 Running 'git init' in an existing repository is safe. It will not
 overwrite things that are already there. The primary reason for
 rerunning 'git init' is to pick up newly added templates (or to move
-the repository to another place if --separate-git-dir is given).
+the repository to another place if `--separate-git-dir` is given).
 
 OPTIONS
 -------
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt
index 96ec6499f0..4288e5405c 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/Documentation/git-interpret-trailers.txt
@@ -87,27 +87,27 @@ OPTIONS
 --where <placement>::
 --no-where::
 	Specify where all new trailers will be added.  A setting
-	provided with '--where' overrides all configuration variables
-	and applies to all '--trailer' options until the next occurrence of
-	'--where' or '--no-where'. Possible values are `after`, `before`,
+	provided with `--where` overrides all configuration variables
+	and applies to all `--trailer` options until the next occurrence of
+	`--where` or `--no-where`. Possible values are `after`, `before`,
 	`end` or `start`.
 
 --if-exists <action>::
 --no-if-exists::
 	Specify what action will be performed when there is already at
 	least one trailer with the same <token> in the message.  A setting
-	provided with '--if-exists' overrides all configuration variables
-	and applies to all '--trailer' options until the next occurrence of
-	'--if-exists' or '--no-if-exists'. Possible actions are `addIfDifferent`,
+	provided with `--if-exists` overrides all configuration variables
+	and applies to all `--trailer` options until the next occurrence of
+	`--if-exists` or `--no-if-exists`. Possible actions are `addIfDifferent`,
 	`addIfDifferentNeighbor`, `add`, `replace` and `doNothing`.
 
 --if-missing <action>::
 --no-if-missing::
 	Specify what action will be performed when there is no other
 	trailer with the same <token> in the message.  A setting
-	provided with '--if-missing' overrides all configuration variables
-	and applies to all '--trailer' options until the next occurrence of
-	'--if-missing' or '--no-if-missing'. Possible actions are `doNothing`
+	provided with `--if-missing` overrides all configuration variables
+	and applies to all `--trailer` options until the next occurrence of
+	`--if-missing` or `--no-if-missing`. Possible actions are `doNothing`
 	or `add`.
 
 --only-trailers::
diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
index 6d11ab506b..b42f179aef 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.txt
@@ -65,11 +65,11 @@ OPTIONS
 	name (with a trailing slash) and not its whole contents.
 
 --no-empty-directory::
-	Do not list empty directories. Has no effect without --directory.
+	Do not list empty directories. Has no effect without `--directory`.
 
 -u::
 --unmerged::
-	Show unmerged files in the output (forces --stage)
+	Show unmerged files in the output (forces `--stage`)
 
 -k::
 --killed::
@@ -111,7 +111,7 @@ OPTIONS
 	error (return 1).
 
 --with-tree=<tree-ish>::
-	When using --error-unmatch to expand the user supplied
+	When using `--error-unmatch` to expand the user supplied
 	<file> (i.e. path pattern) arguments to paths, pretend
 	that paths which were removed in the index since the
 	named <tree-ish> are still present.  Using this option
@@ -156,13 +156,13 @@ a space) at the start of each line:
 
 --recurse-submodules::
 	Recursively calls ls-files on each active submodule in the repository.
-	Currently there is only support for the --cached mode.
+	Currently there is only support for the `--cached` mode.
 
 --abbrev[=<n>]::
 	Instead of showing the full 40-byte hexadecimal object
 	lines, show the shortest prefix that is at least '<n>'
 	hexdigits long that uniquely refers the object.
-	Non default number of digits can be specified with --abbrev=<n>.
+	Non default number of digits can be specified with `--abbrev=<n>`.
 
 --debug::
 	After each line that describes a file, add more data about its
@@ -224,29 +224,29 @@ EXCLUDE PATTERNS
 
 'git ls-files' can use a list of "exclude patterns" when
 traversing the directory tree and finding files to show when the
-flags --others or --ignored are specified.  linkgit:gitignore[5]
+flags `--others` or `--ignored` are specified.  linkgit:gitignore[5]
 specifies the format of exclude patterns.
 
 These exclude patterns come from these places, in order:
 
-  1. The command-line flag --exclude=<pattern> specifies a
+  1. The command-line flag `--exclude=<pattern>` specifies a
      single pattern.  Patterns are ordered in the same order
      they appear in the command line.
 
-  2. The command-line flag --exclude-from=<file> specifies a
+  2. The command-line flag `--exclude-from=<file>` specifies a
      file containing a list of patterns.  Patterns are ordered
      in the same order they appear in the file.
 
-  3. The command-line flag --exclude-per-directory=<name> specifies
+  3. The command-line flag `--exclude-per-directory=<name>` specifies
      a name of the file in each directory 'git ls-files'
      examines, normally `.gitignore`.  Files in deeper
      directories take precedence.  Patterns are ordered in the
      same order they appear in the files.
 
-A pattern specified on the command line with --exclude or read
-from the file specified with --exclude-from is relative to the
+A pattern specified on the command line with `--exclude` or read
+from the file specified with `--exclude-from` is relative to the
 top of the directory tree.  A pattern read from a file specified
-by --exclude-per-directory is relative to the directory that the
+by `--exclude-per-directory` is relative to the directory that the
 pattern file appears in.
 
 SEE ALSO
diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt
index 492e573856..4cb4e2fd5d 100644
--- a/Documentation/git-ls-remote.txt
+++ b/Documentation/git-ls-remote.txt
@@ -87,7 +87,7 @@ OPTIONS
 
 <refs>...::
 	When unspecified, all references, after filtering done
-	with --heads and --tags, are shown.  When <refs>... are
+	with `--heads` and `--tags`, are shown.  When <refs>... are
 	specified, only references matching the given patterns
 	are displayed.
 
diff --git a/Documentation/git-ls-tree.txt b/Documentation/git-ls-tree.txt
index db02d6d79a..6ed9030c1e 100644
--- a/Documentation/git-ls-tree.txt
+++ b/Documentation/git-ls-tree.txt
@@ -31,7 +31,7 @@ in the current working directory.  Note that:
    root level (e.g. `git ls-tree -r HEAD:sub dir`) in this case, as that
    would result in asking for `sub/sub/dir` in the `HEAD` commit.
    However, the current working directory can be ignored by passing
-   --full-tree option.
+   `--full-tree` option.
 
 OPTIONS
 -------
@@ -64,7 +64,7 @@ OPTIONS
 	Instead of showing the full 40-byte hexadecimal object
 	lines, show the shortest prefix that is at least '<n>'
 	hexdigits long that uniquely refers the object.
-	Non default number of digits can be specified with --abbrev=<n>.
+	Non default number of digits can be specified with `--abbrev`=<n>.
 
 --full-name::
 	Instead of showing the path names relative to the current working
@@ -72,7 +72,7 @@ OPTIONS
 
 --full-tree::
 	Do not limit the listing to the current working directory.
-	Implies --full-name.
+	Implies `--full-name`.
 
 [<path>...]::
 	When paths are given, show them (note that this isn't really raw
diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.txt
index d343f040f5..5bc2982909 100644
--- a/Documentation/git-mailinfo.txt
+++ b/Documentation/git-mailinfo.txt
@@ -45,7 +45,7 @@ Finally, runs of whitespace are normalized to a single ASCII space
 character.
 
 -b::
-	When -k is not in effect, all leading strings bracketed with '['
+	When `-k` is not in effect, all leading strings bracketed with '['
 	and ']' pairs are stripped.  This option limits the stripping to
 	only the pairs whose bracketed string contains the word "PATCH".
 
@@ -60,7 +60,7 @@ Note that the patch is always used as-is without charset
 conversion, even with this flag.
 
 --encoding=<encoding>::
-	Similar to -u.  But when re-coding, the charset specified here is
+	Similar to `-u`.  But when re-coding, the charset specified here is
 	used instead of the one specified by `i18n.commitEncoding` or UTF-8.
 
 -n::
diff --git a/Documentation/git-mailsplit.txt b/Documentation/git-mailsplit.txt
index e3b2a88c4b..6e357716ec 100644
--- a/Documentation/git-mailsplit.txt
+++ b/Documentation/git-mailsplit.txt
@@ -42,7 +42,7 @@ OPTIONS
 	filenames.
 
 -f<nn>::
-	Skip the first <nn> numbers, for example if -f3 is specified,
+	Skip the first <nn> numbers, for example if `-f`3 is specified,
 	start the numbering with 0004.
 
 --keep-cr::
diff --git a/Documentation/git-merge-index.txt b/Documentation/git-merge-index.txt
index 2ab84a91e5..9fdfe6a31b 100644
--- a/Documentation/git-merge-index.txt
+++ b/Documentation/git-merge-index.txt
@@ -37,7 +37,7 @@ OPTIONS
 	failure usually indicates conflicts during the merge). This is for
 	porcelains which might want to emit custom messages.
 
-If 'git merge-index' is called with multiple <file>s (or -a) then it
+If 'git merge-index' is called with multiple <file>s (or `-a`) then it
 processes them in turn only stopping if merge returns a non-zero exit
 code.
 
diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index 79449bf98f..b3808dcc06 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -50,7 +50,7 @@ Moving a submodule using a gitfile (which means they were cloned
 with a Git version 1.7.8 or newer) will update the gitfile and
 core.worktree setting to make the submodule work in the new location.
 It also will attempt to update the submodule.<name>.path setting in
-the linkgit:gitmodules[5] file and stage that file (unless -n is used).
+the linkgit:gitmodules[5] file and stage that file (unless `-n` is used).
 
 BUGS
 ----
diff --git a/Documentation/git-name-rev.txt b/Documentation/git-name-rev.txt
index 5cb0eb0855..99979fe55b 100644
--- a/Documentation/git-name-rev.txt
+++ b/Documentation/git-name-rev.txt
@@ -34,9 +34,9 @@ OPTIONS
 	Do not use any ref whose name matches a given shell pattern. The
 	pattern can be one of branch name, tag name or fully qualified ref
 	name. If given multiple times, a ref will be excluded when it matches
-	any of the given patterns. When used together with --refs, a ref will
-	be used as a match only when it matches at least one --refs pattern and
-	does not match any --exclude patterns. Use `--no-exclude` to clear the
+	any of the given patterns. When used together with `--refs`, a ref will
+	be used as a match only when it matches at least one `--refs` pattern and
+	does not match any `--exclude` patterns. Use `--no-exclude` to clear the
 	list of exclude patterns.
 
 --all::
@@ -45,12 +45,12 @@ OPTIONS
 --stdin::
 	Transform stdin by substituting all the 40-character SHA-1
 	hexes (say $hex) with "$hex ($rev_name)".  When used with
-	--name-only, substitute with "$rev_name", omitting $hex
+	`--name-only`, substitute with "$rev_name", omitting $hex
 	altogether.  Intended for the scripter's use.
 
 --name-only::
 	Instead of printing both the SHA-1 and the name, print only
-	the name.  If given with --tags the usual tag prefix of
+	the name.  If given with `--tags` the usual tag prefix of
 	"tags/" is also omitted from the name, matching the output
 	of `git-describe` more closely.
 
diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt
index 0a4200674c..b0a5ab9a72 100644
--- a/Documentation/git-notes.txt
+++ b/Documentation/git-notes.txt
@@ -152,7 +152,7 @@ OPTIONS
 
 -c <object>::
 --reedit-message=<object>::
-	Like '-C', but with `-c` the editor is invoked, so that
+	Like `-C`, but with `-c` the editor is invoked, so that
 	the user can further edit the note message.
 
 --allow-empty::
@@ -251,7 +251,7 @@ When done, the user can either finalize the merge with
 'git notes merge --abort'.
 
 Users may select an automated merge strategy from among the following using
-either -s/--strategy option or configuring notes.mergeStrategy accordingly:
+either `-s`/`--strategy` option or configuring notes.mergeStrategy accordingly:
 
 "ours" automatically resolves conflicting notes in favor of the local
 version (i.e. the current notes ref).
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index f89e68b424..d9d29a5efa 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -180,7 +180,7 @@ The git commit is created relative to the current origin revision (HEAD by defau
 A parent commit is created based on the origin, and then the unshelve commit is
 created based on that.
 
-The origin revision can be changed with the "--origin" option.
+The origin revision can be changed with the `--origin` option.
 
 If the target branch in refs/remotes/p4-unshelved already exists, the old one will
 be renamed.
@@ -221,7 +221,7 @@ subsequent 'sync' operations.
 +
 By default a <ref> not starting with refs/ is treated as the
 name of a remote-tracking branch (under refs/remotes/).  This
-behavior can be modified using the --import-local option.
+behavior can be modified using the `--import-local` option.
 +
 The default <ref> is "master".
 +
@@ -265,7 +265,7 @@ Git repository:
 	Import at most 'n' changes, rather than the entire range of
 	changes included in the given revision specifier. A typical
 	usage would be use '@all' as the revision specifier, but then
-	to use '--max-changes 1000' to import only the last 1000
+	to use `--max-changes 1000` to import only the last 1000
 	revisions rather than the entire revision history.
 
 --changes-block-size <n>::
@@ -347,7 +347,7 @@ These options can be used to modify 'git p4 submit' behavior.
 
 --update-shelve CHANGELIST::
 	Update an existing shelved changelist with this commit. Implies
-	--shelve. Repeat for multiple shelved changelists.
+	`--shelve`. Repeat for multiple shelved changelists.
 
 --conflict=(ask|skip|quit)::
 	Conflicts can occur when applying a commit to p4.  When this
@@ -371,7 +371,7 @@ These options can be used to modify 'git p4 submit' behavior.
 
 --disable-p4sync::
     Disable the automatic sync of p4/master from Perforce after commits have
-    been submitted. Implies --disable-rebase. Can also be set with
+    been submitted. Implies `--disable-rebase`. Can also be set with
     git-p4.disableP4Sync. Sync with origin/master still goes ahead if possible.
 
 Hooks for submit
@@ -560,27 +560,27 @@ They all are in the 'git-p4' section.
 General variables
 ~~~~~~~~~~~~~~~~~
 git-p4.user::
-	User specified as an option to all p4 commands, with '-u <user>'.
+	User specified as an option to all p4 commands, with `-u <user>`.
 	The environment variable `P4USER` can be used instead.
 
 git-p4.password::
 	Password specified as an option to all p4 commands, with
-	'-P <password>'.
+	`-P <password>`.
 	The environment variable `P4PASS` can be used instead.
 
 git-p4.port::
 	Port specified as an option to all p4 commands, with
-	'-p <port>'.
+	`-p <port>`.
 	The environment variable `P4PORT` can be used instead.
 
 git-p4.host::
 	Host specified as an option to all p4 commands, with
-	'-h <host>'.
+	`-h <host>`.
 	The environment variable `P4HOST` can be used instead.
 
 git-p4.client::
 	Client specified as an option to all p4 commands, with
-	'-c <client>', including the client spec.
+	`-c <client>`, including the client spec.
 
 git-p4.retries::
 	Specifies the number of times to retry a p4 command (notably,
@@ -619,7 +619,7 @@ git-p4.ignoredP4Labels::
 	unimportable labels are discovered.
 
 git-p4.importLabels::
-	Import p4 labels into git, as per --import-labels.
+	Import p4 labels into git, as per `--import-labels`.
 
 git-p4.labelImportRegexp::
 	Only p4 labels matching this regular expression will be imported. The
@@ -734,7 +734,7 @@ git-p4.attemptRCSCleanup::
 	present.
 
 git-p4.exportLabels::
-	Export Git tags to p4 labels, as per --export-labels.
+	Export Git tags to p4 labels, as per `--export-labels`.
 
 git-p4.labelExportRegexp::
 	Only p4 labels matching this regular expression will be exported. The
@@ -742,7 +742,7 @@ git-p4.labelExportRegexp::
 
 git-p4.conflict::
 	Specify submit behavior when a conflict with p4 is found, as per
-	--conflict.  The default behavior is 'ask'.
+	`--conflict`.  The default behavior is 'ask'.
 
 git-p4.disableRebase::
     Do not rebase the tree against p4/master following a submit.
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index 25d9fbe37a..a78721517b 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -101,13 +101,13 @@ Incompatible with `--revs`, or options that imply `--revs` (such as
 	the pack are stored using delta compression.  The
 	objects are first internally sorted by type, size and
 	optionally names and compared against the other objects
-	within --window to see if using delta compression saves
-	space.  --depth limits the maximum delta depth; making
+	within `--window` to see if using delta compression saves
+	space.  `--depth` limits the maximum delta depth; making
 	it too deep affects the performance on the unpacker
 	side, because delta data needs to be applied that many
 	times to get to the necessary object.
 +
-The default value for --window is 10 and --depth is 50. The maximum
+The default value for `--window` is 10 and `--depth` is 50. The maximum
 depth is 4095.
 
 --window-memory=<n>::
@@ -165,19 +165,19 @@ depth is 4095.
 	the standard error stream is not directed to a terminal.
 
 --all-progress::
-	When --stdout is specified then progress report is
+	When `--stdout` is specified then progress report is
 	displayed during the object count and compression phases
 	but inhibited during the write-out phase. The reason is
 	that in some cases the output stream is directly linked
 	to another command which may wish to display progress
 	status of its own as it processes incoming pack data.
-	This flag is like --progress except that it forces progress
-	report for the write-out phase as well even if --stdout is
+	This flag is like `--progress` except that it forces progress
+	report for the write-out phase as well even if `--stdout` is
 	used.
 
 --all-progress-implied::
-	This is used to imply --all-progress whenever progress display
-	is activated.  Unlike --all-progress this flag doesn't actually
+	This is used to imply `--all-progress` whenever progress display
+	is activated.  Unlike `--all-progress` this flag doesn't actually
 	force any progress display by itself.
 
 -q::
@@ -194,7 +194,7 @@ depth is 4095.
 --no-reuse-object::
 	This flag tells the command not to reuse existing object data at all,
 	including non deltified object, forcing recompression of everything.
-	This implies --no-reuse-delta. Useful only in the obscure case where
+	This implies `--no-reuse-delta`. Useful only in the obscure case where
 	wholesale enforcement of a different compression level on the
 	packed data is desired.
 
@@ -203,12 +203,12 @@ depth is 4095.
 	generated pack.  If not specified,  pack compression level is
 	determined first by pack.compression,  then by core.compression,
 	and defaults to -1,  the zlib default,  if neither is set.
-	Add --no-reuse-object if you want to force a uniform compression
+	Add `--no-reuse-object` if you want to force a uniform compression
 	level on all data no matter the source.
 
 --[no-]sparse::
 	Toggle the "sparse" algorithm to determine which objects to include in
-	the pack, when combined with the "--revs" option. This algorithm
+	the pack, when combined with the `--revs` option. This algorithm
 	only walks trees that appear in paths that introduce new objects.
 	This can have significant performance benefits when computing
 	a pack to send a small change. However, it is possible that extra
@@ -220,7 +220,7 @@ depth is 4095.
 --thin::
 	Create a "thin" pack by omitting the common objects between a
 	sender and a receiver in order to reduce network transfer. This
-	option only makes sense in conjunction with --stdout.
+	option only makes sense in conjunction with `--stdout`.
 +
 Note: A thin pack violates the packed archive format by omitting
 required objects and is thus unusable by Git without making it
@@ -229,7 +229,7 @@ self-contained. Use `git index-pack --fix-thin`
 
 --shallow::
 	Optimize a pack that will be provided to a client with a shallow
-	repository.  This option, combined with --thin, can result in a
+	repository.  This option, combined with `--thin`, can result in a
 	smaller pack at the cost of speed.
 
 --delta-base-offset::
@@ -279,16 +279,16 @@ So does `git bundle` (see linkgit:git-bundle[1]) when it creates a bundle.
 	A debug option to help with future "partial clone" development.
 	This option specifies how missing objects are handled.
 +
-The form '--missing=error' requests that pack-objects stop with an error if
+The form `--missing=error` requests that pack-objects stop with an error if
 a missing object is encountered.  If the repository is a partial clone, an
 attempt to fetch missing objects will be made before declaring them missing.
 This is the default action.
 +
-The form '--missing=allow-any' will allow object traversal to continue
+The form `--missing=allow-any` will allow object traversal to continue
 if a missing object is encountered.  No fetch of a missing object will occur.
 Missing objects will silently be omitted from the results.
 +
-The form '--missing=allow-promisor' is like 'allow-any', but will only
+The form `--missing=allow-promisor` is like 'allow-any', but will only
 allow object traversal to continue for EXPECTED promisor missing objects.
 No fetch of a missing object will occur.  An unexpected missing object will
 raise an error.
@@ -302,7 +302,7 @@ raise an error.
 
 --keep-unreachable::
 	Objects unreachable from the refs in packs named with
-	--unpacked= option are added to the resulting pack, in
+	`--unpacked`= option are added to the resulting pack, in
 	addition to the reachable objects that are not in packs marked
 	with *.keep files. This implies `--revs`.
 
@@ -363,7 +363,7 @@ to recompute deltas on the fly due to crossing island boundaries.
 
 When repacking with delta islands the delta window tends to get
 clogged with candidates that are forbidden by the config. Repacking
-with a big --window helps (and doesn't take as long as it otherwise
+with a big `--window` helps (and doesn't take as long as it otherwise
 might because we can reject some object pairs based on islands before
 doing any computation on the content).
 
diff --git a/Documentation/git-patch-id.txt b/Documentation/git-patch-id.txt
index 442caff8a9..fb5b194b8a 100644
--- a/Documentation/git-patch-id.txt
+++ b/Documentation/git-patch-id.txt
@@ -34,15 +34,15 @@ OPTIONS
 	Use a "stable" sum of hashes as the patch ID. With this option:
 	 - Reordering file diffs that make up a patch does not affect the ID.
 	   In particular, two patches produced by comparing the same two trees
-	   with two different settings for "-O<orderfile>" result in the same
+	   with two different settings for `-O<orderfile>` result in the same
 	   patch ID signature, thereby allowing the computed result to be used
 	   as a key to index some meta-information about the change between
 	   the two trees;
 
 	 - Result is different from the value produced by git 1.9 and older
-	   or produced when an "unstable" hash (see --unstable below) is
+	   or produced when an "unstable" hash (see `--unstable` below) is
 	   configured - even when used on a diff output taken without any use
-	   of "-O<orderfile>", thereby making existing databases storing such
+	   of `-O<orderfile>`, thereby making existing databases storing such
 	   "unstable" or historical patch-ids unusable.
 
 	This is the default if patchid.stable is set to true.
diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.txt
index 03552dd86f..7bad035e47 100644
--- a/Documentation/git-prune.txt
+++ b/Documentation/git-prune.txt
@@ -75,7 +75,7 @@ should instead call 'git gc', which handles pruning along with
 many other housekeeping tasks.
 
 For a description of which objects are considered for pruning, see
-'git fsck''s --unreachable option.
+'git fsck''s `--unreachable` option.
 
 SEE ALSO
 --------
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index 5c3fb67c01..edecf393d3 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -82,7 +82,7 @@ OPTIONS
 
 -v::
 --verbose::
-	Pass --verbose to git-fetch and git-merge.
+	Pass `--verbose` to git-fetch and git-merge.
 
 --[no-]recurse-submodules[=yes|on-demand|no]::
 	This option controls if new commits of populated submodules should
@@ -132,7 +132,7 @@ published that history already.  Do *not* use this option
 unless you have read linkgit:git-rebase[1] carefully.
 
 --no-rebase::
-	Override earlier --rebase.
+	Override earlier `--rebase`.
 
 Options related to fetching
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -239,7 +239,7 @@ include::transfer-data-leaks.txt[]
 
 BUGS
 ----
-Using --recurse-submodules can only fetch new commits in already checked
+Using `--recurse-submodules` can only fetch new commits in already checked
 out submodules right now. When e.g. upstream added a new submodule in the
 just fetched commits of the superproject the submodule itself cannot be
 fetched, making it impossible to check out that submodule later without
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index a953c7c387..fc91d41ce0 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -277,7 +277,7 @@ that specifies the expected current value of the ref explicitly are
 still experimental and their semantics may change as we gain experience
 with this feature.
 +
-"--no-force-with-lease" will cancel all the previous --force-with-lease on the
+`--no-force-with-lease` will cancel all the previous `--force-with-lease` on the
 command line.
 +
 A general note on safety: supplying this option without an expected
@@ -416,8 +416,8 @@ Specifying `--no-force-if-includes` disables this behavior.
 
 --[no-]verify::
 	Toggle the pre-push hook (see linkgit:githooks[5]).  The
-	default is --verify, giving the hook a chance to prevent the
-	push.  With --no-verify, the hook is bypassed completely.
+	default is `--verify`, giving the hook a chance to prevent the
+	push.  With `--no-verify`, the hook is bypassed completely.
 
 -4::
 --ipv4::
@@ -443,13 +443,13 @@ representing the status of a single ref. Each line is of the form:
  <flag> <summary> <from> -> <to> (<reason>)
 -------------------------------
 
-If --porcelain is used, then each line of the output is of the form:
+If `--porcelain` is used, then each line of the output is of the form:
 
 -------------------------------
  <flag> \t <from>:<to> \t <summary> (<reason>)
 -------------------------------
 
-The status of up-to-date refs is shown only if --porcelain or --verbose
+The status of up-to-date refs is shown only if `--porcelain` or `--verbose`
 option is used.
 
 flag::
diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt
index 70562dc4c0..edae01d55d 100644
--- a/Documentation/git-quiltimport.txt
+++ b/Documentation/git-quiltimport.txt
@@ -21,7 +21,7 @@ in the quilt patchset.
 
 For each patch the code attempts to extract the author from the
 patch description.  If that fails it falls back to the author
-specified with --author.  If the --author flag was not given
+specified with `--author`.  If the `--author` flag was not given
 the patch description is displayed and the user is asked to
 interactively enter the author of the patch.
 
diff --git a/Documentation/git-read-tree.txt b/Documentation/git-read-tree.txt
index 5fa8bab64c..3f53688170 100644
--- a/Documentation/git-read-tree.txt
+++ b/Documentation/git-read-tree.txt
@@ -38,7 +38,7 @@ OPTIONS
 	started.
 
 --reset::
-	Same as -m, except that unmerged entries are discarded instead
+	Same as `-m`, except that unmerged entries are discarded instead
 	of failing. When used with `-u`, updates leading to loss of
 	working tree changes will not abort the operation.
 
@@ -116,7 +116,7 @@ OPTIONS
 	located in.
 
 --[no-]recurse-submodules::
-	Using --recurse-submodules will update the content of all active
+	Using `--recurse-submodules` will update the content of all active
 	submodules according to the commit recorded in the superproject by
 	calling read-tree recursively, also setting the submodules' HEAD to be
 	detached at that commit.
@@ -227,7 +227,7 @@ refer to the presence of a path in the specified commit:
 In all "keep index" cases, the index entry stays as in the
 original index file.  If the entry is not up to date,
 'git read-tree' keeps the copy in the work tree intact when
-operating under the -u flag.
+operating under the `-u` flag.
 
 When this form of 'git read-tree' returns successfully, you can
 see which of the "local changes" that you made were carried forward by running
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index f08ae27e2a..f063d54623 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -34,7 +34,7 @@ description on `--fork-point` below); or by `git log HEAD`, if the
 `--root` option is specified.
 
 The current branch is reset to <upstream>, or <newbase> if the
---onto option was supplied.  This has the exact same effect as
+`--onto` option was supplied.  This has the exact same effect as
 `git reset --hard <upstream>` (or <newbase>).  ORIG_HEAD is set
 to point at the tip of the branch before the reset.
 
@@ -130,7 +130,7 @@ We can get this using the following command:
     git rebase --onto master next topic
 
 
-Another example of --onto option is to rebase part of a
+Another example of `--onto` option is to rebase part of a
 branch.  If we have the following situation:
 
 ------------
@@ -175,7 +175,7 @@ would result in the removal of commits F and G:
 ------------
 
 This is useful if F and G were flawed in some way, or should not be
-part of topicA.  Note that the argument to --onto and the <upstream>
+part of topicA.  Note that the argument to `--onto` and the <upstream>
 parameter can be any valid commit-ish.
 
 In case of conflict, 'git rebase' will stop at the first problematic commit
@@ -210,7 +210,7 @@ OPTIONS
 -------
 --onto <newbase>::
 	Starting point at which to create the new commits. If the
-	--onto option is not specified, the starting point is
+	`--onto` option is not specified, the starting point is
 	<upstream>.  May be any valid commit, and not just an
 	existing branch name.
 +
@@ -229,9 +229,9 @@ top of an upstream branch. While the feature is being worked on, the
 upstream branch may advance and it may not be the best idea to keep
 rebasing on top of the upstream but to keep the base commit as-is.
 +
-Although both this option and --fork-point find the merge base between
+Although both this option and `--fork-point` find the merge base between
 <upstream> and <branch>, this option uses the merge base as the _starting
-point_ on which new commits will be created, whereas --fork-point uses
+point_ on which new commits will be created, whereas `--fork-point` uses
 the merge base to determine the _set of commits_ which will be rebased.
 +
 See also INCOMPATIBLE OPTIONS below.
@@ -258,7 +258,7 @@ See also INCOMPATIBLE OPTIONS below.
 	Abort the rebase operation but HEAD is not reset back to the
 	original branch. The index and working tree are also left
 	unchanged as a result. If a temporary stash entry was created
-	using --autostash, it will be saved to the stash list.
+	using `--autostash`, it will be saved to the stash list.
 
 --apply::
 	Use applying strategies to rebase (calling `git-am`
@@ -276,13 +276,13 @@ See also INCOMPATIBLE OPTIONS below.
 	With ask (implied by --interactive), the rebase will halt when
 	an empty commit is applied allowing you to choose whether to
 	drop it, edit files more, or just commit the empty changes.
-	Other options, like --exec, will use the default of drop unless
-	-i/--interactive is explicitly specified.
+	Other options, like `--exec`, will use the default of drop unless
+	`-i`/`--interactive` is explicitly specified.
 +
-Note that commits which start empty are kept (unless --no-keep-empty
+Note that commits which start empty are kept (unless `--no-keep-empty`
 is specified), and commits which are clean cherry-picks (as determined
 by `git log --cherry-mark ...`) are detected and dropped as a
-preliminary step (unless --reapply-cherry-picks is passed).
+preliminary step (unless `--reapply-cherry-picks` is passed).
 +
 See also INCOMPATIBLE OPTIONS below.
 
@@ -291,7 +291,7 @@ See also INCOMPATIBLE OPTIONS below.
 	Do not keep commits that start empty before the rebase
 	(i.e. that do not change anything from its parent) in the
 	result.  The default is to keep commits which start empty,
-	since creating such commits requires passing the --allow-empty
+	since creating such commits requires passing the `--allow-empty`
 	override flag to `git commit`, signifying that a user is very
 	intentionally creating such a commit and thus wants to keep
 	it.
@@ -303,7 +303,7 @@ flag exists as a convenient shortcut, such as for cases where external
 tools generate many empty commits and you want them all removed.
 +
 For commits which do not start empty but become empty after rebasing,
-see the --empty flag.
+see the `--empty` flag.
 +
 See also INCOMPATIBLE OPTIONS below.
 
@@ -362,7 +362,7 @@ See also INCOMPATIBLE OPTIONS below.
 --strategy=<strategy>::
 	Use the given merge strategy.
 	If there is no `-s` option 'git merge-recursive' is used
-	instead.  This implies --merge.
+	instead.  This implies `--merge`.
 +
 Because 'git rebase' replays each commit from the working branch
 on top of the <upstream> branch using the given strategy, using
@@ -396,11 +396,11 @@ See also INCOMPATIBLE OPTIONS below.
 
 -q::
 --quiet::
-	Be quiet. Implies --no-stat.
+	Be quiet. Implies `--no-stat`.
 
 -v::
 --verbose::
-	Be verbose. Implies --stat.
+	Be verbose. Implies `--stat`.
 
 --stat::
 	Show a diffstat of what changed upstream since the last rebase. The
@@ -415,13 +415,13 @@ See also INCOMPATIBLE OPTIONS below.
 
 --verify::
 	Allows the pre-rebase hook to run, which is the default.  This option can
-	be used to override --no-verify.  See also linkgit:githooks[5].
+	be used to override `--no-verify`.  See also linkgit:githooks[5].
 
 -C<n>::
 	Ensure at least <n> lines of surrounding context match before
 	and after each change.  When fewer lines of surrounding
 	context exist they all must match.  By default no context is
-	ever ignored.  Implies --apply.
+	ever ignored.  Implies `--apply`.
 +
 See also INCOMPATIBLE OPTIONS below.
 
@@ -444,7 +444,7 @@ details).
 	and <branch> when calculating which commits have been
 	introduced by <branch>.
 +
-When --fork-point is active, 'fork_point' will be used instead of
+When `--fork-point` is active, 'fork_point' will be used instead of
 <upstream> to calculate the set of commits to rebase, where
 'fork_point' is the result of `git merge-base --fork-point <upstream>
 <branch>` command (see linkgit:git-merge-base[1]).  If 'fork_point'
@@ -478,7 +478,7 @@ if the other side had no changes that conflicted.
 --whitespace=<option>::
 	This flag is passed to the 'git apply' program
 	(see linkgit:git-apply[1]) that applies the patch.
-	Implies --apply.
+	Implies `--apply`.
 +
 See also INCOMPATIBLE OPTIONS below.
 
@@ -582,10 +582,10 @@ See also INCOMPATIBLE OPTIONS below.
 --root::
 	Rebase all commits reachable from <branch>, instead of
 	limiting them with an <upstream>.  This allows you to rebase
-	the root commit(s) on a branch.  When used with --onto, it
+	the root commit(s) on a branch.  When used with `--onto`, it
 	will skip changes already contained in <newbase> (instead of
-	<upstream>) whereas without --onto it will operate on every change.
-	When used together with both --onto and --preserve-merges,
+	<upstream>) whereas without `--onto` it will operate on every change.
+	When used together with both `--onto` and `--preserve-merges`,
 	'all' root commits will be rewritten to have <newbase> as parent
 	instead.
 +
@@ -629,39 +629,39 @@ INCOMPATIBLE OPTIONS
 
 The following options:
 
- * --apply
- * --whitespace
- * -C
+ * `--apply`
+ * `--whitespace`
+ * `-C`
 
 are incompatible with the following options:
 
- * --merge
- * --strategy
- * --strategy-option
- * --allow-empty-message
- * --[no-]autosquash
- * --rebase-merges
- * --preserve-merges
- * --interactive
- * --exec
- * --no-keep-empty
- * --empty=
- * --reapply-cherry-picks
- * --edit-todo
- * --root when used in combination with --onto
+ * `--merge`
+ * `--strategy`
+ * `--strategy-option`
+ * `--allow-empty-message`
+ * `--[no-]autosquash`
+ * `--rebase-merges`
+ * `--preserve-merges`
+ * `--interactive`
+ * `--exec`
+ * `--no-keep-empty`
+ * `--empty=`
+ * `--reapply-cherry-picks`
+ * `--edit-todo`
+ * `--root` when used in combination with `--onto`
 
 In addition, the following pairs of options are incompatible:
 
- * --preserve-merges and --interactive
- * --preserve-merges and --signoff
- * --preserve-merges and --rebase-merges
- * --preserve-merges and --empty=
- * --preserve-merges and --ignore-whitespace
- * --preserve-merges and --committer-date-is-author-date
- * --preserve-merges and --ignore-date
- * --keep-base and --onto
- * --keep-base and --root
- * --fork-point and --root
+ * `--preserve-merges` and `--interactive` 
+ * `--preserve-merges` and `--signoff` 
+ * `--preserve-merges` and `--rebase-merges` 
+ * `--preserve-merges` and `--empty=` 
+ * `--preserve-merges` and `--ignore-whitespace` 
+ * `--preserve-merges` and `--committer-date-is-author-date` 
+ * `--preserve-merges` and `--ignore-date` 
+ * `--keep-base` and `--onto` 
+ * `--keep-base` and `--root` 
+ * `--fork-point` and `--root` 
 
 BEHAVIORAL DIFFERENCES
 -----------------------
@@ -683,13 +683,13 @@ also drops commits that become empty and has no option for controlling
 this behavior.
 
 The merge backend keeps intentionally empty commits by default (though
-with -i they are marked as empty in the todo list editor, or they can
-be dropped automatically with --no-keep-empty).
+with `-i` they are marked as empty in the todo list editor, or they can
+be dropped automatically with `--no-keep-empty`).
 
 Similar to the apply backend, by default the merge backend drops
-commits that become empty unless -i/--interactive is specified (in
+commits that become empty unless `-i`/`--interactive` is specified (in
 which case it stops and asks the user what to do).  The merge backend
-also has an --empty={drop,keep,ask} option for changing the behavior
+also has an `--empty={drop,keep,ask}` option for changing the behavior
 of handling commits that become empty.
 
 Directory rename detection
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 317d63cf0d..98373e4f36 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -96,7 +96,7 @@ to the new separate pack will be written.
 	affects the performance on the unpacker side, because delta data needs
 	to be applied that many times to get to the necessary object.
 +
-The default value for --window is 10 and --depth is 50. The maximum
+The default value for `--window` is 10 and `--depth` is 50. The maximum
 depth is 4095.
 
 --threads=<n>::
diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt
index 252e2d4e47..e9e816a986 100644
--- a/Documentation/git-reset.txt
+++ b/Documentation/git-reset.txt
@@ -89,7 +89,7 @@ but carries forward unmerged index entries.
 	changes, reset is aborted.
 
 --[no-]recurse-submodules::
-	When the working tree is updated, using --recurse-submodules will
+	When the working tree is updated, using `--recurse-submodules` will
 	also recursively reset the working tree of all active submodules
 	according to the commit recorded in the superproject, also setting
 	the submodules' HEAD to be detached at that commit.
@@ -345,7 +345,7 @@ $ git commit ...                            <8>
 ------------
 +
 <1> First, reset the history back one commit so that we remove the original
-    commit, but leave the working tree with all the changes. The -N ensures
+    commit, but leave the working tree with all the changes. The `-N` ensures
     that any new files added with `HEAD` are still marked so that `git add -p`
     will find them.
 <2> Next, we interactively select diff hunks to add using the `git add -p`
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 6b8ca085aa..4b1af8c5a6 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -152,7 +152,7 @@ for another option.
 	form as close to the original input as possible.
 
 --symbolic-full-name::
-	This is similar to --symbolic, but it omits input that
+	This is similar to `--symbolic`, but it omits input that
 	are not refs (i.e. branch or tag names; or more
 	explicitly disambiguating "heads/master" form, when you
 	want to name the "master" branch when there is an
@@ -306,12 +306,12 @@ Other Options
 --since=datestring::
 --after=datestring::
 	Parse the date string, and output the corresponding
-	--max-age= parameter for 'git rev-list'.
+	`--max-age=` parameter for 'git rev-list'.
 
 --until=datestring::
 --before=datestring::
 	Parse the date string, and output the corresponding
-	--min-age= parameter for 'git rev-list'.
+	`--min-age=` parameter for 'git rev-list'.
 
 <args>...::
 	Flags and parameters to be parsed.
diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt
index ab750367fd..e7ff1b5fbd 100644
--- a/Documentation/git-rm.txt
+++ b/Documentation/git-rm.txt
@@ -151,7 +151,7 @@ still uses a .git directory, `git rm` will move the submodules
 git directory into the superprojects git directory to protect
 the submodule's history. If it exists the submodule.<name> section
 in the linkgit:gitmodules[5] file will also be removed and that file
-will be staged (unless --cached or -n are used).
+will be staged (unless `--cached` or `-n` are used).
 
 A submodule is considered up to date when the HEAD is the same as
 recorded in the index, no tracked files are modified and no untracked
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 93708aefea..afd41a010e 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -87,7 +87,7 @@ See the CONFIGURATION section for `sendemail.multiEdit`.
 --reply-to=<address>::
 	Specify the address where replies from recipients should go to.
 	Use this if replies to messages should go to another address than what
-	is specified with the --from parameter.
+	is specified with the `--from` parameter.
 
 --in-reply-to=<identifier>::
 	Make the first mail (or all the mails with `--no-thread`) appear as a
@@ -108,19 +108,19 @@ illustration below where `[PATCH v2 0/3]` is in reply to `[PATCH 0/2]`:
       [PATCH v2 2/3] New tests
       [PATCH v2 3/3] Implementation
 +
-Only necessary if --compose is also set.  If --compose
+Only necessary if `--compose` is also set.  If `--compose`
 is not set, this will be prompted for.
 
 --subject=<string>::
 	Specify the initial subject of the email thread.
-	Only necessary if --compose is also set.  If --compose
+	Only necessary if `--compose` is also set.  If `--compose`
 	is not set, this will be prompted for.
 
 --to=<address>,...::
 	Specify the primary recipient of the emails generated. Generally, this
 	will be the upstream maintainer of the project involved. Default is the
 	value of the `sendemail.to` configuration value; if that is unspecified,
-	and --to-cmd is not specified, this will be prompted for.
+	and `--to-cmd` is not specified, this will be prompted for.
 +
 This option may be specified multiple times.
 
@@ -163,7 +163,7 @@ Sending
 	This is useful if your default address is not the address that is
 	subscribed to a list. In order to use the 'From' address, set the
 	value to "auto". If you use the sendmail binary, you must have
-	suitable privileges for the -f parameter.  Default is the value of the
+	suitable privileges for the `-f` parameter.  Default is the value of the
 	`sendemail.envelopeSender` configuration variable; if that is
 	unspecified, choosing the envelope sender is left to your MTA.
 
@@ -232,12 +232,12 @@ a password is obtained using 'git-credential'.
 	Default value can be specified by the `sendemail.smtpServerOption`
 	configuration option.
 +
-The --smtp-server-option option must be repeated for each option you want
+The `--smtp-server-option` option must be repeated for each option you want
 to pass to the server. Likewise, different lines in the configuration files
 must be used for each option.
 
 --smtp-ssl::
-	Legacy alias for '--smtp-encryption ssl'.
+	Legacy alias for `--smtp-encryption ssl`.
 
 --smtp-ssl-cert-path::
 	Path to a store of trusted CA certificates for SMTP SSL/TLS
@@ -264,7 +264,7 @@ must be used for each option.
 	Some email servers (e.g. smtp.163.com) limit the number emails to be
 	sent per session (connection) and this will lead to a failure when
 	sending many messages.  With this option, send-email will disconnect after
-	sending $<num> messages and wait for a few seconds (see --relogin-delay)
+	sending $<num> messages and wait for a few seconds (see `--relogin-delay`)
 	and reconnect, to work around such a limit.  You may want to
 	use some form of credential helper to avoid having to retype
 	your password every time this happens.  Defaults to the
@@ -272,7 +272,7 @@ must be used for each option.
 
 --relogin-delay=<int>::
 	Waiting $<int> seconds before reconnecting to SMTP server. Used together
-	with --batch-size option.  Defaults to the `sendemail.smtpReloginDelay`
+	with `--batch-size` option.  Defaults to the `sendemail.smtpReloginDelay`
 	configuration variable.
 
 Automating
@@ -300,7 +300,7 @@ Automating
 
 --[no-]chain-reply-to::
 	If this is set, each email will be sent as a reply to the previous
-	email sent.  If disabled with "--no-chain-reply-to", all emails after
+	email sent.  If disabled with `--no-chain-reply-to`, all emails after
 	the first will be sent as replies to the first email sent.  When using
 	this, it is recommended that the first file given be an overview of the
 	entire patch series. Disabled by default, but the `sendemail.chainReplyTo`
@@ -315,19 +315,19 @@ Automating
 --[no-]signed-off-by-cc::
 	If this is set, add emails found in the `Signed-off-by` trailer or Cc: lines to the
 	cc list. Default is the value of `sendemail.signedoffbycc` configuration
-	value; if that is unspecified, default to --signed-off-by-cc.
+	value; if that is unspecified, default to `--signed-off-by-cc`.
 
 --[no-]cc-cover::
 	If this is set, emails found in Cc: headers in the first patch of
 	the series (typically the cover letter) are added to the cc list
 	for each email set. Default is the value of 'sendemail.cccover'
-	configuration value; if that is unspecified, default to --no-cc-cover.
+	configuration value; if that is unspecified, default to `--no-cc-cover`.
 
 --[no-]to-cover::
 	If this is set, emails found in To: headers in the first patch of
 	the series (typically the cover letter) are added to the to list
 	for each email set. Default is the value of 'sendemail.tocover'
-	configuration value; if that is unspecified, default to --no-to-cover.
+	configuration value; if that is unspecified, default to `--no-to-cover`.
 
 --suppress-cc=<category>::
 	Specify an additional category of recipients to suppress the
@@ -345,19 +345,19 @@ Automating
 - 'misc-by' will avoid including anyone mentioned in Acked-by,
   Reviewed-by, Tested-by and other "-by" lines in the patch body,
   except Signed-off-by (use 'sob' for that).
-- 'cccmd' will avoid running the --cc-cmd.
+- 'cccmd' will avoid running the `--cc-cmd`.
 - 'body' is equivalent to 'sob' + 'bodycc' + 'misc-by'.
 - 'all' will suppress all auto cc values.
 --
 +
 Default is the value of `sendemail.suppresscc` configuration value; if
-that is unspecified, default to 'self' if --suppress-from is
-specified, as well as 'body' if --no-signed-off-cc is specified.
+that is unspecified, default to 'self' if `--suppress-from` is
+specified, as well as 'body' if `--no-signed-off-cc` is specified.
 
 --[no-]suppress-from::
 	If this is set, do not add the From: address to the cc: list.
 	Default is the value of `sendemail.suppressFrom` configuration
-	value; if that is unspecified, default to --no-suppress-from.
+	value; if that is unspecified, default to `--no-suppress-from`.
 
 --[no-]thread::
 	If this is set, the In-Reply-To and References headers will be
@@ -366,10 +366,10 @@ specified, as well as 'body' if --no-signed-off-cc is specified.
 	wording) or to the first email (`shallow` threading) is
 	governed by "--[no-]chain-reply-to".
 +
-If disabled with "--no-thread", those headers will not be added
-(unless specified with --in-reply-to).  Default is the value of the
+If disabled with `--no-thread`, those headers will not be added
+(unless specified with `--in-reply-to`).  Default is the value of the
 `sendemail.thread` configuration value; if that is unspecified,
-default to --thread.
+default to `--thread`.
 +
 It is up to the user to ensure that no In-Reply-To header already
 exists when 'git send-email' is asked to add it (especially note that
@@ -389,7 +389,7 @@ Administering
 - 'never' will never confirm before sending
 - 'cc' will confirm before sending when send-email has automatically
   added addresses from the patch to the Cc list
-- 'compose' will confirm before sending the first message when using --compose.
+- 'compose' will confirm before sending the first message when using `--compose`.
 - 'auto' is equivalent to 'cc' + 'compose'
 --
 +
diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt
index 44fd146b91..2cd2d823b3 100644
--- a/Documentation/git-send-pack.txt
+++ b/Documentation/git-send-pack.txt
@@ -32,7 +32,7 @@ OPTIONS
 	a directory on the default $PATH.
 
 --exec=<git-receive-pack>::
-	Same as --receive-pack=<git-receive-pack>.
+	Same as `--receive-pack`=<git-receive-pack>.
 
 --all::
 	Instead of explicitly specifying which refs to update,
diff --git a/Documentation/git-show-branch.txt b/Documentation/git-show-branch.txt
index 5cc2fcefba..0ce603646f 100644
--- a/Documentation/git-show-branch.txt
+++ b/Documentation/git-show-branch.txt
@@ -126,7 +126,7 @@ OPTIONS
 	default to color output.
 	Same as `--color=never`.
 
-Note that --more, --list, --independent and --merge-base options
+Note that `--more`, `--list`, `--independent` and `--merge-base` options
 are mutually exclusive.
 
 
diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt
index ab4d271925..8c739adc70 100644
--- a/Documentation/git-show-ref.txt
+++ b/Documentation/git-show-ref.txt
@@ -23,7 +23,7 @@ particular ref exists.
 
 By default, shows the tags, heads, and remote refs.
 
-The --exclude-existing form is a filter that does the inverse. It reads
+The `--exclude-existing` form is a filter that does the inverse. It reads
 refs from stdin, one ref per line, and shows those that don't exist in
 the local repository.
 
@@ -54,7 +54,7 @@ OPTIONS
 --hash[=<n>]::
 
 	Only show the SHA-1 hash, not the reference name. When combined with
-	--dereference the dereferenced tag will still be shown after the SHA-1.
+	`--dereference` the dereferenced tag will still be shown after the SHA-1.
 
 --verify::
 
@@ -110,7 +110,7 @@ $ git show-ref --head --dereference
 ...
 -----------------------------------------------------------------------------
 
-When using --hash (and not --dereference) the output format is: '<SHA-1 ID>'
+When using `--hash` (and not `--dereference`) the output format is: '<SHA-1 ID>'
 
 -----------------------------------------------------------------------------
 $ git show-ref --heads --hash
@@ -145,7 +145,7 @@ will only match the exact branch called "master".
 If nothing matches, 'git show-ref' will return an error code of 1,
 and in the case of verification, it will show an error message.
 
-For scripting, you can ask it to be quiet with the "--quiet" flag, which
+For scripting, you can ask it to be quiet with the `--quiet` flag, which
 allows you to do things like
 
 -----------------------------------------------------------------------------
@@ -157,11 +157,11 @@ to check whether a particular branch exists or not (notice how we don't
 actually want to show any results, and we want to use the full refname for it
 in order to not trigger the problem with ambiguous partial matches).
 
-To show only tags, or only proper branch heads, use "--tags" and/or "--heads"
+To show only tags, or only proper branch heads, use `--tags` and/or `--heads`
 respectively (using both means that it shows tags and heads, but not other
 random references under the refs/ subdirectory).
 
-To do automatic tag object dereferencing, use the "-d" or "--dereference"
+To do automatic tag object dereferencing, use the `-d` or `--dereference`
 flag, so you can do
 
 -----------------------------------------------------------------------------
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index 83f38e3198..2fa3bc58f7 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -109,7 +109,7 @@ It is optional: it defaults to 'traditional'.
 The possible options are:
 
 	- 'traditional' - Shows ignored files and directories, unless
-			  --untracked-files=all is specified, in which case
+			  `--untracked-files=all` is specified, in which case
 			  individual files in ignored directories are
 			  displayed.
 	- 'no'	        - Show no ignored files.
@@ -252,7 +252,7 @@ via `git add` in the superproject to prepare a commit.
 'm' and '?' are applied recursively. For example if a nested submodule
 in a submodule contains an untracked file, this is reported as '?' as well.
 
-If -b is used the short-format status is preceded by a line
+If `-b` is used the short-format status is preceded by a line
 
     ## branchname tracking info
 
@@ -271,7 +271,7 @@ format, with a few exceptions:
 2. The user's status.relativePaths configuration is not respected; paths
    shown will always be relative to the repository root.
 
-There is also an alternate -z format recommended for machine parsing. In
+There is also an alternate `-z` format recommended for machine parsing. In
 that format, the status field is the same, but some other things
 change.  First, the '\->' is omitted from rename entries and the field
 order is reversed (e.g 'from \-> to' becomes 'to from'). Second, a NUL
@@ -425,11 +425,11 @@ directory.
 If `status.submoduleSummary` is set to a non zero number or true (identical
 to -1 or an unlimited number), the submodule summary will be enabled for
 the long format and a summary of commits for modified submodules will be
-shown (see --summary-limit option of linkgit:git-submodule[1]). Please note
+shown (see `--summary-limit` option of linkgit:git-submodule[1]). Please note
 that the summary output from the status command will be suppressed for all
 submodules when `diff.ignoreSubmodules` is set to 'all' or only for those
 submodules where `submodule.<name>.ignore=all`. To also view the summary for
-ignored submodules you can either use the --ignore-submodules=dirty command
+ignored submodules you can either use the `--ignore-submodules=dirty` command
 line option or the 'git submodule summary' command, which shows a similar
 output but does not honor these settings.
 
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 7e5f995f77..1bcde161ca 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -432,7 +432,7 @@ options carefully.
 
 --[no-]single-branch::
 	This option is only valid for the update command.
-	Clone only one branch during update: HEAD or one specified by --branch.
+	Clone only one branch during update: HEAD or one specified by `--branch`.
 
 <path>...::
 	Paths to submodule(s). When specified this will restrict the command
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 67b143cc81..3f55e9c419 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -17,8 +17,8 @@ It provides a bidirectional flow of changes between a Subversion and a Git
 repository.
 
 'git svn' can track a standard Subversion repository,
-following the common "trunk/branches/tags" layout, with the --stdlayout option.
-It can also follow branches and tags in any layout with the -T/-t/-b options
+following the common "trunk/branches/tags" layout, with the `--stdlayout` option.
+It can also follow branches and tags in any layout with the `-T`/`-t`/`-b` options
 (see options to 'init' below, and also the 'clone' command).
 
 Once tracking a Subversion repository (with any of the above methods), the Git
@@ -32,7 +32,7 @@ COMMANDS
 	Initializes an empty Git repository with additional
 	metadata directories for 'git svn'.  The Subversion URL
 	may be specified as a command-line argument, or as full
-	URL arguments to -T/-t/-b.  Optionally, the target
+	URL arguments to `-T`/`-t`/`-b`.  Optionally, the target
 	directory to operate on can be specified as a second
 	argument.  Normally this command initializes the current
 	directory.
@@ -47,11 +47,11 @@ COMMANDS
 --stdlayout;;
 	These are optional command-line options for init.  Each of
 	these flags can point to a relative repository path
-	(--tags=project/tags) or a full url
-	(--tags=https://foo.org/project/tags).
-	You can specify more than one --tags and/or --branches options, in case
+	(`--tags=project/tags`) or a full url
+	(`--tags=https://foo.org/project/tags`).
+	You can specify more than one `--tags` and/or `--branches` options, in case
 	your Subversion repository places tags or branches under multiple paths.
-	The option --stdlayout is
+	The option `--stdlayout` is
 	a shorthand way of setting trunk,tags,branches as the relative paths,
 	which is the Subversion default. If any of the other options are given
 	as well, they take precedence.
@@ -77,7 +77,7 @@ COMMANDS
 	to the names of remotes if trunk/branches/tags are
 	specified.  The prefix does not automatically include a
 	trailing slash, so be sure you include one in the
-	argument if that is what you want.  If --branches/-b is
+	argument if that is what you want.  If `--branches`/`-b` is
 	specified, the prefix must include a trailing slash.
 	Setting a prefix (with a trailing slash) is strongly
 	encouraged in any case, as your SVN-tracking refs will
@@ -108,8 +108,8 @@ your Perl's Getopt::Long is < v2.37).
 	be preserved as a config key.  See 'fetch' for a description
 	of `--include-paths`.
 --no-minimize-url;;
-	When tracking multiple directories (using --stdlayout,
-	--branches, or --tags options), git svn will attempt to connect
+	When tracking multiple directories (using `--stdlayout`,
+	`--branches`, or `--tags` options), git svn will attempt to connect
 	to the root (or highest allowed level) of the Subversion
 	repository.  This default allows better tracking of history if
 	entire projects are moved within a repository, but may cause
@@ -130,7 +130,7 @@ This automatically updates the rev_map if needed (see
 
 --localtime;;
 	Store Git commit times in the local time zone instead of UTC.  This
-	makes 'git log' (even without --date=local) show the same times
+	makes 'git log' (even without `--date=local`) show the same times
 	that `svn log` would in the local time zone.
 +
 This doesn't interfere with interoperating with the Subversion
@@ -220,7 +220,7 @@ config key: svn-remote.<name>.include-paths
 	are also tracked and removed when no longer necessary.
 
 --placeholder-filename=<filename>;;
-	Set the name of placeholder files created by --preserve-empty-dirs.
+	Set the name of placeholder files created by `--preserve-empty-dirs`.
 	Default: ".gitignore"
 
 'rebase'::
@@ -317,7 +317,7 @@ committing anything to SVN.
 -d<path>;;
 --destination=<path>;;
 
-	If more than one --branches (or --tags) option was given to the 'init'
+	If more than one `--branches` (or `--tags`) option was given to the 'init'
 	or 'clone' command, you must provide the location of the branch (or
 	tag) you wish to create in the SVN repository.  <path> specifies which
 	path to use to create the branch or tag and should match the pattern
@@ -327,7 +327,7 @@ committing anything to SVN.
 	git config --get-all svn-remote.<name>.branches
 	git config --get-all svn-remote.<name>.tags
 +
-where <name> is the name of the SVN repository as specified by the -R option to
+where <name> is the name of the SVN repository as specified by the `-R` option to
 'init' (or "svn" by default).
 
 --username;;
@@ -345,7 +345,7 @@ where <name> is the name of the SVN repository as specified by the -R option to
 
 --parents;;
 	Create parent folders. This parameter is equivalent to the parameter
-	--parents on svn cp commands and is useful for non-standard repository
+	`--parents` on svn cp commands and is useful for non-standard repository
 	layouts.
 
 'tag'::
@@ -354,7 +354,7 @@ where <name> is the name of the SVN repository as specified by the -R option to
 
 'log'::
 	This should make it easy to look up svn log messages when svn
-	users refer to -r/--revision numbers.
+	users refer to `-r`/`--revision` numbers.
 +
 The following features from `svn log' are supported:
 +
@@ -365,10 +365,10 @@ The following features from `svn log' are supported:
 	HEAD, NEXT, BASE, PREV, etc ...
 -v;;
 --verbose;;
-	it's not completely compatible with the --verbose
+	it's not completely compatible with the `--verbose`
 	output in svn log, but reasonably close.
 --limit=<n>;;
-	is NOT the same as --max-count, doesn't count
+	is NOT the same as `--max-count`, doesn't count
 	merged/excluded commits
 --incremental;;
 	supported
@@ -380,7 +380,7 @@ New features:
 --show-commit;;
 	shows the Git commit sha1, as well
 --oneline;;
-	our version of --pretty=oneline
+	our version of `--pretty=oneline`
 --
 +
 NOTE: SVN itself only stores times in UTC and nothing else. The regular svn
@@ -433,7 +433,7 @@ Any other arguments are passed directly to 'git log'
 'create-ignore'::
 	Recursively finds the svn:ignore property on directories and
 	creates matching .gitignore files. The resulting files are staged to
-	be committed, but are not committed. Use -r/--revision to refer to a
+	be committed, but are not committed. Use `-r`/`--revision` to refer to a
 	specific revision.
 
 'show-ignore'::
@@ -458,7 +458,7 @@ Any other arguments are passed directly to 'git log'
 	URL of the target Subversion repository.  The final argument
 	(URL) may be omitted if you are working from a 'git svn'-aware
 	repository (that has been `init`-ed with 'git svn').
-	The -r<revision> option is required for this.
+	The `-r<revision>` option is required for this.
 +
 The commit message is supplied either directly with the `-m` or `-F`
 option, or indirectly from the tag or commit when the second tree-ish
@@ -477,18 +477,18 @@ denotes such an object, or it is requested by invoking an editor (see
 
 'info'::
 	Shows information about a file or directory similar to what
-	`svn info' provides.  Does not currently support a -r/--revision
-	argument.  Use the --url option to output only the value of the
+	`svn info' provides.  Does not currently support a `-r`/`--revision`
+	argument.  Use the `--url` option to output only the value of the
 	'URL:' field.
 
 'proplist'::
 	Lists the properties stored in the Subversion repository about a
-	given file or directory.  Use -r/--revision to refer to a specific
+	given file or directory.  Use `-r`/`--revision` to refer to a specific
 	Subversion revision.
 
 'propget'::
 	Gets the Subversion property given as the first argument, for a
-	file.  A specific revision can be specified with -r/--revision.
+	file.  A specific revision can be specified with `-r`/`--revision`.
 
 'propset'::
 	Sets the Subversion property given as the first argument, to the
@@ -505,7 +505,7 @@ This will set the property 'svn:keywords' to 'FreeBSD=%H' for the file
 'devel/py-tipper/Makefile'.
 
 'show-externals'::
-	Shows the Subversion externals.  Use -r/--revision to specify a
+	Shows the Subversion externals.  Use `-r`/`--revision` to specify a
 	specific revision.
 
 'gc'::
@@ -517,10 +517,10 @@ This will set the property 'svn:keywords' to 'FreeBSD=%H' for the file
 	This allows you to re-'fetch' an SVN revision.  Normally the
 	contents of an SVN revision should never change and 'reset'
 	should not be necessary.  However, if SVN permissions change,
-	or if you alter your --ignore-paths option, a 'fetch' may fail
+	or if you alter your `--ignore-paths` option, a 'fetch' may fail
 	with "not found in commit" (file not previously visible) or
 	"checksum mismatch" (missed a modification).  If the problem
-	file cannot be ignored forever (with --ignore-paths) the only
+	file cannot be ignored forever (with `--ignore-paths`) the only
 	way to repair the repo is to use 'reset'.
 +
 Only the rev_map and refs/remotes/git-svn are changed (see
@@ -735,8 +735,8 @@ ADVANCED OPTIONS
 
 --follow-parent::
 	This option is only relevant if we are tracking branches (using
-	one of the repository layout options --trunk, --tags,
-	--branches, --stdlayout). For each tracked branch, try to find
+	one of the repository layout options `--trunk`, `--tags`,
+	`--branches`, `--stdlayout`). For each tracked branch, try to find
 	out where its revision was copied from, and set
 	a suitable parent in the first Git commit for the branch.
 	This is especially helpful when we're tracking a directory
@@ -747,7 +747,7 @@ ADVANCED OPTIONS
 	However, following long/convoluted histories can take a long
 	time, so disabling this feature may speed up the cloning
 	process. This feature is enabled by default, use
-	--no-follow-parent to disable it.
+	`--no-follow-parent` to disable it.
 +
 [verse]
 config key: svn.followparent
@@ -951,7 +951,7 @@ compatibility with SVN (see the CAVEATS section below).
 
 HANDLING OF SVN BRANCHES
 ------------------------
-If 'git svn' is configured to fetch branches (and --follow-branches
+If 'git svn' is configured to fetch branches (and `--follow-branches`
 is in effect), it sometimes creates multiple Git branches for one
 SVN branch, where the additional branches have names of the form
 'branchname@nnn' (with nnn an SVN revision number).  These additional
@@ -1031,14 +1031,14 @@ before 'dcommit' on will require forcing an overwrite of the existing ref
 on the remote repository.  This is generally considered bad practice,
 see the linkgit:git-push[1] documentation for details.
 
-Do not use the --amend option of linkgit:git-commit[1] on a change you've
-already dcommitted.  It is considered bad practice to --amend commits
+Do not use the `--amend` option of linkgit:git-commit[1] on a change you've
+already dcommitted.  It is considered bad practice to `--amend` commits
 you've already pushed to a remote repository for other users, and
 dcommit with SVN is analogous to that.
 
 When cloning an SVN repository, if none of the options for describing
-the repository layout is used (--trunk, --tags, --branches,
---stdlayout), 'git svn clone' will create a Git repository with
+the repository layout is used (`--trunk`, `--tags`, `--branches`,
+`--stdlayout`), 'git svn clone' will create a Git repository with
 completely linear history, where branches and tags appear as separate
 directories in the working copy.  While this is the easiest way to get a
 copy of a complete repository, for projects with many branches it will
@@ -1051,7 +1051,7 @@ without giving any repository layout options.  If the full history with
 branches and tags is required, the options `--trunk` / `--branches` /
 `--tags` must be used.
 
-When using multiple --branches or --tags, 'git svn' does not automatically
+When using multiple `--branches` or `--tags`, 'git svn' does not automatically
 handle name collisions (for example, if two branches from different paths have
 the same name, or if a branch and a tag have the same name).  In these cases,
 use 'init' to set up your Git repository then, before your first 'fetch', edit
@@ -1142,7 +1142,7 @@ Multiple fetch, branches, and tags keys are supported:
 ------------------------------------------------------------------------
 
 Creating a branch in such a configuration requires disambiguating which
-location to use using the -d or --destination flag:
+location to use using the `-d` or `--destination` flag:
 
 ------------------------------------------------------------------------
 $ git svn branch -d branches/server release-2-3-0
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 31a97a1b6c..b802972bb2 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -111,7 +111,7 @@ options for details.
 
 --sort=<key>::
 	Sort based on the key given.  Prefix `-` to sort in
-	descending order of the value. You may use the --sort=<key> option
+	descending order of the value. You may use the `--sort=<key>` option
 	multiple times, in which case the last key becomes the primary
 	key. Also supports "version:refname" or "v:refname" (tag
 	names are treated as versions). The "version:refname" sort
@@ -236,7 +236,7 @@ On Re-tagging
 What should you do when you tag a wrong commit and you would
 want to re-tag?
 
-If you never pushed anything out, just re-tag it. Use "-f" to
+If you never pushed anything out, just re-tag it. Use `-f` to
 replace the old one. And you're done.
 
 But if you have pushed things out (or others could just read
diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt
index 2853f168d9..936b64045e 100644
--- a/Documentation/git-update-index.txt
+++ b/Documentation/git-update-index.txt
@@ -56,21 +56,21 @@ OPTIONS
 	updates are needed by checking stat() information.
 
 -q::
-        Quiet.  If --refresh finds that the index needs an update, the
+        Quiet.  If `--refresh` finds that the index needs an update, the
         default behavior is to error out.  This option makes
 	'git update-index' continue anyway.
 
 --ignore-submodules::
 	Do not try to update submodules.  This option is only respected
-	when passed before --refresh.
+	when passed before `--refresh`.
 
 --unmerged::
-        If --refresh finds unmerged changes in the index, the default
+        If `--refresh` finds unmerged changes in the index, the default
 	behavior is to error out.  This option makes 'git update-index'
         continue anyway.
 
 --ignore-missing::
-	Ignores missing files during a --refresh
+	Ignores missing files during a `--refresh`
 
 --cacheinfo <mode>,<object>,<path>::
 --cacheinfo <mode> <object> <path>::
@@ -140,13 +140,13 @@ you will need to handle the situation manually.
 
 --force-remove::
 	Remove the file from the index even when the working directory
-	still has such a file. (Implies --remove.)
+	still has such a file. (Implies `--remove`.)
 
 --replace::
 	By default, when a file `path` exists in the index,
 	'git update-index' refuses an attempt to add `path/file`.
 	Similarly if a file `path/file` exists, a file `path`
-	cannot be added.  With --replace flag, existing entries
+	cannot be added.  With `--replace` flag, existing entries
 	that conflict with the entry being added are
 	automatically removed with warning messages.
 
diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt
index 48b6683071..3c3da97c29 100644
--- a/Documentation/git-update-ref.txt
+++ b/Documentation/git-update-ref.txt
@@ -37,7 +37,7 @@ them and update them as a regular file (i.e. it will allow the
 filesystem to follow them, but will overwrite such a symlink to
 somewhere else with a regular filename).
 
-If --no-deref is given, <ref> itself is overwritten, rather than
+If `--no-deref` is given, <ref> itself is overwritten, rather than
 the result of following the symbolic pointers.
 
 In general, using
@@ -164,12 +164,12 @@ stored in <ref>, "newsha1" is the 40 character hexadecimal value of
 <newvalue> and "committer" is the committer's name, email address
 and date in the standard Git committer ident format.
 
-Optionally with -m:
+Optionally with `-m`:
 
     oldsha1 SP newsha1 SP committer TAB message LF
 
 Where all fields are as described above and "message" is the
-value supplied to the -m option.
+value supplied to the `-m` option.
 
 An update will fail (without changing <ref>) if the current user is
 unable to create a new log file, append to the existing log file
diff --git a/Documentation/git-verify-pack.txt b/Documentation/git-verify-pack.txt
index 61ca6d04c2..e1e537fcfb 100644
--- a/Documentation/git-verify-pack.txt
+++ b/Documentation/git-verify-pack.txt
@@ -38,7 +38,7 @@ OPTIONS
 
 OUTPUT FORMAT
 -------------
-When specifying the -v option the format used is:
+When specifying the `-v` option the format used is:
 
 	SHA-1 type size size-in-packfile offset-in-packfile
 
diff --git a/Documentation/git-web--browse.txt b/Documentation/git-web--browse.txt
index 8d162b56c5..d53b2570df 100644
--- a/Documentation/git-web--browse.txt
+++ b/Documentation/git-web--browse.txt
@@ -62,7 +62,7 @@ CONF.VAR (from -c option) and web.browser
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The web browser can be specified using a configuration variable passed
-with the -c (or --config) command-line option, or the `web.browser`
+with the `-c` (or `--config`) command-line option, or the `web.browser`
 configuration variable if the former is not used.
 
 browser.<tool>.path
diff --git a/Documentation/git-whatchanged.txt b/Documentation/git-whatchanged.txt
index 8b63ceb00e..798a43965b 100644
--- a/Documentation/git-whatchanged.txt
+++ b/Documentation/git-whatchanged.txt
@@ -35,7 +35,7 @@ Examples
 `git whatchanged --since="2 weeks ago" -- gitk`::
 
 	Show the changes during the last two weeks to the file 'gitk'.
-	The "--" is necessary to avoid confusion with the *branch* named
+	The `--` is necessary to avoid confusion with the *branch* named
 	'gitk'
 
 GIT
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 3a9c44987f..fc49a4fd42 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -566,9 +566,9 @@ Git Commits
 Git Diffs
 ~~~~~~~~~
 `GIT_DIFF_OPTS`::
-	Only valid setting is "--unified=??" or "-u??" to set the
+	Only valid setting is `--unified=??` or `-u??` to set the
 	number of context lines shown when a unified diff is created.
-	This takes precedence over any "-U" or "--unified" option
+	This takes precedence over any `-U` or `--unified` option
 	value passed on the Git diff command line.
 
 `GIT_EXTERNAL_DIFF`::
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt
index c0b95256cc..633439702f 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.txt
@@ -941,7 +941,7 @@ branch head.  Please see linkgit:gitrevisions[7] if you want to
 see more complex cases.
 
 [NOTE]
-Without the '--more=1' option, 'git show-branch' would not output the
+Without the `--more=1` option, 'git show-branch' would not output the
 '[master^]' commit, as '[mybranch]' commit is a common ancestor of
 both 'master' and 'mybranch' tips.  Please see linkgit:git-show-branch[1]
 for details.
diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt
index 0d57f86abc..fbc458c3e5 100644
--- a/Documentation/gitdiffcore.txt
+++ b/Documentation/gitdiffcore.txt
@@ -55,7 +55,7 @@ is under consideration.
 
 The result of comparison is passed from these commands to what is
 internally called "diffcore", in a format similar to what is output
-when the -p option is not used.  E.g.
+when the `-p` option is not used.  E.g.
 
 ------------------------------------------------
 in-place edit  :100644 100644 bcd1234... 0123456... M file0
@@ -89,7 +89,7 @@ diffcore-break: For Splitting Up Complete Rewrites
 --------------------------------------------------
 
 The second transformation in the chain is diffcore-break, and is
-controlled by the -B option to the 'git diff-{asterisk}' commands.  This is
+controlled by the `-B` option to the 'git diff-{asterisk}' commands.  This is
 used to detect a filepair that represents "complete rewrite" and
 break such filepair into two filepairs that represent delete and
 create.  E.g.  If the input contained this filepair:
@@ -117,14 +117,14 @@ score defaults to 50% of the size of the smaller of the original
 and the result (i.e. if the edit shrinks the file, the size of
 the result is used; if the edit lengthens the file, the size of
 the original is used), and can be customized by giving a number
-after "-B" option (e.g. "-B75" to tell it to use 75%).
+after `-B` option (e.g. `-B75` to tell it to use 75%).
 
 
 diffcore-rename: For Detecting Renames and Copies
 -------------------------------------------------
 
 This transformation is used to detect renames and copies, and is
-controlled by the -M option (to detect renames) and the -C option
+controlled by the `-M` option (to detect renames) and the `-C` option
 (to detect copies as well) to the 'git diff-{asterisk}' commands.  If the
 input contained these filepairs:
 
@@ -141,9 +141,9 @@ merges these filepairs and creates:
 :100644 100644 0123456... 0123456... R100 fileX file0
 ------------------------------------------------
 
-When the "-C" option is used, the original contents of modified files,
+When the `-C` option is used, the original contents of modified files,
 and deleted files (and also unmodified files, if the
-"--find-copies-harder" option is used) are considered as candidates
+`--find-copies-harder` option is used) are considered as candidates
 of the source files in rename/copy operation.  If the input were like
 these filepairs, that talk about a modified file fileY and a newly
 created file file0:
@@ -166,7 +166,7 @@ In both rename and copy detection, the same "extent of changes"
 algorithm used in diffcore-break is used to determine if two
 files are "similar enough", and can be customized to use
 a similarity score different from the default of 50% by giving a
-number after the "-M" or "-C" option (e.g. "-M8" to tell it to use
+number after the `-M` or `-C` option (e.g. `-M8` to tell it to use
 8/10 = 80%).
 
 Note that when rename detection is on but both copy and break
@@ -189,7 +189,7 @@ preliminary pass; so if there are several remaining ext.txt files
 throughout the directory hierarchy after exact rename detection, this
 preliminary step may be skipped for those files.
 
-Note.  When the "-C" option is used with `--find-copies-harder`
+Note.  When the `-C` option is used with `--find-copies-harder`
 option, 'git diff-{asterisk}' commands feed unmodified filepairs to
 diffcore mechanism as well as modified ones.  This lets the copy
 detector consider unmodified files as copy source candidates at
@@ -222,13 +222,13 @@ transformation merges them back into the original
 The "extent of changes" parameter can be tweaked from the
 default 80% (that is, unless more than 80% of the original
 material is deleted, the broken pairs are merged back into a
-single modification) by giving a second number to -B option,
+single modification) by giving a second number to `-B` option,
 like these:
 
-* -B50/60 (give 50% "break score" to diffcore-break, use 60%
+* `-B50/60` (give 50% "break score" to diffcore-break, use 60%
   for diffcore-merge-broken).
 
-* -B/60 (the same as above, since diffcore-break defaults to 50%).
+* `-B/60` (the same as above, since diffcore-break defaults to 50%).
 
 Note that earlier implementation left a broken pair as a separate
 creation and deletion patches.  This was an unnecessary hack and
@@ -245,10 +245,10 @@ diffcore-pickaxe: For Detecting Addition/Deletion of Specified String
 
 This transformation limits the set of filepairs to those that change
 specified strings between the preimage and the postimage in a certain
-way.  -S<block of text> and -G<regular expression> options are used to
+way.  `-S<block of text>` and `-G<regular expression>` options are used to
 specify different ways these strings are sought.
 
-"-S<block of text>" detects filepairs whose preimage and postimage
+`-S<block of text>` detects filepairs whose preimage and postimage
 have different number of occurrences of the specified block of text.
 By definition, it will not detect in-file moves.  Also, when a
 changeset moves a file wholesale without affecting the interesting
@@ -258,7 +258,7 @@ rename-detected filepair).  When used with `--pickaxe-regex`, treat
 the <block of text> as an extended POSIX regular expression to match,
 instead of a literal string.
 
-"-G<regular expression>" (mnemonic: grep) detects filepairs whose
+`-G<regular expression>` (mnemonic: grep) detects filepairs whose
 textual diff has an added or a deleted line that matches the given
 regular expression.  This means that it will detect in-file (or what
 rename-detection considers the same file) moves, which is noise.  The
@@ -277,7 +277,7 @@ diffcore-order: For Sorting the Output Based on Filenames
 ---------------------------------------------------------
 
 This is used to reorder the filepairs according to the user's
-(or project's) taste, and is controlled by the -O option to the
+(or project's) taste, and is controlled by the `-O` option to the
 'git diff-{asterisk}' commands.
 
 This takes a text file each of whose lines is a shell glob
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index d50e9ed10e..6ceeae227c 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -112,7 +112,7 @@ include::line-range-options.txt[]
 <path>...::
 
 	Limit commits to the ones touching files in the given paths. Note, to
-	avoid ambiguity with respect to revision names use "--" to separate the paths
+	avoid ambiguity with respect to revision names use `--` to separate the paths
 	from any preceding options.
 
 gitk-specific options
@@ -130,7 +130,7 @@ gitk-specific options
 --select-commit=<ref>::
 
 	Select the specified commit after loading the graph.
-	Default behavior is equivalent to specifying '--select-commit=HEAD'.
+	Default behavior is equivalent to specifying `--select-commit=HEAD`.
 
 Examples
 --------
@@ -142,7 +142,7 @@ gitk v2.6.12.. include/scsi drivers/scsi::
 gitk --since="2 weeks ago" \-- gitk::
 
 	Show the changes during the last two weeks to the file 'gitk'.
-	The "--" is necessary to avoid confusion with the *branch* named
+	The `--` is necessary to avoid confusion with the *branch* named
 	'gitk'
 
 gitk --max-count=100 --all \-- Makefile::
diff --git a/Documentation/gittutorial-2.txt b/Documentation/gittutorial-2.txt
index 8bdb7d0bd3..e1e09070ad 100644
--- a/Documentation/gittutorial-2.txt
+++ b/Documentation/gittutorial-2.txt
@@ -318,7 +318,7 @@ index a042389..513feba 100644
 ------------------------------------------------
 
 At any time, we can create a new commit using 'git commit' (without
-the "-a" option), and verify that the state committed only includes the
+the `-a` option), and verify that the state committed only includes the
 changes stored in the index file, not the additional change that is
 still only in our working tree:
 
@@ -336,7 +336,7 @@ index 513feba..ba3da7b 100644
 ------------------------------------------------
 
 So by default 'git commit' uses the index to create the commit, not
-the working tree; the "-a" option to commit tells it to first update
+the working tree; the `-a` option to commit tells it to first update
 the index with all changes in the working tree.
 
 Finally, it's worth looking at the effect of 'git add' on the index
diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.txt
index 59ef5cef1f..ff366cc752 100644
--- a/Documentation/gittutorial.txt
+++ b/Documentation/gittutorial.txt
@@ -95,13 +95,13 @@ $ git add file1 file2 file3
 ------------------------------------------------
 
 You are now ready to commit.  You can see what is about to be committed
-using 'git diff' with the --cached option:
+using 'git diff' with the `--cached` option:
 
 ------------------------------------------------
 $ git diff --cached
 ------------------------------------------------
 
-(Without --cached, 'git diff' will show you any changes that
+(Without `--cached`, 'git diff' will show you any changes that
 you've made but not yet added to the index.)  You can also get a brief
 summary of the situation with 'git status':
 
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index 7963a79ba9..181c543a64 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -459,14 +459,14 @@ $fallback_encoding::
 
 @diff_opts::
 	Rename detection options for git-diff and git-diff-tree. The default is
-	(\'-M'); set it to (\'-C') or (\'-C', \'-C') to also detect copies,
-	or set it to () i.e. empty list if you don't want to have renames
+	`('-M')`; set it to `('-C')` or `('-C', '-C')` to also detect copies,
+	or set it to `()` i.e. empty list if you don't want to have renames
 	detection.
 +
 *Note* that rename and especially copy detection can be quite
 CPU-intensive.  Note also that non Git tools can have problems with
 patches generated with options mentioned above, especially when they
-involve file copies (\'-C') or criss-cross renames (\'-B').
+involve file copies `('-C')` or criss-cross renames `('-B')`.
 
 
 Some optional features and policies
diff --git a/Documentation/howto/revert-branch-rebase.txt b/Documentation/howto/revert-branch-rebase.txt
index a3e5595a56..29b15a1173 100644
--- a/Documentation/howto/revert-branch-rebase.txt
+++ b/Documentation/howto/revert-branch-rebase.txt
@@ -54,7 +54,7 @@ since then.  I just limited the output to the first handful using
 Now I know 'master^2~4' (pronounce it as "find the second parent of
 the 'master', and then go four generations back following the first
 parent") is the one I would want to revert.  Since I also want to say
-why I am reverting it, the '-n' flag is given to 'git revert'.  This
+why I am reverting it, the `-n` flag is given to 'git revert'.  This
 prevents it from actually making a commit, and instead 'git revert'
 leaves the commit log message it wanted to use in '.msg' file:
 
diff --git a/Documentation/howto/setup-git-server-over-http.txt b/Documentation/howto/setup-git-server-over-http.txt
index bfe6f9b500..7a34937da0 100644
--- a/Documentation/howto/setup-git-server-over-http.txt
+++ b/Documentation/howto/setup-git-server-over-http.txt
@@ -163,7 +163,7 @@ Create this file by
       $ htpasswd -c /etc/apache2/passwd.git <user>
 
 You will be asked a password, and the file is created. Subsequent calls
-to htpasswd should omit the '-c' option, since you want to append to the
+to htpasswd should omit the `-c` option, since you want to append to the
 existing file.
 
 You need to restart Apache.
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index eb0aabd396..bf43c33d27 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -1,16 +1,16 @@
 --commit::
 --no-commit::
 	Perform the merge and commit the result. This option can
-	be used to override --no-commit.
+	be used to override `--no-commit`.
 +
-With --no-commit perform the merge and stop just before creating
+With `--no-commit` perform the merge and stop just before creating
 a merge commit, to give the user a chance to inspect and further
 tweak the merge result before committing.
 +
 Note that fast-forward updates do not create a merge commit and
-therefore there is no way to stop those merges with --no-commit.
+therefore there is no way to stop those merges with `--no-commit`.
 Thus, if you want to ensure your branch is not changed or updated
-by the merge command, use --no-ff with --no-commit.
+by the merge command, use `--no-ff` with `--no-commit`.
 
 --edit::
 -e::
@@ -74,7 +74,7 @@ When not possible, refuse to merge and exit with a non-zero status.
 	one-line descriptions from at most <n> actual commits that are being
 	merged. See also linkgit:git-fmt-merge-msg[1].
 +
-With --no-log do not list one-line descriptions from the
+With `--no-log` do not list one-line descriptions from the
 actual commits being merged.
 
 include::signoff-option.txt[]
@@ -85,7 +85,7 @@ include::signoff-option.txt[]
 	Show a diffstat at the end of the merge. The diffstat is also
 	controlled by the configuration option merge.stat.
 +
-With -n or --no-stat do not show a diffstat at the end of the
+With `-n` or `--no-stat` do not show a diffstat at the end of the
 merge.
 
 --squash::
@@ -98,10 +98,10 @@ merge.
 	the current branch whose effect is the same as merging another
 	branch (or more in case of an octopus).
 +
-With --no-squash perform the merge and commit the result. This
-option can be used to override --squash.
+With `--no-squash` perform the merge and commit the result. This
+option can be used to override `--squash`.
 +
-With --squash, --commit is not allowed, and will fail.
+With `--squash`, `--commit` is not allowed, and will fail.
 
 --no-verify::
 	This option bypasses the pre-merge and commit-msg hooks.
@@ -130,13 +130,13 @@ With --squash, --commit is not allowed, and will fail.
 
 --summary::
 --no-summary::
-	Synonyms to --stat and --no-stat; these are deprecated and will be
+	Synonyms to `--stat` and `--no-stat`; these are deprecated and will be
 	removed in the future.
 
 ifndef::git-pull[]
 -q::
 --quiet::
-	Operate quietly. Implies --no-progress.
+	Operate quietly. Implies `--no-progress`.
 
 -v::
 --verbose::
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 45133066e4..d8a755faf1 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -93,8 +93,8 @@ confused as starting a new commit.
 +
 The 'raw' format shows the entire commit exactly as
 stored in the commit object.  Notably, the hashes are
-displayed in full, regardless of whether --abbrev or
---no-abbrev are used, and 'parents' information show the
+displayed in full, regardless of whether `--abbrev` or
+`--no-abbrev` are used, and 'parents' information show the
 true parent commits, without taking grafts or history
 simplification into account. Note that this format affects the way
 commits are displayed, but not the way the diff is shown e.g. with
@@ -144,7 +144,7 @@ The placeholders are:
 	    on the next placeholders until the color is switched
 	    again.
 '%m':: left (`<`), right (`>`) or boundary (`-`) mark
-'%w([<w>[,<i1>[,<i2>]]])':: switch line wrapping, like the -w option of
+'%w([<w>[,<i1>[,<i2>]]])':: switch line wrapping, like the `-w` option of
 			    linkgit:git-shortlog[1].
 '%<(<N>[,trunc|ltrunc|mtrunc])':: make the next placeholder take at
 				  least N columns, padding spaces on
@@ -183,7 +183,7 @@ The placeholders are:
 '%al':: author email local-part (the part before the '@' sign)
 '%aL':: author local-part (see '%al') respecting .mailmap, see
 	linkgit:git-shortlog[1] or linkgit:git-blame[1])
-'%ad':: author date (format respects --date= option)
+'%ad':: author date (format respects `--date=` option)
 '%aD':: author date, RFC2822 style
 '%ar':: author date, relative
 '%at':: author date, UNIX timestamp
@@ -199,14 +199,14 @@ The placeholders are:
 '%cl':: committer email local-part (the part before the '@' sign)
 '%cL':: committer local-part (see '%cl') respecting .mailmap, see
 	linkgit:git-shortlog[1] or linkgit:git-blame[1])
-'%cd':: committer date (format respects --date= option)
+'%cd':: committer date (format respects `--date=` option)
 '%cD':: committer date, RFC2822 style
 '%cr':: committer date, relative
 '%ct':: committer date, UNIX timestamp
 '%ci':: committer date, ISO 8601-like format
 '%cI':: committer date, strict ISO 8601 format
 '%cs':: committer date, short format (`YYYY-MM-DD`)
-'%d':: ref names, like the --decorate option of linkgit:git-log[1]
+'%d':: ref names, like the `--decorate` option of linkgit:git-log[1]
 '%D':: ref names without the " (", ")" wrapping.
 '%(describe[:options])':: human-readable name, like
 			  linkgit:git-describe[1]; empty string for
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt
index 27ddaf84a1..f8c61dd42e 100644
--- a/Documentation/pretty-options.txt
+++ b/Documentation/pretty-options.txt
@@ -6,7 +6,7 @@
 	'full', 'fuller', 'reference', 'email', 'raw', 'format:<string>'
 	and 'tformat:<string>'.  When '<format>' is none of the above,
 	and has '%placeholder' in it, it acts as if
-	'--pretty=tformat:<format>' were given.
+	`--pretty=tformat:<format>` were given.
 +
 See the "PRETTY FORMATS" section for some additional details for each
 format.  When '=<format>' part is omitted, it defaults to 'medium'.
@@ -17,19 +17,19 @@ configuration (see linkgit:git-config[1]).
 --abbrev-commit::
 	Instead of showing the full 40-byte hexadecimal commit object
 	name, show a prefix that names the object uniquely.
-	"--abbrev=<n>" (which also modifies diff output, if it is displayed)
+	`--abbrev=<n>` (which also modifies diff output, if it is displayed)
 	option can be used to specify the minimum length of the prefix.
 +
-This should make "--pretty=oneline" a whole lot more readable for
+This should make `--pretty=oneline` a whole lot more readable for
 people using 80-column terminals.
 
 --no-abbrev-commit::
 	Show the full 40-byte hexadecimal commit object name. This negates
 	`--abbrev-commit`, either explicit or implied by other options such
-	as "--oneline". It also overrides the `log.abbrevCommit` variable.
+	as `--oneline`. It also overrides the `log.abbrevCommit` variable.
 
 --oneline::
-	This is a shorthand for "--pretty=oneline --abbrev-commit"
+	This is a shorthand for `--pretty=oneline --abbrev-commit`
 	used together.
 
 --encoding=<encoding>::
@@ -73,21 +73,21 @@ to display.  The ref can specify the full refname when it begins
 with `refs/notes/`; when it begins with `notes/`, `refs/` and otherwise
 `refs/notes/` is prefixed to form a full name of the ref.
 +
-Multiple --notes options can be combined to control which notes are
-being displayed. Examples: "--notes=foo" will show only notes from
-"refs/notes/foo"; "--notes=foo --notes" will show both notes from
+Multiple `--notes` options can be combined to control which notes are
+being displayed. Examples: `--notes=foo` will show only notes from
+"refs/notes/foo"; `--notes=foo --notes` will show both notes from
 "refs/notes/foo" and from the default notes ref(s).
 
 --no-notes::
 	Do not show notes. This negates the above `--notes` option, by
 	resetting the list of notes refs from which notes are shown.
 	Options are parsed in the order given on the command line, so e.g.
-	"--notes --notes=foo --no-notes --notes=bar" will only show notes
+	`--notes --notes=foo --no-notes --notes=bar` will only show notes
 	from "refs/notes/bar".
 
 --show-notes[=<ref>]::
 --[no-]standard-notes::
-	These options are deprecated. Use the above --notes/--no-notes
+	These options are deprecated. Use the above `--notes`/`--no-notes`
 	options instead.
 endif::git-rev-list[]
 
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index b1c8f86c6e..965cb32f9c 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -885,38 +885,38 @@ ifdef::git-rev-list[]
 	blobs) from the list of printed objects.  The '<filter-spec>'
 	may be one of the following:
 +
-The form '--filter=blob:none' omits all blobs.
+The form `--filter=blob:none` omits all blobs.
 +
-The form '--filter=blob:limit=<n>[kmg]' omits blobs larger than n bytes
+The form `--filter=blob:limit=<n>[kmg]` omits blobs larger than n bytes
 or units.  n may be zero.  The suffixes k, m, and g can be used to name
 units in KiB, MiB, or GiB.  For example, 'blob:limit=1k' is the same
 as 'blob:limit=1024'.
 +
-The form '--filter=sparse:oid=<blob-ish>' uses a sparse-checkout
+The form `--filter=sparse:oid=<blob-ish>` uses a sparse-checkout
 specification contained in the blob (or blob-expression) '<blob-ish>'
 to omit blobs that would not be not required for a sparse checkout on
 the requested refs.
 +
-The form '--filter=tree:<depth>' omits all blobs and trees whose depth
+The form `--filter=tree:<depth>` omits all blobs and trees whose depth
 from the root tree is >= <depth> (minimum depth if an object is located
 at multiple depths in the commits traversed). <depth>=0 will not include
 any trees or blobs unless included explicitly in the command-line (or
-standard input when --stdin is used). <depth>=1 will include only the
+standard input when `--stdin` is used). <depth>=1 will include only the
 tree and blobs which are referenced directly by a commit reachable from
 <commit> or an explicitly-given object. <depth>=2 is like <depth>=1
 while also including trees and blobs one more level removed from an
 explicitly-given commit or tree.
 +
-Note that the form '--filter=sparse:path=<path>' that wants to read
+Note that the form `--filter=sparse:path=<path>` that wants to read
 from an arbitrary path on the filesystem has been dropped for security
 reasons.
 +
-Multiple '--filter=' flags can be specified to combine filters. Only
+Multiple `--filter=` flags can be specified to combine filters. Only
 objects which are accepted by every filter are included.
 +
-The form '--filter=combine:<filter1>+<filter2>+...<filterN>' can also be
+The form `--filter=combine:<filter1>+<filter2>+...<filterN>` can also be
 used to combined several filters, but this is harder than just repeating
-the '--filter' flag and is usually not necessary. Filters are joined by
+the `--filter` flag and is usually not necessary. Filters are joined by
 '{plus}' and individual filters are %-encoded (i.e. URL-encoded).
 Besides the '{plus}' and '%' characters, the following characters are
 reserved and also must be encoded: `~!@#$^&*()[]{}\;",<>?`+&#39;&#96;+
@@ -938,18 +938,18 @@ equivalent.
 	A debug option to help with future "partial clone" development.
 	This option specifies how missing objects are handled.
 +
-The form '--missing=error' requests that rev-list stop with an error if
+The form `--missing=error` requests that rev-list stop with an error if
 a missing object is encountered.  This is the default action.
 +
-The form '--missing=allow-any' will allow object traversal to continue
+The form `--missing=allow-any` will allow object traversal to continue
 if a missing object is encountered.  Missing objects will silently be
 omitted from the results.
 +
-The form '--missing=allow-promisor' is like 'allow-any', but will only
+The form `--missing=allow-promisor` is like 'allow-any', but will only
 allow object traversal to continue for EXPECTED promisor missing objects.
 Unexpected missing objects will raise an error.
 +
-The form '--missing=print' is like 'allow-any', but will also print a
+The form `--missing=print` is like 'allow-any', but will also print a
 list of the missing objects.  Object IDs are prefixed with a ``?'' character.
 
 --exclude-promisor-objects::
@@ -1113,7 +1113,7 @@ This implies the `--topo-order` option by default, but the
 `--date-order` option may also be specified.
 
 --show-linear-break[=<barrier>]::
-	When --graph is not used, all history branches are flattened
+	When `--graph` is not used, all history branches are flattened
 	which can make it hard to see that the two consecutive commits
 	do not belong to a linear branch. This option puts a barrier
 	in between them in that case. If `<barrier>` is specified, it
diff --git a/Documentation/signoff-option.txt b/Documentation/signoff-option.txt
index 12aa2333e4..597d057c6e 100644
--- a/Documentation/signoff-option.txt
+++ b/Documentation/signoff-option.txt
@@ -14,5 +14,5 @@ endif::git-commit[]
 	leadership of the project to which you're contributing to
 	understand how the signoffs are used in that project.
 +
-The --no-signoff option can be used to countermand an earlier --signoff
+The `--no-signoff` option can be used to countermand an earlier `--signoff`
 option on the command line.
diff --git a/Documentation/urls.txt b/Documentation/urls.txt
index 1c229d7581..c50ddd3120 100644
--- a/Documentation/urls.txt
+++ b/Documentation/urls.txt
@@ -44,13 +44,13 @@ syntaxes may be used:
 
 ifndef::git-clone[]
 These two syntaxes are mostly equivalent, except when cloning, when
-the former implies --local option. See linkgit:git-clone[1] for
+the former implies `--local` option. See linkgit:git-clone[1] for
 details.
 endif::git-clone[]
 
 ifdef::git-clone[]
 These two syntaxes are mostly equivalent, except the former implies
---local option.
+`--local` option.
 endif::git-clone[]
 
 'git clone', 'git fetch' and 'git pull', but not 'git push', will also
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index fd480b8645..0f9a699c09 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -293,7 +293,7 @@ ref: refs/heads/master
 === Examining an old version without creating a new branch
 
 The `git switch` command normally expects a branch head, but will also
-accept an arbitrary commit when invoked with --detach; for example,
+accept an arbitrary commit when invoked with `--detach`; for example,
 you can check out the commit referenced by a tag:
 
 ------------------------------------------------
@@ -305,7 +305,7 @@ changes and commit them, and you can discard any commits you make in this
 state without impacting any branches by performing another switch.
 
 If you want to create a new branch to retain commits you create, you may
-do so (now or later) by using -c with the switch command again. Example:
+do so (now or later) by using `-c` with the switch command again. Example:
 
   git switch -c new_branch_name
 
-- 
2.31.1.133.g84d06cdc06


^ permalink raw reply related	[relevance 1%]

* [PATCH v2 1/5] unpack-trees: add basic support for parallel checkout
  @ 2021-04-08 16:17  2% ` Matheus Tavares
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares @ 2021-04-08 16:17 UTC (permalink / raw)
  To: git; +Cc: christian.couder, gitster, git

This new interface allows us to enqueue some of the entries being
checked out to later uncompress them, apply in-process filters, and
write out the files in parallel. For now, the parallel checkout
machinery is enabled by default and there is no user configuration, but
run_parallel_checkout() just writes the queued entries in sequence
(without spawning additional workers). The next patch will actually
implement the parallelism and, later, we will make it configurable.

Note that, to avoid potential data races, not all entries are eligible
for parallel checkout. Also, paths that collide on disk (e.g.
case-sensitive paths in case-insensitive file systems), are detected by
the parallel checkout code and skipped, so that they can be safely
sequentially handled later. The collision detection works like the
following:

- If the collision was at basename (e.g. 'a/b' and 'a/B'), the framework
  detects it by looking for EEXIST and EISDIR errors after an
  open(O_CREAT | O_EXCL) failure.

- If the collision was at dirname (e.g. 'a/b' and 'A'), it is detected
  at the has_dirs_only_path() check, which is done for the leading path
  of each item in the parallel checkout queue.

Both verifications rely on the fact that, before enqueueing an entry for
parallel checkout, checkout_entry() makes sure that there is no file at
the entry's path and that its leading components are all real
directories. So, any later change in these conditions indicates that
there was a collision (either between two parallel-eligible entries or
between an eligible and an ineligible one).

After all parallel-eligible entries have been processed, the collided
(and thus, skipped) entries are sequentially fed to checkout_entry()
again. This is similar to the way the current code deals with
collisions, overwriting the previously checked out entries with the
subsequent ones. The only difference is that, since we no longer create
the files in the same order that they appear on index, we are not able
to determine which of the colliding entries will survive on disk (for
the classic code, it is always the last entry).

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 Makefile            |   1 +
 entry.c             |  17 +-
 parallel-checkout.c | 368 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  32 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 421 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index a6a73c5741..99734cc2ea 100644
--- a/Makefile
+++ b/Makefile
@@ -946,6 +946,7 @@ 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
diff --git a/entry.c b/entry.c
index 2dc94ba5cc..d7ed38aa40 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout doesn't create the files in index
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..80c839837b
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,368 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items; /* The parallel checkout queue. */
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout;
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	/*
+	 * Symlinks cannot be checked out in parallel as, in case of path
+	 * collision, they could racily replace leading directories of other
+	 * entries being checked out. Submodules are checked out in child
+	 * processes, which have their own parallel checkout queues.
+	 */
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have its stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error("parallel checkout finished with pending entries");
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of '%s'", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file '%s'", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *new_blob;
+	unsigned long size;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	new_blob = read_blob_entry(pc_item->ce, &size);
+	if (!new_blob)
+		return error("cannot read object %s '%s'",
+			     oid_to_hex(&pc_item->ce->oid), path);
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 new_blob, size, &buf, NULL);
+
+	if (ret) {
+		size_t newsize;
+		free(new_blob);
+		new_blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, new_blob, size);
+	free(new_blob);
+	if (wrote < 0)
+		return error("unable to write file '%s'", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+	const char *dir_sep;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	dir_sep = find_last_dir_sep(path.buf);
+
+	/*
+	 * The leading dirs should have been already created by now. But, in
+	 * case of path collisions, one of the dirs could have been replaced by
+	 * a symlink (checked out after we enqueued this entry for parallel
+	 * checkout). Thus, we must check the leading dirs again.
+	 */
+	if (dir_sep && !has_dirs_only_path(path.buf, dir_sep - path.buf,
+					   state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but the above has_dirs_only_path()
+			 * call should have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file '%s'", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file '%s'", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file '%s'",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	/*
+	 * No need to check close() return at this point. Either fd is already
+	 * closed, or we are on an error path.
+	 */
+	close_and_clear(&fd);
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; i++)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..4ad2a519b3
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,32 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+
+/*
+ * Put parallel checkout into the PC_ACCEPTING_ENTRIES state. Should be used
+ * only when in the PC_UNINITIALIZED state.
+ */
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not accepting entries or if the
+ * entry is not eligible for parallel checkout. Otherwise, enqueue the entry
+ * for later write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index 8a1afbc1e4..f0430d458d 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -441,7 +442,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -464,6 +464,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -477,6 +480,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.30.1


^ permalink raw reply related	[relevance 2%]

* [PATCH v2 1/2] SECURITY: describe how to report vulnerabilities
  2021-03-29 13:43  4% ` [PATCH v2 0/2] Describe Git's security policy Johannes Schindelin via GitGitGadget
@ 2021-03-29 13:43  5%   ` Johannes Schindelin via GitGitGadget
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin via GitGitGadget @ 2021-03-29 13:43 UTC (permalink / raw)
  To: git; +Cc: Denton Liu, Bagas Sanjaya, Johannes Schindelin,
	Johannes Schindelin

From: Johannes Schindelin <johannes.schindelin@gmx.de>

In the same document, describe that Git does not have Long Term Support
(LTS) release trains, although security fixes are always applied to a
few of the most recent release trains.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 SECURITY.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 SECURITY.md

diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000000..c720c2ae7f95
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,51 @@
+# Security Policy
+
+## Reporting a vulnerability
+
+Please send a detailed mail to git-security@googlegroups.com to
+report vulnerabilities in Git.
+
+Even when unsure whether the bug in question is an exploitable
+vulnerability, it is recommended to send the report to
+git-security@googlegroups.com (and obviously not to discuss the
+issue anywhere else).
+
+Vulnerabilities are expected to be discussed _only_ on that
+list, and not in public, until the official announcement on the
+Git mailing list on the release date.
+
+Examples for details to include:
+
+- Ideally a short description (or a script) to demonstrate an
+  exploit.
+- The affected platforms and scenarios (the vulnerability might
+  only affect setups with case-sensitive file systems, for
+  example).
+- The name and affiliation of the security researchers who are
+  involved in the discovery, if any.
+- Whether the vulnerability has already been disclosed.
+- How long an embargo would be required to be safe.
+
+## Supported Versions
+
+There are no official "Long Term Support" versions in Git.
+Instead, the maintenance track (i.e. the versions based on the
+most recently published feature release, also known as ".0"
+version) sees occasional updates with bug fixes.
+
+Fixes to vulnerabilities are made for the maintenance track for
+the latest feature release and merged up to the in-development
+branches. The Git project makes no formal guarantee for any
+older maintenance tracks to receive updates. In practice,
+though, critical vulnerability fixes are applied not only to the
+most recent track, but to at least a couple more maintenance
+tracks.
+
+This is typically done by making the fix on the oldest and still
+relevant maintenance track, and merging it upwards to newer and
+newer maintenance tracks.
+
+For example, v2.24.1 was released to address a couple of
+[CVEs](https://cve.mitre.org/), and at the same time v2.14.6,
+v2.15.4, v2.16.6, v2.17.3, v2.18.2, v2.19.3, v2.20.2, v2.21.1,
+v2.22.2 and v2.23.1 were released.
-- 
gitgitgadget


^ permalink raw reply related	[relevance 5%]

* [PATCH v2 0/2] Describe Git's security policy
    @ 2021-03-29 13:43  4% ` Johannes Schindelin via GitGitGadget
  2021-03-29 13:43  5%   ` [PATCH v2 1/2] SECURITY: describe how to report vulnerabilities Johannes Schindelin via GitGitGadget
  1 sibling, 1 reply; 200+ results
From: Johannes Schindelin via GitGitGadget @ 2021-03-29 13:43 UTC (permalink / raw)
  To: git; +Cc: Denton Liu, Bagas Sanjaya, Johannes Schindelin

On GitHub, SECURITY.md files are the recommended way to describe how to
report vulnerabilities, and to set expectations how far back maintenance
tracks are updated with security bug fixes.

For example, when navigating to https://github.com/git/git/security/ users
would be guided to that SECURITY.md file. If it exists.

The purpose of this patch series is to add this file, describing Git's
security policy.

While at it, I also want to document the process how to coordinate the
ensuing embargoed releases. This is what the second patch is all about.

The reason for that is quite selfish, as I did two of them, and while I am
happy that such embargoed releases do not happen all that often, the
downside is that I keep forgetting all the details. So this document is not
only meant for knowledge sharing, but in particular to help me the next
time(s) I coordinate an embargoed release.

Many thanks to Junio who reviewed the first draft of this patch series
(where I had not yet separated out
Documentation/howto/coordinate-embargoed-releases.txt).

Changes since v1:

 * Fixed typo

Johannes Schindelin (2):
  SECURITY: describe how to report vulnerabilities
  Document how we do embargoed releases

 Documentation/Makefile                        |   1 +
 .../howto/coordinate-embargoed-releases.txt   | 131 ++++++++++++++++++
 SECURITY.md                                   |  51 +++++++
 3 files changed, 183 insertions(+)
 create mode 100644 Documentation/howto/coordinate-embargoed-releases.txt
 create mode 100644 SECURITY.md


base-commit: e6362826a0409539642a5738db61827e5978e2e4
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-917%2Fdscho%2Fsecurity-policy-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-917/dscho/security-policy-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/917

Range-diff vs v1:

 1:  2c9f5725d96f ! 1:  3f5d866de195 SECURITY: describe how to report vulnerabilities
     @@ SECURITY.md (new)
      +- Ideally a short description (or a script) to demonstrate an
      +  exploit.
      +- The affected platforms and scenarios (the vulnerability might
     -+  only affect setups with case-sensitiv file systems, for
     ++  only affect setups with case-sensitive file systems, for
      +  example).
      +- The name and affiliation of the security researchers who are
      +  involved in the discovery, if any.
 2:  41efaaf62864 = 2:  565d7982d870 Document how we do embargoed releases

-- 
gitgitgadget

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 1/2] SECURITY: describe how to report vulnerabilities
  2021-03-27  6:34  5%   ` Bagas Sanjaya
@ 2021-03-29 13:41  0%     ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2021-03-29 13:41 UTC (permalink / raw)
  To: Bagas Sanjaya; +Cc: Johannes Schindelin via GitGitGadget, git

Hi Bagas,

On Sat, 27 Mar 2021, Bagas Sanjaya wrote:

> On 27/03/21 05.12, Johannes Schindelin via GitGitGadget wrote:
> > From: Johannes Schindelin <johannes.schindelin@gmx.de>
> >
> > In the same document, describe that Git does not have Long Term Support
> > (LTS) release trains, although security fixes are always applied to a
> > few of the most recent release trains.
> >
> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> > ---
> >   SECURITY.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 51 insertions(+)
> >   create mode 100644 SECURITY.md
> >
> > diff --git a/SECURITY.md b/SECURITY.md
> > new file mode 100644
> > index 000000000000..282790164e78
> > --- /dev/null
> > +++ b/SECURITY.md
> > @@ -0,0 +1,51 @@
> > +# Security Policy
> > +
> > +## Reporting a vulnerability
> > +
> > +Please send a detailed mail to git-security@googlegroups.com to
> > +report vulnerabilities in Git.
> > +
> > +Even when unsure whether the bug in question is an exploitable
> > +vulnerability, it is recommended to send the report to
> > +git-security@googlegroups.com (and obviously not to discuss the
> > +issue anywhere else).
>
> What about using reference word (`... it is recommended to send the
> report to that mailing list`)?

I would really like to repeat the email address here, to make really
certain that the reader uses the correct one.

> > +Vulnerabilities are expected to be discussed _only_ on that
> > +list, and not in public, until the official announcement on the
> > +Git mailing list on the release date.
> > +
> > +Examples for details to include:
> > +
> > +- Ideally a short description (or a script) to demonstrate an
> > +  exploit.
> > +- The affected platforms and scenarios (the vulnerability might
> > +  only affect setups with case-sensitiv file systems, for
> > +  example).
>
> Oops, s/case-sensitiv/case-sensitive/

Yes, thanks, it will be fixed in v2.

> > +- The name and affiliation of the security researchers who are
> > +  involved in the discovery, if any.
> > +- Whether the vulnerability has already been disclosed.
> > +- How long an embargo would be required to be safe.
> > +
> > +## Supported Versions
>
> The header should be `Supported Versions and How Maintenance
> Releases are Made`.

Not really. The maintenance is described in
Documentation/howto/maintain-git.txt. It is not the purpose of
`SECURITY.md` to document that, it just so happens that we hint a bit at
it while talking about which branches get security updates.

> > +
> > +There are no official "Long Term Support" versions in Git.
> > +Instead, the maintenance track (i.e. the versions based on the
> > +most recently published feature release, also known as ".0"
> > +version) sees occasional updates with bug fixes.
> > +
> > +Fixes to vulnerabilities are made for the maintenance track for
> > +the latest feature release and merged up to the in-development
> > +branches. The Git project makes no formal guarantee for any
> > +older maintenance tracks to receive updates. In practice,
> > +though, critical vulnerability fixes are applied not only to the
> > +most recent track, but to at least a couple more maintenance
> > +tracks.
> > +
> > +This is typically done by making the fix on the oldest and still
> > +relevant maintenance track, and merging it upwards to newer and
> > +newer maintenance tracks.
>
> AFAIK, maint branch are based on latest feature release (say v2.24),
> and any bugfixes there are cherry-picked to relevant older releases,
> but does it mean resetting maint branch to that older release, and
> then resetting back to before that? Or how tagged maintenance release
> are made without resetting maint?

There are `maint-<maintenance-track>` branches, e.g. `maint-2.30`,
`maint-2.29`, etc.

But it really is not even interesting in the context of security updates
how those maintenance branches are called, it is only interesting which
versions will receive updates (and the updates come in the form of a
newly-tagged version, not in the form of an updated `maint-<track>`
branch; The latter just _happens_ to also happen, for maintenance
reasons).

> > +For example, v2.24.1 was released to address a couple of
> > +[CVEs](https://cve.mitre.org/), and at the same time v2.14.6,
> > +v2.15.4, v2.16.6, v2.17.3, v2.18.2, v2.19.3, v2.20.2, v2.21.1,
> > +v2.22.2 and v2.23.1 were released.

Thank you for your review!
Johannes

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/2] SECURITY: describe how to report vulnerabilities
  @ 2021-03-27  6:34  5%   ` Bagas Sanjaya
  2021-03-29 13:41  0%     ` Johannes Schindelin
  0 siblings, 1 reply; 200+ results
From: Bagas Sanjaya @ 2021-03-27  6:34 UTC (permalink / raw)
  To: Johannes Schindelin via GitGitGadget; +Cc: Johannes Schindelin, git

On 27/03/21 05.12, Johannes Schindelin via GitGitGadget wrote:
> From: Johannes Schindelin <johannes.schindelin@gmx.de>
> 
> In the same document, describe that Git does not have Long Term Support
> (LTS) release trains, although security fixes are always applied to a
> few of the most recent release trains.
> 
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>   SECURITY.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 51 insertions(+)
>   create mode 100644 SECURITY.md
> 
> diff --git a/SECURITY.md b/SECURITY.md
> new file mode 100644
> index 000000000000..282790164e78
> --- /dev/null
> +++ b/SECURITY.md
> @@ -0,0 +1,51 @@
> +# Security Policy
> +
> +## Reporting a vulnerability
> +
> +Please send a detailed mail to git-security@googlegroups.com to
> +report vulnerabilities in Git.
> +
> +Even when unsure whether the bug in question is an exploitable
> +vulnerability, it is recommended to send the report to
> +git-security@googlegroups.com (and obviously not to discuss the
> +issue anywhere else).
What about using reference word (`... it is recommended to send the
report to that mailing list`)?
> +Vulnerabilities are expected to be discussed _only_ on that
> +list, and not in public, until the official announcement on the
> +Git mailing list on the release date.
> +
> +Examples for details to include:
> +
> +- Ideally a short description (or a script) to demonstrate an
> +  exploit.
> +- The affected platforms and scenarios (the vulnerability might
> +  only affect setups with case-sensitiv file systems, for
> +  example).
Oops, s/case-sensitiv/case-sensitive/
> +- The name and affiliation of the security researchers who are
> +  involved in the discovery, if any.
> +- Whether the vulnerability has already been disclosed.
> +- How long an embargo would be required to be safe.
> +
> +## Supported Versions
The header should be `Supported Versions and How Maintenance
Releases are Made`.
> +
> +There are no official "Long Term Support" versions in Git.
> +Instead, the maintenance track (i.e. the versions based on the
> +most recently published feature release, also known as ".0"
> +version) sees occasional updates with bug fixes.
> +
> +Fixes to vulnerabilities are made for the maintenance track for
> +the latest feature release and merged up to the in-development
> +branches. The Git project makes no formal guarantee for any
> +older maintenance tracks to receive updates. In practice,
> +though, critical vulnerability fixes are applied not only to the
> +most recent track, but to at least a couple more maintenance
> +tracks.
> +
> +This is typically done by making the fix on the oldest and still
> +relevant maintenance track, and merging it upwards to newer and
> +newer maintenance tracks.
AFAIK, maint branch are based on latest feature release (say v2.24),
and any bugfixes there are cherry-picked to relevant older releases,
but does it mean resetting maint branch to that older release, and
then resetting back to before that? Or how tagged maintenance release
are made without resetting maint?
> +For example, v2.24.1 was released to address a couple of
> +[CVEs](https://cve.mitre.org/), and at the same time v2.14.6,
> +v2.15.4, v2.16.6, v2.17.3, v2.18.2, v2.19.3, v2.20.2, v2.21.1,
> +v2.22.2 and v2.23.1 were released.
> 

-- 
An old man doll... just what I always wanted! - Clara

^ permalink raw reply	[relevance 5%]

* [PATCH 1/5] unpack-trees: add basic support for parallel checkout
  @ 2021-03-17 21:12  2% ` Matheus Tavares
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares @ 2021-03-17 21:12 UTC (permalink / raw)
  To: git; +Cc: christian.couder, gitster, git

This new interface allows us to enqueue some of the entries being
checked out to later uncompress, smudge, and write them in parallel. For
now, the parallel checkout machinery is enabled by default and there is
no user configuration, but run_parallel_checkout() just writes the
queued entries in sequence (without spawning additional workers). The
next patch will actually implement the parallelism and, later, we will
make it configurable.

Note that, to avoid potential data races, not all entries are eligible
for parallel checkout. Also, paths that collide on disk (e.g.
case-sensitive paths in case-insensitive file systems), are detected by
the parallel checkout code and skipped, so that they can be safely
sequentially handled later. The collision detection works like the
following:

- If the collision was at basename (e.g. 'a/b' and 'a/B'), the framework
  detects it by looking for EEXIST and EISDIR errors after an
  open(O_CREAT | O_EXCL) failure.

- If the collision was at dirname (e.g. 'a/b' and 'A'), it is detected
  at the has_dirs_only_path() check, which is done for the leading path
  of each item in the parallel checkout queue.

Both verifications rely on the fact that, before enqueueing an entry for
parallel checkout, checkout_entry() makes sure that there is no file at
the entry's path and that its leading components are all real
directories. So, any later change in these conditions indicates that
there was a collision (either between two parallel-eligible entries or
between an eligible and an ineligible one).

After all parallel-eligible entries have been processed, the collided
(and thus, skipped) entries are sequentially fed to checkout_entry()
again. This is similar to the way the current code deals with
collisions, overwriting the previously checked out entries with the
subsequent ones. The only difference is that, since we no longer create
the files in the same order that they appear on index, we are not able
to determine which of the colliding entries will survive on disk (for
the classic code, it is always the last entry).

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 Makefile            |   1 +
 entry.c             |  17 +-
 parallel-checkout.c | 368 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  32 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 421 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index dfb0f1000f..f7b9ab49f9 100644
--- a/Makefile
+++ b/Makefile
@@ -938,6 +938,7 @@ 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
diff --git a/entry.c b/entry.c
index 2ce16414a7..6a22c45050 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout doesn't create the files in index
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..80a60eb2d3
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,368 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items;
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout;
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	/*
+	 * Symlinks cannot be checked out in parallel as, in case of path
+	 * collision, they could racily replace leading directories of other
+	 * entries being checked out. Submodules are checked out in child
+	 * processes, which have their own parallel checkout queues.
+	 */
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have it's stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error(_("parallel checkout finished with pending entries"));
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of %s", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file %s", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *new_blob;
+	unsigned long size;
+	size_t newsize = 0;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	new_blob = read_blob_entry(pc_item->ce, &size);
+	if (!new_blob)
+		return error("unable to read sha1 file of %s (%s)", path,
+			     oid_to_hex(&pc_item->ce->oid));
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 new_blob, size, &buf, NULL);
+
+	if (ret) {
+		free(new_blob);
+		new_blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, new_blob, size);
+	free(new_blob);
+	if (wrote < 0)
+		return error("unable to write file %s", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+	const char *dir_sep;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	dir_sep = find_last_dir_sep(path.buf);
+
+	/*
+	 * The leading dirs should have been already created by now. But, in
+	 * case of path collisions, one of the dirs could have been replaced by
+	 * a symlink (checked out after we enqueued this entry for parallel
+	 * checkout). Thus, we must check the leading dirs again.
+	 */
+	if (dir_sep && !has_dirs_only_path(path.buf, dir_sep - path.buf,
+					   state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but the above has_dirs_only_path()
+			 * call should have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file %s", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file %s", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file %s",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	/*
+	 * No need to check close() return at this point. Either fd is already
+	 * closed, or we are on an error path.
+	 */
+	close_and_clear(&fd);
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; i++)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..4ad2a519b3
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,32 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+
+/*
+ * Put parallel checkout into the PC_ACCEPTING_ENTRIES state. Should be used
+ * only when in the PC_UNINITIALIZED state.
+ */
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not accepting entries or if the
+ * entry is not eligible for parallel checkout. Otherwise, enqueue the entry
+ * for later write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index 5b3dd38f8c..b9548de96a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -441,7 +442,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -464,6 +464,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -477,6 +480,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.30.1


^ permalink raw reply related	[relevance 2%]

* Re: [PATCH] config.txt: add missing period
  2021-03-16 14:40 10% [PATCH] config.txt: add missing period Kyle Meyer
@ 2021-03-16 15:17  0% ` Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2021-03-16 15:17 UTC (permalink / raw)
  To: Kyle Meyer; +Cc: git

On Tue, Mar 16, 2021 at 10:40:40AM -0400, Kyle Meyer wrote:

> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index 6ba50b1104..06615d840b 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -46,7 +46,7 @@ Subsection names are case sensitive and can contain any characters except
>  newline and the null byte. Doublequote `"` and backslash can be included
>  by escaping them as `\"` and `\\`, respectively. Backslashes preceding
>  other characters are dropped when reading; for example, `\t` is read as
> -`t` and `\0` is read as `0` Section headers cannot span multiple lines.
> +`t` and `\0` is read as `0`. Section headers cannot span multiple lines.

Yep, looks obviously correct. I wondered if this got introduced during
some formatting cleanup, but it has been present since the text was
added in 1feb061701 (config.txt: document behavior of backslashes in
subsections, 2017-12-21).

Thanks for spotting.

-Peff

^ permalink raw reply	[relevance 0%]

* [PATCH] config.txt: add missing period
@ 2021-03-16 14:40 10% Kyle Meyer
  2021-03-16 15:17  0% ` Jeff King
  0 siblings, 1 reply; 200+ results
From: Kyle Meyer @ 2021-03-16 14:40 UTC (permalink / raw)
  To: git

Signed-off-by: Kyle Meyer <kyle@kyleam.com>
---
 Documentation/config.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 6ba50b1104..06615d840b 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -46,7 +46,7 @@ Subsection names are case sensitive and can contain any characters except
 newline and the null byte. Doublequote `"` and backslash can be included
 by escaping them as `\"` and `\\`, respectively. Backslashes preceding
 other characters are dropped when reading; for example, `\t` is read as
-`t` and `\0` is read as `0` Section headers cannot span multiple lines.
+`t` and `\0` is read as `0`. Section headers cannot span multiple lines.
 Variables may belong directly to a section or to a given subsection. You
 can have `[section]` if you have `[section "subsection"]`, but you don't
 need to.
-- 
2.31.0.rc2.327.gc8bc67eb22


^ permalink raw reply related	[relevance 10%]

* Re: [PATCH v3 1/1] git mv foo FOO ; git mv foo bar gave an assert
  2021-03-01 21:41  4% ` [PATCH v3 " tboegi
@ 2021-03-01 23:59  0%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2021-03-01 23:59 UTC (permalink / raw)
  To: tboegi; +Cc: git, johannes.schindelin, Dan.Moseley

tboegi@web.de writes:

> From: Torsten Bögershausen <tboegi@web.de>
>
> The following sequence, on a case-insensitive file system,
> (strictly speeking with core.ignorecase=true)
> leads to an assertion failure and leaves .git/index.lock behind.
>
> git init
> echo foo >foo
> git add foo
> git mv foo FOO
> git mv foo bar
>
> This regression was introduced in Commit 9b906af657,
> "git-mv: improve error message for conflicted file"
>
> The bugfix is to change the "file exist case-insensitive in the index"
> into the correct "file exist (case-sensitive) in the index".
>
> This avoids the "assert" later in the code and keeps setting up the
> "ce" pointer for ce_stage(ce) done in the next else if.
>
> This fixes
> https://github.com/git-for-windows/git/issues/2920
>
> Reported-By: Dan Moseley <Dan.Moseley@microsoft.com>
> Signed-off-by: Torsten Bögershausen <tboegi@web.de>

Thanks, that looks better.

> ---
> Changes since V2:
>   avoid the trailer mess-up by putting "this fixes" before the trailers
>   Make clearer why cache_name_pos() (leaving a dangling ce) followed
>   by an additional cache_file_exists() to set up ce can be optimized
>   into a single cache_file_exists()
>
> builtin/mv.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 7dac714af9..3fccdcb645 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -221,7 +221,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>  				}
>  				argc += last - first;
>  			}
> -		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
> +		} else if (!(ce = cache_file_exists(src, length, 0))) {
>  			bad = _("not under version control");
>  		} else if (ce_stage(ce)) {
>  			bad = _("conflicted");
> --
> 2.30.0.155.g66e871b664

^ permalink raw reply	[relevance 0%]

* [PATCH v3 1/1] git mv foo FOO ; git mv foo bar gave an assert
    2021-03-01 17:05  5% ` [PATCH v2 1/1] git mv foo FOO ; git mv foo bar gave an assert tboegi
       [not found]     ` <20210301170425.12154-1-tboegi@web.de>
@ 2021-03-01 21:41  4% ` tboegi
  2021-03-01 23:59  0%   ` Junio C Hamano
  2 siblings, 1 reply; 200+ results
From: tboegi @ 2021-03-01 21:41 UTC (permalink / raw)
  To: git, johannes.schindelin, Dan.Moseley; +Cc: Torsten Bögershausen

From: Torsten Bögershausen <tboegi@web.de>

The following sequence, on a case-insensitive file system,
(strictly speeking with core.ignorecase=true)
leads to an assertion failure and leaves .git/index.lock behind.

git init
echo foo >foo
git add foo
git mv foo FOO
git mv foo bar

This regression was introduced in Commit 9b906af657,
"git-mv: improve error message for conflicted file"

The bugfix is to change the "file exist case-insensitive in the index"
into the correct "file exist (case-sensitive) in the index".

This avoids the "assert" later in the code and keeps setting up the
"ce" pointer for ce_stage(ce) done in the next else if.

This fixes
https://github.com/git-for-windows/git/issues/2920

Reported-By: Dan Moseley <Dan.Moseley@microsoft.com>
Signed-off-by: Torsten Bögershausen <tboegi@web.de>
---
Changes since V2:
  avoid the trailer mess-up by putting "this fixes" before the trailers
  Make clearer why cache_name_pos() (leaving a dangling ce) followed
  by an additional cache_file_exists() to set up ce can be optimized
  into a single cache_file_exists()

builtin/mv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 7dac714af9..3fccdcb645 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -221,7 +221,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				}
 				argc += last - first;
 			}
-		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
+		} else if (!(ce = cache_file_exists(src, length, 0))) {
 			bad = _("not under version control");
 		} else if (ce_stage(ce)) {
 			bad = _("conflicted");
--
2.30.0.155.g66e871b664


^ permalink raw reply related	[relevance 4%]

* RE: [EXTERNAL] [PATCH v2 1/1] git mv foo FOO ; git mv foo bar gave an assert
       [not found]     ` <20210301170425.12154-1-tboegi@web.de>
@ 2021-03-01 20:23  0%   ` Dan Moseley
  0 siblings, 0 replies; 200+ results
From: Dan Moseley @ 2021-03-01 20:23 UTC (permalink / raw)
  To: tboegi@web.de; +Cc: git@vger.kernel.org

> From: Torsten Bögershausen <tboegi@web.de>
> 
> The following sequence, on a case-insensitive file system,
> (strictly speeking with core.ignorecase=true)
> leads to an assertion, and leaves .git/index.lock behind.
> 
> git init
> echo foo >foo
> git add foo
> git mv foo FOO
> git mv foo bar
> 
> This regression was introduced in Commit 9b906af657,
> "git-mv: improve error message for conflicted file"
> 
> The bugfix is to change the "file exist case-insensitive in the index"
> into the correct "file exist (case-sensitive) in the index".
> This avoids the "assert".
> 
> Reported-By: Dan Moseley <Dan.Moseley@microsoft.com>
> 
> This fixes
> https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fgit-for-windows%2Fgit%2Fissues%2F2920&amp;data=04%7C01%7CDan.Moseley%40microsoft.com%7Cb659ba5925c543bcc3e708d8dcd41268%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637502150683596627%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=%2BLjQf5NooTUgOKbsyn10XCFIAgMw9v%2BKlhx8kDD6%2BIg%3D&amp;reserved=0
> 
> Signed-off-by: Torsten Bögershausen <tboegi@web.de>
> ---
>  builtin/mv.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 7dac714af9..3fccdcb645 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -221,7 +221,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>  				}
>  				argc += last - first;
>  			}
> -		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
> +		} else if (!(ce = cache_file_exists(src, length, 0))) {
>  			bad = _("not under version control");
>  		} else if (ce_stage(ce)) {
>  			bad = _("conflicted");
> --
> 2.30.0.155.g66e871b664
>

Thank you Thorsten. This makes sense to me. Do you want to add a test? 
I believe this is what I had in my original patch, that worked pretty well:

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 63d5f41a12..5c7fee9bd8 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -152,6 +152,14 @@ test_expect_success \
     'move into "."' \
     'git mv path1/path2/ .'

+test_expect_success \
+    'fail to move file already in index under different cased name' \
+    'echo 1 > foo &&
+     git add foo &&
+     git commit -m add_file -- foo &&
+     git mv foo FOO &&
+     test_expect_code 128 git mv foo BAR'
+
 test_expect_success "Michael Cassar's test case" '
        rm -fr .git papers partA &&
        git init &&
--
2.25.1

^ permalink raw reply related	[relevance 0%]

* Re: [PATCH v2 1/1] git mv foo FOO ; git mv foo bar gave an assert
  2021-03-01 17:05  5% ` [PATCH v2 1/1] git mv foo FOO ; git mv foo bar gave an assert tboegi
@ 2021-03-01 19:21  0%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2021-03-01 19:21 UTC (permalink / raw)
  To: tboegi; +Cc: git, johannes.schindelin, Dan.Moseley

tboegi@web.de writes:

> From: Torsten Bögershausen <tboegi@web.de>
>
> The following sequence, on a case-insensitive file system,
> (strictly speeking with core.ignorecase=true)
> leads to an assertion, and leaves .git/index.lock behind.

"an assertion failure", I presume?

>
> git init
> echo foo >foo
> git add foo
> git mv foo FOO
> git mv foo bar
>
> This regression was introduced in Commit 9b906af657,
> "git-mv: improve error message for conflicted file"
>
> The bugfix is to change the "file exist case-insensitive in the index"
> into the correct "file exist (case-sensitive) in the index".
> This avoids the "assert".
>
> Reported-By: Dan Moseley <Dan.Moseley@microsoft.com>
>
> This fixes
> https://github.com/git-for-windows/git/issues/2920
>
> Signed-off-by: Torsten Bögershausen <tboegi@web.de>

By breaking the list of trailers with an unrelated comment in the
middle, the "Reported-by" won't be recognized as a trailer.  We'd
want to credit non-authorship contribution in the release notes
starting in the upcoming release, and this will start mattering.
Please fix it.

> @@ -221,7 +221,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>  				}
>  				argc += last - first;
>  			}
> -		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
> +		} else if (!(ce = cache_file_exists(src, length, 0))) {

Good finding.

Before the problematic patch, this used to be

               } else if (cache_name_pos(src, length) < 0)

I wonder if we should revert the change to use cache_file_exists()
in the first place (and rewrite the subsequent use of ce to match),
though.

Thanks.

^ permalink raw reply	[relevance 0%]

* [PATCH v2 1/1] git mv foo FOO ; git mv foo bar gave an assert
  @ 2021-03-01 17:05  5% ` tboegi
  2021-03-01 19:21  0%   ` Junio C Hamano
       [not found]     ` <20210301170425.12154-1-tboegi@web.de>
  2021-03-01 21:41  4% ` [PATCH v3 " tboegi
  2 siblings, 1 reply; 200+ results
From: tboegi @ 2021-03-01 17:05 UTC (permalink / raw)
  To: git, johannes.schindelin, Dan.Moseley; +Cc: Torsten Bögershausen

From: Torsten Bögershausen <tboegi@web.de>

The following sequence, on a case-insensitive file system,
(strictly speeking with core.ignorecase=true)
leads to an assertion, and leaves .git/index.lock behind.

git init
echo foo >foo
git add foo
git mv foo FOO
git mv foo bar

This regression was introduced in Commit 9b906af657,
"git-mv: improve error message for conflicted file"

The bugfix is to change the "file exist case-insensitive in the index"
into the correct "file exist (case-sensitive) in the index".
This avoids the "assert".

Reported-By: Dan Moseley <Dan.Moseley@microsoft.com>

This fixes
https://github.com/git-for-windows/git/issues/2920

Signed-off-by: Torsten Bögershausen <tboegi@web.de>
---
 builtin/mv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 7dac714af9..3fccdcb645 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -221,7 +221,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				}
 				argc += last - first;
 			}
-		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
+		} else if (!(ce = cache_file_exists(src, length, 0))) {
 			bad = _("not under version control");
 		} else if (ce_stage(ce)) {
 			bad = _("conflicted");
--
2.30.0.155.g66e871b664


^ permalink raw reply related	[relevance 5%]

* Re: Commit graph chains with no corresponding files?
  2021-02-25 14:20  0%     ` Derrick Stolee
@ 2021-02-27  2:49  0%       ` Bryan Turner
  0 siblings, 0 replies; 200+ results
From: Bryan Turner @ 2021-02-27  2:49 UTC (permalink / raw)
  To: Derrick Stolee; +Cc: Jonathan Tan, Git Users

On Thu, Feb 25, 2021 at 6:20 AM Derrick Stolee <stolee@gmail.com> wrote:
>
> On 2/24/2021 11:54 PM, Bryan Turner wrote:
> > On Mon, Jun 29, 2020 at 6:51 PM Derrick Stolee <stolee@gmail.com> wrote:
> >>
> >> On 6/29/2020 6:07 PM, Jonathan Tan wrote:
> >>> At $DAYJOB, a few people have reported "warning: unable to find all
> >>> commit-graph files" warnings. Their commit-graph-chain files have a few
> >>> lines, but they only have one commit graph file with very few commits. I
> >>> suspected something happening during fetch, because (as far as I know) a
> >>> fetch may cause an incremental commit graph to be written, but I ran a
> >>> fetch on a large repository myself and didn't run into this problem.
> >>>
> >>> Has anyone ran into this problem before, and know how to reproduce?
> >
> > I don't have any specific reproduction steps, but we've just run into
> > our first case of this on Git 2.29. I ended up kicking off a full `git
> > commit-graph write` to fix it. That displayed the same warning, but
> > commands run after it no longer do. Prior to writing the new graph, I
> > had this:
> > $ ls
> > commit-graph-chain  graph-88f5fe6e0c659e3742e556982263813d528ead81.graph
>
> The contents of the 'commit-graph-chain' file are critical to diagnosing
> the problems here. Likely it had multiple lines.
>
> > Afterward, the `objects/info/commits-graphs` directory still exists
> > but is empty, and there is now an `objects/commit-graph` that didn't
> > exist before. `git commit-graph verify` seems happy with the state of
> > things.
>
> Yes, a full rewrite without "--split" will get you to this state.
>
> >> The incremental commit-graph code deletes any commit-graph files
> >> that do not appear in the chain. I believe this is done by comparing
> >> the contents of the ".git/objects/info/commit-graphs/" directory to
> >> the contents of the chain file.
> >>
> >> These appear to be case-sensitive, full-path comparisons.
> >>
> >> It is _possible_ that something like a case switch or a symlink
> >> could be causing a problem here. That's where I would look on
> >> the affected systems.
> >
> > Are commit graphs potentially problematic in repositories that are
> > borrowing objects from other repositories via alternates?
>
> This was definitely part of the design, with the intention of
> working with a common base in the alternate. However, if the
> alternate collapses layers, then the repo that is borrowing
> from that alternate may have a broken chain.

Thanks for the analysis, Derrick. This seems like a likely culprit for
how the repository got into this state, because it is a fork (of a
fork) and does use a series of alternates.

>
> It is likely a better setup to have the alternate keep a
> commit-graph file and leave the dependent repos clear of a
> commit-graph. _Or_ the dependent repos should use a full
> commit-graph instead of a chain.

Skipping writing the commit graph in forks seems like a reasonable
place for us to start, given the way it currently works, but always
writing full graphs may be another option. If the fork is able to
borrow the commit graph from its origin across the alternate, though,
then that implies there may not be a lot of value in writing commit
graphs in the forks (since they're likely to share the majority of
their refs with their origin).

>
> If you have a better idea for how to make this work, then there
> is room for improvement.
>
> For example, if we ensure during the commit-graph write that
> all layers of the chain are within our local repo, then these
> dependency issues go away without breaking any old Git versions
> that are reading the data.

Naively, this was the way I assumed it already worked--which is why I
was writing commit graphs in forks in the first place.

>
> > Have there
> > been important changes to commit graphs since 2.29?
>
> Not in the area of commit-graph chains.

Thanks again!
-b

>
> Thanks,
> -Stolee

^ permalink raw reply	[relevance 0%]

* Re: Commit graph chains with no corresponding files?
  2021-02-25  4:54  0%   ` Bryan Turner
@ 2021-02-25 14:20  0%     ` Derrick Stolee
  2021-02-27  2:49  0%       ` Bryan Turner
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee @ 2021-02-25 14:20 UTC (permalink / raw)
  To: Bryan Turner; +Cc: Jonathan Tan, Git Users

On 2/24/2021 11:54 PM, Bryan Turner wrote:
> On Mon, Jun 29, 2020 at 6:51 PM Derrick Stolee <stolee@gmail.com> wrote:
>>
>> On 6/29/2020 6:07 PM, Jonathan Tan wrote:
>>> At $DAYJOB, a few people have reported "warning: unable to find all
>>> commit-graph files" warnings. Their commit-graph-chain files have a few
>>> lines, but they only have one commit graph file with very few commits. I
>>> suspected something happening during fetch, because (as far as I know) a
>>> fetch may cause an incremental commit graph to be written, but I ran a
>>> fetch on a large repository myself and didn't run into this problem.
>>>
>>> Has anyone ran into this problem before, and know how to reproduce?
> 
> I don't have any specific reproduction steps, but we've just run into
> our first case of this on Git 2.29. I ended up kicking off a full `git
> commit-graph write` to fix it. That displayed the same warning, but
> commands run after it no longer do. Prior to writing the new graph, I
> had this:
> $ ls
> commit-graph-chain  graph-88f5fe6e0c659e3742e556982263813d528ead81.graph

The contents of the 'commit-graph-chain' file are critical to diagnosing
the problems here. Likely it had multiple lines.

> Afterward, the `objects/info/commits-graphs` directory still exists
> but is empty, and there is now an `objects/commit-graph` that didn't
> exist before. `git commit-graph verify` seems happy with the state of
> things.

Yes, a full rewrite without "--split" will get you to this state.

>> The incremental commit-graph code deletes any commit-graph files
>> that do not appear in the chain. I believe this is done by comparing
>> the contents of the ".git/objects/info/commit-graphs/" directory to
>> the contents of the chain file.
>>
>> These appear to be case-sensitive, full-path comparisons.
>>
>> It is _possible_ that something like a case switch or a symlink
>> could be causing a problem here. That's where I would look on
>> the affected systems.
> 
> Are commit graphs potentially problematic in repositories that are
> borrowing objects from other repositories via alternates?

This was definitely part of the design, with the intention of
working with a common base in the alternate. However, if the
alternate collapses layers, then the repo that is borrowing
from that alternate may have a broken chain.

It is likely a better setup to have the alternate keep a
commit-graph file and leave the dependent repos clear of a
commit-graph. _Or_ the dependent repos should use a full
commit-graph instead of a chain.

If you have a better idea for how to make this work, then there
is room for improvement.

For example, if we ensure during the commit-graph write that
all layers of the chain are within our local repo, then these
dependency issues go away without breaking any old Git versions
that are reading the data.

> Have there
> been important changes to commit graphs since 2.29?

Not in the area of commit-graph chains.

Thanks,
-Stolee

^ permalink raw reply	[relevance 0%]

* Re: Commit graph chains with no corresponding files?
  2020-06-30  1:51  6% ` Derrick Stolee
@ 2021-02-25  4:54  0%   ` Bryan Turner
  2021-02-25 14:20  0%     ` Derrick Stolee
  0 siblings, 1 reply; 200+ results
From: Bryan Turner @ 2021-02-25  4:54 UTC (permalink / raw)
  To: Derrick Stolee; +Cc: Jonathan Tan, Git Users

On Mon, Jun 29, 2020 at 6:51 PM Derrick Stolee <stolee@gmail.com> wrote:
>
> On 6/29/2020 6:07 PM, Jonathan Tan wrote:
> > At $DAYJOB, a few people have reported "warning: unable to find all
> > commit-graph files" warnings. Their commit-graph-chain files have a few
> > lines, but they only have one commit graph file with very few commits. I
> > suspected something happening during fetch, because (as far as I know) a
> > fetch may cause an incremental commit graph to be written, but I ran a
> > fetch on a large repository myself and didn't run into this problem.
> >
> > Has anyone ran into this problem before, and know how to reproduce?

I don't have any specific reproduction steps, but we've just run into
our first case of this on Git 2.29. I ended up kicking off a full `git
commit-graph write` to fix it. That displayed the same warning, but
commands run after it no longer do. Prior to writing the new graph, I
had this:
$ ls
commit-graph-chain  graph-88f5fe6e0c659e3742e556982263813d528ead81.graph

Afterward, the `objects/info/commits-graphs` directory still exists
but is empty, and there is now an `objects/commit-graph` that didn't
exist before. `git commit-graph verify` seems happy with the state of
things.

>
> The incremental commit-graph code deletes any commit-graph files
> that do not appear in the chain. I believe this is done by comparing
> the contents of the ".git/objects/info/commit-graphs/" directory to
> the contents of the chain file.
>
> These appear to be case-sensitive, full-path comparisons.
>
> It is _possible_ that something like a case switch or a symlink
> could be causing a problem here. That's where I would look on
> the affected systems.

Are commit graphs potentially problematic in repositories that are
borrowing objects from other repositories via alternates? Have there
been important changes to commit graphs since 2.29?

>
> Likely the full-path comparison in expire_commit_graphs() should
> be dropped in favor of local filename comparisons. A case-
> sensitive match is less likely to be important here since Git
> is writing the paths itself and should get the proper case back
> from the directory listing.
>
> Thanks,
> -Stolee
>

-b

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2 4/5] mailmap: use case-sensitive comparisons for local-parts and names
  2021-01-06  0:46  8%     ` Junio C Hamano
@ 2021-01-12 14:08  8%       ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-01-12 14:08 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: brian m. carlson, git, Jeff King, Phillip Wood,
	Johannes Schindelin


On Wed, Jan 06 2021, Junio C Hamano wrote:

> Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
>
>> On Sun, Jan 03 2021, brian m. carlson wrote:
>>
>> We just have to worry about cases where you're not all of these people
>> in one project's commit metadata and/or .mailmap, and thus mailmap rules
>> would match too generously:
>>
>>     "brian m. carlson" <sandals@crustytoothpaste.net>
>>     "brian m. carlson" <SANDALS@crustytoothpaste.net>
>>     "BRIAN M. CARLSON" <sandals@crustytoothpaste.net>
>>     "BRIAN M. CARLSON" <SANDALS@crustytoothpaste.net>
>>
>> Is that really plausible? In any case, neither of these two patches make
>> reference to us already having changed this in the past in 1.6.2 and &
>> there being reports on the ML about the bug & us changing it back. See
>> https://lore.kernel.org/git/f182fb1700e8dea15459fd02ced2a6e5797bec99.1238458535u.git.johannes.schindelin@gmx.de/
>>
>> Maybe we should still do this, but I think for a v3 it makes sense to
>> summarize that discussion etc.
>
> After reading the old discussion again, I am not sure if this is
> worth doing.  To many people, it is a promise we've made and kept
> that we treat addresses including the local part case-insensitively
> when summarising commits by ident strings.
>
> I'd really wish that this series were structured to have 5/5 early
> and 3&4/5 squashed into a single final patch.

Something that I only realized after I sent
<87czykvg19.fsf@evledraar.gmail.com>: Any problems .mailmap has with
Turkish "dotless I" we have already with "git log --author=<name> -i".

Not to say that there isn't some problem to solve here, just that if we
do it's a more general issue than mailmap.

As can be inferred from my upthread reply I thought that was ASCII-only,
but it turns out we do set LC_CTYPE based on the user's locale, and it
also applies for English-speakers. E.g. in LANG=en_US.UTF-8
"--author=ævar -i" will work.

Of course that doesn't address the point of whether we should be
DWYM-ing E-Mail addresses, just the sub-claim that one reason we
shouldn't is because of impossible-to-solve Unicode edge cases.

^ permalink raw reply	[relevance 8%]

* Re: git-bugreport-2021-01-06-1209.txt (git can't deal with special characters)
  2021-01-08 19:56  5% git-bugreport-2021-01-06-1209.txt (git can't deal with special characters) Daniel Troger
@ 2021-01-09 17:23  0% ` Torsten Bögershausen
  0 siblings, 0 replies; 200+ results
From: Torsten Bögershausen @ 2021-01-09 17:23 UTC (permalink / raw)
  To: Daniel Troger; +Cc: Philippe Blain, Randall S. Becker, git, Johannes Schindelin

On Fri, Jan 08, 2021 at 08:56:08PM +0100, Daniel Troger wrote:
> > That did the trick, the test case is now reproducible here.
>
> > It seems as if there could be a patch in a couple of days, but no promises.
>
> That's great news, thank you all very much!

Hej Daniel,
Not sure if I can keep my promise, please see below.

> I was already afraid at first it was some weird macOS filesystem bug only happening on high sierra
> and earlier which was never going to be fixed.

I haven't heard about anything special about Mac OS High Sierra.
If there are strange things, please let us know.

(And I still womder, how did you mange to create the "decomposed version of å" ?
 Mac OS itself doesn't decompose the "å", in opposite to "ä" or "ö".
 It creates a name for a file in decomposed form for "ä", "ö" and a lot of other
 characters/code points, but not for "å".
 It does, however, treat the pre- and de-composed form of "å" equivilent)

>
> In the meantime I have managed to add "both directories" to git (with git add paulbr*).
> It's funny, now one directory shows up twice when viewing my repo on gitlab.
>
> And this is the message I get when cloning:
> warning: the following paths have collided (e.g. case-sensitive paths
> on a case-insensitive filesystem) and only one from the same
> colliding group is in the working tree:
>   '[...]/paulbrunngård-springyard/main.ts'
>   '[...]/paulbrunngård-springyard/main.ts'
>
> What will happen with the two folders in the git repo after the patch?
>

Now, that is another question.

First of all, I would recommend to "remove" one of the folders from Git,
because all files are tracked twice in Git, but "shadowed" by the file system.



To clean up the repo, you can do like this, explained in a dummy repo:

#One file (that is all we have) is tracked twice:
user@mac:/tmp/AAA> git ls-files
"paulbrunnga\314\212rd-springyard/horse"
"paulbrunng\303\245rd-springyard/horse"

# Remove all files from Git, but keep them on disk:
user@mac:/tmp/AAA> git rm -rf --cached .
rm 'paulbrunngård-springyard/horse'
rm 'paulbrunngård-springyard/horse'

# Re-add one version, the precomposed:
user@mac:/tmp/AAA> git add .
user@mac:/tmp/AAA> git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
          deleted:    "paulbrunnga\314\212rd-springyard/horse"

user@mac:/tmp/AAA> git ls-files
"paulbrunng\303\245rd-springyard/horse"

#Not shown:
git commit -m "Remove duplicate directory"

####################

Now back to a potential patch:
That will take some time.
I digged some hours into the stuff, add lots of debug traces,
patches and stuff, and now we need a cleanup and get it into a better
shape to be acceptable.

All the best

^ permalink raw reply	[relevance 0%]

* Re: git-bugreport-2021-01-06-1209.txt (git can't deal with special characters)
@ 2021-01-08 19:56  5% Daniel Troger
  2021-01-09 17:23  0% ` Torsten Bögershausen
  0 siblings, 1 reply; 200+ results
From: Daniel Troger @ 2021-01-08 19:56 UTC (permalink / raw)
  To: Torsten Bögershausen
  Cc: Philippe Blain, Randall S. Becker, git, Johannes Schindelin

> That did the trick, the test case is now reproducible here.

> It seems as if there could be a patch in a couple of days, but no promises.

That's great news, thank you all very much!

I was already afraid at first it was some weird macOS filesystem bug only happening on high sierra and earlier which was never going to be fixed.

In the meantime I have managed to add "both directories" to git (with git add paulbr*). It's funny, now one directory shows up twice when viewing my repo on gitlab.

And this is the message I get when cloning:
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:
  '[...]/paulbrunngård-springyard/main.ts'
  '[...]/paulbrunngård-springyard/main.ts'

What will happen with the two folders in the git repo after the patch?


^ permalink raw reply	[relevance 5%]

* Re: [PATCH v2 4/5] mailmap: use case-sensitive comparisons for local-parts and names
  2021-01-04 16:10 11%   ` Ævar Arnfjörð Bjarmason
@ 2021-01-06  0:46  8%     ` Junio C Hamano
  2021-01-12 14:08  8%       ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2021-01-06  0:46 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: brian m. carlson, git, Jeff King, Phillip Wood,
	Johannes Schindelin

Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:

> On Sun, Jan 03 2021, brian m. carlson wrote:
>
> We just have to worry about cases where you're not all of these people
> in one project's commit metadata and/or .mailmap, and thus mailmap rules
> would match too generously:
>
>     "brian m. carlson" <sandals@crustytoothpaste.net>
>     "brian m. carlson" <SANDALS@crustytoothpaste.net>
>     "BRIAN M. CARLSON" <sandals@crustytoothpaste.net>
>     "BRIAN M. CARLSON" <SANDALS@crustytoothpaste.net>
>
> Is that really plausible? In any case, neither of these two patches make
> reference to us already having changed this in the past in 1.6.2 and &
> there being reports on the ML about the bug & us changing it back. See
> https://lore.kernel.org/git/f182fb1700e8dea15459fd02ced2a6e5797bec99.1238458535u.git.johannes.schindelin@gmx.de/
>
> Maybe we should still do this, but I think for a v3 it makes sense to
> summarize that discussion etc.

After reading the old discussion again, I am not sure if this is
worth doing.  To many people, it is a promise we've made and kept
that we treat addresses including the local part case-insensitively
when summarising commits by ident strings.

I'd really wish that this series were structured to have 5/5 early
and 3&4/5 squashed into a single final patch.

^ permalink raw reply	[relevance 8%]

* Re: [PATCH v2 4/5] mailmap: use case-sensitive comparisons for local-parts and names
  2021-01-03 21:18 35% ` [PATCH v2 4/5] mailmap: use case-sensitive comparisons for " brian m. carlson
@ 2021-01-04 16:10 11%   ` Ævar Arnfjörð Bjarmason
  2021-01-06  0:46  8%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2021-01-04 16:10 UTC (permalink / raw)
  To: brian m. carlson; +Cc: git, Jeff King, Phillip Wood, Johannes Schindelin


On Sun, Jan 03 2021, brian m. carlson wrote:

[For the purposes of this reply I'm also replying to your commit message
in 3/5, which I think makes things less confusing than two E-Mails]

> Currently, Git always looks up entries in the mailmap in a
> case-insensitive way, both for names and addresses, which is, as
> explained below, suboptimal.
>
> First, for email addresses, RFC 5321 is clear that only domains are case
> insensitive; local-parts (the portion before the at sign) are not.  It
> states this:
> 
>   The local-part of a mailbox MUST BE treated as case sensitive.
>   Therefore, SMTP implementations MUST take care to preserve the case of
>   mailbox local-parts.

It seems better to quote the part of this where it goes on to say:

    However, exploiting the case sensitivity of mailbox local-parts
    impedes interoperability and is discouraged.  Mailbox domains follow
    normal DNS rules and are hence not case sensitive.

And also that RFC 5321 says earlier

    "a host that expects to receive mail SHOULD avoid defining mailboxes
    where the Local-part requires (or uses) the Quoted-string form or
    where the Local-part is case- sensitive.  For any purposes that
    require generating or comparing Local-parts (e.g., to specific
    mailbox names), all quoted forms MUST be treated as equivalent,".

So if we're taking RFC 5321 MUST requirements as something we've got to
do we're still not following it. But as I'll go on to note I think
rationale by RFC 5321 is perhaps not the best thing to do here...

> There exist systems today where local-parts remain case sensitive (and
> this author has one), and as such, it's incorrect for us to case fold
> them in any way.  Let's add a failing test that indicates this is a
> problem, while still keeping the test for case-insensitive domains.

I don't really care much about this feature of mailmap, but I'm
struggling a bit to understand this part.

We're not an SMTP server or SMTP server library, so we don't have to
worry about mail mis-routing or whatever.

We just have to worry about cases where you're not all of these people
in one project's commit metadata and/or .mailmap, and thus mailmap rules
would match too generously:

    "brian m. carlson" <sandals@crustytoothpaste.net>
    "brian m. carlson" <SANDALS@crustytoothpaste.net>
    "BRIAN M. CARLSON" <sandals@crustytoothpaste.net>
    "BRIAN M. CARLSON" <SANDALS@crustytoothpaste.net>

Is that really plausible? In any case, neither of these two patches make
reference to us already having changed this in the past in 1.6.2 and &
there being reports on the ML about the bug & us changing it back. See
https://lore.kernel.org/git/f182fb1700e8dea15459fd02ced2a6e5797bec99.1238458535u.git.johannes.schindelin@gmx.de/

Maybe we should still do this, but I think for a v3 it makes sense to
summarize that discussion etc.

> Note that it's also incorrect for us to case-fold names because we don't
> guarantee that we're using the locale of the author, and it's impossible
> to case-fold names in a locale-insensitive way.  Turkish and Azeri
> contain both a dotted and dotless I, and the uppercase ASCII I folds not
> to the lowercase ASCII I, but to a dotless version, and vice versa with
> the lowercase I.  There are many words in Turkish which differ only in
> the dottedness of the I, so it is likely that there are also personal
> names which differ in the same way.
> 
> That would be a problem even if our implementation were perfect, which
> it is not.  We currently fold only ASCII characters, so this feature has
> never worked correctly for the vast majority of the users on the planet,
> regardless of the locale.  For example, on Linux, even in a Spanish
> locale, we don't handle "Simón" properly.  Even if we did handle that,
> we'd probably also want to implement Unicode normalization, which we
> don't.

As one of those people, aren't you confusing two things here. I daresay
that almost everyone with a non-ASCII name doesn't have a non-ASCII
E-Mail address, sure some do, but treating those as one and the same
doesn't seem to make sense.

Yes you can have non-ASCII on the LHS of @ in an E-Mail address, it just
seems to me that's very rare.

Do we have known cases where we're making use of this case-insensitive
matching of the *name* part? Showing some of those non-ASCII cases in
the tests in 3/5 would be nice.

> IN general, case-folding text is extremely language- and locale-specific
> and requires intimacy with the spelling and grammar of the language in
> question and careful attention to the Unicode details in order to
> produce a result that is meaningful to humans and conforms with
> linguistic and societal norms.
> 
> Because we do not have any of the required context with a plain personal
> name, we cannot hope to possibly case-fold personal names correctly.  We
> should stop trying to do so and just treat them as a series of bytes, so
> let's add a test that we don't case-fold personal names as well.

[... end <snip> of commit 3/5 ...]

> RFC 5321 is clear that the local-part of an email address (the part
> before the at sign) is case sensitive, and this has been the case since
> the original RFC 821.  It directs us that "the local-part MUST be
> interpreted and assigned semantics only by the host specified in the
> domain part of the address."
>
> Since we are not that party, it's not correct for us to compare them
> case insensitively.  However, we do still want to compare the domain
> parts case insensitively, so let's add a helper that downcases the
> domain and then compare byte by byte.
>
> Similarly, it's not possible for us to correctly case-fold text in a
> locale-insensitive way, so our handling of personal names has also been
> subject to bugs.  Additionally, we've never handled non-ASCII characters
> correctly, which means that our previous comparisons really only worked
> well for a fraction of the people on the planet.  Since our code wasn't
> right and it's basically impossible to compare personal names without
> regard to case, let's also switch our matching of names to be byte by
> byte.

I'm still undecided about whether we should be calling strcasecmp() to
begin with, but I don't really find this convincing. Just because we
only support brian@ and BRIAN@ being the same but not ævar@ and ÆVAR@ we
should break the existing behavior for everyone?

> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
> ---
>  mailmap.c          | 27 ++++++++++++++++++++++++---
>  t/t4203-mailmap.sh |  4 ++--
>  2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/mailmap.c b/mailmap.c
> index d3287b409a..5c52dbb7e0 100644
> --- a/mailmap.c
> +++ b/mailmap.c
> @@ -64,7 +64,22 @@ static void free_mailmap_entry(void *p, const char *s)
>   */
>  static int namemap_cmp(const char *a, const char *b)
>  {
> -	return strcasecmp(a, b);
> +	return strcmp(a, b);
> +}

It seems to me if we're not going to use strcasecmp() we can get rid of
this whole namemap_cmp() function. See the comment just above it &
de2f95ebed2 (mailmap: work around implementations with pure inline
strcasecmp, 2013-09-12). I.e. we had a wrapper function here just
because we were using strcasecmp().

> +/*
> + * Lowercases the domain (and only the domain) part of an email address.  The
> + * local-part, which is defined by RFC 5321 to be case sensitive, is not
> + * affected.
> + */
> +static char *lowercase_email(char *s)
> +{
> +	char *end = strchrnul(s, '@');

Speaking of pedantic readings of RFC 5321, aren't we closing the door
here to proper DQUOTE handling? I.e. the local-part containing a @
within quotes :)


^ permalink raw reply	[relevance 11%]

* [PATCH v2 4/5] mailmap: use case-sensitive comparisons for local-parts and names
  2021-01-03 21:18  6% [PATCH v2 0/5] Hashed mailmap brian m. carlson
  2021-01-03 21:18 19% ` [PATCH v2 3/5] t4203: add failing test for case-sensitive local-parts and names brian m. carlson
@ 2021-01-03 21:18 35% ` brian m. carlson
  2021-01-04 16:10 11%   ` Ævar Arnfjörð Bjarmason
  1 sibling, 1 reply; 200+ results
From: brian m. carlson @ 2021-01-03 21:18 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Ævar Arnfjörð Bjarmason, Phillip Wood

RFC 5321 is clear that the local-part of an email address (the part
before the at sign) is case sensitive, and this has been the case since
the original RFC 821.  It directs us that "the local-part MUST be
interpreted and assigned semantics only by the host specified in the
domain part of the address."

Since we are not that party, it's not correct for us to compare them
case insensitively.  However, we do still want to compare the domain
parts case insensitively, so let's add a helper that downcases the
domain and then compare byte by byte.

Similarly, it's not possible for us to correctly case-fold text in a
locale-insensitive way, so our handling of personal names has also been
subject to bugs.  Additionally, we've never handled non-ASCII characters
correctly, which means that our previous comparisons really only worked
well for a fraction of the people on the planet.  Since our code wasn't
right and it's basically impossible to compare personal names without
regard to case, let's also switch our matching of names to be byte by
byte.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 mailmap.c          | 27 ++++++++++++++++++++++++---
 t/t4203-mailmap.sh |  4 ++--
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/mailmap.c b/mailmap.c
index d3287b409a..5c52dbb7e0 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -64,7 +64,22 @@ static void free_mailmap_entry(void *p, const char *s)
  */
 static int namemap_cmp(const char *a, const char *b)
 {
-	return strcasecmp(a, b);
+	return strcmp(a, b);
+}
+
+/*
+ * Lowercases the domain (and only the domain) part of an email address.  The
+ * local-part, which is defined by RFC 5321 to be case sensitive, is not
+ * affected.
+ */
+static char *lowercase_email(char *s)
+{
+	char *end = strchrnul(s, '@');
+	while (*end) {
+		*end = tolower(*end);
+		end++;
+	}
+	return s;
 }
 
 static void add_mapping(struct string_list *map,
@@ -74,9 +89,13 @@ static void add_mapping(struct string_list *map,
 	struct mailmap_entry *me;
 	struct string_list_item *item;
 
+	lowercase_email(new_email);
+
 	if (old_email == NULL) {
 		old_email = new_email;
 		new_email = NULL;
+	} else {
+		lowercase_email(old_email);
 	}
 
 	item = string_list_insert(map, old_email);
@@ -300,7 +319,7 @@ static struct string_list_item *lookup_prefix(struct string_list *map,
 	 * real location of the key if one exists.
 	 */
 	while (0 <= --i && i < map->nr) {
-		int cmp = strncasecmp(map->items[i].string, string, len);
+		int cmp = strncmp(map->items[i].string, string, len);
 		if (cmp < 0)
 			/*
 			 * "i" points at a key definitely below the prefix;
@@ -323,6 +342,7 @@ int map_user(struct mailmap *map,
 	     const char **email, size_t *emaillen,
 	     const char **name, size_t *namelen)
 {
+	char *searchable_email = xstrndup(*email, *emaillen);
 	struct string_list_item *item;
 	struct mailmap_entry *me;
 
@@ -330,7 +350,8 @@ int map_user(struct mailmap *map,
 		 (int)*namelen, debug_str(*name),
 		 (int)*emaillen, debug_str(*email));
 
-	item = lookup_prefix(map->mailmap, *email, *emaillen);
+	item = lookup_prefix(map->mailmap, searchable_email, *emaillen);
+	free(searchable_email);
 	if (item != NULL) {
 		me = (struct mailmap_entry *)item->util;
 		if (me->namemap.nr) {
diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
index 32e849504c..df4a0e03cc 100755
--- a/t/t4203-mailmap.sh
+++ b/t/t4203-mailmap.sh
@@ -187,7 +187,7 @@ nick1 (1):
 
 EOF
 
-test_expect_failure 'name entry after email entry, case-sensitive local-part' '
+test_expect_success 'name entry after email entry, case-sensitive local-part' '
 	mkdir -p internal_mailmap &&
 	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
 	echo "Internal Guy <BUGS@company.xx>" >>internal_mailmap/.mailmap &&
@@ -195,7 +195,7 @@ test_expect_failure 'name entry after email entry, case-sensitive local-part' '
 	test_cmp expect actual
 '
 
-test_expect_failure 'name entry after email entry, case-sensitive personal name' '
+test_expect_success 'name entry after email entry, case-sensitive personal name' '
 	mkdir -p internal_mailmap &&
 	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
 	echo "Nick1 <bugs@company.xx> NICK1 <bugs@company.xx>" >internal_mailmap/.mailmap &&

^ permalink raw reply related	[relevance 35%]

* [PATCH v2 3/5] t4203: add failing test for case-sensitive local-parts and names
  2021-01-03 21:18  6% [PATCH v2 0/5] Hashed mailmap brian m. carlson
@ 2021-01-03 21:18 19% ` brian m. carlson
  2021-01-03 21:18 35% ` [PATCH v2 4/5] mailmap: use case-sensitive comparisons for " brian m. carlson
  1 sibling, 0 replies; 200+ results
From: brian m. carlson @ 2021-01-03 21:18 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Ævar Arnfjörð Bjarmason, Phillip Wood

Currently, Git always looks up entries in the mailmap in a
case-insensitive way, both for names and addresses, which is, as
explained below, suboptimal.

First, for email addresses, RFC 5321 is clear that only domains are case
insensitive; local-parts (the portion before the at sign) are not.  It
states this:

  The local-part of a mailbox MUST BE treated as case sensitive.
  Therefore, SMTP implementations MUST take care to preserve the case of
  mailbox local-parts.

There exist systems today where local-parts remain case sensitive (and
this author has one), and as such, it's incorrect for us to case fold
them in any way.  Let's add a failing test that indicates this is a
problem, while still keeping the test for case-insensitive domains.

Note that it's also incorrect for us to case-fold names because we don't
guarantee that we're using the locale of the author, and it's impossible
to case-fold names in a locale-insensitive way.  Turkish and Azeri
contain both a dotted and dotless I, and the uppercase ASCII I folds not
to the lowercase ASCII I, but to a dotless version, and vice versa with
the lowercase I.  There are many words in Turkish which differ only in
the dottedness of the I, so it is likely that there are also personal
names which differ in the same way.

That would be a problem even if our implementation were perfect, which
it is not.  We currently fold only ASCII characters, so this feature has
never worked correctly for the vast majority of the users on the planet,
regardless of the locale.  For example, on Linux, even in a Spanish
locale, we don't handle "Simón" properly.  Even if we did handle that,
we'd probably also want to implement Unicode normalization, which we
don't.

In general, case-folding text is extremely language- and locale-specific
and requires intimacy with the spelling and grammar of the language in
question and careful attention to the Unicode details in order to
produce a result that is meaningful to humans and conforms with
linguistic and societal norms.

Because we do not have any of the required context with a plain personal
name, we cannot hope to possibly case-fold personal names correctly.  We
should stop trying to do so and just treat them as a series of bytes, so
let's add a test that we don't case-fold personal names as well.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 t/t4203-mailmap.sh | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
index 586c3a86b1..32e849504c 100755
--- a/t/t4203-mailmap.sh
+++ b/t/t4203-mailmap.sh
@@ -170,10 +170,35 @@ Repo Guy (1):
 
 EOF
 
-test_expect_success 'name entry after email entry, case-insensitive' '
+test_expect_success 'name entry after email entry, case-insensitive domain' '
 	mkdir -p internal_mailmap &&
 	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
-	echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap &&
+	echo "Internal Guy <bugs@Company.xx>" >>internal_mailmap/.mailmap &&
+	git shortlog HEAD >actual &&
+	test_cmp expect actual
+'
+
+cat >expect <<\EOF
+Repo Guy (1):
+      initial
+
+nick1 (1):
+      second
+
+EOF
+
+test_expect_failure 'name entry after email entry, case-sensitive local-part' '
+	mkdir -p internal_mailmap &&
+	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
+	echo "Internal Guy <BUGS@company.xx>" >>internal_mailmap/.mailmap &&
+	git shortlog HEAD >actual &&
+	test_cmp expect actual
+'
+
+test_expect_failure 'name entry after email entry, case-sensitive personal name' '
+	mkdir -p internal_mailmap &&
+	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
+	echo "Nick1 <bugs@company.xx> NICK1 <bugs@company.xx>" >internal_mailmap/.mailmap &&
 	git shortlog HEAD >actual &&
 	test_cmp expect actual
 '

^ permalink raw reply related	[relevance 19%]

* [PATCH v2 0/5] Hashed mailmap
@ 2021-01-03 21:18  6% brian m. carlson
  2021-01-03 21:18 19% ` [PATCH v2 3/5] t4203: add failing test for case-sensitive local-parts and names brian m. carlson
  2021-01-03 21:18 35% ` [PATCH v2 4/5] mailmap: use case-sensitive comparisons for " brian m. carlson
  0 siblings, 2 replies; 200+ results
From: brian m. carlson @ 2021-01-03 21:18 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Ævar Arnfjörð Bjarmason, Phillip Wood

Many people, through the course of their lives, will change either a
name or an email address.  For this reason, we have the mailmap, to map
from a user's former name or email address to their current, canonical
forms.  Normally, this works well as it is.

However, sometimes people change a name (or an email) and want to
completely cease use of the former name or email.  This could be because
a transgender person has transitioned, because a person has left an
abusive partner or broken ties with an abusive family member, or for any
other number of good and valuable reasons.  In these cases, placing the
former name in the .mailmap may be undesirable.

For those situations, let's introduce a hashed mailmap, where the user's
former name or email address can be in the form @sha256:<hash>.  This
obscures the former name or email.

In the course of experimenting with some solutions for v2, I noticed
that our mailmap support has a bunch of problems with case sensitivity.
Notably, it treats local-parts of email addresses in a case-insensitive
way, when the RFC specifically says that they are case sensitive, and we
also treat names case insensitively, but only for ASCII characters.
Both of those have been fixed here, and the commit messages explain in
lurid detail why, while incompatible, this is the correct behavior.

I've also added some performance numbers and explained some alternate
solutions in the commit message for the final patch.  That's in addition
to the performance improvements I've done so that the feature is both
cheaper for users and nearly invisible for non-users.  That isn't quite
the same as adding a perf test, which I haven't done, but I think this
explains the situation quite well.  If folks are still dying for a perf
test, I can add one in v3.

I will point out that fully hashing a mailmap isn't necessarily cheap,
but how expensive it is depends on the weighting of current and former
members of the project.  As mentioned in the original thread, I think a
hash rather than an encoding is the right choice here.  It is likely
that in a few iterations of hardware, all users will have accelerated
SHA-256 and the cost will end up being a handful of cycles per name
overall.

Changes from v1:
* Fix case-sensitivity problems in the mailmap.
* Add documentation.
* Add explanation of how to compute the value.
* Add some optimizations to improve performance.
* Improve commit message to discuss performance numbers and explain
  rationale better.

brian m. carlson (5):
  mailmap: add a function to inspect the number of entries
  mailmap: switch to opaque struct
  t4203: add failing test for case-sensitive local-parts and names
  mailmap: use case-sensitive comparisons for local-parts and names
  mailmap: support hashed entries in mailmaps

 Documentation/mailmap.txt |  28 ++++++++
 builtin/blame.c           |   2 +-
 builtin/check-mailmap.c   |   4 +-
 builtin/commit.c          |   2 +-
 mailmap.c                 | 139 +++++++++++++++++++++++++++++++++-----
 mailmap.h                 |  15 ++--
 pretty.c                  |   4 +-
 pretty.h                  |   2 +-
 revision.c                |   2 +-
 revision.h                |   3 +-
 shortlog.h                |   3 +-
 t/t4203-mailmap.sh        |  64 +++++++++++++++++-
 12 files changed, 236 insertions(+), 32 deletions(-)


^ permalink raw reply	[relevance 6%]

* Re: [PATCH] git-mv: fix git mv bug with case insensitive fs
  2020-12-29  2:06  4%   ` [PATCH] git-mv: fix git mv bug with case insensitive fs Dan Moseley
@ 2020-12-31  7:13  0%     ` Torsten Bögershausen
  0 siblings, 0 replies; 200+ results
From: Torsten Bögershausen @ 2020-12-31  7:13 UTC (permalink / raw)
  To: Dan Moseley; +Cc: git@vger.kernel.org

On Tue, Dec 29, 2020 at 02:06:37AM +0000, Dan Moseley wrote:

First of all, thanks for submitting this to git.git.
I take the freedom to add some comments here.

> Fix git mv to not assert when src is already in the index under a
> different casing, core.caseInsensitive=true, and the file system
> is case insensitive.
The config variable is named core.ignorecase

Does it make sense to illustrate the use case here, like this:

 git init
 echo foo >foo
 git add foo
 git mv foo FOO
 git mv foo bar

>
> Since 9b906af657 the check that git mv does to ensure the src is in the
> cache respects caseInsensitive. As a result git mv allows a move from a
> file that has a different case in the index than it does on disk.
> After the rename on disk, git mv fails to find the file in the cache
> in order to rename it in the index, and asserts.
> Assertion failed: pos >= 0, file builtin/mv.c, line 295
>
> This is the simplest possible fix, suggested by @tboegi. It does leave
> the file renamed on disk, but that is easy to reverse after the error.

We can expand the short-ish "@tboegi" into a "Helped-by" line, please see below.
And refrase the paragraf like this:

This is the simplest possible fix, it avoids to leaving a .git/index.lock
behind.  It does leave the file renamed on disk,
but that is easy to reverse after the error.

>
> Another option would be to change the aforementioned check to always
> be case sensitive, but I am not sure whether there is a scenario where
> it is useful to be insensitive.

The intention of 9b906af657
Author: Chris Torek <chris.torek@gmail.com>
Date:   Mon Jul 20 06:17:52 2020 +0000
    git-mv: improve error message for conflicted file

was to give the user better and more helpful error messages.

Some background:
A case-insensitive file system does the same for
lstat("foo") or lstat("FOO"), but Git records only one case,
which is "FOO" after the `git mv foo FOO`

In that sense, replacing
cache_file_exists(src, length, ignore_case)
with
cache_file_exists(src, length, 0)
would be the correct solution (and an even simpler patch).

Doing so would give the error message
"not under version control"
when doing `git mv foo bar` after `git mv foo FOO`
I think, that this is technically correct, the user has just asked
to track "FOO", and "foo" is not in the repo any more.

A (may be) more helpful  message could be achieved by something like this
(white space dmaged) diff. Any thoughts, if this is really helpful ?

 diff --git a/builtin/mv.c b/builtin/mv.c
 index 7dac714af9..8572a5dae0 100644
 --- a/builtin/mv.c
 +++ b/builtin/mv.c
 @@ -221,8 +221,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                                 }
                                 argc += last - first;
                         }
 -               } else if (!(ce = cache_file_exists(src, length, ignore_case))) {
 -                       bad = _("not under version control");
 +               } else if (!(ce = cache_file_exists(src, length, 0))) {
 +                       if (cache_file_exists(src, length, ignore_case))
 +                               bad = _("not under version control (upper/lower mixup)");
 +                       else
 +                               bad = _("not under version control");
                 } else if (ce_stage(ce)) {
 	                        bad = _("conflicted");
                 } else if (lstat(dst, &st) == 0 &&



>
> Signed-off-by: Dan Moseley <danmose@microsoft.com>
If you want, add a
Helped-by Torsten Bögershausen <tboegi@web.de>

> ---
> Originally reported in https://github.com/git-for-windows/git/issues/2920
> but this is not specific to Windows.
>
>  builtin/mv.c  | 6 ++++--
>  t/t7001-mv.sh | 8 ++++++++
>  2 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/builtin/mv.c b/builtin/mv.c index 7dac714af9..e1fd8a5e00 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -292,8 +292,10 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>                         continue;
>
>                 pos = cache_name_pos(src, strlen(src));
> -               assert(pos >= 0);
> -               rename_cache_entry_at(pos, dst);
> +               if (pos >= 0)
> +                       rename_cache_entry_at(pos, dst);
> +               else if (!ignore_errors)
> +                       die(_("bad source: source=%s, destination=%s"),
> + src, dst);
>         }
>
>         if (gitmodules_modified)
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index 63d5f41a12..5c7fee9bd8 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -152,6 +152,14 @@ test_expect_success \
>      'move into "."' \
>      'git mv path1/path2/ .'
>
> +test_expect_success \
> +    'fail to move file already in index under different cased name' \
> +    'echo 1 > foo &&
> +     git add foo &&
> +     git commit -m add_file -- foo &&
> +     git mv foo FOO &&
> +     test_expect_code 128 git mv foo BAR'
As discussed on Github: Is this the right code to test that the
code does not assert(). I dont know.
> +
>  test_expect_success "Michael Cassar's test case" '
>         rm -fr .git papers partA &&
>         git init &&
> --
> 2.25.1
>

^ permalink raw reply	[relevance 0%]

* [PATCH] git-mv: fix git mv bug with case insensitive fs
       [not found]     ` <BYAPR21MB11585FFD46DEE7AD4EEEFEABE0D89@BYAPR21MB1158.namprd21.prod.outlook.com>
@ 2020-12-29  2:06  4%   ` Dan Moseley
  2020-12-31  7:13  0%     ` Torsten Bögershausen
  0 siblings, 1 reply; 200+ results
From: Dan Moseley @ 2020-12-29  2:06 UTC (permalink / raw)
  To: git@vger.kernel.org

Fix git mv to not assert when src is already in the index under a
different casing, core.caseInsensitive=true, and the file system
is case insensitive.

Since 9b906af657 the check that git mv does to ensure the src is in the
cache respects caseInsensitive. As a result git mv allows a move from a
file that has a different case in the index than it does on disk. 
After the rename on disk, git mv fails to find the file in the cache
in order to rename it in the index, and asserts.
Assertion failed: pos >= 0, file builtin/mv.c, line 295

This is the simplest possible fix, suggested by @tboegi. It does leave
the file renamed on disk, but that is easy to reverse after the error.

Another option would be to change the aforementioned check to always
be case sensitive, but I am not sure whether there is a scenario where
it is useful to be insensitive.

Signed-off-by: Dan Moseley <danmose@microsoft.com>
---
Originally reported in https://github.com/git-for-windows/git/issues/2920
but this is not specific to Windows.

 builtin/mv.c  | 6 ++++--
 t/t7001-mv.sh | 8 ++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c index 7dac714af9..e1fd8a5e00 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -292,8 +292,10 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                        continue;

                pos = cache_name_pos(src, strlen(src));
-               assert(pos >= 0);
-               rename_cache_entry_at(pos, dst);
+               if (pos >= 0)
+                       rename_cache_entry_at(pos, dst);
+               else if (!ignore_errors)
+                       die(_("bad source: source=%s, destination=%s"), 
+ src, dst);
        }

        if (gitmodules_modified)
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index 63d5f41a12..5c7fee9bd8 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -152,6 +152,14 @@ test_expect_success \
     'move into "."' \
     'git mv path1/path2/ .'

+test_expect_success \
+    'fail to move file already in index under different cased name' \
+    'echo 1 > foo &&
+     git add foo &&
+     git commit -m add_file -- foo &&
+     git mv foo FOO &&
+     test_expect_code 128 git mv foo BAR'
+
 test_expect_success "Michael Cassar's test case" '
        rm -fr .git papers partA &&
        git init &&
--
2.25.1


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v4 10/19] unpack-trees: add basic support for parallel checkout
  2020-12-06 11:36  0%   ` Christian Couder
@ 2020-12-07 19:06  0%     ` Matheus Tavares Bernardino
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares Bernardino @ 2020-12-07 19:06 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, Junio C Hamano, Jeff Hostetler, Christian Couder, Jeff King,
	Elijah Newren, Jonathan Nieder, Martin Ågren

Hi, Christian

On Sun, Dec 6, 2020 at 8:36 AM Christian Couder
<christian.couder@gmail.com> wrote:
>
> On Wed, Nov 4, 2020 at 9:34 PM Matheus Tavares
> <matheus.bernardino@usp.br> wrote:
> >
> > This new interface allows us to enqueue some of the entries being
> > checked out to later call write_entry() for them in parallel. For now,
> > the parallel checkout machinery is enabled by default and there is no
> > user configuration, but run_parallel_checkout() just writes the queued
> > entries in sequence (without spawning additional workers). The next
> > patch will actually implement the parallelism and, later, we will make
> > it configurable.

I just noticed that this part of the commit message is a little
outdated. I'll fix it for v5. Currently, the parallelism and
configuration are added in the same patch (the next one). This way,
the patch that adds parallelism can already include runtime numbers
for different configuration values (which shows when the change is
beneficial).

> I would think that it might be more logical to first add a
> configuration that does nothing, then add writing the queued entries
> in sequence without parallelism, and then add actual parallelism.

I'm not sure I get the idea. Would the first patch add just the
documentation for `checkout.workers` and
`checkout.thresholdForParallelism` in
`Documentation/config/checkout.txt`, without the support for it in the
code? In that case, wouldn't the patch become somewhat incomplete on
its own?

> > When there are path collisions among the entries being written (which
> > can happen e.g. with case-sensitive files in case-insensitive file
> > systems), the parallel checkout code detects the problem and marks the
> > item with PC_ITEM_COLLIDED.
>
> Is this needed in this step that only writes the queued entries in
> sequence without parallelism, or could this be added later, before the
> step that adds actual parallelism?

This is already used in this patch. Even though the parallel checkout
machinery only learns to spawn additional workers in the next patch,
it can already encounter path collisions when writing the entries
sequentially. PC_ITEM_COLLIDED is then used to mark the colliding
entries, so that they can be properly handled later.

> > Later, these items are sequentially fed to
> > checkout_entry() again. This is similar to the way the sequential code
> > deals with collisions, overwriting the previously checked out entries
> > with the subsequent ones. The only difference is that, when we start
> > writing the entries in parallel, we won't be able to determine which of
> > the colliding entries will survive on disk (for the sequential
> > algorithm, it is always the last one).
>
> So I guess that PC_ITEM_COLLIDED will then be used to decide which
> entries will not be checked out in parallel?

Yes, in the next patch, the parallel workers will detect collisions
when `open(path, O_CREAT | O_EXCL)` fails with EEXIST or EISDIR. The
workers then mark such items with PC_ITEM_COLLIDED and let the main
process sequentially write them later.

> > I also experimented with the idea of not overwriting colliding entries,
> > and it seemed to work well in my simple tests.
>
> There are a number of co-author of this patch, so it's not very clear
> who "I" is. Maybe:
>
> "The idea of not overwriting colliding entries seemed to work well in
> simple tests, however ..."

Makes sense, thanks.

> > However, because just one
> > entry of each colliding group would be actually written, the others
> > would have null lstat() fields on the index. This might not be a problem
> > by itself, but it could cause performance penalties for subsequent
> > commands that need to refresh the index: when the st_size value cached
> > is 0, read-cache.c:ie_modified() will go to the filesystem to see if the
> > contents match. As mentioned in the function:
> >
> >     * Immediately after read-tree or update-index --cacheinfo,
> >     * the length field is zero, as we have never even read the
> >     * lstat(2) information once, and we cannot trust DATA_CHANGED
> >     * returned by ie_match_stat() which in turn was returned by
> >     * ce_match_stat_basic() to signal that the filesize of the
> >     * blob changed.  We have to actually go to the filesystem to
> >     * see if the contents match, and if so, should answer "unchanged".
> >
> > So, if we have N entries in a colliding group and we decide to write and
> > lstat() only one of them, every subsequent git-status will have to read,
> > convert, and hash the written file N - 1 times, to check that the N - 1
> > unwritten entries are dirty. By checking out all colliding entries (like
> > the sequential code does), we only pay the overhead once.
>
> Ok.
>
> >  5 files changed, 410 insertions(+), 3 deletions(-)
>
> It looks like a lot of new code in one patch/commit, which is why it
> might be interesting to split it.

Yeah, this and the following patch ended up quite big... But I wasn't
sure how to further split them while still keeping each part buildable
and self-contained :(

> > @@ -7,6 +7,7 @@
> >  #include "progress.h"
> >  #include "fsmonitor.h"
> >  #include "entry.h"
> > +#include "parallel-checkout.h"
> >
> >  static void create_directories(const char *path, int path_len,
> >                                const struct checkout *state)
> > @@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
> >         for (i = 0; i < state->istate->cache_nr; i++) {
> >                 struct cache_entry *dup = state->istate->cache[i];
> >
> > -               if (dup == ce)
> > -                       break;
> > +               if (dup == ce) {
> > +                       /*
> > +                        * Parallel checkout creates the files in no particular
> > +                        * order. So the other side of the collision may appear
> > +                        * after the given cache_entry in the array.
> > +                        */
>
> Is it really the case right now that the code creates files in no
> particular order or will that be the case later when actual
> parallelism is implemented?

In this patch, the code already creates files in no particular order.
Since not all entries are eligible for parallel checkout, and because
ineligible entries are written first, the files are not created in the
same order that they appear in istate->cache[]. (Even though
everything is still written sequentially in this patch).

> > +                       if (parallel_checkout_status() == PC_RUNNING)
> > +                               continue;
> > +                       else
> > +                               break;
> > +               }
>
> > +struct parallel_checkout_item {
> > +       /* pointer to a istate->cache[] entry. Not owned by us. */
> > +       struct cache_entry *ce;
> > +       struct conv_attrs ca;
> > +       struct stat st;
> > +       enum pc_item_status status;
> > +};
>
> "item" seems not very clear to me. If there is only one
> parallel_checkout_item for each cache_entry then it might be better to
> use "parallel_checkout_entry" instead of "parallel_checkout_item".

Hmm, I'm a little uncertain about this one. I usually use "item" and
"entry" interchangeably when talking about elements on a list, as in
this case. Could perhaps the 'struct parallel_checkout_item'
definition be unclear because it's far from the 'struct
parallel_checkout', where the list is actually defined?

> > +enum pc_status {
> > +       PC_UNINITIALIZED = 0,
> > +       PC_ACCEPTING_ENTRIES,
> > +       PC_RUNNING,
> > +};
> > +
> > +enum pc_status parallel_checkout_status(void);
> > +void init_parallel_checkout(void);
>
> Maybe a comment to tell what the above function does could be helpful.
> If I had to guess, I would write something like:
>
> /*
>  * Put parallel checkout into the PC_ACCEPTING_ENTRIES state.
>  * Should be used only when in the PC_UNINITIALIZED state.
>  */

OK, will do, thanks!

> > +/*
> > + * Return -1 if parallel checkout is currently not enabled
>
> Is it "enabled" or "initialized" or "configured" here? Does it refer
> to `enum pc_status` or a config option or something else? Looking at
> the code, it is testing if the status PC_ACCEPTING_ENTRIES, so
> perhaps: s/not enabled/not accepting entries/

Yes, that's better, thanks!

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4 10/19] unpack-trees: add basic support for parallel checkout
  2020-11-04 20:33  2% ` [PATCH v4 10/19] unpack-trees: add basic support for parallel checkout Matheus Tavares
@ 2020-12-06 11:36  0%   ` Christian Couder
  2020-12-07 19:06  0%     ` Matheus Tavares Bernardino
  0 siblings, 1 reply; 200+ results
From: Christian Couder @ 2020-12-06 11:36 UTC (permalink / raw)
  To: Matheus Tavares
  Cc: git, Junio C Hamano, Jeff Hostetler, Christian Couder, Jeff King,
	Elijah Newren, Jonathan Nieder, Martin Ågren

On Wed, Nov 4, 2020 at 9:34 PM Matheus Tavares
<matheus.bernardino@usp.br> wrote:
>
> This new interface allows us to enqueue some of the entries being
> checked out to later call write_entry() for them in parallel. For now,
> the parallel checkout machinery is enabled by default and there is no
> user configuration, but run_parallel_checkout() just writes the queued
> entries in sequence (without spawning additional workers). The next
> patch will actually implement the parallelism and, later, we will make
> it configurable.

I would think that it might be more logical to first add a
configuration that does nothing, then add writing the queued entries
in sequence without parallelism, and then add actual parallelism.

> When there are path collisions among the entries being written (which
> can happen e.g. with case-sensitive files in case-insensitive file
> systems), the parallel checkout code detects the problem and marks the
> item with PC_ITEM_COLLIDED.

Is this needed in this step that only writes the queued entries in
sequence without parallelism, or could this be added later, before the
step that adds actual parallelism?

> Later, these items are sequentially fed to
> checkout_entry() again. This is similar to the way the sequential code
> deals with collisions, overwriting the previously checked out entries
> with the subsequent ones. The only difference is that, when we start
> writing the entries in parallel, we won't be able to determine which of
> the colliding entries will survive on disk (for the sequential
> algorithm, it is always the last one).

So I guess that PC_ITEM_COLLIDED will then be used to decide which
entries will not be checked out in parallel?

> I also experimented with the idea of not overwriting colliding entries,
> and it seemed to work well in my simple tests.

There are a number of co-author of this patch, so it's not very clear
who "I" is. Maybe:

"The idea of not overwriting colliding entries seemed to work well in
simple tests, however ..."

> However, because just one
> entry of each colliding group would be actually written, the others
> would have null lstat() fields on the index. This might not be a problem
> by itself, but it could cause performance penalties for subsequent
> commands that need to refresh the index: when the st_size value cached
> is 0, read-cache.c:ie_modified() will go to the filesystem to see if the
> contents match. As mentioned in the function:
>
>     * Immediately after read-tree or update-index --cacheinfo,
>     * the length field is zero, as we have never even read the
>     * lstat(2) information once, and we cannot trust DATA_CHANGED
>     * returned by ie_match_stat() which in turn was returned by
>     * ce_match_stat_basic() to signal that the filesize of the
>     * blob changed.  We have to actually go to the filesystem to
>     * see if the contents match, and if so, should answer "unchanged".
>
> So, if we have N entries in a colliding group and we decide to write and
> lstat() only one of them, every subsequent git-status will have to read,
> convert, and hash the written file N - 1 times, to check that the N - 1
> unwritten entries are dirty. By checking out all colliding entries (like
> the sequential code does), we only pay the overhead once.

Ok.

>  5 files changed, 410 insertions(+), 3 deletions(-)

It looks like a lot of new code in one patch/commit, which is why it
might be interesting to split it.

> @@ -7,6 +7,7 @@
>  #include "progress.h"
>  #include "fsmonitor.h"
>  #include "entry.h"
> +#include "parallel-checkout.h"
>
>  static void create_directories(const char *path, int path_len,
>                                const struct checkout *state)
> @@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
>         for (i = 0; i < state->istate->cache_nr; i++) {
>                 struct cache_entry *dup = state->istate->cache[i];
>
> -               if (dup == ce)
> -                       break;
> +               if (dup == ce) {
> +                       /*
> +                        * Parallel checkout creates the files in no particular
> +                        * order. So the other side of the collision may appear
> +                        * after the given cache_entry in the array.
> +                        */

Is it really the case right now that the code creates files in no
particular order or will that be the case later when actual
parallelism is implemented?

> +                       if (parallel_checkout_status() == PC_RUNNING)
> +                               continue;
> +                       else
> +                               break;
> +               }

> +struct parallel_checkout_item {
> +       /* pointer to a istate->cache[] entry. Not owned by us. */
> +       struct cache_entry *ce;
> +       struct conv_attrs ca;
> +       struct stat st;
> +       enum pc_item_status status;
> +};

"item" seems not very clear to me. If there is only one
parallel_checkout_item for each cache_entry then it might be better to
use "parallel_checkout_entry" instead of "parallel_checkout_item".

> +enum pc_status {
> +       PC_UNINITIALIZED = 0,
> +       PC_ACCEPTING_ENTRIES,
> +       PC_RUNNING,
> +};
> +
> +enum pc_status parallel_checkout_status(void);
> +void init_parallel_checkout(void);

Maybe a comment to tell what the above function does could be helpful.
If I had to guess, I would write something like:

/*
 * Put parallel checkout into the PC_ACCEPTING_ENTRIES state.
 * Should be used only when in the PC_UNINITIALIZED state.
 */

> +/*
> + * Return -1 if parallel checkout is currently not enabled

Is it "enabled" or "initialized" or "configured" here? Does it refer
to `enum pc_status` or a config option or something else? Looking at
the code, it is testing if the status PC_ACCEPTING_ENTRIES, so
perhaps: s/not enabled/not accepting entries/

> or if the entry is
> + * not eligible for parallel checkout. Otherwise, enqueue the entry for later
> + * write and return 0.
> + */
> +int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/7] t1300: test "set all" mode with value_regex
  @ 2020-11-21 22:27  4%       ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2020-11-21 22:27 UTC (permalink / raw)
  To: Jeff King
  Cc: Junio C Hamano, Derrick Stolee via GitGitGadget, git,
	Jonathan Nieder, Emily Shaffer, Johannes Schindelin,
	Derrick Stolee, Derrick Stolee

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

On 2020-11-20 at 18:39:03, Jeff King wrote:
> t1300 is full of this kind of junk. Several years ago, while working on
> some of the repositoryformatversion code, I noticed that we will accept
> a repository that does not have core.repositoryformatversion set at all,
> nor even has a .git/config present!

Yup.  We test this in t3200 as well.  I don't love it, but it exists.

> It's easy to fix in the code, but it causes failures all over t1300. So
> then I started converting t1300 to use "config --file" (which
> almost certainly didn't exist back when most of those tests were
> originally written).  I don't remember how or why it got hairy, but it
> was enough that I eventually dropped it (unlike many of my other stale
> topics, I don't think I've even kept rebasing it forward as a WIP).
> 
> Possibly I was concerned that people in the wild were relying on a blank
> or missing config being the same as repositoryformatversion=0. That will
> definitely stop working in a sha256 world anyway, though, because
> they'll need the objectFormat extension.

Which is exactly why that test in t3200 has a SHA1 prerequisite.  I'm
sure we'll hear someone complain about the fact that SHA-256
repositories have to have a config file, but I'm fine with us not
supporting it.

I should point out that lacking a config file also only works on Unix
systems with a POSIX file system (including case-sensitive macOS), since
otherwise core.ignorecase (and core.symlinks, if appropriate) aren't set
correctly.  It also doesn't work for bare repositories on any OS.  So
hopefully the number of people doing this is quite small.

> So that got a bit off-track, but I think:
> 
>   - t1300 already is very much like this, so it's not a new thing
> 
>   - but I would be happy not to see it go further in that direction,
>     even if it means inconsistency with the rest of the script

I agree we shouldn't make things worse.
-- 
brian m. carlson (he/him or they/them)
Houston, Texas, US

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

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 0/7] config: add --literal-value option
  @ 2020-11-20 18:51  4%       ` Derrick Stolee
  0 siblings, 0 replies; 200+ results
From: Derrick Stolee @ 2020-11-20 18:51 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Ævar Arnfjörð Bjarmason,
	Derrick Stolee via GitGitGadget, git, Jonathan Nieder,
	Emily Shaffer, Johannes Schindelin, Jeff King, Derrick Stolee

On 11/20/2020 1:30 PM, Junio C Hamano wrote:
> Derrick Stolee <stolee@gmail.com> writes:
> 
>> On 11/20/2020 8:19 AM, Ævar Arnfjörð Bjarmason wrote:
>>>
>>> On Thu, Nov 19 2020, Derrick Stolee via GitGitGadget wrote:
>>>
>>>> As reported [1], 'git maintenance unregister' fails when a repository is
>>>> located in a directory with regex glob characters.
>>>
>>> Just as bikeshedding on the name: Did you consider something
>>> thematically similar to the corresponding git-grep option,
>>> i.e. --fixed-string[s]. I see -F is also free in git-config(1).
>>
>> I definitely wanted to be specific about "value" in the name,
>> since some options include regexes on the key as well. I'm open
>> to new ideas, and combining your idea with mine would introduce
>> "--fixed-value". Thoughts?
> 
> I very much appreciate "value" is in the name, with the current
> semantics that this only controls how the pattern matching is done
> on the value side and not on the key side.  When making an obvious
> addition of a separate option to control how the pattern matching is
> done on keys in the future, we would regret if we called this option
> "--fixed-strings" today.  And no, I do not think it is an acceptable
> option to introduce "--fixed-strings" that only affects value side
> and then later change its behaviour to affect also on the key side.
> 
> 	Side note.  It _is_ possible to ship such a "--fixed-strings"
> 	option that does not work on the key side and document it as
> 	a known bug, later to be fixed.  I am not sure if I like it.
> 
> But stepping back a bit, is the extra flexibility that allows us to
> control the matching on keys and values separately with such a
> scheme really worth the complexity (at the end-user facing interface
> level, not the implementation level)?
>
> So an alternative may be to use a single option, whose name would
> probably be one of "--(literal|fixed)-(match|strings)", but extend
> the implementation in this series to make the single option affect
> both the value and key matching the same way.
> 
> That would however be more work in the shorter term.  Offhand, I am
> not sure if I like it (i.e. spending time and effort that is more
> than the absolute minimum necessary to fix a breakage.  And the end
> result of doing so is less powerful/flexible, even though it may be
> easier to explain to users simply because the feature is less
> powerful than it could be).  It would be easier, if I can convince
> myself that the extra flexibility is not worth it, to just declare
> that simpler is better here, but I am not quite ready to do so yet.
I had not thought about making this option be related to the key
names at all. In particular, we already have the --get-regexp option:

--get-regexp::
	Like --get-all, but interprets the name as a regular expression and
	writes out the key names.  Regular expression matching is currently
	case-sensitive and done against a canonicalized version of the key
	in which section and variable names are lowercased, but subsection
	names are not.

I suppose that there could be reason to create a similar --unset-regexp
that is the same equivalent of --unset-all. Perhaps the --replace-all
mode could benefit, too? These are also more dangerous to use with regex
matches since they also _change_ the config, not just query it.

Since there is already asymmetry between the key and value (only one
mode, --get-regexp, has a "name_regex"), I would prefer to treat the
value_regex in isolation here.

Thanks,
-Stolee

^ permalink raw reply	[relevance 4%]

* Re: [PATCH] git-gui: update Russian translation
  2020-11-06 18:49  1% [PATCH] git-gui: update Russian translation Dimitriy Ryazantcev
@ 2020-11-18 11:02  0% ` Dimitriy
  0 siblings, 0 replies; 200+ results
From: Dimitriy @ 2020-11-18 11:02 UTC (permalink / raw)
  To: Git Mailing List, me

Any news on this?

пт, 6 нояб. 2020 г. в 20:49, Dimitriy Ryazantcev
<dimitriy.ryazantcev@gmail.com>:
>
> Translation is done on Transifex: https://www.transifex.com/djm00n/git-po-ru/git-gui/
> If you have any corrections please report them there.
>
> Signed-off-by: Dimitriy Ryazantcev <dimitriy.ryazantcev@gmail.com>
> ---
>  po/ru.po | 3287 +++++++++++++++++++++++++++++-------------------------
>  1 file changed, 1778 insertions(+), 1509 deletions(-)
>
> diff --git a/po/ru.po b/po/ru.po
> index 9f5305c..161ee1a 100644
> --- a/po/ru.po
> +++ b/po/ru.po
> @@ -2,14 +2,14 @@
>  # Copyright (C) 2007 Shawn Pearce
>  # This file is distributed under the same license as the git-gui package.
>  # Translators:
> -# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016
> +# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016,2020
>  # Irina Riesen <irina.riesen@gmail.com>, 2007
>  msgid ""
>  msgstr ""
>  "Project-Id-Version: Git Russian Localization Project\n"
>  "Report-Msgid-Bugs-To: \n"
> -"POT-Creation-Date: 2010-01-26 15:47-0800\n"
> -"PO-Revision-Date: 2016-06-30 12:39+0000\n"
> +"POT-Creation-Date: 2020-02-08 22:54+0100\n"
> +"PO-Revision-Date: 2020-11-05 11:20+0000\n"
>  "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
>  "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
>  "MIME-Version: 1.0\n"
> @@ -18,33 +18,33 @@ msgstr ""
>  "Language: ru\n"
>  "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
>
> -#: git-gui.sh:41 git-gui.sh:793 git-gui.sh:807 git-gui.sh:820 git-gui.sh:903
> -#: git-gui.sh:922
> -msgid "git-gui: fatal error"
> -msgstr "git-gui: критическая ошибка"
> -
> -#: git-gui.sh:743
> +#: git-gui.sh:847
>  #, tcl-format
>  msgid "Invalid font specified in %s:"
>  msgstr "В %s установлен неверный шрифт:"
>
> -#: git-gui.sh:779
> +#: git-gui.sh:901
>  msgid "Main Font"
>  msgstr "Шрифт интерфейса"
>
> -#: git-gui.sh:780
> +#: git-gui.sh:902
>  msgid "Diff/Console Font"
>  msgstr "Шрифт консоли и изменений (diff)"
>
> -#: git-gui.sh:794
> +#: git-gui.sh:917 git-gui.sh:931 git-gui.sh:944 git-gui.sh:1034
> +#: git-gui.sh:1053 git-gui.sh:3212
> +msgid "git-gui: fatal error"
> +msgstr "git-gui: критическая ошибка"
> +
> +#: git-gui.sh:918
>  msgid "Cannot find git in PATH."
>  msgstr "git не найден в PATH."
>
> -#: git-gui.sh:821
> +#: git-gui.sh:945
>  msgid "Cannot parse Git version string:"
>  msgstr "Невозможно распознать строку версии Git: "
>
> -#: git-gui.sh:839
> +#: git-gui.sh:970
>  #, tcl-format
>  msgid ""
>  "Git version cannot be determined.\n"
> @@ -56,473 +56,519 @@ msgid ""
>  "Assume '%s' is version 1.5.0?\n"
>  msgstr "Невозможно определить версию Git\n\n%s указывает на версию «%s».\n\nдля %s требуется версия Git, начиная с 1.5.0\n\nПредположить, что «%s» и есть версия 1.5.0?\n"
>
> -#: git-gui.sh:1128
> +#: git-gui.sh:1267
>  msgid "Git directory not found:"
>  msgstr "Каталог Git не найден:"
>
> -#: git-gui.sh:1146
> +#: git-gui.sh:1301
>  msgid "Cannot move to top of working directory:"
>  msgstr "Невозможно перейти к корню рабочего каталога репозитория: "
>
> -#: git-gui.sh:1154
> +#: git-gui.sh:1309
>  msgid "Cannot use bare repository:"
>  msgstr "Невозможно использование репозитория без рабочего каталога:"
>
> -#: git-gui.sh:1162
> +#: git-gui.sh:1317
>  msgid "No working directory"
>  msgstr "Отсутствует рабочий каталог"
>
> -#: git-gui.sh:1334 lib/checkout_op.tcl:306
> +#: git-gui.sh:1491 lib/checkout_op.tcl:306
>  msgid "Refreshing file status..."
>  msgstr "Обновление информации о состоянии файлов…"
>
> -#: git-gui.sh:1390
> +#: git-gui.sh:1551
>  msgid "Scanning for modified files ..."
>  msgstr "Поиск измененных файлов…"
>
> -#: git-gui.sh:1454
> +#: git-gui.sh:1629
>  msgid "Calling prepare-commit-msg hook..."
>  msgstr "Вызов перехватчика prepare-commit-msg…"
>
> -#: git-gui.sh:1471
> +#: git-gui.sh:1646
>  msgid "Commit declined by prepare-commit-msg hook."
>  msgstr "Коммит прерван перехватчиком prepare-commit-msg."
>
> -#: git-gui.sh:1629 lib/browser.tcl:246
> +#: git-gui.sh:1804 lib/browser.tcl:252
>  msgid "Ready."
>  msgstr "Готово."
>
> -#: git-gui.sh:1787
> +#: git-gui.sh:1968
>  #, tcl-format
> -msgid "Displaying only %s of %s files."
> -msgstr "Показано %s из %s файлов."
> +msgid ""
> +"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s "
> +"files."
> +msgstr "Лимит отображаемых файлов достигнут (gui.maxfilesdisplayed = %s), не все %s файлы показаны."
>
> -#: git-gui.sh:1913
> +#: git-gui.sh:2091
>  msgid "Unmodified"
>  msgstr "Не изменено"
>
> -#: git-gui.sh:1915
> +#: git-gui.sh:2093
>  msgid "Modified, not staged"
>  msgstr "Изменено, не в индексе"
>
> -#: git-gui.sh:1916 git-gui.sh:1924
> +#: git-gui.sh:2094 git-gui.sh:2106
>  msgid "Staged for commit"
>  msgstr "В индексе для коммита"
>
> -#: git-gui.sh:1917 git-gui.sh:1925
> +#: git-gui.sh:2095 git-gui.sh:2107
>  msgid "Portions staged for commit"
>  msgstr "Части, в индексе для коммита"
>
> -#: git-gui.sh:1918 git-gui.sh:1926
> +#: git-gui.sh:2096 git-gui.sh:2108
>  msgid "Staged for commit, missing"
>  msgstr "В индексе для коммита, отсутствует"
>
> -#: git-gui.sh:1920
> +#: git-gui.sh:2098
>  msgid "File type changed, not staged"
>  msgstr "Тип файла изменён, не в индексе"
>
> -#: git-gui.sh:1921
> +#: git-gui.sh:2099 git-gui.sh:2100
> +msgid "File type changed, old type staged for commit"
> +msgstr "Тип файла изменён, старый тип файла в индексе"
> +
> +#: git-gui.sh:2101
>  msgid "File type changed, staged"
>  msgstr "Тип файла изменён, в индексе"
>
> -#: git-gui.sh:1923
> +#: git-gui.sh:2102
> +msgid "File type change staged, modification not staged"
> +msgstr "Изменение типа файла в индексе, изменение не в индексе"
> +
> +#: git-gui.sh:2103
> +msgid "File type change staged, file missing"
> +msgstr "Изменение типа файла в индексе, файл не найден"
> +
> +#: git-gui.sh:2105
>  msgid "Untracked, not staged"
>  msgstr "Не отслеживается, не в индексе"
>
> -#: git-gui.sh:1928
> +#: git-gui.sh:2110
>  msgid "Missing"
>  msgstr "Отсутствует"
>
> -#: git-gui.sh:1929
> +#: git-gui.sh:2111
>  msgid "Staged for removal"
>  msgstr "В индексе для удаления"
>
> -#: git-gui.sh:1930
> +#: git-gui.sh:2112
>  msgid "Staged for removal, still present"
>  msgstr "В индексе для удаления, еще не удалено"
>
> -#: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935
> -#: git-gui.sh:1936 git-gui.sh:1937
> +#: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117
> +#: git-gui.sh:2118 git-gui.sh:2119
>  msgid "Requires merge resolution"
>  msgstr "Требуется разрешение конфликта при слиянии"
>
> -#: git-gui.sh:1972
> -msgid "Starting gitk... please wait..."
> -msgstr "Запускается gitk… Подождите, пожалуйста…"
> -
> -#: git-gui.sh:1984
> +#: git-gui.sh:2164
>  msgid "Couldn't find gitk in PATH"
>  msgstr "gitk не найден в PATH."
>
> -#: git-gui.sh:2043
> +#: git-gui.sh:2210 git-gui.sh:2245
> +#, tcl-format
> +msgid "Starting %s... please wait..."
> +msgstr "Запускается %s… Подождите, пожалуйста…"
> +
> +#: git-gui.sh:2224
>  msgid "Couldn't find git gui in PATH"
>  msgstr "git gui не найден в PATH."
>
> -#: git-gui.sh:2455 lib/choose_repository.tcl:36
> +#: git-gui.sh:2726 lib/choose_repository.tcl:53
>  msgid "Repository"
>  msgstr "Репозиторий"
>
> -#: git-gui.sh:2456
> +#: git-gui.sh:2727
>  msgid "Edit"
> -msgstr "Редактировать"
> +msgstr "Правка"
>
> -#: git-gui.sh:2458 lib/choose_rev.tcl:561
> +#: git-gui.sh:2729 lib/choose_rev.tcl:567
>  msgid "Branch"
>  msgstr "Ветка"
>
> -#: git-gui.sh:2461 lib/choose_rev.tcl:548
> +#: git-gui.sh:2732 lib/choose_rev.tcl:554
>  msgid "Commit@@noun"
>  msgstr "Коммит"
>
> -#: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
> +#: git-gui.sh:2735 lib/merge.tcl:127 lib/merge.tcl:174
>  msgid "Merge"
>  msgstr "Слияние"
>
> -#: git-gui.sh:2465 lib/choose_rev.tcl:557
> +#: git-gui.sh:2736 lib/choose_rev.tcl:563
>  msgid "Remote"
>  msgstr "Внешние репозитории"
>
> -#: git-gui.sh:2468
> +#: git-gui.sh:2739
>  msgid "Tools"
>  msgstr "Вспомогательные операции"
>
> -#: git-gui.sh:2477
> +#: git-gui.sh:2748
>  msgid "Explore Working Copy"
>  msgstr "Просмотр рабочего каталога"
>
> -#: git-gui.sh:2483
> +#: git-gui.sh:2763
> +msgid "Git Bash"
> +msgstr "Git Bash"
> +
> +#: git-gui.sh:2772
>  msgid "Browse Current Branch's Files"
>  msgstr "Просмотреть файлы текущей ветки"
>
> -#: git-gui.sh:2487
> +#: git-gui.sh:2776
>  msgid "Browse Branch Files..."
>  msgstr "Показать файлы ветки…"
>
> -#: git-gui.sh:2492
> +#: git-gui.sh:2781
>  msgid "Visualize Current Branch's History"
>  msgstr "Показать историю текущей ветки"
>
> -#: git-gui.sh:2496
> +#: git-gui.sh:2785
>  msgid "Visualize All Branch History"
>  msgstr "Показать историю всех веток"
>
> -#: git-gui.sh:2503
> +#: git-gui.sh:2792
>  #, tcl-format
>  msgid "Browse %s's Files"
>  msgstr "Показать файлы ветки %s"
>
> -#: git-gui.sh:2505
> +#: git-gui.sh:2794
>  #, tcl-format
>  msgid "Visualize %s's History"
>  msgstr "Показать историю ветки %s"
>
> -#: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67
> +#: git-gui.sh:2799 lib/database.tcl:40
>  msgid "Database Statistics"
>  msgstr "Статистика базы данных"
>
> -#: git-gui.sh:2513 lib/database.tcl:34
> +#: git-gui.sh:2802 lib/database.tcl:33
>  msgid "Compress Database"
>  msgstr "Сжать базу данных"
>
> -#: git-gui.sh:2516
> +#: git-gui.sh:2805
>  msgid "Verify Database"
>  msgstr "Проверить базу данных"
>
> -#: git-gui.sh:2523 git-gui.sh:2527 git-gui.sh:2531 lib/shortcut.tcl:8
> -#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
> +#: git-gui.sh:2812 git-gui.sh:2816 git-gui.sh:2820
>  msgid "Create Desktop Icon"
>  msgstr "Создать ярлык на рабочем столе"
>
> -#: git-gui.sh:2539 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191
> +#: git-gui.sh:2828 lib/choose_repository.tcl:209 lib/choose_repository.tcl:217
>  msgid "Quit"
>  msgstr "Выход"
>
> -#: git-gui.sh:2547
> +#: git-gui.sh:2836
>  msgid "Undo"
>  msgstr "Отменить"
>
> -#: git-gui.sh:2550
> +#: git-gui.sh:2839
>  msgid "Redo"
>  msgstr "Повторить"
>
> -#: git-gui.sh:2554 git-gui.sh:3109
> +#: git-gui.sh:2843 git-gui.sh:3461
>  msgid "Cut"
>  msgstr "Вырезать"
>
> -#: git-gui.sh:2557 git-gui.sh:3112 git-gui.sh:3186 git-gui.sh:3259
> +#: git-gui.sh:2846 git-gui.sh:3464 git-gui.sh:3540 git-gui.sh:3633
>  #: lib/console.tcl:69
>  msgid "Copy"
>  msgstr "Копировать"
>
> -#: git-gui.sh:2560 git-gui.sh:3115
> +#: git-gui.sh:2849 git-gui.sh:3467
>  msgid "Paste"
>  msgstr "Вставить"
>
> -#: git-gui.sh:2563 git-gui.sh:3118 lib/branch_delete.tcl:26
> -#: lib/remote_branch_delete.tcl:38
> +#: git-gui.sh:2852 git-gui.sh:3470 lib/remote_branch_delete.tcl:39
> +#: lib/branch_delete.tcl:28
>  msgid "Delete"
>  msgstr "Удалить"
>
> -#: git-gui.sh:2567 git-gui.sh:3122 git-gui.sh:3263 lib/console.tcl:71
> +#: git-gui.sh:2856 git-gui.sh:3474 git-gui.sh:3637 lib/console.tcl:71
>  msgid "Select All"
> -msgstr "Выделить все"
> +msgstr "Выделить всё"
>
> -#: git-gui.sh:2576
> +#: git-gui.sh:2865
>  msgid "Create..."
>  msgstr "Создать…"
>
> -#: git-gui.sh:2582
> +#: git-gui.sh:2871
>  msgid "Checkout..."
>  msgstr "Перейти…"
>
> -#: git-gui.sh:2588
> +#: git-gui.sh:2877
>  msgid "Rename..."
>  msgstr "Переименовать…"
>
> -#: git-gui.sh:2593
> +#: git-gui.sh:2882
>  msgid "Delete..."
>  msgstr "Удалить…"
>
> -#: git-gui.sh:2598
> +#: git-gui.sh:2887
>  msgid "Reset..."
>  msgstr "Сбросить…"
>
> -#: git-gui.sh:2608
> +#: git-gui.sh:2897
>  msgid "Done"
>  msgstr "Завершено"
>
> -#: git-gui.sh:2610
> +#: git-gui.sh:2899
>  msgid "Commit@@verb"
>  msgstr "Закоммитить"
>
> -#: git-gui.sh:2619 git-gui.sh:3050
> -msgid "New Commit"
> -msgstr "Новый коммит"
> -
> -#: git-gui.sh:2627 git-gui.sh:3057
> +#: git-gui.sh:2908 git-gui.sh:3400
>  msgid "Amend Last Commit"
>  msgstr "Исправить последний коммит"
>
> -#: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99
> +#: git-gui.sh:2918 git-gui.sh:3361 lib/remote_branch_delete.tcl:101
>  msgid "Rescan"
>  msgstr "Перечитать"
>
> -#: git-gui.sh:2643
> +#: git-gui.sh:2924
>  msgid "Stage To Commit"
>  msgstr "Добавить в индекс"
>
> -#: git-gui.sh:2649
> +#: git-gui.sh:2930
>  msgid "Stage Changed Files To Commit"
>  msgstr "Добавить изменённые файлы в индекс"
>
> -#: git-gui.sh:2655
> +#: git-gui.sh:2936
>  msgid "Unstage From Commit"
>  msgstr "Убрать из издекса"
>
> -#: git-gui.sh:2661 lib/index.tcl:412
> +#: git-gui.sh:2942 lib/index.tcl:521
>  msgid "Revert Changes"
>  msgstr "Обратить изменения"
>
> -#: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341
> +#: git-gui.sh:2950 git-gui.sh:3700 git-gui.sh:3731
>  msgid "Show Less Context"
>  msgstr "Меньше контекста"
>
> -#: git-gui.sh:2673 git-gui.sh:3314 git-gui.sh:3345
> +#: git-gui.sh:2954 git-gui.sh:3704 git-gui.sh:3735
>  msgid "Show More Context"
>  msgstr "Больше контекста"
>
> -#: git-gui.sh:2680 git-gui.sh:3024 git-gui.sh:3133
> +#: git-gui.sh:2961 git-gui.sh:3374 git-gui.sh:3485
>  msgid "Sign Off"
>  msgstr "Вставить Signed-off-by"
>
> -#: git-gui.sh:2696
> +#: git-gui.sh:2977
>  msgid "Local Merge..."
>  msgstr "Локальное слияние…"
>
> -#: git-gui.sh:2701
> +#: git-gui.sh:2982
>  msgid "Abort Merge..."
>  msgstr "Прервать слияние…"
>
> -#: git-gui.sh:2713 git-gui.sh:2741
> +#: git-gui.sh:2994 git-gui.sh:3022
>  msgid "Add..."
>  msgstr "Добавить…"
>
> -#: git-gui.sh:2717
> +#: git-gui.sh:2998
>  msgid "Push..."
>  msgstr "Отправить…"
>
> -#: git-gui.sh:2721
> +#: git-gui.sh:3002
>  msgid "Delete Branch..."
>  msgstr "Удалить ветку…"
>
> -#: git-gui.sh:2731 git-gui.sh:3292
> +#: git-gui.sh:3012 git-gui.sh:3666
>  msgid "Options..."
>  msgstr "Настройки…"
>
> -#: git-gui.sh:2742
> +#: git-gui.sh:3023
>  msgid "Remove..."
>  msgstr "Удалить…"
>
> -#: git-gui.sh:2751 lib/choose_repository.tcl:50
> +#: git-gui.sh:3032 lib/choose_repository.tcl:67
>  msgid "Help"
> -msgstr "Помощь"
> +msgstr "Справка"
>
> -#: git-gui.sh:2755 git-gui.sh:2759 lib/about.tcl:14
> -#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53
> +#: git-gui.sh:3036 git-gui.sh:3040 lib/choose_repository.tcl:61
> +#: lib/choose_repository.tcl:70 lib/about.tcl:14
>  #, tcl-format
>  msgid "About %s"
>  msgstr "О %s"
>
> -#: git-gui.sh:2783
> +#: git-gui.sh:3064
>  msgid "Online Documentation"
>  msgstr "Документация в интернете"
>
> -#: git-gui.sh:2786 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
> +#: git-gui.sh:3067 lib/choose_repository.tcl:64 lib/choose_repository.tcl:73
>  msgid "Show SSH Key"
>  msgstr "Показать ключ SSH"
>
> -#: git-gui.sh:2893
> +#: git-gui.sh:3097 git-gui.sh:3229
> +msgid "usage:"
> +msgstr "использование:"
> +
> +#: git-gui.sh:3101 git-gui.sh:3233
> +msgid "Usage"
> +msgstr "Использование"
> +
> +#: git-gui.sh:3182 lib/blame.tcl:575
> +msgid "Error"
> +msgstr "Ошибка"
> +
> +#: git-gui.sh:3213
>  #, tcl-format
>  msgid "fatal: cannot stat path %s: No such file or directory"
>  msgstr "критическая ошибка: %s: нет такого файла или каталога"
>
> -#: git-gui.sh:2926
> +#: git-gui.sh:3246
>  msgid "Current Branch:"
>  msgstr "Текущая ветка:"
>
> -#: git-gui.sh:2947
> -msgid "Staged Changes (Will Commit)"
> -msgstr "Изменения в индексе (будут закоммичены)"
> -
> -#: git-gui.sh:2967
> +#: git-gui.sh:3271
>  msgid "Unstaged Changes"
>  msgstr "Изменено (не будет сохранено)"
>
> -#: git-gui.sh:3017
> +#: git-gui.sh:3293
> +msgid "Staged Changes (Will Commit)"
> +msgstr "Изменения в индексе (будут закоммичены)"
> +
> +#: git-gui.sh:3367
>  msgid "Stage Changed"
>  msgstr "Индексировать всё"
>
> -#: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193
> +#: git-gui.sh:3386 lib/transport.tcl:137
>  msgid "Push"
>  msgstr "Отправить"
>
> -#: git-gui.sh:3071
> +#: git-gui.sh:3413
>  msgid "Initial Commit Message:"
>  msgstr "Сообщение первого коммита:"
>
> -#: git-gui.sh:3072
> +#: git-gui.sh:3414
>  msgid "Amended Commit Message:"
>  msgstr "Сообщение исправленного коммита:"
>
> -#: git-gui.sh:3073
> +#: git-gui.sh:3415
>  msgid "Amended Initial Commit Message:"
>  msgstr "Сообщение исправленного первого коммита:"
>
> -#: git-gui.sh:3074
> +#: git-gui.sh:3416
>  msgid "Amended Merge Commit Message:"
>  msgstr "Сообщение исправленного слияния:"
>
> -#: git-gui.sh:3075
> +#: git-gui.sh:3417
>  msgid "Merge Commit Message:"
>  msgstr "Сообщение слияния:"
>
> -#: git-gui.sh:3076
> +#: git-gui.sh:3418
>  msgid "Commit Message:"
>  msgstr "Сообщение коммита:"
>
> -#: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73
> +#: git-gui.sh:3477 git-gui.sh:3641 lib/console.tcl:73
>  msgid "Copy All"
>  msgstr "Копировать все"
>
> -#: git-gui.sh:3149 lib/blame.tcl:104
> +#: git-gui.sh:3501 lib/blame.tcl:106
>  msgid "File:"
>  msgstr "Файл:"
>
> -#: git-gui.sh:3255
> +#: git-gui.sh:3549 lib/choose_repository.tcl:1100
> +msgid "Open"
> +msgstr "Открыть"
> +
> +#: git-gui.sh:3629
>  msgid "Refresh"
>  msgstr "Обновить"
>
> -#: git-gui.sh:3276
> +#: git-gui.sh:3650
>  msgid "Decrease Font Size"
>  msgstr "Уменьшить размер шрифта"
>
> -#: git-gui.sh:3280
> +#: git-gui.sh:3654
>  msgid "Increase Font Size"
>  msgstr "Увеличить размер шрифта"
>
> -#: git-gui.sh:3288 lib/blame.tcl:281
> +#: git-gui.sh:3662 lib/blame.tcl:296
>  msgid "Encoding"
>  msgstr "Кодировка"
>
> -#: git-gui.sh:3299
> +#: git-gui.sh:3673
>  msgid "Apply/Reverse Hunk"
>  msgstr "Применить/Убрать изменение"
>
> -#: git-gui.sh:3304
> +#: git-gui.sh:3678
>  msgid "Apply/Reverse Line"
>  msgstr "Применить/Убрать строку"
>
> -#: git-gui.sh:3323
> +#: git-gui.sh:3684 git-gui.sh:3794 git-gui.sh:3805
> +msgid "Revert Hunk"
> +msgstr "Обратить изменения блока"
> +
> +#: git-gui.sh:3689 git-gui.sh:3801 git-gui.sh:3812
> +msgid "Revert Line"
> +msgstr "Обратить изменения строки"
> +
> +#: git-gui.sh:3694 git-gui.sh:3791
> +msgid "Undo Last Revert"
> +msgstr "Отменить последнее обращение изменений"
> +
> +#: git-gui.sh:3713
>  msgid "Run Merge Tool"
>  msgstr "Запустить программу слияния"
>
> -#: git-gui.sh:3328
> +#: git-gui.sh:3718
>  msgid "Use Remote Version"
>  msgstr "Взять внешнюю версию"
>
> -#: git-gui.sh:3332
> +#: git-gui.sh:3722
>  msgid "Use Local Version"
>  msgstr "Взять локальную версию"
>
> -#: git-gui.sh:3336
> +#: git-gui.sh:3726
>  msgid "Revert To Base"
>  msgstr "Обратить изменения"
>
> -#: git-gui.sh:3354
> +#: git-gui.sh:3744
>  msgid "Visualize These Changes In The Submodule"
>  msgstr "Показать эти изменения подмодуля"
>
> -#: git-gui.sh:3358
> +#: git-gui.sh:3748
>  msgid "Visualize Current Branch History In The Submodule"
>  msgstr "Показать историю текущей ветки подмодуля"
>
> -#: git-gui.sh:3362
> +#: git-gui.sh:3752
>  msgid "Visualize All Branch History In The Submodule"
>  msgstr "Показать историю всех веток подмодуля"
>
> -#: git-gui.sh:3367
> +#: git-gui.sh:3757
>  msgid "Start git gui In The Submodule"
>  msgstr "Запустить git gui в подмодуле"
>
> -#: git-gui.sh:3389
> +#: git-gui.sh:3793
>  msgid "Unstage Hunk From Commit"
>  msgstr "Убрать блок из индекса"
>
> -#: git-gui.sh:3391
> +#: git-gui.sh:3797
>  msgid "Unstage Lines From Commit"
>  msgstr "Убрать строки из индекса"
>
> -#: git-gui.sh:3393
> +#: git-gui.sh:3798 git-gui.sh:3809
> +msgid "Revert Lines"
> +msgstr "Обратить изменения строк"
> +
> +#: git-gui.sh:3800
>  msgid "Unstage Line From Commit"
>  msgstr "Убрать строку из индекса"
>
> -#: git-gui.sh:3396
> +#: git-gui.sh:3804
>  msgid "Stage Hunk For Commit"
>  msgstr "Добавить блок в индекс"
>
> -#: git-gui.sh:3398
> +#: git-gui.sh:3808
>  msgid "Stage Lines For Commit"
>  msgstr "Добавить строки в индекс"
>
> -#: git-gui.sh:3400
> +#: git-gui.sh:3811
>  msgid "Stage Line For Commit"
>  msgstr "Добавить строку в индекс"
>
> -#: git-gui.sh:3424
> +#: git-gui.sh:3861
>  msgid "Initializing..."
>  msgstr "Инициализация…"
>
> -#: git-gui.sh:3541
> +#: git-gui.sh:4017
>  #, tcl-format
>  msgid ""
>  "Possible environment issues exist.\n"
> @@ -533,14 +579,14 @@ msgid ""
>  "\n"
>  msgstr "Возможны ошибки в переменных окружения.\n\nПеременные окружения, которые возможно\nбудут проигнорированы командами Git,\nзапущенными из %s\n\n"
>
> -#: git-gui.sh:3570
> +#: git-gui.sh:4046
>  msgid ""
>  "\n"
>  "This is due to a known issue with the\n"
>  "Tcl binary distributed by Cygwin."
>  msgstr "\nЭто известная проблема с Tcl,\nраспространяемым Cygwin."
>
> -#: git-gui.sh:3575
> +#: git-gui.sh:4051
>  #, tcl-format
>  msgid ""
>  "\n"
> @@ -551,357 +597,201 @@ msgid ""
>  "~/.gitconfig file.\n"
>  msgstr "\n\nВместо использования %s можно\nсохранить значения user.name и\nuser.email в Вашем персональном\nфайле ~/.gitconfig.\n"
>
> -#: lib/about.tcl:26
> -msgid "git-gui - a graphical user interface for Git."
> -msgstr "git-gui - графический пользовательский интерфейс к Git."
> -
> -#: lib/blame.tcl:72
> -msgid "File Viewer"
> -msgstr "Просмотр файла"
> -
> -#: lib/blame.tcl:78
> -msgid "Commit:"
> -msgstr "Коммит:"
> -
> -#: lib/blame.tcl:271
> -msgid "Copy Commit"
> -msgstr "Копировать SHA-1"
> -
> -#: lib/blame.tcl:275
> -msgid "Find Text..."
> -msgstr "Найти текст…"
> -
> -#: lib/blame.tcl:284
> -msgid "Do Full Copy Detection"
> -msgstr "Провести полный поиск копий"
> +#: lib/spellcheck.tcl:57
> +msgid "Unsupported spell checker"
> +msgstr "Неподдерживаемая программа проверки правописания"
>
> -#: lib/blame.tcl:288
> -msgid "Show History Context"
> -msgstr "Показать исторический контекст"
> +#: lib/spellcheck.tcl:65
> +msgid "Spell checking is unavailable"
> +msgstr "Проверка правописания не доступна"
>
> -#: lib/blame.tcl:291
> -msgid "Blame Parent Commit"
> -msgstr "Авторы родительского коммита"
> +#: lib/spellcheck.tcl:68
> +msgid "Invalid spell checking configuration"
> +msgstr "Неправильная конфигурация программы проверки правописания"
>
> -#: lib/blame.tcl:450
> +#: lib/spellcheck.tcl:70
>  #, tcl-format
> -msgid "Reading %s..."
> -msgstr "Чтение %s…"
> -
> -#: lib/blame.tcl:557
> -msgid "Loading copy/move tracking annotations..."
> -msgstr "Загрузка аннотации копирований/переименований…"
> -
> -#: lib/blame.tcl:577
> -msgid "lines annotated"
> -msgstr "строк прокомментировано"
> +msgid "Reverting dictionary to %s."
> +msgstr "Словарь вернут к %s."
>
> -#: lib/blame.tcl:769
> -msgid "Loading original location annotations..."
> -msgstr "Загрузка аннотаций первоначального положения объекта…"
> +#: lib/spellcheck.tcl:73
> +msgid "Spell checker silently failed on startup"
> +msgstr "Программа проверки правописания не смогла запуститься"
>
> -#: lib/blame.tcl:772
> -msgid "Annotation complete."
> -msgstr "Аннотация завершена."
> +#: lib/spellcheck.tcl:80
> +msgid "Unrecognized spell checker"
> +msgstr "Нераспознанная программа проверки правописания"
>
> -#: lib/blame.tcl:802
> -msgid "Busy"
> -msgstr "Занят"
> +#: lib/spellcheck.tcl:186
> +msgid "No Suggestions"
> +msgstr "Исправлений не найдено"
>
> -#: lib/blame.tcl:803
> -msgid "Annotation process is already running."
> -msgstr "Аннотация уже запущена"
> +#: lib/spellcheck.tcl:388
> +msgid "Unexpected EOF from spell checker"
> +msgstr "Программа проверки правописания прервала передачу данных"
>
> -#: lib/blame.tcl:842
> -msgid "Running thorough copy detection..."
> -msgstr "Выполнение полного поиска копий…"
> +#: lib/spellcheck.tcl:392
> +msgid "Spell Checker Failed"
> +msgstr "Ошибка проверки правописания"
>
> -#: lib/blame.tcl:910
> -msgid "Loading annotation..."
> -msgstr "Загрузка аннотации…"
> +#: lib/transport.tcl:6 lib/remote_add.tcl:132
> +#, tcl-format
> +msgid "fetch %s"
> +msgstr "извлечение %s"
>
> -#: lib/blame.tcl:963
> -msgid "Author:"
> -msgstr "Автор:"
> +#: lib/transport.tcl:7
> +#, tcl-format
> +msgid "Fetching new changes from %s"
> +msgstr "Извлечение изменений из %s "
>
> -#: lib/blame.tcl:967
> -msgid "Committer:"
> -msgstr "Коммитер:"
> +#: lib/transport.tcl:18
> +#, tcl-format
> +msgid "remote prune %s"
> +msgstr "чистка внешнего %s"
>
> -#: lib/blame.tcl:972
> -msgid "Original File:"
> -msgstr "Исходный файл:"
> +#: lib/transport.tcl:19
> +#, tcl-format
> +msgid "Pruning tracking branches deleted from %s"
> +msgstr "Чистка отслеживаемых веток, удалённых из %s"
>
> -#: lib/blame.tcl:1020
> -msgid "Cannot find HEAD commit:"
> -msgstr "Не удалось найти текущее состояние:"
> +#: lib/transport.tcl:25
> +msgid "fetch all remotes"
> +msgstr "извлечь со всех внешних репозиториев"
>
> -#: lib/blame.tcl:1075
> -msgid "Cannot find parent commit:"
> -msgstr "Не удалось найти родительское состояние:"
> +#: lib/transport.tcl:26
> +msgid "Fetching new changes from all remotes"
> +msgstr "Получение изменений со всех внешних репозиториев"
>
> -#: lib/blame.tcl:1090
> -msgid "Unable to display parent"
> -msgstr "Не могу показать предка"
> +#: lib/transport.tcl:40
> +msgid "remote prune all remotes"
> +msgstr "чистка всех внешних репозиториев"
>
> -#: lib/blame.tcl:1091 lib/diff.tcl:320
> -msgid "Error loading diff:"
> -msgstr "Ошибка загрузки изменений:"
> +#: lib/transport.tcl:41
> +msgid "Pruning tracking branches deleted from all remotes"
> +msgstr "Чистка отслеживаемых веток, удалённых со всех внешних репозиториев"
>
> -#: lib/blame.tcl:1231
> -msgid "Originally By:"
> -msgstr "Источник:"
> +#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110
> +#: lib/remote_add.tcl:162
> +#, tcl-format
> +msgid "push %s"
> +msgstr "отправить %s"
>
> -#: lib/blame.tcl:1237
> -msgid "In File:"
> -msgstr "Файл:"
> +#: lib/transport.tcl:55
> +#, tcl-format
> +msgid "Pushing changes to %s"
> +msgstr "Отправка изменений в %s "
>
> -#: lib/blame.tcl:1242
> -msgid "Copied Or Moved Here By:"
> -msgstr "Скопировано/перемещено в:"
> +#: lib/transport.tcl:93
> +#, tcl-format
> +msgid "Mirroring to %s"
> +msgstr "Точное копирование в %s"
>
> -#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
> -msgid "Checkout Branch"
> -msgstr "Перейти на ветку"
> +#: lib/transport.tcl:111
> +#, tcl-format
> +msgid "Pushing %s %s to %s"
> +msgstr "Отправка %s %s в %s"
>
> -#: lib/branch_checkout.tcl:23
> -msgid "Checkout"
> -msgstr "Перейти"
> +#: lib/transport.tcl:132
> +msgid "Push Branches"
> +msgstr "Отправить ветки"
>
> -#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35
> -#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282
> -#: lib/checkout_op.tcl:579 lib/choose_font.tcl:43 lib/merge.tcl:172
> -#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42
> -#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352
> -#: lib/transport.tcl:108
> +#: lib/transport.tcl:141 lib/checkout_op.tcl:580 lib/remote_add.tcl:34
> +#: lib/browser.tcl:292 lib/branch_checkout.tcl:30 lib/branch_rename.tcl:32
> +#: lib/choose_font.tcl:45 lib/option.tcl:127 lib/tools_dlg.tcl:41
> +#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43
> +#: lib/branch_create.tcl:37 lib/branch_delete.tcl:34 lib/merge.tcl:178
>  msgid "Cancel"
>  msgstr "Отмена"
>
> -#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328
> -msgid "Revision"
> -msgstr "Версия"
> -
> -#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280
> -msgid "Options"
> -msgstr "Настройки"
> -
> -#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
> -msgid "Fetch Tracking Branch"
> -msgstr "Извлечь изменения из внешней ветки"
> +#: lib/transport.tcl:147
> +msgid "Source Branches"
> +msgstr "Исходные ветки"
>
> -#: lib/branch_checkout.tcl:44
> -msgid "Detach From Local Branch"
> -msgstr "Отсоединить от локальной ветки"
> +#: lib/transport.tcl:162
> +msgid "Destination Repository"
> +msgstr "Репозиторий назначения"
>
> -#: lib/branch_create.tcl:22
> -msgid "Create Branch"
> -msgstr "Создать ветку"
> +#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51
> +msgid "Remote:"
> +msgstr "внешний:"
>
> -#: lib/branch_create.tcl:27
> -msgid "Create New Branch"
> -msgstr "Создать новую ветку"
> +#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72
> +msgid "Arbitrary Location:"
> +msgstr "Указанное положение:"
>
> -#: lib/branch_create.tcl:31 lib/choose_repository.tcl:381
> -msgid "Create"
> -msgstr "Создать"
> +#: lib/transport.tcl:205
> +msgid "Transfer Options"
> +msgstr "Настройки отправки"
>
> -#: lib/branch_create.tcl:40
> -msgid "Branch Name"
> -msgstr "Имя ветки"
> +#: lib/transport.tcl:207
> +msgid "Force overwrite existing branch (may discard changes)"
> +msgstr "Принудительно перезаписать существующую ветку (возможна потеря изменений)"
>
> -#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50
> -msgid "Name:"
> -msgstr "Название:"
> +#: lib/transport.tcl:211
> +msgid "Use thin pack (for slow network connections)"
> +msgstr "Использовать thin pack (для медленных сетевых подключений)"
>
> -#: lib/branch_create.tcl:58
> -msgid "Match Tracking Branch Name"
> -msgstr "Соответствовать имени отслеживаемой ветки"
> +#: lib/transport.tcl:215
> +msgid "Include tags"
> +msgstr "Передать метки"
>
> -#: lib/branch_create.tcl:66
> -msgid "Starting Revision"
> -msgstr "Начальная версия"
> +#: lib/transport.tcl:229
> +#, tcl-format
> +msgid "%s (%s): Push"
> +msgstr "%s (%s): Отправка"
>
> -#: lib/branch_create.tcl:72
> -msgid "Update Existing Branch:"
> -msgstr "Обновить имеющуюся ветку:"
> +#: lib/checkout_op.tcl:85
> +#, tcl-format
> +msgid "Fetching %s from %s"
> +msgstr "Извлечение %s из %s "
>
> -#: lib/branch_create.tcl:75
> -msgid "No"
> -msgstr "Нет"
> +#: lib/checkout_op.tcl:133
> +#, tcl-format
> +msgid "fatal: Cannot resolve %s"
> +msgstr "критическая ошибка: невозможно разрешить %s"
>
> -#: lib/branch_create.tcl:80
> -msgid "Fast Forward Only"
> -msgstr "Только Fast Forward"
> +#: lib/checkout_op.tcl:146 lib/sshkey.tcl:58 lib/console.tcl:81
> +#: lib/database.tcl:30
> +msgid "Close"
> +msgstr "Закрыть"
>
> -#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571
> -msgid "Reset"
> -msgstr "Сброс"
> +#: lib/checkout_op.tcl:175
> +#, tcl-format
> +msgid "Branch '%s' does not exist."
> +msgstr "Ветка «%s» не существует."
>
> -#: lib/branch_create.tcl:97
> -msgid "Checkout After Creation"
> -msgstr "После создания сделать текущей"
> +#: lib/checkout_op.tcl:194
> +#, tcl-format
> +msgid "Failed to configure simplified git-pull for '%s'."
> +msgstr "Ошибка создания упрощённой конфигурации git pull для «%s»."
>
> -#: lib/branch_create.tcl:131
> -msgid "Please select a tracking branch."
> -msgstr "Укажите отлеживаемую ветку."
> +#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102
> +#, tcl-format
> +msgid "Branch '%s' already exists."
> +msgstr "Ветка «%s» уже существует."
>
> -#: lib/branch_create.tcl:140
> +#: lib/checkout_op.tcl:229
>  #, tcl-format
> -msgid "Tracking branch %s is not a branch in the remote repository."
> -msgstr "Отслеживаемая ветка %s не является веткой на внешнем репозитории."
> +msgid ""
> +"Branch '%s' already exists.\n"
> +"\n"
> +"It cannot fast-forward to %s.\n"
> +"A merge is required."
> +msgstr "Ветка «%s» уже существует.\n\nОна не может быть перемотана вперед к %s.\nТребуется слияние."
>
> -#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
> -msgid "Please supply a branch name."
> -msgstr "Укажите имя ветки."
> +#: lib/checkout_op.tcl:243
> +#, tcl-format
> +msgid "Merge strategy '%s' not supported."
> +msgstr "Неизвестная стратегия слияния «%s»."
>
> -#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
> +#: lib/checkout_op.tcl:262
>  #, tcl-format
> -msgid "'%s' is not an acceptable branch name."
> -msgstr "Недопустимое имя ветки «%s»."
> +msgid "Failed to update '%s'."
> +msgstr "Не удалось обновить «%s»."
>
> -#: lib/branch_delete.tcl:15
> -msgid "Delete Branch"
> -msgstr "Удаление ветки"
> -
> -#: lib/branch_delete.tcl:20
> -msgid "Delete Local Branch"
> -msgstr "Удалить локальную ветку"
> -
> -#: lib/branch_delete.tcl:37
> -msgid "Local Branches"
> -msgstr "Локальные ветки"
> -
> -#: lib/branch_delete.tcl:52
> -msgid "Delete Only If Merged Into"
> -msgstr "Удалить только в случае, если было слияние с"
> -
> -#: lib/branch_delete.tcl:54 lib/remote_branch_delete.tcl:119
> -msgid "Always (Do not perform merge checks)"
> -msgstr "Всегда (не выполнять проверку на слияние)"
> -
> -#: lib/branch_delete.tcl:103
> -#, tcl-format
> -msgid "The following branches are not completely merged into %s:"
> -msgstr "Ветки, которые не полностью сливаются с %s:"
> -
> -#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:217
> -msgid ""
> -"Recovering deleted branches is difficult.\n"
> -"\n"
> -"Delete the selected branches?"
> -msgstr "Восстановить удаленные ветки сложно.\n\nПродолжить?"
> -
> -#: lib/branch_delete.tcl:141
> -#, tcl-format
> -msgid ""
> -"Failed to delete branches:\n"
> -"%s"
> -msgstr "Не удалось удалить ветки:\n%s"
> -
> -#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
> -msgid "Rename Branch"
> -msgstr "Переименование ветки"
> -
> -#: lib/branch_rename.tcl:26
> -msgid "Rename"
> -msgstr "Переименовать"
> -
> -#: lib/branch_rename.tcl:36
> -msgid "Branch:"
> -msgstr "Ветка:"
> -
> -#: lib/branch_rename.tcl:39
> -msgid "New Name:"
> -msgstr "Новое название:"
> -
> -#: lib/branch_rename.tcl:75
> -msgid "Please select a branch to rename."
> -msgstr "Укажите ветку для переименования."
> -
> -#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202
> -#, tcl-format
> -msgid "Branch '%s' already exists."
> -msgstr "Ветка «%s» уже существует."
> -
> -#: lib/branch_rename.tcl:117
> -#, tcl-format
> -msgid "Failed to rename '%s'."
> -msgstr "Не удалось переименовать «%s». "
> -
> -#: lib/browser.tcl:17
> -msgid "Starting..."
> -msgstr "Запуск…"
> -
> -#: lib/browser.tcl:26
> -msgid "File Browser"
> -msgstr "Просмотр списка файлов"
> -
> -#: lib/browser.tcl:126 lib/browser.tcl:143
> -#, tcl-format
> -msgid "Loading %s..."
> -msgstr "Загрузка %s…"
> -
> -#: lib/browser.tcl:187
> -msgid "[Up To Parent]"
> -msgstr "[На уровень выше]"
> -
> -#: lib/browser.tcl:267 lib/browser.tcl:273
> -msgid "Browse Branch Files"
> -msgstr "Показать файлы ветки"
> -
> -#: lib/browser.tcl:278 lib/choose_repository.tcl:398
> -#: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497
> -#: lib/choose_repository.tcl:1028
> -msgid "Browse"
> -msgstr "Показать"
> -
> -#: lib/checkout_op.tcl:85
> -#, tcl-format
> -msgid "Fetching %s from %s"
> -msgstr "Извлечение %s из %s "
> -
> -#: lib/checkout_op.tcl:133
> -#, tcl-format
> -msgid "fatal: Cannot resolve %s"
> -msgstr "критическая ошибка: невозможно разрешить %s"
> -
> -#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:31
> -#: lib/sshkey.tcl:53
> -msgid "Close"
> -msgstr "Закрыть"
> -
> -#: lib/checkout_op.tcl:175
> -#, tcl-format
> -msgid "Branch '%s' does not exist."
> -msgstr "Ветка «%s» не существует."
> -
> -#: lib/checkout_op.tcl:194
> -#, tcl-format
> -msgid "Failed to configure simplified git-pull for '%s'."
> -msgstr "Ошибка создания упрощённой конфигурации git pull для «%s»."
> -
> -#: lib/checkout_op.tcl:229
> -#, tcl-format
> -msgid ""
> -"Branch '%s' already exists.\n"
> -"\n"
> -"It cannot fast-forward to %s.\n"
> -"A merge is required."
> -msgstr "Ветка «%s» уже существует.\n\nОна не может быть перемотана вперед к %s.\nТребуется слияние."
> -
> -#: lib/checkout_op.tcl:243
> -#, tcl-format
> -msgid "Merge strategy '%s' not supported."
> -msgstr "Неизвестная стратегия слияния «%s»."
> -
> -#: lib/checkout_op.tcl:262
> -#, tcl-format
> -msgid "Failed to update '%s'."
> -msgstr "Не удалось обновить «%s»."
> -
> -#: lib/checkout_op.tcl:274
> -msgid "Staging area (index) is already locked."
> -msgstr "Рабочая область заблокирована другим процессом."
> +#: lib/checkout_op.tcl:274
> +msgid "Staging area (index) is already locked."
> +msgstr "Рабочая область заблокирована другим процессом."
>
>  #: lib/checkout_op.tcl:289
>  msgid ""
> @@ -921,51 +811,55 @@ msgstr "Обновление рабочего каталога из «%s»…"
>  msgid "files checked out"
>  msgstr "файлы извлечены"
>
> -#: lib/checkout_op.tcl:376
> +#: lib/checkout_op.tcl:377
>  #, tcl-format
>  msgid "Aborted checkout of '%s' (file level merging is required)."
>  msgstr "Прерван переход на «%s» (требуется слияние содержимого файлов)"
>
> -#: lib/checkout_op.tcl:377
> +#: lib/checkout_op.tcl:378
>  msgid "File level merge required."
>  msgstr "Требуется слияние содержания файлов."
>
> -#: lib/checkout_op.tcl:381
> +#: lib/checkout_op.tcl:382
>  #, tcl-format
>  msgid "Staying on branch '%s'."
>  msgstr "Ветка «%s» остаётся текущей."
>
> -#: lib/checkout_op.tcl:452
> +#: lib/checkout_op.tcl:453
>  msgid ""
>  "You are no longer on a local branch.\n"
>  "\n"
>  "If you wanted to be on a branch, create one now starting from 'This Detached Checkout'."
>  msgstr "Вы более не находитесь на локальной ветке.\n\nЕсли вы хотите снова вернуться к какой-нибудь ветке, создайте её сейчас, начиная с «Текущего отсоединенного состояния»."
>
> -#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
> +#: lib/checkout_op.tcl:504 lib/checkout_op.tcl:508
>  #, tcl-format
>  msgid "Checked out '%s'."
>  msgstr "Выполнен переход на «%s»."
>
> -#: lib/checkout_op.tcl:535
> +#: lib/checkout_op.tcl:536
>  #, tcl-format
>  msgid "Resetting '%s' to '%s' will lose the following commits:"
>  msgstr "Сброс «%s»  на «%s» приведет к потере следующих коммитов:"
>
> -#: lib/checkout_op.tcl:557
> +#: lib/checkout_op.tcl:558
>  msgid "Recovering lost commits may not be easy."
>  msgstr "Восстановить потерянные коммиты будет сложно."
>
> -#: lib/checkout_op.tcl:562
> +#: lib/checkout_op.tcl:563
>  #, tcl-format
>  msgid "Reset '%s'?"
>  msgstr "Сбросить «%s»?"
>
> -#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343
> +#: lib/checkout_op.tcl:568 lib/tools_dlg.tcl:336 lib/merge.tcl:170
>  msgid "Visualize"
>  msgstr "Наглядно"
>
> -#: lib/checkout_op.tcl:635
> +#: lib/checkout_op.tcl:572 lib/branch_create.tcl:85
> +msgid "Reset"
> +msgstr "Сброс"
> +
> +#: lib/checkout_op.tcl:636
>  #, tcl-format
>  msgid ""
>  "Failed to set current branch.\n"
> @@ -975,576 +869,498 @@ msgid ""
>  "This should not have occurred.  %s will now close and give up."
>  msgstr "Не удалось установить текущую ветку.\n\nВаш рабочий каталог обновлён только частично. Были обновлены все файлы кроме служебных файлов Git. \n\nЭтого не должно было произойти. %s завершается."
>
> -#: lib/choose_font.tcl:39
> -msgid "Select"
> -msgstr "Выбрать"
> +#: lib/remote_add.tcl:20
> +#, tcl-format
> +msgid "%s (%s): Add Remote"
> +msgstr "%s (%s): Добавление внешнего репозитория"
>
> -#: lib/choose_font.tcl:53
> -msgid "Font Family"
> -msgstr "Шрифт"
> +#: lib/remote_add.tcl:25
> +msgid "Add New Remote"
> +msgstr "Добавить внешний репозиторий"
>
> -#: lib/choose_font.tcl:74
> -msgid "Font Size"
> -msgstr "Размер шрифта"
> +#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
> +msgid "Add"
> +msgstr "Добавить"
>
> -#: lib/choose_font.tcl:91
> -msgid "Font Example"
> -msgstr "Пример текста"
> +#: lib/remote_add.tcl:39
> +msgid "Remote Details"
> +msgstr "Информация о внешнем репозитории"
>
> -#: lib/choose_font.tcl:103
> -msgid ""
> -"This is example text.\n"
> -"If you like this text, it can be your font."
> -msgstr "Это пример текста.\nЕсли Вам нравится этот текст, это может быть Ваш шрифт."
> +#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44
> +msgid "Name:"
> +msgstr "Название:"
>
> -#: lib/choose_repository.tcl:28
> -msgid "Git Gui"
> -msgstr "Git Gui"
> +#: lib/remote_add.tcl:50
> +msgid "Location:"
> +msgstr "Положение:"
>
> -#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:386
> -msgid "Create New Repository"
> -msgstr "Создать новый репозиторий"
> +#: lib/remote_add.tcl:60
> +msgid "Further Action"
> +msgstr "Следующая операция"
>
> -#: lib/choose_repository.tcl:93
> -msgid "New..."
> -msgstr "Новый…"
> +#: lib/remote_add.tcl:63
> +msgid "Fetch Immediately"
> +msgstr "Сразу извлечь изменения"
>
> -#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471
> -msgid "Clone Existing Repository"
> -msgstr "Склонировать существующий репозиторий"
> +#: lib/remote_add.tcl:69
> +msgid "Initialize Remote Repository and Push"
> +msgstr "Инициализировать внешний репозиторий и отправить"
>
> -#: lib/choose_repository.tcl:106
> -msgid "Clone..."
> -msgstr "Клонировать…"
> +#: lib/remote_add.tcl:75
> +msgid "Do Nothing Else Now"
> +msgstr "Больше ничего не делать"
>
> -#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016
> -msgid "Open Existing Repository"
> -msgstr "Выбрать существующий репозиторий"
> +#: lib/remote_add.tcl:100
> +msgid "Please supply a remote name."
> +msgstr "Укажите название внешнего репозитория."
>
> -#: lib/choose_repository.tcl:119
> -msgid "Open..."
> -msgstr "Открыть…"
> +#: lib/remote_add.tcl:113
> +#, tcl-format
> +msgid "'%s' is not an acceptable remote name."
> +msgstr "«%s» не является допустимым именем внешнего репозитория."
>
> -#: lib/choose_repository.tcl:132
> -msgid "Recent Repositories"
> -msgstr "Недавние репозитории"
> +#: lib/remote_add.tcl:124
> +#, tcl-format
> +msgid "Failed to add remote '%s' of location '%s'."
> +msgstr "Не удалось добавить «%s» из «%s». "
>
> -#: lib/choose_repository.tcl:138
> -msgid "Open Recent Repository:"
> -msgstr "Открыть последний репозиторий"
> +#: lib/remote_add.tcl:133
> +#, tcl-format
> +msgid "Fetching the %s"
> +msgstr "Извлечение %s"
>
> -#: lib/choose_repository.tcl:306 lib/choose_repository.tcl:313
> -#: lib/choose_repository.tcl:320
> +#: lib/remote_add.tcl:156
>  #, tcl-format
> -msgid "Failed to create repository %s:"
> -msgstr "Не удалось создать репозиторий %s:"
> +msgid "Do not know how to initialize repository at location '%s'."
> +msgstr "Невозможно инициализировать репозиторий в «%s»."
>
> -#: lib/choose_repository.tcl:391
> -msgid "Directory:"
> -msgstr "Каталог:"
> +#: lib/remote_add.tcl:163
> +#, tcl-format
> +msgid "Setting up the %s (at %s)"
> +msgstr "Настройка %s (в %s)"
>
> -#: lib/choose_repository.tcl:423 lib/choose_repository.tcl:550
> -#: lib/choose_repository.tcl:1052
> -msgid "Git Repository"
> -msgstr "Репозиторий"
> +#: lib/browser.tcl:17
> +msgid "Starting..."
> +msgstr "Запуск…"
>
> -#: lib/choose_repository.tcl:448
> +#: lib/browser.tcl:27
>  #, tcl-format
> -msgid "Directory %s already exists."
> -msgstr "Каталог '%s' уже существует."
> +msgid "%s (%s): File Browser"
> +msgstr "%s (%s): Просмотр списка файлов"
>
> -#: lib/choose_repository.tcl:452
> +#: lib/browser.tcl:132 lib/browser.tcl:149
>  #, tcl-format
> -msgid "File %s already exists."
> -msgstr "Файл '%s' уже существует."
> +msgid "Loading %s..."
> +msgstr "Загрузка %s…"
>
> -#: lib/choose_repository.tcl:466
> -msgid "Clone"
> -msgstr "Склонировать"
> +#: lib/browser.tcl:193
> +msgid "[Up To Parent]"
> +msgstr "[На уровень выше]"
>
> -#: lib/choose_repository.tcl:479
> -msgid "Source Location:"
> -msgstr "Исходное положение:"
> +#: lib/browser.tcl:275
> +#, tcl-format
> +msgid "%s (%s): Browse Branch Files"
> +msgstr "%s (%s): Просмотр файлов ветки"
>
> -#: lib/choose_repository.tcl:490
> -msgid "Target Directory:"
> -msgstr "Каталог назначения:"
> +#: lib/browser.tcl:282
> +msgid "Browse Branch Files"
> +msgstr "Показать файлы ветки"
>
> -#: lib/choose_repository.tcl:502
> -msgid "Clone Type:"
> -msgstr "Тип клона:"
> +#: lib/browser.tcl:288 lib/choose_repository.tcl:437
> +#: lib/choose_repository.tcl:524 lib/choose_repository.tcl:533
> +#: lib/choose_repository.tcl:1115
> +msgid "Browse"
> +msgstr "Показать"
>
> -#: lib/choose_repository.tcl:508
> -msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
> -msgstr "Стандартный (Быстрый, полуизбыточный, «жесткие» ссылки)"
> +#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321
> +msgid "Revision"
> +msgstr "Версия"
>
> -#: lib/choose_repository.tcl:514
> -msgid "Full Copy (Slower, Redundant Backup)"
> -msgstr "Полная копия (Медленный, создает резервную копию)"
> +#: lib/index.tcl:6
> +msgid "Unable to unlock the index."
> +msgstr "Не удалось разблокировать индекс"
>
> -#: lib/choose_repository.tcl:520
> -msgid "Shared (Fastest, Not Recommended, No Backup)"
> -msgstr "Общий (Самый быстрый, не рекомендуется, без резервной копии)"
> +#: lib/index.tcl:30
> +msgid "Index Error"
> +msgstr "Ошибка в индексе"
>
> -#: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603
> -#: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819
> -#: lib/choose_repository.tcl:1058 lib/choose_repository.tcl:1066
> -#, tcl-format
> -msgid "Not a Git repository: %s"
> -msgstr "Каталог не является репозиторием: %s"
> +#: lib/index.tcl:32
> +msgid ""
> +"Updating the Git index failed.  A rescan will be automatically started to "
> +"resynchronize git-gui."
> +msgstr "Не удалось обновить индекс Git. Состояние репозитория будет перечитано автоматически."
>
> -#: lib/choose_repository.tcl:592
> -msgid "Standard only available for local repository."
> -msgstr "Стандартный клон возможен только для локального репозитория."
> +#: lib/index.tcl:43
> +msgid "Continue"
> +msgstr "Продолжить"
>
> -#: lib/choose_repository.tcl:596
> -msgid "Shared only available for local repository."
> -msgstr "Общий клон возможен только для локального репозитория."
> +#: lib/index.tcl:46
> +msgid "Unlock Index"
> +msgstr "Разблокировать индекс"
> +
> +#: lib/index.tcl:77 lib/index.tcl:146 lib/index.tcl:220 lib/index.tcl:587
> +#: lib/choose_repository.tcl:999
> +msgid "files"
> +msgstr "файлов"
> +
> +#: lib/index.tcl:326
> +msgid "Unstaging selected files from commit"
> +msgstr "Уборка выбранных файлов из индекса"
>
> -#: lib/choose_repository.tcl:617
> +#: lib/index.tcl:330
>  #, tcl-format
> -msgid "Location %s already exists."
> -msgstr "Путь '%s' уже существует."
> +msgid "Unstaging %s from commit"
> +msgstr "Удаление %s из индекса"
>
> -#: lib/choose_repository.tcl:628
> -msgid "Failed to configure origin"
> -msgstr "Не могу сконфигурировать исходный репозиторий."
> +#: lib/index.tcl:369
> +msgid "Ready to commit."
> +msgstr "Готов для коммита."
>
> -#: lib/choose_repository.tcl:640
> -msgid "Counting objects"
> -msgstr "Считаю объекты"
> +#: lib/index.tcl:378
> +msgid "Adding selected files"
> +msgstr "Добавление выбранных файлов"
>
> -#: lib/choose_repository.tcl:641
> -msgid "buckets"
> -msgstr "блоки"
> -
> -#: lib/choose_repository.tcl:665
> +#: lib/index.tcl:382
>  #, tcl-format
> -msgid "Unable to copy objects/info/alternates: %s"
> -msgstr "Не могу скопировать objects/info/alternates: %s"
> +msgid "Adding %s"
> +msgstr "Добавление %s…"
>
> -#: lib/choose_repository.tcl:701
> +#: lib/index.tcl:412
>  #, tcl-format
> -msgid "Nothing to clone from %s."
> -msgstr "Нечего клонировать с %s."
> +msgid "Stage %d untracked files?"
> +msgstr "Проиндексировать %d неотслеживаемые файла?"
>
> -#: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917
> -#: lib/choose_repository.tcl:929
> -msgid "The 'master' branch has not been initialized."
> -msgstr "Не инициализирована ветвь «master»."
> +#: lib/index.tcl:420
> +msgid "Adding all changed files"
> +msgstr "Добавление всех измененных файлов"
>
> -#: lib/choose_repository.tcl:716
> -msgid "Hardlinks are unavailable.  Falling back to copying."
> -msgstr "«Жесткие ссылки» недоступны. Будет использовано копирование."
> +#: lib/index.tcl:503
> +#, tcl-format
> +msgid "Revert changes in file %s?"
> +msgstr "Обратить изменения в файле %s?"
>
> -#: lib/choose_repository.tcl:728
> +#: lib/index.tcl:508
>  #, tcl-format
> -msgid "Cloning from %s"
> -msgstr "Клонирование %s"
> +msgid "Revert changes in these %i files?"
> +msgstr "Обратить изменения в %i файле(-ах)?"
>
> -#: lib/choose_repository.tcl:759
> -msgid "Copying objects"
> -msgstr "Копирование objects"
> +#: lib/index.tcl:517
> +msgid "Any unstaged changes will be permanently lost by the revert."
> +msgstr "Любые непроиндексированные изменения, будут потеряны при обращении изменений."
>
> -#: lib/choose_repository.tcl:760
> -msgid "KiB"
> -msgstr "КБ"
> +#: lib/index.tcl:520 lib/index.tcl:563
> +msgid "Do Nothing"
> +msgstr "Ничего не делать"
>
> -#: lib/choose_repository.tcl:784
> +#: lib/index.tcl:545
>  #, tcl-format
> -msgid "Unable to copy object: %s"
> -msgstr "Не могу скопировать объект: %s"
> +msgid "Delete untracked file %s?"
> +msgstr "Удалить неотслеживаемый файл %s?"
>
> -#: lib/choose_repository.tcl:794
> -msgid "Linking objects"
> -msgstr "Создание ссылок на objects"
> +#: lib/index.tcl:550
> +#, tcl-format
> +msgid "Delete these %i untracked files?"
> +msgstr "Удалить %i неотслеживаемые файла?"
>
> -#: lib/choose_repository.tcl:795
> -msgid "objects"
> -msgstr "объекты"
> +#: lib/index.tcl:560
> +msgid "Files will be permanently deleted."
> +msgstr "Файлы будут удалены навсегда."
>
> -#: lib/choose_repository.tcl:803
> -#, tcl-format
> -msgid "Unable to hardlink object: %s"
> -msgstr "Не могу создать «жесткую ссылку» на объект: %s"
> +#: lib/index.tcl:564
> +msgid "Delete Files"
> +msgstr "Удалить файлы"
>
> -#: lib/choose_repository.tcl:858
> -msgid "Cannot fetch branches and objects.  See console output for details."
> -msgstr "Не удалось извлечь ветки и объекты. Дополнительная информация на консоли."
> +#: lib/index.tcl:586
> +msgid "Deleting"
> +msgstr "Удаление"
>
> -#: lib/choose_repository.tcl:869
> -msgid "Cannot fetch tags.  See console output for details."
> -msgstr "Не удалось извлечь метки. Дополнительная информация на консоли."
> +#: lib/index.tcl:665
> +msgid "Encountered errors deleting files:\n"
> +msgstr "Возникшие ошибки при удалении файлов:\n"
>
> -#: lib/choose_repository.tcl:893
> -msgid "Cannot determine HEAD.  See console output for details."
> -msgstr "Не могу определить HEAD. Дополнительная информация на консоли."
> +#: lib/index.tcl:674
> +#, tcl-format
> +msgid "None of the %d selected files could be deleted."
> +msgstr "Не удалось удалить ни один из выбранных %d файлов."
>
> -#: lib/choose_repository.tcl:902
> +#: lib/index.tcl:679
>  #, tcl-format
> -msgid "Unable to cleanup %s"
> -msgstr "Не могу очистить %s"
> +msgid "%d of the %d selected files could not be deleted."
> +msgstr "Не удалось удалить %d из выбранных  %d файлов."
>
> -#: lib/choose_repository.tcl:908
> -msgid "Clone failed."
> -msgstr "Клонирование не удалось."
> +#: lib/index.tcl:726
> +msgid "Reverting selected files"
> +msgstr "Обращение изменений в выбранных файлах"
>
> -#: lib/choose_repository.tcl:915
> -msgid "No default branch obtained."
> -msgstr "Ветка по умолчанию не была получена."
> +#: lib/index.tcl:730
> +#, tcl-format
> +msgid "Reverting %s"
> +msgstr "Обращение изменений в %s"
>
> -#: lib/choose_repository.tcl:926
> +#: lib/branch_checkout.tcl:16
>  #, tcl-format
> -msgid "Cannot resolve %s as a commit."
> -msgstr "Не могу распознать %s как коммит."
> +msgid "%s (%s): Checkout Branch"
> +msgstr "%s (%s): Переход на ветку"
>
> -#: lib/choose_repository.tcl:938
> -msgid "Creating working directory"
> -msgstr "Создаю рабочий каталог"
> +#: lib/branch_checkout.tcl:21
> +msgid "Checkout Branch"
> +msgstr "Перейти на ветку"
>
> -#: lib/choose_repository.tcl:939 lib/index.tcl:67 lib/index.tcl:130
> -#: lib/index.tcl:198
> -msgid "files"
> -msgstr "файлов"
> +#: lib/branch_checkout.tcl:26
> +msgid "Checkout"
> +msgstr "Перейти"
>
> -#: lib/choose_repository.tcl:968
> -msgid "Initial file checkout failed."
> -msgstr "Не удалось получить начальное состояние файлов репозитория."
> +#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69
> +msgid "Options"
> +msgstr "Настройки"
>
> -#: lib/choose_repository.tcl:1011
> -msgid "Open"
> -msgstr "Открыть"
> +#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
> +msgid "Fetch Tracking Branch"
> +msgstr "Извлечь изменения из внешней ветки"
>
> -#: lib/choose_repository.tcl:1021
> -msgid "Repository:"
> -msgstr "Репозиторий:"
> +#: lib/branch_checkout.tcl:47
> +msgid "Detach From Local Branch"
> +msgstr "Отсоединить от локальной ветки"
>
> -#: lib/choose_repository.tcl:1072
> +#: lib/status_bar.tcl:263
>  #, tcl-format
> -msgid "Failed to open repository %s:"
> -msgstr "Не удалось открыть репозиторий %s:"
> +msgid "%s ... %*i of %*i %s (%3i%%)"
> +msgstr "%s … %*i из %*i %s (%3i%%)"
>
> -#: lib/choose_rev.tcl:53
> -msgid "This Detached Checkout"
> -msgstr "Текущее отсоединенное состояние"
> +#: lib/remote.tcl:200
> +msgid "Push to"
> +msgstr "Отправить"
>
> -#: lib/choose_rev.tcl:60
> -msgid "Revision Expression:"
> -msgstr "Выражение для определения версии:"
> +#: lib/remote.tcl:218
> +msgid "Remove Remote"
> +msgstr "Удалить ссылку на внешний репозиторий"
>
> -#: lib/choose_rev.tcl:74
> -msgid "Local Branch"
> -msgstr "Локальная ветка:"
> +#: lib/remote.tcl:223
> +msgid "Prune from"
> +msgstr "Чистка"
>
> -#: lib/choose_rev.tcl:79
> -msgid "Tracking Branch"
> -msgstr "Отслеживаемая ветка"
> +#: lib/remote.tcl:228
> +msgid "Fetch from"
> +msgstr "Извлечение из"
>
> -#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538
> -msgid "Tag"
> -msgstr "Метка"
> +#: lib/remote.tcl:249 lib/remote.tcl:253 lib/remote.tcl:258 lib/remote.tcl:264
> +msgid "All"
> +msgstr "Все"
>
> -#: lib/choose_rev.tcl:317
> +#: lib/branch_rename.tcl:15
>  #, tcl-format
> -msgid "Invalid revision: %s"
> -msgstr "Неверная версия: %s"
> +msgid "%s (%s): Rename Branch"
> +msgstr "%s (%s): Переименовать ветку"
>
> -#: lib/choose_rev.tcl:338
> -msgid "No revision selected."
> -msgstr "Версия не указана."
> +#: lib/branch_rename.tcl:23
> +msgid "Rename Branch"
> +msgstr "Переименование ветки"
>
> -#: lib/choose_rev.tcl:346
> -msgid "Revision expression is empty."
> -msgstr "Пустое выражение для определения версии."
> +#: lib/branch_rename.tcl:28
> +msgid "Rename"
> +msgstr "Переименовать"
>
> -#: lib/choose_rev.tcl:531
> -msgid "Updated"
> -msgstr "Обновлено"
> +#: lib/branch_rename.tcl:38
> +msgid "Branch:"
> +msgstr "Ветка:"
>
> -#: lib/choose_rev.tcl:559
> -msgid "URL"
> -msgstr "Ссылка"
> +#: lib/branch_rename.tcl:46
> +msgid "New Name:"
> +msgstr "Новое название:"
>
> -#: lib/commit.tcl:9
> -msgid ""
> -"There is nothing to amend.\n"
> -"\n"
> -"You are about to create the initial commit.  There is no commit before this to amend.\n"
> -msgstr "Отсутствует коммиты для исправления.\n\nВы создаете начальный коммит, здесь еще нечего исправлять.\n"
> +#: lib/branch_rename.tcl:81
> +msgid "Please select a branch to rename."
> +msgstr "Укажите ветку для переименования."
>
> -#: lib/commit.tcl:18
> -msgid ""
> -"Cannot amend while merging.\n"
> -"\n"
> -"You are currently in the middle of a merge that has not been fully completed.  You cannot amend the prior commit unless you first abort the current merge activity.\n"
> -msgstr "Невозможно исправить коммит во время слияния.\n\nТекущее слияние не завершено. Невозможно исправить предыдуий коммит, не прерывая эту операцию.\n"
> +#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
> +msgid "Please supply a branch name."
> +msgstr "Укажите имя ветки."
>
> -#: lib/commit.tcl:48
> -msgid "Error loading commit data for amend:"
> -msgstr "Ошибка при загрузке данных для исправления коммита:"
> +#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
> +#, tcl-format
> +msgid "'%s' is not an acceptable branch name."
> +msgstr "Недопустимое имя ветки «%s»."
>
> -#: lib/commit.tcl:75
> -msgid "Unable to obtain your identity:"
> -msgstr "Невозможно получить информацию об авторстве:"
> +#: lib/branch_rename.tcl:123
> +#, tcl-format
> +msgid "Failed to rename '%s'."
> +msgstr "Не удалось переименовать «%s». "
>
> -#: lib/commit.tcl:80
> -msgid "Invalid GIT_COMMITTER_IDENT:"
> -msgstr "Недопустимый GIT_COMMITTER_IDENT:"
> +#: lib/choose_font.tcl:41
> +msgid "Select"
> +msgstr "Выбрать"
>
> -#: lib/commit.tcl:129
> -#, tcl-format
> -msgid "warning: Tcl does not support encoding '%s'."
> -msgstr "предупреждение: Tcl не поддерживает кодировку «%s»."
> +#: lib/choose_font.tcl:55
> +msgid "Font Family"
> +msgstr "Шрифт"
>
> -#: lib/commit.tcl:149
> -msgid ""
> -"Last scanned state does not match repository state.\n"
> -"\n"
> -"Another Git program has modified this repository since the last scan.  A rescan must be performed before another commit can be created.\n"
> -"\n"
> -"The rescan will be automatically started now.\n"
> -msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь. \n\nЭто будет сделано сейчас автоматически.\n"
> +#: lib/choose_font.tcl:76
> +msgid "Font Size"
> +msgstr "Размер шрифта"
>
> -#: lib/commit.tcl:172
> -#, tcl-format
> +#: lib/choose_font.tcl:93
> +msgid "Font Example"
> +msgstr "Пример текста"
> +
> +#: lib/choose_font.tcl:105
>  msgid ""
> -"Unmerged files cannot be committed.\n"
> -"\n"
> -"File %s has merge conflicts.  You must resolve them and stage the file before committing.\n"
> -msgstr "Нельзя выполнить коммит с незавершённой операцией слияния.\n\nДля файла %s возник конфликт слияния. Разрешите конфликт и добавьте их в индекс перед выполнением коммита.\n"
> +"This is example text.\n"
> +"If you like this text, it can be your font."
> +msgstr "Это пример текста.\nЕсли Вам нравится этот текст, это может быть Ваш шрифт."
>
> -#: lib/commit.tcl:180
> +#: lib/option.tcl:11
>  #, tcl-format
> -msgid ""
> -"Unknown file state %s detected.\n"
> -"\n"
> -"File %s cannot be committed by this program.\n"
> -msgstr "Обнаружено неизвестное состояние файла %s.\n\nФайл %s не может быть закоммичен этой программой.\n"
> +msgid "Invalid global encoding '%s'"
> +msgstr "Неверная глобальная кодировка «%s»"
>
> -#: lib/commit.tcl:188
> -msgid ""
> -"No changes to commit.\n"
> -"\n"
> -"You must stage at least 1 file before you can commit.\n"
> -msgstr "Отсутствуют изменения для сохранения.\n\nДобавьте в индекс хотя бы один файл перед выполнением коммита.\n"
> +#: lib/option.tcl:19
> +#, tcl-format
> +msgid "Invalid repo encoding '%s'"
> +msgstr "Неверная кодировка репозитория «%s»"
>
> -#: lib/commit.tcl:203
> -msgid ""
> -"Please supply a commit message.\n"
> -"\n"
> -"A good commit message has the following format:\n"
> -"\n"
> -"- First line: Describe in one sentence what you did.\n"
> -"- Second line: Blank\n"
> -"- Remaining lines: Describe why this change is good.\n"
> -msgstr "Укажите сообщение коммита.\n\nРекомендуется следующий формат сообщения:\n\n- в первой строке краткое описание сделанных изменений\n- вторая строка пустая\n- в оставшихся строках опишите, что дают ваши изменения\n"
> +#: lib/option.tcl:119
> +msgid "Restore Defaults"
> +msgstr "Восстановить настройки по умолчанию"
>
> -#: lib/commit.tcl:234
> -msgid "Calling pre-commit hook..."
> -msgstr "Вызов перехватчика pre-commit…"
> +#: lib/option.tcl:123
> +msgid "Save"
> +msgstr "Сохранить"
>
> -#: lib/commit.tcl:249
> -msgid "Commit declined by pre-commit hook."
> -msgstr "Коммит прерван переватчиком pre-commit."
> +#: lib/option.tcl:133
> +#, tcl-format
> +msgid "%s Repository"
> +msgstr "Для репозитория %s"
>
> -#: lib/commit.tcl:272
> -msgid "Calling commit-msg hook..."
> -msgstr "Вызов перехватчика commit-msg…"
> +#: lib/option.tcl:134
> +msgid "Global (All Repositories)"
> +msgstr "Общие (для всех репозиториев)"
>
> -#: lib/commit.tcl:287
> -msgid "Commit declined by commit-msg hook."
> -msgstr "Коммит прерван переватчиком commit-msg"
> +#: lib/option.tcl:140
> +msgid "User Name"
> +msgstr "Имя пользователя"
>
> -#: lib/commit.tcl:300
> -msgid "Committing changes..."
> -msgstr "Коммит изменений…"
> +#: lib/option.tcl:141
> +msgid "Email Address"
> +msgstr "Адрес электронной почты"
>
> -#: lib/commit.tcl:316
> -msgid "write-tree failed:"
> -msgstr "Программа write-tree завершилась с ошибкой:"
> +#: lib/option.tcl:143
> +msgid "Summarize Merge Commits"
> +msgstr "Суммарное сообщение при слиянии"
>
> -#: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382
> -msgid "Commit failed."
> -msgstr "Не удалось закоммитить изменения."
> +#: lib/option.tcl:144
> +msgid "Merge Verbosity"
> +msgstr "Уровень детальности сообщений при слиянии"
>
> -#: lib/commit.tcl:334
> -#, tcl-format
> -msgid "Commit %s appears to be corrupt"
> -msgstr "Коммит %s похоже поврежден"
> +#: lib/option.tcl:145
> +msgid "Show Diffstat After Merge"
> +msgstr "Показать отчет об изменениях после слияния"
>
> -#: lib/commit.tcl:339
> -msgid ""
> -"No changes to commit.\n"
> -"\n"
> -"No files were modified by this commit and it was not a merge commit.\n"
> -"\n"
> -"A rescan will be automatically started now.\n"
> -msgstr "Нет изменения для коммита.\n\nНи один файл не был изменен и не было слияния.\n\nСейчас автоматически запустится перечитывание репозитория.\n"
> +#: lib/option.tcl:146
> +msgid "Use Merge Tool"
> +msgstr "Использовать для слияния программу"
>
> -#: lib/commit.tcl:346
> -msgid "No changes to commit."
> -msgstr "Нет изменения для коммита."
> +#: lib/option.tcl:148
> +msgid "Trust File Modification Timestamps"
> +msgstr "Доверять времени модификации файла"
>
> -#: lib/commit.tcl:360
> -msgid "commit-tree failed:"
> -msgstr "Программа commit-tree завершилась с ошибкой:"
> +#: lib/option.tcl:149
> +msgid "Prune Tracking Branches During Fetch"
> +msgstr "Чистка отслеживаемых веток при извлечении изменений"
>
> -#: lib/commit.tcl:381
> -msgid "update-ref failed:"
> -msgstr "Программа update-ref завершилась с ошибкой:"
> -
> -#: lib/commit.tcl:469
> -#, tcl-format
> -msgid "Created commit %s: %s"
> -msgstr "Создан коммит %s: %s "
> -
> -#: lib/console.tcl:59
> -msgid "Working... please wait..."
> -msgstr "В процессе… пожалуйста, ждите…"
> -
> -#: lib/console.tcl:186
> -msgid "Success"
> -msgstr "Процесс успешно завершен"
> -
> -#: lib/console.tcl:200
> -msgid "Error: Command Failed"
> -msgstr "Ошибка: не удалось выполнить команду"
> -
> -#: lib/database.tcl:43
> -msgid "Number of loose objects"
> -msgstr "Количество несвязанных объектов"
> -
> -#: lib/database.tcl:44
> -msgid "Disk space used by loose objects"
> -msgstr "Объем дискового пространства, занятый несвязанными объектами"
> -
> -#: lib/database.tcl:45
> -msgid "Number of packed objects"
> -msgstr "Количество упакованных объектов"
> +#: lib/option.tcl:150
> +msgid "Match Tracking Branches"
> +msgstr "Такое же имя, как и у отслеживаемой ветки"
>
> -#: lib/database.tcl:46
> -msgid "Number of packs"
> -msgstr "Количество pack-файлов"
> +#: lib/option.tcl:151
> +msgid "Use Textconv For Diffs and Blames"
> +msgstr "Использовать Textconv для просмотра различий и авторства"
>
> -#: lib/database.tcl:47
> -msgid "Disk space used by packed objects"
> -msgstr "Объем дискового пространства, занятый упакованными объектами"
> +#: lib/option.tcl:152
> +msgid "Blame Copy Only On Changed Files"
> +msgstr "Поиск копий только в изменённых файлах"
>
> -#: lib/database.tcl:48
> -msgid "Packed objects waiting for pruning"
> -msgstr "Несвязанные объекты, которые можно удалить"
> +#: lib/option.tcl:153
> +msgid "Maximum Length of Recent Repositories List"
> +msgstr "Максимальная длинна списка недавних репозиториев"
>
> -#: lib/database.tcl:49
> -msgid "Garbage files"
> -msgstr "Мусор"
> +#: lib/option.tcl:154
> +msgid "Minimum Letters To Blame Copy On"
> +msgstr "Минимальное количество символов для поиска копий"
>
> -#: lib/database.tcl:72
> -msgid "Compressing the object database"
> -msgstr "Сжатие базы объектов"
> +#: lib/option.tcl:155
> +msgid "Blame History Context Radius (days)"
> +msgstr "Радиус исторического контекста (в днях)"
>
> -#: lib/database.tcl:83
> -msgid "Verifying the object database with fsck-objects"
> -msgstr "Проверка базы объектов при помощи fsck"
> +#: lib/option.tcl:156
> +msgid "Number of Diff Context Lines"
> +msgstr "Число строк в контексте diff"
>
> -#: lib/database.tcl:107
> -#, tcl-format
> -msgid ""
> -"This repository currently has approximately %i loose objects.\n"
> -"\n"
> -"To maintain optimal performance it is strongly recommended that you compress the database.\n"
> -"\n"
> -"Compress the database now?"
> -msgstr "Этот репозиторий сейчас содержит примерно %i свободных объектов\n\nДля лучшей производительности рекомендуется сжать базу данных.\n\nСжать базу данных сейчас?"
> +#: lib/option.tcl:157
> +msgid "Additional Diff Parameters"
> +msgstr "Дополнительные параметры для diff"
>
> -#: lib/date.tcl:25
> -#, tcl-format
> -msgid "Invalid date from Git: %s"
> -msgstr "Неправильная дата в репозитории: %s"
> +#: lib/option.tcl:158
> +msgid "Commit Message Text Width"
> +msgstr "Ширина текста сообщения коммита"
>
> -#: lib/diff.tcl:64
> -#, tcl-format
> -msgid ""
> -"No differences detected.\n"
> -"\n"
> -"%s has no changes.\n"
> -"\n"
> -"The modification date of this file was updated by another application, but the content within the file was not changed.\n"
> -"\n"
> -"A rescan will be automatically started to find other files which may have the same state."
> -msgstr "Изменений не обнаружено.\n\nв %s отсутствуют изменения.\n\nДата изменения файла была обновлена другой программой, но содержимое файла осталось прежним.\n\nСейчас будет запущено перечитывание репозитория, чтобы найти подобные файлы."
> +#: lib/option.tcl:159
> +msgid "New Branch Name Template"
> +msgstr "Шаблон для имени новой ветки"
>
> -#: lib/diff.tcl:104
> -#, tcl-format
> -msgid "Loading diff of %s..."
> -msgstr "Загрузка изменений %s…"
> +#: lib/option.tcl:160
> +msgid "Default File Contents Encoding"
> +msgstr "Кодировка содержания файла по умолчанию"
>
> -#: lib/diff.tcl:125
> -msgid ""
> -"LOCAL: deleted\n"
> -"REMOTE:\n"
> -msgstr "ЛОКАЛЬНО: удалён\nВНЕШНИЙ:\n"
> +#: lib/option.tcl:161
> +msgid "Warn before committing to a detached head"
> +msgstr "Предупреждать перед коммитом в отделённый HEAD"
>
> -#: lib/diff.tcl:130
> -msgid ""
> -"REMOTE: deleted\n"
> -"LOCAL:\n"
> -msgstr "ВНЕШНИЙ: удалён\nЛОКАЛЬНО:\n"
> +#: lib/option.tcl:162
> +msgid "Staging of untracked files"
> +msgstr "Индексирование неотслеживаемых файлов"
>
> -#: lib/diff.tcl:137
> -msgid "LOCAL:\n"
> -msgstr "ЛОКАЛЬНО:\n"
> +#: lib/option.tcl:163
> +msgid "Show untracked files"
> +msgstr "Показать неотслеживаемые файлы"
>
> -#: lib/diff.tcl:140
> -msgid "REMOTE:\n"
> -msgstr "ВНЕШНИЙ:\n"
> +#: lib/option.tcl:164
> +msgid "Tab spacing"
> +msgstr "Ширина табуляции"
>
> -#: lib/diff.tcl:202 lib/diff.tcl:319
> +#: lib/option.tcl:182 lib/option.tcl:197 lib/option.tcl:220 lib/option.tcl:282
> +#: lib/database.tcl:57
>  #, tcl-format
> -msgid "Unable to display %s"
> -msgstr "Не могу показать %s"
> +msgid "%s:"
> +msgstr "%s:"
>
> -#: lib/diff.tcl:203
> -msgid "Error loading file:"
> -msgstr "Ошибка загрузки файла:"
> -
> -#: lib/diff.tcl:210
> -msgid "Git Repository (subproject)"
> -msgstr "Репозиторий Git (подпроект)"
> +#: lib/option.tcl:210
> +msgid "Change"
> +msgstr "Изменить"
>
> -#: lib/diff.tcl:222
> -msgid "* Binary file (not showing content)."
> -msgstr "* Двоичный файл (содержимое не показано)"
> +#: lib/option.tcl:254
> +msgid "Spelling Dictionary:"
> +msgstr "Словарь для проверки правописания:"
>
> -#: lib/diff.tcl:227
> -#, tcl-format
> -msgid ""
> -"* Untracked file is %d bytes.\n"
> -"* Showing only first %d bytes.\n"
> -msgstr "* Размер неотслеживаемого файла %d байт.\n* Показано первых %d байт.\n"
> +#: lib/option.tcl:284
> +msgid "Change Font"
> +msgstr "Изменить"
>
> -#: lib/diff.tcl:233
> +#: lib/option.tcl:288
>  #, tcl-format
> -msgid ""
> -"\n"
> -"* Untracked file clipped here by %s.\n"
> -"* To see the entire file, use an external editor.\n"
> -msgstr "\n* Неотслеживаемый файл обрезан: %s.\n* Чтобы увидеть весь файл, используйте внешний редактор.\n"
> -
> -#: lib/diff.tcl:482
> -msgid "Failed to unstage selected hunk."
> -msgstr "Не удалось исключить выбранную часть."
> +msgid "Choose %s"
> +msgstr "Выберите %s"
>
> -#: lib/diff.tcl:489
> -msgid "Failed to stage selected hunk."
> -msgstr "Не удалось проиндексировать выбранный блок изменений."
> +#: lib/option.tcl:294
> +msgid "pt."
> +msgstr "п."
>
> -#: lib/diff.tcl:568
> -msgid "Failed to unstage selected line."
> -msgstr "Не удалось исключить выбранную строку."
> +#: lib/option.tcl:308
> +msgid "Preferences"
> +msgstr "Настройки"
>
> -#: lib/diff.tcl:576
> -msgid "Failed to stage selected line."
> -msgstr "Не удалось проиндексировать выбранную строку."
> +#: lib/option.tcl:345
> +msgid "Failed to completely save options:"
> +msgstr "Не удалось полностью сохранить настройки:"
>
>  #: lib/encoding.tcl:443
>  msgid "Default"
> @@ -1559,824 +1375,1277 @@ msgstr "Системная (%s)"
>  msgid "Other"
>  msgstr "Другая"
>
> -#: lib/error.tcl:20 lib/error.tcl:114
> -msgid "error"
> -msgstr "ошибка"
> +#: lib/tools.tcl:76
> +#, tcl-format
> +msgid "Running %s requires a selected file."
> +msgstr "Запуск %s требует выбранного файла."
>
> -#: lib/error.tcl:36
> -msgid "warning"
> -msgstr "предупреждение"
> +#: lib/tools.tcl:92
> +#, tcl-format
> +msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
> +msgstr "Вы действительно хотите выполнить %1$s на «%2$s»?"
>
> -#: lib/error.tcl:94
> -msgid "You must correct the above errors before committing."
> -msgstr "Перед коммитом, исправьте вышеуказанные ошибки."
> +#: lib/tools.tcl:96
> +#, tcl-format
> +msgid "Are you sure you want to run %s?"
> +msgstr "Действительно запустить %s?"
>
> -#: lib/index.tcl:6
> -msgid "Unable to unlock the index."
> -msgstr "Не удалось разблокировать индекс"
> +#: lib/tools.tcl:118
> +#, tcl-format
> +msgid "Tool: %s"
> +msgstr "Вспомогательная операция: %s"
>
> -#: lib/index.tcl:15
> -msgid "Index Error"
> -msgstr "Ошибка в индексе"
> +#: lib/tools.tcl:119
> +#, tcl-format
> +msgid "Running: %s"
> +msgstr "Выполнение: %s"
>
> -#: lib/index.tcl:17
> -msgid ""
> -"Updating the Git index failed.  A rescan will be automatically started to "
> -"resynchronize git-gui."
> -msgstr "Не удалось обновить индекс Git. Состояние репозитория будет перечитано автоматически."
> +#: lib/tools.tcl:158
> +#, tcl-format
> +msgid "Tool completed successfully: %s"
> +msgstr "Программа %s завершилась успешно."
>
> -#: lib/index.tcl:28
> -msgid "Continue"
> -msgstr "Продолжить"
> +#: lib/tools.tcl:160
> +#, tcl-format
> +msgid "Tool failed: %s"
> +msgstr "Ошибка выполнения программы: %s"
>
> -#: lib/index.tcl:31
> -msgid "Unlock Index"
> -msgstr "Разблокировать индекс"
> +#: lib/mergetool.tcl:8
> +msgid "Force resolution to the base version?"
> +msgstr "Использовать базовую версию для разрешения конфликта?"
>
> -#: lib/index.tcl:289
> -#, tcl-format
> -msgid "Unstaging %s from commit"
> -msgstr "Удаление %s из индекса"
> +#: lib/mergetool.tcl:9
> +msgid "Force resolution to this branch?"
> +msgstr "Использовать версию из этой ветки для разрешения конфликта?"
>
> -#: lib/index.tcl:328
> -msgid "Ready to commit."
> -msgstr "Готов для коммита."
> +#: lib/mergetool.tcl:10
> +msgid "Force resolution to the other branch?"
> +msgstr "Использовать версию из другой ветки для разрешения конфликта?"
>
> -#: lib/index.tcl:341
> +#: lib/mergetool.tcl:14
>  #, tcl-format
> -msgid "Adding %s"
> -msgstr "Добавление %s…"
> +msgid ""
> +"Note that the diff shows only conflicting changes.\n"
> +"\n"
> +"%s will be overwritten.\n"
> +"\n"
> +"This operation can be undone only by restarting the merge."
> +msgstr "Внимание! Список изменений показывает только конфликтующие отличия.\n\n%s будет переписан.\n\nЭто действие можно отменить только перезапуском операции слияния."
>
> -#: lib/index.tcl:398
> +#: lib/mergetool.tcl:45
>  #, tcl-format
> -msgid "Revert changes in file %s?"
> -msgstr "Обратить изменения в файле %s?"
> +msgid "File %s seems to have unresolved conflicts, still stage?"
> +msgstr "Похоже, что файл %s содержит неразрешенные конфликты. Продолжить индексацию?"
>
> -#: lib/index.tcl:400
> +#: lib/mergetool.tcl:60
>  #, tcl-format
> -msgid "Revert changes in these %i files?"
> -msgstr "Обратить изменения в %i файле(-ах)?"
> +msgid "Adding resolution for %s"
> +msgstr "Добавляю результат разрешения для %s"
>
> -#: lib/index.tcl:408
> -msgid "Any unstaged changes will be permanently lost by the revert."
> -msgstr "Любые непроиндексированные изменения, будут потеряны при обращении изменений."
> +#: lib/mergetool.tcl:141
> +msgid "Cannot resolve deletion or link conflicts using a tool"
> +msgstr "Программа слияния не обрабатывает конфликты с удалением или участием ссылок"
>
> -#: lib/index.tcl:411
> -msgid "Do Nothing"
> -msgstr "Ничего не делать"
> +#: lib/mergetool.tcl:146
> +msgid "Conflict file does not exist"
> +msgstr "Конфликтующий файл не существует"
>
> -#: lib/index.tcl:429
> -msgid "Reverting selected files"
> -msgstr "Обращение изменений в выбранных файлах"
> +#: lib/mergetool.tcl:246
> +#, tcl-format
> +msgid "Not a GUI merge tool: '%s'"
> +msgstr "«%s» не является программой слияния"
>
> -#: lib/index.tcl:433
> +#: lib/mergetool.tcl:275
>  #, tcl-format
> -msgid "Reverting %s"
> -msgstr "Обращение изменений в %s"
> +msgid "Unsupported merge tool '%s'"
> +msgstr "Неподдерживаемая программа слияния «%s»"
>
> -#: lib/merge.tcl:13
> +#: lib/mergetool.tcl:310
> +msgid "Merge tool is already running, terminate it?"
> +msgstr "Программа слияния уже работает. Прервать?"
> +
> +#: lib/mergetool.tcl:330
> +#, tcl-format
>  msgid ""
> -"Cannot merge while amending.\n"
> -"\n"
> -"You must finish amending this commit before starting any type of merge.\n"
> -msgstr "Невозможно выполнить слияние во время исправления.\n\nЗавершите исправление данного коммита перед выполнением операции слияния.\n"
> +"Error retrieving versions:\n"
> +"%s"
> +msgstr "Ошибка получения версий:\n%s"
>
> -#: lib/merge.tcl:27
> +#: lib/mergetool.tcl:350
> +#, tcl-format
>  msgid ""
> -"Last scanned state does not match repository state.\n"
> -"\n"
> -"Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.\n"
> +"Could not start the merge tool:\n"
>  "\n"
> -"The rescan will be automatically started now.\n"
> -msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем слияние может быть сделано.\n\nЭто будет сделано сейчас автоматически.\n"
> -
> -#: lib/merge.tcl:45
> -#, tcl-format
> -msgid ""
> -"You are in the middle of a conflicted merge.\n"
> -"\n"
> -"File %s has merge conflicts.\n"
> -"\n"
> -"You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.\n"
> -msgstr "Предыдущее слияние не завершено из-за конфликта.\n\nДля файла %s возник конфликт слияния.\n\nРазрешите конфликт, добавьте файл в индекс и закоммитьте. Только после этого можно начать следующее слияние.\n"
> +"%s"
> +msgstr "Ошибка запуска программы слияния:\n\n%s"
>
> -#: lib/merge.tcl:55
> -#, tcl-format
> -msgid ""
> -"You are in the middle of a change.\n"
> -"\n"
> -"File %s is modified.\n"
> -"\n"
> -"You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n"
> -msgstr "Вы находитесь в процессе изменений.\n\nФайл %s изменён.\n\nВы должны завершить текущий коммит перед началом слияния. В случае необходимости, это позволит прервать операцию слияния.\n"
> +#: lib/mergetool.tcl:354
> +msgid "Running merge tool..."
> +msgstr "Запуск программы слияния…"
>
> -#: lib/merge.tcl:107
> -#, tcl-format
> -msgid "%s of %s"
> -msgstr "%s из %s"
> +#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
> +msgid "Merge tool failed."
> +msgstr "Ошибка выполнения программы слияния."
>
> -#: lib/merge.tcl:120
> +#: lib/tools_dlg.tcl:22
>  #, tcl-format
> -msgid "Merging %s and %s..."
> -msgstr "Слияние %s и %s…"
> +msgid "%s (%s): Add Tool"
> +msgstr "%s (%s): Добавить инструмент"
>
> -#: lib/merge.tcl:131
> -msgid "Merge completed successfully."
> -msgstr "Слияние успешно завершено."
> -
> -#: lib/merge.tcl:133
> -msgid "Merge failed.  Conflict resolution is required."
> -msgstr "Не удалось завершить слияние. Требуется разрешение конфликта."
> -
> -#: lib/merge.tcl:158
> -#, tcl-format
> -msgid "Merge Into %s"
> -msgstr "Слияние с %s"
> +#: lib/tools_dlg.tcl:28
> +msgid "Add New Tool Command"
> +msgstr "Новая вспомогательная операция"
>
> -#: lib/merge.tcl:177
> -msgid "Revision To Merge"
> -msgstr "Версия, с которой провести слияние"
> +#: lib/tools_dlg.tcl:34
> +msgid "Add globally"
> +msgstr "Добавить для всех репозиториев"
>
> -#: lib/merge.tcl:212
> -msgid ""
> -"Cannot abort while amending.\n"
> -"\n"
> -"You must finish amending this commit.\n"
> -msgstr "Невозможно прервать исправление.\n\nЗавершите текущее исправление коммита.\n"
> +#: lib/tools_dlg.tcl:46
> +msgid "Tool Details"
> +msgstr "Описание вспомогательной операции"
>
> -#: lib/merge.tcl:222
> -msgid ""
> -"Abort merge?\n"
> -"\n"
> -"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
> -"\n"
> -"Continue with aborting the current merge?"
> -msgstr "Прервать операцию слияния?\n\nПрерывание текущего слияния приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
> +#: lib/tools_dlg.tcl:49
> +msgid "Use '/' separators to create a submenu tree:"
> +msgstr "Используйте «/» для создания подменю"
>
> -#: lib/merge.tcl:228
> -msgid ""
> -"Reset changes?\n"
> -"\n"
> -"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
> -"\n"
> -"Continue with resetting the current changes?"
> -msgstr "Сбросить изменения?\n\nСброс изменений приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
> +#: lib/tools_dlg.tcl:60
> +msgid "Command:"
> +msgstr "Команда:"
>
> -#: lib/merge.tcl:239
> -msgid "Aborting"
> -msgstr "Прерываю"
> +#: lib/tools_dlg.tcl:71
> +msgid "Show a dialog before running"
> +msgstr "Показать диалог перед запуском"
>
> -#: lib/merge.tcl:239
> -msgid "files reset"
> -msgstr "изменения в файлах отменены"
> +#: lib/tools_dlg.tcl:77
> +msgid "Ask the user to select a revision (sets $REVISION)"
> +msgstr "Запрос на выбор версии (устанавливает $REVISION)"
>
> -#: lib/merge.tcl:267
> -msgid "Abort failed."
> -msgstr "Прервать не удалось."
> +#: lib/tools_dlg.tcl:82
> +msgid "Ask the user for additional arguments (sets $ARGS)"
> +msgstr "Запрос дополнительных аргументов (устанавливает $ARGS)"
>
> -#: lib/merge.tcl:269
> -msgid "Abort completed.  Ready."
> -msgstr "Прервано."
> +#: lib/tools_dlg.tcl:89
> +msgid "Don't show the command output window"
> +msgstr "Не показывать окно вывода команды"
>
> -#: lib/mergetool.tcl:8
> -msgid "Force resolution to the base version?"
> -msgstr "Использовать базовую версию для разрешения конфликта?"
> +#: lib/tools_dlg.tcl:94
> +msgid "Run only if a diff is selected ($FILENAME not empty)"
> +msgstr "Запуск только если показан список изменений ($FILENAME не пусто)"
>
> -#: lib/mergetool.tcl:9
> -msgid "Force resolution to this branch?"
> -msgstr "Использовать версию из этой ветки для разрешения конфликта?"
> +#: lib/tools_dlg.tcl:118
> +msgid "Please supply a name for the tool."
> +msgstr "Укажите название вспомогательной операции."
>
> -#: lib/mergetool.tcl:10
> -msgid "Force resolution to the other branch?"
> -msgstr "Использовать версию из другой ветки для разрешения конфликта?"
> +#: lib/tools_dlg.tcl:126
> +#, tcl-format
> +msgid "Tool '%s' already exists."
> +msgstr "Вспомогательная операция «%s» уже существует."
>
> -#: lib/mergetool.tcl:14
> +#: lib/tools_dlg.tcl:148
>  #, tcl-format
>  msgid ""
> -"Note that the diff shows only conflicting changes.\n"
> -"\n"
> -"%s will be overwritten.\n"
> -"\n"
> -"This operation can be undone only by restarting the merge."
> -msgstr "Внимание! Список изменений показывает только конфликтующие отличия.\n\n%s будет переписан.\n\nЭто действие можно отменить только перезапуском операции слияния."
> +"Could not add tool:\n"
> +"%s"
> +msgstr "Ошибка добавления программы:\n%s"
>
> -#: lib/mergetool.tcl:45
> +#: lib/tools_dlg.tcl:187
>  #, tcl-format
> -msgid "File %s seems to have unresolved conflicts, still stage?"
> -msgstr "Похоже, что файл %s содержит неразрешенные конфликты. Продолжить индексацию?"
> +msgid "%s (%s): Remove Tool"
> +msgstr "%s (%s): Удалить инструмент"
>
> -#: lib/mergetool.tcl:60
> -#, tcl-format
> -msgid "Adding resolution for %s"
> -msgstr "Добавляю результат разрешения для %s"
> +#: lib/tools_dlg.tcl:193
> +msgid "Remove Tool Commands"
> +msgstr "Удалить команды программы"
>
> -#: lib/mergetool.tcl:141
> -msgid "Cannot resolve deletion or link conflicts using a tool"
> -msgstr "Программа слияния не обрабатывает конфликты с удалением или участием ссылок"
> +#: lib/tools_dlg.tcl:198
> +msgid "Remove"
> +msgstr "Удалить"
>
> -#: lib/mergetool.tcl:146
> -msgid "Conflict file does not exist"
> -msgstr "Конфликтующий файл не существует"
> +#: lib/tools_dlg.tcl:231
> +msgid "(Blue denotes repository-local tools)"
> +msgstr "(Синим выделены программы локальные репозиторию)"
>
> -#: lib/mergetool.tcl:264
> +#: lib/tools_dlg.tcl:283
>  #, tcl-format
> -msgid "Not a GUI merge tool: '%s'"
> -msgstr "«%s» не является программой слияния"
> +msgid "%s (%s):"
> +msgstr "%s (%s):"
>
> -#: lib/mergetool.tcl:268
> +#: lib/tools_dlg.tcl:292
>  #, tcl-format
> -msgid "Unsupported merge tool '%s'"
> -msgstr "Неподдерживаемая программа слияния «%s»"
> +msgid "Run Command: %s"
> +msgstr "Запуск команды: %s"
>
> -#: lib/mergetool.tcl:303
> -msgid "Merge tool is already running, terminate it?"
> -msgstr "Программа слияния уже работает. Прервать?"
> +#: lib/tools_dlg.tcl:306
> +msgid "Arguments"
> +msgstr "Аргументы"
>
> -#: lib/mergetool.tcl:323
> -#, tcl-format
> -msgid ""
> -"Error retrieving versions:\n"
> -"%s"
> -msgstr "Ошибка получения версий:\n%s"
> +#: lib/tools_dlg.tcl:341
> +msgid "OK"
> +msgstr "OK"
>
> -#: lib/mergetool.tcl:343
> -#, tcl-format
> -msgid ""
> -"Could not start the merge tool:\n"
> -"\n"
> -"%s"
> -msgstr "Ошибка запуска программы слияния:\n\n%s"
> +#: lib/search.tcl:48
> +msgid "Find:"
> +msgstr "Поиск:"
>
> -#: lib/mergetool.tcl:347
> -msgid "Running merge tool..."
> -msgstr "Запуск программы слияния…"
> +#: lib/search.tcl:50
> +msgid "Next"
> +msgstr "Дальше"
>
> -#: lib/mergetool.tcl:375 lib/mergetool.tcl:383
> -msgid "Merge tool failed."
> -msgstr "Ошибка выполнения программы слияния."
> +#: lib/search.tcl:51
> +msgid "Prev"
> +msgstr "Обратно"
>
> -#: lib/option.tcl:11
> -#, tcl-format
> -msgid "Invalid global encoding '%s'"
> -msgstr "Неверная глобальная кодировка «%s»"
> +#: lib/search.tcl:52
> +msgid "RegExp"
> +msgstr "Регулярные выражения"
>
> -#: lib/option.tcl:19
> +#: lib/search.tcl:54
> +msgid "Case"
> +msgstr "Учёт регистра"
> +
> +#: lib/shortcut.tcl:8 lib/shortcut.tcl:43 lib/shortcut.tcl:75
>  #, tcl-format
> -msgid "Invalid repo encoding '%s'"
> -msgstr "Неверная кодировка репозитория «%s»"
> +msgid "%s (%s): Create Desktop Icon"
> +msgstr "%s (%s): Создать ярлык на рабочем столе"
>
> -#: lib/option.tcl:117
> -msgid "Restore Defaults"
> -msgstr "Восстановить настройки по умолчанию"
> +#: lib/shortcut.tcl:24 lib/shortcut.tcl:65
> +msgid "Cannot write shortcut:"
> +msgstr "Невозможно записать ссылку:"
>
> -#: lib/option.tcl:121
> -msgid "Save"
> -msgstr "Сохранить"
> +#: lib/shortcut.tcl:140
> +msgid "Cannot write icon:"
> +msgstr "Невозможно записать значок:"
>
> -#: lib/option.tcl:131
> +#: lib/remote_branch_delete.tcl:29
>  #, tcl-format
> -msgid "%s Repository"
> -msgstr "Для репозитория %s"
> -
> -#: lib/option.tcl:132
> -msgid "Global (All Repositories)"
> -msgstr "Общие (для всех репозиториев)"
> +msgid "%s (%s): Delete Branch Remotely"
> +msgstr "%s (%s): Удаление внешней ветки"
>
> -#: lib/option.tcl:138
> -msgid "User Name"
> -msgstr "Имя пользователя"
> +#: lib/remote_branch_delete.tcl:34
> +msgid "Delete Branch Remotely"
> +msgstr "Удаление ветки во внешнем репозитории"
>
> -#: lib/option.tcl:139
> -msgid "Email Address"
> -msgstr "Адрес электронной почты"
> +#: lib/remote_branch_delete.tcl:48
> +msgid "From Repository"
> +msgstr "Из репозитория"
>
> -#: lib/option.tcl:141
> -msgid "Summarize Merge Commits"
> -msgstr "Суммарное сообщение при слиянии"
> +#: lib/remote_branch_delete.tcl:88
> +msgid "Branches"
> +msgstr "Ветки"
>
> -#: lib/option.tcl:142
> -msgid "Merge Verbosity"
> -msgstr "Уровень детальности сообщений при слиянии"
> +#: lib/remote_branch_delete.tcl:110
> +msgid "Delete Only If"
> +msgstr "Удалить только в случае, если"
>
> -#: lib/option.tcl:143
> -msgid "Show Diffstat After Merge"
> -msgstr "Показать отчет об изменениях после слияния"
> +#: lib/remote_branch_delete.tcl:112
> +msgid "Merged Into:"
> +msgstr "Слияние с:"
>
> -#: lib/option.tcl:144
> -msgid "Use Merge Tool"
> -msgstr "Использовать для слияния программу"
> +#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
> +msgid "Always (Do not perform merge checks)"
> +msgstr "Всегда (не выполнять проверку на слияние)"
>
> -#: lib/option.tcl:146
> -msgid "Trust File Modification Timestamps"
> -msgstr "Доверять времени модификации файла"
> +#: lib/remote_branch_delete.tcl:153
> +msgid "A branch is required for 'Merged Into'."
> +msgstr "Для операции «Слияние с» требуется указать ветку."
>
> -#: lib/option.tcl:147
> -msgid "Prune Tracking Branches During Fetch"
> -msgstr "Чистка отслеживаемых веток при извлечении изменений"
> +#: lib/remote_branch_delete.tcl:185
> +#, tcl-format
> +msgid ""
> +"The following branches are not completely merged into %s:\n"
> +"\n"
> +" - %s"
> +msgstr "Следующие ветки могут быть объединены с %s при помощи операции слияния:\n\n - %s"
>
> -#: lib/option.tcl:148
> -msgid "Match Tracking Branches"
> -msgstr "Такое же имя, как и у отслеживаемой ветки"
> +#: lib/remote_branch_delete.tcl:190
> +#, tcl-format
> +msgid ""
> +"One or more of the merge tests failed because you have not fetched the "
> +"necessary commits.  Try fetching from %s first."
> +msgstr "Некоторые тесты на слияние не прошли, потому что вы не извлекли необходимые коммиты. Попытайтесь извлечь их из %s."
>
> -#: lib/option.tcl:149
> -msgid "Blame Copy Only On Changed Files"
> -msgstr "Поиск копий только в изменённых файлах"
> +#: lib/remote_branch_delete.tcl:208
> +msgid "Please select one or more branches to delete."
> +msgstr "Укажите одну или несколько веток для удаления."
>
> -#: lib/option.tcl:150
> -msgid "Minimum Letters To Blame Copy On"
> -msgstr "Минимальное количество символов для поиска копий"
> +#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115
> +msgid ""
> +"Recovering deleted branches is difficult.\n"
> +"\n"
> +"Delete the selected branches?"
> +msgstr "Восстановить удаленные ветки сложно.\n\nПродолжить?"
>
> -#: lib/option.tcl:151
> -msgid "Blame History Context Radius (days)"
> -msgstr "Радиус исторического контекста (в днях)"
> +#: lib/remote_branch_delete.tcl:227
> +#, tcl-format
> +msgid "Deleting branches from %s"
> +msgstr "Удаление веток из %s"
>
> -#: lib/option.tcl:152
> -msgid "Number of Diff Context Lines"
> -msgstr "Число строк в контексте diff"
> +#: lib/remote_branch_delete.tcl:300
> +msgid "No repository selected."
> +msgstr "Не указан репозиторий."
>
> -#: lib/option.tcl:153
> -msgid "Commit Message Text Width"
> -msgstr "Ширина текста сообщения коммита"
> +#: lib/remote_branch_delete.tcl:305
> +#, tcl-format
> +msgid "Scanning %s..."
> +msgstr "Перечитывание %s…"
>
> -#: lib/option.tcl:154
> -msgid "New Branch Name Template"
> -msgstr "Шаблон для имени новой ветки"
> +#: lib/choose_repository.tcl:45
> +msgid "Git Gui"
> +msgstr "Git Gui"
>
> -#: lib/option.tcl:155
> -msgid "Default File Contents Encoding"
> -msgstr "Кодировка содержания файла по умолчанию"
> +#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:427
> +msgid "Create New Repository"
> +msgstr "Создать новый репозиторий"
>
> -#: lib/option.tcl:203
> -msgid "Change"
> -msgstr "Изменить"
> +#: lib/choose_repository.tcl:110
> +msgid "New..."
> +msgstr "Новый…"
>
> -#: lib/option.tcl:230
> -msgid "Spelling Dictionary:"
> -msgstr "Словарь для проверки правописания:"
> +#: lib/choose_repository.tcl:117 lib/choose_repository.tcl:511
> +msgid "Clone Existing Repository"
> +msgstr "Склонировать существующий репозиторий"
>
> -#: lib/option.tcl:254
> -msgid "Change Font"
> -msgstr "Изменить"
> +#: lib/choose_repository.tcl:128
> +msgid "Clone..."
> +msgstr "Клонировать…"
>
> -#: lib/option.tcl:258
> -#, tcl-format
> -msgid "Choose %s"
> -msgstr "Выберите %s"
> +#: lib/choose_repository.tcl:135 lib/choose_repository.tcl:1105
> +msgid "Open Existing Repository"
> +msgstr "Выбрать существующий репозиторий"
>
> -#: lib/option.tcl:264
> -msgid "pt."
> -msgstr "pt."
> +#: lib/choose_repository.tcl:141
> +msgid "Open..."
> +msgstr "Открыть…"
>
> -#: lib/option.tcl:278
> -msgid "Preferences"
> -msgstr "Настройки"
> +#: lib/choose_repository.tcl:154
> +msgid "Recent Repositories"
> +msgstr "Недавние репозитории"
>
> -#: lib/option.tcl:314
> -msgid "Failed to completely save options:"
> -msgstr "Не удалось полностью сохранить настройки:"
> +#: lib/choose_repository.tcl:164
> +msgid "Open Recent Repository:"
> +msgstr "Открыть последний репозиторий"
>
> -#: lib/remote.tcl:163
> -msgid "Remove Remote"
> -msgstr "Удалить ссылку на внешний репозиторий"
> +#: lib/choose_repository.tcl:331 lib/choose_repository.tcl:338
> +#: lib/choose_repository.tcl:345
> +#, tcl-format
> +msgid "Failed to create repository %s:"
> +msgstr "Не удалось создать репозиторий %s:"
>
> -#: lib/remote.tcl:168
> -msgid "Prune from"
> -msgstr "Чистка"
> +#: lib/choose_repository.tcl:422 lib/branch_create.tcl:33
> +msgid "Create"
> +msgstr "Создать"
>
> -#: lib/remote.tcl:173
> -msgid "Fetch from"
> -msgstr "Извлечение из"
> +#: lib/choose_repository.tcl:432
> +msgid "Directory:"
> +msgstr "Каталог:"
>
> -#: lib/remote.tcl:215
> -msgid "Push to"
> -msgstr "Отправить"
> +#: lib/choose_repository.tcl:462 lib/choose_repository.tcl:588
> +#: lib/choose_repository.tcl:1139
> +msgid "Git Repository"
> +msgstr "Репозиторий"
>
> -#: lib/remote_add.tcl:19
> -msgid "Add Remote"
> -msgstr "Зарегистрировать внешний репозиторий"
> +#: lib/choose_repository.tcl:487
> +#, tcl-format
> +msgid "Directory %s already exists."
> +msgstr "Каталог '%s' уже существует."
>
> -#: lib/remote_add.tcl:24
> -msgid "Add New Remote"
> -msgstr "Добавить внешний репозиторий"
> +#: lib/choose_repository.tcl:491
> +#, tcl-format
> +msgid "File %s already exists."
> +msgstr "Файл '%s' уже существует."
>
> -#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36
> -msgid "Add"
> -msgstr "Добавить"
> +#: lib/choose_repository.tcl:506
> +msgid "Clone"
> +msgstr "Склонировать"
>
> -#: lib/remote_add.tcl:37
> -msgid "Remote Details"
> -msgstr "Информация о внешнем репозитории"
> +#: lib/choose_repository.tcl:519
> +msgid "Source Location:"
> +msgstr "Исходное положение:"
>
> -#: lib/remote_add.tcl:50
> -msgid "Location:"
> -msgstr "Положение:"
> +#: lib/choose_repository.tcl:528
> +msgid "Target Directory:"
> +msgstr "Каталог назначения:"
>
> -#: lib/remote_add.tcl:62
> -msgid "Further Action"
> -msgstr "Следующая операция"
> +#: lib/choose_repository.tcl:538
> +msgid "Clone Type:"
> +msgstr "Тип клона:"
>
> -#: lib/remote_add.tcl:65
> -msgid "Fetch Immediately"
> -msgstr "Сразу извлечь изменения"
> +#: lib/choose_repository.tcl:543
> +msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
> +msgstr "Стандартный (Быстрый, полуизбыточный, «жесткие» ссылки)"
>
> -#: lib/remote_add.tcl:71
> -msgid "Initialize Remote Repository and Push"
> -msgstr "Инициализировать внешний репозиторий и отправить"
> +#: lib/choose_repository.tcl:548
> +msgid "Full Copy (Slower, Redundant Backup)"
> +msgstr "Полная копия (Медленный, создает резервную копию)"
>
> -#: lib/remote_add.tcl:77
> -msgid "Do Nothing Else Now"
> -msgstr "Больше ничего не делать"
> +#: lib/choose_repository.tcl:553
> +msgid "Shared (Fastest, Not Recommended, No Backup)"
> +msgstr "Общий (Самый быстрый, не рекомендуется, без резервной копии)"
>
> -#: lib/remote_add.tcl:101
> -msgid "Please supply a remote name."
> -msgstr "Укажите название внешнего репозитория."
> +#: lib/choose_repository.tcl:560
> +msgid "Recursively clone submodules too"
> +msgstr "Также рекурсивно клонировать подмодули"
>
> -#: lib/remote_add.tcl:114
> +#: lib/choose_repository.tcl:594 lib/choose_repository.tcl:641
> +#: lib/choose_repository.tcl:790 lib/choose_repository.tcl:864
> +#: lib/choose_repository.tcl:1145 lib/choose_repository.tcl:1153
>  #, tcl-format
> -msgid "'%s' is not an acceptable remote name."
> -msgstr "«%s» не является допустимым именем внешнего репозитория."
> +msgid "Not a Git repository: %s"
> +msgstr "Каталог не является репозиторием Git: %s"
>
> -#: lib/remote_add.tcl:125
> -#, tcl-format
> -msgid "Failed to add remote '%s' of location '%s'."
> -msgstr "Не удалось добавить «%s» из «%s». "
> +#: lib/choose_repository.tcl:630
> +msgid "Standard only available for local repository."
> +msgstr "Стандартный клон возможен только для локального репозитория."
>
> -#: lib/remote_add.tcl:133 lib/transport.tcl:6
> -#, tcl-format
> -msgid "fetch %s"
> -msgstr "извлечение %s"
> +#: lib/choose_repository.tcl:634
> +msgid "Shared only available for local repository."
> +msgstr "Общий клон возможен только для локального репозитория."
>
> -#: lib/remote_add.tcl:134
> +#: lib/choose_repository.tcl:655
>  #, tcl-format
> -msgid "Fetching the %s"
> -msgstr "Извлечение %s"
> +msgid "Location %s already exists."
> +msgstr "Путь %s уже существует."
>
> -#: lib/remote_add.tcl:157
> -#, tcl-format
> -msgid "Do not know how to initialize repository at location '%s'."
> -msgstr "Невозможно инициализировать репозиторий в «%s»."
> +#: lib/choose_repository.tcl:666
> +msgid "Failed to configure origin"
> +msgstr "Не удалось сконфигурировать исходный репозиторий"
> +
> +#: lib/choose_repository.tcl:678
> +msgid "Counting objects"
> +msgstr "Подсчёт объектов"
>
> -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63
> -#: lib/transport.tcl:81
> +#: lib/choose_repository.tcl:679
> +msgid "buckets"
> +msgstr "блоки"
> +
> +#: lib/choose_repository.tcl:703
>  #, tcl-format
> -msgid "push %s"
> -msgstr "отправить %s"
> +msgid "Unable to copy objects/info/alternates: %s"
> +msgstr "Не удалось скопировать objects/info/alternates: %s"
>
> -#: lib/remote_add.tcl:164
> +#: lib/choose_repository.tcl:740
>  #, tcl-format
> -msgid "Setting up the %s (at %s)"
> -msgstr "Настройка %s (в %s)"
> +msgid "Nothing to clone from %s."
> +msgstr "Нечего клонировать с %s."
>
> -#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
> -msgid "Delete Branch Remotely"
> -msgstr "Удаление ветки во внешнем репозитории"
> +#: lib/choose_repository.tcl:742 lib/choose_repository.tcl:962
> +#: lib/choose_repository.tcl:974
> +msgid "The 'master' branch has not been initialized."
> +msgstr "Не инициализирована ветка «master»."
>
> -#: lib/remote_branch_delete.tcl:47
> -msgid "From Repository"
> -msgstr "Из репозитория"
> +#: lib/choose_repository.tcl:755
> +msgid "Hardlinks are unavailable.  Falling back to copying."
> +msgstr "Жесткие ссылки недоступны. Будет использовано копирование."
>
> -#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134
> -msgid "Remote:"
> -msgstr "внешний:"
> +#: lib/choose_repository.tcl:769
> +#, tcl-format
> +msgid "Cloning from %s"
> +msgstr "Клонирование из %s"
>
> -#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149
> -msgid "Arbitrary Location:"
> -msgstr "Указанное положение:"
> +#: lib/choose_repository.tcl:800
> +msgid "Copying objects"
> +msgstr "Копирование объектов"
>
> -#: lib/remote_branch_delete.tcl:84
> -msgid "Branches"
> -msgstr "Ветки"
> +#: lib/choose_repository.tcl:801
> +msgid "KiB"
> +msgstr "КБ"
>
> -#: lib/remote_branch_delete.tcl:109
> -msgid "Delete Only If"
> -msgstr "Удалить только в случае, если"
> +#: lib/choose_repository.tcl:825
> +#, tcl-format
> +msgid "Unable to copy object: %s"
> +msgstr "Не могу скопировать объект: %s"
>
> -#: lib/remote_branch_delete.tcl:111
> -msgid "Merged Into:"
> -msgstr "Слияние с:"
> +#: lib/choose_repository.tcl:837
> +msgid "Linking objects"
> +msgstr "Создание ссылок на objects"
>
> -#: lib/remote_branch_delete.tcl:152
> -msgid "A branch is required for 'Merged Into'."
> -msgstr "Для операции «Слияние с» требуется указать ветку."
> +#: lib/choose_repository.tcl:838
> +msgid "objects"
> +msgstr "объекты"
>
> -#: lib/remote_branch_delete.tcl:184
> +#: lib/choose_repository.tcl:846
>  #, tcl-format
> -msgid ""
> -"The following branches are not completely merged into %s:\n"
> -"\n"
> -" - %s"
> -msgstr "Следующие ветки могут быть объединены с %s при помощи операции слияния:\n\n - %s"
> +msgid "Unable to hardlink object: %s"
> +msgstr "Не могу создать «жесткую ссылку» на объект: %s"
>
> -#: lib/remote_branch_delete.tcl:189
> -#, tcl-format
> -msgid ""
> -"One or more of the merge tests failed because you have not fetched the "
> -"necessary commits.  Try fetching from %s first."
> -msgstr "Некоторые тесты на слияние не прошли, потому что вы не извлекли необходимые коммиты. Попытайтесь извлечь их из %s."
> +#: lib/choose_repository.tcl:903
> +msgid "Cannot fetch branches and objects.  See console output for details."
> +msgstr "Не удалось извлечь ветки и объекты. Дополнительная информация на консоли."
>
> -#: lib/remote_branch_delete.tcl:207
> -msgid "Please select one or more branches to delete."
> -msgstr "Укажите одну или несколько веток для удаления."
> +#: lib/choose_repository.tcl:914
> +msgid "Cannot fetch tags.  See console output for details."
> +msgstr "Не удалось извлечь метки. Дополнительная информация на консоли."
> +
> +#: lib/choose_repository.tcl:938
> +msgid "Cannot determine HEAD.  See console output for details."
> +msgstr "Не могу определить HEAD. Дополнительная информация на консоли."
>
> -#: lib/remote_branch_delete.tcl:226
> +#: lib/choose_repository.tcl:947
>  #, tcl-format
> -msgid "Deleting branches from %s"
> -msgstr "Удаление веток из %s"
> +msgid "Unable to cleanup %s"
> +msgstr "Не могу очистить %s"
>
> -#: lib/remote_branch_delete.tcl:292
> -msgid "No repository selected."
> -msgstr "Не указан репозиторий."
> +#: lib/choose_repository.tcl:953
> +msgid "Clone failed."
> +msgstr "Клонирование не удалось."
> +
> +#: lib/choose_repository.tcl:960
> +msgid "No default branch obtained."
> +msgstr "Ветка по умолчанию не была получена."
>
> -#: lib/remote_branch_delete.tcl:297
> +#: lib/choose_repository.tcl:971
>  #, tcl-format
> -msgid "Scanning %s..."
> -msgstr "Перечитывание %s…"
> +msgid "Cannot resolve %s as a commit."
> +msgstr "Не могу распознать %s как коммит."
>
> -#: lib/search.tcl:21
> -msgid "Find:"
> -msgstr "Поиск:"
> +#: lib/choose_repository.tcl:998
> +msgid "Creating working directory"
> +msgstr "Создаю рабочий каталог"
>
> -#: lib/search.tcl:23
> -msgid "Next"
> -msgstr "Дальше"
> +#: lib/choose_repository.tcl:1028
> +msgid "Initial file checkout failed."
> +msgstr "Не удалось получить начальное состояние файлов репозитория."
>
> -#: lib/search.tcl:24
> -msgid "Prev"
> -msgstr "Обратно"
> +#: lib/choose_repository.tcl:1072
> +msgid "Cloning submodules"
> +msgstr "Клонирование подмодулей"
>
> -#: lib/search.tcl:25
> -msgid "Case-Sensitive"
> -msgstr "Игн. большие/маленькие"
> +#: lib/choose_repository.tcl:1087
> +msgid "Cannot clone submodules."
> +msgstr "Не удалось клонировать подмодули."
>
> -#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
> -msgid "Cannot write shortcut:"
> -msgstr "Невозможно записать ссылку:"
> +#: lib/choose_repository.tcl:1110
> +msgid "Repository:"
> +msgstr "Репозиторий:"
>
> -#: lib/shortcut.tcl:137
> -msgid "Cannot write icon:"
> -msgstr "Невозможно записать значок:"
> +#: lib/choose_repository.tcl:1159
> +#, tcl-format
> +msgid "Failed to open repository %s:"
> +msgstr "Не удалось открыть репозиторий %s:"
>
> -#: lib/spellcheck.tcl:57
> -msgid "Unsupported spell checker"
> -msgstr "Неподдерживаемая программа проверки правописания"
> +#: lib/about.tcl:26
> +msgid "git-gui - a graphical user interface for Git."
> +msgstr "git-gui - графический пользовательский интерфейс к Git."
>
> -#: lib/spellcheck.tcl:65
> -msgid "Spell checking is unavailable"
> -msgstr "Проверка правописания не доступна"
> +#: lib/blame.tcl:74
> +#, tcl-format
> +msgid "%s (%s): File Viewer"
> +msgstr "%s (%s): Просмотр файла"
>
> -#: lib/spellcheck.tcl:68
> -msgid "Invalid spell checking configuration"
> -msgstr "Неправильная конфигурация программы проверки правописания"
> +#: lib/blame.tcl:80
> +msgid "Commit:"
> +msgstr "Коммит:"
>
> -#: lib/spellcheck.tcl:70
> -#, tcl-format
> -msgid "Reverting dictionary to %s."
> -msgstr "Словарь вернут к %s."
> +#: lib/blame.tcl:282
> +msgid "Copy Commit"
> +msgstr "Копировать SHA-1"
>
> -#: lib/spellcheck.tcl:73
> -msgid "Spell checker silently failed on startup"
> -msgstr "Программа проверки правописания не смогла запуститься"
> +#: lib/blame.tcl:286
> +msgid "Find Text..."
> +msgstr "Найти текст…"
>
> -#: lib/spellcheck.tcl:80
> -msgid "Unrecognized spell checker"
> -msgstr "Нераспознанная программа проверки правописания"
> +#: lib/blame.tcl:290
> +msgid "Goto Line..."
> +msgstr "Перейти на строку…"
>
> -#: lib/spellcheck.tcl:186
> -msgid "No Suggestions"
> -msgstr "Исправлений не найдено"
> +#: lib/blame.tcl:299
> +msgid "Do Full Copy Detection"
> +msgstr "Провести полный поиск копий"
>
> -#: lib/spellcheck.tcl:388
> -msgid "Unexpected EOF from spell checker"
> -msgstr "Программа проверки правописания прервала передачу данных"
> +#: lib/blame.tcl:303
> +msgid "Show History Context"
> +msgstr "Показать исторический контекст"
>
> -#: lib/spellcheck.tcl:392
> -msgid "Spell Checker Failed"
> -msgstr "Ошибка проверки правописания"
> +#: lib/blame.tcl:306
> +msgid "Blame Parent Commit"
> +msgstr "Авторы родительского коммита"
>
> -#: lib/sshkey.tcl:31
> +#: lib/blame.tcl:468
> +#, tcl-format
> +msgid "Reading %s..."
> +msgstr "Чтение %s…"
> +
> +#: lib/blame.tcl:596
> +msgid "Loading copy/move tracking annotations..."
> +msgstr "Загрузка аннотации копирований/переименований…"
> +
> +#: lib/blame.tcl:613
> +msgid "lines annotated"
> +msgstr "строк прокомментировано"
> +
> +#: lib/blame.tcl:815
> +msgid "Loading original location annotations..."
> +msgstr "Загрузка аннотаций первоначального положения объекта…"
> +
> +#: lib/blame.tcl:818
> +msgid "Annotation complete."
> +msgstr "Аннотация завершена."
> +
> +#: lib/blame.tcl:849
> +msgid "Busy"
> +msgstr "Занят"
> +
> +#: lib/blame.tcl:850
> +msgid "Annotation process is already running."
> +msgstr "Аннотация уже запущена"
> +
> +#: lib/blame.tcl:889
> +msgid "Running thorough copy detection..."
> +msgstr "Выполнение полного поиска копий…"
> +
> +#: lib/blame.tcl:957
> +msgid "Loading annotation..."
> +msgstr "Загрузка аннотации…"
> +
> +#: lib/blame.tcl:1010
> +msgid "Author:"
> +msgstr "Автор:"
> +
> +#: lib/blame.tcl:1014
> +msgid "Committer:"
> +msgstr "Коммитер:"
> +
> +#: lib/blame.tcl:1019
> +msgid "Original File:"
> +msgstr "Исходный файл:"
> +
> +#: lib/blame.tcl:1067
> +msgid "Cannot find HEAD commit:"
> +msgstr "Не удалось найти текущее состояние:"
> +
> +#: lib/blame.tcl:1122
> +msgid "Cannot find parent commit:"
> +msgstr "Не удалось найти родительское состояние:"
> +
> +#: lib/blame.tcl:1137
> +msgid "Unable to display parent"
> +msgstr "Не могу показать предка"
> +
> +#: lib/blame.tcl:1138 lib/diff.tcl:345
> +msgid "Error loading diff:"
> +msgstr "Ошибка загрузки изменений:"
> +
> +#: lib/blame.tcl:1279
> +msgid "Originally By:"
> +msgstr "Источник:"
> +
> +#: lib/blame.tcl:1285
> +msgid "In File:"
> +msgstr "Файл:"
> +
> +#: lib/blame.tcl:1290
> +msgid "Copied Or Moved Here By:"
> +msgstr "Скопировано/перемещено в:"
> +
> +#: lib/diff.tcl:77
> +#, tcl-format
> +msgid ""
> +"No differences detected.\n"
> +"\n"
> +"%s has no changes.\n"
> +"\n"
> +"The modification date of this file was updated by another application, but the content within the file was not changed.\n"
> +"\n"
> +"A rescan will be automatically started to find other files which may have the same state."
> +msgstr "Изменений не обнаружено.\n\nв %s отсутствуют изменения.\n\nДата изменения файла была обновлена другой программой, но содержимое файла осталось прежним.\n\nСейчас будет запущено перечитывание репозитория, чтобы найти подобные файлы."
> +
> +#: lib/diff.tcl:117
> +#, tcl-format
> +msgid "Loading diff of %s..."
> +msgstr "Загрузка изменений %s…"
> +
> +#: lib/diff.tcl:143
> +msgid ""
> +"LOCAL: deleted\n"
> +"REMOTE:\n"
> +msgstr "ЛОКАЛЬНО: удалён\nВНЕШНИЙ:\n"
> +
> +#: lib/diff.tcl:148
> +msgid ""
> +"REMOTE: deleted\n"
> +"LOCAL:\n"
> +msgstr "ВНЕШНИЙ: удалён\nЛОКАЛЬНО:\n"
> +
> +#: lib/diff.tcl:155
> +msgid "LOCAL:\n"
> +msgstr "ЛОКАЛЬНО:\n"
> +
> +#: lib/diff.tcl:158
> +msgid "REMOTE:\n"
> +msgstr "ВНЕШНИЙ:\n"
> +
> +#: lib/diff.tcl:220 lib/diff.tcl:344
> +#, tcl-format
> +msgid "Unable to display %s"
> +msgstr "Не могу показать %s"
> +
> +#: lib/diff.tcl:221
> +msgid "Error loading file:"
> +msgstr "Ошибка загрузки файла:"
> +
> +#: lib/diff.tcl:227
> +msgid "Git Repository (subproject)"
> +msgstr "Репозиторий Git (подпроект)"
> +
> +#: lib/diff.tcl:239
> +msgid "* Binary file (not showing content)."
> +msgstr "* Двоичный файл (содержимое не показано)"
> +
> +#: lib/diff.tcl:244
> +#, tcl-format
> +msgid ""
> +"* Untracked file is %d bytes.\n"
> +"* Showing only first %d bytes.\n"
> +msgstr "* Размер неотслеживаемого файла %d байт.\n* Показано первых %d байт.\n"
> +
> +#: lib/diff.tcl:250
> +#, tcl-format
> +msgid ""
> +"\n"
> +"* Untracked file clipped here by %s.\n"
> +"* To see the entire file, use an external editor.\n"
> +msgstr "\n* Неотслеживаемый файл обрезан: %s.\n* Чтобы увидеть весь файл, используйте внешний редактор.\n"
> +
> +#: lib/diff.tcl:583
> +msgid "Failed to unstage selected hunk."
> +msgstr "Не удалось исключить выбранную часть."
> +
> +#: lib/diff.tcl:591
> +msgid "Failed to revert selected hunk."
> +msgstr "Не удалось обратить изменения выбранного блока."
> +
> +#: lib/diff.tcl:594
> +msgid "Failed to stage selected hunk."
> +msgstr "Не удалось проиндексировать выбранный блок изменений."
> +
> +#: lib/diff.tcl:687
> +msgid "Failed to unstage selected line."
> +msgstr "Не удалось исключить выбранную строку."
> +
> +#: lib/diff.tcl:696
> +msgid "Failed to revert selected line."
> +msgstr "Не удалось обратить изменения выбраной строки."
> +
> +#: lib/diff.tcl:700
> +msgid "Failed to stage selected line."
> +msgstr "Не удалось проиндексировать выбранную строку."
> +
> +#: lib/diff.tcl:889
> +msgid "Failed to undo last revert."
> +msgstr "Не удалось отменить посленднее обращение изменений."
> +
> +#: lib/sshkey.tcl:34
>  msgid "No keys found."
>  msgstr "Ключ не найден"
>
> -#: lib/sshkey.tcl:34
> +#: lib/sshkey.tcl:37
>  #, tcl-format
>  msgid "Found a public key in: %s"
>  msgstr "Публичный ключ из %s"
>
> -#: lib/sshkey.tcl:40
> +#: lib/sshkey.tcl:43
>  msgid "Generate Key"
>  msgstr "Создать ключ"
>
> -#: lib/sshkey.tcl:56
> +#: lib/sshkey.tcl:61
>  msgid "Copy To Clipboard"
>  msgstr "Скопировать в буфер обмена"
>
> -#: lib/sshkey.tcl:70
> -msgid "Your OpenSSH Public Key"
> -msgstr "Ваш публичный ключ OpenSSH"
> +#: lib/sshkey.tcl:75
> +msgid "Your OpenSSH Public Key"
> +msgstr "Ваш публичный ключ OpenSSH"
> +
> +#: lib/sshkey.tcl:83
> +msgid "Generating..."
> +msgstr "Создание…"
> +
> +#: lib/sshkey.tcl:89
> +#, tcl-format
> +msgid ""
> +"Could not start ssh-keygen:\n"
> +"\n"
> +"%s"
> +msgstr "Ошибка запуска ssh-keygen:\n\n%s"
> +
> +#: lib/sshkey.tcl:116
> +msgid "Generation failed."
> +msgstr "Ключ не создан."
> +
> +#: lib/sshkey.tcl:123
> +msgid "Generation succeeded, but no keys found."
> +msgstr "Создание ключа завершилось, но результат не был найден"
> +
> +#: lib/sshkey.tcl:126
> +#, tcl-format
> +msgid "Your key is in: %s"
> +msgstr "Ваш ключ находится в: %s"
> +
> +#: lib/branch_create.tcl:23
> +#, tcl-format
> +msgid "%s (%s): Create Branch"
> +msgstr "%s (%s): Создание ветки"
> +
> +#: lib/branch_create.tcl:28
> +msgid "Create New Branch"
> +msgstr "Создать новую ветку"
> +
> +#: lib/branch_create.tcl:42
> +msgid "Branch Name"
> +msgstr "Имя ветки"
> +
> +#: lib/branch_create.tcl:57
> +msgid "Match Tracking Branch Name"
> +msgstr "Соответствовать имени отслеживаемой ветки"
> +
> +#: lib/branch_create.tcl:66
> +msgid "Starting Revision"
> +msgstr "Начальная версия"
> +
> +#: lib/branch_create.tcl:72
> +msgid "Update Existing Branch:"
> +msgstr "Обновить имеющуюся ветку:"
> +
> +#: lib/branch_create.tcl:75
> +msgid "No"
> +msgstr "Нет"
> +
> +#: lib/branch_create.tcl:80
> +msgid "Fast Forward Only"
> +msgstr "Только Fast Forward"
> +
> +#: lib/branch_create.tcl:97
> +msgid "Checkout After Creation"
> +msgstr "После создания сделать текущей"
> +
> +#: lib/branch_create.tcl:132
> +msgid "Please select a tracking branch."
> +msgstr "Укажите отлеживаемую ветку."
> +
> +#: lib/branch_create.tcl:141
> +#, tcl-format
> +msgid "Tracking branch %s is not a branch in the remote repository."
> +msgstr "Отслеживаемая ветка %s не является веткой на внешнем репозитории."
> +
> +#: lib/console.tcl:59
> +msgid "Working... please wait..."
> +msgstr "В процессе… пожалуйста, ждите…"
> +
> +#: lib/console.tcl:186
> +msgid "Success"
> +msgstr "Процесс успешно завершен"
> +
> +#: lib/console.tcl:200
> +msgid "Error: Command Failed"
> +msgstr "Ошибка: не удалось выполнить команду"
> +
> +#: lib/line.tcl:17
> +msgid "Goto Line:"
> +msgstr "Перейти на строку:"
> +
> +#: lib/line.tcl:23
> +msgid "Go"
> +msgstr "Перейти"
> +
> +#: lib/choose_rev.tcl:52
> +msgid "This Detached Checkout"
> +msgstr "Текущее отсоединенное состояние"
> +
> +#: lib/choose_rev.tcl:60
> +msgid "Revision Expression:"
> +msgstr "Выражение для определения версии:"
> +
> +#: lib/choose_rev.tcl:72
> +msgid "Local Branch"
> +msgstr "Локальная ветка:"
> +
> +#: lib/choose_rev.tcl:77
> +msgid "Tracking Branch"
> +msgstr "Отслеживаемая ветка"
> +
> +#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
> +msgid "Tag"
> +msgstr "Метка"
> +
> +#: lib/choose_rev.tcl:321
> +#, tcl-format
> +msgid "Invalid revision: %s"
> +msgstr "Неверная версия: %s"
> +
> +#: lib/choose_rev.tcl:342
> +msgid "No revision selected."
> +msgstr "Версия не указана."
> +
> +#: lib/choose_rev.tcl:350
> +msgid "Revision expression is empty."
> +msgstr "Пустое выражение для определения версии."
> +
> +#: lib/choose_rev.tcl:537
> +msgid "Updated"
> +msgstr "Обновлено"
> +
> +#: lib/choose_rev.tcl:565
> +msgid "URL"
> +msgstr "Ссылка"
> +
> +#: lib/commit.tcl:9
> +msgid ""
> +"There is nothing to amend.\n"
> +"\n"
> +"You are about to create the initial commit.  There is no commit before this to amend.\n"
> +msgstr "Отсутствует коммиты для исправления.\n\nВы создаете начальный коммит, здесь еще нечего исправлять.\n"
> +
> +#: lib/commit.tcl:18
> +msgid ""
> +"Cannot amend while merging.\n"
> +"\n"
> +"You are currently in the middle of a merge that has not been fully completed.  You cannot amend the prior commit unless you first abort the current merge activity.\n"
> +msgstr "Невозможно исправить коммит во время слияния.\n\nТекущее слияние не завершено. Невозможно исправить предыдуий коммит, не прерывая эту операцию.\n"
> +
> +#: lib/commit.tcl:56
> +msgid "Error loading commit data for amend:"
> +msgstr "Ошибка при загрузке данных для исправления коммита:"
> +
> +#: lib/commit.tcl:83
> +msgid "Unable to obtain your identity:"
> +msgstr "Невозможно получить информацию об авторстве:"
> +
> +#: lib/commit.tcl:88
> +msgid "Invalid GIT_COMMITTER_IDENT:"
> +msgstr "Недопустимый GIT_COMMITTER_IDENT:"
> +
> +#: lib/commit.tcl:138
> +#, tcl-format
> +msgid "warning: Tcl does not support encoding '%s'."
> +msgstr "предупреждение: Tcl не поддерживает кодировку «%s»."
> +
> +#: lib/commit.tcl:158
> +msgid ""
> +"Last scanned state does not match repository state.\n"
> +"\n"
> +"Another Git program has modified this repository since the last scan.  A rescan must be performed before another commit can be created.\n"
> +"\n"
> +"The rescan will be automatically started now.\n"
> +msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь. \n\nЭто будет сделано сейчас автоматически.\n"
> +
> +#: lib/commit.tcl:182
> +#, tcl-format
> +msgid ""
> +"Unmerged files cannot be committed.\n"
> +"\n"
> +"File %s has merge conflicts.  You must resolve them and stage the file before committing.\n"
> +msgstr "Нельзя выполнить коммит с незавершённой операцией слияния.\n\nДля файла %s возник конфликт слияния. Разрешите конфликт и добавьте их в индекс перед выполнением коммита.\n"
> +
> +#: lib/commit.tcl:190
> +#, tcl-format
> +msgid ""
> +"Unknown file state %s detected.\n"
> +"\n"
> +"File %s cannot be committed by this program.\n"
> +msgstr "Обнаружено неизвестное состояние файла %s.\n\nФайл %s не может быть закоммичен этой программой.\n"
> +
> +#: lib/commit.tcl:198
> +msgid ""
> +"No changes to commit.\n"
> +"\n"
> +"You must stage at least 1 file before you can commit.\n"
> +msgstr "Отсутствуют изменения для сохранения.\n\nДобавьте в индекс хотя бы один файл перед выполнением коммита.\n"
> +
> +#: lib/commit.tcl:213
> +msgid ""
> +"Please supply a commit message.\n"
> +"\n"
> +"A good commit message has the following format:\n"
> +"\n"
> +"- First line: Describe in one sentence what you did.\n"
> +"- Second line: Blank\n"
> +"- Remaining lines: Describe why this change is good.\n"
> +msgstr "Укажите сообщение коммита.\n\nРекомендуется следующий формат сообщения:\n\n- в первой строке краткое описание сделанных изменений\n- вторая строка пустая\n- в оставшихся строках опишите, что дают ваши изменения\n"
> +
> +#: lib/commit.tcl:244
> +msgid "Calling pre-commit hook..."
> +msgstr "Вызов перехватчика pre-commit…"
> +
> +#: lib/commit.tcl:259
> +msgid "Commit declined by pre-commit hook."
> +msgstr "Коммит прерван переватчиком pre-commit."
> +
> +#: lib/commit.tcl:278
> +msgid ""
> +"You are about to commit on a detached head. This is a potentially dangerous thing to do because if you switch to another branch you will lose your changes and it can be difficult to retrieve them later from the reflog. You should probably cancel this commit and create a new branch to continue.\n"
> +" \n"
> +" Do you really want to proceed with your Commit?"
> +msgstr "Вы собираетесь сделать коммит в отделённый HEAD. Это действие потенциально опасно, так как если вы переключитесь на другую ветку после этого, то вы потеряете свои изменения и их сложно будет потом найти с помощью журнала ссылок (reflog). Вам скорее всего следует отменить этот коммит и создать новую ветку до продолжения.\n \n Вы действительно хотите продолжить и создать коммит?"
> +
> +#: lib/commit.tcl:299
> +msgid "Calling commit-msg hook..."
> +msgstr "Вызов перехватчика commit-msg…"
> +
> +#: lib/commit.tcl:314
> +msgid "Commit declined by commit-msg hook."
> +msgstr "Коммит прерван переватчиком commit-msg"
> +
> +#: lib/commit.tcl:327
> +msgid "Committing changes..."
> +msgstr "Коммит изменений…"
> +
> +#: lib/commit.tcl:344
> +msgid "write-tree failed:"
> +msgstr "Программа write-tree завершилась с ошибкой:"
>
> -#: lib/sshkey.tcl:78
> -msgid "Generating..."
> -msgstr "Создание…"
> +#: lib/commit.tcl:345 lib/commit.tcl:395 lib/commit.tcl:422
> +msgid "Commit failed."
> +msgstr "Не удалось закоммитить изменения."
>
> -#: lib/sshkey.tcl:84
> +#: lib/commit.tcl:362
>  #, tcl-format
> +msgid "Commit %s appears to be corrupt"
> +msgstr "Коммит %s похоже поврежден"
> +
> +#: lib/commit.tcl:367
>  msgid ""
> -"Could not start ssh-keygen:\n"
> +"No changes to commit.\n"
>  "\n"
> -"%s"
> -msgstr "Ошибка запуска ssh-keygen:\n\n%s"
> +"No files were modified by this commit and it was not a merge commit.\n"
> +"\n"
> +"A rescan will be automatically started now.\n"
> +msgstr "Нет изменения для коммита.\n\nНи один файл не был изменен и не было слияния.\n\nСейчас автоматически запустится перечитывание репозитория.\n"
>
> -#: lib/sshkey.tcl:111
> -msgid "Generation failed."
> -msgstr "Ключ не создан."
> +#: lib/commit.tcl:374
> +msgid "No changes to commit."
> +msgstr "Нет изменения для коммита."
>
> -#: lib/sshkey.tcl:118
> -msgid "Generation succeeded, but no keys found."
> -msgstr "Создание ключа завершилось, но результат не был найден"
> +#: lib/commit.tcl:394
> +msgid "commit-tree failed:"
> +msgstr "Программа commit-tree завершилась с ошибкой:"
>
> -#: lib/sshkey.tcl:121
> -#, tcl-format
> -msgid "Your key is in: %s"
> -msgstr "Ваш ключ находится в: %s"
> +#: lib/commit.tcl:421
> +msgid "update-ref failed:"
> +msgstr "Программа update-ref завершилась с ошибкой:"
>
> -#: lib/status_bar.tcl:83
> +#: lib/commit.tcl:514
>  #, tcl-format
> -msgid "%s ... %*i of %*i %s (%3i%%)"
> -msgstr "%s … %*i из %*i %s (%3i%%)"
> +msgid "Created commit %s: %s"
> +msgstr "Создан коммит %s: %s "
>
> -#: lib/tools.tcl:75
> +#: lib/branch_delete.tcl:16
>  #, tcl-format
> -msgid "Running %s requires a selected file."
> -msgstr "Запуск %s требует выбранного файла."
> +msgid "%s (%s): Delete Branch"
> +msgstr "%s (%s): Удаление ветки"
>
> -#: lib/tools.tcl:90
> -#, tcl-format
> -msgid "Are you sure you want to run %s?"
> -msgstr "Действительно запустить %s?"
> +#: lib/branch_delete.tcl:21
> +msgid "Delete Local Branch"
> +msgstr "Удалить локальную ветку"
>
> -#: lib/tools.tcl:110
> -#, tcl-format
> -msgid "Tool: %s"
> -msgstr "Вспомогательная операция: %s"
> +#: lib/branch_delete.tcl:39
> +msgid "Local Branches"
> +msgstr "Локальные ветки"
>
> -#: lib/tools.tcl:111
> -#, tcl-format
> -msgid "Running: %s"
> -msgstr "Выполнение: %s"
> +#: lib/branch_delete.tcl:51
> +msgid "Delete Only If Merged Into"
> +msgstr "Удалить только в случае, если было слияние с"
>
> -#: lib/tools.tcl:149
> +#: lib/branch_delete.tcl:103
>  #, tcl-format
> -msgid "Tool completed successfully: %s"
> -msgstr "Программа %s завершилась успешно."
> +msgid "The following branches are not completely merged into %s:"
> +msgstr "Ветки, которые не полностью сливаются с %s:"
>
> -#: lib/tools.tcl:151
> +#: lib/branch_delete.tcl:131
>  #, tcl-format
> -msgid "Tool failed: %s"
> -msgstr "Ошибка выполнения программы: %s"
> +msgid " - %s:"
> +msgstr " — %s:"
>
> -#: lib/tools_dlg.tcl:22
> -msgid "Add Tool"
> -msgstr "Добавить вспомогательную операцию"
> -
> -#: lib/tools_dlg.tcl:28
> -msgid "Add New Tool Command"
> -msgstr "Новая вспомогательная операция"
> +#: lib/branch_delete.tcl:141
> +#, tcl-format
> +msgid ""
> +"Failed to delete branches:\n"
> +"%s"
> +msgstr "Не удалось удалить ветки:\n%s"
>
> -#: lib/tools_dlg.tcl:33
> -msgid "Add globally"
> -msgstr "Добавить для всех репозиториев"
> +#: lib/date.tcl:25
> +#, tcl-format
> +msgid "Invalid date from Git: %s"
> +msgstr "Неправильная дата в репозитории: %s"
>
> -#: lib/tools_dlg.tcl:45
> -msgid "Tool Details"
> -msgstr "Описание вспомогательной операции"
> +#: lib/database.tcl:42
> +msgid "Number of loose objects"
> +msgstr "Количество несвязанных объектов"
>
> -#: lib/tools_dlg.tcl:48
> -msgid "Use '/' separators to create a submenu tree:"
> -msgstr "Используйте «/» для создания подменю"
> +#: lib/database.tcl:43
> +msgid "Disk space used by loose objects"
> +msgstr "Объем дискового пространства, занятый несвязанными объектами"
>
> -#: lib/tools_dlg.tcl:61
> -msgid "Command:"
> -msgstr "Команда:"
> +#: lib/database.tcl:44
> +msgid "Number of packed objects"
> +msgstr "Количество упакованных объектов"
>
> -#: lib/tools_dlg.tcl:74
> -msgid "Show a dialog before running"
> -msgstr "Показать диалог перед запуском"
> +#: lib/database.tcl:45
> +msgid "Number of packs"
> +msgstr "Количество pack-файлов"
>
> -#: lib/tools_dlg.tcl:80
> -msgid "Ask the user to select a revision (sets $REVISION)"
> -msgstr "Запрос на выбор версии (устанавливает $REVISION)"
> +#: lib/database.tcl:46
> +msgid "Disk space used by packed objects"
> +msgstr "Объем дискового пространства, занятый упакованными объектами"
>
> -#: lib/tools_dlg.tcl:85
> -msgid "Ask the user for additional arguments (sets $ARGS)"
> -msgstr "Запрос дополнительных аргументов (устанавливает $ARGS)"
> +#: lib/database.tcl:47
> +msgid "Packed objects waiting for pruning"
> +msgstr "Несвязанные объекты, которые можно удалить"
>
> -#: lib/tools_dlg.tcl:92
> -msgid "Don't show the command output window"
> -msgstr "Не показывать окно вывода команды"
> +#: lib/database.tcl:48
> +msgid "Garbage files"
> +msgstr "Мусор"
>
> -#: lib/tools_dlg.tcl:97
> -msgid "Run only if a diff is selected ($FILENAME not empty)"
> -msgstr "Запуск только если показан список изменений ($FILENAME не пусто)"
> +#: lib/database.tcl:66
> +#, tcl-format
> +msgid "%s (%s): Database Statistics"
> +msgstr "%s (%s): Статистика базы данных"
>
> -#: lib/tools_dlg.tcl:121
> -msgid "Please supply a name for the tool."
> -msgstr "Укажите название вспомогательной операции."
> +#: lib/database.tcl:72
> +msgid "Compressing the object database"
> +msgstr "Сжатие базы объектов"
>
> -#: lib/tools_dlg.tcl:129
> -#, tcl-format
> -msgid "Tool '%s' already exists."
> -msgstr "Вспомогательная операция «%s» уже существует."
> +#: lib/database.tcl:83
> +msgid "Verifying the object database with fsck-objects"
> +msgstr "Проверка базы объектов при помощи fsck"
>
> -#: lib/tools_dlg.tcl:151
> +#: lib/database.tcl:107
>  #, tcl-format
>  msgid ""
> -"Could not add tool:\n"
> -"%s"
> -msgstr "Ошибка добавления программы:\n%s"
> +"This repository currently has approximately %i loose objects.\n"
> +"\n"
> +"To maintain optimal performance it is strongly recommended that you compress the database.\n"
> +"\n"
> +"Compress the database now?"
> +msgstr "Этот репозиторий сейчас содержит примерно %i свободных объектов\n\nДля лучшей производительности рекомендуется сжать базу данных.\n\nСжать базу данных сейчас?"
>
> -#: lib/tools_dlg.tcl:190
> -msgid "Remove Tool"
> -msgstr "Удалить программу"
> +#: lib/error.tcl:20
> +#, tcl-format
> +msgid "%s: error"
> +msgstr "%s: ошибка"
>
> -#: lib/tools_dlg.tcl:196
> -msgid "Remove Tool Commands"
> -msgstr "Удалить команды программы"
> +#: lib/error.tcl:36
> +#, tcl-format
> +msgid "%s: warning"
> +msgstr "%s: предупреждение"
>
> -#: lib/tools_dlg.tcl:200
> -msgid "Remove"
> -msgstr "Удалить"
> +#: lib/error.tcl:80
> +#, tcl-format
> +msgid "%s hook failed:"
> +msgstr "ошибка перехватчика %s:"
>
> -#: lib/tools_dlg.tcl:236
> -msgid "(Blue denotes repository-local tools)"
> -msgstr "(Синим выделены программы локальные репозиторию)"
> +#: lib/error.tcl:96
> +msgid "You must correct the above errors before committing."
> +msgstr "Перед коммитом, исправьте вышеуказанные ошибки."
>
> -#: lib/tools_dlg.tcl:297
> +#: lib/error.tcl:116
>  #, tcl-format
> -msgid "Run Command: %s"
> -msgstr "Запуск команды: %s"
> +msgid "%s (%s): error"
> +msgstr "%s (%s): ошибка"
>
> -#: lib/tools_dlg.tcl:311
> -msgid "Arguments"
> -msgstr "Аргументы"
> +#: lib/merge.tcl:13
> +msgid ""
> +"Cannot merge while amending.\n"
> +"\n"
> +"You must finish amending this commit before starting any type of merge.\n"
> +msgstr "Невозможно выполнить слияние во время исправления.\n\nЗавершите исправление данного коммита перед выполнением операции слияния.\n"
>
> -#: lib/tools_dlg.tcl:348
> -msgid "OK"
> -msgstr "OK"
> +#: lib/merge.tcl:27
> +msgid ""
> +"Last scanned state does not match repository state.\n"
> +"\n"
> +"Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.\n"
> +"\n"
> +"The rescan will be automatically started now.\n"
> +msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем слияние может быть сделано.\n\nЭто будет сделано сейчас автоматически.\n"
>
> -#: lib/transport.tcl:7
> +#: lib/merge.tcl:45
>  #, tcl-format
> -msgid "Fetching new changes from %s"
> -msgstr "Извлечение изменений из %s "
> +msgid ""
> +"You are in the middle of a conflicted merge.\n"
> +"\n"
> +"File %s has merge conflicts.\n"
> +"\n"
> +"You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.\n"
> +msgstr "Предыдущее слияние не завершено из-за конфликта.\n\nДля файла %s возник конфликт слияния.\n\nРазрешите конфликт, добавьте файл в индекс и закоммитьте. Только после этого можно начать следующее слияние.\n"
>
> -#: lib/transport.tcl:18
> +#: lib/merge.tcl:55
>  #, tcl-format
> -msgid "remote prune %s"
> -msgstr "чистка внешнего %s"
> +msgid ""
> +"You are in the middle of a change.\n"
> +"\n"
> +"File %s is modified.\n"
> +"\n"
> +"You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n"
> +msgstr "Вы находитесь в процессе изменений.\n\nФайл %s изменён.\n\nВы должны завершить текущий коммит перед началом слияния. В случае необходимости, это позволит прервать операцию слияния.\n"
>
> -#: lib/transport.tcl:19
> +#: lib/merge.tcl:108
>  #, tcl-format
> -msgid "Pruning tracking branches deleted from %s"
> -msgstr "Чистка отслеживаемых веток, удалённых из %s"
> +msgid "%s of %s"
> +msgstr "%s из %s"
>
> -#: lib/transport.tcl:26
> +#: lib/merge.tcl:126
>  #, tcl-format
> -msgid "Pushing changes to %s"
> -msgstr "Отправка изменений в %s "
> +msgid "Merging %s and %s..."
> +msgstr "Слияние %s и %s…"
> +
> +#: lib/merge.tcl:137
> +msgid "Merge completed successfully."
> +msgstr "Слияние успешно завершено."
> +
> +#: lib/merge.tcl:139
> +msgid "Merge failed.  Conflict resolution is required."
> +msgstr "Не удалось завершить слияние. Требуется разрешение конфликта."
>
> -#: lib/transport.tcl:64
> +#: lib/merge.tcl:156
>  #, tcl-format
> -msgid "Mirroring to %s"
> -msgstr "Точное копирование в %s"
> +msgid "%s (%s): Merge"
> +msgstr "%s (%s): Слияние"
>
> -#: lib/transport.tcl:82
> +#: lib/merge.tcl:164
>  #, tcl-format
> -msgid "Pushing %s %s to %s"
> -msgstr "Отправка %s %s в %s"
> +msgid "Merge Into %s"
> +msgstr "Слияние с %s"
>
> -#: lib/transport.tcl:100
> -msgid "Push Branches"
> -msgstr "Отправить ветки"
> +#: lib/merge.tcl:183
> +msgid "Revision To Merge"
> +msgstr "Версия, с которой провести слияние"
>
> -#: lib/transport.tcl:114
> -msgid "Source Branches"
> -msgstr "Исходные ветки"
> +#: lib/merge.tcl:218
> +msgid ""
> +"Cannot abort while amending.\n"
> +"\n"
> +"You must finish amending this commit.\n"
> +msgstr "Невозможно прервать исправление.\n\nЗавершите текущее исправление коммита.\n"
>
> -#: lib/transport.tcl:131
> -msgid "Destination Repository"
> -msgstr "Репозиторий назначения"
> +#: lib/merge.tcl:228
> +msgid ""
> +"Abort merge?\n"
> +"\n"
> +"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
> +"\n"
> +"Continue with aborting the current merge?"
> +msgstr "Прервать операцию слияния?\n\nПрерывание текущего слияния приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
>
> -#: lib/transport.tcl:169
> -msgid "Transfer Options"
> -msgstr "Настройки отправки"
> +#: lib/merge.tcl:234
> +msgid ""
> +"Reset changes?\n"
> +"\n"
> +"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
> +"\n"
> +"Continue with resetting the current changes?"
> +msgstr "Сбросить изменения?\n\nСброс изменений приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
>
> -#: lib/transport.tcl:171
> -msgid "Force overwrite existing branch (may discard changes)"
> -msgstr "Принудительно перезаписать существующую ветку (возможна потеря изменений)"
> +#: lib/merge.tcl:246
> +msgid "Aborting"
> +msgstr "Прерываю"
>
> -#: lib/transport.tcl:175
> -msgid "Use thin pack (for slow network connections)"
> -msgstr "Использовать thin pack (для медленных сетевых подключений)"
> +#: lib/merge.tcl:247
> +msgid "files reset"
> +msgstr "изменения в файлах отменены"
>
> -#: lib/transport.tcl:179
> -msgid "Include tags"
> -msgstr "Передать метки"
> +#: lib/merge.tcl:277
> +msgid "Abort failed."
> +msgstr "Прервать не удалось."
> +
> +#: lib/merge.tcl:279
> +msgid "Abort completed.  Ready."
> +msgstr "Прервано."
> --
> 2.24.0.windows.2
>


-- 
Sincerely,
Dimitriy Ryazantcev

^ permalink raw reply	[relevance 0%]

* Re: Extending and updating gitglossary
  @ 2020-11-10 23:52  4%                       ` Jakub Narębski
  0 siblings, 0 replies; 200+ results
From: Jakub Narębski @ 2020-11-10 23:52 UTC (permalink / raw)
  To: Philip Oakley
  Cc: Junio C Hamano, Abhishek Kumar, git,
	Abhishek Kumar via GitGitGadget, Derrick Stolee, Taylor Blau

Hello Philip,

Philip Oakley <philipoakley@iee.email> writes:
> On 10/11/2020 01:35, Jakub Narębski wrote:
>> Philip Oakley <philipoakley@iee.email> writes:
>>> On 06/11/2020 18:26, Jakub Narębski wrote:
>>>> Junio C Hamano <gitster@pobox.com> writes:
>>>>> Philip Oakley <philipoakley@iee.email> writes:
>>>>>
>>>>>> This may be not part of the the main project, but could you consider, if
>>>>>> time permits, also adding some entries into the Git Glossary (`git help
>>>>>> glossary`) for the various terms we are using here and elsewhere, e.g.
>>>>>> 'topological levels', 'generation number', 'corrected commit date' (and
>>>>>> its fancy technical name for the use of date heuristics e.g. the
>>>>>> 'chronological ordering';).
>>>>>>
>>>>>> The glossary can provide a reference, once the issues are resolved. The
>>>>>> History Simplification and Commit Ordering section of git-log maybe a
>>>>>> useful guide to some of the terms that would link to the glossary.
[...]
>> What terms you feel need glossary entry?
>
> While it was Junio that made the comment, I'd agree that we should be
> using the glossary to explain, in a general sense, the terms that are
> used is a specialist sense. As the user community expands, their natural
> understanding of some of the terms diminishes.

I was hoping for a list of terms from the abovementioned sections of
git-log manpage you feel need entry in gitglosary(7).

[...]
>> To be more precise, I think that user-facing glossary should include
>> only terms that appear in user-facing documentation and in output
>> messages of Git commands (with the possible exception of maybe output
>> messages of some low-level plumbing).
>
> And where implied, the underlying concepts when they aren't obvious, or
> lack general terms (e.g. the 'staging area' discussions)

True, 'staging area' should IMVHO be in glossary (replacing or in
addition to older less specific term 'index', previous name for 'staging
area' term).

>> I think that the developer-facing glossary should include terms that
>> appear in technical documentation, and in commit messages in Git
>> history.

Such as 'topological levels', 'commit slab' / 'on the slab', etc.

>>> However we do mention "topolog*"  in a number of the manual pages, and
>>> rather less, as yet, in the technical pages.
>>>
>>> "Lexicographic" and "chronological" are in the same group of fancy
>>> technical words ;-)
>>
>> I think that 'topological level' would appear only in technical
>> documentation; if it would be the case then there is no reason to add it
>> to user-facing glossary (to gitglossary manpage).
>>
>> 'Topological order' or 'topological sort', 'lexicographical order' and
>> 'chronological order' are not Git-specific terms, and there are no
>> Git-specific ambiguities.  I am therefore a bit unsure about adding them
>> to *Git* glossary.
>
> It is that they aren't terms used in normal speech, so many folks do not
> comprehend the implied precision that the docs assume, nor the problems
> they may hide.

Right.

>> - In computer science, a _topological sort_ or _topological_ ordering of
>>   a directed graph is a linear ordering of its vertices such that for
>>   every directed edge uv from vertex u to vertex v, u comes before v in
>>   the ordering.
>
> Does this imply that those who aren't computer scientists shouldn't be
> using Git?

I think that in most cases where we refer to topological order in the
documentation we describe it there.  It might be good idea to add it to
the glossary, especially because Git uses it often in a very specific
sense.

On the other hand, should we define 'topology' or 'graph' as well? Or
'glossary' ;-) ? Those don't have any special meaning in Git, and can be
as well found in the dictionary or Wikipedia.

>>   For Git it means that top to bottom, commits always appear before
>>   their parents. With `--graph` or `--topo-order` Git also avoids
>>   showing commits on multiple lines of history intermixed.
>>
>> - In mathematics, the _lexicographic_ or _lexicographical order_ (also
>>   known as lexical order, dictionary order, etc.) is a generalization of
>>   the alphabetical order.
>>
>>   For Git it is simply alphabetical order. 
>
> ASCII order, Case sensitivity, Special characters, etc.

Actually I don't know. Let me check: the only place this term appears in
the documentation is in git-tag(1) manpage and related documentation.
It simplly uses strcmp(), or strcasecmp() when using `--ignore-case`
option; so by default case sensitive.

It looks like it does not take locale-specific rules.

>> - _Chronological order_ is the arrangement of things following one after
>>   another in time; or in other words date order.
>
> Given that most résumés (the thing most folk see that asks for date
> order) is latest first, does this clarify which way chronological is? (I
> see this regularly in my other volunteer work).

Right, it might be not obvious at first glance that Git outputs most
recent commits first, that is newest commits are on top. Though if you
think about it in more detail, it is the only ordering that makes sense,
especially for projects with a long history; first, it is newest commits
that are most interesting, and second Git always walks the history from
child to parent.

>>   Note that `git log --date-order` commits also always appear before
>>   their parents, but otherwise commits are shown in the commit timestamp
>>   order (committer date order)

[...]
>>> Git does rip up most of what folks think about version "control",
>>> usually based on the imperfect replication of physical artefacts.
>>
>> I don't quite understand what you wanted to say there.  Could you
>> explain in more detail, please?
>
> Background, I see Git & Version Control from an engineers view point,
> rather than developers view.
>
> In the "real" world there are no perfect copies, we serialise key items
> so that we can track their degradation, and replace them when required.
> We attempt to "Control" what is happening. Our documentation and
> monitoring systems have layers of control to ensure only suitably
> qualified persons may access and inspect critical items, can record and
> access previous status reports, etc. There is only one "Mona Lisa", with
> critical access controls, even though there are 'copies'
> https://en.wikipedia.org/wiki/Mona_Lisa#Early_versions_and_copies.
> Almost all of our terminology for configuration control comes from the
> 'real' world, i.e. pre-modern computing.
>
> Git turns all that on its head. We can make perfect duplicates (they're
> not copies, not replicas..). The Object name is immutable. It's either
> right or wrong (exempt the SHAttered sha-1 breakage; were moving to
> sha-256). Git does *not* provide any access control. It supports the
> 'software freedoms' by distributing the control to the user. The
> repository is a version storage system, and the OIDs allow easy
> authentication between folks that they are looking at the same object,
> and all its implied descendants.
>
> Git has ripped up classical 'real' world version control. In many areas
> we need new or alternative terms, and documents that explain them to
> screen writers(*) and the many other non CS-major users of Git (and some
> engineers;-)
>
> (*) there's a diff pattern for them, IIRC, or at least one was proposed.

Right, though for me the concept of 'version control' was by default
always about the digital, usually the source code.

There are different editions of books, changes to non-digital technical
drawings and plans (AFAIK often in the form of physical foil overlays as
subsequent layers, if done well; overdrawing on the same layer if not),
amendment and changes to laws, etc.


Anyway, the question is what level of knowledge can we assume from the
average Git user -- this would affect the spread of terms that should be
considered for the Git glossary.

Best,
-- 
Jakub Narębski

^ permalink raw reply	[relevance 4%]

* [PATCH] git-gui: update Russian translation
@ 2020-11-06 18:49  1% Dimitriy Ryazantcev
  2020-11-18 11:02  0% ` Dimitriy
  0 siblings, 1 reply; 200+ results
From: Dimitriy Ryazantcev @ 2020-11-06 18:49 UTC (permalink / raw)
  To: git; +Cc: Dimitriy Ryazantcev

Translation is done on Transifex: https://www.transifex.com/djm00n/git-po-ru/git-gui/
If you have any corrections please report them there.

Signed-off-by: Dimitriy Ryazantcev <dimitriy.ryazantcev@gmail.com>
---
 po/ru.po | 3287 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 1778 insertions(+), 1509 deletions(-)

diff --git a/po/ru.po b/po/ru.po
index 9f5305c..161ee1a 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -2,14 +2,14 @@
 # Copyright (C) 2007 Shawn Pearce
 # This file is distributed under the same license as the git-gui package.
 # Translators:
-# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016
+# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016,2020
 # Irina Riesen <irina.riesen@gmail.com>, 2007
 msgid ""
 msgstr ""
 "Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-26 15:47-0800\n"
-"PO-Revision-Date: 2016-06-30 12:39+0000\n"
+"POT-Creation-Date: 2020-02-08 22:54+0100\n"
+"PO-Revision-Date: 2020-11-05 11:20+0000\n"
 "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -18,33 +18,33 @@ msgstr ""
 "Language: ru\n"
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 
-#: git-gui.sh:41 git-gui.sh:793 git-gui.sh:807 git-gui.sh:820 git-gui.sh:903
-#: git-gui.sh:922
-msgid "git-gui: fatal error"
-msgstr "git-gui: критическая ошибка"
-
-#: git-gui.sh:743
+#: git-gui.sh:847
 #, tcl-format
 msgid "Invalid font specified in %s:"
 msgstr "В %s установлен неверный шрифт:"
 
-#: git-gui.sh:779
+#: git-gui.sh:901
 msgid "Main Font"
 msgstr "Шрифт интерфейса"
 
-#: git-gui.sh:780
+#: git-gui.sh:902
 msgid "Diff/Console Font"
 msgstr "Шрифт консоли и изменений (diff)"
 
-#: git-gui.sh:794
+#: git-gui.sh:917 git-gui.sh:931 git-gui.sh:944 git-gui.sh:1034
+#: git-gui.sh:1053 git-gui.sh:3212
+msgid "git-gui: fatal error"
+msgstr "git-gui: критическая ошибка"
+
+#: git-gui.sh:918
 msgid "Cannot find git in PATH."
 msgstr "git не найден в PATH."
 
-#: git-gui.sh:821
+#: git-gui.sh:945
 msgid "Cannot parse Git version string:"
 msgstr "Невозможно распознать строку версии Git: "
 
-#: git-gui.sh:839
+#: git-gui.sh:970
 #, tcl-format
 msgid ""
 "Git version cannot be determined.\n"
@@ -56,473 +56,519 @@ msgid ""
 "Assume '%s' is version 1.5.0?\n"
 msgstr "Невозможно определить версию Git\n\n%s указывает на версию «%s».\n\nдля %s требуется версия Git, начиная с 1.5.0\n\nПредположить, что «%s» и есть версия 1.5.0?\n"
 
-#: git-gui.sh:1128
+#: git-gui.sh:1267
 msgid "Git directory not found:"
 msgstr "Каталог Git не найден:"
 
-#: git-gui.sh:1146
+#: git-gui.sh:1301
 msgid "Cannot move to top of working directory:"
 msgstr "Невозможно перейти к корню рабочего каталога репозитория: "
 
-#: git-gui.sh:1154
+#: git-gui.sh:1309
 msgid "Cannot use bare repository:"
 msgstr "Невозможно использование репозитория без рабочего каталога:"
 
-#: git-gui.sh:1162
+#: git-gui.sh:1317
 msgid "No working directory"
 msgstr "Отсутствует рабочий каталог"
 
-#: git-gui.sh:1334 lib/checkout_op.tcl:306
+#: git-gui.sh:1491 lib/checkout_op.tcl:306
 msgid "Refreshing file status..."
 msgstr "Обновление информации о состоянии файлов…"
 
-#: git-gui.sh:1390
+#: git-gui.sh:1551
 msgid "Scanning for modified files ..."
 msgstr "Поиск измененных файлов…"
 
-#: git-gui.sh:1454
+#: git-gui.sh:1629
 msgid "Calling prepare-commit-msg hook..."
 msgstr "Вызов перехватчика prepare-commit-msg…"
 
-#: git-gui.sh:1471
+#: git-gui.sh:1646
 msgid "Commit declined by prepare-commit-msg hook."
 msgstr "Коммит прерван перехватчиком prepare-commit-msg."
 
-#: git-gui.sh:1629 lib/browser.tcl:246
+#: git-gui.sh:1804 lib/browser.tcl:252
 msgid "Ready."
 msgstr "Готово."
 
-#: git-gui.sh:1787
+#: git-gui.sh:1968
 #, tcl-format
-msgid "Displaying only %s of %s files."
-msgstr "Показано %s из %s файлов."
+msgid ""
+"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s "
+"files."
+msgstr "Лимит отображаемых файлов достигнут (gui.maxfilesdisplayed = %s), не все %s файлы показаны."
 
-#: git-gui.sh:1913
+#: git-gui.sh:2091
 msgid "Unmodified"
 msgstr "Не изменено"
 
-#: git-gui.sh:1915
+#: git-gui.sh:2093
 msgid "Modified, not staged"
 msgstr "Изменено, не в индексе"
 
-#: git-gui.sh:1916 git-gui.sh:1924
+#: git-gui.sh:2094 git-gui.sh:2106
 msgid "Staged for commit"
 msgstr "В индексе для коммита"
 
-#: git-gui.sh:1917 git-gui.sh:1925
+#: git-gui.sh:2095 git-gui.sh:2107
 msgid "Portions staged for commit"
 msgstr "Части, в индексе для коммита"
 
-#: git-gui.sh:1918 git-gui.sh:1926
+#: git-gui.sh:2096 git-gui.sh:2108
 msgid "Staged for commit, missing"
 msgstr "В индексе для коммита, отсутствует"
 
-#: git-gui.sh:1920
+#: git-gui.sh:2098
 msgid "File type changed, not staged"
 msgstr "Тип файла изменён, не в индексе"
 
-#: git-gui.sh:1921
+#: git-gui.sh:2099 git-gui.sh:2100
+msgid "File type changed, old type staged for commit"
+msgstr "Тип файла изменён, старый тип файла в индексе"
+
+#: git-gui.sh:2101
 msgid "File type changed, staged"
 msgstr "Тип файла изменён, в индексе"
 
-#: git-gui.sh:1923
+#: git-gui.sh:2102
+msgid "File type change staged, modification not staged"
+msgstr "Изменение типа файла в индексе, изменение не в индексе"
+
+#: git-gui.sh:2103
+msgid "File type change staged, file missing"
+msgstr "Изменение типа файла в индексе, файл не найден"
+
+#: git-gui.sh:2105
 msgid "Untracked, not staged"
 msgstr "Не отслеживается, не в индексе"
 
-#: git-gui.sh:1928
+#: git-gui.sh:2110
 msgid "Missing"
 msgstr "Отсутствует"
 
-#: git-gui.sh:1929
+#: git-gui.sh:2111
 msgid "Staged for removal"
 msgstr "В индексе для удаления"
 
-#: git-gui.sh:1930
+#: git-gui.sh:2112
 msgid "Staged for removal, still present"
 msgstr "В индексе для удаления, еще не удалено"
 
-#: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935
-#: git-gui.sh:1936 git-gui.sh:1937
+#: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117
+#: git-gui.sh:2118 git-gui.sh:2119
 msgid "Requires merge resolution"
 msgstr "Требуется разрешение конфликта при слиянии"
 
-#: git-gui.sh:1972
-msgid "Starting gitk... please wait..."
-msgstr "Запускается gitk… Подождите, пожалуйста…"
-
-#: git-gui.sh:1984
+#: git-gui.sh:2164
 msgid "Couldn't find gitk in PATH"
 msgstr "gitk не найден в PATH."
 
-#: git-gui.sh:2043
+#: git-gui.sh:2210 git-gui.sh:2245
+#, tcl-format
+msgid "Starting %s... please wait..."
+msgstr "Запускается %s… Подождите, пожалуйста…"
+
+#: git-gui.sh:2224
 msgid "Couldn't find git gui in PATH"
 msgstr "git gui не найден в PATH."
 
-#: git-gui.sh:2455 lib/choose_repository.tcl:36
+#: git-gui.sh:2726 lib/choose_repository.tcl:53
 msgid "Repository"
 msgstr "Репозиторий"
 
-#: git-gui.sh:2456
+#: git-gui.sh:2727
 msgid "Edit"
-msgstr "Редактировать"
+msgstr "Правка"
 
-#: git-gui.sh:2458 lib/choose_rev.tcl:561
+#: git-gui.sh:2729 lib/choose_rev.tcl:567
 msgid "Branch"
 msgstr "Ветка"
 
-#: git-gui.sh:2461 lib/choose_rev.tcl:548
+#: git-gui.sh:2732 lib/choose_rev.tcl:554
 msgid "Commit@@noun"
 msgstr "Коммит"
 
-#: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
+#: git-gui.sh:2735 lib/merge.tcl:127 lib/merge.tcl:174
 msgid "Merge"
 msgstr "Слияние"
 
-#: git-gui.sh:2465 lib/choose_rev.tcl:557
+#: git-gui.sh:2736 lib/choose_rev.tcl:563
 msgid "Remote"
 msgstr "Внешние репозитории"
 
-#: git-gui.sh:2468
+#: git-gui.sh:2739
 msgid "Tools"
 msgstr "Вспомогательные операции"
 
-#: git-gui.sh:2477
+#: git-gui.sh:2748
 msgid "Explore Working Copy"
 msgstr "Просмотр рабочего каталога"
 
-#: git-gui.sh:2483
+#: git-gui.sh:2763
+msgid "Git Bash"
+msgstr "Git Bash"
+
+#: git-gui.sh:2772
 msgid "Browse Current Branch's Files"
 msgstr "Просмотреть файлы текущей ветки"
 
-#: git-gui.sh:2487
+#: git-gui.sh:2776
 msgid "Browse Branch Files..."
 msgstr "Показать файлы ветки…"
 
-#: git-gui.sh:2492
+#: git-gui.sh:2781
 msgid "Visualize Current Branch's History"
 msgstr "Показать историю текущей ветки"
 
-#: git-gui.sh:2496
+#: git-gui.sh:2785
 msgid "Visualize All Branch History"
 msgstr "Показать историю всех веток"
 
-#: git-gui.sh:2503
+#: git-gui.sh:2792
 #, tcl-format
 msgid "Browse %s's Files"
 msgstr "Показать файлы ветки %s"
 
-#: git-gui.sh:2505
+#: git-gui.sh:2794
 #, tcl-format
 msgid "Visualize %s's History"
 msgstr "Показать историю ветки %s"
 
-#: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67
+#: git-gui.sh:2799 lib/database.tcl:40
 msgid "Database Statistics"
 msgstr "Статистика базы данных"
 
-#: git-gui.sh:2513 lib/database.tcl:34
+#: git-gui.sh:2802 lib/database.tcl:33
 msgid "Compress Database"
 msgstr "Сжать базу данных"
 
-#: git-gui.sh:2516
+#: git-gui.sh:2805
 msgid "Verify Database"
 msgstr "Проверить базу данных"
 
-#: git-gui.sh:2523 git-gui.sh:2527 git-gui.sh:2531 lib/shortcut.tcl:8
-#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
+#: git-gui.sh:2812 git-gui.sh:2816 git-gui.sh:2820
 msgid "Create Desktop Icon"
 msgstr "Создать ярлык на рабочем столе"
 
-#: git-gui.sh:2539 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191
+#: git-gui.sh:2828 lib/choose_repository.tcl:209 lib/choose_repository.tcl:217
 msgid "Quit"
 msgstr "Выход"
 
-#: git-gui.sh:2547
+#: git-gui.sh:2836
 msgid "Undo"
 msgstr "Отменить"
 
-#: git-gui.sh:2550
+#: git-gui.sh:2839
 msgid "Redo"
 msgstr "Повторить"
 
-#: git-gui.sh:2554 git-gui.sh:3109
+#: git-gui.sh:2843 git-gui.sh:3461
 msgid "Cut"
 msgstr "Вырезать"
 
-#: git-gui.sh:2557 git-gui.sh:3112 git-gui.sh:3186 git-gui.sh:3259
+#: git-gui.sh:2846 git-gui.sh:3464 git-gui.sh:3540 git-gui.sh:3633
 #: lib/console.tcl:69
 msgid "Copy"
 msgstr "Копировать"
 
-#: git-gui.sh:2560 git-gui.sh:3115
+#: git-gui.sh:2849 git-gui.sh:3467
 msgid "Paste"
 msgstr "Вставить"
 
-#: git-gui.sh:2563 git-gui.sh:3118 lib/branch_delete.tcl:26
-#: lib/remote_branch_delete.tcl:38
+#: git-gui.sh:2852 git-gui.sh:3470 lib/remote_branch_delete.tcl:39
+#: lib/branch_delete.tcl:28
 msgid "Delete"
 msgstr "Удалить"
 
-#: git-gui.sh:2567 git-gui.sh:3122 git-gui.sh:3263 lib/console.tcl:71
+#: git-gui.sh:2856 git-gui.sh:3474 git-gui.sh:3637 lib/console.tcl:71
 msgid "Select All"
-msgstr "Выделить все"
+msgstr "Выделить всё"
 
-#: git-gui.sh:2576
+#: git-gui.sh:2865
 msgid "Create..."
 msgstr "Создать…"
 
-#: git-gui.sh:2582
+#: git-gui.sh:2871
 msgid "Checkout..."
 msgstr "Перейти…"
 
-#: git-gui.sh:2588
+#: git-gui.sh:2877
 msgid "Rename..."
 msgstr "Переименовать…"
 
-#: git-gui.sh:2593
+#: git-gui.sh:2882
 msgid "Delete..."
 msgstr "Удалить…"
 
-#: git-gui.sh:2598
+#: git-gui.sh:2887
 msgid "Reset..."
 msgstr "Сбросить…"
 
-#: git-gui.sh:2608
+#: git-gui.sh:2897
 msgid "Done"
 msgstr "Завершено"
 
-#: git-gui.sh:2610
+#: git-gui.sh:2899
 msgid "Commit@@verb"
 msgstr "Закоммитить"
 
-#: git-gui.sh:2619 git-gui.sh:3050
-msgid "New Commit"
-msgstr "Новый коммит"
-
-#: git-gui.sh:2627 git-gui.sh:3057
+#: git-gui.sh:2908 git-gui.sh:3400
 msgid "Amend Last Commit"
 msgstr "Исправить последний коммит"
 
-#: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99
+#: git-gui.sh:2918 git-gui.sh:3361 lib/remote_branch_delete.tcl:101
 msgid "Rescan"
 msgstr "Перечитать"
 
-#: git-gui.sh:2643
+#: git-gui.sh:2924
 msgid "Stage To Commit"
 msgstr "Добавить в индекс"
 
-#: git-gui.sh:2649
+#: git-gui.sh:2930
 msgid "Stage Changed Files To Commit"
 msgstr "Добавить изменённые файлы в индекс"
 
-#: git-gui.sh:2655
+#: git-gui.sh:2936
 msgid "Unstage From Commit"
 msgstr "Убрать из издекса"
 
-#: git-gui.sh:2661 lib/index.tcl:412
+#: git-gui.sh:2942 lib/index.tcl:521
 msgid "Revert Changes"
 msgstr "Обратить изменения"
 
-#: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341
+#: git-gui.sh:2950 git-gui.sh:3700 git-gui.sh:3731
 msgid "Show Less Context"
 msgstr "Меньше контекста"
 
-#: git-gui.sh:2673 git-gui.sh:3314 git-gui.sh:3345
+#: git-gui.sh:2954 git-gui.sh:3704 git-gui.sh:3735
 msgid "Show More Context"
 msgstr "Больше контекста"
 
-#: git-gui.sh:2680 git-gui.sh:3024 git-gui.sh:3133
+#: git-gui.sh:2961 git-gui.sh:3374 git-gui.sh:3485
 msgid "Sign Off"
 msgstr "Вставить Signed-off-by"
 
-#: git-gui.sh:2696
+#: git-gui.sh:2977
 msgid "Local Merge..."
 msgstr "Локальное слияние…"
 
-#: git-gui.sh:2701
+#: git-gui.sh:2982
 msgid "Abort Merge..."
 msgstr "Прервать слияние…"
 
-#: git-gui.sh:2713 git-gui.sh:2741
+#: git-gui.sh:2994 git-gui.sh:3022
 msgid "Add..."
 msgstr "Добавить…"
 
-#: git-gui.sh:2717
+#: git-gui.sh:2998
 msgid "Push..."
 msgstr "Отправить…"
 
-#: git-gui.sh:2721
+#: git-gui.sh:3002
 msgid "Delete Branch..."
 msgstr "Удалить ветку…"
 
-#: git-gui.sh:2731 git-gui.sh:3292
+#: git-gui.sh:3012 git-gui.sh:3666
 msgid "Options..."
 msgstr "Настройки…"
 
-#: git-gui.sh:2742
+#: git-gui.sh:3023
 msgid "Remove..."
 msgstr "Удалить…"
 
-#: git-gui.sh:2751 lib/choose_repository.tcl:50
+#: git-gui.sh:3032 lib/choose_repository.tcl:67
 msgid "Help"
-msgstr "Помощь"
+msgstr "Справка"
 
-#: git-gui.sh:2755 git-gui.sh:2759 lib/about.tcl:14
-#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53
+#: git-gui.sh:3036 git-gui.sh:3040 lib/choose_repository.tcl:61
+#: lib/choose_repository.tcl:70 lib/about.tcl:14
 #, tcl-format
 msgid "About %s"
 msgstr "О %s"
 
-#: git-gui.sh:2783
+#: git-gui.sh:3064
 msgid "Online Documentation"
 msgstr "Документация в интернете"
 
-#: git-gui.sh:2786 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
+#: git-gui.sh:3067 lib/choose_repository.tcl:64 lib/choose_repository.tcl:73
 msgid "Show SSH Key"
 msgstr "Показать ключ SSH"
 
-#: git-gui.sh:2893
+#: git-gui.sh:3097 git-gui.sh:3229
+msgid "usage:"
+msgstr "использование:"
+
+#: git-gui.sh:3101 git-gui.sh:3233
+msgid "Usage"
+msgstr "Использование"
+
+#: git-gui.sh:3182 lib/blame.tcl:575
+msgid "Error"
+msgstr "Ошибка"
+
+#: git-gui.sh:3213
 #, tcl-format
 msgid "fatal: cannot stat path %s: No such file or directory"
 msgstr "критическая ошибка: %s: нет такого файла или каталога"
 
-#: git-gui.sh:2926
+#: git-gui.sh:3246
 msgid "Current Branch:"
 msgstr "Текущая ветка:"
 
-#: git-gui.sh:2947
-msgid "Staged Changes (Will Commit)"
-msgstr "Изменения в индексе (будут закоммичены)"
-
-#: git-gui.sh:2967
+#: git-gui.sh:3271
 msgid "Unstaged Changes"
 msgstr "Изменено (не будет сохранено)"
 
-#: git-gui.sh:3017
+#: git-gui.sh:3293
+msgid "Staged Changes (Will Commit)"
+msgstr "Изменения в индексе (будут закоммичены)"
+
+#: git-gui.sh:3367
 msgid "Stage Changed"
 msgstr "Индексировать всё"
 
-#: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193
+#: git-gui.sh:3386 lib/transport.tcl:137
 msgid "Push"
 msgstr "Отправить"
 
-#: git-gui.sh:3071
+#: git-gui.sh:3413
 msgid "Initial Commit Message:"
 msgstr "Сообщение первого коммита:"
 
-#: git-gui.sh:3072
+#: git-gui.sh:3414
 msgid "Amended Commit Message:"
 msgstr "Сообщение исправленного коммита:"
 
-#: git-gui.sh:3073
+#: git-gui.sh:3415
 msgid "Amended Initial Commit Message:"
 msgstr "Сообщение исправленного первого коммита:"
 
-#: git-gui.sh:3074
+#: git-gui.sh:3416
 msgid "Amended Merge Commit Message:"
 msgstr "Сообщение исправленного слияния:"
 
-#: git-gui.sh:3075
+#: git-gui.sh:3417
 msgid "Merge Commit Message:"
 msgstr "Сообщение слияния:"
 
-#: git-gui.sh:3076
+#: git-gui.sh:3418
 msgid "Commit Message:"
 msgstr "Сообщение коммита:"
 
-#: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73
+#: git-gui.sh:3477 git-gui.sh:3641 lib/console.tcl:73
 msgid "Copy All"
 msgstr "Копировать все"
 
-#: git-gui.sh:3149 lib/blame.tcl:104
+#: git-gui.sh:3501 lib/blame.tcl:106
 msgid "File:"
 msgstr "Файл:"
 
-#: git-gui.sh:3255
+#: git-gui.sh:3549 lib/choose_repository.tcl:1100
+msgid "Open"
+msgstr "Открыть"
+
+#: git-gui.sh:3629
 msgid "Refresh"
 msgstr "Обновить"
 
-#: git-gui.sh:3276
+#: git-gui.sh:3650
 msgid "Decrease Font Size"
 msgstr "Уменьшить размер шрифта"
 
-#: git-gui.sh:3280
+#: git-gui.sh:3654
 msgid "Increase Font Size"
 msgstr "Увеличить размер шрифта"
 
-#: git-gui.sh:3288 lib/blame.tcl:281
+#: git-gui.sh:3662 lib/blame.tcl:296
 msgid "Encoding"
 msgstr "Кодировка"
 
-#: git-gui.sh:3299
+#: git-gui.sh:3673
 msgid "Apply/Reverse Hunk"
 msgstr "Применить/Убрать изменение"
 
-#: git-gui.sh:3304
+#: git-gui.sh:3678
 msgid "Apply/Reverse Line"
 msgstr "Применить/Убрать строку"
 
-#: git-gui.sh:3323
+#: git-gui.sh:3684 git-gui.sh:3794 git-gui.sh:3805
+msgid "Revert Hunk"
+msgstr "Обратить изменения блока"
+
+#: git-gui.sh:3689 git-gui.sh:3801 git-gui.sh:3812
+msgid "Revert Line"
+msgstr "Обратить изменения строки"
+
+#: git-gui.sh:3694 git-gui.sh:3791
+msgid "Undo Last Revert"
+msgstr "Отменить последнее обращение изменений"
+
+#: git-gui.sh:3713
 msgid "Run Merge Tool"
 msgstr "Запустить программу слияния"
 
-#: git-gui.sh:3328
+#: git-gui.sh:3718
 msgid "Use Remote Version"
 msgstr "Взять внешнюю версию"
 
-#: git-gui.sh:3332
+#: git-gui.sh:3722
 msgid "Use Local Version"
 msgstr "Взять локальную версию"
 
-#: git-gui.sh:3336
+#: git-gui.sh:3726
 msgid "Revert To Base"
 msgstr "Обратить изменения"
 
-#: git-gui.sh:3354
+#: git-gui.sh:3744
 msgid "Visualize These Changes In The Submodule"
 msgstr "Показать эти изменения подмодуля"
 
-#: git-gui.sh:3358
+#: git-gui.sh:3748
 msgid "Visualize Current Branch History In The Submodule"
 msgstr "Показать историю текущей ветки подмодуля"
 
-#: git-gui.sh:3362
+#: git-gui.sh:3752
 msgid "Visualize All Branch History In The Submodule"
 msgstr "Показать историю всех веток подмодуля"
 
-#: git-gui.sh:3367
+#: git-gui.sh:3757
 msgid "Start git gui In The Submodule"
 msgstr "Запустить git gui в подмодуле"
 
-#: git-gui.sh:3389
+#: git-gui.sh:3793
 msgid "Unstage Hunk From Commit"
 msgstr "Убрать блок из индекса"
 
-#: git-gui.sh:3391
+#: git-gui.sh:3797
 msgid "Unstage Lines From Commit"
 msgstr "Убрать строки из индекса"
 
-#: git-gui.sh:3393
+#: git-gui.sh:3798 git-gui.sh:3809
+msgid "Revert Lines"
+msgstr "Обратить изменения строк"
+
+#: git-gui.sh:3800
 msgid "Unstage Line From Commit"
 msgstr "Убрать строку из индекса"
 
-#: git-gui.sh:3396
+#: git-gui.sh:3804
 msgid "Stage Hunk For Commit"
 msgstr "Добавить блок в индекс"
 
-#: git-gui.sh:3398
+#: git-gui.sh:3808
 msgid "Stage Lines For Commit"
 msgstr "Добавить строки в индекс"
 
-#: git-gui.sh:3400
+#: git-gui.sh:3811
 msgid "Stage Line For Commit"
 msgstr "Добавить строку в индекс"
 
-#: git-gui.sh:3424
+#: git-gui.sh:3861
 msgid "Initializing..."
 msgstr "Инициализация…"
 
-#: git-gui.sh:3541
+#: git-gui.sh:4017
 #, tcl-format
 msgid ""
 "Possible environment issues exist.\n"
@@ -533,14 +579,14 @@ msgid ""
 "\n"
 msgstr "Возможны ошибки в переменных окружения.\n\nПеременные окружения, которые возможно\nбудут проигнорированы командами Git,\nзапущенными из %s\n\n"
 
-#: git-gui.sh:3570
+#: git-gui.sh:4046
 msgid ""
 "\n"
 "This is due to a known issue with the\n"
 "Tcl binary distributed by Cygwin."
 msgstr "\nЭто известная проблема с Tcl,\nраспространяемым Cygwin."
 
-#: git-gui.sh:3575
+#: git-gui.sh:4051
 #, tcl-format
 msgid ""
 "\n"
@@ -551,357 +597,201 @@ msgid ""
 "~/.gitconfig file.\n"
 msgstr "\n\nВместо использования %s можно\nсохранить значения user.name и\nuser.email в Вашем персональном\nфайле ~/.gitconfig.\n"
 
-#: lib/about.tcl:26
-msgid "git-gui - a graphical user interface for Git."
-msgstr "git-gui - графический пользовательский интерфейс к Git."
-
-#: lib/blame.tcl:72
-msgid "File Viewer"
-msgstr "Просмотр файла"
-
-#: lib/blame.tcl:78
-msgid "Commit:"
-msgstr "Коммит:"
-
-#: lib/blame.tcl:271
-msgid "Copy Commit"
-msgstr "Копировать SHA-1"
-
-#: lib/blame.tcl:275
-msgid "Find Text..."
-msgstr "Найти текст…"
-
-#: lib/blame.tcl:284
-msgid "Do Full Copy Detection"
-msgstr "Провести полный поиск копий"
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "Неподдерживаемая программа проверки правописания"
 
-#: lib/blame.tcl:288
-msgid "Show History Context"
-msgstr "Показать исторический контекст"
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "Проверка правописания не доступна"
 
-#: lib/blame.tcl:291
-msgid "Blame Parent Commit"
-msgstr "Авторы родительского коммита"
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "Неправильная конфигурация программы проверки правописания"
 
-#: lib/blame.tcl:450
+#: lib/spellcheck.tcl:70
 #, tcl-format
-msgid "Reading %s..."
-msgstr "Чтение %s…"
-
-#: lib/blame.tcl:557
-msgid "Loading copy/move tracking annotations..."
-msgstr "Загрузка аннотации копирований/переименований…"
-
-#: lib/blame.tcl:577
-msgid "lines annotated"
-msgstr "строк прокомментировано"
+msgid "Reverting dictionary to %s."
+msgstr "Словарь вернут к %s."
 
-#: lib/blame.tcl:769
-msgid "Loading original location annotations..."
-msgstr "Загрузка аннотаций первоначального положения объекта…"
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "Программа проверки правописания не смогла запуститься"
 
-#: lib/blame.tcl:772
-msgid "Annotation complete."
-msgstr "Аннотация завершена."
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "Нераспознанная программа проверки правописания"
 
-#: lib/blame.tcl:802
-msgid "Busy"
-msgstr "Занят"
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "Исправлений не найдено"
 
-#: lib/blame.tcl:803
-msgid "Annotation process is already running."
-msgstr "Аннотация уже запущена"
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "Программа проверки правописания прервала передачу данных"
 
-#: lib/blame.tcl:842
-msgid "Running thorough copy detection..."
-msgstr "Выполнение полного поиска копий…"
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "Ошибка проверки правописания"
 
-#: lib/blame.tcl:910
-msgid "Loading annotation..."
-msgstr "Загрузка аннотации…"
+#: lib/transport.tcl:6 lib/remote_add.tcl:132
+#, tcl-format
+msgid "fetch %s"
+msgstr "извлечение %s"
 
-#: lib/blame.tcl:963
-msgid "Author:"
-msgstr "Автор:"
+#: lib/transport.tcl:7
+#, tcl-format
+msgid "Fetching new changes from %s"
+msgstr "Извлечение изменений из %s "
 
-#: lib/blame.tcl:967
-msgid "Committer:"
-msgstr "Коммитер:"
+#: lib/transport.tcl:18
+#, tcl-format
+msgid "remote prune %s"
+msgstr "чистка внешнего %s"
 
-#: lib/blame.tcl:972
-msgid "Original File:"
-msgstr "Исходный файл:"
+#: lib/transport.tcl:19
+#, tcl-format
+msgid "Pruning tracking branches deleted from %s"
+msgstr "Чистка отслеживаемых веток, удалённых из %s"
 
-#: lib/blame.tcl:1020
-msgid "Cannot find HEAD commit:"
-msgstr "Не удалось найти текущее состояние:"
+#: lib/transport.tcl:25
+msgid "fetch all remotes"
+msgstr "извлечь со всех внешних репозиториев"
 
-#: lib/blame.tcl:1075
-msgid "Cannot find parent commit:"
-msgstr "Не удалось найти родительское состояние:"
+#: lib/transport.tcl:26
+msgid "Fetching new changes from all remotes"
+msgstr "Получение изменений со всех внешних репозиториев"
 
-#: lib/blame.tcl:1090
-msgid "Unable to display parent"
-msgstr "Не могу показать предка"
+#: lib/transport.tcl:40
+msgid "remote prune all remotes"
+msgstr "чистка всех внешних репозиториев"
 
-#: lib/blame.tcl:1091 lib/diff.tcl:320
-msgid "Error loading diff:"
-msgstr "Ошибка загрузки изменений:"
+#: lib/transport.tcl:41
+msgid "Pruning tracking branches deleted from all remotes"
+msgstr "Чистка отслеживаемых веток, удалённых со всех внешних репозиториев"
 
-#: lib/blame.tcl:1231
-msgid "Originally By:"
-msgstr "Источник:"
+#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110
+#: lib/remote_add.tcl:162
+#, tcl-format
+msgid "push %s"
+msgstr "отправить %s"
 
-#: lib/blame.tcl:1237
-msgid "In File:"
-msgstr "Файл:"
+#: lib/transport.tcl:55
+#, tcl-format
+msgid "Pushing changes to %s"
+msgstr "Отправка изменений в %s "
 
-#: lib/blame.tcl:1242
-msgid "Copied Or Moved Here By:"
-msgstr "Скопировано/перемещено в:"
+#: lib/transport.tcl:93
+#, tcl-format
+msgid "Mirroring to %s"
+msgstr "Точное копирование в %s"
 
-#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
-msgid "Checkout Branch"
-msgstr "Перейти на ветку"
+#: lib/transport.tcl:111
+#, tcl-format
+msgid "Pushing %s %s to %s"
+msgstr "Отправка %s %s в %s"
 
-#: lib/branch_checkout.tcl:23
-msgid "Checkout"
-msgstr "Перейти"
+#: lib/transport.tcl:132
+msgid "Push Branches"
+msgstr "Отправить ветки"
 
-#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35
-#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282
-#: lib/checkout_op.tcl:579 lib/choose_font.tcl:43 lib/merge.tcl:172
-#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42
-#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352
-#: lib/transport.tcl:108
+#: lib/transport.tcl:141 lib/checkout_op.tcl:580 lib/remote_add.tcl:34
+#: lib/browser.tcl:292 lib/branch_checkout.tcl:30 lib/branch_rename.tcl:32
+#: lib/choose_font.tcl:45 lib/option.tcl:127 lib/tools_dlg.tcl:41
+#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43
+#: lib/branch_create.tcl:37 lib/branch_delete.tcl:34 lib/merge.tcl:178
 msgid "Cancel"
 msgstr "Отмена"
 
-#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328
-msgid "Revision"
-msgstr "Версия"
-
-#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280
-msgid "Options"
-msgstr "Настройки"
-
-#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
-msgid "Fetch Tracking Branch"
-msgstr "Извлечь изменения из внешней ветки"
+#: lib/transport.tcl:147
+msgid "Source Branches"
+msgstr "Исходные ветки"
 
-#: lib/branch_checkout.tcl:44
-msgid "Detach From Local Branch"
-msgstr "Отсоединить от локальной ветки"
+#: lib/transport.tcl:162
+msgid "Destination Repository"
+msgstr "Репозиторий назначения"
 
-#: lib/branch_create.tcl:22
-msgid "Create Branch"
-msgstr "Создать ветку"
+#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51
+msgid "Remote:"
+msgstr "внешний:"
 
-#: lib/branch_create.tcl:27
-msgid "Create New Branch"
-msgstr "Создать новую ветку"
+#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72
+msgid "Arbitrary Location:"
+msgstr "Указанное положение:"
 
-#: lib/branch_create.tcl:31 lib/choose_repository.tcl:381
-msgid "Create"
-msgstr "Создать"
+#: lib/transport.tcl:205
+msgid "Transfer Options"
+msgstr "Настройки отправки"
 
-#: lib/branch_create.tcl:40
-msgid "Branch Name"
-msgstr "Имя ветки"
+#: lib/transport.tcl:207
+msgid "Force overwrite existing branch (may discard changes)"
+msgstr "Принудительно перезаписать существующую ветку (возможна потеря изменений)"
 
-#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50
-msgid "Name:"
-msgstr "Название:"
+#: lib/transport.tcl:211
+msgid "Use thin pack (for slow network connections)"
+msgstr "Использовать thin pack (для медленных сетевых подключений)"
 
-#: lib/branch_create.tcl:58
-msgid "Match Tracking Branch Name"
-msgstr "Соответствовать имени отслеживаемой ветки"
+#: lib/transport.tcl:215
+msgid "Include tags"
+msgstr "Передать метки"
 
-#: lib/branch_create.tcl:66
-msgid "Starting Revision"
-msgstr "Начальная версия"
+#: lib/transport.tcl:229
+#, tcl-format
+msgid "%s (%s): Push"
+msgstr "%s (%s): Отправка"
 
-#: lib/branch_create.tcl:72
-msgid "Update Existing Branch:"
-msgstr "Обновить имеющуюся ветку:"
+#: lib/checkout_op.tcl:85
+#, tcl-format
+msgid "Fetching %s from %s"
+msgstr "Извлечение %s из %s "
 
-#: lib/branch_create.tcl:75
-msgid "No"
-msgstr "Нет"
+#: lib/checkout_op.tcl:133
+#, tcl-format
+msgid "fatal: Cannot resolve %s"
+msgstr "критическая ошибка: невозможно разрешить %s"
 
-#: lib/branch_create.tcl:80
-msgid "Fast Forward Only"
-msgstr "Только Fast Forward"
+#: lib/checkout_op.tcl:146 lib/sshkey.tcl:58 lib/console.tcl:81
+#: lib/database.tcl:30
+msgid "Close"
+msgstr "Закрыть"
 
-#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571
-msgid "Reset"
-msgstr "Сброс"
+#: lib/checkout_op.tcl:175
+#, tcl-format
+msgid "Branch '%s' does not exist."
+msgstr "Ветка «%s» не существует."
 
-#: lib/branch_create.tcl:97
-msgid "Checkout After Creation"
-msgstr "После создания сделать текущей"
+#: lib/checkout_op.tcl:194
+#, tcl-format
+msgid "Failed to configure simplified git-pull for '%s'."
+msgstr "Ошибка создания упрощённой конфигурации git pull для «%s»."
 
-#: lib/branch_create.tcl:131
-msgid "Please select a tracking branch."
-msgstr "Укажите отлеживаемую ветку."
+#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102
+#, tcl-format
+msgid "Branch '%s' already exists."
+msgstr "Ветка «%s» уже существует."
 
-#: lib/branch_create.tcl:140
+#: lib/checkout_op.tcl:229
 #, tcl-format
-msgid "Tracking branch %s is not a branch in the remote repository."
-msgstr "Отслеживаемая ветка %s не является веткой на внешнем репозитории."
+msgid ""
+"Branch '%s' already exists.\n"
+"\n"
+"It cannot fast-forward to %s.\n"
+"A merge is required."
+msgstr "Ветка «%s» уже существует.\n\nОна не может быть перемотана вперед к %s.\nТребуется слияние."
 
-#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
-msgid "Please supply a branch name."
-msgstr "Укажите имя ветки."
+#: lib/checkout_op.tcl:243
+#, tcl-format
+msgid "Merge strategy '%s' not supported."
+msgstr "Неизвестная стратегия слияния «%s»."
 
-#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
+#: lib/checkout_op.tcl:262
 #, tcl-format
-msgid "'%s' is not an acceptable branch name."
-msgstr "Недопустимое имя ветки «%s»."
+msgid "Failed to update '%s'."
+msgstr "Не удалось обновить «%s»."
 
-#: lib/branch_delete.tcl:15
-msgid "Delete Branch"
-msgstr "Удаление ветки"
-
-#: lib/branch_delete.tcl:20
-msgid "Delete Local Branch"
-msgstr "Удалить локальную ветку"
-
-#: lib/branch_delete.tcl:37
-msgid "Local Branches"
-msgstr "Локальные ветки"
-
-#: lib/branch_delete.tcl:52
-msgid "Delete Only If Merged Into"
-msgstr "Удалить только в случае, если было слияние с"
-
-#: lib/branch_delete.tcl:54 lib/remote_branch_delete.tcl:119
-msgid "Always (Do not perform merge checks)"
-msgstr "Всегда (не выполнять проверку на слияние)"
-
-#: lib/branch_delete.tcl:103
-#, tcl-format
-msgid "The following branches are not completely merged into %s:"
-msgstr "Ветки, которые не полностью сливаются с %s:"
-
-#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:217
-msgid ""
-"Recovering deleted branches is difficult.\n"
-"\n"
-"Delete the selected branches?"
-msgstr "Восстановить удаленные ветки сложно.\n\nПродолжить?"
-
-#: lib/branch_delete.tcl:141
-#, tcl-format
-msgid ""
-"Failed to delete branches:\n"
-"%s"
-msgstr "Не удалось удалить ветки:\n%s"
-
-#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
-msgid "Rename Branch"
-msgstr "Переименование ветки"
-
-#: lib/branch_rename.tcl:26
-msgid "Rename"
-msgstr "Переименовать"
-
-#: lib/branch_rename.tcl:36
-msgid "Branch:"
-msgstr "Ветка:"
-
-#: lib/branch_rename.tcl:39
-msgid "New Name:"
-msgstr "Новое название:"
-
-#: lib/branch_rename.tcl:75
-msgid "Please select a branch to rename."
-msgstr "Укажите ветку для переименования."
-
-#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202
-#, tcl-format
-msgid "Branch '%s' already exists."
-msgstr "Ветка «%s» уже существует."
-
-#: lib/branch_rename.tcl:117
-#, tcl-format
-msgid "Failed to rename '%s'."
-msgstr "Не удалось переименовать «%s». "
-
-#: lib/browser.tcl:17
-msgid "Starting..."
-msgstr "Запуск…"
-
-#: lib/browser.tcl:26
-msgid "File Browser"
-msgstr "Просмотр списка файлов"
-
-#: lib/browser.tcl:126 lib/browser.tcl:143
-#, tcl-format
-msgid "Loading %s..."
-msgstr "Загрузка %s…"
-
-#: lib/browser.tcl:187
-msgid "[Up To Parent]"
-msgstr "[На уровень выше]"
-
-#: lib/browser.tcl:267 lib/browser.tcl:273
-msgid "Browse Branch Files"
-msgstr "Показать файлы ветки"
-
-#: lib/browser.tcl:278 lib/choose_repository.tcl:398
-#: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497
-#: lib/choose_repository.tcl:1028
-msgid "Browse"
-msgstr "Показать"
-
-#: lib/checkout_op.tcl:85
-#, tcl-format
-msgid "Fetching %s from %s"
-msgstr "Извлечение %s из %s "
-
-#: lib/checkout_op.tcl:133
-#, tcl-format
-msgid "fatal: Cannot resolve %s"
-msgstr "критическая ошибка: невозможно разрешить %s"
-
-#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:31
-#: lib/sshkey.tcl:53
-msgid "Close"
-msgstr "Закрыть"
-
-#: lib/checkout_op.tcl:175
-#, tcl-format
-msgid "Branch '%s' does not exist."
-msgstr "Ветка «%s» не существует."
-
-#: lib/checkout_op.tcl:194
-#, tcl-format
-msgid "Failed to configure simplified git-pull for '%s'."
-msgstr "Ошибка создания упрощённой конфигурации git pull для «%s»."
-
-#: lib/checkout_op.tcl:229
-#, tcl-format
-msgid ""
-"Branch '%s' already exists.\n"
-"\n"
-"It cannot fast-forward to %s.\n"
-"A merge is required."
-msgstr "Ветка «%s» уже существует.\n\nОна не может быть перемотана вперед к %s.\nТребуется слияние."
-
-#: lib/checkout_op.tcl:243
-#, tcl-format
-msgid "Merge strategy '%s' not supported."
-msgstr "Неизвестная стратегия слияния «%s»."
-
-#: lib/checkout_op.tcl:262
-#, tcl-format
-msgid "Failed to update '%s'."
-msgstr "Не удалось обновить «%s»."
-
-#: lib/checkout_op.tcl:274
-msgid "Staging area (index) is already locked."
-msgstr "Рабочая область заблокирована другим процессом."
+#: lib/checkout_op.tcl:274
+msgid "Staging area (index) is already locked."
+msgstr "Рабочая область заблокирована другим процессом."
 
 #: lib/checkout_op.tcl:289
 msgid ""
@@ -921,51 +811,55 @@ msgstr "Обновление рабочего каталога из «%s»…"
 msgid "files checked out"
 msgstr "файлы извлечены"
 
-#: lib/checkout_op.tcl:376
+#: lib/checkout_op.tcl:377
 #, tcl-format
 msgid "Aborted checkout of '%s' (file level merging is required)."
 msgstr "Прерван переход на «%s» (требуется слияние содержимого файлов)"
 
-#: lib/checkout_op.tcl:377
+#: lib/checkout_op.tcl:378
 msgid "File level merge required."
 msgstr "Требуется слияние содержания файлов."
 
-#: lib/checkout_op.tcl:381
+#: lib/checkout_op.tcl:382
 #, tcl-format
 msgid "Staying on branch '%s'."
 msgstr "Ветка «%s» остаётся текущей."
 
-#: lib/checkout_op.tcl:452
+#: lib/checkout_op.tcl:453
 msgid ""
 "You are no longer on a local branch.\n"
 "\n"
 "If you wanted to be on a branch, create one now starting from 'This Detached Checkout'."
 msgstr "Вы более не находитесь на локальной ветке.\n\nЕсли вы хотите снова вернуться к какой-нибудь ветке, создайте её сейчас, начиная с «Текущего отсоединенного состояния»."
 
-#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
+#: lib/checkout_op.tcl:504 lib/checkout_op.tcl:508
 #, tcl-format
 msgid "Checked out '%s'."
 msgstr "Выполнен переход на «%s»."
 
-#: lib/checkout_op.tcl:535
+#: lib/checkout_op.tcl:536
 #, tcl-format
 msgid "Resetting '%s' to '%s' will lose the following commits:"
 msgstr "Сброс «%s»  на «%s» приведет к потере следующих коммитов:"
 
-#: lib/checkout_op.tcl:557
+#: lib/checkout_op.tcl:558
 msgid "Recovering lost commits may not be easy."
 msgstr "Восстановить потерянные коммиты будет сложно."
 
-#: lib/checkout_op.tcl:562
+#: lib/checkout_op.tcl:563
 #, tcl-format
 msgid "Reset '%s'?"
 msgstr "Сбросить «%s»?"
 
-#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343
+#: lib/checkout_op.tcl:568 lib/tools_dlg.tcl:336 lib/merge.tcl:170
 msgid "Visualize"
 msgstr "Наглядно"
 
-#: lib/checkout_op.tcl:635
+#: lib/checkout_op.tcl:572 lib/branch_create.tcl:85
+msgid "Reset"
+msgstr "Сброс"
+
+#: lib/checkout_op.tcl:636
 #, tcl-format
 msgid ""
 "Failed to set current branch.\n"
@@ -975,576 +869,498 @@ msgid ""
 "This should not have occurred.  %s will now close and give up."
 msgstr "Не удалось установить текущую ветку.\n\nВаш рабочий каталог обновлён только частично. Были обновлены все файлы кроме служебных файлов Git. \n\nЭтого не должно было произойти. %s завершается."
 
-#: lib/choose_font.tcl:39
-msgid "Select"
-msgstr "Выбрать"
+#: lib/remote_add.tcl:20
+#, tcl-format
+msgid "%s (%s): Add Remote"
+msgstr "%s (%s): Добавление внешнего репозитория"
 
-#: lib/choose_font.tcl:53
-msgid "Font Family"
-msgstr "Шрифт"
+#: lib/remote_add.tcl:25
+msgid "Add New Remote"
+msgstr "Добавить внешний репозиторий"
 
-#: lib/choose_font.tcl:74
-msgid "Font Size"
-msgstr "Размер шрифта"
+#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
+msgid "Add"
+msgstr "Добавить"
 
-#: lib/choose_font.tcl:91
-msgid "Font Example"
-msgstr "Пример текста"
+#: lib/remote_add.tcl:39
+msgid "Remote Details"
+msgstr "Информация о внешнем репозитории"
 
-#: lib/choose_font.tcl:103
-msgid ""
-"This is example text.\n"
-"If you like this text, it can be your font."
-msgstr "Это пример текста.\nЕсли Вам нравится этот текст, это может быть Ваш шрифт."
+#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44
+msgid "Name:"
+msgstr "Название:"
 
-#: lib/choose_repository.tcl:28
-msgid "Git Gui"
-msgstr "Git Gui"
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "Положение:"
 
-#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:386
-msgid "Create New Repository"
-msgstr "Создать новый репозиторий"
+#: lib/remote_add.tcl:60
+msgid "Further Action"
+msgstr "Следующая операция"
 
-#: lib/choose_repository.tcl:93
-msgid "New..."
-msgstr "Новый…"
+#: lib/remote_add.tcl:63
+msgid "Fetch Immediately"
+msgstr "Сразу извлечь изменения"
 
-#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471
-msgid "Clone Existing Repository"
-msgstr "Склонировать существующий репозиторий"
+#: lib/remote_add.tcl:69
+msgid "Initialize Remote Repository and Push"
+msgstr "Инициализировать внешний репозиторий и отправить"
 
-#: lib/choose_repository.tcl:106
-msgid "Clone..."
-msgstr "Клонировать…"
+#: lib/remote_add.tcl:75
+msgid "Do Nothing Else Now"
+msgstr "Больше ничего не делать"
 
-#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016
-msgid "Open Existing Repository"
-msgstr "Выбрать существующий репозиторий"
+#: lib/remote_add.tcl:100
+msgid "Please supply a remote name."
+msgstr "Укажите название внешнего репозитория."
 
-#: lib/choose_repository.tcl:119
-msgid "Open..."
-msgstr "Открыть…"
+#: lib/remote_add.tcl:113
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "«%s» не является допустимым именем внешнего репозитория."
 
-#: lib/choose_repository.tcl:132
-msgid "Recent Repositories"
-msgstr "Недавние репозитории"
+#: lib/remote_add.tcl:124
+#, tcl-format
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "Не удалось добавить «%s» из «%s». "
 
-#: lib/choose_repository.tcl:138
-msgid "Open Recent Repository:"
-msgstr "Открыть последний репозиторий"
+#: lib/remote_add.tcl:133
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "Извлечение %s"
 
-#: lib/choose_repository.tcl:306 lib/choose_repository.tcl:313
-#: lib/choose_repository.tcl:320
+#: lib/remote_add.tcl:156
 #, tcl-format
-msgid "Failed to create repository %s:"
-msgstr "Не удалось создать репозиторий %s:"
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "Невозможно инициализировать репозиторий в «%s»."
 
-#: lib/choose_repository.tcl:391
-msgid "Directory:"
-msgstr "Каталог:"
+#: lib/remote_add.tcl:163
+#, tcl-format
+msgid "Setting up the %s (at %s)"
+msgstr "Настройка %s (в %s)"
 
-#: lib/choose_repository.tcl:423 lib/choose_repository.tcl:550
-#: lib/choose_repository.tcl:1052
-msgid "Git Repository"
-msgstr "Репозиторий"
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "Запуск…"
 
-#: lib/choose_repository.tcl:448
+#: lib/browser.tcl:27
 #, tcl-format
-msgid "Directory %s already exists."
-msgstr "Каталог '%s' уже существует."
+msgid "%s (%s): File Browser"
+msgstr "%s (%s): Просмотр списка файлов"
 
-#: lib/choose_repository.tcl:452
+#: lib/browser.tcl:132 lib/browser.tcl:149
 #, tcl-format
-msgid "File %s already exists."
-msgstr "Файл '%s' уже существует."
+msgid "Loading %s..."
+msgstr "Загрузка %s…"
 
-#: lib/choose_repository.tcl:466
-msgid "Clone"
-msgstr "Склонировать"
+#: lib/browser.tcl:193
+msgid "[Up To Parent]"
+msgstr "[На уровень выше]"
 
-#: lib/choose_repository.tcl:479
-msgid "Source Location:"
-msgstr "Исходное положение:"
+#: lib/browser.tcl:275
+#, tcl-format
+msgid "%s (%s): Browse Branch Files"
+msgstr "%s (%s): Просмотр файлов ветки"
 
-#: lib/choose_repository.tcl:490
-msgid "Target Directory:"
-msgstr "Каталог назначения:"
+#: lib/browser.tcl:282
+msgid "Browse Branch Files"
+msgstr "Показать файлы ветки"
 
-#: lib/choose_repository.tcl:502
-msgid "Clone Type:"
-msgstr "Тип клона:"
+#: lib/browser.tcl:288 lib/choose_repository.tcl:437
+#: lib/choose_repository.tcl:524 lib/choose_repository.tcl:533
+#: lib/choose_repository.tcl:1115
+msgid "Browse"
+msgstr "Показать"
 
-#: lib/choose_repository.tcl:508
-msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
-msgstr "Стандартный (Быстрый, полуизбыточный, «жесткие» ссылки)"
+#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321
+msgid "Revision"
+msgstr "Версия"
 
-#: lib/choose_repository.tcl:514
-msgid "Full Copy (Slower, Redundant Backup)"
-msgstr "Полная копия (Медленный, создает резервную копию)"
+#: lib/index.tcl:6
+msgid "Unable to unlock the index."
+msgstr "Не удалось разблокировать индекс"
 
-#: lib/choose_repository.tcl:520
-msgid "Shared (Fastest, Not Recommended, No Backup)"
-msgstr "Общий (Самый быстрый, не рекомендуется, без резервной копии)"
+#: lib/index.tcl:30
+msgid "Index Error"
+msgstr "Ошибка в индексе"
 
-#: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603
-#: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819
-#: lib/choose_repository.tcl:1058 lib/choose_repository.tcl:1066
-#, tcl-format
-msgid "Not a Git repository: %s"
-msgstr "Каталог не является репозиторием: %s"
+#: lib/index.tcl:32
+msgid ""
+"Updating the Git index failed.  A rescan will be automatically started to "
+"resynchronize git-gui."
+msgstr "Не удалось обновить индекс Git. Состояние репозитория будет перечитано автоматически."
 
-#: lib/choose_repository.tcl:592
-msgid "Standard only available for local repository."
-msgstr "Стандартный клон возможен только для локального репозитория."
+#: lib/index.tcl:43
+msgid "Continue"
+msgstr "Продолжить"
 
-#: lib/choose_repository.tcl:596
-msgid "Shared only available for local repository."
-msgstr "Общий клон возможен только для локального репозитория."
+#: lib/index.tcl:46
+msgid "Unlock Index"
+msgstr "Разблокировать индекс"
+
+#: lib/index.tcl:77 lib/index.tcl:146 lib/index.tcl:220 lib/index.tcl:587
+#: lib/choose_repository.tcl:999
+msgid "files"
+msgstr "файлов"
+
+#: lib/index.tcl:326
+msgid "Unstaging selected files from commit"
+msgstr "Уборка выбранных файлов из индекса"
 
-#: lib/choose_repository.tcl:617
+#: lib/index.tcl:330
 #, tcl-format
-msgid "Location %s already exists."
-msgstr "Путь '%s' уже существует."
+msgid "Unstaging %s from commit"
+msgstr "Удаление %s из индекса"
 
-#: lib/choose_repository.tcl:628
-msgid "Failed to configure origin"
-msgstr "Не могу сконфигурировать исходный репозиторий."
+#: lib/index.tcl:369
+msgid "Ready to commit."
+msgstr "Готов для коммита."
 
-#: lib/choose_repository.tcl:640
-msgid "Counting objects"
-msgstr "Считаю объекты"
+#: lib/index.tcl:378
+msgid "Adding selected files"
+msgstr "Добавление выбранных файлов"
 
-#: lib/choose_repository.tcl:641
-msgid "buckets"
-msgstr "блоки"
-
-#: lib/choose_repository.tcl:665
+#: lib/index.tcl:382
 #, tcl-format
-msgid "Unable to copy objects/info/alternates: %s"
-msgstr "Не могу скопировать objects/info/alternates: %s"
+msgid "Adding %s"
+msgstr "Добавление %s…"
 
-#: lib/choose_repository.tcl:701
+#: lib/index.tcl:412
 #, tcl-format
-msgid "Nothing to clone from %s."
-msgstr "Нечего клонировать с %s."
+msgid "Stage %d untracked files?"
+msgstr "Проиндексировать %d неотслеживаемые файла?"
 
-#: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917
-#: lib/choose_repository.tcl:929
-msgid "The 'master' branch has not been initialized."
-msgstr "Не инициализирована ветвь «master»."
+#: lib/index.tcl:420
+msgid "Adding all changed files"
+msgstr "Добавление всех измененных файлов"
 
-#: lib/choose_repository.tcl:716
-msgid "Hardlinks are unavailable.  Falling back to copying."
-msgstr "«Жесткие ссылки» недоступны. Будет использовано копирование."
+#: lib/index.tcl:503
+#, tcl-format
+msgid "Revert changes in file %s?"
+msgstr "Обратить изменения в файле %s?"
 
-#: lib/choose_repository.tcl:728
+#: lib/index.tcl:508
 #, tcl-format
-msgid "Cloning from %s"
-msgstr "Клонирование %s"
+msgid "Revert changes in these %i files?"
+msgstr "Обратить изменения в %i файле(-ах)?"
 
-#: lib/choose_repository.tcl:759
-msgid "Copying objects"
-msgstr "Копирование objects"
+#: lib/index.tcl:517
+msgid "Any unstaged changes will be permanently lost by the revert."
+msgstr "Любые непроиндексированные изменения, будут потеряны при обращении изменений."
 
-#: lib/choose_repository.tcl:760
-msgid "KiB"
-msgstr "КБ"
+#: lib/index.tcl:520 lib/index.tcl:563
+msgid "Do Nothing"
+msgstr "Ничего не делать"
 
-#: lib/choose_repository.tcl:784
+#: lib/index.tcl:545
 #, tcl-format
-msgid "Unable to copy object: %s"
-msgstr "Не могу скопировать объект: %s"
+msgid "Delete untracked file %s?"
+msgstr "Удалить неотслеживаемый файл %s?"
 
-#: lib/choose_repository.tcl:794
-msgid "Linking objects"
-msgstr "Создание ссылок на objects"
+#: lib/index.tcl:550
+#, tcl-format
+msgid "Delete these %i untracked files?"
+msgstr "Удалить %i неотслеживаемые файла?"
 
-#: lib/choose_repository.tcl:795
-msgid "objects"
-msgstr "объекты"
+#: lib/index.tcl:560
+msgid "Files will be permanently deleted."
+msgstr "Файлы будут удалены навсегда."
 
-#: lib/choose_repository.tcl:803
-#, tcl-format
-msgid "Unable to hardlink object: %s"
-msgstr "Не могу создать «жесткую ссылку» на объект: %s"
+#: lib/index.tcl:564
+msgid "Delete Files"
+msgstr "Удалить файлы"
 
-#: lib/choose_repository.tcl:858
-msgid "Cannot fetch branches and objects.  See console output for details."
-msgstr "Не удалось извлечь ветки и объекты. Дополнительная информация на консоли."
+#: lib/index.tcl:586
+msgid "Deleting"
+msgstr "Удаление"
 
-#: lib/choose_repository.tcl:869
-msgid "Cannot fetch tags.  See console output for details."
-msgstr "Не удалось извлечь метки. Дополнительная информация на консоли."
+#: lib/index.tcl:665
+msgid "Encountered errors deleting files:\n"
+msgstr "Возникшие ошибки при удалении файлов:\n"
 
-#: lib/choose_repository.tcl:893
-msgid "Cannot determine HEAD.  See console output for details."
-msgstr "Не могу определить HEAD. Дополнительная информация на консоли."
+#: lib/index.tcl:674
+#, tcl-format
+msgid "None of the %d selected files could be deleted."
+msgstr "Не удалось удалить ни один из выбранных %d файлов."
 
-#: lib/choose_repository.tcl:902
+#: lib/index.tcl:679
 #, tcl-format
-msgid "Unable to cleanup %s"
-msgstr "Не могу очистить %s"
+msgid "%d of the %d selected files could not be deleted."
+msgstr "Не удалось удалить %d из выбранных  %d файлов."
 
-#: lib/choose_repository.tcl:908
-msgid "Clone failed."
-msgstr "Клонирование не удалось."
+#: lib/index.tcl:726
+msgid "Reverting selected files"
+msgstr "Обращение изменений в выбранных файлах"
 
-#: lib/choose_repository.tcl:915
-msgid "No default branch obtained."
-msgstr "Ветка по умолчанию не была получена."
+#: lib/index.tcl:730
+#, tcl-format
+msgid "Reverting %s"
+msgstr "Обращение изменений в %s"
 
-#: lib/choose_repository.tcl:926
+#: lib/branch_checkout.tcl:16
 #, tcl-format
-msgid "Cannot resolve %s as a commit."
-msgstr "Не могу распознать %s как коммит."
+msgid "%s (%s): Checkout Branch"
+msgstr "%s (%s): Переход на ветку"
 
-#: lib/choose_repository.tcl:938
-msgid "Creating working directory"
-msgstr "Создаю рабочий каталог"
+#: lib/branch_checkout.tcl:21
+msgid "Checkout Branch"
+msgstr "Перейти на ветку"
 
-#: lib/choose_repository.tcl:939 lib/index.tcl:67 lib/index.tcl:130
-#: lib/index.tcl:198
-msgid "files"
-msgstr "файлов"
+#: lib/branch_checkout.tcl:26
+msgid "Checkout"
+msgstr "Перейти"
 
-#: lib/choose_repository.tcl:968
-msgid "Initial file checkout failed."
-msgstr "Не удалось получить начальное состояние файлов репозитория."
+#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69
+msgid "Options"
+msgstr "Настройки"
 
-#: lib/choose_repository.tcl:1011
-msgid "Open"
-msgstr "Открыть"
+#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
+msgid "Fetch Tracking Branch"
+msgstr "Извлечь изменения из внешней ветки"
 
-#: lib/choose_repository.tcl:1021
-msgid "Repository:"
-msgstr "Репозиторий:"
+#: lib/branch_checkout.tcl:47
+msgid "Detach From Local Branch"
+msgstr "Отсоединить от локальной ветки"
 
-#: lib/choose_repository.tcl:1072
+#: lib/status_bar.tcl:263
 #, tcl-format
-msgid "Failed to open repository %s:"
-msgstr "Не удалось открыть репозиторий %s:"
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%s … %*i из %*i %s (%3i%%)"
 
-#: lib/choose_rev.tcl:53
-msgid "This Detached Checkout"
-msgstr "Текущее отсоединенное состояние"
+#: lib/remote.tcl:200
+msgid "Push to"
+msgstr "Отправить"
 
-#: lib/choose_rev.tcl:60
-msgid "Revision Expression:"
-msgstr "Выражение для определения версии:"
+#: lib/remote.tcl:218
+msgid "Remove Remote"
+msgstr "Удалить ссылку на внешний репозиторий"
 
-#: lib/choose_rev.tcl:74
-msgid "Local Branch"
-msgstr "Локальная ветка:"
+#: lib/remote.tcl:223
+msgid "Prune from"
+msgstr "Чистка"
 
-#: lib/choose_rev.tcl:79
-msgid "Tracking Branch"
-msgstr "Отслеживаемая ветка"
+#: lib/remote.tcl:228
+msgid "Fetch from"
+msgstr "Извлечение из"
 
-#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538
-msgid "Tag"
-msgstr "Метка"
+#: lib/remote.tcl:249 lib/remote.tcl:253 lib/remote.tcl:258 lib/remote.tcl:264
+msgid "All"
+msgstr "Все"
 
-#: lib/choose_rev.tcl:317
+#: lib/branch_rename.tcl:15
 #, tcl-format
-msgid "Invalid revision: %s"
-msgstr "Неверная версия: %s"
+msgid "%s (%s): Rename Branch"
+msgstr "%s (%s): Переименовать ветку"
 
-#: lib/choose_rev.tcl:338
-msgid "No revision selected."
-msgstr "Версия не указана."
+#: lib/branch_rename.tcl:23
+msgid "Rename Branch"
+msgstr "Переименование ветки"
 
-#: lib/choose_rev.tcl:346
-msgid "Revision expression is empty."
-msgstr "Пустое выражение для определения версии."
+#: lib/branch_rename.tcl:28
+msgid "Rename"
+msgstr "Переименовать"
 
-#: lib/choose_rev.tcl:531
-msgid "Updated"
-msgstr "Обновлено"
+#: lib/branch_rename.tcl:38
+msgid "Branch:"
+msgstr "Ветка:"
 
-#: lib/choose_rev.tcl:559
-msgid "URL"
-msgstr "Ссылка"
+#: lib/branch_rename.tcl:46
+msgid "New Name:"
+msgstr "Новое название:"
 
-#: lib/commit.tcl:9
-msgid ""
-"There is nothing to amend.\n"
-"\n"
-"You are about to create the initial commit.  There is no commit before this to amend.\n"
-msgstr "Отсутствует коммиты для исправления.\n\nВы создаете начальный коммит, здесь еще нечего исправлять.\n"
+#: lib/branch_rename.tcl:81
+msgid "Please select a branch to rename."
+msgstr "Укажите ветку для переименования."
 
-#: lib/commit.tcl:18
-msgid ""
-"Cannot amend while merging.\n"
-"\n"
-"You are currently in the middle of a merge that has not been fully completed.  You cannot amend the prior commit unless you first abort the current merge activity.\n"
-msgstr "Невозможно исправить коммит во время слияния.\n\nТекущее слияние не завершено. Невозможно исправить предыдуий коммит, не прерывая эту операцию.\n"
+#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
+msgid "Please supply a branch name."
+msgstr "Укажите имя ветки."
 
-#: lib/commit.tcl:48
-msgid "Error loading commit data for amend:"
-msgstr "Ошибка при загрузке данных для исправления коммита:"
+#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
+#, tcl-format
+msgid "'%s' is not an acceptable branch name."
+msgstr "Недопустимое имя ветки «%s»."
 
-#: lib/commit.tcl:75
-msgid "Unable to obtain your identity:"
-msgstr "Невозможно получить информацию об авторстве:"
+#: lib/branch_rename.tcl:123
+#, tcl-format
+msgid "Failed to rename '%s'."
+msgstr "Не удалось переименовать «%s». "
 
-#: lib/commit.tcl:80
-msgid "Invalid GIT_COMMITTER_IDENT:"
-msgstr "Недопустимый GIT_COMMITTER_IDENT:"
+#: lib/choose_font.tcl:41
+msgid "Select"
+msgstr "Выбрать"
 
-#: lib/commit.tcl:129
-#, tcl-format
-msgid "warning: Tcl does not support encoding '%s'."
-msgstr "предупреждение: Tcl не поддерживает кодировку «%s»."
+#: lib/choose_font.tcl:55
+msgid "Font Family"
+msgstr "Шрифт"
 
-#: lib/commit.tcl:149
-msgid ""
-"Last scanned state does not match repository state.\n"
-"\n"
-"Another Git program has modified this repository since the last scan.  A rescan must be performed before another commit can be created.\n"
-"\n"
-"The rescan will be automatically started now.\n"
-msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь. \n\nЭто будет сделано сейчас автоматически.\n"
+#: lib/choose_font.tcl:76
+msgid "Font Size"
+msgstr "Размер шрифта"
 
-#: lib/commit.tcl:172
-#, tcl-format
+#: lib/choose_font.tcl:93
+msgid "Font Example"
+msgstr "Пример текста"
+
+#: lib/choose_font.tcl:105
 msgid ""
-"Unmerged files cannot be committed.\n"
-"\n"
-"File %s has merge conflicts.  You must resolve them and stage the file before committing.\n"
-msgstr "Нельзя выполнить коммит с незавершённой операцией слияния.\n\nДля файла %s возник конфликт слияния. Разрешите конфликт и добавьте их в индекс перед выполнением коммита.\n"
+"This is example text.\n"
+"If you like this text, it can be your font."
+msgstr "Это пример текста.\nЕсли Вам нравится этот текст, это может быть Ваш шрифт."
 
-#: lib/commit.tcl:180
+#: lib/option.tcl:11
 #, tcl-format
-msgid ""
-"Unknown file state %s detected.\n"
-"\n"
-"File %s cannot be committed by this program.\n"
-msgstr "Обнаружено неизвестное состояние файла %s.\n\nФайл %s не может быть закоммичен этой программой.\n"
+msgid "Invalid global encoding '%s'"
+msgstr "Неверная глобальная кодировка «%s»"
 
-#: lib/commit.tcl:188
-msgid ""
-"No changes to commit.\n"
-"\n"
-"You must stage at least 1 file before you can commit.\n"
-msgstr "Отсутствуют изменения для сохранения.\n\nДобавьте в индекс хотя бы один файл перед выполнением коммита.\n"
+#: lib/option.tcl:19
+#, tcl-format
+msgid "Invalid repo encoding '%s'"
+msgstr "Неверная кодировка репозитория «%s»"
 
-#: lib/commit.tcl:203
-msgid ""
-"Please supply a commit message.\n"
-"\n"
-"A good commit message has the following format:\n"
-"\n"
-"- First line: Describe in one sentence what you did.\n"
-"- Second line: Blank\n"
-"- Remaining lines: Describe why this change is good.\n"
-msgstr "Укажите сообщение коммита.\n\nРекомендуется следующий формат сообщения:\n\n- в первой строке краткое описание сделанных изменений\n- вторая строка пустая\n- в оставшихся строках опишите, что дают ваши изменения\n"
+#: lib/option.tcl:119
+msgid "Restore Defaults"
+msgstr "Восстановить настройки по умолчанию"
 
-#: lib/commit.tcl:234
-msgid "Calling pre-commit hook..."
-msgstr "Вызов перехватчика pre-commit…"
+#: lib/option.tcl:123
+msgid "Save"
+msgstr "Сохранить"
 
-#: lib/commit.tcl:249
-msgid "Commit declined by pre-commit hook."
-msgstr "Коммит прерван переватчиком pre-commit."
+#: lib/option.tcl:133
+#, tcl-format
+msgid "%s Repository"
+msgstr "Для репозитория %s"
 
-#: lib/commit.tcl:272
-msgid "Calling commit-msg hook..."
-msgstr "Вызов перехватчика commit-msg…"
+#: lib/option.tcl:134
+msgid "Global (All Repositories)"
+msgstr "Общие (для всех репозиториев)"
 
-#: lib/commit.tcl:287
-msgid "Commit declined by commit-msg hook."
-msgstr "Коммит прерван переватчиком commit-msg"
+#: lib/option.tcl:140
+msgid "User Name"
+msgstr "Имя пользователя"
 
-#: lib/commit.tcl:300
-msgid "Committing changes..."
-msgstr "Коммит изменений…"
+#: lib/option.tcl:141
+msgid "Email Address"
+msgstr "Адрес электронной почты"
 
-#: lib/commit.tcl:316
-msgid "write-tree failed:"
-msgstr "Программа write-tree завершилась с ошибкой:"
+#: lib/option.tcl:143
+msgid "Summarize Merge Commits"
+msgstr "Суммарное сообщение при слиянии"
 
-#: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382
-msgid "Commit failed."
-msgstr "Не удалось закоммитить изменения."
+#: lib/option.tcl:144
+msgid "Merge Verbosity"
+msgstr "Уровень детальности сообщений при слиянии"
 
-#: lib/commit.tcl:334
-#, tcl-format
-msgid "Commit %s appears to be corrupt"
-msgstr "Коммит %s похоже поврежден"
+#: lib/option.tcl:145
+msgid "Show Diffstat After Merge"
+msgstr "Показать отчет об изменениях после слияния"
 
-#: lib/commit.tcl:339
-msgid ""
-"No changes to commit.\n"
-"\n"
-"No files were modified by this commit and it was not a merge commit.\n"
-"\n"
-"A rescan will be automatically started now.\n"
-msgstr "Нет изменения для коммита.\n\nНи один файл не был изменен и не было слияния.\n\nСейчас автоматически запустится перечитывание репозитория.\n"
+#: lib/option.tcl:146
+msgid "Use Merge Tool"
+msgstr "Использовать для слияния программу"
 
-#: lib/commit.tcl:346
-msgid "No changes to commit."
-msgstr "Нет изменения для коммита."
+#: lib/option.tcl:148
+msgid "Trust File Modification Timestamps"
+msgstr "Доверять времени модификации файла"
 
-#: lib/commit.tcl:360
-msgid "commit-tree failed:"
-msgstr "Программа commit-tree завершилась с ошибкой:"
+#: lib/option.tcl:149
+msgid "Prune Tracking Branches During Fetch"
+msgstr "Чистка отслеживаемых веток при извлечении изменений"
 
-#: lib/commit.tcl:381
-msgid "update-ref failed:"
-msgstr "Программа update-ref завершилась с ошибкой:"
-
-#: lib/commit.tcl:469
-#, tcl-format
-msgid "Created commit %s: %s"
-msgstr "Создан коммит %s: %s "
-
-#: lib/console.tcl:59
-msgid "Working... please wait..."
-msgstr "В процессе… пожалуйста, ждите…"
-
-#: lib/console.tcl:186
-msgid "Success"
-msgstr "Процесс успешно завершен"
-
-#: lib/console.tcl:200
-msgid "Error: Command Failed"
-msgstr "Ошибка: не удалось выполнить команду"
-
-#: lib/database.tcl:43
-msgid "Number of loose objects"
-msgstr "Количество несвязанных объектов"
-
-#: lib/database.tcl:44
-msgid "Disk space used by loose objects"
-msgstr "Объем дискового пространства, занятый несвязанными объектами"
-
-#: lib/database.tcl:45
-msgid "Number of packed objects"
-msgstr "Количество упакованных объектов"
+#: lib/option.tcl:150
+msgid "Match Tracking Branches"
+msgstr "Такое же имя, как и у отслеживаемой ветки"
 
-#: lib/database.tcl:46
-msgid "Number of packs"
-msgstr "Количество pack-файлов"
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "Использовать Textconv для просмотра различий и авторства"
 
-#: lib/database.tcl:47
-msgid "Disk space used by packed objects"
-msgstr "Объем дискового пространства, занятый упакованными объектами"
+#: lib/option.tcl:152
+msgid "Blame Copy Only On Changed Files"
+msgstr "Поиск копий только в изменённых файлах"
 
-#: lib/database.tcl:48
-msgid "Packed objects waiting for pruning"
-msgstr "Несвязанные объекты, которые можно удалить"
+#: lib/option.tcl:153
+msgid "Maximum Length of Recent Repositories List"
+msgstr "Максимальная длинна списка недавних репозиториев"
 
-#: lib/database.tcl:49
-msgid "Garbage files"
-msgstr "Мусор"
+#: lib/option.tcl:154
+msgid "Minimum Letters To Blame Copy On"
+msgstr "Минимальное количество символов для поиска копий"
 
-#: lib/database.tcl:72
-msgid "Compressing the object database"
-msgstr "Сжатие базы объектов"
+#: lib/option.tcl:155
+msgid "Blame History Context Radius (days)"
+msgstr "Радиус исторического контекста (в днях)"
 
-#: lib/database.tcl:83
-msgid "Verifying the object database with fsck-objects"
-msgstr "Проверка базы объектов при помощи fsck"
+#: lib/option.tcl:156
+msgid "Number of Diff Context Lines"
+msgstr "Число строк в контексте diff"
 
-#: lib/database.tcl:107
-#, tcl-format
-msgid ""
-"This repository currently has approximately %i loose objects.\n"
-"\n"
-"To maintain optimal performance it is strongly recommended that you compress the database.\n"
-"\n"
-"Compress the database now?"
-msgstr "Этот репозиторий сейчас содержит примерно %i свободных объектов\n\nДля лучшей производительности рекомендуется сжать базу данных.\n\nСжать базу данных сейчас?"
+#: lib/option.tcl:157
+msgid "Additional Diff Parameters"
+msgstr "Дополнительные параметры для diff"
 
-#: lib/date.tcl:25
-#, tcl-format
-msgid "Invalid date from Git: %s"
-msgstr "Неправильная дата в репозитории: %s"
+#: lib/option.tcl:158
+msgid "Commit Message Text Width"
+msgstr "Ширина текста сообщения коммита"
 
-#: lib/diff.tcl:64
-#, tcl-format
-msgid ""
-"No differences detected.\n"
-"\n"
-"%s has no changes.\n"
-"\n"
-"The modification date of this file was updated by another application, but the content within the file was not changed.\n"
-"\n"
-"A rescan will be automatically started to find other files which may have the same state."
-msgstr "Изменений не обнаружено.\n\nв %s отсутствуют изменения.\n\nДата изменения файла была обновлена другой программой, но содержимое файла осталось прежним.\n\nСейчас будет запущено перечитывание репозитория, чтобы найти подобные файлы."
+#: lib/option.tcl:159
+msgid "New Branch Name Template"
+msgstr "Шаблон для имени новой ветки"
 
-#: lib/diff.tcl:104
-#, tcl-format
-msgid "Loading diff of %s..."
-msgstr "Загрузка изменений %s…"
+#: lib/option.tcl:160
+msgid "Default File Contents Encoding"
+msgstr "Кодировка содержания файла по умолчанию"
 
-#: lib/diff.tcl:125
-msgid ""
-"LOCAL: deleted\n"
-"REMOTE:\n"
-msgstr "ЛОКАЛЬНО: удалён\nВНЕШНИЙ:\n"
+#: lib/option.tcl:161
+msgid "Warn before committing to a detached head"
+msgstr "Предупреждать перед коммитом в отделённый HEAD"
 
-#: lib/diff.tcl:130
-msgid ""
-"REMOTE: deleted\n"
-"LOCAL:\n"
-msgstr "ВНЕШНИЙ: удалён\nЛОКАЛЬНО:\n"
+#: lib/option.tcl:162
+msgid "Staging of untracked files"
+msgstr "Индексирование неотслеживаемых файлов"
 
-#: lib/diff.tcl:137
-msgid "LOCAL:\n"
-msgstr "ЛОКАЛЬНО:\n"
+#: lib/option.tcl:163
+msgid "Show untracked files"
+msgstr "Показать неотслеживаемые файлы"
 
-#: lib/diff.tcl:140
-msgid "REMOTE:\n"
-msgstr "ВНЕШНИЙ:\n"
+#: lib/option.tcl:164
+msgid "Tab spacing"
+msgstr "Ширина табуляции"
 
-#: lib/diff.tcl:202 lib/diff.tcl:319
+#: lib/option.tcl:182 lib/option.tcl:197 lib/option.tcl:220 lib/option.tcl:282
+#: lib/database.tcl:57
 #, tcl-format
-msgid "Unable to display %s"
-msgstr "Не могу показать %s"
+msgid "%s:"
+msgstr "%s:"
 
-#: lib/diff.tcl:203
-msgid "Error loading file:"
-msgstr "Ошибка загрузки файла:"
-
-#: lib/diff.tcl:210
-msgid "Git Repository (subproject)"
-msgstr "Репозиторий Git (подпроект)"
+#: lib/option.tcl:210
+msgid "Change"
+msgstr "Изменить"
 
-#: lib/diff.tcl:222
-msgid "* Binary file (not showing content)."
-msgstr "* Двоичный файл (содержимое не показано)"
+#: lib/option.tcl:254
+msgid "Spelling Dictionary:"
+msgstr "Словарь для проверки правописания:"
 
-#: lib/diff.tcl:227
-#, tcl-format
-msgid ""
-"* Untracked file is %d bytes.\n"
-"* Showing only first %d bytes.\n"
-msgstr "* Размер неотслеживаемого файла %d байт.\n* Показано первых %d байт.\n"
+#: lib/option.tcl:284
+msgid "Change Font"
+msgstr "Изменить"
 
-#: lib/diff.tcl:233
+#: lib/option.tcl:288
 #, tcl-format
-msgid ""
-"\n"
-"* Untracked file clipped here by %s.\n"
-"* To see the entire file, use an external editor.\n"
-msgstr "\n* Неотслеживаемый файл обрезан: %s.\n* Чтобы увидеть весь файл, используйте внешний редактор.\n"
-
-#: lib/diff.tcl:482
-msgid "Failed to unstage selected hunk."
-msgstr "Не удалось исключить выбранную часть."
+msgid "Choose %s"
+msgstr "Выберите %s"
 
-#: lib/diff.tcl:489
-msgid "Failed to stage selected hunk."
-msgstr "Не удалось проиндексировать выбранный блок изменений."
+#: lib/option.tcl:294
+msgid "pt."
+msgstr "п."
 
-#: lib/diff.tcl:568
-msgid "Failed to unstage selected line."
-msgstr "Не удалось исключить выбранную строку."
+#: lib/option.tcl:308
+msgid "Preferences"
+msgstr "Настройки"
 
-#: lib/diff.tcl:576
-msgid "Failed to stage selected line."
-msgstr "Не удалось проиндексировать выбранную строку."
+#: lib/option.tcl:345
+msgid "Failed to completely save options:"
+msgstr "Не удалось полностью сохранить настройки:"
 
 #: lib/encoding.tcl:443
 msgid "Default"
@@ -1559,824 +1375,1277 @@ msgstr "Системная (%s)"
 msgid "Other"
 msgstr "Другая"
 
-#: lib/error.tcl:20 lib/error.tcl:114
-msgid "error"
-msgstr "ошибка"
+#: lib/tools.tcl:76
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "Запуск %s требует выбранного файла."
 
-#: lib/error.tcl:36
-msgid "warning"
-msgstr "предупреждение"
+#: lib/tools.tcl:92
+#, tcl-format
+msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
+msgstr "Вы действительно хотите выполнить %1$s на «%2$s»?"
 
-#: lib/error.tcl:94
-msgid "You must correct the above errors before committing."
-msgstr "Перед коммитом, исправьте вышеуказанные ошибки."
+#: lib/tools.tcl:96
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "Действительно запустить %s?"
 
-#: lib/index.tcl:6
-msgid "Unable to unlock the index."
-msgstr "Не удалось разблокировать индекс"
+#: lib/tools.tcl:118
+#, tcl-format
+msgid "Tool: %s"
+msgstr "Вспомогательная операция: %s"
 
-#: lib/index.tcl:15
-msgid "Index Error"
-msgstr "Ошибка в индексе"
+#: lib/tools.tcl:119
+#, tcl-format
+msgid "Running: %s"
+msgstr "Выполнение: %s"
 
-#: lib/index.tcl:17
-msgid ""
-"Updating the Git index failed.  A rescan will be automatically started to "
-"resynchronize git-gui."
-msgstr "Не удалось обновить индекс Git. Состояние репозитория будет перечитано автоматически."
+#: lib/tools.tcl:158
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "Программа %s завершилась успешно."
 
-#: lib/index.tcl:28
-msgid "Continue"
-msgstr "Продолжить"
+#: lib/tools.tcl:160
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "Ошибка выполнения программы: %s"
 
-#: lib/index.tcl:31
-msgid "Unlock Index"
-msgstr "Разблокировать индекс"
+#: lib/mergetool.tcl:8
+msgid "Force resolution to the base version?"
+msgstr "Использовать базовую версию для разрешения конфликта?"
 
-#: lib/index.tcl:289
-#, tcl-format
-msgid "Unstaging %s from commit"
-msgstr "Удаление %s из индекса"
+#: lib/mergetool.tcl:9
+msgid "Force resolution to this branch?"
+msgstr "Использовать версию из этой ветки для разрешения конфликта?"
 
-#: lib/index.tcl:328
-msgid "Ready to commit."
-msgstr "Готов для коммита."
+#: lib/mergetool.tcl:10
+msgid "Force resolution to the other branch?"
+msgstr "Использовать версию из другой ветки для разрешения конфликта?"
 
-#: lib/index.tcl:341
+#: lib/mergetool.tcl:14
 #, tcl-format
-msgid "Adding %s"
-msgstr "Добавление %s…"
+msgid ""
+"Note that the diff shows only conflicting changes.\n"
+"\n"
+"%s will be overwritten.\n"
+"\n"
+"This operation can be undone only by restarting the merge."
+msgstr "Внимание! Список изменений показывает только конфликтующие отличия.\n\n%s будет переписан.\n\nЭто действие можно отменить только перезапуском операции слияния."
 
-#: lib/index.tcl:398
+#: lib/mergetool.tcl:45
 #, tcl-format
-msgid "Revert changes in file %s?"
-msgstr "Обратить изменения в файле %s?"
+msgid "File %s seems to have unresolved conflicts, still stage?"
+msgstr "Похоже, что файл %s содержит неразрешенные конфликты. Продолжить индексацию?"
 
-#: lib/index.tcl:400
+#: lib/mergetool.tcl:60
 #, tcl-format
-msgid "Revert changes in these %i files?"
-msgstr "Обратить изменения в %i файле(-ах)?"
+msgid "Adding resolution for %s"
+msgstr "Добавляю результат разрешения для %s"
 
-#: lib/index.tcl:408
-msgid "Any unstaged changes will be permanently lost by the revert."
-msgstr "Любые непроиндексированные изменения, будут потеряны при обращении изменений."
+#: lib/mergetool.tcl:141
+msgid "Cannot resolve deletion or link conflicts using a tool"
+msgstr "Программа слияния не обрабатывает конфликты с удалением или участием ссылок"
 
-#: lib/index.tcl:411
-msgid "Do Nothing"
-msgstr "Ничего не делать"
+#: lib/mergetool.tcl:146
+msgid "Conflict file does not exist"
+msgstr "Конфликтующий файл не существует"
 
-#: lib/index.tcl:429
-msgid "Reverting selected files"
-msgstr "Обращение изменений в выбранных файлах"
+#: lib/mergetool.tcl:246
+#, tcl-format
+msgid "Not a GUI merge tool: '%s'"
+msgstr "«%s» не является программой слияния"
 
-#: lib/index.tcl:433
+#: lib/mergetool.tcl:275
 #, tcl-format
-msgid "Reverting %s"
-msgstr "Обращение изменений в %s"
+msgid "Unsupported merge tool '%s'"
+msgstr "Неподдерживаемая программа слияния «%s»"
 
-#: lib/merge.tcl:13
+#: lib/mergetool.tcl:310
+msgid "Merge tool is already running, terminate it?"
+msgstr "Программа слияния уже работает. Прервать?"
+
+#: lib/mergetool.tcl:330
+#, tcl-format
 msgid ""
-"Cannot merge while amending.\n"
-"\n"
-"You must finish amending this commit before starting any type of merge.\n"
-msgstr "Невозможно выполнить слияние во время исправления.\n\nЗавершите исправление данного коммита перед выполнением операции слияния.\n"
+"Error retrieving versions:\n"
+"%s"
+msgstr "Ошибка получения версий:\n%s"
 
-#: lib/merge.tcl:27
+#: lib/mergetool.tcl:350
+#, tcl-format
 msgid ""
-"Last scanned state does not match repository state.\n"
-"\n"
-"Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.\n"
+"Could not start the merge tool:\n"
 "\n"
-"The rescan will be automatically started now.\n"
-msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем слияние может быть сделано.\n\nЭто будет сделано сейчас автоматически.\n"
-
-#: lib/merge.tcl:45
-#, tcl-format
-msgid ""
-"You are in the middle of a conflicted merge.\n"
-"\n"
-"File %s has merge conflicts.\n"
-"\n"
-"You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.\n"
-msgstr "Предыдущее слияние не завершено из-за конфликта.\n\nДля файла %s возник конфликт слияния.\n\nРазрешите конфликт, добавьте файл в индекс и закоммитьте. Только после этого можно начать следующее слияние.\n"
+"%s"
+msgstr "Ошибка запуска программы слияния:\n\n%s"
 
-#: lib/merge.tcl:55
-#, tcl-format
-msgid ""
-"You are in the middle of a change.\n"
-"\n"
-"File %s is modified.\n"
-"\n"
-"You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n"
-msgstr "Вы находитесь в процессе изменений.\n\nФайл %s изменён.\n\nВы должны завершить текущий коммит перед началом слияния. В случае необходимости, это позволит прервать операцию слияния.\n"
+#: lib/mergetool.tcl:354
+msgid "Running merge tool..."
+msgstr "Запуск программы слияния…"
 
-#: lib/merge.tcl:107
-#, tcl-format
-msgid "%s of %s"
-msgstr "%s из %s"
+#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
+msgid "Merge tool failed."
+msgstr "Ошибка выполнения программы слияния."
 
-#: lib/merge.tcl:120
+#: lib/tools_dlg.tcl:22
 #, tcl-format
-msgid "Merging %s and %s..."
-msgstr "Слияние %s и %s…"
+msgid "%s (%s): Add Tool"
+msgstr "%s (%s): Добавить инструмент"
 
-#: lib/merge.tcl:131
-msgid "Merge completed successfully."
-msgstr "Слияние успешно завершено."
-
-#: lib/merge.tcl:133
-msgid "Merge failed.  Conflict resolution is required."
-msgstr "Не удалось завершить слияние. Требуется разрешение конфликта."
-
-#: lib/merge.tcl:158
-#, tcl-format
-msgid "Merge Into %s"
-msgstr "Слияние с %s"
+#: lib/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "Новая вспомогательная операция"
 
-#: lib/merge.tcl:177
-msgid "Revision To Merge"
-msgstr "Версия, с которой провести слияние"
+#: lib/tools_dlg.tcl:34
+msgid "Add globally"
+msgstr "Добавить для всех репозиториев"
 
-#: lib/merge.tcl:212
-msgid ""
-"Cannot abort while amending.\n"
-"\n"
-"You must finish amending this commit.\n"
-msgstr "Невозможно прервать исправление.\n\nЗавершите текущее исправление коммита.\n"
+#: lib/tools_dlg.tcl:46
+msgid "Tool Details"
+msgstr "Описание вспомогательной операции"
 
-#: lib/merge.tcl:222
-msgid ""
-"Abort merge?\n"
-"\n"
-"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
-"\n"
-"Continue with aborting the current merge?"
-msgstr "Прервать операцию слияния?\n\nПрерывание текущего слияния приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
+#: lib/tools_dlg.tcl:49
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "Используйте «/» для создания подменю"
 
-#: lib/merge.tcl:228
-msgid ""
-"Reset changes?\n"
-"\n"
-"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
-"\n"
-"Continue with resetting the current changes?"
-msgstr "Сбросить изменения?\n\nСброс изменений приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
+#: lib/tools_dlg.tcl:60
+msgid "Command:"
+msgstr "Команда:"
 
-#: lib/merge.tcl:239
-msgid "Aborting"
-msgstr "Прерываю"
+#: lib/tools_dlg.tcl:71
+msgid "Show a dialog before running"
+msgstr "Показать диалог перед запуском"
 
-#: lib/merge.tcl:239
-msgid "files reset"
-msgstr "изменения в файлах отменены"
+#: lib/tools_dlg.tcl:77
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "Запрос на выбор версии (устанавливает $REVISION)"
 
-#: lib/merge.tcl:267
-msgid "Abort failed."
-msgstr "Прервать не удалось."
+#: lib/tools_dlg.tcl:82
+msgid "Ask the user for additional arguments (sets $ARGS)"
+msgstr "Запрос дополнительных аргументов (устанавливает $ARGS)"
 
-#: lib/merge.tcl:269
-msgid "Abort completed.  Ready."
-msgstr "Прервано."
+#: lib/tools_dlg.tcl:89
+msgid "Don't show the command output window"
+msgstr "Не показывать окно вывода команды"
 
-#: lib/mergetool.tcl:8
-msgid "Force resolution to the base version?"
-msgstr "Использовать базовую версию для разрешения конфликта?"
+#: lib/tools_dlg.tcl:94
+msgid "Run only if a diff is selected ($FILENAME not empty)"
+msgstr "Запуск только если показан список изменений ($FILENAME не пусто)"
 
-#: lib/mergetool.tcl:9
-msgid "Force resolution to this branch?"
-msgstr "Использовать версию из этой ветки для разрешения конфликта?"
+#: lib/tools_dlg.tcl:118
+msgid "Please supply a name for the tool."
+msgstr "Укажите название вспомогательной операции."
 
-#: lib/mergetool.tcl:10
-msgid "Force resolution to the other branch?"
-msgstr "Использовать версию из другой ветки для разрешения конфликта?"
+#: lib/tools_dlg.tcl:126
+#, tcl-format
+msgid "Tool '%s' already exists."
+msgstr "Вспомогательная операция «%s» уже существует."
 
-#: lib/mergetool.tcl:14
+#: lib/tools_dlg.tcl:148
 #, tcl-format
 msgid ""
-"Note that the diff shows only conflicting changes.\n"
-"\n"
-"%s will be overwritten.\n"
-"\n"
-"This operation can be undone only by restarting the merge."
-msgstr "Внимание! Список изменений показывает только конфликтующие отличия.\n\n%s будет переписан.\n\nЭто действие можно отменить только перезапуском операции слияния."
+"Could not add tool:\n"
+"%s"
+msgstr "Ошибка добавления программы:\n%s"
 
-#: lib/mergetool.tcl:45
+#: lib/tools_dlg.tcl:187
 #, tcl-format
-msgid "File %s seems to have unresolved conflicts, still stage?"
-msgstr "Похоже, что файл %s содержит неразрешенные конфликты. Продолжить индексацию?"
+msgid "%s (%s): Remove Tool"
+msgstr "%s (%s): Удалить инструмент"
 
-#: lib/mergetool.tcl:60
-#, tcl-format
-msgid "Adding resolution for %s"
-msgstr "Добавляю результат разрешения для %s"
+#: lib/tools_dlg.tcl:193
+msgid "Remove Tool Commands"
+msgstr "Удалить команды программы"
 
-#: lib/mergetool.tcl:141
-msgid "Cannot resolve deletion or link conflicts using a tool"
-msgstr "Программа слияния не обрабатывает конфликты с удалением или участием ссылок"
+#: lib/tools_dlg.tcl:198
+msgid "Remove"
+msgstr "Удалить"
 
-#: lib/mergetool.tcl:146
-msgid "Conflict file does not exist"
-msgstr "Конфликтующий файл не существует"
+#: lib/tools_dlg.tcl:231
+msgid "(Blue denotes repository-local tools)"
+msgstr "(Синим выделены программы локальные репозиторию)"
 
-#: lib/mergetool.tcl:264
+#: lib/tools_dlg.tcl:283
 #, tcl-format
-msgid "Not a GUI merge tool: '%s'"
-msgstr "«%s» не является программой слияния"
+msgid "%s (%s):"
+msgstr "%s (%s):"
 
-#: lib/mergetool.tcl:268
+#: lib/tools_dlg.tcl:292
 #, tcl-format
-msgid "Unsupported merge tool '%s'"
-msgstr "Неподдерживаемая программа слияния «%s»"
+msgid "Run Command: %s"
+msgstr "Запуск команды: %s"
 
-#: lib/mergetool.tcl:303
-msgid "Merge tool is already running, terminate it?"
-msgstr "Программа слияния уже работает. Прервать?"
+#: lib/tools_dlg.tcl:306
+msgid "Arguments"
+msgstr "Аргументы"
 
-#: lib/mergetool.tcl:323
-#, tcl-format
-msgid ""
-"Error retrieving versions:\n"
-"%s"
-msgstr "Ошибка получения версий:\n%s"
+#: lib/tools_dlg.tcl:341
+msgid "OK"
+msgstr "OK"
 
-#: lib/mergetool.tcl:343
-#, tcl-format
-msgid ""
-"Could not start the merge tool:\n"
-"\n"
-"%s"
-msgstr "Ошибка запуска программы слияния:\n\n%s"
+#: lib/search.tcl:48
+msgid "Find:"
+msgstr "Поиск:"
 
-#: lib/mergetool.tcl:347
-msgid "Running merge tool..."
-msgstr "Запуск программы слияния…"
+#: lib/search.tcl:50
+msgid "Next"
+msgstr "Дальше"
 
-#: lib/mergetool.tcl:375 lib/mergetool.tcl:383
-msgid "Merge tool failed."
-msgstr "Ошибка выполнения программы слияния."
+#: lib/search.tcl:51
+msgid "Prev"
+msgstr "Обратно"
 
-#: lib/option.tcl:11
-#, tcl-format
-msgid "Invalid global encoding '%s'"
-msgstr "Неверная глобальная кодировка «%s»"
+#: lib/search.tcl:52
+msgid "RegExp"
+msgstr "Регулярные выражения"
 
-#: lib/option.tcl:19
+#: lib/search.tcl:54
+msgid "Case"
+msgstr "Учёт регистра"
+
+#: lib/shortcut.tcl:8 lib/shortcut.tcl:43 lib/shortcut.tcl:75
 #, tcl-format
-msgid "Invalid repo encoding '%s'"
-msgstr "Неверная кодировка репозитория «%s»"
+msgid "%s (%s): Create Desktop Icon"
+msgstr "%s (%s): Создать ярлык на рабочем столе"
 
-#: lib/option.tcl:117
-msgid "Restore Defaults"
-msgstr "Восстановить настройки по умолчанию"
+#: lib/shortcut.tcl:24 lib/shortcut.tcl:65
+msgid "Cannot write shortcut:"
+msgstr "Невозможно записать ссылку:"
 
-#: lib/option.tcl:121
-msgid "Save"
-msgstr "Сохранить"
+#: lib/shortcut.tcl:140
+msgid "Cannot write icon:"
+msgstr "Невозможно записать значок:"
 
-#: lib/option.tcl:131
+#: lib/remote_branch_delete.tcl:29
 #, tcl-format
-msgid "%s Repository"
-msgstr "Для репозитория %s"
-
-#: lib/option.tcl:132
-msgid "Global (All Repositories)"
-msgstr "Общие (для всех репозиториев)"
+msgid "%s (%s): Delete Branch Remotely"
+msgstr "%s (%s): Удаление внешней ветки"
 
-#: lib/option.tcl:138
-msgid "User Name"
-msgstr "Имя пользователя"
+#: lib/remote_branch_delete.tcl:34
+msgid "Delete Branch Remotely"
+msgstr "Удаление ветки во внешнем репозитории"
 
-#: lib/option.tcl:139
-msgid "Email Address"
-msgstr "Адрес электронной почты"
+#: lib/remote_branch_delete.tcl:48
+msgid "From Repository"
+msgstr "Из репозитория"
 
-#: lib/option.tcl:141
-msgid "Summarize Merge Commits"
-msgstr "Суммарное сообщение при слиянии"
+#: lib/remote_branch_delete.tcl:88
+msgid "Branches"
+msgstr "Ветки"
 
-#: lib/option.tcl:142
-msgid "Merge Verbosity"
-msgstr "Уровень детальности сообщений при слиянии"
+#: lib/remote_branch_delete.tcl:110
+msgid "Delete Only If"
+msgstr "Удалить только в случае, если"
 
-#: lib/option.tcl:143
-msgid "Show Diffstat After Merge"
-msgstr "Показать отчет об изменениях после слияния"
+#: lib/remote_branch_delete.tcl:112
+msgid "Merged Into:"
+msgstr "Слияние с:"
 
-#: lib/option.tcl:144
-msgid "Use Merge Tool"
-msgstr "Использовать для слияния программу"
+#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
+msgid "Always (Do not perform merge checks)"
+msgstr "Всегда (не выполнять проверку на слияние)"
 
-#: lib/option.tcl:146
-msgid "Trust File Modification Timestamps"
-msgstr "Доверять времени модификации файла"
+#: lib/remote_branch_delete.tcl:153
+msgid "A branch is required for 'Merged Into'."
+msgstr "Для операции «Слияние с» требуется указать ветку."
 
-#: lib/option.tcl:147
-msgid "Prune Tracking Branches During Fetch"
-msgstr "Чистка отслеживаемых веток при извлечении изменений"
+#: lib/remote_branch_delete.tcl:185
+#, tcl-format
+msgid ""
+"The following branches are not completely merged into %s:\n"
+"\n"
+" - %s"
+msgstr "Следующие ветки могут быть объединены с %s при помощи операции слияния:\n\n - %s"
 
-#: lib/option.tcl:148
-msgid "Match Tracking Branches"
-msgstr "Такое же имя, как и у отслеживаемой ветки"
+#: lib/remote_branch_delete.tcl:190
+#, tcl-format
+msgid ""
+"One or more of the merge tests failed because you have not fetched the "
+"necessary commits.  Try fetching from %s first."
+msgstr "Некоторые тесты на слияние не прошли, потому что вы не извлекли необходимые коммиты. Попытайтесь извлечь их из %s."
 
-#: lib/option.tcl:149
-msgid "Blame Copy Only On Changed Files"
-msgstr "Поиск копий только в изменённых файлах"
+#: lib/remote_branch_delete.tcl:208
+msgid "Please select one or more branches to delete."
+msgstr "Укажите одну или несколько веток для удаления."
 
-#: lib/option.tcl:150
-msgid "Minimum Letters To Blame Copy On"
-msgstr "Минимальное количество символов для поиска копий"
+#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115
+msgid ""
+"Recovering deleted branches is difficult.\n"
+"\n"
+"Delete the selected branches?"
+msgstr "Восстановить удаленные ветки сложно.\n\nПродолжить?"
 
-#: lib/option.tcl:151
-msgid "Blame History Context Radius (days)"
-msgstr "Радиус исторического контекста (в днях)"
+#: lib/remote_branch_delete.tcl:227
+#, tcl-format
+msgid "Deleting branches from %s"
+msgstr "Удаление веток из %s"
 
-#: lib/option.tcl:152
-msgid "Number of Diff Context Lines"
-msgstr "Число строк в контексте diff"
+#: lib/remote_branch_delete.tcl:300
+msgid "No repository selected."
+msgstr "Не указан репозиторий."
 
-#: lib/option.tcl:153
-msgid "Commit Message Text Width"
-msgstr "Ширина текста сообщения коммита"
+#: lib/remote_branch_delete.tcl:305
+#, tcl-format
+msgid "Scanning %s..."
+msgstr "Перечитывание %s…"
 
-#: lib/option.tcl:154
-msgid "New Branch Name Template"
-msgstr "Шаблон для имени новой ветки"
+#: lib/choose_repository.tcl:45
+msgid "Git Gui"
+msgstr "Git Gui"
 
-#: lib/option.tcl:155
-msgid "Default File Contents Encoding"
-msgstr "Кодировка содержания файла по умолчанию"
+#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:427
+msgid "Create New Repository"
+msgstr "Создать новый репозиторий"
 
-#: lib/option.tcl:203
-msgid "Change"
-msgstr "Изменить"
+#: lib/choose_repository.tcl:110
+msgid "New..."
+msgstr "Новый…"
 
-#: lib/option.tcl:230
-msgid "Spelling Dictionary:"
-msgstr "Словарь для проверки правописания:"
+#: lib/choose_repository.tcl:117 lib/choose_repository.tcl:511
+msgid "Clone Existing Repository"
+msgstr "Склонировать существующий репозиторий"
 
-#: lib/option.tcl:254
-msgid "Change Font"
-msgstr "Изменить"
+#: lib/choose_repository.tcl:128
+msgid "Clone..."
+msgstr "Клонировать…"
 
-#: lib/option.tcl:258
-#, tcl-format
-msgid "Choose %s"
-msgstr "Выберите %s"
+#: lib/choose_repository.tcl:135 lib/choose_repository.tcl:1105
+msgid "Open Existing Repository"
+msgstr "Выбрать существующий репозиторий"
 
-#: lib/option.tcl:264
-msgid "pt."
-msgstr "pt."
+#: lib/choose_repository.tcl:141
+msgid "Open..."
+msgstr "Открыть…"
 
-#: lib/option.tcl:278
-msgid "Preferences"
-msgstr "Настройки"
+#: lib/choose_repository.tcl:154
+msgid "Recent Repositories"
+msgstr "Недавние репозитории"
 
-#: lib/option.tcl:314
-msgid "Failed to completely save options:"
-msgstr "Не удалось полностью сохранить настройки:"
+#: lib/choose_repository.tcl:164
+msgid "Open Recent Repository:"
+msgstr "Открыть последний репозиторий"
 
-#: lib/remote.tcl:163
-msgid "Remove Remote"
-msgstr "Удалить ссылку на внешний репозиторий"
+#: lib/choose_repository.tcl:331 lib/choose_repository.tcl:338
+#: lib/choose_repository.tcl:345
+#, tcl-format
+msgid "Failed to create repository %s:"
+msgstr "Не удалось создать репозиторий %s:"
 
-#: lib/remote.tcl:168
-msgid "Prune from"
-msgstr "Чистка"
+#: lib/choose_repository.tcl:422 lib/branch_create.tcl:33
+msgid "Create"
+msgstr "Создать"
 
-#: lib/remote.tcl:173
-msgid "Fetch from"
-msgstr "Извлечение из"
+#: lib/choose_repository.tcl:432
+msgid "Directory:"
+msgstr "Каталог:"
 
-#: lib/remote.tcl:215
-msgid "Push to"
-msgstr "Отправить"
+#: lib/choose_repository.tcl:462 lib/choose_repository.tcl:588
+#: lib/choose_repository.tcl:1139
+msgid "Git Repository"
+msgstr "Репозиторий"
 
-#: lib/remote_add.tcl:19
-msgid "Add Remote"
-msgstr "Зарегистрировать внешний репозиторий"
+#: lib/choose_repository.tcl:487
+#, tcl-format
+msgid "Directory %s already exists."
+msgstr "Каталог '%s' уже существует."
 
-#: lib/remote_add.tcl:24
-msgid "Add New Remote"
-msgstr "Добавить внешний репозиторий"
+#: lib/choose_repository.tcl:491
+#, tcl-format
+msgid "File %s already exists."
+msgstr "Файл '%s' уже существует."
 
-#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36
-msgid "Add"
-msgstr "Добавить"
+#: lib/choose_repository.tcl:506
+msgid "Clone"
+msgstr "Склонировать"
 
-#: lib/remote_add.tcl:37
-msgid "Remote Details"
-msgstr "Информация о внешнем репозитории"
+#: lib/choose_repository.tcl:519
+msgid "Source Location:"
+msgstr "Исходное положение:"
 
-#: lib/remote_add.tcl:50
-msgid "Location:"
-msgstr "Положение:"
+#: lib/choose_repository.tcl:528
+msgid "Target Directory:"
+msgstr "Каталог назначения:"
 
-#: lib/remote_add.tcl:62
-msgid "Further Action"
-msgstr "Следующая операция"
+#: lib/choose_repository.tcl:538
+msgid "Clone Type:"
+msgstr "Тип клона:"
 
-#: lib/remote_add.tcl:65
-msgid "Fetch Immediately"
-msgstr "Сразу извлечь изменения"
+#: lib/choose_repository.tcl:543
+msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
+msgstr "Стандартный (Быстрый, полуизбыточный, «жесткие» ссылки)"
 
-#: lib/remote_add.tcl:71
-msgid "Initialize Remote Repository and Push"
-msgstr "Инициализировать внешний репозиторий и отправить"
+#: lib/choose_repository.tcl:548
+msgid "Full Copy (Slower, Redundant Backup)"
+msgstr "Полная копия (Медленный, создает резервную копию)"
 
-#: lib/remote_add.tcl:77
-msgid "Do Nothing Else Now"
-msgstr "Больше ничего не делать"
+#: lib/choose_repository.tcl:553
+msgid "Shared (Fastest, Not Recommended, No Backup)"
+msgstr "Общий (Самый быстрый, не рекомендуется, без резервной копии)"
 
-#: lib/remote_add.tcl:101
-msgid "Please supply a remote name."
-msgstr "Укажите название внешнего репозитория."
+#: lib/choose_repository.tcl:560
+msgid "Recursively clone submodules too"
+msgstr "Также рекурсивно клонировать подмодули"
 
-#: lib/remote_add.tcl:114
+#: lib/choose_repository.tcl:594 lib/choose_repository.tcl:641
+#: lib/choose_repository.tcl:790 lib/choose_repository.tcl:864
+#: lib/choose_repository.tcl:1145 lib/choose_repository.tcl:1153
 #, tcl-format
-msgid "'%s' is not an acceptable remote name."
-msgstr "«%s» не является допустимым именем внешнего репозитория."
+msgid "Not a Git repository: %s"
+msgstr "Каталог не является репозиторием Git: %s"
 
-#: lib/remote_add.tcl:125
-#, tcl-format
-msgid "Failed to add remote '%s' of location '%s'."
-msgstr "Не удалось добавить «%s» из «%s». "
+#: lib/choose_repository.tcl:630
+msgid "Standard only available for local repository."
+msgstr "Стандартный клон возможен только для локального репозитория."
 
-#: lib/remote_add.tcl:133 lib/transport.tcl:6
-#, tcl-format
-msgid "fetch %s"
-msgstr "извлечение %s"
+#: lib/choose_repository.tcl:634
+msgid "Shared only available for local repository."
+msgstr "Общий клон возможен только для локального репозитория."
 
-#: lib/remote_add.tcl:134
+#: lib/choose_repository.tcl:655
 #, tcl-format
-msgid "Fetching the %s"
-msgstr "Извлечение %s"
+msgid "Location %s already exists."
+msgstr "Путь %s уже существует."
 
-#: lib/remote_add.tcl:157
-#, tcl-format
-msgid "Do not know how to initialize repository at location '%s'."
-msgstr "Невозможно инициализировать репозиторий в «%s»."
+#: lib/choose_repository.tcl:666
+msgid "Failed to configure origin"
+msgstr "Не удалось сконфигурировать исходный репозиторий"
+
+#: lib/choose_repository.tcl:678
+msgid "Counting objects"
+msgstr "Подсчёт объектов"
 
-#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63
-#: lib/transport.tcl:81
+#: lib/choose_repository.tcl:679
+msgid "buckets"
+msgstr "блоки"
+
+#: lib/choose_repository.tcl:703
 #, tcl-format
-msgid "push %s"
-msgstr "отправить %s"
+msgid "Unable to copy objects/info/alternates: %s"
+msgstr "Не удалось скопировать objects/info/alternates: %s"
 
-#: lib/remote_add.tcl:164
+#: lib/choose_repository.tcl:740
 #, tcl-format
-msgid "Setting up the %s (at %s)"
-msgstr "Настройка %s (в %s)"
+msgid "Nothing to clone from %s."
+msgstr "Нечего клонировать с %s."
 
-#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
-msgid "Delete Branch Remotely"
-msgstr "Удаление ветки во внешнем репозитории"
+#: lib/choose_repository.tcl:742 lib/choose_repository.tcl:962
+#: lib/choose_repository.tcl:974
+msgid "The 'master' branch has not been initialized."
+msgstr "Не инициализирована ветка «master»."
 
-#: lib/remote_branch_delete.tcl:47
-msgid "From Repository"
-msgstr "Из репозитория"
+#: lib/choose_repository.tcl:755
+msgid "Hardlinks are unavailable.  Falling back to copying."
+msgstr "Жесткие ссылки недоступны. Будет использовано копирование."
 
-#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134
-msgid "Remote:"
-msgstr "внешний:"
+#: lib/choose_repository.tcl:769
+#, tcl-format
+msgid "Cloning from %s"
+msgstr "Клонирование из %s"
 
-#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149
-msgid "Arbitrary Location:"
-msgstr "Указанное положение:"
+#: lib/choose_repository.tcl:800
+msgid "Copying objects"
+msgstr "Копирование объектов"
 
-#: lib/remote_branch_delete.tcl:84
-msgid "Branches"
-msgstr "Ветки"
+#: lib/choose_repository.tcl:801
+msgid "KiB"
+msgstr "КБ"
 
-#: lib/remote_branch_delete.tcl:109
-msgid "Delete Only If"
-msgstr "Удалить только в случае, если"
+#: lib/choose_repository.tcl:825
+#, tcl-format
+msgid "Unable to copy object: %s"
+msgstr "Не могу скопировать объект: %s"
 
-#: lib/remote_branch_delete.tcl:111
-msgid "Merged Into:"
-msgstr "Слияние с:"
+#: lib/choose_repository.tcl:837
+msgid "Linking objects"
+msgstr "Создание ссылок на objects"
 
-#: lib/remote_branch_delete.tcl:152
-msgid "A branch is required for 'Merged Into'."
-msgstr "Для операции «Слияние с» требуется указать ветку."
+#: lib/choose_repository.tcl:838
+msgid "objects"
+msgstr "объекты"
 
-#: lib/remote_branch_delete.tcl:184
+#: lib/choose_repository.tcl:846
 #, tcl-format
-msgid ""
-"The following branches are not completely merged into %s:\n"
-"\n"
-" - %s"
-msgstr "Следующие ветки могут быть объединены с %s при помощи операции слияния:\n\n - %s"
+msgid "Unable to hardlink object: %s"
+msgstr "Не могу создать «жесткую ссылку» на объект: %s"
 
-#: lib/remote_branch_delete.tcl:189
-#, tcl-format
-msgid ""
-"One or more of the merge tests failed because you have not fetched the "
-"necessary commits.  Try fetching from %s first."
-msgstr "Некоторые тесты на слияние не прошли, потому что вы не извлекли необходимые коммиты. Попытайтесь извлечь их из %s."
+#: lib/choose_repository.tcl:903
+msgid "Cannot fetch branches and objects.  See console output for details."
+msgstr "Не удалось извлечь ветки и объекты. Дополнительная информация на консоли."
 
-#: lib/remote_branch_delete.tcl:207
-msgid "Please select one or more branches to delete."
-msgstr "Укажите одну или несколько веток для удаления."
+#: lib/choose_repository.tcl:914
+msgid "Cannot fetch tags.  See console output for details."
+msgstr "Не удалось извлечь метки. Дополнительная информация на консоли."
+
+#: lib/choose_repository.tcl:938
+msgid "Cannot determine HEAD.  See console output for details."
+msgstr "Не могу определить HEAD. Дополнительная информация на консоли."
 
-#: lib/remote_branch_delete.tcl:226
+#: lib/choose_repository.tcl:947
 #, tcl-format
-msgid "Deleting branches from %s"
-msgstr "Удаление веток из %s"
+msgid "Unable to cleanup %s"
+msgstr "Не могу очистить %s"
 
-#: lib/remote_branch_delete.tcl:292
-msgid "No repository selected."
-msgstr "Не указан репозиторий."
+#: lib/choose_repository.tcl:953
+msgid "Clone failed."
+msgstr "Клонирование не удалось."
+
+#: lib/choose_repository.tcl:960
+msgid "No default branch obtained."
+msgstr "Ветка по умолчанию не была получена."
 
-#: lib/remote_branch_delete.tcl:297
+#: lib/choose_repository.tcl:971
 #, tcl-format
-msgid "Scanning %s..."
-msgstr "Перечитывание %s…"
+msgid "Cannot resolve %s as a commit."
+msgstr "Не могу распознать %s как коммит."
 
-#: lib/search.tcl:21
-msgid "Find:"
-msgstr "Поиск:"
+#: lib/choose_repository.tcl:998
+msgid "Creating working directory"
+msgstr "Создаю рабочий каталог"
 
-#: lib/search.tcl:23
-msgid "Next"
-msgstr "Дальше"
+#: lib/choose_repository.tcl:1028
+msgid "Initial file checkout failed."
+msgstr "Не удалось получить начальное состояние файлов репозитория."
 
-#: lib/search.tcl:24
-msgid "Prev"
-msgstr "Обратно"
+#: lib/choose_repository.tcl:1072
+msgid "Cloning submodules"
+msgstr "Клонирование подмодулей"
 
-#: lib/search.tcl:25
-msgid "Case-Sensitive"
-msgstr "Игн. большие/маленькие"
+#: lib/choose_repository.tcl:1087
+msgid "Cannot clone submodules."
+msgstr "Не удалось клонировать подмодули."
 
-#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
-msgid "Cannot write shortcut:"
-msgstr "Невозможно записать ссылку:"
+#: lib/choose_repository.tcl:1110
+msgid "Repository:"
+msgstr "Репозиторий:"
 
-#: lib/shortcut.tcl:137
-msgid "Cannot write icon:"
-msgstr "Невозможно записать значок:"
+#: lib/choose_repository.tcl:1159
+#, tcl-format
+msgid "Failed to open repository %s:"
+msgstr "Не удалось открыть репозиторий %s:"
 
-#: lib/spellcheck.tcl:57
-msgid "Unsupported spell checker"
-msgstr "Неподдерживаемая программа проверки правописания"
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "git-gui - графический пользовательский интерфейс к Git."
 
-#: lib/spellcheck.tcl:65
-msgid "Spell checking is unavailable"
-msgstr "Проверка правописания не доступна"
+#: lib/blame.tcl:74
+#, tcl-format
+msgid "%s (%s): File Viewer"
+msgstr "%s (%s): Просмотр файла"
 
-#: lib/spellcheck.tcl:68
-msgid "Invalid spell checking configuration"
-msgstr "Неправильная конфигурация программы проверки правописания"
+#: lib/blame.tcl:80
+msgid "Commit:"
+msgstr "Коммит:"
 
-#: lib/spellcheck.tcl:70
-#, tcl-format
-msgid "Reverting dictionary to %s."
-msgstr "Словарь вернут к %s."
+#: lib/blame.tcl:282
+msgid "Copy Commit"
+msgstr "Копировать SHA-1"
 
-#: lib/spellcheck.tcl:73
-msgid "Spell checker silently failed on startup"
-msgstr "Программа проверки правописания не смогла запуститься"
+#: lib/blame.tcl:286
+msgid "Find Text..."
+msgstr "Найти текст…"
 
-#: lib/spellcheck.tcl:80
-msgid "Unrecognized spell checker"
-msgstr "Нераспознанная программа проверки правописания"
+#: lib/blame.tcl:290
+msgid "Goto Line..."
+msgstr "Перейти на строку…"
 
-#: lib/spellcheck.tcl:186
-msgid "No Suggestions"
-msgstr "Исправлений не найдено"
+#: lib/blame.tcl:299
+msgid "Do Full Copy Detection"
+msgstr "Провести полный поиск копий"
 
-#: lib/spellcheck.tcl:388
-msgid "Unexpected EOF from spell checker"
-msgstr "Программа проверки правописания прервала передачу данных"
+#: lib/blame.tcl:303
+msgid "Show History Context"
+msgstr "Показать исторический контекст"
 
-#: lib/spellcheck.tcl:392
-msgid "Spell Checker Failed"
-msgstr "Ошибка проверки правописания"
+#: lib/blame.tcl:306
+msgid "Blame Parent Commit"
+msgstr "Авторы родительского коммита"
 
-#: lib/sshkey.tcl:31
+#: lib/blame.tcl:468
+#, tcl-format
+msgid "Reading %s..."
+msgstr "Чтение %s…"
+
+#: lib/blame.tcl:596
+msgid "Loading copy/move tracking annotations..."
+msgstr "Загрузка аннотации копирований/переименований…"
+
+#: lib/blame.tcl:613
+msgid "lines annotated"
+msgstr "строк прокомментировано"
+
+#: lib/blame.tcl:815
+msgid "Loading original location annotations..."
+msgstr "Загрузка аннотаций первоначального положения объекта…"
+
+#: lib/blame.tcl:818
+msgid "Annotation complete."
+msgstr "Аннотация завершена."
+
+#: lib/blame.tcl:849
+msgid "Busy"
+msgstr "Занят"
+
+#: lib/blame.tcl:850
+msgid "Annotation process is already running."
+msgstr "Аннотация уже запущена"
+
+#: lib/blame.tcl:889
+msgid "Running thorough copy detection..."
+msgstr "Выполнение полного поиска копий…"
+
+#: lib/blame.tcl:957
+msgid "Loading annotation..."
+msgstr "Загрузка аннотации…"
+
+#: lib/blame.tcl:1010
+msgid "Author:"
+msgstr "Автор:"
+
+#: lib/blame.tcl:1014
+msgid "Committer:"
+msgstr "Коммитер:"
+
+#: lib/blame.tcl:1019
+msgid "Original File:"
+msgstr "Исходный файл:"
+
+#: lib/blame.tcl:1067
+msgid "Cannot find HEAD commit:"
+msgstr "Не удалось найти текущее состояние:"
+
+#: lib/blame.tcl:1122
+msgid "Cannot find parent commit:"
+msgstr "Не удалось найти родительское состояние:"
+
+#: lib/blame.tcl:1137
+msgid "Unable to display parent"
+msgstr "Не могу показать предка"
+
+#: lib/blame.tcl:1138 lib/diff.tcl:345
+msgid "Error loading diff:"
+msgstr "Ошибка загрузки изменений:"
+
+#: lib/blame.tcl:1279
+msgid "Originally By:"
+msgstr "Источник:"
+
+#: lib/blame.tcl:1285
+msgid "In File:"
+msgstr "Файл:"
+
+#: lib/blame.tcl:1290
+msgid "Copied Or Moved Here By:"
+msgstr "Скопировано/перемещено в:"
+
+#: lib/diff.tcl:77
+#, tcl-format
+msgid ""
+"No differences detected.\n"
+"\n"
+"%s has no changes.\n"
+"\n"
+"The modification date of this file was updated by another application, but the content within the file was not changed.\n"
+"\n"
+"A rescan will be automatically started to find other files which may have the same state."
+msgstr "Изменений не обнаружено.\n\nв %s отсутствуют изменения.\n\nДата изменения файла была обновлена другой программой, но содержимое файла осталось прежним.\n\nСейчас будет запущено перечитывание репозитория, чтобы найти подобные файлы."
+
+#: lib/diff.tcl:117
+#, tcl-format
+msgid "Loading diff of %s..."
+msgstr "Загрузка изменений %s…"
+
+#: lib/diff.tcl:143
+msgid ""
+"LOCAL: deleted\n"
+"REMOTE:\n"
+msgstr "ЛОКАЛЬНО: удалён\nВНЕШНИЙ:\n"
+
+#: lib/diff.tcl:148
+msgid ""
+"REMOTE: deleted\n"
+"LOCAL:\n"
+msgstr "ВНЕШНИЙ: удалён\nЛОКАЛЬНО:\n"
+
+#: lib/diff.tcl:155
+msgid "LOCAL:\n"
+msgstr "ЛОКАЛЬНО:\n"
+
+#: lib/diff.tcl:158
+msgid "REMOTE:\n"
+msgstr "ВНЕШНИЙ:\n"
+
+#: lib/diff.tcl:220 lib/diff.tcl:344
+#, tcl-format
+msgid "Unable to display %s"
+msgstr "Не могу показать %s"
+
+#: lib/diff.tcl:221
+msgid "Error loading file:"
+msgstr "Ошибка загрузки файла:"
+
+#: lib/diff.tcl:227
+msgid "Git Repository (subproject)"
+msgstr "Репозиторий Git (подпроект)"
+
+#: lib/diff.tcl:239
+msgid "* Binary file (not showing content)."
+msgstr "* Двоичный файл (содержимое не показано)"
+
+#: lib/diff.tcl:244
+#, tcl-format
+msgid ""
+"* Untracked file is %d bytes.\n"
+"* Showing only first %d bytes.\n"
+msgstr "* Размер неотслеживаемого файла %d байт.\n* Показано первых %d байт.\n"
+
+#: lib/diff.tcl:250
+#, tcl-format
+msgid ""
+"\n"
+"* Untracked file clipped here by %s.\n"
+"* To see the entire file, use an external editor.\n"
+msgstr "\n* Неотслеживаемый файл обрезан: %s.\n* Чтобы увидеть весь файл, используйте внешний редактор.\n"
+
+#: lib/diff.tcl:583
+msgid "Failed to unstage selected hunk."
+msgstr "Не удалось исключить выбранную часть."
+
+#: lib/diff.tcl:591
+msgid "Failed to revert selected hunk."
+msgstr "Не удалось обратить изменения выбранного блока."
+
+#: lib/diff.tcl:594
+msgid "Failed to stage selected hunk."
+msgstr "Не удалось проиндексировать выбранный блок изменений."
+
+#: lib/diff.tcl:687
+msgid "Failed to unstage selected line."
+msgstr "Не удалось исключить выбранную строку."
+
+#: lib/diff.tcl:696
+msgid "Failed to revert selected line."
+msgstr "Не удалось обратить изменения выбраной строки."
+
+#: lib/diff.tcl:700
+msgid "Failed to stage selected line."
+msgstr "Не удалось проиндексировать выбранную строку."
+
+#: lib/diff.tcl:889
+msgid "Failed to undo last revert."
+msgstr "Не удалось отменить посленднее обращение изменений."
+
+#: lib/sshkey.tcl:34
 msgid "No keys found."
 msgstr "Ключ не найден"
 
-#: lib/sshkey.tcl:34
+#: lib/sshkey.tcl:37
 #, tcl-format
 msgid "Found a public key in: %s"
 msgstr "Публичный ключ из %s"
 
-#: lib/sshkey.tcl:40
+#: lib/sshkey.tcl:43
 msgid "Generate Key"
 msgstr "Создать ключ"
 
-#: lib/sshkey.tcl:56
+#: lib/sshkey.tcl:61
 msgid "Copy To Clipboard"
 msgstr "Скопировать в буфер обмена"
 
-#: lib/sshkey.tcl:70
-msgid "Your OpenSSH Public Key"
-msgstr "Ваш публичный ключ OpenSSH"
+#: lib/sshkey.tcl:75
+msgid "Your OpenSSH Public Key"
+msgstr "Ваш публичный ключ OpenSSH"
+
+#: lib/sshkey.tcl:83
+msgid "Generating..."
+msgstr "Создание…"
+
+#: lib/sshkey.tcl:89
+#, tcl-format
+msgid ""
+"Could not start ssh-keygen:\n"
+"\n"
+"%s"
+msgstr "Ошибка запуска ssh-keygen:\n\n%s"
+
+#: lib/sshkey.tcl:116
+msgid "Generation failed."
+msgstr "Ключ не создан."
+
+#: lib/sshkey.tcl:123
+msgid "Generation succeeded, but no keys found."
+msgstr "Создание ключа завершилось, но результат не был найден"
+
+#: lib/sshkey.tcl:126
+#, tcl-format
+msgid "Your key is in: %s"
+msgstr "Ваш ключ находится в: %s"
+
+#: lib/branch_create.tcl:23
+#, tcl-format
+msgid "%s (%s): Create Branch"
+msgstr "%s (%s): Создание ветки"
+
+#: lib/branch_create.tcl:28
+msgid "Create New Branch"
+msgstr "Создать новую ветку"
+
+#: lib/branch_create.tcl:42
+msgid "Branch Name"
+msgstr "Имя ветки"
+
+#: lib/branch_create.tcl:57
+msgid "Match Tracking Branch Name"
+msgstr "Соответствовать имени отслеживаемой ветки"
+
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "Начальная версия"
+
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "Обновить имеющуюся ветку:"
+
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "Нет"
+
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "Только Fast Forward"
+
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "После создания сделать текущей"
+
+#: lib/branch_create.tcl:132
+msgid "Please select a tracking branch."
+msgstr "Укажите отлеживаемую ветку."
+
+#: lib/branch_create.tcl:141
+#, tcl-format
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr "Отслеживаемая ветка %s не является веткой на внешнем репозитории."
+
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "В процессе… пожалуйста, ждите…"
+
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "Процесс успешно завершен"
+
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "Ошибка: не удалось выполнить команду"
+
+#: lib/line.tcl:17
+msgid "Goto Line:"
+msgstr "Перейти на строку:"
+
+#: lib/line.tcl:23
+msgid "Go"
+msgstr "Перейти"
+
+#: lib/choose_rev.tcl:52
+msgid "This Detached Checkout"
+msgstr "Текущее отсоединенное состояние"
+
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "Выражение для определения версии:"
+
+#: lib/choose_rev.tcl:72
+msgid "Local Branch"
+msgstr "Локальная ветка:"
+
+#: lib/choose_rev.tcl:77
+msgid "Tracking Branch"
+msgstr "Отслеживаемая ветка"
+
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
+msgid "Tag"
+msgstr "Метка"
+
+#: lib/choose_rev.tcl:321
+#, tcl-format
+msgid "Invalid revision: %s"
+msgstr "Неверная версия: %s"
+
+#: lib/choose_rev.tcl:342
+msgid "No revision selected."
+msgstr "Версия не указана."
+
+#: lib/choose_rev.tcl:350
+msgid "Revision expression is empty."
+msgstr "Пустое выражение для определения версии."
+
+#: lib/choose_rev.tcl:537
+msgid "Updated"
+msgstr "Обновлено"
+
+#: lib/choose_rev.tcl:565
+msgid "URL"
+msgstr "Ссылка"
+
+#: lib/commit.tcl:9
+msgid ""
+"There is nothing to amend.\n"
+"\n"
+"You are about to create the initial commit.  There is no commit before this to amend.\n"
+msgstr "Отсутствует коммиты для исправления.\n\nВы создаете начальный коммит, здесь еще нечего исправлять.\n"
+
+#: lib/commit.tcl:18
+msgid ""
+"Cannot amend while merging.\n"
+"\n"
+"You are currently in the middle of a merge that has not been fully completed.  You cannot amend the prior commit unless you first abort the current merge activity.\n"
+msgstr "Невозможно исправить коммит во время слияния.\n\nТекущее слияние не завершено. Невозможно исправить предыдуий коммит, не прерывая эту операцию.\n"
+
+#: lib/commit.tcl:56
+msgid "Error loading commit data for amend:"
+msgstr "Ошибка при загрузке данных для исправления коммита:"
+
+#: lib/commit.tcl:83
+msgid "Unable to obtain your identity:"
+msgstr "Невозможно получить информацию об авторстве:"
+
+#: lib/commit.tcl:88
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "Недопустимый GIT_COMMITTER_IDENT:"
+
+#: lib/commit.tcl:138
+#, tcl-format
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "предупреждение: Tcl не поддерживает кодировку «%s»."
+
+#: lib/commit.tcl:158
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A rescan must be performed before another commit can be created.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь. \n\nЭто будет сделано сейчас автоматически.\n"
+
+#: lib/commit.tcl:182
+#, tcl-format
+msgid ""
+"Unmerged files cannot be committed.\n"
+"\n"
+"File %s has merge conflicts.  You must resolve them and stage the file before committing.\n"
+msgstr "Нельзя выполнить коммит с незавершённой операцией слияния.\n\nДля файла %s возник конфликт слияния. Разрешите конфликт и добавьте их в индекс перед выполнением коммита.\n"
+
+#: lib/commit.tcl:190
+#, tcl-format
+msgid ""
+"Unknown file state %s detected.\n"
+"\n"
+"File %s cannot be committed by this program.\n"
+msgstr "Обнаружено неизвестное состояние файла %s.\n\nФайл %s не может быть закоммичен этой программой.\n"
+
+#: lib/commit.tcl:198
+msgid ""
+"No changes to commit.\n"
+"\n"
+"You must stage at least 1 file before you can commit.\n"
+msgstr "Отсутствуют изменения для сохранения.\n\nДобавьте в индекс хотя бы один файл перед выполнением коммита.\n"
+
+#: lib/commit.tcl:213
+msgid ""
+"Please supply a commit message.\n"
+"\n"
+"A good commit message has the following format:\n"
+"\n"
+"- First line: Describe in one sentence what you did.\n"
+"- Second line: Blank\n"
+"- Remaining lines: Describe why this change is good.\n"
+msgstr "Укажите сообщение коммита.\n\nРекомендуется следующий формат сообщения:\n\n- в первой строке краткое описание сделанных изменений\n- вторая строка пустая\n- в оставшихся строках опишите, что дают ваши изменения\n"
+
+#: lib/commit.tcl:244
+msgid "Calling pre-commit hook..."
+msgstr "Вызов перехватчика pre-commit…"
+
+#: lib/commit.tcl:259
+msgid "Commit declined by pre-commit hook."
+msgstr "Коммит прерван переватчиком pre-commit."
+
+#: lib/commit.tcl:278
+msgid ""
+"You are about to commit on a detached head. This is a potentially dangerous thing to do because if you switch to another branch you will lose your changes and it can be difficult to retrieve them later from the reflog. You should probably cancel this commit and create a new branch to continue.\n"
+" \n"
+" Do you really want to proceed with your Commit?"
+msgstr "Вы собираетесь сделать коммит в отделённый HEAD. Это действие потенциально опасно, так как если вы переключитесь на другую ветку после этого, то вы потеряете свои изменения и их сложно будет потом найти с помощью журнала ссылок (reflog). Вам скорее всего следует отменить этот коммит и создать новую ветку до продолжения.\n \n Вы действительно хотите продолжить и создать коммит?"
+
+#: lib/commit.tcl:299
+msgid "Calling commit-msg hook..."
+msgstr "Вызов перехватчика commit-msg…"
+
+#: lib/commit.tcl:314
+msgid "Commit declined by commit-msg hook."
+msgstr "Коммит прерван переватчиком commit-msg"
+
+#: lib/commit.tcl:327
+msgid "Committing changes..."
+msgstr "Коммит изменений…"
+
+#: lib/commit.tcl:344
+msgid "write-tree failed:"
+msgstr "Программа write-tree завершилась с ошибкой:"
 
-#: lib/sshkey.tcl:78
-msgid "Generating..."
-msgstr "Создание…"
+#: lib/commit.tcl:345 lib/commit.tcl:395 lib/commit.tcl:422
+msgid "Commit failed."
+msgstr "Не удалось закоммитить изменения."
 
-#: lib/sshkey.tcl:84
+#: lib/commit.tcl:362
 #, tcl-format
+msgid "Commit %s appears to be corrupt"
+msgstr "Коммит %s похоже поврежден"
+
+#: lib/commit.tcl:367
 msgid ""
-"Could not start ssh-keygen:\n"
+"No changes to commit.\n"
 "\n"
-"%s"
-msgstr "Ошибка запуска ssh-keygen:\n\n%s"
+"No files were modified by this commit and it was not a merge commit.\n"
+"\n"
+"A rescan will be automatically started now.\n"
+msgstr "Нет изменения для коммита.\n\nНи один файл не был изменен и не было слияния.\n\nСейчас автоматически запустится перечитывание репозитория.\n"
 
-#: lib/sshkey.tcl:111
-msgid "Generation failed."
-msgstr "Ключ не создан."
+#: lib/commit.tcl:374
+msgid "No changes to commit."
+msgstr "Нет изменения для коммита."
 
-#: lib/sshkey.tcl:118
-msgid "Generation succeeded, but no keys found."
-msgstr "Создание ключа завершилось, но результат не был найден"
+#: lib/commit.tcl:394
+msgid "commit-tree failed:"
+msgstr "Программа commit-tree завершилась с ошибкой:"
 
-#: lib/sshkey.tcl:121
-#, tcl-format
-msgid "Your key is in: %s"
-msgstr "Ваш ключ находится в: %s"
+#: lib/commit.tcl:421
+msgid "update-ref failed:"
+msgstr "Программа update-ref завершилась с ошибкой:"
 
-#: lib/status_bar.tcl:83
+#: lib/commit.tcl:514
 #, tcl-format
-msgid "%s ... %*i of %*i %s (%3i%%)"
-msgstr "%s … %*i из %*i %s (%3i%%)"
+msgid "Created commit %s: %s"
+msgstr "Создан коммит %s: %s "
 
-#: lib/tools.tcl:75
+#: lib/branch_delete.tcl:16
 #, tcl-format
-msgid "Running %s requires a selected file."
-msgstr "Запуск %s требует выбранного файла."
+msgid "%s (%s): Delete Branch"
+msgstr "%s (%s): Удаление ветки"
 
-#: lib/tools.tcl:90
-#, tcl-format
-msgid "Are you sure you want to run %s?"
-msgstr "Действительно запустить %s?"
+#: lib/branch_delete.tcl:21
+msgid "Delete Local Branch"
+msgstr "Удалить локальную ветку"
 
-#: lib/tools.tcl:110
-#, tcl-format
-msgid "Tool: %s"
-msgstr "Вспомогательная операция: %s"
+#: lib/branch_delete.tcl:39
+msgid "Local Branches"
+msgstr "Локальные ветки"
 
-#: lib/tools.tcl:111
-#, tcl-format
-msgid "Running: %s"
-msgstr "Выполнение: %s"
+#: lib/branch_delete.tcl:51
+msgid "Delete Only If Merged Into"
+msgstr "Удалить только в случае, если было слияние с"
 
-#: lib/tools.tcl:149
+#: lib/branch_delete.tcl:103
 #, tcl-format
-msgid "Tool completed successfully: %s"
-msgstr "Программа %s завершилась успешно."
+msgid "The following branches are not completely merged into %s:"
+msgstr "Ветки, которые не полностью сливаются с %s:"
 
-#: lib/tools.tcl:151
+#: lib/branch_delete.tcl:131
 #, tcl-format
-msgid "Tool failed: %s"
-msgstr "Ошибка выполнения программы: %s"
+msgid " - %s:"
+msgstr " — %s:"
 
-#: lib/tools_dlg.tcl:22
-msgid "Add Tool"
-msgstr "Добавить вспомогательную операцию"
-
-#: lib/tools_dlg.tcl:28
-msgid "Add New Tool Command"
-msgstr "Новая вспомогательная операция"
+#: lib/branch_delete.tcl:141
+#, tcl-format
+msgid ""
+"Failed to delete branches:\n"
+"%s"
+msgstr "Не удалось удалить ветки:\n%s"
 
-#: lib/tools_dlg.tcl:33
-msgid "Add globally"
-msgstr "Добавить для всех репозиториев"
+#: lib/date.tcl:25
+#, tcl-format
+msgid "Invalid date from Git: %s"
+msgstr "Неправильная дата в репозитории: %s"
 
-#: lib/tools_dlg.tcl:45
-msgid "Tool Details"
-msgstr "Описание вспомогательной операции"
+#: lib/database.tcl:42
+msgid "Number of loose objects"
+msgstr "Количество несвязанных объектов"
 
-#: lib/tools_dlg.tcl:48
-msgid "Use '/' separators to create a submenu tree:"
-msgstr "Используйте «/» для создания подменю"
+#: lib/database.tcl:43
+msgid "Disk space used by loose objects"
+msgstr "Объем дискового пространства, занятый несвязанными объектами"
 
-#: lib/tools_dlg.tcl:61
-msgid "Command:"
-msgstr "Команда:"
+#: lib/database.tcl:44
+msgid "Number of packed objects"
+msgstr "Количество упакованных объектов"
 
-#: lib/tools_dlg.tcl:74
-msgid "Show a dialog before running"
-msgstr "Показать диалог перед запуском"
+#: lib/database.tcl:45
+msgid "Number of packs"
+msgstr "Количество pack-файлов"
 
-#: lib/tools_dlg.tcl:80
-msgid "Ask the user to select a revision (sets $REVISION)"
-msgstr "Запрос на выбор версии (устанавливает $REVISION)"
+#: lib/database.tcl:46
+msgid "Disk space used by packed objects"
+msgstr "Объем дискового пространства, занятый упакованными объектами"
 
-#: lib/tools_dlg.tcl:85
-msgid "Ask the user for additional arguments (sets $ARGS)"
-msgstr "Запрос дополнительных аргументов (устанавливает $ARGS)"
+#: lib/database.tcl:47
+msgid "Packed objects waiting for pruning"
+msgstr "Несвязанные объекты, которые можно удалить"
 
-#: lib/tools_dlg.tcl:92
-msgid "Don't show the command output window"
-msgstr "Не показывать окно вывода команды"
+#: lib/database.tcl:48
+msgid "Garbage files"
+msgstr "Мусор"
 
-#: lib/tools_dlg.tcl:97
-msgid "Run only if a diff is selected ($FILENAME not empty)"
-msgstr "Запуск только если показан список изменений ($FILENAME не пусто)"
+#: lib/database.tcl:66
+#, tcl-format
+msgid "%s (%s): Database Statistics"
+msgstr "%s (%s): Статистика базы данных"
 
-#: lib/tools_dlg.tcl:121
-msgid "Please supply a name for the tool."
-msgstr "Укажите название вспомогательной операции."
+#: lib/database.tcl:72
+msgid "Compressing the object database"
+msgstr "Сжатие базы объектов"
 
-#: lib/tools_dlg.tcl:129
-#, tcl-format
-msgid "Tool '%s' already exists."
-msgstr "Вспомогательная операция «%s» уже существует."
+#: lib/database.tcl:83
+msgid "Verifying the object database with fsck-objects"
+msgstr "Проверка базы объектов при помощи fsck"
 
-#: lib/tools_dlg.tcl:151
+#: lib/database.tcl:107
 #, tcl-format
 msgid ""
-"Could not add tool:\n"
-"%s"
-msgstr "Ошибка добавления программы:\n%s"
+"This repository currently has approximately %i loose objects.\n"
+"\n"
+"To maintain optimal performance it is strongly recommended that you compress the database.\n"
+"\n"
+"Compress the database now?"
+msgstr "Этот репозиторий сейчас содержит примерно %i свободных объектов\n\nДля лучшей производительности рекомендуется сжать базу данных.\n\nСжать базу данных сейчас?"
 
-#: lib/tools_dlg.tcl:190
-msgid "Remove Tool"
-msgstr "Удалить программу"
+#: lib/error.tcl:20
+#, tcl-format
+msgid "%s: error"
+msgstr "%s: ошибка"
 
-#: lib/tools_dlg.tcl:196
-msgid "Remove Tool Commands"
-msgstr "Удалить команды программы"
+#: lib/error.tcl:36
+#, tcl-format
+msgid "%s: warning"
+msgstr "%s: предупреждение"
 
-#: lib/tools_dlg.tcl:200
-msgid "Remove"
-msgstr "Удалить"
+#: lib/error.tcl:80
+#, tcl-format
+msgid "%s hook failed:"
+msgstr "ошибка перехватчика %s:"
 
-#: lib/tools_dlg.tcl:236
-msgid "(Blue denotes repository-local tools)"
-msgstr "(Синим выделены программы локальные репозиторию)"
+#: lib/error.tcl:96
+msgid "You must correct the above errors before committing."
+msgstr "Перед коммитом, исправьте вышеуказанные ошибки."
 
-#: lib/tools_dlg.tcl:297
+#: lib/error.tcl:116
 #, tcl-format
-msgid "Run Command: %s"
-msgstr "Запуск команды: %s"
+msgid "%s (%s): error"
+msgstr "%s (%s): ошибка"
 
-#: lib/tools_dlg.tcl:311
-msgid "Arguments"
-msgstr "Аргументы"
+#: lib/merge.tcl:13
+msgid ""
+"Cannot merge while amending.\n"
+"\n"
+"You must finish amending this commit before starting any type of merge.\n"
+msgstr "Невозможно выполнить слияние во время исправления.\n\nЗавершите исправление данного коммита перед выполнением операции слияния.\n"
 
-#: lib/tools_dlg.tcl:348
-msgid "OK"
-msgstr "OK"
+#: lib/merge.tcl:27
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем слияние может быть сделано.\n\nЭто будет сделано сейчас автоматически.\n"
 
-#: lib/transport.tcl:7
+#: lib/merge.tcl:45
 #, tcl-format
-msgid "Fetching new changes from %s"
-msgstr "Извлечение изменений из %s "
+msgid ""
+"You are in the middle of a conflicted merge.\n"
+"\n"
+"File %s has merge conflicts.\n"
+"\n"
+"You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.\n"
+msgstr "Предыдущее слияние не завершено из-за конфликта.\n\nДля файла %s возник конфликт слияния.\n\nРазрешите конфликт, добавьте файл в индекс и закоммитьте. Только после этого можно начать следующее слияние.\n"
 
-#: lib/transport.tcl:18
+#: lib/merge.tcl:55
 #, tcl-format
-msgid "remote prune %s"
-msgstr "чистка внешнего %s"
+msgid ""
+"You are in the middle of a change.\n"
+"\n"
+"File %s is modified.\n"
+"\n"
+"You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n"
+msgstr "Вы находитесь в процессе изменений.\n\nФайл %s изменён.\n\nВы должны завершить текущий коммит перед началом слияния. В случае необходимости, это позволит прервать операцию слияния.\n"
 
-#: lib/transport.tcl:19
+#: lib/merge.tcl:108
 #, tcl-format
-msgid "Pruning tracking branches deleted from %s"
-msgstr "Чистка отслеживаемых веток, удалённых из %s"
+msgid "%s of %s"
+msgstr "%s из %s"
 
-#: lib/transport.tcl:26
+#: lib/merge.tcl:126
 #, tcl-format
-msgid "Pushing changes to %s"
-msgstr "Отправка изменений в %s "
+msgid "Merging %s and %s..."
+msgstr "Слияние %s и %s…"
+
+#: lib/merge.tcl:137
+msgid "Merge completed successfully."
+msgstr "Слияние успешно завершено."
+
+#: lib/merge.tcl:139
+msgid "Merge failed.  Conflict resolution is required."
+msgstr "Не удалось завершить слияние. Требуется разрешение конфликта."
 
-#: lib/transport.tcl:64
+#: lib/merge.tcl:156
 #, tcl-format
-msgid "Mirroring to %s"
-msgstr "Точное копирование в %s"
+msgid "%s (%s): Merge"
+msgstr "%s (%s): Слияние"
 
-#: lib/transport.tcl:82
+#: lib/merge.tcl:164
 #, tcl-format
-msgid "Pushing %s %s to %s"
-msgstr "Отправка %s %s в %s"
+msgid "Merge Into %s"
+msgstr "Слияние с %s"
 
-#: lib/transport.tcl:100
-msgid "Push Branches"
-msgstr "Отправить ветки"
+#: lib/merge.tcl:183
+msgid "Revision To Merge"
+msgstr "Версия, с которой провести слияние"
 
-#: lib/transport.tcl:114
-msgid "Source Branches"
-msgstr "Исходные ветки"
+#: lib/merge.tcl:218
+msgid ""
+"Cannot abort while amending.\n"
+"\n"
+"You must finish amending this commit.\n"
+msgstr "Невозможно прервать исправление.\n\nЗавершите текущее исправление коммита.\n"
 
-#: lib/transport.tcl:131
-msgid "Destination Repository"
-msgstr "Репозиторий назначения"
+#: lib/merge.tcl:228
+msgid ""
+"Abort merge?\n"
+"\n"
+"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with aborting the current merge?"
+msgstr "Прервать операцию слияния?\n\nПрерывание текущего слияния приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
 
-#: lib/transport.tcl:169
-msgid "Transfer Options"
-msgstr "Настройки отправки"
+#: lib/merge.tcl:234
+msgid ""
+"Reset changes?\n"
+"\n"
+"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with resetting the current changes?"
+msgstr "Сбросить изменения?\n\nСброс изменений приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
 
-#: lib/transport.tcl:171
-msgid "Force overwrite existing branch (may discard changes)"
-msgstr "Принудительно перезаписать существующую ветку (возможна потеря изменений)"
+#: lib/merge.tcl:246
+msgid "Aborting"
+msgstr "Прерываю"
 
-#: lib/transport.tcl:175
-msgid "Use thin pack (for slow network connections)"
-msgstr "Использовать thin pack (для медленных сетевых подключений)"
+#: lib/merge.tcl:247
+msgid "files reset"
+msgstr "изменения в файлах отменены"
 
-#: lib/transport.tcl:179
-msgid "Include tags"
-msgstr "Передать метки"
+#: lib/merge.tcl:277
+msgid "Abort failed."
+msgstr "Прервать не удалось."
+
+#: lib/merge.tcl:279
+msgid "Abort completed.  Ready."
+msgstr "Прервано."
-- 
2.24.0.windows.2


^ permalink raw reply related	[relevance 1%]

* [PATCH v4 10/19] unpack-trees: add basic support for parallel checkout
  @ 2020-11-04 20:33  2% ` Matheus Tavares
  2020-12-06 11:36  0%   ` Christian Couder
  0 siblings, 1 reply; 200+ results
From: Matheus Tavares @ 2020-11-04 20:33 UTC (permalink / raw)
  To: git; +Cc: gitster, git, chriscool, peff, newren, jrnieder, martin.agren

This new interface allows us to enqueue some of the entries being
checked out to later call write_entry() for them in parallel. For now,
the parallel checkout machinery is enabled by default and there is no
user configuration, but run_parallel_checkout() just writes the queued
entries in sequence (without spawning additional workers). The next
patch will actually implement the parallelism and, later, we will make
it configurable.

When there are path collisions among the entries being written (which
can happen e.g. with case-sensitive files in case-insensitive file
systems), the parallel checkout code detects the problem and marks the
item with PC_ITEM_COLLIDED. Later, these items are sequentially fed to
checkout_entry() again. This is similar to the way the sequential code
deals with collisions, overwriting the previously checked out entries
with the subsequent ones. The only difference is that, when we start
writing the entries in parallel, we won't be able to determine which of
the colliding entries will survive on disk (for the sequential
algorithm, it is always the last one).

I also experimented with the idea of not overwriting colliding entries,
and it seemed to work well in my simple tests. However, because just one
entry of each colliding group would be actually written, the others
would have null lstat() fields on the index. This might not be a problem
by itself, but it could cause performance penalties for subsequent
commands that need to refresh the index: when the st_size value cached
is 0, read-cache.c:ie_modified() will go to the filesystem to see if the
contents match. As mentioned in the function:

    * Immediately after read-tree or update-index --cacheinfo,
    * the length field is zero, as we have never even read the
    * lstat(2) information once, and we cannot trust DATA_CHANGED
    * returned by ie_match_stat() which in turn was returned by
    * ce_match_stat_basic() to signal that the filesize of the
    * blob changed.  We have to actually go to the filesystem to
    * see if the contents match, and if so, should answer "unchanged".

So, if we have N entries in a colliding group and we decide to write and
lstat() only one of them, every subsequent git-status will have to read,
convert, and hash the written file N - 1 times, to check that the N - 1
unwritten entries are dirty. By checking out all colliding entries (like
the sequential code does), we only pay the overhead once.

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 Makefile            |   1 +
 entry.c             |  17 ++-
 parallel-checkout.c | 362 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  27 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 410 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index 1fb0ec1705..10ee5e709b 100644
--- a/Makefile
+++ b/Makefile
@@ -945,6 +945,7 @@ 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
diff --git a/entry.c b/entry.c
index 9d79a5671f..6676954431 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout creates the files in no particular
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..fd871b09d3
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,362 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items;
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout;
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; i++) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have it's stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error(_("parallel checkout finished with pending entries"));
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of %s", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file %s", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *new_blob;
+	unsigned long size;
+	size_t newsize = 0;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	new_blob = read_blob_entry(pc_item->ce, &size);
+	if (!new_blob)
+		return error("unable to read sha1 file of %s (%s)", path,
+			     oid_to_hex(&pc_item->ce->oid));
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 new_blob, size, &buf, NULL);
+
+	if (ret) {
+		free(new_blob);
+		new_blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, new_blob, size);
+	free(new_blob);
+	if (wrote < 0)
+		return error("unable to write file %s", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+	const char *dir_sep;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	dir_sep = find_last_dir_sep(path.buf);
+
+	/*
+	 * The leading dirs should have been already created by now. But, in
+	 * case of path collisions, one of the dirs could have been replaced by
+	 * a symlink (checked out after we enqueued this entry for parallel
+	 * checkout). Thus, we must check the leading dirs again.
+	 */
+	if (dir_sep && !has_dirs_only_path(path.buf, dir_sep - path.buf,
+					   state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but the above has_dirs_only_path()
+			 * call should have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file %s", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file %s", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file %s",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	/*
+	 * No need to check close() return. At this point, either fd is already
+	 * closed, or we are on an error path, that has already been reported.
+	 */
+	close_and_clear(&fd);
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; i++)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..e6d6fc01ea
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,27 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not enabled or if the entry is
+ * not eligible for parallel checkout. Otherwise, enqueue the entry for later
+ * write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index a511fadd89..1b1da7485a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -438,7 +439,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -461,6 +461,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -474,6 +477,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.28.0


^ permalink raw reply related	[relevance 2%]

* Re: [PATCH v3 10/19] unpack-trees: add basic support for parallel checkout
  2020-10-29  2:14  2% ` [PATCH v3 10/19] unpack-trees: add basic support for parallel checkout Matheus Tavares
@ 2020-11-02 19:35  0%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2020-11-02 19:35 UTC (permalink / raw)
  To: Matheus Tavares; +Cc: git, git, chriscool, peff, newren, jrnieder, martin.agren

Matheus Tavares <matheus.bernardino@usp.br> writes:

> This new interface allows us to enqueue some of the entries being
> checked out to later call write_entry() for them in parallel. For now,
> the parallel checkout machinery is enabled by default and there is no
> user configuration, but run_parallel_checkout() just writes the queued
> entries in sequence (without spawning additional workers).

In other words, this would show the worst case overhead caused by
the framework to allow parallel checkout, relative to the current
code.  Which is quite a sensible and separate step to have in the
series.  I like it.

> The next
> patch will actually implement the parallelism and, later, we will make
> it configurable.

OK.

> When there are path collisions among the entries being written (which
> can happen e.g. with case-sensitive files in case-insensitive file
> systems), the parallel checkout code detects the problem and marks the
> item with PC_ITEM_COLLIDED. Later, these items are sequentially fed to
> checkout_entry() again. This is similar to the way the sequential code
> deals with collisions, overwriting the previously checked out entries
> with the subsequent ones. The only difference is that, when we start
> writing the entries in parallel, we won't be able to determine which of
> the colliding entries will survive on disk (for the sequential
> algorithm, it is always the last one).

Sure.  "The last one" determinism does not buy us very much, but it
is prudent to keep such a behavioural difference in mind.

> I also experimented with the idea of not overwriting colliding entries,
> and it seemed to work well in my simple tests. However, because just one
> entry of each colliding group would be actually written, the others
> would have null lstat() fields on the index. This might not be a problem
> by itself, but it could cause performance penalties for subsequent
> commands that need to refresh the index: when the st_size value cached
> is 0, read-cache.c:ie_modified() will go to the filesystem to see if the
> contents match. As mentioned in the function:
>
>     * Immediately after read-tree or update-index --cacheinfo,
>     * the length field is zero, as we have never even read the
>     * lstat(2) information once, and we cannot trust DATA_CHANGED
>     * returned by ie_match_stat() which in turn was returned by
>     * ce_match_stat_basic() to signal that the filesize of the
>     * blob changed.  We have to actually go to the filesystem to
>     * see if the contents match, and if so, should answer "unchanged".
>
> So, if we have N entries in a colliding group and we decide to write and
> lstat() only one of them, every subsequent git-status will have to read,
> convert, and hash the written file N - 1 times, to check that the N - 1
> unwritten entries are dirty. By checking out all colliding entries (like
> the sequential code does), we only pay the overhead once.

And the cost is to writing them out N times is not free, either, I
presume?

But I do not see the point of wasting engineering effort by trying
to make it more efficient to create a corrupt working tree that is
unusable because some paths that ought to exist are missing, so I
think it is OK.

> Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
> Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
> ---
>  Makefile            |   1 +
>  entry.c             |  17 +-
>  parallel-checkout.c | 368 ++++++++++++++++++++++++++++++++++++++++++++
>  parallel-checkout.h |  27 ++++
>  unpack-trees.c      |   6 +-
>  5 files changed, 416 insertions(+), 3 deletions(-)
>  create mode 100644 parallel-checkout.c
>  create mode 100644 parallel-checkout.h
>
> diff --git a/Makefile b/Makefile
> index 1fb0ec1705..10ee5e709b 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -945,6 +945,7 @@ 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
> diff --git a/entry.c b/entry.c
> index 9d79a5671f..6676954431 100644
> --- a/entry.c
> +++ b/entry.c
> @@ -7,6 +7,7 @@
>  #include "progress.h"
>  #include "fsmonitor.h"
>  #include "entry.h"
> +#include "parallel-checkout.h"
>  
>  static void create_directories(const char *path, int path_len,
>  			       const struct checkout *state)
> @@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
>  	for (i = 0; i < state->istate->cache_nr; i++) {
>  		struct cache_entry *dup = state->istate->cache[i];
>  
> -		if (dup == ce)
> -			break;
> +		if (dup == ce) {
> +			/*
> +			 * Parallel checkout creates the files in no particular
> +			 * order. So the other side of the collision may appear
> +			 * after the given cache_entry in the array.
> +			 */
> +			if (parallel_checkout_status() == PC_RUNNING)
> +				continue;
> +			else
> +				break;
> +		}
>  
>  		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
>  			continue;
> @@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
>  		ca = &ca_buf;
>  	}
>  
> +	if (!enqueue_checkout(ce, ca))
> +		return 0;
> +
>  	return write_entry(ce, path.buf, ca, state, 0);

It it is not wrong but feels strange that paths that cannot be
handled by parallel codepath for whatever reason are written using
the fallback code, but the fallback actually touches the disk before
the queued paths for parallel writeout ;-) What's the reason why
some paths cannot be handled by the new codepath again?  Also, can a
path that is handled by the fallback code collide with other paths
that are handled by the parallel codepath, and what happens for
these paths?

>  }
>  
> diff --git a/parallel-checkout.c b/parallel-checkout.c
> new file mode 100644
> index 0000000000..981dbe6ff3
> --- /dev/null
> +++ b/parallel-checkout.c
> @@ -0,0 +1,368 @@
> +#include "cache.h"
> +#include "entry.h"
> +#include "parallel-checkout.h"
> +#include "streaming.h"
> +
> +enum pc_item_status {
> +	PC_ITEM_PENDING = 0,
> +	PC_ITEM_WRITTEN,
> +	/*
> +	 * The entry could not be written because there was another file
> +	 * already present in its path or leading directories. Since
> +	 * checkout_entry_ca() removes such files from the working tree before
> +	 * enqueueing the entry for parallel checkout, it means that there was
> +	 * a path collision among the entries being written.
> +	 */
> +	PC_ITEM_COLLIDED,
> +	PC_ITEM_FAILED,
> +};
> +
> +struct parallel_checkout_item {
> +	/* pointer to a istate->cache[] entry. Not owned by us. */
> +	struct cache_entry *ce;
> +	struct conv_attrs ca;
> +	struct stat st;
> +	enum pc_item_status status;
> +};
> +
> +struct parallel_checkout {
> +	enum pc_status status;
> +	struct parallel_checkout_item *items;
> +	size_t nr, alloc;
> +};
> +
> +static struct parallel_checkout parallel_checkout = { 0 };

Can't we let this handled by BSS by not explicitly giving an initial
value?

> +enum pc_status parallel_checkout_status(void)
> +{
> +	return parallel_checkout.status;
> +}
> +
> +void init_parallel_checkout(void)
> +{
> +	if (parallel_checkout.status != PC_UNINITIALIZED)
> +		BUG("parallel checkout already initialized");
> +
> +	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
> +}
> +
> +static void finish_parallel_checkout(void)
> +{
> +	if (parallel_checkout.status == PC_UNINITIALIZED)
> +		BUG("cannot finish parallel checkout: not initialized yet");
> +
> +	free(parallel_checkout.items);
> +	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
> +}
> +
> +static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
> +					     const struct conv_attrs *ca)
> +{
> +	enum conv_attrs_classification c;
> +
> +	if (!S_ISREG(ce->ce_mode))
> +		return 0;
> +
> +	c = classify_conv_attrs(ca);
> +	switch (c) {
> +	case CA_CLASS_INCORE:
> +		return 1;
> +
> +	case CA_CLASS_INCORE_FILTER:
> +		/*
> +		 * It would be safe to allow concurrent instances of
> +		 * single-file smudge filters, like rot13, but we should not
> +		 * assume that all filters are parallel-process safe. So we
> +		 * don't allow this.
> +		 */
> +		return 0;
> +
> +	case CA_CLASS_INCORE_PROCESS:
> +		/*
> +		 * The parallel queue and the delayed queue are not compatible,
> +		 * so they must be kept completely separated. And we can't tell
> +		 * if a long-running process will delay its response without
> +		 * actually asking it to perform the filtering. Therefore, this
> +		 * type of filter is not allowed in parallel checkout.
> +		 *
> +		 * Furthermore, there should only be one instance of the
> +		 * long-running process filter as we don't know how it is
> +		 * managing its own concurrency. So, spreading the entries that
> +		 * requisite such a filter among the parallel workers would
> +		 * require a lot more inter-process communication. We would
> +		 * probably have to designate a single process to interact with
> +		 * the filter and send all the necessary data to it, for each
> +		 * entry.
> +		 */
> +		return 0;
> +
> +	case CA_CLASS_STREAMABLE:
> +		return 1;
> +
> +	default:
> +		BUG("unsupported conv_attrs classification '%d'", c);
> +	}
> +}

OK, the comments fairly clearly explain the reason for each case.
Good.

> +static int handle_results(struct checkout *state)
> +{
> +	int ret = 0;
> +	size_t i;
> +	int have_pending = 0;
> +
> +	/*
> +	 * We first update the successfully written entries with the collected
> +	 * stat() data, so that they can be found by mark_colliding_entries(),
> +	 * in the next loop, when necessary.
> +	 */
> +	for (i = 0; i < parallel_checkout.nr; ++i) {

We encourage post_increment++ when there is no particular reason to
do otherwise in this codebase (I won't repeat in the remainder of
this review).

> +static int reset_fd(int fd, const char *path)
> +{
> +	if (lseek(fd, 0, SEEK_SET) != 0)
> +		return error_errno("failed to rewind descriptor of %s", path);
> +	if (ftruncate(fd, 0))
> +		return error_errno("failed to truncate file %s", path);
> +	return 0;
> +}

This is in the error codepath when streaming fails, and we'll later
attempt the normal "read object in-core, write it out" codepath, but
is it enough to just ftruncate() it?  I am wondering why it is OK
not to unlink() the failed one---is it the caller who is responsible
for opening the file descriptor to write to, and at the layer of the
caller of this helper there is no way to re-open it, or something
like that?

	... /me looks ahead and it seems the answer is "yes".

> +static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
> +			       const char *path)
> ...
> +	if (filter) {
> +		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
> +			/* On error, reset fd to try writing without streaming */
> +			if (reset_fd(fd, path))
> +				return -1;
> +		} else {
> +			return 0;
> +		}
> +	}
> +
> +	new_blob = read_blob_entry(pc_item->ce, &size);
> ...
> +	wrote = write_in_full(fd, new_blob, size);

> +static int check_leading_dirs(const char *path, int len, int prefix_len)
> +{
> +	const char *slash = path + len;
> +
> +	while (slash > path && *slash != '/')
> +		slash--;

It is kind of surprising that we do not give us an easy-to-use
helper to find the separtor between dirname and basename.  If there
were, we do not even need this helper function with an unclear name
(i.e. "check" does not mean much to those who are trying to
understand the caller---"leading directories are checked for
what???" will be their question).

Perhaps create or find such a helper to remove this function and use
has_dirs_only_path() directly in the caller?

> +	return has_dirs_only_path(path, slash - path, prefix_len);
> +}

> +static void write_pc_item(struct parallel_checkout_item *pc_item,
> +			  struct checkout *state)
> +{
> +	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
> +	int fd = -1, fstat_done = 0;
> +	struct strbuf path = STRBUF_INIT;
> +
> +	strbuf_add(&path, state->base_dir, state->base_dir_len);
> +	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
> +
> +	/*
> +	 * At this point, leading dirs should have already been created. But if
> +	 * a symlink being checked out has collided with one of the dirs, due to
> +	 * file system folding rules, it's possible that the dirs are no longer

Is "file system folding rule" clear to readers of the code after
this patch lands?  It isn't at least to me.

> +	 * present. So we have to check again, and report any path collisions.
> +	 */
> +	if (!check_leading_dirs(path.buf, path.len, state->base_dir_len)) {
> +		pc_item->status = PC_ITEM_COLLIDED;
> +		goto out;
> +	}

Thanks.

^ permalink raw reply	[relevance 0%]

* [PATCH v3 10/19] unpack-trees: add basic support for parallel checkout
  @ 2020-10-29  2:14  2% ` Matheus Tavares
  2020-11-02 19:35  0%   ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Matheus Tavares @ 2020-10-29  2:14 UTC (permalink / raw)
  To: git; +Cc: gitster, git, chriscool, peff, newren, jrnieder, martin.agren

This new interface allows us to enqueue some of the entries being
checked out to later call write_entry() for them in parallel. For now,
the parallel checkout machinery is enabled by default and there is no
user configuration, but run_parallel_checkout() just writes the queued
entries in sequence (without spawning additional workers). The next
patch will actually implement the parallelism and, later, we will make
it configurable.

When there are path collisions among the entries being written (which
can happen e.g. with case-sensitive files in case-insensitive file
systems), the parallel checkout code detects the problem and marks the
item with PC_ITEM_COLLIDED. Later, these items are sequentially fed to
checkout_entry() again. This is similar to the way the sequential code
deals with collisions, overwriting the previously checked out entries
with the subsequent ones. The only difference is that, when we start
writing the entries in parallel, we won't be able to determine which of
the colliding entries will survive on disk (for the sequential
algorithm, it is always the last one).

I also experimented with the idea of not overwriting colliding entries,
and it seemed to work well in my simple tests. However, because just one
entry of each colliding group would be actually written, the others
would have null lstat() fields on the index. This might not be a problem
by itself, but it could cause performance penalties for subsequent
commands that need to refresh the index: when the st_size value cached
is 0, read-cache.c:ie_modified() will go to the filesystem to see if the
contents match. As mentioned in the function:

    * Immediately after read-tree or update-index --cacheinfo,
    * the length field is zero, as we have never even read the
    * lstat(2) information once, and we cannot trust DATA_CHANGED
    * returned by ie_match_stat() which in turn was returned by
    * ce_match_stat_basic() to signal that the filesize of the
    * blob changed.  We have to actually go to the filesystem to
    * see if the contents match, and if so, should answer "unchanged".

So, if we have N entries in a colliding group and we decide to write and
lstat() only one of them, every subsequent git-status will have to read,
convert, and hash the written file N - 1 times, to check that the N - 1
unwritten entries are dirty. By checking out all colliding entries (like
the sequential code does), we only pay the overhead once.

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 Makefile            |   1 +
 entry.c             |  17 +-
 parallel-checkout.c | 368 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  27 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 416 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index 1fb0ec1705..10ee5e709b 100644
--- a/Makefile
+++ b/Makefile
@@ -945,6 +945,7 @@ 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
diff --git a/entry.c b/entry.c
index 9d79a5671f..6676954431 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout creates the files in no particular
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..981dbe6ff3
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,368 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items;
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout = { 0 };
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; ++i) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; ++i) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have it's stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error(_("parallel checkout finished with pending entries"));
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of %s", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file %s", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *new_blob;
+	unsigned long size;
+	size_t newsize = 0;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	new_blob = read_blob_entry(pc_item->ce, &size);
+	if (!new_blob)
+		return error("unable to read sha1 file of %s (%s)", path,
+			     oid_to_hex(&pc_item->ce->oid));
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 new_blob, size, &buf, NULL);
+
+	if (ret) {
+		free(new_blob);
+		new_blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, new_blob, size);
+	free(new_blob);
+	if (wrote < 0)
+		return error("unable to write file %s", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static int check_leading_dirs(const char *path, int len, int prefix_len)
+{
+	const char *slash = path + len;
+
+	while (slash > path && *slash != '/')
+		slash--;
+
+	return has_dirs_only_path(path, slash - path, prefix_len);
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	/*
+	 * At this point, leading dirs should have already been created. But if
+	 * a symlink being checked out has collided with one of the dirs, due to
+	 * file system folding rules, it's possible that the dirs are no longer
+	 * present. So we have to check again, and report any path collisions.
+	 */
+	if (!check_leading_dirs(path.buf, path.len, state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but check_leading_dirs() should
+			 * have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file %s", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file %s", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file %s",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	/*
+	 * No need to check close() return. At this point, either fd is already
+	 * closed, or we are on an error path, that has already been reported.
+	 */
+	close_and_clear(&fd);
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; ++i)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..e6d6fc01ea
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,27 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not enabled or if the entry is
+ * not eligible for parallel checkout. Otherwise, enqueue the entry for later
+ * write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index a511fadd89..1b1da7485a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -438,7 +439,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -461,6 +461,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -474,6 +477,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.28.0


^ permalink raw reply related	[relevance 2%]

* [PATCH v2 10/19] unpack-trees: add basic support for parallel checkout
  @ 2020-09-22 22:49  2% ` Matheus Tavares
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares @ 2020-09-22 22:49 UTC (permalink / raw)
  To: git; +Cc: jeffhost, chriscool, peff, t.gummerer, newren

This new interface allows us to enqueue some of the entries being
checked out to later call write_entry() for them in parallel. For now,
the parallel checkout machinery is enabled by default and there is no
user configuration, but run_parallel_checkout() just writes the queued
entries in sequence (without spawning additional workers). The next
patch will actually implement the parallelism and, later, we will make
it configurable.

When there are path collisions among the entries being written (which
can happen e.g. with case-sensitive files in case-insensitive file
systems), the parallel checkout code detects the problem and marks the
item with PC_ITEM_COLLIDED. Later, these items are sequentially fed to
checkout_entry() again. This is similar to the way the sequential code
deals with collisions, overwriting the previously checked out entries
with the subsequent ones. The only difference is that, when we start
writing the entries in parallel, we won't be able to determine which of
the colliding entries will survive on disk (for the sequential
algorithm, it is always the last one).

I also experimented with the idea of not overwriting colliding entries,
and it seemed to work well in my simple tests. However, because just one
entry of each colliding group would be actually written, the others
would have null lstat() fields on the index. This might not be a problem
by itself, but it could cause performance penalties for subsequent
commands that need to refresh the index: when the st_size value cached
is 0, read-cache.c:ie_modified() will go to the filesystem to see if the
contents match. As mentioned in the function:

    * Immediately after read-tree or update-index --cacheinfo,
    * the length field is zero, as we have never even read the
    * lstat(2) information once, and we cannot trust DATA_CHANGED
    * returned by ie_match_stat() which in turn was returned by
    * ce_match_stat_basic() to signal that the filesize of the
    * blob changed.  We have to actually go to the filesystem to
    * see if the contents match, and if so, should answer "unchanged".

So, if we have N entries in a colliding group and we decide to write and
lstat() only one of them, every subsequent git-status will have to read,
convert, and hash the written file N - 1 times, to check that the N - 1
unwritten entries are dirty. By checking out all colliding entries (like
the sequential code does), we only pay the overhead once.

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---

Note: currently, we have to check leading directories again before
writing each parallel-eligible entry, as explained in the respective
code comment. But I plan to remove this extra work on part II,
postponing the checkout of symlinks to *after* the parallel-eligible
entries.

 Makefile            |   1 +
 entry.c             |  17 +-
 parallel-checkout.c | 368 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  27 ++++
 unpack-trees.c      |   6 +-
 5 files changed, 416 insertions(+), 3 deletions(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index f1b1bc8aa0..3edcdc534c 100644
--- a/Makefile
+++ b/Makefile
@@ -932,6 +932,7 @@ 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
diff --git a/entry.c b/entry.c
index 9d79a5671f..6676954431 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
 	for (i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
-		if (dup == ce)
-			break;
+		if (dup == ce) {
+			/*
+			 * Parallel checkout creates the files in no particular
+			 * order. So the other side of the collision may appear
+			 * after the given cache_entry in the array.
+			 */
+			if (parallel_checkout_status() == PC_RUNNING)
+				continue;
+			else
+				break;
+		}
 
 		if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
 			continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..7dc8ab2a67
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,368 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum pc_item_status {
+	PC_ITEM_PENDING = 0,
+	PC_ITEM_WRITTEN,
+	/*
+	 * The entry could not be written because there was another file
+	 * already present in its path or leading directories. Since
+	 * checkout_entry_ca() removes such files from the working tree before
+	 * enqueueing the entry for parallel checkout, it means that there was
+	 * a path collision among the entries being written.
+	 */
+	PC_ITEM_COLLIDED,
+	PC_ITEM_FAILED,
+};
+
+struct parallel_checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum pc_item_status status;
+};
+
+struct parallel_checkout {
+	enum pc_status status;
+	struct parallel_checkout_item *items;
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout parallel_checkout = { 0 };
+
+enum pc_status parallel_checkout_status(void)
+{
+	return parallel_checkout.status;
+}
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout.status != PC_UNINITIALIZED)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout.status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (parallel_checkout.status == PC_UNINITIALIZED)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout.items);
+	memset(&parallel_checkout, 0, sizeof(parallel_checkout));
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct parallel_checkout_item *pc_item;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout.items, parallel_checkout.nr + 1,
+		   parallel_checkout.alloc);
+
+	pc_item = &parallel_checkout.items[parallel_checkout.nr++];
+	pc_item->ce = ce;
+	memcpy(&pc_item->ca, ca, sizeof(pc_item->ca));
+	pc_item->status = PC_ITEM_PENDING;
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+	int have_pending = 0;
+
+	/*
+	 * We first update the successfully written entries with the collected
+	 * stat() data, so that they can be found by mark_colliding_entries(),
+	 * in the next loop, when necessary.
+	 */
+	for (i = 0; i < parallel_checkout.nr; ++i) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+		if (pc_item->status == PC_ITEM_WRITTEN)
+			update_ce_after_write(state, pc_item->ce, &pc_item->st);
+	}
+
+	for (i = 0; i < parallel_checkout.nr; ++i) {
+		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
+
+		switch(pc_item->status) {
+		case PC_ITEM_WRITTEN:
+			/* Already handled */
+			break;
+		case PC_ITEM_COLLIDED:
+			/*
+			 * The entry could not be checked out due to a path
+			 * collision with another entry. Since there can only
+			 * be one entry of each colliding group on the disk, we
+			 * could skip trying to check out this one and move on.
+			 * However, this would leave the unwritten entries with
+			 * null stat() fields on the index, which could
+			 * potentially slow down subsequent operations that
+			 * require refreshing it: git would not be able to
+			 * trust st_size and would have to go to the filesystem
+			 * to see if the contents match (see ie_modified()).
+			 *
+			 * Instead, let's pay the overhead only once, now, and
+			 * call checkout_entry_ca() again for this file, to
+			 * have it's stat() data stored in the index. This also
+			 * has the benefit of adding this entry and its
+			 * colliding pair to the collision report message.
+			 * Additionally, this overwriting behavior is consistent
+			 * with what the sequential checkout does, so it doesn't
+			 * add any extra overhead.
+			 */
+			ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
+						 state, NULL, NULL);
+			break;
+		case PC_ITEM_PENDING:
+			have_pending = 1;
+			/* fall through */
+		case PC_ITEM_FAILED:
+			ret = -1;
+			break;
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	if (have_pending)
+		error(_("parallel checkout finished with pending entries"));
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of %s", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file %s", path);
+	return 0;
+}
+
+static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
+			       const char *path, struct checkout *state)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *new_blob;
+	unsigned long size;
+	size_t newsize = 0;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(pc_item->ce, &pc_item->ca));
+
+	filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	new_blob = read_blob_entry(pc_item->ce, &size);
+	if (!new_blob)
+		return error("unable to read sha1 file of %s (%s)", path,
+			     oid_to_hex(&pc_item->ce->oid));
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&pc_item->ca, pc_item->ce->name,
+					 new_blob, size, &buf, NULL);
+
+	if (ret) {
+		free(new_blob);
+		new_blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, new_blob, size);
+	free(new_blob);
+	if (wrote < 0)
+		return error("unable to write file %s", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static int check_leading_dirs(const char *path, int len, int prefix_len)
+{
+	const char *slash = path + len;
+
+	while (slash > path && *slash != '/')
+		slash--;
+
+	return has_dirs_only_path(path, slash - path, prefix_len);
+}
+
+static void write_pc_item(struct parallel_checkout_item *pc_item,
+			  struct checkout *state)
+{
+	unsigned int mode = (pc_item->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, pc_item->ce->name, pc_item->ce->ce_namelen);
+
+	/*
+	 * At this point, leading dirs should have already been created. But if
+	 * a symlink being checked out has collided with one of the dirs, due to
+	 * file system folding rules, it's possible that the dirs are no longer
+	 * present. So we have to check again, and report any path collisions.
+	 */
+	if (!check_leading_dirs(path.buf, path.len, state->base_dir_len)) {
+		pc_item->status = PC_ITEM_COLLIDED;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the item to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but check_leading_dirs() should
+			 * have already caught these cases.
+			 */
+			pc_item->status = PC_ITEM_COLLIDED;
+		} else {
+			error_errno("failed to open file %s", path.buf);
+			pc_item->status = PC_ITEM_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_pc_item_to_fd(pc_item, fd, path.buf, state)) {
+		/* Error was already reported. */
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &pc_item->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file %s", path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &pc_item->st) < 0) {
+		error_errno("unable to stat just-written file %s",  path.buf);
+		pc_item->status = PC_ITEM_FAILED;
+		goto out;
+	}
+
+	pc_item->status = PC_ITEM_WRITTEN;
+
+out:
+	/*
+	 * No need to check close() return. At this point, either fd is already
+	 * closed, or we are on an error path, that has already been reported.
+	 */
+	close_and_clear(&fd);
+	strbuf_release(&path);
+}
+
+static void write_items_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout.nr; ++i)
+		write_pc_item(&parallel_checkout.items[i], state);
+}
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (parallel_checkout.status != PC_ACCEPTING_ENTRIES)
+		BUG("cannot run parallel checkout: uninitialized or already running");
+
+	parallel_checkout.status = PC_RUNNING;
+
+	write_items_sequentially(state);
+	ret = handle_results(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..e6d6fc01ea
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,27 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+};
+
+enum pc_status parallel_checkout_status(void);
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not enabled or if the entry is
+ * not eligible for parallel checkout. Otherwise, enqueue the entry for later
+ * write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index a511fadd89..1b1da7485a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -438,7 +439,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -461,6 +461,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -474,6 +477,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.28.0


^ permalink raw reply related	[relevance 2%]

* Re: Repo state broken due to mismatched file name casing during merge
  @ 2020-09-02 23:23  5% ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2020-09-02 23:23 UTC (permalink / raw)
  To: Rafał Grzybowski; +Cc: git

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

On 2020-09-02 at 16:26:27, Rafał Grzybowski wrote:
> What did you do before the bug happened? (Steps to reproduce your issue)
> 
> mkdir repo
> cd repo
> 
> git init
> 
> "sample file" > file.txt
> git add file.txt
> git commit -m "Added file.txt"
> 
> 
> git checkout -b other_branch
> echo other file > other_file.txt
> git add other_file.txt
> git commit -m "Added other_file.txt"
> 
> git checkout master
> echo Other file > Other_file.txt
> git add Other_file.txt
> git commit -m "Added Other_file.txt"
> 
> git merge other_branch
> git status
> 
> What did you expect to happen? (Expected behavior)
> 
> A clean state, no unstaged changes.
> 
> What happened instead? (Actual behavior)
> 
> There is always an unstaged file other_file.txt which case changes if
> I try to discard and the unstaged change stays.
> If I try to delete the file, I get two unstaged file removal changes.

Git always preserves the case of files internally.  However, the default
configuration on Windows does not.  When you performed this merge, you
ended up with two files, but it's not possible to write both of them
into the working tree.  Since they are not the same, when Git checks the
status of one of the files, it finds it to be modified.

The solution here is to do "git rm --cached Other_file.txt" followed by
a commit.  That removes the file from the index but doesn't touch the
working tree.  In Windows 10, you can also set a directory to be case
sensitive, which should fix this if you do a "git checkout .".

This isn't a bug in Git; Git doesn't know about file name encodings, and
even if it only handled Unicode file names, it's impossible to correctly
perform locale-insensitive case folding, so Git doesn't even try.
-- 
brian m. carlson: Houston, Texas, US

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

^ permalink raw reply	[relevance 5%]

* Re: Files 'Test.txt' and 'test.txt' are different in Git database, but are the same on Windows file system issue
  @ 2020-08-12 23:02  7%     ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2020-08-12 23:02 UTC (permalink / raw)
  To: Viktor Hozhyi; +Cc: git@vger.kernel.org

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

On 2020-08-12 at 19:58:55, Viktor Hozhyi wrote:
> On Wed, Aug 12, 2020 at 10:56 PM Viktor <viktor.hozhyi@gmail.com> wrote:
> >
> > Hi,
> >
> >
> >
> > I’m not sure whether this behavior is on Windows only, so it’s up to you guys.

This behavior happens on any case-insensitive file system.  That means
on Windows when the directory is not marked case-sensitive, on macOS if
the file system is case-insensitive, and also in some other scenarios
(e.g., case-insensitive JFS on Linux).

Both Windows 10 and macOS are capable of using case-sensitive file
systems or directories, so this is not exclusive to any one operating
system.

> > Repro steps:
> >
> > 1.         Having branch (let say) develop with empty working tree and empty repository – create 2 more branches (‘foo’ and ‘bar’)
> >
> > 2.         Commit file ‘Test.txt’ with content ‘Test’ to ‘foo’ branch
> >
> > 3.         Switch to ‘bar’  branch and commit file ‘test.txt’ with content ‘test’ (pay attention lower-case)
> >
> > 4.         Merge ‘foo’ to develop
> >
> > 5.         Merge ‘bar’ to develop
> >
> > After it when you switch to develop – you always will have ‘local changes’. You can perform stash, hard reset, commit – you always will have local changes (and many following errors on other git operations due to local changes).
> >
> > Reason – we have different files in Git DB (‘Test.txt’ and ‘test.txt’), but when git restores them onto Windows file system – it just will rewrite 1 file with another, because for Windows file system – it is 2 equal names.

Git was designed for Unix systems where files are case sensitive.  This
is the only behavior that produces correct results for all languages and
locales; it's impossible to correctly do locale-insensitive case
folding.  That Git is case sensitive is very much by design.

If you're seeing this problem, you can do something like this:

  git mv --cached Test.txt test.txt

For a directory, you'd need to do this:

  git mv Test temp
  git mv temp test

That will move Test.txt into test.txt, which will solve your problem by
creating exactly one file.  If you prefer, you can do it the other way
as well.

That's the only possible solution if you're using a case-insensitive
file system; the other choice is to use the Windows 10 tools to make the
repository and its child directories case sensitive.
-- 
brian m. carlson: Houston, Texas, US

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

^ permalink raw reply	[relevance 7%]

* [RFC PATCH 10/21] unpack-trees: add basic support for parallel checkout
  @ 2020-08-10 21:33  2% ` Matheus Tavares
  0 siblings, 0 replies; 200+ results
From: Matheus Tavares @ 2020-08-10 21:33 UTC (permalink / raw)
  To: git
  Cc: stolee, jeffhost, Nguyễn Thái Ngọc Duy,
	Jonathan Tan, René Scharfe, Christian Couder, Stefan Beller,
	Junio C Hamano, Lars Schneider

This new interface allows us to enqueue some of the entries being
checked out to later call write_entry() for them in parallel. For now,
the parallel checkout machinery is enabled by default and there is no
user configuration, but run_parallel_checkout() just writes the queued
entries in sequence (without spawning additional workers). The next
patch will actually implement the parallelism and, later, we will make
it configurable.

When there are path collisions among the entries being written (which
can happen e.g. with case-sensitive files in case-insensitive file
systems), the parallel checkout code detects the problem and mark the
checkout_item with CI_RETRY. Later, these items are sequentially feed to
checkout_entry() again. This is similar to the way the sequential code
deals with collisions, overwriting the previously checked out entries
with the subsequent ones. The only difference is that, once we start
writing the entries in parallel, we will no longer be able to determine
which of the colliding entries will survive on disk (for the sequential
algorithm, it is always the last one). Finally, just like the sequential
code, there is no additional overhead when there are no collisions.

Note: we continue the loop of write_checkout_item() even if the previous
call returned an error. This is how checkout_entry() is called in
builtin/checkout.c:checkout_paths() and unpack-trees.c:check-updates().
In the case of fatal errors, die() aborts the loop.

Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---

For consistency, the parallel code replicates the sequential behavior of
overwriting colliding entries. However, during parallel checkout it's
possible to distinguish a path collision from the case where a path was
already present in the working tree before checkout. So, in the event of
a collision, we could chose to write a single entry and skip overwriting
it with the next ones. Does that sounds reasonable, or are there other
problems in not writing the extra colliding entries?

 Makefile            |   1 +
 entry.c             |   4 +
 parallel-checkout.c | 340 ++++++++++++++++++++++++++++++++++++++++++++
 parallel-checkout.h |  20 +++
 unpack-trees.c      |   6 +-
 5 files changed, 370 insertions(+), 1 deletion(-)
 create mode 100644 parallel-checkout.c
 create mode 100644 parallel-checkout.h

diff --git a/Makefile b/Makefile
index 65f8cfb236..caab8e6401 100644
--- a/Makefile
+++ b/Makefile
@@ -933,6 +933,7 @@ 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
diff --git a/entry.c b/entry.c
index f9835afba3..47c2c20d5a 100644
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -538,6 +539,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
 		ca = &ca_buf;
 	}
 
+	if (!enqueue_checkout(ce, ca))
+		return 0;
+
 	return write_entry(ce, path.buf, ca, state, 0);
 }
 
diff --git a/parallel-checkout.c b/parallel-checkout.c
new file mode 100644
index 0000000000..e3b44eeb34
--- /dev/null
+++ b/parallel-checkout.c
@@ -0,0 +1,340 @@
+#include "cache.h"
+#include "entry.h"
+#include "parallel-checkout.h"
+#include "streaming.h"
+
+enum ci_status {
+	CI_PENDING = 0,
+	CI_SUCCESS,
+	CI_RETRY,
+	CI_FAILED,
+};
+
+struct checkout_item {
+	/* pointer to a istate->cache[] entry. Not owned by us. */
+	struct cache_entry *ce;
+	struct conv_attrs ca;
+	struct stat st;
+	enum ci_status status;
+};
+
+struct parallel_checkout {
+	struct checkout_item *items;
+	size_t nr, alloc;
+};
+
+static struct parallel_checkout *parallel_checkout = NULL;
+
+enum pc_status {
+	PC_UNINITIALIZED = 0,
+	PC_ACCEPTING_ENTRIES,
+	PC_RUNNING,
+	PC_HANDLING_RESULTS,
+};
+
+static enum pc_status pc_status = PC_UNINITIALIZED;
+
+void init_parallel_checkout(void)
+{
+	if (parallel_checkout)
+		BUG("parallel checkout already initialized");
+
+	parallel_checkout = xcalloc(1, sizeof(*parallel_checkout));
+	pc_status = PC_ACCEPTING_ENTRIES;
+}
+
+static void finish_parallel_checkout(void)
+{
+	if (!parallel_checkout)
+		BUG("cannot finish parallel checkout: not initialized yet");
+
+	free(parallel_checkout->items);
+	FREE_AND_NULL(parallel_checkout);
+	pc_status = PC_UNINITIALIZED;
+}
+
+static int is_eligible_for_parallel_checkout(const struct cache_entry *ce,
+					     const struct conv_attrs *ca)
+{
+	enum conv_attrs_classification c;
+
+	if (!S_ISREG(ce->ce_mode))
+		return 0;
+
+	c = classify_conv_attrs(ca);
+	switch (c) {
+	case CA_CLASS_INCORE:
+		return 1;
+
+	case CA_CLASS_INCORE_FILTER:
+		/*
+		 * It would be safe to allow concurrent instances of
+		 * single-file smudge filters, like rot13, but we should not
+		 * assume that all filters are parallel-process safe. So we
+		 * don't allow this.
+		 */
+		return 0;
+
+	case CA_CLASS_INCORE_PROCESS:
+		/*
+		 * The parallel queue and the delayed queue are not compatible,
+		 * so they must be kept completely separated. And we can't tell
+		 * if a long-running process will delay its response without
+		 * actually asking it to perform the filtering. Therefore, this
+		 * type of filter is not allowed in parallel checkout.
+		 *
+		 * Furthermore, there should only be one instance of the
+		 * long-running process filter as we don't know how it is
+		 * managing its own concurrency. So, spreading the entries that
+		 * requisite such a filter among the parallel workers would
+		 * require a lot more inter-process communication. We would
+		 * probably have to designate a single process to interact with
+		 * the filter and send all the necessary data to it, for each
+		 * entry.
+		 */
+		return 0;
+
+	case CA_CLASS_STREAMABLE:
+		return 1;
+
+	default:
+		BUG("unsupported conv_attrs classification '%d'", c);
+	}
+}
+
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
+{
+	struct checkout_item *ci;
+
+	if (!parallel_checkout || pc_status != PC_ACCEPTING_ENTRIES ||
+	    !is_eligible_for_parallel_checkout(ce, ca))
+		return -1;
+
+	ALLOC_GROW(parallel_checkout->items, parallel_checkout->nr + 1,
+		   parallel_checkout->alloc);
+
+	ci = &parallel_checkout->items[parallel_checkout->nr++];
+	ci->ce = ce;
+	memcpy(&ci->ca, ca, sizeof(ci->ca));
+
+	return 0;
+}
+
+static int handle_results(struct checkout *state)
+{
+	int ret = 0;
+	size_t i;
+
+	pc_status = PC_HANDLING_RESULTS;
+
+	for (i = 0; i < parallel_checkout->nr; ++i) {
+		struct checkout_item *ci = &parallel_checkout->items[i];
+		struct stat *st = &ci->st;
+
+		switch(ci->status) {
+		case CI_SUCCESS:
+			update_ce_after_write(state, ci->ce, st);
+			break;
+		case CI_RETRY:
+			/*
+			 * The fails for which we set CI_RETRY are the ones
+			 * that might have been caused by a path collision. So
+			 * we let checkout_entry_ca() retry writing, as it will
+			 * properly handle collisions and the creation of
+			 * leading dirs in the entry's path.
+			 */
+			ret |= checkout_entry_ca(ci->ce, &ci->ca, state, NULL, NULL);
+			break;
+		case CI_FAILED:
+			ret = -1;
+			break;
+		case CI_PENDING:
+			BUG("parallel checkout finished with pending entries");
+		default:
+			BUG("unknown checkout item status in parallel checkout");
+		}
+	}
+
+	return ret;
+}
+
+static int reset_fd(int fd, const char *path)
+{
+	if (lseek(fd, 0, SEEK_SET) != 0)
+		return error_errno("failed to rewind descriptor of %s", path);
+	if (ftruncate(fd, 0))
+		return error_errno("failed to truncate file %s", path);
+	return 0;
+}
+
+static int write_checkout_item_to_fd(int fd, struct checkout *state,
+				     struct checkout_item *ci, const char *path)
+{
+	int ret;
+	struct stream_filter *filter;
+	struct strbuf buf = STRBUF_INIT;
+	char *new_blob;
+	unsigned long size;
+	size_t newsize = 0;
+	ssize_t wrote;
+
+	/* Sanity check */
+	assert(is_eligible_for_parallel_checkout(ci->ce, &ci->ca));
+
+	filter = get_stream_filter_ca(&ci->ca, &ci->ce->oid);
+	if (filter) {
+		if (stream_blob_to_fd(fd, &ci->ce->oid, filter, 1)) {
+			/* On error, reset fd to try writing without streaming */
+			if (reset_fd(fd, path))
+				return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	new_blob = read_blob_entry(ci->ce, &size);
+	if (!new_blob)
+		return error("unable to read sha1 file of %s (%s)", path,
+			     oid_to_hex(&ci->ce->oid));
+
+	/*
+	 * checkout metadata is used to give context for external process
+	 * filters. Files requiring such filters are not eligible for parallel
+	 * checkout, so pass NULL.
+	 */
+	ret = convert_to_working_tree_ca(&ci->ca, ci->ce->name, new_blob, size,
+					 &buf, NULL);
+
+	if (ret) {
+		free(new_blob);
+		new_blob = strbuf_detach(&buf, &newsize);
+		size = newsize;
+	}
+
+	wrote = write_in_full(fd, new_blob, size);
+	free(new_blob);
+	if (wrote < 0)
+		return error("unable to write file %s", path);
+
+	return 0;
+}
+
+static int close_and_clear(int *fd)
+{
+	int ret = 0;
+
+	if (*fd >= 0) {
+		ret = close(*fd);
+		*fd = -1;
+	}
+
+	return ret;
+}
+
+static int check_leading_dirs(const char *path, int len, int prefix_len)
+{
+	const char *slash = path + len;
+
+	while (slash > path && *slash != '/')
+		slash--;
+
+	return has_dirs_only_path(path, slash - path, prefix_len);
+}
+
+static void write_checkout_item(struct checkout *state, struct checkout_item *ci)
+{
+	unsigned int mode = (ci->ce->ce_mode & 0100) ? 0777 : 0666;
+	int fd = -1, fstat_done = 0;
+	struct strbuf path = STRBUF_INIT;
+
+	strbuf_add(&path, state->base_dir, state->base_dir_len);
+	strbuf_add(&path, ci->ce->name, ce_namelen(ci->ce));
+
+	/*
+	 * At this point, leading dirs should have already been created. But if
+	 * a symlink being checked out has collided with one of the dirs, due to
+	 * file system folding rules, it's possible that the dirs are no longer
+	 * present. So we have to check again, and report any path collisions.
+	 */
+	if (!check_leading_dirs(path.buf, path.len, state->base_dir_len)) {
+		ci->status = CI_RETRY;
+		goto out;
+	}
+
+	fd = open(path.buf, O_WRONLY | O_CREAT | O_EXCL, mode);
+
+	if (fd < 0) {
+		if (errno == EEXIST || errno == EISDIR) {
+			/*
+			 * Errors which probably represent a path collision.
+			 * Suppress the error message and mark the ci to be
+			 * retried later, sequentially. ENOTDIR and ENOENT are
+			 * also interesting, but check_leading_dirs() should
+			 * have already caught these cases.
+			 */
+			ci->status = CI_RETRY;
+		} else {
+			error_errno("failed to open file %s", path.buf);
+			ci->status = CI_FAILED;
+		}
+		goto out;
+	}
+
+	if (write_checkout_item_to_fd(fd, state, ci, path.buf)) {
+		/* Error was already reported. */
+		ci->status = CI_FAILED;
+		goto out;
+	}
+
+	fstat_done = fstat_checkout_output(fd, state, &ci->st);
+
+	if (close_and_clear(&fd)) {
+		error_errno("unable to close file %s", path.buf);
+		ci->status = CI_FAILED;
+		goto out;
+	}
+
+	if (state->refresh_cache && !fstat_done && lstat(path.buf, &ci->st) < 0) {
+		error_errno("unable to stat just-written file %s",  path.buf);
+		ci->status = CI_FAILED;
+		goto out;
+	}
+
+	ci->status = CI_SUCCESS;
+
+out:
+	/*
+	 * No need to check close() return. At this point, either fd is already
+	 * closed, or we are on an error path, that has already been reported.
+	 */
+	close_and_clear(&fd);
+	strbuf_release(&path);
+}
+
+static int run_checkout_sequentially(struct checkout *state)
+{
+	size_t i;
+
+	for (i = 0; i < parallel_checkout->nr; ++i) {
+		struct checkout_item *ci = &parallel_checkout->items[i];
+		write_checkout_item(state, ci);
+	}
+
+	return handle_results(state);
+}
+
+
+int run_parallel_checkout(struct checkout *state)
+{
+	int ret;
+
+	if (!parallel_checkout)
+		BUG("cannot run parallel checkout: not initialized yet");
+
+	pc_status = PC_RUNNING;
+
+	ret = run_checkout_sequentially(state);
+
+	finish_parallel_checkout();
+	return ret;
+}
diff --git a/parallel-checkout.h b/parallel-checkout.h
new file mode 100644
index 0000000000..8eef59ffcd
--- /dev/null
+++ b/parallel-checkout.h
@@ -0,0 +1,20 @@
+#ifndef PARALLEL_CHECKOUT_H
+#define PARALLEL_CHECKOUT_H
+
+struct cache_entry;
+struct checkout;
+struct conv_attrs;
+
+void init_parallel_checkout(void);
+
+/*
+ * Return -1 if parallel checkout is currently not enabled or if the entry is
+ * not eligible for parallel checkout. Otherwise, enqueue the entry for later
+ * write and return 0.
+ */
+int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
+
+/* Write all the queued entries, returning 0 on success.*/
+int run_parallel_checkout(struct checkout *state);
+
+#endif /* PARALLEL_CHECKOUT_H */
diff --git a/unpack-trees.c b/unpack-trees.c
index a511fadd89..1b1da7485a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -17,6 +17,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -438,7 +439,6 @@ static int check_updates(struct unpack_trees_options *o,
 	if (should_update_submodules())
 		load_gitmodules_file(index, &state);
 
-	enable_delayed_checkout(&state);
 	if (has_promisor_remote()) {
 		/*
 		 * Prefetch the objects that are to be checked out in the loop
@@ -461,6 +461,9 @@ static int check_updates(struct unpack_trees_options *o,
 					   to_fetch.oid, to_fetch.nr);
 		oid_array_clear(&to_fetch);
 	}
+
+	enable_delayed_checkout(&state);
+	init_parallel_checkout();
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
@@ -474,6 +477,7 @@ static int check_updates(struct unpack_trees_options *o,
 		}
 	}
 	stop_progress(&progress);
+	errs |= run_parallel_checkout(&state);
 	errs |= finish_delayed_checkout(&state, NULL);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
-- 
2.27.0


^ permalink raw reply related	[relevance 2%]

* Re: BUG FOLLOWUP: Case insensitivity in worktrees
  2020-07-24 18:14  4%     ` Casey Meijer
@ 2020-07-24 21:09  7%       ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2020-07-24 21:09 UTC (permalink / raw)
  To: Casey Meijer; +Cc: git@vger.kernel.org

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

On 2020-07-24 at 18:14:03, Casey Meijer wrote:
> I think I misunderstood your claim actually Brian.   What is a bug is
> asking for worktree A's head and getting the main worktree's head. A
> super dangerous bug.
> 
> I certainly disagree with your assertion that asking for head and not
> getting HEAD (or HeaD or hEAd) on a case-insensitive storage engine
> isn't a bug and it certainly shouldn't be a bug once extensible
> storage engines are in place: the storage engine should have final say
> on how objects are stored and retrieved, not git-core.

If you want to refer to HEAD, writing it "head" is always wrong.  "head"
is not a special ref to Git, and on a case-sensitive system, I am fully
entitled to create a branch, tag, or other ref with that name that is
independent from HEAD.

It's wrong because regardless of operating system, you don't
intrinsically know whether the repository is case sensitive.  Windows 10
permits case-sensitive directories and macOS has case-sensitive file
systems, so you cannot assume that "head" and "HEAD" are the same
without knowing the setting of "core.ignorecase" and the properties of
the file system.

So when you write "head", you are not asking for HEAD in any worktree or
repository at all.

We are fully aware that Git cannot consistently store refs differing in
case on case-insensitive file systems, and we agree that's a bug.
Reftable will fix that, and as I mentioned, it is being worked on.  It
is not, however, a deficiency that refs are intrinsically case
sensitive, and let me explain why.

First, Git does not require that refs are in any particular encoding.
Specifically, they need not be in Unicode or UTF-8.  It is valid to have
many characters in a ref name, including 0xff.  That means any type of
case folding is not possible, since a ref need not correspond to actual
text.

Second, even if we did require them to be UTF-8, it is impossible to
consistently fold case in a way that works for all locales.  Turkish and
other Turkic languages have a dotted I and a dotless I[0].  The ASCII
uppercase I would fold to a dotless lowercase I for Turkish and to the
ASCII (dotted) lowercase I for English.  Similarly, the ASCII lowercase
I is dotted, and folds to a dotted uppercase I in Turkish and an ASCII
(dotless) uppercase I in English.

It is literally not possible to correctly perform case-folding in a
locale-independent way.  Every attempt to do so will get at least this
case wrong (not to mention other cases that occur), and Turkic languages
are spoken by 200 million people, so ignoring their needs is not only
harmful, but also impacts a massive number of people.  That major OS
designers have made this mistake doesn't mean that we should as well.

We wouldn't perform ASCII-only case folding for all of the reasons
mentioned above and because it's Anglocentric.  As someone who speaks
both Spanish and French, I would find that unsuitable and the results
bizarre.

So I understand that you may expect that on Windows or macOS that you
can write "head" and get HEAD and be surprised when that doesn't work in
all cases.  But that is not, and never has been, expected to work, nor
is it a bug that it doesn't.

[0] https://en.wikipedia.org/wiki/Dotted_and_dotless_I
-- 
brian m. carlson: Houston, Texas, US

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

^ permalink raw reply	[relevance 7%]

* Re: BUG FOLLOWUP: Case insensitivity in worktrees
  2020-07-24  1:19  0%   ` brian m. carlson
  @ 2020-07-24 18:14  4%     ` Casey Meijer
  2020-07-24 21:09  7%       ` brian m. carlson
  1 sibling, 1 reply; 200+ results
From: Casey Meijer @ 2020-07-24 18:14 UTC (permalink / raw)
  To: brian m. carlson; +Cc: git@vger.kernel.org

I think I misunderstood your claim actually Brian.   What is a bug is asking for worktree A's head and getting the main worktree's head. A super dangerous bug. 

I certainly disagree with your assertion that asking for head and not getting HEAD (or HeaD or hEAd) on a case-insensitive storage engine isn't a bug and it certainly 
shouldn't be a bug once extensible storage engines are in place: the storage engine should have final say on how objects are stored and retrieved, not git-core. 

Best,

Casey

On 2020-07-23, 10:19 PM, "brian m. carlson" <sandals@crustytoothpaste.net> wrote:

    On 2020-07-23 at 15:20:50, Casey Meijer wrote:
    > This just bit me; it seems quite old, and I wanted to propose an alternative solution (maybe it doesn’t work for some reason I’m unaware of):
    > https://marc.info/?l=git&m=154473525401677&w=2
    >  
    > Why not just preserve the existing semantics of the main worktree by checking the worktree refs first unconditionally and only fall back to the main refs when the ref doesn’t exist locally in the worktree?
    >  
    > This would have the added benefit of allowing power users to override refs in their worktrees and would, if I’m not mistaken, preserve the semantics of the main worktree in case-insensitive and case-sensitive filesystems.

    It isn't clear to me exactly what you're suggesting.  Are you suggesting
    that we allow "head" instead of "HEAD" in worktrees, or that we allow
    refs in general to be case insensitive, or something else?

    > Anywho, just a thought.  I could work on a patch if this approach makes sense at least as an intermediary until there’s a pluggable storage backend for non-FS stores 😉   (I'd also be somewhat interested in implementing a postgres/sql storage backend if this project is moving forwards __ ).

    There is a proposal for a ref storage backend called "reftable" which
    will not store the ref names in the file system, and work is being done
    on it.  There has been a suggestion for an SQLite store in the past, but
    that causes problems for certain implementations, such as JGit, which do
    not want to have C bindings.
    -- 
    brian m. carlson: Houston, Texas, US


^ permalink raw reply	[relevance 4%]

* Re: BUG FOLLOWUP: Case insensitivity in worktrees
  @ 2020-07-24 18:07  5%       ` Casey Meijer
  0 siblings, 0 replies; 200+ results
From: Casey Meijer @ 2020-07-24 18:07 UTC (permalink / raw)
  To: Junio C Hamano, brian m. carlson; +Cc: git@vger.kernel.org

It's definitely a bug and it's kind of amazing that it's been floating about for 2 years.  
I'm not suggesting anything really change except the way you determine whether a ref is "work-tree local" or not. 
This way on case sensitive filesystems only HEAD will be accepted, and on case insensitive filesystems both head and HEAD
will be valid (and will refer to the same file/ref), replicating the semantics of the primary worktree. 

Namely, instead of checking explicitly for "HEAD" (or going through some hoops to determine if the filesystem  
*is* case sensitive), just look in the worktree refs.  If it's in there, then it's worktree local.  If not, then not. 

Like I said, maybe there are some problems with this approach that I'm not aware of, but if so, I think it's worth thinking 
about whether those problems are resolvable 😊 

As far as alternate storage engines,  I'd be more interested in seeing core git builtout to support a plugable storage engine than any specific implementation.
Take a look at PostgreSQL's work on Table Access Methods for an example in this vein.  I think this idea plays well with my proposal above as well because it 
delegates the responsibility of case sensitivity to the storage backend (in this case, the filesystem).  


Best,

Casey

On 2020-07-23, 10:25 PM, "Junio C Hamano" <gitster@pobox.com> wrote:

    "brian m. carlson" <sandals@crustytoothpaste.net> writes:

    > It isn't clear to me exactly what you're suggesting.  Are you suggesting
    > that we allow "head" instead of "HEAD" in worktrees, or that we allow
    > refs in general to be case insensitive, or something else?

    > There is a proposal for a ref storage backend called "reftable" which
    > will not store the ref names in the file system, and work is being done
    > on it.  There has been a suggestion for an SQLite store in the past, but
    > that causes problems for certain implementations, such as JGit, which do
    > not want to have C bindings.

    Yes, another important thing to point out is that one shared goal of
    these efforts is so that users, even those on case insensitive
    filesystems, can name their refs foo and FOO and have the system
    treat these as two distinct refs.  IOW, wanting to enhance "support"
    for case insensitive treatment of refs will not fly---asking for
    "head" and getting contents of "HEAD" on certain platforms is a bug,
    induced by limited filesystem these platforms use, and it is being
    fixed.

    Thanks.



^ permalink raw reply	[relevance 5%]

* Re: BUG FOLLOWUP: Case insensitivity in worktrees
  2020-07-23 15:20  5% ` BUG FOLLOWUP: Case insensitivity in worktrees Casey Meijer
@ 2020-07-24  1:19  0%   ` brian m. carlson
    2020-07-24 18:14  4%     ` Casey Meijer
  0 siblings, 2 replies; 200+ results
From: brian m. carlson @ 2020-07-24  1:19 UTC (permalink / raw)
  To: Casey Meijer; +Cc: git@vger.kernel.org

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

On 2020-07-23 at 15:20:50, Casey Meijer wrote:
> This just bit me; it seems quite old, and I wanted to propose an alternative solution (maybe it doesn’t work for some reason I’m unaware of):
> https://marc.info/?l=git&m=154473525401677&w=2
>  
> Why not just preserve the existing semantics of the main worktree by checking the worktree refs first unconditionally and only fall back to the main refs when the ref doesn’t exist locally in the worktree?
>  
> This would have the added benefit of allowing power users to override refs in their worktrees and would, if I’m not mistaken, preserve the semantics of the main worktree in case-insensitive and case-sensitive filesystems.

It isn't clear to me exactly what you're suggesting.  Are you suggesting
that we allow "head" instead of "HEAD" in worktrees, or that we allow
refs in general to be case insensitive, or something else?

> Anywho, just a thought.  I could work on a patch if this approach makes sense at least as an intermediary until there’s a pluggable storage backend for non-FS stores 😉   (I'd also be somewhat interested in implementing a postgres/sql storage backend if this project is moving forwards __ ).

There is a proposal for a ref storage backend called "reftable" which
will not store the ref names in the file system, and work is being done
on it.  There has been a suggestion for an SQLite store in the past, but
that causes problems for certain implementations, such as JGit, which do
not want to have C bindings.
-- 
brian m. carlson: Houston, Texas, US

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

^ permalink raw reply	[relevance 0%]

* Re: BUG FOLLOWUP: Case insensitivity in worktrees
       [not found]     <EEA65ED1-2BE0-41AD-84CC-780A9F4D9215@strongestfamilies.com>
@ 2020-07-23 15:20  5% ` Casey Meijer
  2020-07-24  1:19  0%   ` brian m. carlson
  0 siblings, 1 reply; 200+ results
From: Casey Meijer @ 2020-07-23 15:20 UTC (permalink / raw)
  To: git@vger.kernel.org

This just bit me; it seems quite old, and I wanted to propose an alternative solution (maybe it doesn’t work for some reason I’m unaware of):
https://marc.info/?l=git&m=154473525401677&w=2
 
Why not just preserve the existing semantics of the main worktree by checking the worktree refs first unconditionally and only fall back to the main refs when the ref doesn’t exist locally in the worktree?
 
This would have the added benefit of allowing power users to override refs in their worktrees and would, if I’m not mistaken, preserve the semantics of the main worktree in case-insensitive and case-sensitive filesystems. 
 
Anywho, just a thought.  I could work on a patch if this approach makes sense at least as an intermediary until there’s a pluggable storage backend for non-FS stores 😉   (I'd also be somewhat interested in implementing a postgres/sql storage backend if this project is moving forwards __ ).
 
 
Best,
 
Casey Meijer


^ permalink raw reply	[relevance 5%]

* Re: Commit graph chains with no corresponding files?
  @ 2020-06-30  1:51  6% ` Derrick Stolee
  2021-02-25  4:54  0%   ` Bryan Turner
  0 siblings, 1 reply; 200+ results
From: Derrick Stolee @ 2020-06-30  1:51 UTC (permalink / raw)
  To: Jonathan Tan; +Cc: git

On 6/29/2020 6:07 PM, Jonathan Tan wrote:
> At $DAYJOB, a few people have reported "warning: unable to find all
> commit-graph files" warnings. Their commit-graph-chain files have a few
> lines, but they only have one commit graph file with very few commits. I
> suspected something happening during fetch, because (as far as I know) a
> fetch may cause an incremental commit graph to be written, but I ran a
> fetch on a large repository myself and didn't run into this problem.
> 
> Has anyone ran into this problem before, and know how to reproduce?

The incremental commit-graph code deletes any commit-graph files
that do not appear in the chain. I believe this is done by comparing
the contents of the ".git/objects/info/commit-graphs/" directory to
the contents of the chain file.

These appear to be case-sensitive, full-path comparisons.

It is _possible_ that something like a case switch or a symlink
could be causing a problem here. That's where I would look on
the affected systems.

Likely the full-path comparison in expire_commit_graphs() should
be dropped in favor of local filename comparisons. A case-
sensitive match is less likely to be important here since Git
is writing the paths itself and should get the proper case back
from the directory listing.

Thanks,
-Stolee


^ permalink raw reply	[relevance 6%]

* [PATCH] http: redact all cookies, teach GIT_TRACE_REDACT=0
@ 2020-06-05 21:21  4% Jonathan Tan
  0 siblings, 0 replies; 200+ results
From: Jonathan Tan @ 2020-06-05 21:21 UTC (permalink / raw)
  To: git; +Cc: Jonathan Tan, gitster, peff, sandals

In trace output (when GIT_TRACE_CURL is true), redact the values of all
HTTP cookies by default. Now that auth headers (since the implementation
of GIT_TRACE_CURL in 74c682d3c6 ("http.c: implement the GIT_TRACE_CURL
environment variable", 2016-05-24)) and cookie values (since this
commit) are redacted by default in these traces, also allow the user to
inhibit these redactions through an environment variable.

Since values of all cookies are now redacted by default,
GIT_REDACT_COOKIES (which previously allowed users to select individual
cookies to redact) now has no effect.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
---
This is on jt/curl-verbose-on-trace-curl.

Thanks, Junio, for the reminder in What's Cooking.

This is a followup from this email thread:
https://lore.kernel.org/git/cover.1589218693.git.jonathantanmy@google.com/

I took a look at transport_anonymize_url() as requested in [1], which
indeed appears in user-visible output (and could conceivably be used in
debugging). It can be done (just be careful about the different uses -
send-pack uses it to make a push cert, so that can't be changed, but we
can change it when it is used to print a message for the user). But it
doesn't seem useful to me (for HTTP(S), we would be better off looking
at the Authorization header, I think, and for SSH, the password is
either wrong or correct, so I don't think that there is much Git-related
stuff to debug), and I can't think of a good name to give the
environment variable that controls all these. (Right now we have
GIT_TRACE_REDACT, which makes sense because we are redacting a trace.
GIT_HTTP_REDACT would work too, because everything we're redacting is
HTTP-related. But the URL is neither HTTP-specific nor trace-specific.)

Having said that, if we want one single environment variable to redact
everything, it's probably best to do it now. It would be unexpected if
an environment variable suddenly also controls redaction of the URL.

[1] https://lore.kernel.org/git/xmqqlflvtysu.fsf@gitster.c.googlers.com/
---
 Documentation/git.txt       |  9 ++++-----
 http.c                      | 35 +++++++++++-----------------------
 t/t5551-http-fetch-smart.sh | 38 +++++++++++++++++++++++--------------
 3 files changed, 39 insertions(+), 43 deletions(-)

diff --git a/Documentation/git.txt b/Documentation/git.txt
index 427ea70701..d451f465dc 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -775,11 +775,10 @@ for full details.
 	See `GIT_TRACE2` for available trace output options and
 	link:technical/api-trace2.html[Trace2 documentation] for full details.
 
-`GIT_REDACT_COOKIES`::
-	This can be set to a comma-separated list of strings. When a curl trace
-	is enabled (see `GIT_TRACE_CURL` above), whenever a "Cookies:" header
-	sent by the client is dumped, values of cookies whose key is in that
-	list (case-sensitive) are redacted.
+`GIT_TRACE_REDACT`::
+	By default, when tracing is activated, Git redacts the values of
+	cookies, the "Authorization:" header, and the "Proxy-Authorization:"
+	header. Set this variable to `0` to prevent this redaction.
 
 `GIT_LITERAL_PATHSPECS`::
 	Setting this variable to `1` will cause Git to treat all
diff --git a/http.c b/http.c
index 4882c9f5b2..0eb1931a15 100644
--- a/http.c
+++ b/http.c
@@ -18,7 +18,7 @@
 
 static struct trace_key trace_curl = TRACE_KEY_INIT(CURL);
 static int trace_curl_data = 1;
-static struct string_list cookies_to_redact = STRING_LIST_INIT_DUP;
+static int trace_curl_redact = 1;
 #if LIBCURL_VERSION_NUM >= 0x070a08
 long int git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER;
 #else
@@ -642,8 +642,9 @@ static void redact_sensitive_header(struct strbuf *header)
 {
 	const char *sensitive_header;
 
-	if (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
-	    skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header)) {
+	if (trace_curl_redact &&
+	    (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
+	     skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header))) {
 		/* The first token is the type, which is OK to log */
 		while (isspace(*sensitive_header))
 			sensitive_header++;
@@ -652,20 +653,15 @@ static void redact_sensitive_header(struct strbuf *header)
 		/* Everything else is opaque and possibly sensitive */
 		strbuf_setlen(header,  sensitive_header - header->buf);
 		strbuf_addstr(header, " <redacted>");
-	} else if (cookies_to_redact.nr &&
+	} else if (trace_curl_redact &&
 		   skip_prefix(header->buf, "Cookie:", &sensitive_header)) {
 		struct strbuf redacted_header = STRBUF_INIT;
-		char *cookie;
+		const char *cookie;
 
 		while (isspace(*sensitive_header))
 			sensitive_header++;
 
-		/*
-		 * The contents of header starting from sensitive_header will
-		 * subsequently be overridden, so it is fine to mutate this
-		 * string (hence the assignment to "char *").
-		 */
-		cookie = (char *) sensitive_header;
+		cookie = sensitive_header;
 
 		while (cookie) {
 			char *equals;
@@ -678,14 +674,8 @@ static void redact_sensitive_header(struct strbuf *header)
 				strbuf_addstr(&redacted_header, cookie);
 				continue;
 			}
-			*equals = 0; /* temporarily set to NUL for lookup */
-			if (string_list_lookup(&cookies_to_redact, cookie)) {
-				strbuf_addstr(&redacted_header, cookie);
-				strbuf_addstr(&redacted_header, "=<redacted>");
-			} else {
-				*equals = '=';
-				strbuf_addstr(&redacted_header, cookie);
-			}
+			strbuf_add(&redacted_header, cookie, equals - cookie);
+			strbuf_addstr(&redacted_header, "=<redacted>");
 			if (semicolon) {
 				/*
 				 * There are more cookies. (Or, for some
@@ -1003,11 +993,8 @@ static CURL *get_curl_handle(void)
 	setup_curl_trace(result);
 	if (getenv("GIT_TRACE_CURL_NO_DATA"))
 		trace_curl_data = 0;
-	if (getenv("GIT_REDACT_COOKIES")) {
-		string_list_split(&cookies_to_redact,
-				  getenv("GIT_REDACT_COOKIES"), ',', -1);
-		string_list_sort(&cookies_to_redact);
-	}
+	if (!git_env_bool("GIT_TRACE_REDACT", 1))
+		trace_curl_redact = 0;
 
 	curl_easy_setopt(result, CURLOPT_USERAGENT,
 		user_agent ? user_agent : git_user_agent());
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index be01cf7bb2..e40e9ed52f 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -209,6 +209,16 @@ test_expect_success 'GIT_CURL_VERBOSE redacts auth details' '
 	grep "Authorization: Basic <redacted>" trace
 '
 
+test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_REDACT=0' '
+	rm -rf redact-auth trace &&
+	set_askpass user@host pass@host &&
+	GIT_TRACE_REDACT=0 GIT_TRACE_CURL="$(pwd)/trace" \
+		git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
+	expect_askpass both user@host &&
+
+	grep "Authorization: Basic [0-9a-zA-Z+/]" trace
+'
+
 test_expect_success 'disable dumb http on server' '
 	git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
 		config http.getanyfile false
@@ -454,37 +464,37 @@ test_expect_success 'fetch by SHA-1 without tag following' '
 		--no-tags origin $(cat bar_hash)
 '
 
-test_expect_success 'GIT_REDACT_COOKIES redacts cookies' '
+test_expect_success 'cookies are redacted by default' '
 	rm -rf clone &&
 	echo "Set-Cookie: Foo=1" >cookies &&
 	echo "Set-Cookie: Bar=2" >>cookies &&
-	GIT_TRACE_CURL=true GIT_REDACT_COOKIES=Bar,Baz \
+	GIT_TRACE_CURL=true \
 		git -c "http.cookieFile=$(pwd)/cookies" clone \
 		$HTTPD_URL/smart/repo.git clone 2>err &&
-	grep "Cookie:.*Foo=1" err &&
+	grep "Cookie:.*Foo=<redacted>" err &&
 	grep "Cookie:.*Bar=<redacted>" err &&
+	! grep "Cookie:.*Foo=1" err &&
 	! grep "Cookie:.*Bar=2" err
 '
 
-test_expect_success 'GIT_REDACT_COOKIES redacts cookies when GIT_CURL_VERBOSE=1' '
+test_expect_success 'empty values of cookies are also redacted' '
 	rm -rf clone &&
-	echo "Set-Cookie: Foo=1" >cookies &&
-	echo "Set-Cookie: Bar=2" >>cookies &&
-	GIT_CURL_VERBOSE=1 GIT_REDACT_COOKIES=Bar,Baz \
+	echo "Set-Cookie: Foo=" >cookies &&
+	GIT_TRACE_CURL=true \
 		git -c "http.cookieFile=$(pwd)/cookies" clone \
 		$HTTPD_URL/smart/repo.git clone 2>err &&
-	grep "Cookie:.*Foo=1" err &&
-	grep "Cookie:.*Bar=<redacted>" err &&
-	! grep "Cookie:.*Bar=2" err
+	grep "Cookie:.*Foo=<redacted>" err
 '
 
-test_expect_success 'GIT_REDACT_COOKIES handles empty values' '
+test_expect_success 'GIT_TRACE_REDACT=0 disables cookie redaction' '
 	rm -rf clone &&
-	echo "Set-Cookie: Foo=" >cookies &&
-	GIT_TRACE_CURL=true GIT_REDACT_COOKIES=Foo \
+	echo "Set-Cookie: Foo=1" >cookies &&
+	echo "Set-Cookie: Bar=2" >>cookies &&
+	GIT_TRACE_REDACT=0 GIT_TRACE_CURL=true \
 		git -c "http.cookieFile=$(pwd)/cookies" clone \
 		$HTTPD_URL/smart/repo.git clone 2>err &&
-	grep "Cookie:.*Foo=<redacted>" err
+	grep "Cookie:.*Foo=1" err &&
+	grep "Cookie:.*Bar=2" err
 '
 
 test_expect_success 'GIT_TRACE_CURL_NO_DATA prevents data from being traced' '
-- 
2.27.0.278.ge193c7cf3a9-goog


^ permalink raw reply related	[relevance 4%]

* Re: [PATCH v3 7/8] cmake: support for building git on windows with msvc and clang.
  2020-05-30 14:08  4%     ` Đoàn Trần Công Danh
@ 2020-05-30 19:08  0%       ` Sibi Siddharthan
  0 siblings, 0 replies; 200+ results
From: Sibi Siddharthan @ 2020-05-30 19:08 UTC (permalink / raw)
  To: Đoàn Trần Công Danh
  Cc: Sibi Siddharthan via GitGitGadget, git

On Sat, May 30, 2020 at 7:38 PM Đoàn Trần Công Danh
<congdanhqx@gmail.com> wrote:
>
> On 2020-05-29 13:40:23+0000, Sibi Siddharthan via GitGitGadget <gitgitgadget@gmail.com> wrote:
> > From: Sibi Siddharthan <sibisiddharthan.github@gmail.com>
> >
> > This patch adds support for Visual Studio and Clang builds
> >
> > The minimum required version of CMake is upgraded to 3.15 because
> > this version offers proper support for Clang builds on Windows.
> >
> > Libintl is not searched for when building with Visual Studio or Clang
> > because there is no binary compatible version available yet.
> >
> > NOTE: In the link options invalidcontinue.obj has to be included.
> > The reason for this is because by default, Windows calls abort()'s
> > instead of setting errno=EINVAL when invalid arguments are passed to
> > standard functions.
> > This commit explains it in detail:
> > 4b623d80f73528a632576990ca51e34c333d5dd6
>
> I think it's better to say:
>
>         See 4b623d80f7 (MSVC: link in invalidcontinue.obj for better
>         POSIX compatibility, 2014-03-29) for detail.
>
>
> (I haven't read the referenced commit, FWIW)
>
> > On Windows the default generator is Visual Studio,so for Visual Studio
> > builds do this:
> >
> > cmake `relative-path-to-srcdir`
> >
> > NOTE: Visual Studio generator is a multi config generator, which means
> > that Debug and Release builds can be done on the same build directory.
> >
> > For Clang builds do this:
> >
> > On bash
> > CC=Clang cmake `relative-path-to-srcdir` -G Ninja
>
> I think you meant CC=clang, note the lowercase c,
> that will cmake this note applicable for case-sensitive filesystem.
>
> ... reading this patch ...
>
> So, this is applicable for Windows only, it's fine as is, then.
> It's still better to lowercase it, though.

will change it,(typo)

>
> >               -DCMAKE_BUILD_TYPE=[Debug or Release]
> >
> > On cmd
> > set CC=Clang
> > cmake `relative-path-to-srcdir` -G Ninja
> >               -DCMAKE_BUILD_TYPE=[Debug or Release]
> >
> > Signed-off-by: Sibi Siddharthan <sibisiddharthan.github@gmail.com>
> > ---
> >  contrib/buildsystems/CMakeLists.txt | 55 +++++++++++++++++++++++------
> >  1 file changed, 45 insertions(+), 10 deletions(-)
> >
> > diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
> > index 46197d0b806..0a3f711db88 100644
> > --- a/contrib/buildsystems/CMakeLists.txt
> > +++ b/contrib/buildsystems/CMakeLists.txt
> > @@ -98,8 +98,11 @@ find_package(ZLIB REQUIRED)
> >  find_package(CURL)
> >  find_package(EXPAT)
> >  find_package(Iconv)
> > -find_package(Intl)
> >
> > +#Don't use libintl on Windows Visual Studio and Clang builds
> > +if(NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "MSVC" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")))
>
> Personally, I find this is a bit ugly.
> Does it work to move the if(WIN32) down there, here.
> Then make sub-condition for MSVC and Clang?
>
> > +     find_package(Intl)
> > +endif()
> >
> >  if(NOT Intl_FOUND)
> >       add_compile_definitions(NO_GETTEXT)
> > @@ -123,7 +126,7 @@ if(Intl_FOUND)
> >  endif()
> >
> >
> > -if(WIN32)
> > +if(WIN32 AND NOT MSVC)#not required for visual studio builds
>

Can do that.

> for the down there, I meant here.
> Using "NOT MSVC" here and `CMAKE_C_COMPILER_ID STREQUAL "MSVC"` above
> may puzzle people interest in this patch.
>
> >       find_program(WINDRES_EXE windres)
> >       if(NOT WINDRES_EXE)
> >               message(FATAL_ERROR "Install windres on Windows for resource files")
> > @@ -135,6 +138,13 @@ if(NOT MSGFMT_EXE)
> >       message(WARNING "Text Translations won't be build")
> >  endif()
> >
> > +#Force all visual studio outputs to CMAKE_BINARY_DIR
> > +if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
> > +     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR})
> > +     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR})
> > +     add_compile_options(/MP)
> > +endif()
> > +
> >  #default behaviour
> >  include_directories(${CMAKE_SOURCE_DIR})
> >  add_compile_definitions(GIT_HOST_CPU="${CMAKE_SYSTEM_PROCESSOR}")
> > @@ -172,6 +182,10 @@ endif()
> >
> >  #Platform Specific
> >  if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
>
> I missed this line from previous patch
> (and my comment in previous round, which suggested remove ${})
> Does `if(WIN32)` and `if(CMAKE_SYSTEM_NAME STREQUAL "Windows")` have
> different meanings?
> I don't know much about CMake on Windows to really sure about this.
>

They are the same.
The reason for using CMAKE_SYSTEM_NAME instead of (WIN32,UNIX,APPLE...) is that
if you specify `if(UNIX)` it means both Linux and Darwin, whereas if you specify
if(CMAKE_SYSTEM_NAME STREQUAL "Linux") it means Linux only.

Thank You,
Sibi Siddharthan

> --
> Danh

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3 7/8] cmake: support for building git on windows with msvc and clang.
  @ 2020-05-30 14:08  4%     ` Đoàn Trần Công Danh
  2020-05-30 19:08  0%       ` Sibi Siddharthan
  0 siblings, 1 reply; 200+ results
From: Đoàn Trần Công Danh @ 2020-05-30 14:08 UTC (permalink / raw)
  To: Sibi Siddharthan via GitGitGadget; +Cc: git, Sibi Siddharthan

On 2020-05-29 13:40:23+0000, Sibi Siddharthan via GitGitGadget <gitgitgadget@gmail.com> wrote:
> From: Sibi Siddharthan <sibisiddharthan.github@gmail.com>
> 
> This patch adds support for Visual Studio and Clang builds
> 
> The minimum required version of CMake is upgraded to 3.15 because
> this version offers proper support for Clang builds on Windows.
> 
> Libintl is not searched for when building with Visual Studio or Clang
> because there is no binary compatible version available yet.
> 
> NOTE: In the link options invalidcontinue.obj has to be included.
> The reason for this is because by default, Windows calls abort()'s
> instead of setting errno=EINVAL when invalid arguments are passed to
> standard functions.
> This commit explains it in detail:
> 4b623d80f73528a632576990ca51e34c333d5dd6

I think it's better to say:

	See 4b623d80f7 (MSVC: link in invalidcontinue.obj for better
	POSIX compatibility, 2014-03-29) for detail.


(I haven't read the referenced commit, FWIW)

> On Windows the default generator is Visual Studio,so for Visual Studio
> builds do this:
> 
> cmake `relative-path-to-srcdir`
> 
> NOTE: Visual Studio generator is a multi config generator, which means
> that Debug and Release builds can be done on the same build directory.
> 
> For Clang builds do this:
> 
> On bash
> CC=Clang cmake `relative-path-to-srcdir` -G Ninja

I think you meant CC=clang, note the lowercase c,
that will cmake this note applicable for case-sensitive filesystem.

... reading this patch ...

So, this is applicable for Windows only, it's fine as is, then.
It's still better to lowercase it, though.

> 		-DCMAKE_BUILD_TYPE=[Debug or Release]
> 
> On cmd
> set CC=Clang
> cmake `relative-path-to-srcdir` -G Ninja
> 		-DCMAKE_BUILD_TYPE=[Debug or Release]
> 
> Signed-off-by: Sibi Siddharthan <sibisiddharthan.github@gmail.com>
> ---
>  contrib/buildsystems/CMakeLists.txt | 55 +++++++++++++++++++++++------
>  1 file changed, 45 insertions(+), 10 deletions(-)
> 
> diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
> index 46197d0b806..0a3f711db88 100644
> --- a/contrib/buildsystems/CMakeLists.txt
> +++ b/contrib/buildsystems/CMakeLists.txt
> @@ -98,8 +98,11 @@ find_package(ZLIB REQUIRED)
>  find_package(CURL)
>  find_package(EXPAT)
>  find_package(Iconv)
> -find_package(Intl)
>  
> +#Don't use libintl on Windows Visual Studio and Clang builds
> +if(NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "MSVC" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")))

Personally, I find this is a bit ugly.
Does it work to move the if(WIN32) down there, here.
Then make sub-condition for MSVC and Clang?

> +	find_package(Intl)
> +endif()
>  
>  if(NOT Intl_FOUND)
>  	add_compile_definitions(NO_GETTEXT)
> @@ -123,7 +126,7 @@ if(Intl_FOUND)
>  endif()
>  
>  
> -if(WIN32)
> +if(WIN32 AND NOT MSVC)#not required for visual studio builds

for the down there, I meant here.
Using "NOT MSVC" here and `CMAKE_C_COMPILER_ID STREQUAL "MSVC"` above
may puzzle people interest in this patch.

>  	find_program(WINDRES_EXE windres)
>  	if(NOT WINDRES_EXE)
>  		message(FATAL_ERROR "Install windres on Windows for resource files")
> @@ -135,6 +138,13 @@ if(NOT MSGFMT_EXE)
>  	message(WARNING "Text Translations won't be build")
>  endif()
>  
> +#Force all visual studio outputs to CMAKE_BINARY_DIR
> +if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
> +	set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR})
> +	set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR})
> +	add_compile_options(/MP)
> +endif()
> +
>  #default behaviour
>  include_directories(${CMAKE_SOURCE_DIR})
>  add_compile_definitions(GIT_HOST_CPU="${CMAKE_SYSTEM_PROCESSOR}")
> @@ -172,6 +182,10 @@ endif()
>  
>  #Platform Specific
>  if(CMAKE_SYSTEM_NAME STREQUAL "Windows")

I missed this line from previous patch
(and my comment in previous round, which suggested remove ${})
Does `if(WIN32)` and `if(CMAKE_SYSTEM_NAME STREQUAL "Windows")` have
different meanings?
I don't know much about CMake on Windows to really sure about this.

-- 
Danh

^ permalink raw reply	[relevance 4%]

* Re: Git Test Coverage Report (April 30, 2020)
  @ 2020-05-01 22:08  3%   ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2020-05-01 22:08 UTC (permalink / raw)
  To: Han-Wen Nienhuys; +Cc: Derrick Stolee, Git List

Hi Han-Wen,

On Thu, 30 Apr 2020, Han-Wen Nienhuys wrote:

> On Thu, Apr 30, 2020 at 1:22 PM Derrick Stolee <stolee@gmail.com> wrote:
> >
> > Hello,
> >
> > Here is today's test coverage report.
> >
> > It appears that _all_ of the reftable code shows up in this report as
> > untested. Perhaps that is the state of the world right now, or perhaps
> > I need to initialize a GIT_TEST_ environment variable to ensure it runs?
>
> > In either way, do we have any test coverage of that massive contribution?
> > Please take a look at the online report [1] for that part of the report,
> > as I snipped it out of this email.
>
> (again in plain text)
>
> The reftable code is currently exercised in a small way by
> t0031-reftable.sh

Very small, and yet even the simple change I made had uncovered
a segmentation fault that the unit tests you refer to below had not.

Which makes me think even more than I already thought that it would have
made a lot more sense to develop the reftable library inside of git.git
instead of completely separate from it.

That would also have staved off the many, many style issues that make this
thing hard to review, not to mention the sheer size that threatens to dull
any mind pouring over the diff.

It is probably not a secret by now that these issues keep me from
reviewing the code.

I mean, I want the reftables feature to finally address the problem on
Windows where branch names are sometimes treated as case sensitive, but
then all of a sudden they are not (because of the file system backend). So
there is motivation on my side to help the patches along. Yet, the way the
patches are presented does not invite me to do so.

In a private conversation I had recently, the situation was likened to
having a neat home that you really like and take care of because you,
well, care, and therefore you ask guests to take off their shoes, but one
of the guests just ignores the local customs and walks in with their muddy
shoes, right over your white carpet.

It is a bit of a crass picture that was painted there because the
situation is not _all_ that bad. Yet... it _is_ very unenticing to have
the coding style stepped all over, as well as the convention to "tell a
story with your patches and commit messages" not exactly followed even to
the letter "d" (let alone "t").

I understand that it seemed easier to first implement a library in a
familiar language (Go) and then "port" it (where the "port" part shows by
using constructs that are uncommon in C).

However, when I think about the potential users, there really are only
two: Git and libgit2. And since libgit2 is relatively similar in origin to
Git, I don't think it was the best idea to start with an abstraction layer
over data types. It would have been a lot easier to build the code in
git.git first, test the heck out of it, and then abstract it _just_ enough
to let libgit2 essentially use a copy (just like it does with the libxdiff
code).

Speaking of testing: there is no doubt in my mind that _iff_ these patches
make it into git.git, then the vast majority of bug fixes will flow _from_
git.git. And if that is indeed the case, it makes it very, very awkward to
ask every contributor to go to _another_ project to get those fixes in
there first, and only then have them trickle back to the actual user.

In light of this, I wonder whether there is anything you could do to
change the way you develop this patch series that would make it more in
line with the code contributions the Git project enjoys? Or at least to
tell a much more elegant story arc in the patch series and abide by the
coding conventions?

I could imagine that just throwing away all that data type abstraction and
reusing what is in git.git, including all the helper functions, would go a
long way of not only simplifying the structure of the patch series to
allow for a meaningful review (in the current form, I don't think that
_any_ human could possibly verify the correctness, as the complexity and
the size is just too daunting and too overwhelming), but it would also
avoid implementing redundant functionality, which would not only reduce
the size, but would also let us rely on tried-and-tested implementation in
git.git.

Just to name an example, pretty much the entire `basics.c` could go away.

To give you a concrete data point for tried-and-tested function: the
`string_list_split()` function has a short and sweet implementation that
has not had to be fixed in more than seven years. That is quite a track
record. Using this function instead of `parse_names()` would give us the
instant benefit of relying on something we do _not_ have to review for
correctness. And there is the distinct possibility that using a
`string_list` with an explicit length (instead of throwing it away in
`parse_names()` and then painstakingly re-calculating it in
`names_length()`) might actually improve performance, too.

I firmly believe that this patch series, in particular the huge patch, can
be transformed into something that looks a lot more like git.git code, is
a lot smaller, and is a _lot_ easier to review. Without the confidence
such a reviewable shape provides, I would actually not trust it enough to
put it into the hands of end-users.

> The upstream library has unittests, see
> https://cs.bazel.build/search?q=r%3Areftable+f%3A_test.c&num=0, but I
> believe Git doesn't do unittests?

That is a misconception.

We usually implement some test helper in `t/helper/` (or a new subcommand
in one test helper) and run that as part of the test suite.

And to repeat my point above: I don't think that I would have found a
segfault _immediately_ after modifying t0031 in a rather trivial way if
this library was developed _inside_ git.git rather than outside of it,
with an incremental story accompanied by unit tests.

At the end of the day, it matters more that the reftable works in Git than
it matters that it passes the unit tests when compiled somewhere else.

> I'll try to generate a coverage report for them.
>
> You can set GIT_TEST_REFTABLE to see coverage for reftable, but I'm
> not sure how useful it is given that ~15% of the tests fail.

15%? That's a lot... I hope that that's mostly test cases that incorrectly
assume that they can access refs directly on disk, in loose format.

Ciao,
Dscho

^ permalink raw reply	[relevance 3%]

* Re: [RFC PATCH v2 0/2] configuration-based hook management
  2020-04-14 20:27  5%       ` Jeff King
@ 2020-04-15 10:01  0%         ` Phillip Wood
  0 siblings, 0 replies; 200+ results
From: Phillip Wood @ 2020-04-15 10:01 UTC (permalink / raw)
  To: Jeff King, Emily Shaffer; +Cc: phillip.wood, git, Junio C Hamano, James Ramsay

On 14/04/2020 21:27, Jeff King wrote:
> On Tue, Apr 14, 2020 at 12:24:18PM -0700, Emily Shaffer wrote:
> 
>>> Without the redirection one could have
>>>   hook.pre-commit.linter.command = my-command
>>>   hook.pre-commit.check-whitespace.command = 'git diff --check --cached'
>> [...]
>> We'd need to fudge one of these fields to include the extra section, I
>> think. Unfortunate, because I find your example very tidy, but in
>> practice maybe not very neat. The closest thing I can find to a nice way
>> of writing it might be:
>>
>>   [hook.pre-commit "linter"]
>>     command = my-command
>>     before = check-whitespace
>>   [hook.pre-commit "check-whitespace"]
>>     command = 'git diff --check --cached'
> 
> Syntactically the whole section between the outer dots is the
> subsection. So it's:
> 
>   [hook "pre-commit.check-whitespace"]
>   command = ...
> 
> And I don't think we want to change the config syntax at this point.
> Even in the neater dotted notation, we must keep that whole thing as a
> subsection, because existing subsections may contain dots, too.

Thanks for clarifying that, I agree we don't want to change the config
syntax and break existing subsections

Best Wishes

Phillip

>> But this is kind of a lie; the sections aren't "hook", "pre-commit", and
>> "linter" as you'd expect. Whether it's OK to lie like this, though, I
>> don't know - I suspect it might make it awkward for others trying to
>> parse the config. (my Vim syntax highlighter had kind of a hard time.)
> 
> I think we should avoid it if possible. There are some subtleties there,
> like the fact that subsections are case-sensitive, but sections and keys
> are not.> -Peff
> 


^ permalink raw reply	[relevance 0%]

* Re: [RFC PATCH v2 0/2] configuration-based hook management
  @ 2020-04-14 20:27  5%       ` Jeff King
  2020-04-15 10:01  0%         ` Phillip Wood
  0 siblings, 1 reply; 200+ results
From: Jeff King @ 2020-04-14 20:27 UTC (permalink / raw)
  To: Emily Shaffer; +Cc: phillip.wood, git, Junio C Hamano, James Ramsay

On Tue, Apr 14, 2020 at 12:24:18PM -0700, Emily Shaffer wrote:

> > Without the redirection one could have
> >   hook.pre-commit.linter.command = my-command
> >   hook.pre-commit.check-whitespace.command = 'git diff --check --cached'
> [...]
> We'd need to fudge one of these fields to include the extra section, I
> think. Unfortunate, because I find your example very tidy, but in
> practice maybe not very neat. The closest thing I can find to a nice way
> of writing it might be:
> 
>   [hook.pre-commit "linter"]
>     command = my-command
>     before = check-whitespace
>   [hook.pre-commit "check-whitespace"]
>     command = 'git diff --check --cached'

Syntactically the whole section between the outer dots is the
subsection. So it's:

  [hook "pre-commit.check-whitespace"]
  command = ...

And I don't think we want to change the config syntax at this point.
Even in the neater dotted notation, we must keep that whole thing as a
subsection, because existing subsections may contain dots, too.

> But this is kind of a lie; the sections aren't "hook", "pre-commit", and
> "linter" as you'd expect. Whether it's OK to lie like this, though, I
> don't know - I suspect it might make it awkward for others trying to
> parse the config. (my Vim syntax highlighter had kind of a hard time.)

I think we should avoid it if possible. There are some subtleties there,
like the fact that subsections are case-sensitive, but sections and keys
are not.

-Peff

^ permalink raw reply	[relevance 5%]

Results 1-200 of ~2000   | 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 11:57  2%   ` [PATCH v2 5/7] rebase: drop support for `--preserve-merges` Johannes Schindelin via GitGitGadget
2021-09-06 10:15  0%     ` Phillip Wood
2021-09-07 21:05       ` [PATCH v3 00/11] Drop support for git rebase --preserve-merges Johannes Schindelin via GitGitGadget
2021-09-07 21:05  2%     ` [PATCH v3 05/11] rebase: drop support for `--preserve-merges` Johannes Schindelin via GitGitGadget
2019-12-10  2:33     [PATCH 0/6] configuration-based hook management Emily Shaffer
2020-04-14  0:54     ` [RFC PATCH v2 0/2] configuration-based hook management (was: [TOPIC 2/17] Hooks in the future) Emily Shaffer
2020-04-14 15:15       ` [RFC PATCH v2 0/2] configuration-based hook management Phillip Wood
2020-04-14 19:24         ` Emily Shaffer
2020-04-14 20:27  5%       ` Jeff King
2020-04-15 10:01  0%         ` Phillip Wood
2020-04-30 11:21     Git Test Coverage Report (April 30, 2020) Derrick Stolee
2020-04-30 15:12     ` Han-Wen Nienhuys
2020-05-01 22:08  3%   ` Johannes Schindelin
2020-05-12 16:50     [PATCH v2 00/11] CMake build system for git Sibi Siddharthan via GitGitGadget
2020-05-29 13:40     ` [PATCH v3 0/8] " Sibi Siddharthan via GitGitGadget
2020-05-29 13:40       ` [PATCH v3 7/8] cmake: support for building git on windows with msvc and clang Sibi Siddharthan via GitGitGadget
2020-05-30 14:08  4%     ` Đoàn Trần Công Danh
2020-05-30 19:08  0%       ` Sibi Siddharthan
2020-06-05 21:21  4% [PATCH] http: redact all cookies, teach GIT_TRACE_REDACT=0 Jonathan Tan
2020-06-29 22:07     Commit graph chains with no corresponding files? Jonathan Tan
2020-06-30  1:51  6% ` Derrick Stolee
2021-02-25  4:54  0%   ` Bryan Turner
2021-02-25 14:20  0%     ` Derrick Stolee
2021-02-27  2:49  0%       ` Bryan Turner
     [not found]     <EEA65ED1-2BE0-41AD-84CC-780A9F4D9215@strongestfamilies.com>
2020-07-23 15:20  5% ` BUG FOLLOWUP: Case insensitivity in worktrees Casey Meijer
2020-07-24  1:19  0%   ` brian m. carlson
2020-07-24  1:25         ` Junio C Hamano
2020-07-24 18:07  5%       ` Casey Meijer
2020-07-24 18:14  4%     ` Casey Meijer
2020-07-24 21:09  7%       ` brian m. carlson
2020-08-10 21:33     [RFC PATCH 00/21] [RFC] Parallel checkout Matheus Tavares
2020-08-10 21:33  2% ` [RFC PATCH 10/21] unpack-trees: add basic support for parallel checkout Matheus Tavares
     [not found]     <DA41ECC7-D5D4-4E85-A4C3-C55CC2A73D53@hxcore.ol>
     [not found]     ` <27608194-0D85-4D71-8D88-C1278D8DA173@hxcore.ol>
2020-08-12 19:58       ` Files 'Test.txt' and 'test.txt' are different in Git database, but are the same on Windows file system issue Viktor Hozhyi
2020-08-12 23:02  7%     ` brian m. carlson
2020-08-15 16:39     [PATCH v3 00/11] [GSoC] Implement Corrected Commit Date Abhishek Kumar via GitGitGadget
2020-10-07 14:09     ` [PATCH v4 00/10] " Abhishek Kumar via GitGitGadget
2020-10-07 14:09       ` [PATCH v4 06/10] commit-graph: implement corrected commit date Abhishek Kumar via GitGitGadget
2020-10-27 18:53         ` Jakub Narębski
2020-11-03 11:44           ` Abhishek Kumar
2020-11-04 16:45             ` Jakub Narębski
2020-11-05 14:05               ` Philip Oakley
2020-11-05 18:22                 ` Junio C Hamano
2020-11-06 18:26                   ` Extending and updating gitglossary (was: Re: [PATCH v4 06/10] commit-graph: implement corrected commit date) Jakub Narębski
2020-11-08 17:23                     ` Philip Oakley
2020-11-10  1:35                       ` Extending and updating gitglossary Jakub Narębski
2020-11-10 14:04                         ` Philip Oakley
2020-11-10 23:52  4%                       ` Jakub Narębski
2020-09-02 16:26     Repo state broken due to mismatched file name casing during merge Rafał Grzybowski
2020-09-02 23:23  5% ` brian m. carlson
2020-09-22 22:49     [PATCH v2 00/19] Parallel Checkout (part I) Matheus Tavares
2020-09-22 22:49  2% ` [PATCH v2 10/19] unpack-trees: add basic support for parallel checkout Matheus Tavares
2020-10-29  2:14     [PATCH v3 00/19] Parallel Checkout (part I) Matheus Tavares
2020-10-29  2:14  2% ` [PATCH v3 10/19] unpack-trees: add basic support for parallel checkout Matheus Tavares
2020-11-02 19:35  0%   ` Junio C Hamano
2020-11-04 20:32     [PATCH v4 00/19] Parallel Checkout (part I) Matheus Tavares
2020-11-04 20:33  2% ` [PATCH v4 10/19] unpack-trees: add basic support for parallel checkout Matheus Tavares
2020-12-06 11:36  0%   ` Christian Couder
2020-12-07 19:06  0%     ` Matheus Tavares Bernardino
2020-11-06 18:49  1% [PATCH] git-gui: update Russian translation Dimitriy Ryazantcev
2020-11-18 11:02  0% ` Dimitriy
2020-11-19 15:52     [PATCH 0/7] config: add --literal-value option Derrick Stolee via GitGitGadget
2020-11-19 15:52     ` [PATCH 1/7] t1300: test "set all" mode with value_regex Derrick Stolee via GitGitGadget
2020-11-19 22:24       ` Junio C Hamano
2020-11-20 18:39         ` Jeff King
2020-11-21 22:27  4%       ` brian m. carlson
2020-11-20 13:19     ` [PATCH 0/7] config: add --literal-value option Ævar Arnfjörð Bjarmason
2020-11-20 13:23       ` Derrick Stolee
2020-11-20 18:30         ` Junio C Hamano
2020-11-20 18:51  4%       ` Derrick Stolee
     [not found]     <BYAPR21MB1158F64E1141453F7D00B46CE0D89@BYAPR21MB1158.namprd21.prod.outlook.com>
     [not found]     ` <BYAPR21MB11585FFD46DEE7AD4EEEFEABE0D89@BYAPR21MB1158.namprd21.prod.outlook.com>
2020-12-29  2:06  4%   ` [PATCH] git-mv: fix git mv bug with case insensitive fs Dan Moseley
2020-12-31  7:13  0%     ` Torsten Bögershausen
2021-01-03 21:18  6% [PATCH v2 0/5] Hashed mailmap brian m. carlson
2021-01-03 21:18 19% ` [PATCH v2 3/5] t4203: add failing test for case-sensitive local-parts and names brian m. carlson
2021-01-03 21:18 35% ` [PATCH v2 4/5] mailmap: use case-sensitive comparisons for " brian m. carlson
2021-01-04 16:10 11%   ` Ævar Arnfjörð Bjarmason
2021-01-06  0:46  8%     ` Junio C Hamano
2021-01-12 14:08  8%       ` Ævar Arnfjörð Bjarmason
2021-01-06  4:05     [PATCH] git-mv: fix git mv bug with case insensitive fs Junio C Hamano
2021-03-01 17:05  5% ` [PATCH v2 1/1] git mv foo FOO ; git mv foo bar gave an assert tboegi
2021-03-01 19:21  0%   ` Junio C Hamano
     [not found]     ` <20210301170425.12154-1-tboegi@web.de>
2021-03-01 20:23  0%   ` [EXTERNAL] " Dan Moseley
2021-03-01 21:41  4% ` [PATCH v3 " tboegi
2021-03-01 23:59  0%   ` Junio C Hamano
2021-01-08 19:56  5% git-bugreport-2021-01-06-1209.txt (git can't deal with special characters) Daniel Troger
2021-01-09 17:23  0% ` Torsten Bögershausen
2021-03-16 14:40 10% [PATCH] config.txt: add missing period Kyle Meyer
2021-03-16 15:17  0% ` Jeff King
2021-03-17 21:12     [PATCH 0/5] Parallel Checkout (part 2) Matheus Tavares
2021-03-17 21:12  2% ` [PATCH 1/5] unpack-trees: add basic support for parallel checkout Matheus Tavares
2021-03-26 22:12     [PATCH 0/2] Describe Git's security policy Johannes Schindelin via GitGitGadget
2021-03-26 22:12     ` [PATCH 1/2] SECURITY: describe how to report vulnerabilities Johannes Schindelin via GitGitGadget
2021-03-27  6:34  5%   ` Bagas Sanjaya
2021-03-29 13:41  0%     ` Johannes Schindelin
2021-03-29 13:43  4% ` [PATCH v2 0/2] Describe Git's security policy Johannes Schindelin via GitGitGadget
2021-03-29 13:43  5%   ` [PATCH v2 1/2] SECURITY: describe how to report vulnerabilities Johannes Schindelin via GitGitGadget
2021-04-08 16:16     [PATCH v2 0/5] Parallel Checkout (part 2) Matheus Tavares
2021-04-08 16:17  2% ` [PATCH v2 1/5] unpack-trees: add basic support for parallel checkout Matheus Tavares
2021-04-09  4:02     [RFC PATCH v1 00/13][GSoC] doc: (monospace) apply CodingGuidelines on a large-scale Firmin Martin
2021-04-09  4:02  1% ` [RFC PATCH v1 01/13] doc: typeset command-line options in monospace Firmin Martin
2021-04-09  4:02  1% ` [RFC PATCH v1 09/13] doc: typeset command/option/value entries " Firmin Martin
2021-04-19  0:14     [PATCH v3 0/5] Parallel Checkout (part 2) Matheus Tavares
2021-04-19  0:14  2% ` [PATCH v3 1/5] unpack-trees: add basic support for parallel checkout Matheus Tavares
2021-04-19 19:53     [PATCH v4 0/5] Parallel Checkout (part 2) Matheus Tavares
2021-04-19 19:53  2% ` [PATCH v4 1/5] unpack-trees: add basic support for parallel checkout Matheus Tavares
2021-05-03 17:25  5% Bug: Changing folder case with `git mv` crashes on case-insensitive file system Mark Amery
2021-05-03 22:58  4% ` brian m. carlson
2021-05-04 15:19  0% ` Torsten Bögershausen
2021-05-05  0:23       ` Junio C Hamano
2021-05-06  4:34         ` Torsten Bögershausen
2021-05-06  9:12  6%       ` Mark Amery
2021-05-06 14:53  0%         ` Torsten Bögershausen
2021-06-10  8:29  1% [PATCH] multimail: stop shipping a copy Johannes Schindelin via GitGitGadget
2021-06-20 19:45     Bug: branch checkout is detached if the case doesn't match Tim Hutt
2021-06-20 22:03  5% ` Ævar Arnfjörð Bjarmason
2021-06-21 17:20  0%   ` Tim Hutt
2021-07-14 12:10     [PATCH v3 0/9] RFC: Add commit & tag signing/verification via SSH keys using ssh-keygen Fabian Stelzer via GitGitGadget
2021-07-19 13:33     ` [PATCH v4 0/9] ssh signing: " Fabian Stelzer via GitGitGadget
2021-07-19 13:33       ` [PATCH v4 2/9] ssh signing: add ssh signature format and signing using ssh keys Fabian Stelzer via GitGitGadget
2021-07-19 23:53         ` Junio C Hamano
2021-07-20 12:26  4%       ` Fabian Stelzer
2021-07-28 19:36     [PATCH v6 " Fabian Stelzer via GitGitGadget
2021-07-28 22:45  4% ` Jonathan Tan
2021-07-29  1:01  0%   ` Junio C Hamano
2021-07-29 11:01  0%   ` Fabian Stelzer
2021-08-27 23:49     [PATCH v2 0/6] Implement a batched fsync option for core.fsyncObjectFiles Neeraj K. Singh via GitGitGadget
2021-09-14  3:38     ` [PATCH v3 " Neeraj K. Singh via GitGitGadget
2021-09-14  3:38       ` [PATCH v3 2/6] core.fsyncobjectfiles: batched disk flushes Neeraj Singh via GitGitGadget
2021-09-14 19:34         ` Junio C Hamano
2021-09-15  4:55  5%       ` Neeraj Singh
2021-09-21  0:30     [PATCH v6 1/2] grep: refactor next_match() and match_one_pattern() for external use Hamza Mahfooz
2021-09-21  1:15  4% ` Jeff King
2021-09-21 18:41     [PATCH] http: match headers case-insensitively when redacting Jeff King
2021-09-21 19:06  5% ` Eric Sunshine
2021-09-21 19:14  0%   ` Jeff King
2021-09-22 19:10  0%     ` Junio C Hamano
2021-09-22 19:19     ` Junio C Hamano
2021-09-22 20:09       ` Jeff King
2021-09-22 20:51  5%     ` Junio C Hamano
2021-09-22 21:18  0%       ` Jeff King
2021-09-22 21:42             ` Junio C Hamano
2021-09-22 22:11  3%           ` [PATCH v2] " Jeff King
2021-09-22 22:14  4%             ` Jeff King
2021-10-12 22:57     [RFC PATCH 0/2] Conditional config includes based on remote URL Jonathan Tan
2021-11-29 20:23     ` [PATCH v4 " Jonathan Tan
2021-11-29 20:48       ` Ævar Arnfjörð Bjarmason
2021-11-30  7:51  4%     ` Junio C Hamano
2021-10-19 17:38     Questions, improvements BARDOT Jérôme
2021-10-19 21:31     ` Jeff King
2021-10-20 12:25       ` BARDOT Jérôme
2021-10-21  1:00  4%     ` brian m. carlson
2021-11-23  1:27     [PATCH v3 2/2] config: include file if remote URL matches a glob Ævar Arnfjörð Bjarmason
2021-11-29 18:33  5% ` Jonathan Tan
2021-11-29 20:50  0%   ` Ævar Arnfjörð Bjarmason
     [not found]     <cover.1637566224.git.linux@leemhuis.info>
     [not found]     ` <6b760115ecdd3687d4b82680b284f55a04f3ad90.1637566224.git.linux@leemhuis.info>
2021-11-23 18:52       ` [RFC PATCH v1 1/1] docs: add the new commit-msg tags 'Reported:' and 'Reviewed:' Eric Wong
2021-11-24  1:37         ` Junio C Hamano
2021-11-24  6:12  5%       ` Eric Wong
2022-02-15 15:59     [PATCH 00/23] Builtin FSMonitor Part 3 Jeff Hostetler via GitGitGadget
2022-02-15 15:59     ` [PATCH 02/23] t7527: test FS event reporing on macOS WRT case and Unicode Jeff Hostetler via GitGitGadget
2022-02-24 14:52       ` Derrick Stolee
2022-02-24 17:33  5%     ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
2022-03-04 23:40  0%       ` Jeff Hostetler
2022-03-05  8:59  0%         ` Torsten =?unknown-8bit?Q?B=C3=B6gershausen?=
2022-03-04 23:47  5%       ` Jeff Hostetler
2022-04-18  7:47     Git bug report - disk errors on Windows after push Attila Csosz
2022-04-18 17:37     ` brian m. carlson
2022-04-19  3:52       ` Attila Csosz
2022-04-20 22:54         ` Neeraj Singh
2022-04-21  2:29  5%       ` Attila Csosz
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  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-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 18:04     [PATCH] urlmatch: create fetch.credentialsInUrl config Derrick Stolee via GitGitGadget
2022-05-27 13:27  3% ` [PATCH v2] " Derrick Stolee via GitGitGadget
2022-06-01  1:16  2%   ` [PATCH v3 0/2] fetch: " Derrick Stolee via GitGitGadget
2022-06-02 17:20  2%     ` [PATCH v4] remote: " Derrick Stolee via GitGitGadget
2022-06-06 14:36  2%       ` [PATCH v5] " Derrick Stolee via GitGitGadget
2022-06-06 19:55     [PATCH 0/6] bundle URIs: design doc and initial git fetch --bundle-uri implementation Derrick Stolee via GitGitGadget
2022-06-29 20:40     ` [PATCH v2 " Derrick Stolee via GitGitGadget
2022-06-29 20:40       ` [PATCH v2 1/6] docs: document bundle URI standard Derrick Stolee via GitGitGadget
2022-07-21 12:09  3%     ` Matthew John Cheetham
2022-07-22 13:52  0%       ` Derrick Stolee
2022-07-22 16:03  0%       ` Derrick Stolee
2022-06-11 17:03 13% [PATCH] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
2022-06-11 19:17     ` Junio C Hamano
2022-06-12 23:35       ` Junio C Hamano
2022-06-14  6:22  5%     ` Tao Klerks
2022-06-14  5:13  6%   ` Tao Klerks
2022-06-18  0:45  6%     ` Junio C Hamano
2022-06-18 15:34  0%       ` Tao Klerks
2022-06-12 23:30  6% ` Junio C Hamano
2022-06-13 18:12  0%   ` Junio C Hamano
2022-06-14  6:26  0%     ` Tao Klerks
2022-06-14  6:16  7%   ` Tao Klerks
2022-06-19 16:10  6% ` [PATCH v2 0/3] RFC: " Tao Klerks via GitGitGadget
2022-06-19 16:10  5%   ` [PATCH v2 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
2022-06-19 16:10 11%   ` [PATCH v2 3/3] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
2022-10-10  4:09  0%   ` [PATCH v2 0/3] RFC: " Tao Klerks
2023-05-28  9:59  4%   ` [PATCH v3 0/3] " Tao Klerks via GitGitGadget
2023-05-28  9:59  5%     ` [PATCH v3 2/3] reset: new failing test for reset of case-insensitive duplicate in index Tao Klerks via GitGitGadget
2023-05-28  9:59 11%     ` [PATCH v3 3/3] apply: support case-only renames in case-insensitive filesystems Tao Klerks via GitGitGadget
2022-07-25 20:34     [PATCH 0/5] Bundle URIs II: git clone --bundle-uri Derrick Stolee via GitGitGadget
2022-08-02 12:29     ` [PATCH v2 " Derrick Stolee via GitGitGadget
2022-08-02 12:29       ` [PATCH v2 4/5] bundle-uri: add support for http(s):// and file:// Derrick Stolee via GitGitGadget
2022-08-02 21:32         ` Junio C Hamano
2022-08-04 15:34  4%       ` Derrick Stolee
2022-08-04 18:19  0%         ` Junio C Hamano
2022-08-09 13:11  3%   ` [PATCH v3 0/5] Bundle URIs II: git clone --bundle-uri Derrick Stolee via GitGitGadget
2022-07-26 14:04     [PATCH 0/3] log: create tighter default decoration filter Derrick Stolee via GitGitGadget
2022-07-26 14:44     ` Ævar Arnfjörð Bjarmason
2022-07-26 16:38       ` Derrick Stolee
2022-07-26 18:19  4%     ` Ævar Arnfjörð Bjarmason
2022-07-29 14:53     [PATCH] tests: replace mingw_test_cmp with a helper in C Johannes Schindelin via GitGitGadget
2022-07-29 16:44     ` Junio C Hamano
2022-09-06 13:10  4%   ` Johannes Schindelin
2022-09-13 19:25     [PATCH 0/8] [RFC] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2022-09-13 19:25  3% ` [PATCH 4/8] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2022-10-21 17:07     ` [PATCH v2 0/6] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2022-10-21 17:07  3%   ` [PATCH v2 1/6] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2022-11-02 22:09       ` [PATCH v3 00/11] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2022-11-02 22:09  3%     ` [PATCH v3 01/11] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2022-12-12 21:36         ` [PATCH v4 0/8] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2022-12-12 21:36  3%       ` [PATCH v4 1/8] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2023-01-11 22:13           ` [PATCH v5 00/10] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2023-01-11 22:13  3%         ` [PATCH v5 09/10] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2023-01-18  3:30             ` [PATCH v6 00/12] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2023-01-18  3:30  3%           ` [PATCH v6 11/12] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2023-01-20 22:08               ` [PATCH v7 00/12] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2023-01-20 22:08  3%             ` [PATCH v7 11/12] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2023-02-06 19:29                 ` [PATCH v8 0/3] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2023-02-06 19:29  2%               ` [PATCH v8 2/3] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2023-02-15 21:34                   ` [PATCH v9 0/3] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2023-02-15 21:34  2%                 ` [PATCH v9 2/3] http: read HTTP WWW-Authenticate response headers Matthew John Cheetham via GitGitGadget
2023-02-15 23:26  6%                   ` Junio C Hamano
2023-02-16 22:29  0%                     ` Matthew John Cheetham
2023-02-16 22:34  1%                 ` [PATCH v10 0/3] Enhance credential helper protocol to include auth headers Matthew John Cheetham via GitGitGadget
2022-09-30 12:04     icase pathspec magic support in ls-tree Tao Klerks
2022-09-30 13:53     ` Ævar Arnfjörð Bjarmason
2022-10-02 19:07       ` brian m. carlson
2022-10-13  6:35         ` Tao Klerks
2022-10-14  7:41           ` Elijah Newren
2022-10-14  8:48             ` Tao Klerks
2022-10-14 17:06               ` Elijah Newren
2022-10-15 22:06                 ` Tao Klerks
2022-10-17 15:46  3%               ` Tao Klerks
2022-11-05 17:28  5% [PATCH 0/2] add case insensitivity option to bash completion Alison Winters via GitGitGadget
2022-11-21  0:26  6% ` [PATCH v2 " Alison Winters via GitGitGadget
2022-11-21  0:26 12%   ` [PATCH v2 1/2] completion: add optional ignore-case when matching refs Alison Winters via GitGitGadget
2022-11-29  2:38  0% ` [PATCH 0/2] add case insensitivity option to bash completion Junio C Hamano
2022-11-07 18:35     [PATCH 00/30] [RFC] extensions.refFormat and packed-refs v2 file format Derrick Stolee via GitGitGadget
2022-11-11 23:28     ` Elijah Newren
2022-11-14  0:07       ` Derrick Stolee
2022-11-15  2:47         ` Elijah Newren
2022-11-16 14:45  6%       ` Derrick Stolee
2022-11-17  4:28  0%         ` Elijah Newren
2022-11-21 13:39     [PATCH] config: introduce an Operating System-specific `includeIf` condition Johannes Schindelin via GitGitGadget
2022-11-21 13:51     ` Ævar Arnfjörð Bjarmason
2022-11-21 15:51  6%   ` Phillip Wood
2022-11-21 19:19     ` [PATCH v2] " Johannes Schindelin via GitGitGadget
2022-11-22 14:01  5%   ` Ævar Arnfjörð Bjarmason
2022-11-22 14:31  6%     ` Phillip Wood
2022-11-23  0:16  0%       ` Junio C Hamano
2022-11-23 15:07  0%         ` Phillip Wood
2022-11-23 23:51  5%           ` Junio C Hamano
2022-11-23 10:40       ` Philip Oakley
2022-11-25  7:31         ` Junio C Hamano
2023-04-17  7:04           ` Samuel Ferencik
2023-04-17 18:46             ` Junio C Hamano
2023-04-19 12:22               ` Johannes Schindelin
2023-04-19 14:26  6%             ` Chris Torek
2023-01-19 21:13     Race condition on `git checkout -c` Arthur Milchior
2023-01-19 22:55  7% ` Chris Torek
2023-01-20  9:01  0%   ` Arthur Milchior
2023-03-18 19:21     Bug: git pull output and case sensitivity dooagain
2023-03-19  6:22     ` Torsten Bögershausen
2023-03-20 17:16  5%   ` Jeff King
2023-03-20 18:01  0%     ` dooagain
2023-03-20 19:12  0%       ` Torsten Bögershausen
2023-03-22 17:44  5%         ` dooagain
2023-04-01  8:45  3% [PATCH v7 00/49] completion: git-completion 2.0 patches Felipe Contreras
2023-04-01  8:45  7% ` [PATCH v7 12/49] completion: bash: do not modify COMP_WORDBREAKS Felipe Contreras
2023-04-01  8:46  4% ` [PATCH v7 38/49] completion: bash: shuffle __gitcomp functions Felipe Contreras
2023-04-13 10:35  4% Git branch capitalisation bug? Ilya Kamenshchikov
2023-04-13 19:03  0% ` Torsten Bögershausen
2023-04-13 20:31       ` Junio C Hamano
2023-04-20  7:04         ` Ilya Kamenshchikov
2023-04-20  7:28  7%       ` Chris Torek
2023-06-04 21:19  5% [PATCH] Use lowercase includes for some Windows headers Mike Hommey
2023-06-12 19:30  5% ` Junio C Hamano
2023-07-14 17:07  0%   ` Junio C Hamano
2023-06-13  2:28  2% What's cooking in git.git (Jun 2023, #03; Mon, 12) Junio C Hamano
2023-06-15  0:06  2% What's cooking in git.git (Jun 2023, #04; Wed, 14) Junio C Hamano
2023-06-21  0:04  2% What's cooking in git.git (Jun 2023, #05; Tue, 20) Junio C Hamano
2023-06-23 22:54  2% What's cooking in git.git (Jun 2023, #06; Fri, 23) Junio C Hamano
2023-06-27 22:11  2% What's cooking in git.git (Jun 2023, #07; Tue, 27) Junio C Hamano
2023-06-30 20:27  2% What's cooking in git.git (Jun 2023, #08; Fri, 30) Junio C Hamano
2023-07-06  1:05  2% What's cooking in git.git (Jul 2023, #01; Wed, 5) Junio C Hamano
2023-07-11  1:05  2% What's cooking in git.git (Jul 2023, #02; Mon, 10) Junio C Hamano
2023-07-13 23:09  2% What's cooking in git.git (Jul 2023, #03; Thu, 13) Junio C Hamano
2023-07-19 21:25  2% What's cooking in git.git (Jul 2023, #04; Wed, 19) Junio C Hamano
2023-07-25 20:57  2% What's cooking in git.git (Jul 2023, #05; Tue, 25) Junio C Hamano
2023-08-04 19:30  2% [ANNOUNCE] Git v2.42.0-rc0 Junio C Hamano
2023-08-10 16:45  1% [ANNOUNCE] Git v2.42.0-rc1 Junio C Hamano
2023-08-15 21:22  1% [ANNOUNCE] Git v2.42.0-rc2 Junio C Hamano
2023-08-21 18:12  1% [ANNOUNCE] Git v2.42.0 Junio C Hamano
2023-10-18  5:35     [PATCH 00/11] t: reduce direct disk access to data structures Patrick Steinhardt
2023-10-18  5:35     ` [PATCH 04/11] t: convert tests to not write references via the filesystem Patrick Steinhardt
2023-10-18 18:34       ` Junio C Hamano
2023-10-23 13:58         ` Patrick Steinhardt
2023-10-23 19:10  5%       ` Junio C Hamano
2023-10-20 10:03     [PATCH 0/3] some send-email --compose fixes Jeff King
2023-10-20 10:13  2% ` [PATCH 2/3] Revert "send-email: extract email-parsing code into a subroutine" Jeff King
2023-11-29  8:14     [PATCH 0/4] refs: improve handling of special refs Patrick Steinhardt
2023-11-29  8:14     ` [PATCH 3/4] refs: complete list " Patrick Steinhardt
2023-11-29 21:59  5%   ` Taylor Blau
2023-11-30  7:44  0%     ` Patrick Steinhardt
2023-12-21 10:47     git bisect stuck - --force flag required for checkout Devste Devste
2023-12-21 12:22  5% ` brian m. carlson
2024-01-20  0:08     [PATCH] setup: allow cwd=.git w/ bareRepository=explicit Kyle Lippincott via GitGitGadget
2024-01-20 22:26     ` Junio C Hamano
2024-01-22 20:50  5%   ` Kyle Lippincott
2024-02-13 20:52     [PATCH 00/12] FSMonitor edge cases on case-insensitive file systems Jeff Hostetler via GitGitGadget
2024-02-13 20:52  4% ` [PATCH 08/12] fsmonitor: support case-insensitive directory events Jeff Hostetler via GitGitGadget
2024-02-15  9:32  4%   ` Patrick Steinhardt
2024-02-23  3:18  2% ` [PATCH v2 00/16] FSMonitor edge cases on case-insensitive file systems Jeff Hostetler via GitGitGadget
2024-02-23  3:18  4%   ` [PATCH v2 14/16] fsmonitor: support case-insensitive events Jeff Hostetler via GitGitGadget
2024-02-23 18:14         ` Junio C Hamano
2024-02-26 20:41  4%       ` Jeff Hostetler
2024-02-25 13:10  0%     ` Torsten Bögershausen
2024-02-26 21:39       ` [PATCH v3 00/14] FSMonitor edge cases on case-insensitive file systems Jeff Hostetler via GitGitGadget
2024-02-26 21:39  3%     ` [PATCH v3 14/14] fsmonitor: support case-insensitive events Jeff Hostetler via GitGitGadget
2024-03-06 12:58  0%       ` Patrick Steinhardt
2024-03-06 11:31     [PATCH 0/8] builtin/config: introduce subcommands Patrick Steinhardt
2024-03-06 11:31  3% ` [PATCH 7/8] t1300: exercise both old- and new-style modes Patrick Steinhardt
2024-03-06 11:32  2% ` [PATCH 8/8] Documentation/git-config: update to new-style syntax Patrick Steinhardt
2024-03-11 23:19     ` [PATCH v2 00/13] builtin/config: introduce subcommands Patrick Steinhardt
2024-03-11 23:20  3%   ` [PATCH v2 07/13] builtin/config: introduce "get" subcommand Patrick Steinhardt
2024-03-13  3:11  0%     ` Eric Sunshine
2024-03-27  8:42  0%       ` Patrick Steinhardt
2024-03-27  8:46  2% ` [PATCH v3 00/13] builtin/config: introduce subcommands Patrick Steinhardt
2024-03-27  8:46  3%   ` [PATCH v3 07/13] builtin/config: introduce "get" subcommand Patrick Steinhardt
2024-05-03  9:56     ` [PATCH v4 00/14] builtin/config: introduce subcommands Patrick Steinhardt
2024-05-03  9:57  3%   ` [PATCH v4 08/14] builtin/config: introduce "get" subcommand 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).