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

zyp*_*510 3 git git-subtree monorepo

有时我在 GitHub 上发现monorepo由多个 npm 包组成,我想对其进行一些修改并在我的项目中使用它。但是 npm 从 git 子目录安装包比从 git 存储库安装要困难得多[ 1 ][ 2 ]。由于我会自己进行修改,所以我想知道如何设置自己的 git 存储库,以便 npm 可以轻松安装,并且可以合并上游更改。

目前,我使用GitHub 上的本指南将包与 monorepo 的其余部分分开,即

git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 
Run Code Online (Sandbox Code Playgroud)

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

以前有人这样做过吗?任何想法?

zyp*_*510 6

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


所以这是我的解决方案:

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

    git checkout master
    git branch -m upstream
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从 monorepo 中拆分子目录

    git checkout upstream
    git subtree split -P <subdirectory path> -b master
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. (可选)设置 master 分支的远程并将其推送到 GitHub。

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

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

    git checkout upstream
    git pull
    
    Run Code Online (Sandbox Code Playgroud)
  2. 再次分裂

    git subtree split -P <subdirectory path> -b upstream-patch
    
    Run Code Online (Sandbox Code Playgroud)

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

    gitk master upstream-patch
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在只需将新分支合并到master

    git checkout master
    git merge upstream-patch
    
    Run Code Online (Sandbox Code Playgroud)

    手动解决任何合并冲突。

  4. (可选) git 推送