On Sun, Mar 31, 2024 at 3:09 PM Junio C Hamano <gitster@xxxxxxxxx> wrote: > ... we are giving to "update-symref" is not an object name, but a > refname (i.e. the target of the symref at <ref> points at), so > "newvalue" -> "new-ref" or something is needed. I kept this line just to say, I agree on all of the above ... > Existing "update" command can be used to create (by having "zero" > <old-oid>) and to delete (by having "zero" <new-oid>), but we still > have "create" and "delete" separately. Given that we are teaching > the command to also work with symrefs by adding command(s) for > symrefs to an existing vocabulary, we should offer "create-symref" > and "delete-symref" for consistency between refs and symrefs. .. and on this, but: > It probably is a good idea to allow "update-symref" to also create > and delete a symref in similar ways with the existing "update" > allows creation and deletion of a ref. An "zero" <old-ref> may be > an update that can happen only when the <ref> does not exist, i.e., > creation, and an "zero" <new-ref> may be an update that makes <ref> > disappear. > > "zero" value in the context of refs is a 0{40} object name (side > note: we have an explicit mention of 40 in the doc, which needs to > be updated eventually, probably outside this series). But in the > new context of symrefs, a safe "zero" value needs to be picked > carefully. An empty string may not work well syntactically > especially in the `-z` format, because you cannot tell if > > update-symref NUL HEAD NUL refs/heads/main NUL NUL > > wants to say that <old-ref> is an empty string, or if it is missing. For these reasons, I'd suggest that the all-zero hash be officially deprecated in favor of create/delete and of course create-symref and delete-symref. Of course, compatibility requires some sort of support for the old system for some time. As to whether that means something like the suggestion of ".missing" etc, I have no particular opinion -- but since the symref options are new, they would not *need* symmetric options, if we just say that "update-symref" cannot create or delete a symref. Meanwhile, for testing purposes I was curious as to what happens if you ask `git update-ref` to delete an existing symref, so after creating a test repository: $ git branch * main symref -> main $ git update-ref --stdin delete refs/heads/symref $ git branch Whoops, this doesn't look good... Restoring the branch name (I had saved the hash ID Just In Case): $ echo d88ee82e6a5c29c95f712030f5efc9d43116ae79 > .git/refs/heads/main brings things back, after which this works properly: $ git branch -d symref Deleted branch symref (was refs/heads/main). $ git branch * main If this (deleting the target of the symref when using "delete") is a bug, and I think it is, that's a separate topic of course... Chris