【问题标题】:Is it possible to count the number of parents an especific commit has?是否可以计算特定提交的父母数量?
【发布时间】:2021-09-25 11:33:57
【问题描述】:

大多数提交都有 1 个父提交。但是,一些提交有多个父项。例如,在 --no-ff(无快进)标志下创建的合并提交至少有 2 个父级。

git 中是否有一个命令可以显示特定提交的确切父级数量?

【问题讨论】:

  • 我认为 1 或 2 确实是唯一常见的父母数量。虽然我认为理论上任何数量都是可能的,但我不知道任何创建 >2 个父级的工作流。编辑:there are samples of it in the wild.

标签: git git-commit


【解决方案1】:

查看父提交列表:

git show -s --format=%p [commit-id]

只显示父母的数量:

git show -s --format=%p [commit-id] | wc -w

解释:

【讨论】:

    【解决方案2】:

    对于随意或可读的答案,请使用git show,如TTT's post

    然而,尽管干净地使用了--formatgit show 的输出是允许改变的:它是git 的“管道/瓷器分离”中的"porcelain command"。 (The same is true of git log --format.) 更改可能不太可能,但您也可能会看到错误和其他人为导向的输出,因为git show 旨在供人使用而不是脚本使用。

    对于更严格或有规范保证的父列表,适用于长期存在的 shell 脚本或工具集成,您需要使用plumbing command,如git cat-file,类似于extracting a commit date without git log

    git cat-file -p [commit-id] | sed -ne '/^$/q;/^parent/p' | wc -l
    
    • git cat-file -p 将漂亮地打印具有给定 ID 的对象。 HEAD 之类的修订也适用于此。
    • sed 这里将过滤和截断输出:
      • -n 禁止所有输出。
      • -e 使用命令行中指定的脚本。
      • /^$/q 告诉 sed 如果看到空行就退出,就像将提交元数据与其消息分开的行一样。这可以防止在您的提交正文中误解“父母”一词。
      • ; 分隔 sed 命令。
      • /^parent/p 告诉sed 只打印以parent 开头的行,覆盖-n
    • wc -l 打印结果行数。

    再一次,在大多数情况下,git show 是一种更惯用的方式,因为它在一个命令中读取和解析提交,并且已经考虑到边缘情况和奇怪之处。但是,对于长期使用 git 工具的开发人员来说,管道命令可能是一种更有保障的解决方案。

    【讨论】:

    • 也可以考虑git rev-list --no-walk --parents <hash> | wc -w(尽管你必须减去 1 或以其他方式对输出大惊小怪)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多