获取Git存储库的最后一次提交

时间:2012-06-22 02:41:24

标签: git githooks git-log

我有一个中央的Git裸存储库。当对该回购进行推送时,我想运行后接收挂钩。该钩子将做什么是在Basecamp项目上创建一条消息(使用他们的API)。我想要了解刚刚执行的更新的信息。现在我认为git log -2 --stat已经足够好但想要更多信息(更新的分支,文件创建,文件被删除)。任何人都可以帮助我获取所有信息我需要做的命令吗?执行多个命令对我很好,可能没有一个命令可以获取所有信息。

3 个答案:

答案 0 :(得分:3)

您可以通过检查和排序.git/refs/heads下的文件来找到最新的提交:每次进行新的提交时,相应的refs/heads文件都会更改,即提交到master时,refs/heads/master已更新。

所以,让我们开发一个解决方案。

第一个任务:找到所有分支(即refs/heads下的所有文件,并在上次更改时打印出来。你在谈论钩子,所以我们给出了相对于.git/hooks目录:

find ../refs/heads -type f -printf '%T@ %p\n'

这将生成所有分支的列表及其更改日期。有关参数的说明,请参阅man page of find

第二项任务:对获得的列表进行排序

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做任何您想要的脏东西。

也许不是最优雅的解决方案(可能有人会出现并告诉你一个更简单的单行),但对我有用。

答案 1 :(得分:2)

--summary添加到您的git日志将生成新的和已删除的文件列表(git将它们称为“节点”):

git log --stat --summary -1

要获得分支,请尝试运行:

git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3-

注意:我正在我的Mac上测试它。 Unix cut是1索引,但我相信Debian cut是0索引。如果是这样,如果你在Debian框中,将-f1更改为-f0,分支命令应该可以正常工作

答案 2 :(得分:1)

如果您没有使用post-receive的具体原因,我建议使用update,它将旧的ref,新的ref和分支作为命令行参数。

因此,您可以使用此处建议的git log命令获取整个日志,并将oldref..newref作为参数(分别替换oldrefnewref)。

有关详细信息,请参阅githooks(5) manpage on the update hook。如果需要,您甚至可以在此时中止更新。

实际上,您在stdin的post-receive挂钩中获得了相同的信息。我不明白为什么你需要做很多find命令才能完成这项任务。