如何分叉 monorepo 的一部分并仍然能够合并上游提交?

How to fork part of a monorepo and still be able to merge upstream commits?

有时我会发现 monorepo on GitHub that consists of multiple npm packages, which I would like to make some modification and use it in my projects. But it's much harder for npm to install package from a git subdirectory than to install from a git repository[1][2]。由于我会自己进行修改,我想知道如何设置自己的 git 存储库,以便 npm 易于安装,并便于我合并上游更改。

目前,我使用 GitHub 中的 this guide 将包与 monorepo 的其余部分分开,即

git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 

Npm 可以轻松安装 repo,但我发现很难合并任何上游更改。

以前有人做过吗?有什么想法吗?

不可能分叉单个存储库的一部分,因为 git 无法计算出能够与上游同步的良好 Sha1。

但也许 "sparse checkout" 就是您要找的。 这使您可以在工作目录中选择所需的子目录。

参见示例https://gist.github.com/sumardi/5559896http://schacon.github.io/git/git-read-tree.html#_sparse_checkout

实际上,我想我错过了一些东西 - 合并上游更改并不像我想象的那么难,因为 git 子树分裂是确定性的,即它为相同的子树分裂产生相同的 SHA1,无论有多少重复该过程的次数。


所以这是我的解决方案:

  1. 克隆 monorepo
  2. 将默认分支(master)重命名为其他名称,例如上游

    git checkout master
    git branch -m upstream
    
  3. 从monorepo中拆分子目录

    git checkout upstream
    git subtree split -P <subdirectory path> -b master
    

    现在我们有一个主分支,其中只有与子目录路径相关的提交。

  4. (可选) 设置master分支的remote并推送到GitHub.

现在如果上游 monorepo 添加了一些更改:

  1. 检查上游分支并拉取更改

    git checkout upstream
    git pull
    
  2. 再分裂

    git subtree split -P <subdirectory path> -b upstream-patch
    

    查看修订图,你会看到新分支(upstream-patch)与master相关。

    gitk master upstream-patch
    
  3. 现在只需将新分支合并到master

    git checkout master
    git merge upstream-patch
    

    手动解决任何合并冲突。

  4. (可选) git 推送