你可以通过检查和排序
.git/refs/heads
下的文件来找到最新的提交记录:每当进行新提交时,相应的
refs/heads
文件会被更改,即当提交到
master
时,
refs/heads/master
会被更新。
因此,让我们开发一个解决方案。
第一项任务:找到所有分支(即refs/heads
下的所有文件),并打印出它们最后一次更改的时间。由于你要谈论钩子,所以我们给出相对于.git/hooks
目录的路径:
find ../refs/heads -type f -printf '%T@ %p\n'
这将生成一个包含所有分支及其更改日期的列表。请参阅
find命令的man页面以了解参数说明。
第二个任务:对获取的列表进行排序。
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort
第三步: 我们需要获取列表中最新的元素。由于sort
是按照从旧到新的顺序排序的,我们所需的项目位于列表底部。使用tail
获取此元素(只有一个元素,因此传递-1
标志):
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort |\
tail -1
第四步: 从获取的行中删除日期。从我们的
printf
语句中可以知道,日期和路径是用空格分隔的。将其作为分隔符输入到
cut
中 (
-d " "
),告诉它我们需要第二个字段(即文件路径,
-f 2
)。为了方便,我们将该文件路径存储在名为
$LATESTHEAD
的变量中:
LATESTHEAD=$(\
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort |\
tail -1 |\
cut -d ' ' -f 2 )
第五项任务:现在我们知道了文件名,但是我们需要内容。这是可以通过git log
传递的最新修订版。使用cat
命令来完成任务。将最新修订版存储在$LATESTREV
中。
LATESTHEAD=$(\
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort |\
tail -1 |\
cut -d ' ' -f 2 )
LATESTREV=$(cat $LATESTHEAD)
现在,你可以使用$LATESTREV
来执行任何你想做的“肮脏”操作。
可能不是最优雅的解决方案(可能有人会想出一个更简单的一行代码),但对我有效。
git log --stat -1 <commit-hash-here>
以获取完整的提交信息。奇怪的是我不得不添加-1
。如果我不添加它,它会给我所有的东西... 奇怪。无论如何,看起来像是有效的!谢谢eckes! - Jeebs24