On 22/02/18 18:29, Paul Smith wrote: > > Hi all. I'm wondering if anyone has any thoughts about the best, or > even any, way to have "branch properties": some extra information which > is attached to a branch (that is, the actual branch name not the commit > it currently points to). > > My requirements are that the information needs to be pushed to the > server, so that lets out branch descriptions for example. Ideally the > information would also be easily updated and available in all clones > during normal fetch operations but this isn't a hard requirement: I > could script it. > > My immediate desire is to find a way to mark a branch as "frozen", that > will control which pushes are allowed. I use gitolite on my server and > I can easily write a server hook that will handle the checking, > rejecting, etc. I already have such an infrastructure. What I need is > a way to know which branches are in that state, so my hook can see that > and DTRT. There are other "branch properties" I could envision, too, > but don't have a real need right now. > > Of course I could embed the frozen state into the gitolite repository > configuration. Indeed, I have already implemented "locks" for obsolete > branches. But "frozen" is a more ephemeral state and requiring access > to the gitolite repository to manage it is just not what I want; it's a > separate repository so the state is not visible, requires privileges I > really don't want to hand out to everyone, and is generally difficult. > I want some users to be able to manage frozen branches relatively > easily, and all users to be able to see the state of which branches are > frozen, etc. > > So then I thought about creating a "frozen" tag, like "frozen/v1.0" or > something. This is slightly weird because it is applied to a commit, > which is not really right, but whatever: it's just a marker so I would > just be checking to see if it exists or not. The other problem is that > Git tags are not intended to be transient/moveable. While you CAN > delete them and move them, when someone pulls the repository they won't > get that update by default. Since the hook is server-side the fact > that the local repository has the wrong information doesn't matter for > behavior, but it's confusing for people. So, it's not ideal. > > I thought about creating a branch, like "frozen/v1.0", rather than a > tag. I don't need a branch here, and no one would push to that branch > (I'd have to disallow that in my hooks), and the commit associated with > the branch would not be relevant most likely. I would only check to > see if the branch existed, or not. Branches are nice because creating > and deleting them is handled automatically (if you use prune > consistently, which we do because we have tons of transient branches). > > Then I looked into using notes, and they look interesting, but they're > associated with a specific commit as well and I don't want that: a > frozen branch can still have new commits pushed to it they just have > meet certain criteria. This makes them hard to translate into a branch > name. > > So far, using a special branch name seems the most "reasonable". But, > I wonder if I missed some cool aspect if Git that would work better, or > if anyone else has other suggestions. > > Cheers! > Hi Paul It would certainly be nice to be able to share branch descriptions so that if I clone a repository I can get a bit more detail about the ideas behind each branch. Shared descriptions could be displayed in web uis. I sometimes find myself wanting something like notes for branches as well to make a todo list for future commits. Maybe there could be a well known refs (say refs/metadata) that contains public metadata for other refs. In the same way that refs/notes/commits contains a tree of commit ids refs/metadata would contain ref paths without the leaning ref/. Under than directory there would be a subtree with the metadata - files called description, frozen, a directory of notes etc. So for refs/heads/master you'd have refs/metadata/heads/description containing the description refs/metadata/heads/master/notes/... containing the notes I want to share and refs/heads/metadata/master/frozen to indicate if the branch was frozen. Best Wishes Phillip