提交前了解git的哈希值?

27

有没有办法在提交之前知道提交的哈希值?


你为什么不能直接提交(commit),获取哈希值,然后重置(reset)——软重置(--soft)呢? - Carl Norum
1
我曾考虑过那样做,但是难道没有其他更好的方法吗? - Marcelo Liberato
总有办法,但需要一些技巧。你为什么需要哈希? - Carl Norum
7
这样做有很多好处,例如您想在代码编译后运行时将版本信息嵌入到数据中。看起来Git并不适用于为您的代码提供唯一哈希值。它已经发展得如此之多,以至于无法满足这样简单的功能。 - matanster
3个回答

20

你需要这个信息的可能原因是什么?如果你想将提交的哈希放入其自己的提交消息中,很抱歉告诉你,这是不可能的(或者至少会破坏SHA1)。提交消息是生成哈希时使用的其中一个部分,因此任何修改消息的尝试都将更改哈希。

无论如何,在提交之前找出提交的哈希几乎和实际提交、写下哈希值,然后丢弃提交(如卡尔·诺鲁姆在他的评论中建议的那样)没有什么区别。原因是哈希是通过制作提交对象并将其通过 SHA1 传递来生成的。因此,为了在不提交的情况下找到哈希,你必须手动走过提交流程,并SHA1处理结果,而不实际将对象写入磁盘。而且,这不仅相当不切实际,而且完全没有意义。


1
我以为GIT会有一种类似Subversion(例如$Revision$)的方法来做到这一点。 - Marcelo Liberato
3
在Subversion中,预测你要创建的提交的版本号非常容易。在Git中,这几乎是不可能的(除非你打算以某种方式破坏SHA1)。 - Lily Ballard
@MarceloLiberato 我从未使用过Subversion。我能否在Git仓库上使用Subversion,以获得更合适的版本编号,而不会造成混乱? - matanster
14
你为什么要对这个人讲课?这是一个合理的问题,不需要你在实际答案之间添加评判。 - wildeyes
1
@CatBoss 因为问题“你需要这个的可能原因是什么” 的答案决定了它是否不可能。 - Lily Ballard
显示剩余4条评论

18

提交哈希值取决于提交时间。

如果您在同一秒钟内进行了两次提交,更改相同、父级相同、作者和提交消息相同,则会获得相同的哈希值。否则,哈希值应该是不同的。


3
如果您只对提交的可预测引用感兴趣,而不关心完整哈希值,您可以在提交后使用lucky-commit自定义短哈希(前4到8个字符)为任何您喜欢的值。这也适用于GPG签名的提交。
注意事项:
  • 您固定的字符数越多,所需时间就越长,呈指数级增长。
  • 它必须在每次提交后运行。
  • 它将为本地存储库中的每个提交创建一个重复提交。请参见下面的示例:
% git log --oneline --graph         
* 0000003 (HEAD -> master) Third commit
* 0000002 Second commit
* 0000001 First commit
% git log --oneline --graph --reflog
* 4ef3899 Third commit
| * 0000003 (HEAD -> master) Third commit
|/  
* 0000002 Second commit
| * d756f59 Second commit
|/  
* 0000001 First commit
* a1e6be7 First commit

在进行提交之前找到提交哈希理论上是可能的,但需要深入了解 Git 的内部工作原理,并围绕此构建一个解决方案。您可以阅读《Git 魔法》第8章“揭示的秘密”中关于BlobTreeCommit的部分,以获得简要概述。

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