有没有办法以diffstat格式获取文件blob的SHA1(注意:不提交的SHA1)?
我想做的是做git show --stat ${commit}
这样的事情,但是我没有只显示文件名和为该提交添加/删除的行数,我希望能够看到SHA1的SHA1。 blob,对应于文件的最终内容。
我实际上是在一个更大的脚本的上下文中寻找这个,我想积累已经被一组提交更改的文件的blob SHA1,所以一个易于解析的“plumbing”类型命令将是理想的。 我还想要一个可以使用“普通”和合并提交的命令(因此需要像“HEAD ^”这样的比较引用是非理想的)。
答案 0 :(得分: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
这里我们使用--no-commit-id
抑制了提交SHA1的打印,并指定-r
来查看子目录(子树)中的文件,而不是仅查看顶级目录。以冒号开头的输出行是在此提交中已更改的文件。两个SHA1是父提交中的blob SHA1和blob的最终SHA1 - 对应于引用的提交中文件的内容。
在合并的情况下,“组合”差异需要-c
- 它告诉diff-tree为任何父文件都不相同的文件创建条目。 (也就是说,仅适用于已经从合并过程本身更改的文件。)
$ 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-format和diff-tree手册页。