如何手动指定一个 git commit sha?

How to manually specify a git commit sha?

This answer 说明通常 git 提交 SHA 是根据各种参数生成的。但是,我想知道:如何指定 custom/particular/specific git 提交 sha(在 Bash 中)?

例如,假设要使用以下 sha 创建并推送对 Git 的提交:

1e23456ffd118db9dc04caf40a442040e5ec99f9

(为简单起见,假设可以假设它是一个唯一的 sha)。

XY 问题是两个不同 Git 服务器之间的手动镜像脚本。简单地拥有相同的提交 SHA 比在 Git 服务器之间保持提交映射更方便。这是因为如果我可以跳过 source 服务器的某些提交,手动镜像会更有效(节省计算时间和服务器带宽)。然而,这意味着父级在 target 服务器中提交更改,相对于 source 服务器中的相同提交。反过来,这意味着 SHA 发生了变化,这将需要我跟踪 sourcetarget 服务器中 sha 的映射。简而言之,简单地覆盖提交到 target 服务器的 sha 会比确保两个服务器具有完全相同的提交(对于实际镜像的少数提交)更方便。

提交 SHA 不仅仅是基于这些参数“正常”生成的,它是根据定义这些参数的散列。 “SHA”是用于生成它的哈希算法的名称。

与其尝试更改 提交哈希值,不如寻找一种有效的方法来跟踪 它们。一种方法类似于 git svn 等插件的工作方式:

  • 将提交复制到镜像时,将原始提交哈希记录为新提交的提交消息的一部分。
  • 可能,因为您正在“跳过”原始回购中的提交,每个新提交都应该有 多个 源哈希,因为它会像“挤压”那些提交。
  • 有一个脚本可以处理 git log 的结果并提取这些记录的提交哈希。然后,在确定要从源复制的新提交时,可以使用它代替真正的提交哈希。

但是,请确保这一切都是值得的:如果最终更改全部包括在内,那么 git 现有的重复数据删除和压缩可能意味着“跳过”提交的开销相当低。

从 CodeCaster 的评论来看,我似乎可以在 `git commit -m "some message" 中使用提交消息中的可自由选择的位来确保提交的 sha 以特定的结尾值。

但是,根据 Lasse V. Karlsen 的评论,我认为这种方法需要非线性计算资源。我没有详细说明,但是我 imagine/assume 随着提交历史的增长,提交消息的(有限 (5mb) )自由选择位的相对影响变得更小。我想这可以解释为什么在提交消息中利用这些可自由选择的位变得昂贵。

所以在实践中,答案似乎是:“你可以(也许,如果你花费大量的计算资源),但你不应该。”。

既然你已经在你的问题中概述了你有处理分歧的方法,我会假设这个问题是真的只有 这个:

I would like to know: how can one specify a custom/particular/specific git commit sha (in Bash)?

而不是“或者你有任何其他想法可以代替”。

对于这个问题,答案其实很简单:

你不能。


Git 不只是计算提交 ID,因为这只是所选实现的副产品。它的完成方式是核心概念 git 的设计方式。

提交 ID 是根据提交的内容计算的,正如您所观察到的,这包括对父级的 link。更改父项但保持其他所有内容相同,提交 ID 仍会更改。

这是版本控制系统分布式部分工作方式的核心,无法更改。

您根本无法更改提交的 ID 并保持其内容不变。 这是设计使然

已经有人尝试通过仔细构建最终具有相同 ID 的不同提交来进行提交冲突。

下面是这样一次成功的尝试(碰撞):https://www.theregister.com/2017/02/23/google_first_sha1_collision/

First ever' SHA-1 hash collision calculated. All it took were five clever brains... and 6,610 years of processor time

我认为还没有人成功地进行任意提交,然后将其定位到特定的提交 ID。碰撞是通过根据非常具体的标准同时操纵两个提交来精心构建的,这样它们就可以到达相同的 id,但该 id 不是由研究选择的。

TL;DR: 做不到

虽然产生的冲突的最终效果是 Git 将在某个时候远离 SHA-1,并转向产生更长、“更安全”(tm) 的系统比我们今天拥有的哈希。由于Git还想向后兼容现有的存储库,因此这项工作尚未完全完成。

how can one specify a custom/particular/specific git commit sha (in Bash)?

不能。正如您所说,提交哈希是通过将各种值散列在一起而构造的值,重点是唯一标识特定提交。您可以在不同的时间在不同的机器上提交同一组文件,最终会得到不同的提交哈希值。

确保您在两台不同机器上具有相同提交的方法是 git pull(或类似)将这些提交从一台机器提交到另一台机器。 您不一定必须移动 all 提交——例如,您可以压缩它们或仅挑选某些提交。