6

如果您希望在主项目中包含子项目但从不向上游贡献更改,那么存在哪些优化(甚至包括 git subtree 的替代品)?

实际用例:我将Ghost嵌入到现有的 express.js 网站中,例如 lib/Ghost。我需要对它进行一些修改,无论如何他们都不希望在上游贡献这种类型。对 Ghost 项目的任何正常贡献都将通过 GitHub 上的典型分叉完成,而不是从我的其他项目中完成。

因此,在最初将 Ghost 嵌入到我的项目中之后,唯一发生的事情就是偶尔会更改本地源代码,有时还会从上游获取来自其主分支的更新。

在这种情况下, git subtree 是否仍然是一种合适的方法,如果是,那么是否存在任何适用的陷阱或简化,因为这需要永远不会向上游贡献?因此,是否也可以将主 TryGhost/Ghost 存储库作为我的上游子树,而不是先分叉 Ghost,然后将分叉作为项目的上游?

4

1 回答 1

6

Subtree 听起来非常适合我。

如果您要进行任何本地更改,我认为子树更适合子模块。

  1. 克隆您的项目的任何人都不需要像使用子模块那样运行其他命令。
  2. 您所做的任何更改都将直接对您的子项目副本进行,并且不需要像使用子模块一样推送到公共存储库以供其他人访问,以便人们同步这些更改。
  3. 从上游拉出来是小菜一碟,如果其他人在你的项目上没有 git 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 的新部分进行管理(我什至可以自己做)。

于 2014-03-03T02:24:51.150 回答