防止不相关分支之间的git-merge导入不需要的提交历史记录

时间:2017-12-24 12:16:59

标签: git git-branch git-merge branching-and-merging

我有2个分支,B(私有)和G(公开)。

分支B(私有)一段时间以来一直是我的主要开发分支,并包含各种提交,包括私有代码,专有算法和其他一些无法公开的东西。

当我创建分支G(公共)时,我不能简单地从B(私有)分支,因为这会使它的历史记录包含我之前列出的那些不能去的东西public,所以我从头开始创建了一个新的分支(也就是说,没有父代)。然后我简单地将所有文件从分支B(私有)导入(复制)到分支G(公共),这是它的第一次提交。

从那时起,我一直在开发分支B(私有),每当提交新的提交时,我都会把它挑选到G(公开)。

所有这一切都是在我开始git的时候完成的,所以,我知道我可能会以更好的方式完成它,但是这艘船已经长航了。

由于我已经了解了git如何工作(以及它应该如何使用)的更多信息,我想将B合并到G(反之亦然),这样我就可以停止了挑选每一次提交。所以这就是我尝试过的:

  1. B合并到G:这会将所有B的(私有)提交历史记录导入G,这是无法辨认的,因为任何人都在浏览{{ 1}}的提交历史记录可以访问私有/敏感数据/算法。

  2. G合并到G:这复制了B(私有)上所有选择的樱桃提交,这很烦人但不是什么大不了的事。但这还不够,因为在此之后尝试将G合并到B仍然将所有G的(私有)提交历史记录导入B(不可接受)。我认为这会为那些git用作未来从GB合并的起点的2个分支创建一个“共同父”,但实际情况并非如此。

  3. G重新G:与1相同的问题。

  4. B重新B:对于G中的每次提交,都会产生冲突,因此事实证明这是冲突的。

  5. TL; DR:我有2个分支G,它是私有的,包含私有提交,B是公共的。这就是他们的样子:

    `B` (private): a -- b -- c -- d -- m -- n -- o -- p
    `G` (public): w -- x -- y  --  z -/
    

    G是从mG的合并提交。

    我想“导入”,“合并”或“提交”提交Bno(以及推送到p的任何其他提交){ {1}},没有一个接一个地挑选它们(只要它没有带来B以前的所有历史记录,单个合并提交将所有这些更改带到G是可以接受的。它)。

    我不确定我的问题是否有解决办法,但感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这些私人提交的性质是什么?它们是否自包含在自己的文件中?我假设这是真的,因为你一直在挑选你的提交,我希望你不会经常处理公共算法/数据与私有算法/数据的性质的合并冲突。

我可以建议不要使用分支,而是使用单独的存储库吗?如果您关心保护您的数据和算法,请考虑如果另一个团队成员错误地重组/合并某些内容会发生什么?此外,如果您有单独的repos,审计和访问控制会变得更加容易,因为大多数git服务器都在repo级别而不是分支级别上运行。

如果您决定单独进行回购,可以使用两种可能的方法来隐藏您的专有信息:

  1. 环境/配置变量/私钥等秘密:无论如何,这些都不应该在您的版本控制系统中。用.gitignore中的一行来保护它们。如果您需要将这些传递给队友,请使用除VCS之外的其他通信方式。这样可以保护您的数据免受无意中推送到公共回购,同时仍允许一次推送。
  2. 私有类/实现:这很棘手。你显然不想要gitignore他们。我可能会为此编写一个git插件,允许我的团队执行git public-push或其他操作。这为我们提供了很大的灵活性,因为我们可以以编程方式决定什么构成私有文件,不应该被推送到公共回购。或者,如果你对此有偏执,你仍然可以审核并挑选你的提交。
  3. TL; DR - 有一个单独的repo而不是一个单独的分支,也许是一个自定义的git插件。这将允许您使用单个git push(或自定义插件git public-push或其他内容),并且如果/当它成名时,也可以允许外部贡献者使用您的公共回购:)

答案 1 :(得分:1)

如上所述,真正的机密信息不应该在Git仓库中,而应该在某个金库中(通过Git内容过滤器驱动程序,even though that can be challenging)。

具有单独的Git仓库是最小的,私人仓库引用公共one as a submodule