首页 > 解决方案 > Git 构造了一个特定的提交 shat,它在示例中看起来不错,用于教育目的

问题描述

出于培训目的,我想创建一个带有一些易于阅读的提交 sha 值的 Git 存储库。例子:

* 2222222 second commit on main branch
| * bbbbbbb commit on branch B
|/  
*   1111111 first commit in repository

我知道每个 SHA 都是 blob、文件名(树)和提交消息(包括作者姓名/电子邮件)的唯一组合。为了使事情可重现,我们不会对提交进行签名(因为这还将在提交 sha 中包含签名密钥和提交时间)

鉴于我可以改变提交信息,我的问题是:

对于任何给定的树 blob 组合,如何创建具有特定提交 SHA 的提交消息?

我的限制和假设:

此外,我对“漂亮”的定义可能会有所不同,但至少类似于1111111, 1111aaa, abc1234, 甚至fa1afe1(一些 git 手册页中使用的最酷的示例)

标签: git

解决方案


如果您将自己限制为哈希的一个小前缀,那么您确实可以这样做。Git 在其测试套件的多个地方执行此操作,以测试其对冲突短名称的处理。

然而,由于 SHA-1 被设计为与随机无法区分,因此每次提交创建 7 个具有特定值的十六进制数字的努力是 2^28。对完整哈希执行此操作在计算上是不可行的。

为此,您应该创建一些示例内容,使用GIT_AUTHOR_*GIT_COMMITTER_*环境变量修复作者和提交者名称和时间戳,然后通过更改提交消息(例如,使用递增的数字)反复尝试创建提交。

你可能会更好地编写一个脚本来重复计算提交而不产生 Git 本身,因为这会更快,所以你需要通过使用git write-tree索引的内容来合成树,然后合成其余的在脚本中使用固定值提交。您可以使用git cat-file commit HEAD来查看提交的样子。


推荐阅读