有没有办法以类似diffstat的格式获取文件blob的SHA1(注意:而不是提交的SHA1)?
我想做的是做一些类似git show --stat ${commit}
的事情,但我不想只显示文件名和为该提交添加/删除的行数,而是希望能够看到与文件的最终内容相对应的blob的SHA1。
事实上,我是在一个更大的脚本的上下文中寻找这一点的,在那里我想积累已经被一组提交更改的文件的blob SHA1,所以一个易于解析的"管道"类型命令将是理想的。我还想要一个可以使用"普通"和合并提交的命令(所以需要像"HEAD^"这样的比较引用是不理想的)。
git diff-tree
是所需要的。不管diff格式页面指示了什么,diff树都可以采用单一的树式引用(例如提交SHA1或分支名称),并将与提交的所有父级进行比较,即使是合并提交。(就像git show一样。)
diff格式页面解释了输出格式,但这里有一些例子:
$ 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所必需的——它告诉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格式和diff树手册页。