Duy Nguyen wrote: > On Wed, Feb 28, 2018 at 8:02 AM, Brandon Williams <bmwill@xxxxxxxxxx> wrote: >> On 02/27, Jonathan Nieder wrote: >>> If I share my .gitconfig or .git/config file between multiple machines >>> (or between multiple Git versions on a single machine) and set >>> >>> [protocol] >>> version = 2 >>> >>> then running "git fetch" with a Git version that does not support >>> protocol v2 errors out with >>> >>> fatal: unknown value for config 'protocol.version': 2 >>> >>> In the spirit of v1.7.6-rc0~77^2~1 (Improve error handling when >>> parsing dirstat parameters, 2011-04-29), it is better to (perhaps >>> after warning the user) ignore the unrecognized protocol version. >>> After all, future Git versions might add even more protocol versions, >>> and using two different Git versions with the same Git repo, machine, >>> or home directory should not cripple the older Git version just >>> because of a parameter that is only understood by a more recent Git >>> version. > > I wonder if it's better to specify multiple versions. If v2 is not > recognized by this git but v0 is, then it can pick that up. But if you > explicitly tell it to choose between v2 and v3 only and it does not > understand either, then it dies. Not sure if this is a good idea > though. Interesting thought. Something roughly like this (on top of the patch this is a reply to)? diff --git i/protocol.c w/protocol.c index ce9c634a3a..6aa8857a11 100644 --- i/protocol.c +++ w/protocol.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "string-list.h" #include "config.h" #include "protocol.h" @@ -14,14 +15,18 @@ static enum protocol_version parse_protocol_version(const char *value) enum protocol_version get_protocol_version_config(void) { - const char *value; - if (!git_config_get_string_const("protocol.version", &value)) { - enum protocol_version version = parse_protocol_version(value); - if (version != protocol_unknown_version) - return version; + const struct string_list *values; + const struct string_list_item *value; + enum protocol_version result = protocol_v0; + + values = git_config_get_value_multi("protocol.version"); + for_each_string_list_item(value, values) { + enum protocol_version v = parse_protocol_version(value->string); + if (v != protocol_unknown_version) + result = v; } - return protocol_v0; + return result; } enum protocol_version determine_protocol_version_server(void)