我有一个中央的Git裸存储库。当对该回购进行推送时,我想运行后接收挂钩。该钩子将做什么是在Basecamp项目上创建一条消息(使用他们的API)。我想要了解刚刚执行的更新的信息。现在我认为git log -2 --stat
已经足够好但想要更多信息(更新的分支,文件创建,文件被删除)。任何人都可以帮助我获取所有信息我需要做的命令吗?执行多个命令对我很好,可能没有一个命令可以获取所有信息。
答案 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
作为参数(分别替换oldref
和newref
)。
有关详细信息,请参阅githooks(5) manpage on the update hook。如果需要,您甚至可以在此时中止更新。
实际上,您在stdin的post-receive
挂钩中获得了相同的信息。我不明白为什么你需要做很多find
命令才能完成这项任务。