config: let feature.experimental imply protocol.version=2

Git 2.26 used protocol v2 as its default protocol, but soon after
release, users noticed that the protocol v2 negotiation code was prone
to fail when fetching from some remotes that are far ahead of others
(such as linux-next.git versus Linus's linux.git).  That has been
fixed by 0b07eecf6e (Merge branch 'jt/v2-fetch-nego-fix',
2020-05-01), but to be cautious, we are using protocol v0 as the
default in 2.27 to buy some time for any other unanticipated issues to
surface.

To that end, let's ensure that users requesting the bleeding edge
using the feature.experimental flag *do* get protocol v2.  This way,
we can gain experience with a wider audience for the new protocol
version and be more confident when it is time to enable it by default
for all users in some future Git version.

Implementation note: this isn't with the rest of the
feature.experimental options in repo-settings.c because those are tied
to a repository object, whereas this code path is used for operations
like "git ls-remote" that do not require a repository.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Nieder 2020-05-20 19:15:33 -07:00 коммит произвёл Junio C Hamano
Родитель 87680d32ef
Коммит 3697caf4b9
3 изменённых файлов: 10 добавлений и 1 удалений

Просмотреть файл

@ -22,6 +22,10 @@ existing commit-graph file(s). Occasionally, these files will merge and the
write may take longer. Having an updated commit-graph file helps performance write may take longer. Having an updated commit-graph file helps performance
of many Git commands, including `git merge-base`, `git push -f`, and of many Git commands, including `git merge-base`, `git push -f`, and
`git log --graph`. `git log --graph`.
+
* `protocol.version=2` speeds up fetches from repositories with many refs by
allowing the client to specify which refs to list before the server lists
them.
feature.manyFiles:: feature.manyFiles::
Enable config options that optimize for repos with many files in the Enable config options that optimize for repos with many files in the

Просмотреть файл

@ -48,7 +48,8 @@ protocol.version::
If set, clients will attempt to communicate with a server If set, clients will attempt to communicate with a server
using the specified protocol version. If the server does using the specified protocol version. If the server does
not support it, communication falls back to version 0. not support it, communication falls back to version 0.
If unset, the default is `0`. If unset, the default is `0`, unless `feature.experimental`
is enabled, in which case the default is `2`.
Supported versions: Supported versions:
+ +
-- --

Просмотреть файл

@ -17,6 +17,7 @@ static enum protocol_version parse_protocol_version(const char *value)
enum protocol_version get_protocol_version_config(void) enum protocol_version get_protocol_version_config(void)
{ {
const char *value; const char *value;
int val;
const char *git_test_k = "GIT_TEST_PROTOCOL_VERSION"; const char *git_test_k = "GIT_TEST_PROTOCOL_VERSION";
const char *git_test_v; const char *git_test_v;
@ -30,6 +31,9 @@ enum protocol_version get_protocol_version_config(void)
return version; return version;
} }
if (!git_config_get_bool("feature.experimental", &val) && val)
return protocol_v2;
git_test_v = getenv(git_test_k); git_test_v = getenv(git_test_k);
if (git_test_v && *git_test_v) { if (git_test_v && *git_test_v) {
enum protocol_version env = parse_protocol_version(git_test_v); enum protocol_version env = parse_protocol_version(git_test_v);