git - 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 的提交消息?
我的限制和假设:
- 我可以改变提交信息
- 我只对 SHA 的前 7 个字符感兴趣(不是完整的 40 个字符)
- 我可以使用蛮力方法使我的小型提交示例看起来很漂亮
此外,我对“漂亮”的定义可能会有所不同,但至少类似于1111111
, 1111aaa
, abc1234
, 甚至fa1afe1
(一些 git 手册页中使用的最酷的示例)
解决方案
如果您将自己限制为哈希的一个小前缀,那么您确实可以这样做。Git 在其测试套件的多个地方执行此操作,以测试其对冲突短名称的处理。
然而,由于 SHA-1 被设计为与随机无法区分,因此每次提交创建 7 个具有特定值的十六进制数字的努力是 2^28。对完整哈希执行此操作在计算上是不可行的。
为此,您应该创建一些示例内容,使用GIT_AUTHOR_*
和GIT_COMMITTER_*
环境变量修复作者和提交者名称和时间戳,然后通过更改提交消息(例如,使用递增的数字)反复尝试创建提交。
你可能会更好地编写一个脚本来重复计算提交而不产生 Git 本身,因为这会更快,所以你需要通过使用git write-tree
索引的内容来合成树,然后合成其余的在脚本中使用固定值提交。您可以使用git cat-file commit HEAD
来查看提交的样子。
推荐阅读
- r - 我的功能不起作用,但我输入的值确实
- python - Discord.py - 即使我定义了命令 ping,也没有定义它
- ios - iOS 中的 UITouch 时间戳有多准确?
- reactjs - 如何使用 flexDirection 列处理 flexbox 中的宽度?
- javascript - 具有相同名称但不同索引的 Jquery 循环复选框
- c# - LINQ 使用 where 子句在 c# 中循环遍历不同的数组
- reactjs - MobX ReactJS AntD 更新不会重新渲染
- python - 编写一个函数以在缺少某些键或子键时从 dic 中提取信息
- angular - 更改 agm-circle 颜色
- ios - 沙箱未与 ionic 版本 6 中的 podfile.lock 同步