如果您希望在主项目中包含子项目但从不在上游进行更改,那么存在哪些优化(甚至包括git子树的替代方法)?
实际使用案例:我将Ghost嵌入现有的express.js网站,例如进入lib / Ghost。我需要对它进行一些攻击,无论如何他们不希望上游贡献的类型。 Ghost项目的任何正常贡献都将通过GitHub上的典型分支来完成,而不是来自我的其他项目。
因此,在将Ghost初始嵌入到我的项目中之后,唯一发生的事情是偶尔的本地源代码更改,有时还会从上游获取来自其主分支的更新。
在这种情况下,git子树仍然是一种合适的方法,如果是,那么是否存在任何可能适用的问题或简化,因为这种需要永远不会贡献上游?因此,是否有可能将主要的TryGhost / Ghost存储库作为我的子树上游,而不是首先分配Ghost然后将fork作为项目的上游?
答案 0 :(得分:3)
Subtree听起来非常适合我。
如果您正在进行任何本地更改,我认为子树比子模块更适合。
我能想到的唯一缺点是你的存储库中有子项目的完整副本,但除非这是一个巨大的项目,对于那些关心它的超级项目是可选的吗?
您不需要为子项目创建分支,只需:
git subtree add --prefix Ghost --squash -m "Adding Ghost." https://github.com/TryGhost/Ghost.git master
您可以从该点开始自由地进行更改,并完全忽略它最初来自Ghost库的事实。您甚至不需要添加遥控器,正如您在上面的示例中所知道的那样。
如果经常拉,可能需要创建遥控器。
git remote add ghost https://github.com/TryGhost/Ghost.git
git subtree pull --prefix=Ghost --squash -m "Updating Ghost." ghost master
最后,即使您稍后决定要向上游,分叉或任何地方做出贡献,您只需将与子项目相关的部分拆分为分支即可然后只需将更改从该分支推送到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>
注意:我没有使用--squash
,因为历史记录将只是自添加或上次--rejoin
以来您修改的内容
--rejoin
是一种蹩脚的黑客,它会返回你的超级项目,因此split命令知道下一次拆分的最佳起点。在将来,我认为这将通过.git / config的新部分进行管理(我甚至可以自己制作)。