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

Prevent git-merge between unrelated branches from importing unwanted commit history

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

分支B(私有)一段时间以来一直是我的主要开发分支,并且包含各种提交,包括私有代码、专有算法和其他一些不能进行的事情public.

当我创建分支 G (public) 时,我不能简单地从 B(私有)分支出来,因为那样会使它的历史包含我列出的所有内容早些时候不能去 public,所以我从头开始创建了一个新分支(即没有父分支)。然后我简单地将所有文件完全按照它们从分支B(私有)导入(复制)到分支G(public)中,这是它的第一次提交。

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

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

因为我对 git 的工作原理(以及它应该如何使用)有了更多的了解,所以我想将 B 合并到 G(或者副- versa) 这样我就可以停止对每一次提交进行挑选。所以这是我尝试过的:

  1. 合并 BG:这将所有 B 的(私有)提交历史导入到 G,这是不可接受的,因为任何浏览 G 的提交历史的人都可以访问私人/敏感数据/算法。

  2. 合并 GB:这复制了 G(私有)上的所有精心挑选的提交,这很烦人但没什么大不了的.但这还不够,因为尝试将 B 合并到 G 之后仍然将所有 B 的(私有)提交历史导入到 G(不可接受)。我认为这将为 git 将用作未来从 BG 的合并的起点的那 2 个分支创建一个 "common parent",但事实并非如此。

  3. B 变基 G:与 1.

  4. 相同的问题
  5. G 变基 B:对于 G 中的每个提交,都会产生冲突,因此这被证明是不可撤销的。

TL;DR:我有 2 个分支 B,它是私有的并包含私有提交,G 是 public。这是他们的样子:

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

m 是从 GB 的合并提交。

我想 "import"、"merge" 或 "bring" 提交 nop(以及推送到的任何其他提交B) 到 G,无需一一挑选它们(将所有这些更改带到 G 的单个合并提交是可以接受的,只要它不带来所有 B之前的历史)。

我不确定我的问题是否有解决方案,但我们将不胜感激。

这些私人提交的性质是什么?它们是否包含在自己的文件中?我假设这是真的,因为你一直在挑选你的提交,我希望你不会经常处理 public algorithm/data 与 private algorithm/data.[=13 性质的合并冲突=]

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

如果您决定使用单独的存储库,则有两种可能的解决方案可以隐藏您的专有信息:

  1. environment/configuration 变量/私钥等秘密:无论如何,这些都不应该在您的版本控制系统中。用 .gitignore 中的一行来保护它们。如果您需要将这些信息传递给队友,请使用 VCS 以外的其他通信方式。这将保护您的数据免受无意中推送到 public 存储库,同时仍然允许单次推送。
  2. 私人classes/implementations:这很棘手。您显然不想 git 忽略它们。我可能会为此编写一个 git 插件,让我的团队可以执行 git public-push 或其他操作。这给了我们很大的灵活性,因为我们可以通过编程来决定什么构成了 private 文件,而不应该被推送到 public 仓库。或者,如果您对此有疑虑,您仍然可以审核并挑选您的提交。

TL;DR - 有一个单独的回购而不是一个单独的分支,也许是一个自定义 git 插件。这将允许您使用单个 git push(或用于自定义插件 git public-push 或其他东西)并且还可能允许外部贡献者为您的 public 回购 if/when 它变得有名: )

如前所述,真正的机密信息不应在 Git 存储库中,而应在某些保险库中(通过 Git 内容过滤器驱动程序,even though that can be challenging)。

至少要有一个单独的 Git 存储库,私有存储库引用 public one as a submodule