[llvm-dev] [RFC] One or many git repositories?

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 26 10:58:56 PDT 2016

> On Jul 26, 2016, at 10:42 AM, Robinson, Paul <paul.robinson at sony.com> wrote:
>>> 3. For many (most?) developers, changing to a monolithic git repo is a
>>> *bigger* workflow change than switching to separate git repos. Many
>>> people (and at least some downstream infrastructure) use the git
>>> mirrors exclusively, aside from git-svn for committing.
>>> I believe the idea is to continue to maintain the read-only independent
>>> git repos for each project. The only change is instead of sourcing those
>>> commits from the official upstream(independent) svn repos, they will be
>>> sourced from the official upstream monorepo.
>>> Thus downstream developers can continue to use the read-only view of
>>> the independent projects if that is easier for them; but people hacking
>>> on llvm/clang itself get the benefits of easier checkout, patching,
>>> bisection, atomic commits between projects, etc that come from using a
>>> monorepo as the official repository.
>> It is true that downstream should be able continue to work easily based
>> of these official independent *git* repos ( i.e.:
>>  http://llvm.org/git/llvm.git will continue to exist and be updated
>> without changing its history). 
>> However for individual developers that are continuously upstreaming their
>> work it does not seem sustainable, how do you pull from the individual
>> repos, do you work, commit as today, and push upstream? Today it is
>> possible with git-svn, while with the monorepo it won’t be possible.
> Speaking only for myself, the problem you suggest simply does not exist.
> Or another way of saying it:  I already can't work the way you imagine.
> Our downstream repo is fed by the upstream projects, but it's simply
> impossible to directly commit work from there into upstream.  I create
> a patch based on local work, apply it to a separate "vanilla" upstream 
> checkout and commit from there.  

Except that you won’t be able to use "git format-patch” and “git am” anymore, you’ll have to use `git diff` and `patch` (Maybe that’s already what you’re doing).

> The upstream version of the patch 
> cycles back into our repo and we use it to supersede the local version.
> All done.  Git or svn, makes no difference.  Monorepo or submodules,
> makes no difference.  Those are all implementation details.

I believe we have a similar setup in the sense that I live on a downstream branch, except that I have a unified git object store (git worktree) and I can *cherry-pick* from my private downstream branch checkout to the upstream checkout, which is even more streamline than creating a patch on disk and applying it.

When the workflow is significantly impacted, it becomes more than an “implementation detail”. Maybe you don’t exploit the current possibility of git, but the fact is that some people (and I know this includes some of my colleagues so I’m not alone) will be impacted by this: i.e. having our downstream integration based of the individual repo would be a pain for me when switch back-and-forth my patches.


> Even if it were possible, I would still keep my upstream checkout
> separate just as a safety measure, to keep from sending private stuff
> upstream by accident.
> --paulr

More information about the llvm-dev mailing list