commit message通常有几行组成,第一行称为subject,其余的称为body。在git log或者git show中,可以分别用pretty format %s和%b获取到,也可以用%B同时获取到两者。

git log --pretty='%s%b%B'


由于之前没有仔细研究pretty format,一直不知道%b和%B的作用,导致在有需要获取完整commit message的时候走了一些弯路。由于知道.git/COMMIT_EDITMSG中会保存下上一次git commit的commit message,所以当时就从这个文件上做文章。要获取一个已经存在的commit的message,那么当前的COMMIT_EDITMSG中一般是不会是那个commit的message了。为了从中获取到需要的message,那就要让COMMIT_EDITMSG中的内容变成目标commit的message。对此最直观的想法就是:再commit一次。现在仅仅要commit,而不要真的修改文件,所以可以使用git commit的--allow-empty参数。而要“复制”目标commit的message,只要用-c或者-C参数就可以了,而-C比-c更省事,因为跳过了编辑界面;另外,为了保留author和date,可以不使用--reset-author参数。所以,这样看来,只要用以下命令就可以了

git commit --allow-empty -C $target_commit && git reset HEAD^ --hard

这样就让.git/COMMIT_EDITMSG的内容变成了target_commit的message,并且用git reset将working tree恢复成了之前的样子。

然后cat .git/COMMIT_EDITMSG就可以获取到想要的commit message了。虽然走了些弯路,但是对git commit的几个参数有了更深入的了解,也算有所收获。

另外,公司一直在使用gerrit,被gerrit记录到的commit的详细信息都是可以利用gerrit的query命令或者restapi获取到的 ,可以返回json格式的数据,用python解析起来非常方便。