【发布时间】:2016-07-29 03:23:17
【问题描述】:
我想从 GIT 日志中以缩写格式获取 SHA 编号。此命令将起作用:
git log -1 --format=%h
但是,默认的缩写格式是长度为 7 个数字。 有什么办法可以改变吗?
【问题讨论】:
标签: git
我想从 GIT 日志中以缩写格式获取 SHA 编号。此命令将起作用:
git log -1 --format=%h
但是,默认的缩写格式是长度为 7 个数字。 有什么办法可以改变吗?
【问题讨论】:
标签: git
您可以通过以下方式获得完整的哈希:
git log -1 --format=%H
您还可以使用任意数量的字符,例如 6 位:
git log -1 --format=%h --abbrev=6
要测试 repo 的哈希值饱和程度,请执行以下操作:
git rev-list --all --abbrev=0 --abbrev-commit |
awk '{ a[length] += 1 } END { for (len in a) print len, a[len] }'
我希望这会有所帮助:D
【讨论】:
对于git log,--abbrev=<length> 参数控制%h 和其他缩写哈希的输出多长时间:
$ git log -1 --format=%h --abbrev=4
d157
我还要注意,当使用-1(或--no-walk,在这种特殊情况下具有相同的效果,但如果您指定多个提交标识符时更有用),如果您想要的只是提交 散列,使用git log 是多余的:git rev-parse 会得到你的散列。没有明显的原因,将git rev-parse 的提交ID 限制为特定长度的控制旋钮拼写为--short 而不是--abbrev;如果你的意思是HEAD,git rev-parse 要求你拼出HEAD,所以:
$ git rev-parse --short=4 HEAD
d157
最长的很长,目前40个字符,未来可能64个。 曾经 最短的是四个字符,可以在很小的存储库中使用。但是您可以在某些特定存储库中找到的最短字符可能超过四个字符。
对于输出,您可以要求--short 或--abbrev 长度为您想要的任何值。太小或太大的值将根据需要提高或降低。 (请注意,在真正古老的 Git 版本中,如果您要求,它可能会向您显示四个字符哈希,即使它们太短而无法明确。当前的 Git 更智能。)
当您自己提供至少四个字符的缩短原始哈希 ID 时,如果它太短,您将收到如下错误:
$ git rev-parse 1111
error: short SHA1 1111 is ambiguous
hint: The candidates are:
hint: 111116ea13 blob
hint: 1111f64dd9 blob
1111
fatal: ambiguous argument '1111': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
旧版本的 Git 对错误消息的处理并没有那么好;这个——如果你阅读了hint: 输出行——告诉你至少需要11111 或1111f 来选择一个可能的结果,它来自Git 2.27.0。
由于 Git 存储库会随着时间的推移而增长,因此可以在存储库生命周期的早期使用一个非常短的哈希 ID,然后在以后(比如五年后)发现这个短哈希 ID 现在是不明确的。例如,Linux 内核现在已经达到git log --oneline 使用 12 个字符以确保安全的程度。如果您设置一个非常短的--abbrev,git log 输出将具有不同的输出散列大小,因为每个散列大小都会扩展到必要的最小值:
$ git log --oneline -n 12 --abbrev=4
0f1a7b (HEAD -> master) timer-of: don't use conditional expression with mixed 'void' types
5021b9 Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
714366 Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
65aa35 Merge tag 'erofs-for-5.4-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs
3fd57e7 char/random: Add a newline at the end of the file
请注意如何将提交 0f1a7b3fac0583083ca19d4de47403511ced3521 缩短为 0f1a7b(六个字符),但提交 3fd57e7a9e66b9a8bcbf0560ff09e84d0b8de1bd 需要七个(3fd57e7)。目前有两个对象以3fd57e 作为其哈希 ID 的前六个十六进制数字:一个提交对象和一个树对象。随着时间的推移,随着越来越多的对象在 Linux 内核存储库中积累,即使 3fd57e7 也可能变得模糊不清。
【讨论】:
git log -1 --format=%h --abbrev=6,但它仍然返回 7 个数字。我的 GIT 是 1.7.1
git log -5 --format=%h --abbrev=5 我看到这些:7ee2f 89e8 8cc16 9f809 d8ac
core.abbrev)。如果需要,一些(但不是全部)代码将超过 7 个。另请参阅the 2.11 release notes。