如果从不为上游做出贡献,git 子树会简化吗?

rga*_*eth 6 git github git-subtree ghost-blog

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

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

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

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

joh*_*003 6

Subtree 听起来非常适合我。

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

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