如何从“git diff-tree --stdin”获取任何输出?

时间:2016-07-29 16:07:54

标签: git git-diff git-diff-tree

git diff-tree的手册页建议我可以使用我选择的一堆树对象进行组合差异(--cc)。您必须使用--stdin选项。但我无法让--stdin输出任何东西。

示例:

$ git diff-tree --stdin
a b
a b
$

在这里我键入 a < Space> b < Enter> Ctrl-D :它甚至没有抱怨ab输入错误......但即使使用有效的提交哈希值和/或其他选项,我也绝不会得到任何输出。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您必须向git diff-tree --stdin提供完整哈希的提交或树对象:

  $ git log -3 --pretty=%H
  a30ec5de57bbfa0c19045f3c094ec6eb4d808eb4
  f0939d956ad9ef2a00360139a6f1d1ad66accbe5
  fcdb73de293b2442231e5d8ce19f9c7d1640d186

  $ # lines typed on stdin are marked by ->
  $ git diff-tree --stdin
->fcdb73de293b2442231e5d8ce19f9c7d1640d186 a30ec5de57bbfa0c19045f3c094ec6eb4d808eb4
  fcdb73de293b2442231e5d8ce19f9c7d1640d186
  :040000 040000 e2aed2af18fb5293903a0d0b78c23e00a893394d c56666f973b77d92d52b68a14c5a26ac3508571a M    example
  :040000 000000 7cc3373fd5cad3bfe6ec261e9dcc3a9e97efe488 0000000000000000000000000000000000000000 D    prc
  :000000 040000 0000000000000000000000000000000000000000 275872c00a9f51016d2273419345b3b1d7535630 A    src
->275872c00a9f51016d2273419345b3b1d7535630 7cc3373fd5cad3bfe6ec261e9dcc3a9e97efe488
  275872c00a9f51016d2273419345b3b1d7535630 7cc3373fd5cad3bfe6ec261e9dcc3a9e97efe488
  :100644 100644 f26b2198fd9a0103f57a5bd828e58043507ea7b7 c52116f6d185548061058099dfe4c9e50d523aff M    chord.cpp
  :100644 100644 fcbfcdc036fb53733176ed30fd82eb261a990d5b 403e323f332a18b45dfdebfd3a8bfb1a62158bb4 M    chord.hpp
  :100644 100644 11a931f795b44cd916e1607d819eed4d5342edba 333b596faf596d73758bce949e6d86e596153126 M    polyphonic_track.cpp
  :100644 100644 7196835de2385d3f1e0b20073d327cb432ed436c f9fbbac93ef6fc19ae99113ff39a06f4df50720e M    polyphonic_track.hpp

答案 1 :(得分:-1)

另一种方式:

git rev-list HEAD | git diff-tree --stdin 

但是,在Git 2.27(2020年第二季度)之前,“ git diff-tree --pretty --notes”曾经断言失败,因为它忘记了初始化Notes子系统。

请参见commit 5778b22Taylor Blau (ttaylorr)(2020年4月21日)。
(由Junio C Hamano -- gitster --commit 5a96715中合并,2020年4月28日)

diff-tree.c:在需要时加载注释机器

报告人:杰夫·金
签名人:泰勒·布劳
代理人:Jeff King

7249e91(“ [ revision.c ](https://github.com/git/git/blob/5778b22b3d690495e724276663c36ccd5329da4d/revision.c引入以来:支持- notes命令行选项”,2011-03-29,Git v1.7.6-rc0-merge中列出的batch #0),将“ --notes”与任何导致我们格式注释(例如'--pretty,'--format="%N"'等)导致运行时断言失败。

$ git rev-list HEAD | git diff-tree --stdin --pretty=medium --notes
commit 8f3d9f354286745c751374f5f1fcafee6b3f3136
git: notes.c:1308: format_display_notes: Assertion `display_notes_trees' failed.
Aborted

此失败是由于差异树未调用'load_display_notes'来初始化笔记机制。

通常,不会触发此故障,因为它需要同时传递'--notes'和上面提到的另一个选项。
例如,对于“ --pretty”,我们将其设置为“ opt->verbose_header”,从而导致“ show_log()”最终调用“ format_display_notes()”,该期望非空值'display_note_trees'。

如果不初始化注释机制,则'display_note_trees'仍为NULL,从而触发断言失败。

在解析我们的选项后,通过初始化注释机制来解决此问题。