如何分叉 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/5559896
和
http://schacon.github.io/git/git-read-tree.html#_sparse_checkout
实际上,我想我错过了一些东西 - 合并上游更改并不像我想象的那么难,因为 git 子树分裂是确定性的,即它为相同的子树分裂产生相同的 SHA1,无论有多少重复该过程的次数。
所以这是我的解决方案:
- 克隆 monorepo
将默认分支(master)重命名为其他名称,例如上游
git checkout master
git branch -m upstream
从monorepo中拆分子目录
git checkout upstream
git subtree split -P <subdirectory path> -b master
现在我们有一个主分支,其中只有与子目录路径相关的提交。
(可选) 设置master分支的remote并推送到GitHub.
现在如果上游 monorepo 添加了一些更改:
检查上游分支并拉取更改
git checkout upstream
git pull
再分裂
git subtree split -P <subdirectory path> -b upstream-patch
查看修订图,你会看到新分支(upstream-patch)与master相关。
gitk master upstream-patch
现在只需将新分支合并到master
git checkout master
git merge upstream-patch
手动解决任何合并冲突。
- (可选) git 推送
有时我会发现 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/5559896 和 http://schacon.github.io/git/git-read-tree.html#_sparse_checkout
实际上,我想我错过了一些东西 - 合并上游更改并不像我想象的那么难,因为 git 子树分裂是确定性的,即它为相同的子树分裂产生相同的 SHA1,无论有多少重复该过程的次数。
所以这是我的解决方案:
- 克隆 monorepo
将默认分支(master)重命名为其他名称,例如上游
git checkout master git branch -m upstream
从monorepo中拆分子目录
git checkout upstream git subtree split -P <subdirectory path> -b master
现在我们有一个主分支,其中只有与子目录路径相关的提交。
(可选) 设置master分支的remote并推送到GitHub.
现在如果上游 monorepo 添加了一些更改:
检查上游分支并拉取更改
git checkout upstream git pull
再分裂
git subtree split -P <subdirectory path> -b upstream-patch
查看修订图,你会看到新分支(upstream-patch)与master相关。
gitk master upstream-patch
现在只需将新分支合并到master
git checkout master git merge upstream-patch
手动解决任何合并冲突。
- (可选) git 推送