【问题标题】:Exclude Preceding Commit> line from git rev-list formatting从 git rev-list 格式中排除 Preceding Commit> 行
【发布时间】:2016-04-28 23:23:09
【问题描述】:

我正在尝试处理分支 diff 命令,并且我已经完成了所有工作......除了格式。我可以使用--pretty=oneline 只显示我想要的信息,除了它显示完整的哈希值,并且不会对输出进行着色。

所以它只是输出这个:

fa73c05913292fbce940075fc8f454bad5066666 Example Commit Message
de4dbeffa249393dddebb7b13ae555cb97cad5be Another Example Commit Message

如果我尝试使用自定义格式字符串,例如:--pretty="format:%C(yellow)%h%C(reset) %s",它可以工作,但它还会在其上方显示额外的一行。

例如

commit >fa73c05913292fbce940075fc8f454bad5066666
fa73c05 Example Commit Message
commit >de4dbeffa249393dddebb7b13ae555cb97cad5be
de4dbef Another Example Commit Message

有没有办法让git rev-list 输出没有前面commit >abcdef3... 行的格式?

【问题讨论】:

  • git rev-listgit log 本质上是相同的命令,除了输出格式和git log 将在HEAD 开始(如果没有给出起点)之外。因此git log --format=... <additional rev-list arguments> 将在这里解决问题。
  • @torek Ahh,那行得通。我只需要用.. 分隔参数,这让我感到非常困难。我已经设法将它发送到git rev-list branch-name.. | sed -e 1b -e '$!d' | sed -e "s/\n/../",但这似乎不起作用。
  • 你到底想要这个“分支差异命令”做什么?它可能已经作为 git 的许多 Swiss-army-chainsaw(没有护手)工具之一提供......
  • 听起来你可能想要git cherry 和/或r1...r2 计算的“对称差异”集。例如,git log --oneline --left-right --cherry-mark A...B(注意三个点,参见 gitrevisions(7))。
  • 如果您真的想使用rev-list 而不仅仅是log,这仍然不能回答问题

标签: git


【解决方案1】:

为接下来的人留下答案/

@torec 在他的评论中提到了以下内容:

git rev-listgit log 本质上是相同的命令

答案是使用以下格式:

# print out the log history in the desired format.
git log --pretty="format:..." <SHA-1>

【讨论】:

    【解决方案2】:

    不幸的是,实际上没有办法做到这一点。 git rev-list 实现 thusly:

        if (revs->abbrev_commit && revs->abbrev)
            fputs(find_unique_abbrev(&commit->object.oid, revs->abbrev),
                  stdout);
        else
            fputs(oid_to_hex(&commit->object.oid), stdout);
    

    所以无论你输入什么选项,git rev-list 总是会打印出某种提交哈希。

    【讨论】:

      【解决方案3】:

      你可以在 git rev-list 后使用sed 删除所有以commit 开头的行。

      git rev-list --pretty=format:"%C(yellow)%h%C(reset) %s" | sed '/^commit [0-9a-f]\{40\}$/d'.

      【讨论】:

      • 既然已经有一个接受的答案已经快 4 年了,那有什么问题呢?既然您要发布一个新答案,那就是?
      • 原始接受的答案没有任何问题。这是另一种方法。在寻找问题的答案时偶然发现了这个问题,我想我可以添加另一种方法来做到这一点。由于某些原因,有些人可能不得不使用git rev-list 而不是git log
      • @LasseV.Karlsen 原始答案回答了一个不同的问题
      【解决方案4】:

      如果我尝试执行自定义格式字符串,例如:--pretty="format:%C(yellow)%h%C(reset) %s",它可以工作,但它还会在其上方显示额外的一行。

      实际上...在 Git 2.33(2021 年第三季度)中,“git rev-list(man) 学会省略 commit &lt;object-name&gt; 标题行使用 --no-commit-header 选项输出

      参见brian m. carlson (bk2204)commit d1c5ae7(2021 年 7 月 11 日)。
      (由 Junio C Hamano -- gitster -- 合并于 commit fe3fec5,2021 年 7 月 22 日)

      rev-list:为--pretty=format 添加选项没有标题

      签字人:brian m.卡尔森

      一般来说,我们鼓励用户使用管道命令,如git rev-list(man),而不是像git log(man)这样的瓷器命令,在编写脚本时。

      但是,git rev-list 有一个明显的问题使其无法在某些情况下使用:当--pretty 与自定义格式一起使用时,它总是会打印出包含“提交”和对象 ID 的行。

      这使得它不适合许多脚本需求,并迫使用户改用git log

      虽然我们无法更改此行为以实现向后兼容性,但我们可以添加一个选项来抑制此行为,所以让我们这样做,并将其命名为“--no-commit-header”。
      此外,添加相应的肯定选项以将其重新打开。

      请注意,此选项不会影响内置格式,只会影响自定义格式。
      这与git log 的用户已经拥有的行为完全相同,并且是大多数用户将习惯的。

      rev-list-options 现在包含在其man page 中:

      @​​987654349@

      禁止包含“提交”的标题行和之前打印的对象 ID 指定的格式。这对内置格式没有影响;唯一定制 格式会受到影响。

      --commit-header

      覆盖以前的--no-commit-header

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-31
        • 2020-07-17
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2021-10-20
        • 2014-10-22
        相关资源
        最近更新 更多