Every time we make such a transplant, we simply squash together the modifications we made in the previous version, and land it as one big commit into the next version.
Those who are used to very stringent keeping of Git history may wrinkle their nose at this, but it is a pragmatic choice. Maintaining modifications on top of the rapidly changing upstream is a lot of work, and so far we haven't had the opportunity to figure out a more clever way to do it. Nor have we really suffered any consequences of not having an easy to read history of our modifications - it's a relatively small amount of patches, after all.
With a recent boost in team size, we may have that opportunity. Also the need for better history-keeping increases with our capability do to it well.
From the days where I was more active in the Git community, I've chatted with some people dealing with similar problems:
First up was Johannes Schindelin, now at Microsoft, the maintainer of Git for Windows. He has been keeping his own set of scripts for keeping the modifications needed in Git itself to make it work well on Windows. I'm not sure whether his scripts will be easy to re-use out of the box, but it is somehow reassuring that others have managed this kind of operation.
Another one was Josh Triplett at Intel, who developed git-series to help maintain patch-series as they were evolving and awaiting acceptance upstream (sometimes a patch series waiting for acceptance into the linux kernel can go for many months, and undergo dozens of iterations before finally being accepted, if ever). Now, based on what I remember, git-series could be just the thing for us. But perhaps there are other tools.
git-series takes inspiration from Quilt, which is the classic tool for maintaining patches. Quilt is not tied to a particular VCS.
Going from there, there is the similarly named Guilt, which does tie into Git, persisting the managed patches as Git commits rather than patch files. And there's a similar tool called Stacked Git or StGit that does the same. Both of these are heavily inspired by Mercurial's MQ extension.
Another person into these challenges was Adam Spiers at SUSE, the author of git-deps, a very nifty tool for analyzing dependencies between Git commits. He also authored git-explode, which could be useful for us breaking our modification blob into smaller patches. Adam later pointed my attention to a tool called TopGit, which seems to be developed for exactly our kind of use-case, although Adam did have some qualms about it. Similar to Johannes, he has developed some scripts of his own, which he was tempted to turn into a proper project.
And a more random find: I found several of the above tools mentioned in Git Rev News #54, where a new tool called git-revise was promoted.
Inspired by that, I took to searching the Git mailing list for some of the above keywords, and found that Stefan Xanos has discussed and proposed designs of an evolve tool for Git. The topic was brought up again at the latest Git contributor summit. So maybe Git itself will offer more support for these kinds of use-cases some day.
So, an overview of the tools I could find:
Tool | Tech | Notes |
Quilt | Bash | Not based on Git |
Git for Windows' Garden shears | Sh | May be very specific to the Git repository itself |
git-series | Rust | Irregular activity (only Josh appears to be developing it) |
Guilt | Sh | MQ like. Last commit was a couple of years ago. |
StGit | Python | MQ like. Actively developed. |
git-revise | Python | Circumvents the slowness of rebase by working on the index directly. Very new. |
TopGit | Sh | 11 years of development and still active! Mighty, almost intimidating feature set. |
To sum it up, it seems many people have related problems, but there are different pain points and workflows that seem to invite their own solutions. The tools may be either opinionated/tailored to specific use-cases.
So we'll have to try them out, see what works, and perhaps even write our own scripts if that works best for us.
I'd be happy to hear any feedback, additional tools or details I got wrong above.
This comment has been removed by a blog administrator.
ReplyDelete