rga*_*eth 6 git github git-subtree ghost-blog
如果您希望在主项目中包含子项目但从不为上游贡献更改,则存在哪些优化(甚至包括 git subtree 的替代方案)?
实际用例:我将Ghost嵌入到现有的 express.js 网站中,例如嵌入 lib/Ghost。我需要对它进行一些黑客攻击,无论如何他们都不想贡献给上游的类型。对 Ghost 项目的任何正常贡献都将通过 GitHub 上的典型分叉完成,而不是从我的其他项目中完成。
因此,在最初将 Ghost 嵌入到我的项目中后,唯一发生的事情就是偶尔的本地源代码更改,以及有时从上游获取其主分支的更新。
在这种情况下, git subtree 是否仍然是一种合适的方法,如果是,那么是否有任何问题或简化适用,因为这种需要永远不会向上游做出贡献?因此,是否也可以将主 TryGhost/Ghost 存储库作为我的子树上游,而不是先分叉 Ghost 然后将分叉作为项目的上游?
Subtree 听起来非常适合我。
如果您要进行任何本地更改,我认为子树更适合子模块。
我能想到的唯一缺点是您的存储库中有子项目的完整副本,但除非它是一个巨大的项目,对于关心它的超级项目来说是可选的?
您不需要为子项目创建分支,只需:
git subtree add --prefix Ghost --squash -m "Adding Ghost." https://github.com/TryGhost/Ghost.git master
Run Code Online (Sandbox Code Playgroud)
从那时起,您可以自由地进行更改,而完全忽略它最初来自 Ghost depot 的事实。从上面的示例中可以看出,您甚至不需要添加遥控器。
如果您经常拉动,则可能需要创建遥控器。
git remote add ghost https://github.com/TryGhost/Ghost.git
git subtree pull --prefix=Ghost --squash -m "Updating Ghost." ghost master
Run Code Online (Sandbox Code Playgroud)最后,即使您稍后决定要回馈上游、分叉或任何地方,对您来说,只需将与子项目相关的部分拆分到一个分支中,然后推送更改,这真的很简单从该分支到 fork 存储库。
git subtree split -p Ghost -b Ghost-contrib-br --rejoin
# this should switch to the branch with only the ghost files
git push <remote-contrib-repo>
Run Code Online (Sandbox Code Playgroud)
注意:我没有使用,--squash
因为历史记录只会是你自添加或最后修改后的内容--rejoin
--rejoin
是一种蹩脚的 hack,它提交回您的超级项目,因此 split 命令知道下一个 split 的最佳起点。将来,我认为这将从 .git/config 的新部分进行管理(我什至可能自己这样做)。