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

问题描述 投票:1回答:2

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

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

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

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

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

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

  1. B合并到G:这将B的所有(私有)提交历史记录导入G,这是无法辨认的,因为浏览G的提交历史记录的任何人都可以访问私有/敏感数据/算法。
  2. 合并GB:这复制了所有在G(私人)上挑选的樱桃,这很烦人但不是什么大不了的事。但这还不够,因为在此之后将B合并到G仍然将所有B的(私人)提交历史导入G(不可接受)。我认为这将为那些git将用作未来从BG合并的起点的2个分支创建一个“共同的父”,事实并非如此。
  3. G重新排列B:与1相同的问题。
  4. B重新排列G:对于G的每次提交,都会产生冲突,所以这被证明是可以撤销的。

TL; DR:我有2个分支B是私有的,包含私有提交和G是公共的。这是他们看起来的样子:

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

m是从GB的合并提交。

我想“导入”,“合并”或“带来”提交nop(以及任何其他提交到B的提交)到G,而不是逐个挑选它们(一个合并提交将所有这些更改带到G是可以接受的,只要它没有带来所有B以前的历史)。

我不确定是否有我的问题的解决方案,但任何帮助表示赞赏。

git git-branch git-merge branching-and-merging
2个回答
1
投票

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

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


2
投票

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

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

如果您决定单独进行回购,那么您的专有信息隐藏有两种可能的解决方案:

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

TL; DR - 有一个单独的repo而不是一个单独的分支,也许是一个自定义的git插件。这将允许您使用单个git push(或自定义插件git public-push或其他东西),如果/当它成名时,也可能允许外部贡献者到您的公共回购:)

© www.soinside.com 2019 - 2024. All rights reserved.