【问题标题】:git log abbreviated format lengthgit log 缩写格式长度
【发布时间】:2016-07-29 03:23:17
【问题描述】:

我想从 GIT 日志中以缩写格式获取 SHA 编号。此命令将起作用:

git log -1 --format=%h

但是,默认的缩写格式是长度为 7 个数字。 有什么办法可以改变吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    您可以通过以下方式获得完整的哈希:

    git log -1 --format=%H
    

    您还可以使用任意数量的字符,例如 6 位:

    git log -1 --format=%h --abbrev=6
    

    编辑 1:

    要测试 repo 的哈希值饱和程度,请执行以下操作:

    git rev-list --all --abbrev=0 --abbrev-commit |
        awk '{ a[length] += 1 } END { for (len in a) print len, a[len] }'
    

    我希望这会有所帮助:D

    【讨论】:

    • 这将如何提供具有任意数量字符的缩写哈希,如 OP 请求的?这将给出不是请求的完整哈希。
    • @Vampire 我也编辑并添加了任意选项。
    • @Fabricio:我尝试了第二个命令,但结果是 7 个字符。会不会是 GIT 版本依赖?
    • @ilya1725 那么在这种情况下,您的哈希完全饱和了 4 位数。请尝试我添加到答案中的命令以尝试存储库的饱和度。
    【解决方案2】:

    对于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;如果你的意思是HEADgit 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: 输出行——告诉你至少需要111111111f 来选择一个可能的结果,它来自Git 2.27.0。

    由于 Git 存储库会随着时间的推移而增长,因此可以在存储库生命周期的早期使用一个非常短的哈希 ID,然后在以后(比如五年后)发现这个短哈希 ID 现在是不明确的。例如,Linux 内核现在已经达到git log --oneline 使用 12 个字符以确保安全的程度。如果您设置一个非常短的--abbrevgit 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 版本才能使其工作?我试过这个命令git log -1 --format=%h --abbrev=6,但它仍然返回 7 个数字。我的 GIT 是 1.7.1
    • 是的,在 1.7.1 之后您几乎需要任何东西,例如 1.7.1.1。来自 git 1.7.1.1 的发行说明:“git log --abbrev=$num --format='%h' ignored --abbrev=$num.
    • git 将始终显示唯一的哈希值。很可能,在您的存储库中,您需要 7 位数字来唯一标识提交。例如,在我的回购这个git log -5 --format=%h --abbrev=5 我看到这些:7ee2f 89e8 8cc16 9f809 d8ac
    • @DaveMontgomery:Git 最近(在 2.11 中)更改为自动估计正确的缩写长度。在此之前,默认值始终为 7(但可配置,请参阅 core.abbrev)。如果需要,一些(但不是全部)代码将超过 7 个。另请参阅the 2.11 release notes
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多