如何在git中使用新SHA创建提交?

时间:2017-10-20 19:59:25

标签: git commit gnupg sha

我需要在Git中创建一个具有不同SHA的等效提交对象。所有提交都是GPG签名。我知道我可以更改author + commit时间戳,但分辨率只有一秒,我们不允许偏离系统时钟超过一秒钟。我也无法更改提交消息,作者/提交者名称和电子邮件和/或用于签署提交的密钥。我可以更改提交的其他哪些字段以获取不同的提交消息?

动机:我们正在使用一个内部工具,如果两个属性引用相同的提交,由于某种原因不起作用,即使我们是故意设置它。

1 个答案:

答案 0 :(得分:3)

问题的技术答案是:

散列数据包括:

  • 您无法控制的标题(也就是说,无论如何,都来自我即将提及的其他数据)
  • 提交的TREE对象哈希 - 提交内容的反映
  • COMMIT个对象哈希值
  • 作者姓名,电子邮件,时间戳
  • 提交者姓名,电子邮件,时间戳
  • 提交消息

改变TREE可能会扩展"等效的"承诺。您已明确排除更改提交消息或作者/提交者信息。剩下的选项是提交父列表,但是否有任何意义可以谈论取决于你正在做什么。

因此,由于选项有限,让我们快速浏览一下这些(甚至是那些似乎被排除在外的):

TREE对象:这唯一地表示内容 - 即您将在工作树中的哪些路径的哪些文件中看到哪些数据。乍一看,这似乎是必须保持不变的东西,以满足"等效提交"的最基本定义。当然,任何变化 - 无论多小,无论工作树中的哪个位置 - 都会改变散列,所以也许你可以专门针对nonce值楔入文件或目录来改变散列?

作者或提交者信息:首先要考虑的问题:不要触摸姓名的要求有多敏感?你能不能在名字的末尾加上一个看不见的字符并且没​​问题,或者他们是否必须逐位匹配?

或者,那些时间戳......说你不能从系统时钟变化,当提交时间戳定义为提交创建时间时,无论如何,除非你试图创建几个,否则看起来很迂腐等同于一次提交。即使你需要同时使用两个,你也应该能够在不超出容忍度的情况下做到这一点。

提交消息:同样,要求不改变这一要求有多严格?你能用新行,或者至少是一个看不见的角色吗?

家长提交:如果您仍然处于以上所有方面,那么这里还有什么。这真的归结为 的提交是什么?重复提交是否具有相同的父级?

P -- A
 \
  A'

在这种情况下,你无法在这里做任何事情。但另外,如果它是并行的提交树:

P -- A

P' -- A'

那么,您需要做的就是使用以某种方式不同的根提交为每个树播种。提交消息,例如" Root commit 1"," Root commit 2",...,例如?