指定Git提交哈希值

12

我能否指定Git提交哈希,而不是让Git生成它?

这是否可行?我在Git文档或在线上没有找到任何方法。


背景信息:我正在通过程序重新创建一个新的公共Git存储库,该存储库来自私有存储库。 我需要对每个提交做很多更改以删除机密信息。 但我想保留提交ID。


除了所有的答案之外,再想一想——按定义,任意标识符都不能是哈希值。 - j4nw
4个回答

7
以下是您可以使用 git cat-file -p da500aa4f54cbf8f3eb47a1dc2c136715c9197b9 命令获取的提交内容示例(已匿名化 ;)):
tree 48038c4d189536a0862a2c20ed832dc34bd1c8b2
parent f0bb5942f47193d153a205dc089cbbf38299dd1a
author Firstname Lastname <my@mail.com> 1513256382 +0100
committer Firstname Lastname <my@mail.com> 1515152927 +0100

This is a commit message

如果这些数据中的任何一个发生更改,所有的sha1都会发生更改:
- tree是从文件和目录内容计算出来的sha1值。 - Parent是父提交哈希值。 - 请注意,其中也包含日期,因此如果您在不同时间执行完全相同的提交,则sha1值也会更改。
PS:您可以继续使用命令git cat-file -p来继续探索tree并更好地了解git存储数据的方式。

da500aa4f54cbf8f3eb47a1dc2c136715c9197b9 是什么? - cst1992
我最近发布了一个工具'HashBeaf'(https://github.com/cnugteren/hashbeaf),可以自动更改数据(特别是日期),以便获得用户指定的提交哈希。如果你只想让你的提交以你喜欢的4个字符(例如`c0de`)开头,通常只需要向前推进一两分钟即可。 - undefined
@CNugteren,这很有趣,但你夸大了:你不能选择哈希,而是尝试生成一个哈希的一部分,即用户选择的十六进制字符串作为起始。而且这是暴力破解,不是我们日常工作流程中可以使用的东西。(你又重新发明了比特币的工作证明哈哈) - undefined
当我说“自动”时,我指的是从用户的角度来看。实际上,计算是蛮力的。但这并不妨碍我在日常工作中使用它:使用4位数字作为哈希的起始,计算时间几乎不可察觉,而更改提交时间通常在一两分钟之内。 - undefined
@CNugteren 我的评论并不是针对“自动”这一点,而是更多地关于“获取用户指定的提交哈希”,在这里用户不会选择整个提交,而只选择其开头部分。对于了解哈希或者Git工作原理的人来说,这是显而易见的,但对于初学者来说并不明显。你的评论和项目的README(故意地?)让人感到困惑。我甚至可以想象,使用相同的前缀越多,显示的缩写哈希将会越长(这是适得其反的)。 - undefined

7

Git提交哈希是从您的仓库状态计算出来的加密校验和,包括仓库中所有文件的哈希,上一个提交的哈希,当前日期和时间等。

无法手动指定它。

更多信息,请参见此问题


4
我相信这是可能的,但需要一些时间和工作,并且是一种hack方法。 确实,哈希是由值生成的,例如:
  • 内容
  • 提交日期
  • 之前提交的ID
  • ...
但是,如果您可以牺牲其中一个值的一致性,那么就可以实现。 以下是一个示例:https://github.com/vog/beautify_git_hash
这是一个脚本,它创建一个提交,然后查找特定日期以使git hash成为您要查找的hash值,然后使用此日期进行修改。

2

如果您更改提交内容,则提交的ID将会发生变化(它们取决于提交内容本身以及其中包含的更改内容)。

因此,不行。


这里所说的“提交内容”是指元数据,例如日期、作者姓名等。因此,即使您执行类似于git commit --amend --reset-author的操作,它也会更改作者和ID。 - cst1992

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接