2

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

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

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

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

有没有人这样做过?任何想法?

4

2 回答 2

4

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


所以这是我的解决方案:

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

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

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

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

  4. (可选)为 master 分支设置远程并将其推送到 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 push
于 2018-07-19T09:28:33.747 回答
0

这不可能 fork 一个单一存储库的一部分,因为 git 将无法计算好的 Sha1 以便能够与上游同步。

但也许那个“稀疏结帐”就是你要找的。这使您可以在工作目录中选择所需的子目录。

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

于 2018-07-19T07:12:33.230 回答