diff --git a/Documentation/config/remote.txt b/Documentation/config/remote.txt index eef0bf4f622c7b..8efc53e836d20b 100644 --- a/Documentation/config/remote.txt +++ b/Documentation/config/remote.txt @@ -8,13 +8,16 @@ remote..url:: linkgit:git-push[1]. A configured remote can have multiple URLs; in this case the first is used for fetching, and all are used for pushing (assuming no `remote..pushurl` is defined). + Setting this key to the empty string clears the list of urls, + allowing you to override earlier config. remote..pushurl:: The push URL of a remote repository. See linkgit:git-push[1]. If a `pushurl` option is present in a configured remote, it is used for pushing instead of `remote..url`. A configured remote can have multiple push URLs; in this case a push goes to - all of them. + all of them. Setting this key to the empty string clears the + list of urls, allowing you to override earlier config. remote..proxy:: For remotes that require curl (http, https and ftp), the URL to diff --git a/remote.c b/remote.c index 9417d83e516dfa..b7262964fb0a89 100644 --- a/remote.c +++ b/remote.c @@ -63,12 +63,18 @@ static char *alias_url(const char *url, struct rewrites *r) static void add_url(struct remote *remote, const char *url) { - strvec_push(&remote->url, url); + if (*url) + strvec_push(&remote->url, url); + else + strvec_clear(&remote->url); } static void add_pushurl(struct remote *remote, const char *pushurl) { - strvec_push(&remote->pushurl, pushurl); + if (*pushurl) + strvec_push(&remote->pushurl, pushurl); + else + strvec_clear(&remote->pushurl); } static void add_pushurl_alias(struct remote_state *remote_state, diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index 7789ff12c4b8f8..08424e878e104c 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -1492,4 +1492,40 @@ test_expect_success 'refs/remotes/* refspec and unqualified DWIM and ) ' +test_expect_success 'empty config clears remote.*.url list' ' + test_when_finished "git config --remove-section remote.multi" && + git config --add remote.multi.url wrong-one && + git config --add remote.multi.url wrong-two && + git -c remote.multi.url= \ + -c remote.multi.url=right-one \ + -c remote.multi.url=right-two \ + remote show -n multi >actual.raw && + grep URL actual.raw >actual && + cat >expect <<-\EOF && + Fetch URL: right-one + Push URL: right-one + Push URL: right-two + EOF + test_cmp expect actual +' + +test_expect_success 'empty config clears remote.*.pushurl list' ' + test_when_finished "git config --remove-section remote.multi" && + git config --add remote.multi.url right && + git config --add remote.multi.url will-be-ignored && + git config --add remote.multi.pushurl wrong-push-one && + git config --add remote.multi.pushurl wrong-push-two && + git -c remote.multi.pushurl= \ + -c remote.multi.pushurl=right-push-one \ + -c remote.multi.pushurl=right-push-two \ + remote show -n multi >actual.raw && + grep URL actual.raw >actual && + cat >expect <<-\EOF && + Fetch URL: right + Push URL: right-push-one + Push URL: right-push-two + EOF + test_cmp expect actual +' + test_done