diff --git a/remote.c b/remote.c index a13d9a0903..368a43c1b2 100644 --- a/remote.c +++ b/remote.c @@ -1832,17 +1832,25 @@ const char *repo_default_remote(struct repository *repo) const char *repo_remote_from_url(struct repository *repo, const char *url) { + char *rewritten_url; + const char *remote_name = NULL; + read_config(repo, 0); + if ((rewritten_url = alias_url(url, &repo->remote_state->rewrites))) + url = rewritten_url; for (int i = 0; i < repo->remote_state->remotes_nr; i++) { struct remote *remote = repo->remote_state->remotes[i]; if (!remote) continue; - if (remote_has_url(remote, url)) - return remote->name; + if (remote_has_url(remote, url)) { + remote_name = remote->name; + break; + } } - return NULL; + free(rewritten_url); + return remote_name; } int branch_has_merge_config(struct branch *branch) diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index 9554720152..10adeabf0f 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -256,6 +256,25 @@ test_expect_success 'submodule update --remote should fetch upstream changes' ' ) ' +test_expect_success 'submodule update --remote resolves URL rewrites' ' + test_config_global "url.$(pwd)/.insteadOf" local: && + mkdir alias-super alias-submodule && + ( + cd alias-submodule && + git init && + git commit --allow-empty --message "Initial commit" + ) && + ( + cd alias-super && + git init && + git submodule add local:alias-submodule submodule && + git submodule update --force && + git -C submodule remote rename origin upstream && + git -C submodule remote add fork user@host && + git submodule update --remote + ) +' + test_expect_success 'submodule update --remote should fetch upstream changes with .' ' ( cd super &&