I'm not very familiar with the way some of this stuff works, but the patch below seems to fix clone for me. I originally tried changing the cmd_main->set_option code path, but value is always set to "true" for object-format because it only sees "option object-format" with no arg } else if (skip_prefix(buf.buf, "option ", &arg)) { char *value = strchr(arg, ' '); int result; if (value) *value++ = '\0'; else value = "true"; result = set_option(arg, value); So when set_option gets called, hash_algo_by_name isn't: } else if (!strcmp(name, "object-format")) { int algo; options.object_format = 1; if (strcmp(value, "true")) { /* XXX this branch is never taken: */ algo = hash_algo_by_name(value); if (algo == GIT_HASH_UNKNOWN) die("unknown object format '%s'", value); options.hash_algo = &hash_algos[algo]; } return 0; So I'm not sure if the above is incomplete or dead code. Anyways, I arrived at the following and it works for me: -----------8<--------- Subject: [PATCH] remote-curl: fix clone on sha256 repos The remote-https process needs to update it's own instance of `the_repository' when it sees an HTTP(S) remote is using sha256. Without this, parse_oid_hex() fails to handle sha256 OIDs when it's eventually called by parse_fetch(). Tested with: git clone https://yhbt.net/sha256test.git GIT_SMART_HTTP=0 git clone https://yhbt.net/sha256test.git (plain http:// also works) Cloning the URL via git:// required no changes Signed-off-by: Eric Wong <e@xxxxxxxxx> --- remote-curl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/remote-curl.c b/remote-curl.c index 0290b04891..9d432c299a 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -555,6 +555,8 @@ static void output_refs(struct ref *refs) struct ref *posn; if (options.object_format && options.hash_algo) { printf(":object-format %s\n", options.hash_algo->name); + repo_set_hash_algo(the_repository, + hash_algo_by_ptr(options.hash_algo)); } for (posn = refs; posn; posn = posn->next) { if (posn->symref)