10 hex digit git hash 缩写就够了吗?

Is 10 hex digit git hash abbreviation enough?

需要多少个可能的哈希值才能避免 N 项之间的冲突?如果你还记得 birthday paradox,答案比 N 小得多。

我们反问一下:对于N=16^10个可能的hash值,对应10个hex digits的缩写git revision codes,有多少个revision的概率修订哈希重合度上升到 50%?直接计算表明,如果你有 1234603 个修订,其中两个具有相同 10-digit 哈希的概率是 50%。

现在,在大型活跃存储库中进行一百万次左右的修订并非闻所未闻。这里有人在您的工作中遇到过 git 哈希冲突吗?从理论上讲,那应该发生。

Git 随着对象数量的增加自动缩放缩写哈希的长度,因此这通常不是问题。此外,如果缩写的散列在正常长度下会产生歧义,Git 将自动产生一个更长的、明确的值。如果您需要特定值,某些命令允许您使用名为 --abbrev 的选项控制缩写的长度,并且 core.abbrev 选项可以覆盖默认值。

但是,这些名称在创建时必须是唯一的,因此如果您正在生成需要使用修订版的工具,它们应该始终对完整的对象 ID 进行操作。另请注意,切换到使用 SHA-256 的工作正在进行中,因此您在编写工具时不应假设特定完整对象 ID 的长度。

如“How much of a Git SHA is generally considered necessary to uniquely identify a change in a given codebase?", you can get the minimum required length with git rev-parse --short

中所述
 git rev-parse --short=4

但是如果你想确定,并且只使用完整的长度:

使用 Git 2.31(2021 年第一季度),可以将配置变量 'core.abbrev' 设置为 'no' 以强制不使用缩写,而不管哈希算法如何。

这在 时很重要。

参见 commit a9ecaa0 (01 Sep 2020) by Eric Wong (ele828)
(由 Junio C Hamano -- gitster -- in commit 6dbbae1 合并,2021 年 1 月 15 日)

core.abbrev=no: disables abbreviations

Signed-off-by: Eric Wong

This allows users to write hash-agnostic scripts and configs by disabling abbreviations.

Using "-c core.abbrev=40" will be insufficient with SHA-256, and "-c core.abbrev=64" won't work with SHA-1 repos today.

[jc: tweaked implementation, added doc and a test]

git config 现在包含在其 man page 中:

If set to "no", no abbreviation is made and the object names are shown in their full length.