Subject: Re: Determining whether you have a commit locally, in a partial clone?

From: Junio C Hamano <[email-masked]>
Date: Tue, 20 Jun 2023 11:31:01 -0700

Tao Klerks <[email-masked]> writes:

> My apologies for the self-reply, I did find a workaround here:
>
> git -c remote.origin.url log SOME_HASH_NOT_IN_REFSPEC
>
> I don't understand what's happening here at all, because setting
> "remote.origin.url" to "True" in this way works to prevent the
> normally configured URL from kicking in, ...

Interesting.  This happens inside remote.c:handle_config() where
git_config_string() is used to reject a non-string value given to
the "remote.<name>.url" variable and abort the process to read from
the configuration file by returning -1 and causes whoever uses that
configuration value to die.  As the command line configuration is
read first, aborting the configuration reader early would mean that
the configured values would not even be read.

I am not sure why this does not cause the entire thing to die,
though.  It requires further digging, for which I do not have time
for right now..

> ... but setting a different value
> (or empty value) does not.

Most likely, this is because you are giving a syntactically correct
value so the usual "last one wins" logic kicks in.

In hindsight, I think (1) the first one should probably fail the
"git log" process (not just the lazy fetch subprocess), and (2)
there should be an explicit way, e.g. giving an empty string, to
"clear" the list of .url accumulated so far.

(2) may look something silly like this:

 remote.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git c/remote.c w/remote.c
index 0764fca0db..ecc146856a 100644
--- c/remote.c
+++ w/remote.c
@@ -64,12 +64,22 @@ static const char *alias_url(const char *url, struct rewrites *r)
 
 static void add_url(struct remote *remote, const char *url)
 {
+	if (!*url) {
+		remote->url_nr = 0;
+		return;
+	}
+
 	ALLOC_GROW(remote->url, remote->url_nr + 1, remote->url_alloc);
 	remote->url[remote->url_nr++] = url;
 }
 
 static void add_pushurl(struct remote *remote, const char *pushurl)
 {
+	if (!*pushurl) {
+		remote->pushurl_nr = 0;
+		return;
+	}
+
 	ALLOC_GROW(remote->pushurl, remote->pushurl_nr + 1, remote->pushurl_alloc);
 	remote->pushurl[remote->pushurl_nr++] = pushurl;
 }