Re: Renaming the "master" branch without breaking existing clones
- From
Jeff King <peff@peff.net>
- Date
- Aug 3, 2020, 19:40 UTC
- Message-ID
- <20200803194006.GA2715275@coredump.intra.peff.net>
- In-Reply-To
- <20200803160051.GA50799@syl.lan>
On Mon, Aug 03, 2020 at 12:00:51PM -0400, Taylor Blau wrote:
Show 8 quoted lines
> This is more-or-less what I was proposing in the message that I linked > above. Maybe a more solidified proposal might look something as follows: > > - We could introduce a mechanism to mark certain refs as aliases to > other refs. For example, a remote might publish its > 'refs/heads/master' as an alias to 'refs/heads/main', so that any > reads or writes to the former get applied to the latter > transparently.
I think symrefs do this already. Try this:
git init parent git -C parent checkout -b main git -C parent commit --allow-empty -m one git -C parent symbolic-ref refs/heads/master refs/heads/main
git clone parent clone cd clone GIT_TRACE_PACKET=1 git ls-remote 2>&1 >/dev/null | perl -lne '/git</ && /packet: (.*)/ and print $1'
Assuming you have the v2 protocol enabled, you should see:
git< 3ba9220cd714e9350cb4becd1cb56d0cacf29d9b HEAD symref-target:refs/heads/main git< 3ba9220cd714e9350cb4becd1cb56d0cacf29d9b refs/heads/main git< 3ba9220cd714e9350cb4becd1cb56d0cacf29d9b refs/heads/master symref-target:refs/heads/main
(if you don't you'll still see them as aliases, but you won't be told that master is a symref).
And it even works for pushing. Doing:
git checkout -b master origin/master git commit --allow-empty -m two git push
updates both "main" and "master".
The real trick is that you can't create or update symbolic refs on the server side using a client. So this would have to be something that hosting providers allow (and there might be some security implications; I'm not sure what happens if you create a loop in the symref resolution).
> - A ref alias can be annotated to say "I am a transition ref alias", > i.e., that clients should be taught to rename their copy of 'master' > to 'main' (and update remote-tracking refs accordingly).
It's not specifically marked as a transition, but a client could act on the symref advertisement above.
-Peff