a ports developer daily git workflow
Dave Cottlehuber
dch at skunkwerks.at
Sat Jun 1 17:12:27 UTC 2019
On Fri, 31 May 2019, at 14:24, Adriaan de Groot wrote:
> On Friday, 31 May 2019 11:59:01 CEST Dave Cottlehuber wrote:
> > Below is my day-to-day workflow for dealing with ports and patches in
> > git.
>
> The thing with ports is that there's rarely long-lived branches unless you're
> updating a bunch of ports at once that all hang together (e.g. KDE Frameworks
> plus their dependencies **might** qualify). Most of the time, you have a
> modified Makefile, pkd-plist and distinfo and that's it. You want to push that
> to the central ports tree.
>
> Here's the scenario I'm afraid of, and given the volume of ports commits (ok,
> fine, it's probably no more than two hundred a day) it might happen often
> enough to be annoying:
>
> - you and I both clone ports repo at hash A (master, at 9am).
> - you update devel/dodgy, while I do devel/kf5-dodgy.
> - you commit, pou-build, and push. You get hash B recorded on the server.
> - I have one extra cup of coffee, pou-build, and push.
>
> My push is rejected, because the remote repo contains work I don't have. Drat.
> One important thing is that your *unrelated* work has changed the tree and
> blocked my commit. With SVN that doesn't happen (er .. ?) because it's file-
> oriented.
Thanks for the reply Adriann.
This is a good point - what happens with svn if we *both* update
ports/devel/Makefile to add dodgy1 and dodgy2? Presumably it
rejects the commit?
In svn if there's no conflicting changes then "stuff just works".
In git, a merge will take care of this for you also, the patch is
almost always localised enough for git to figure out what's needed.
However, I am assuming that -- at least initially while people get more
comfortable -- merge commits are either forbidden, or restricted to a
group like re at .
Note that it's possible to let the server do the rebase & then make a clean
fast-forward series of commits - this is what github provides in a nice little
rebase+merge button, and there is some tooling to help with this too
like https://github.com/max630/git-push-update
> If I naively do "git pull" I'll get a tiny diamond merge: A is a parent of my
> commit, and my commit and B are parents of the merge. I could try to push
> that. Doing so will result in large numbers of tiny diamonds. If I spend too
> much time cursing the tools, you might have fixed misc/unrelated in the
> meantime, getting hash C on the server, and I'll have to do the merge-dance
> again, getting another diamond.
I was part of the first community at the ASF to move our repos from svn to
git and I don't recall ever seeing this in practice. FreeBSD is a bigger
development group so we'd need to take more care.
I'd also expect given our svn heritage that we'll want a linear history too, in
which case merge commits are forbidden, and people should be advised
to set automatic rebase-on-pull on for their repos to avoid your diamond
merge of hell pattern:
git config –global pull.rebase true
Or omit the global and do it per-repo.
> For git-using folk, "git fetch ; git rebase origin/master" is the known
> solution, and push will yield a linear history.
Correct; I think in practise actual conflicts just with this will be a very rare
occurrence. My gut feel says we should try this and see how often it occurs,
before trying to engineer it away.
> Depending on muscle memory and branching discipline, the many-diamonds problem
> could seriously annoy people. It would annoy **me**.
Also, but I think above is sufficient most of the time. This could well
be different in svn branches in src, compared to ports though.
> .. now that I've written it down like this, it strikes me that this problem
> *could* be documented out of existence, possibly with some tools on the server
> side to help enforce linear ports history.
I agree.
https://devblog.nestoria.com/post/98892582763/maintaining-a-consistent-linear-history-for-git
has an example of that sort of tooling, and a nice alternative explanation of
merge commits.
https://help.github.com/en/articles/support-for-subversion-clients may be of
interest to people - try it against https://github.com/freebsd/freebsd-ports
A+
Dave
More information about the freebsd-git
mailing list