我需要在Git中创建一个具有不同SHA的等效提交对象。所有提交都是GPG签名。我知道我可以更改author + commit时间戳,但分辨率只有一秒,我们不允许偏离系统时钟超过一秒钟。我也无法更改提交消息,作者/提交者名称和电子邮件和/或用于签署提交的密钥。我可以更改提交的其他哪些字段以获取不同的提交消息?
动机:我们正在使用一个内部工具,如果两个属性引用相同的提交,由于某种原因不起作用,即使我们是故意设置它。
答案 0 :(得分:3)
问题的技术答案是:
散列数据包括:
TREE
对象哈希 - 提交内容的反映COMMIT
个对象哈希值改变TREE
可能会扩展"等效的"承诺。您已明确排除更改提交消息或作者/提交者信息。剩下的选项是提交父列表,但是否有任何意义可以谈论取决于你正在做什么。
因此,由于选项有限,让我们快速浏览一下这些(甚至是那些似乎被排除在外的):
TREE
对象:这唯一地表示内容 - 即您将在工作树中的哪些路径的哪些文件中看到哪些数据。乍一看,这似乎是必须保持不变的东西,以满足"等效提交"的最基本定义。当然,任何变化 - 无论多小,无论工作树中的哪个位置 - 都会改变散列,所以也许你可以专门针对nonce值楔入文件或目录来改变散列?
作者或提交者信息:首先要考虑的问题:不要触摸姓名的要求有多敏感?你能不能在名字的末尾加上一个看不见的字符并且没问题,或者他们是否必须逐位匹配?
或者,那些时间戳......说你不能从系统时钟变化,当提交时间戳定义为提交创建时间时,无论如何,除非你试图创建几个,否则看起来很迂腐等同于一次提交。即使你需要同时使用两个,你也应该能够在不超出容忍度的情况下做到这一点。
提交消息:同样,要求不改变这一要求有多严格?你能用新行,或者至少是一个看不见的角色吗?
家长提交:如果您仍然处于以上所有方面,那么这里还有什么。这真的归结为 的提交是什么?重复提交是否具有相同的父级?
P -- A
\
A'
在这种情况下,你无法在这里做任何事情。但另外,如果它是并行的提交树:
P -- A
P' -- A'
那么,您需要做的就是使用以某种方式不同的根提交为每个树播种。提交消息,例如" Root commit 1"," Root commit 2",...,例如?