【发布时间】:2018-06-21 22:15:18
【问题描述】:
我可以指定 Git 提交哈希,而不是让 Git 生成它吗?
有可能吗?我在 Git 文档或网上都没有找到任何方法。
对于一些背景知识:我正在以编程方式从私有存储库重新创建一个新的 Git 公共存储库。我需要对每个提交进行大量更改以删除机密信息。但我想保留提交 ID。
【问题讨论】:
-
要补充所有答案,请考虑一下 - 根据定义,任意标识符不能是哈希值。
标签: git
我可以指定 Git 提交哈希,而不是让 Git 生成它吗?
有可能吗?我在 Git 文档或网上都没有找到任何方法。
对于一些背景知识:我正在以编程方式从私有存储库重新创建一个新的 Git 公共存储库。我需要对每个提交进行大量更改以删除机密信息。但我想保留提交 ID。
【问题讨论】:
标签: git
git commit hash 是一个加密校验和,它是根据你的存储库的状态计算出来的,包括存储库中所有文件的哈希、上一次提交的哈希、当前日期和时间等。
无法手动指定。
更多信息,请参阅this question。
【讨论】:
您可以使用git cat-file -p da500aa4f54cbf8f3eb47a1dc2c136715c9197b9 获得的提交内容(匿名;))(替换为您的一个提交的sha1):
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 是什么?
我确实相信这是可能的,尽管这需要一些时间和工作,而且是一种 hack。 确实,哈希是由以下值生成的:
但是,如果您可以牺牲其中一个值的一致性,则可以做到。
这是一个例子:https://github.com/vog/beautify_git_hash
它是一个脚本,它进行提交,然后寻找一个特定日期以使 git hash 成为您正在寻找的日期,然后对该日期进行修改。
【讨论】:
如果您对提交进行更改,ID 将会更改。(它们取决于提交内容本身,以及其中的更改)。
所以,不。
【讨论】:
git commit --amend --reset-author 之类的操作,它也会更改作者和 ID。跨度>