在远程压缩后提取旧的提交 ID

Extract old commit IDs after squash in remote

在我们的本地 Bitbucket 实例上,我可以通过压缩功能分支的所有更改(通过 Git 变基)将功能分支“合并”到我们的主分支中。这样做时,提交消息包含所有压缩提交的 Git 提交 IDs/hashes。此提交附加到主分支,功能分支将被删除。

我曾怀疑删除功能分支时旧的提交也会被删除,但事实并非如此。由于主分支上的提交消息包含所有压缩提交的提交 ID,因此我能够通过 URL 访问 Bitbucket 中的每一个旧提交。但是,由于提交不再属于分支,我无法从 UI 中找到提交 - 无论是在 Bitbucket 中还是来自任何其他 Git 客户端 UI.

所以现在来自功能分支的压缩提交只是“隐藏”,但它们仍然存在于 Git 存储库中。

现在我的(学术性的)问题:

  1. 总是这样吗? Git 是否始终保留压缩的提交,即使以前关联的分支已被删除?
  2. 有什么方法可以提取以前压缩的提交的提交 ID,即使“旧”提交 ID 不属于压缩的提交消息的一部分?
  3. 是否可以“硬删除”旧提交?

提前致谢!

  1. Is this always the case? Does Git always keep the squashed commits, even if the formerly associated branch has been deleted?

没有。 Git 可能会或可能不会保留原始提交一段时间,甚至永远,但是对此没有硬性规定,除了通常情况:如果提交是 reachable(通过一些名称,例如分支或标签名称),它必须被保留。

(GitHub 有自己的简单规则:永远不会删除任何提交。这可以解决您使用的分叉模型可能遇到的一些问题。Bitbucket 可能添加也可能不添加相同的规则他们自己。这个规则有一些缺点,这可能会导致这些托管站点执行更奇特的规则,最终允许删除未引用的提交。)

  1. Is there any way that I can extract the commit IDs of formerly squashed commits, even if the "old" commit IDs wouldn't be part of the squashed commit message?

没有

  1. Would it be possible to "hard delete" the old commits?

仅当您可以直接控制存储库时。在这种情况下,您可以使用某些维护命令(git gcgit prune 等)。

您也可以克隆存储库,然后删除原始存储库(如果您有正确的访问/权限,安装新的克隆 代替 原始存储库,使整个“局外人”看不到操作,除非停机时间有多长才能完成所有这些操作)。克隆通常 不会 复制任何未引用的(“除了哈希 ID 之外不可见”,名义上已删除)提交,因此这为您提供了一种在错误后清理的简单方法。但这通常意味着使用镜像克隆并直接登录访问托管存储库的任何站点。