Skip to content

builtin/ls-remote: fall back to SHA1 outside of a repo

Patrick Steinhardt requested to merge pks-transport-helper-default-hash into master

In c8aed5e8 (repository: stop setting SHA1 as the default object hash, 2024-05-07), we have stopped setting the default hash algorithm for the_repository. Consequently, code that relies on the_hash_algo will now crash when it hasn't explicitly been initialized, which may be the case when running outside of a Git repository.

It was reported that git-ls-remote(1) may crash in such a way when using a remote helper that advertises refspecs. This is because the refspec announced by the helper will get parsed during capability negotiation. At that point we haven't yet figured out what object format the remote uses though, so when run outside of a repository then we will fail.

The course of action is somewhat dubious in the first place. Ideally, we should only parse object IDs once we have asked the remote helper for the object format. And if the helper didn't announce the "object-format" capability, then we should always assume SHA256. But instead, we used to take either SHA1 if there was no repository, or we used the hash of the local repository, which is wrong.

Arguably though, crashing hard may not be in the best interest of our users, either. So while the old behaviour was buggy, let's restore it for now as a short-term fix. We should eventually revisit, potentially by deferring the point in time when we parse the refspec until after we have figured out the remote's object hash.

Closes #342 (closed).

Merge request reports