防止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) 这样我就可以停止对每一次提交进行挑选。所以这是我尝试过的:
合并 B
到 G
:这将所有 B
的(私有)提交历史导入到 G
,这是不可接受的,因为任何浏览 G
的提交历史的人都可以访问私人/敏感数据/算法。
合并 G
到 B
:这复制了 G
(私有)上的所有精心挑选的提交,这很烦人但没什么大不了的.但这还不够,因为尝试将 B
合并到 G
之后仍然将所有 B
的(私有)提交历史导入到 G
(不可接受)。我认为这将为 git 将用作未来从 B
到 G
的合并的起点的那 2 个分支创建一个 "common parent",但事实并非如此。
从 B
变基 G
:与 1.
相同的问题
从 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
是从 G
到 B
的合并提交。
我想 "import"、"merge" 或 "bring" 提交 n
、o
、p
(以及推送到的任何其他提交B
) 到 G
,无需一一挑选它们(将所有这些更改带到 G
的单个合并提交是可以接受的,只要它不带来所有 B
之前的历史)。
我不确定我的问题是否有解决方案,但我们将不胜感激。
这些私人提交的性质是什么?它们是否包含在自己的文件中?我假设这是真的,因为你一直在挑选你的提交,我希望你不会经常处理 public algorithm/data 与 private algorithm/data.[=13 性质的合并冲突=]
我可以建议不要为此使用分支,而是使用单独的存储库吗?如果您关心保护您的数据和算法,请考虑如果另一个团队成员 rebases/merges 失误会发生什么?此外,如果您有单独的存储库,审计和访问控制会变得更加容易,因为大多数 git 服务器在存储库级别而不是分支级别运行。
如果您决定使用单独的存储库,则有两种可能的解决方案可以隐藏您的专有信息:
- environment/configuration 变量/私钥等秘密:无论如何,这些都不应该在您的版本控制系统中。用 .gitignore 中的一行来保护它们。如果您需要将这些信息传递给队友,请使用 VCS 以外的其他通信方式。这将保护您的数据免受无意中推送到 public 存储库,同时仍然允许单次推送。
- 私人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。
我有 2 个分支,B
(私有)和 G
(public)。
分支B
(私有)一段时间以来一直是我的主要开发分支,并且包含各种提交,包括私有代码、专有算法和其他一些不能进行的事情public.
当我创建分支 G
(public) 时,我不能简单地从 B
(私有)分支出来,因为那样会使它的历史包含我列出的所有内容早些时候不能去 public,所以我从头开始创建了一个新分支(即没有父分支)。然后我简单地将所有文件完全按照它们从分支B
(私有)导入(复制)到分支G
(public)中,这是它的第一次提交。
从那时起,我一直在分支 B
(私有)上开发,每当有新的提交时,我都会将其挑选到 G
(public)上。
所有这些都是在我开始 git 的时期完成的,所以,我知道我可能会以更好的方式完成它,但是这艘船已经航行了很长时间。
因为我对 git 的工作原理(以及它应该如何使用)有了更多的了解,所以我想将 B
合并到 G
(或者副- versa) 这样我就可以停止对每一次提交进行挑选。所以这是我尝试过的:
合并
B
到G
:这将所有B
的(私有)提交历史导入到G
,这是不可接受的,因为任何浏览G
的提交历史的人都可以访问私人/敏感数据/算法。合并
G
到B
:这复制了G
(私有)上的所有精心挑选的提交,这很烦人但没什么大不了的.但这还不够,因为尝试将B
合并到G
之后仍然将所有B
的(私有)提交历史导入到G
(不可接受)。我认为这将为 git 将用作未来从B
到G
的合并的起点的那 2 个分支创建一个 "common parent",但事实并非如此。从
B
变基G
:与 1. 相同的问题
从
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
是从 G
到 B
的合并提交。
我想 "import"、"merge" 或 "bring" 提交 n
、o
、p
(以及推送到的任何其他提交B
) 到 G
,无需一一挑选它们(将所有这些更改带到 G
的单个合并提交是可以接受的,只要它不带来所有 B
之前的历史)。
我不确定我的问题是否有解决方案,但我们将不胜感激。
这些私人提交的性质是什么?它们是否包含在自己的文件中?我假设这是真的,因为你一直在挑选你的提交,我希望你不会经常处理 public algorithm/data 与 private algorithm/data.[=13 性质的合并冲突=]
我可以建议不要为此使用分支,而是使用单独的存储库吗?如果您关心保护您的数据和算法,请考虑如果另一个团队成员 rebases/merges 失误会发生什么?此外,如果您有单独的存储库,审计和访问控制会变得更加容易,因为大多数 git 服务器在存储库级别而不是分支级别运行。
如果您决定使用单独的存储库,则有两种可能的解决方案可以隐藏您的专有信息:
- environment/configuration 变量/私钥等秘密:无论如何,这些都不应该在您的版本控制系统中。用 .gitignore 中的一行来保护它们。如果您需要将这些信息传递给队友,请使用 VCS 以外的其他通信方式。这将保护您的数据免受无意中推送到 public 存储库,同时仍然允许单次推送。
- 私人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。