1

有没有办法以类似 diffstat 的格式获取文件 blob 的 SHA1(注意:不是提交的 SHA1)?

我想做的是做类似的事情,git show --stat ${commit}但不是只显示文件名和为该提交添加/删除的行数,我希望能够看到对应于最终内容的 blob 的 SHA1文件。

我实际上是在一个更大的脚本的上下文中寻找这个,我想在其中累积已被一组提交更改的文件的 blob SHA1,因此一个易于解析的“管道”类型命令将是理想的。我还想要一个可以与“正常”和合并提交一起使用的命令(因此需要像“HEAD^”这样的比较参考是不理想的)。

4

1 回答 1

3

git diff-tree是需要的。尽管diff-format页面表明了什么,diff-tree能够采用单个树状引用(例如提交 SHA1 或分支名称),并将与提交的所有父级进行比较,即使它是合并犯罪。(就像 git show 一样。)

diff-format页面解释了输出格式,但这里有一些示例:

$ git diff-tree --no-commit-id -r -c HEAD 
:100644 100644 163e1f7815c5ef7e371bfebd549d6e990a3faa6b 991c88a41f56a0b39dfee85046e6954731294ddb M  Home.md
:100644 100644 d40bd92ec40e486fa4fdda3e8e2740bfb0138a99 160d2d470b9226ed58697b96523a5579ac0dbb9e M  building/Tests.md

在这里,我们用 抑制了提交 SHA1 的打印--no-commit-id,并指定-r查看子目录(子树)中的文件,而不是只查看顶级目录。以冒号开头的输出行是在此提交中更改的文件。这两个 SHA1 是父提交中的 blob SHA1 和 blob 的最终 SHA1 - 对应于引用提交中文件的内容。

-c合并的情况下,“组合”差异是必需的 - 它告诉差异树为任何与父文件不同的文件创建一个条目。(也就是说,仅适用于从合并过程本身发生更改的文件。)

$ git diff-tree --no-commit-id -r -c  2a6c4947dd0dcee69e7aca1c3a0ef92d7e5260f9 # merge commit
::000000 100644 100644 0000000000000000000000000000000000000000 53650eaf781e1410d8bd6fa4af29748714b7f1d4 285def5637464597883c3f363d67783176f03c2e AM    README.txt
::100644 100644 100644 e7f117c2b117dc3960250442732f0d6acfc212e6 e84b192b1e394efea15804f8de66fc0c7ee87ca7 5ca0469a65e886e56e5aedeb08359ea1627e28dd MM    Home.md

对于合并提交,有更多条目,对应于每个父级。同样,有关格式化的详细信息以及如何控制它,请参阅diff-formatdiff-tree手册页。

于 2017-02-15T03:07:03.130 回答