我有一个中央 Git 裸存储库。当对该仓库进行推送时,我想运行一个接收后挂钩。该钩子将做的是在 Basecamp 项目上创建一条消息(使用他们的 API)。我想要有关刚刚执行的更新的信息。现在我认为git log -2 --stat
已经足够好了,但想要更多信息(更新的分支、创建的文件、删除的文件)。任何人都可以帮助我获取所有信息所需的命令吗?执行多个命令对我来说很好,可能没有一个命令可以让我获得所有信息。
3 回答
您可以通过检查和排序下的文件来找到最新的提交.git/refs/heads
:每次进行新的提交时,相应的refs/heads
文件都会更改,即提交到时master
,refs/heads/master
会更新。
所以,让我们开发一个解决方案。
第一个任务:找到所有分支(即下的所有文件refs/heads
并在它们最后一次更改时打印出来。你在谈论钩子,所以我们给出相对于.git/hooks
目录的路径:
find ../refs/heads -type f -printf '%T@ %p\n'
这将生成所有分支及其更改日期的列表。有关参数的说明,请参见手册页。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
用来做任何你想做的脏事。
也许不是最优雅的解决方案(可能有人会过来告诉你一个更简单的单行),但对我有用。
添加--summary
到您的 git 日志将生成新的和已删除的文件列表(git 将它们称为“节点”):
git log --stat --summary -1
要获取分支,请尝试运行:
git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3-
注意:我正在我的 mac 上测试这个。Unixcut
是 1 索引,但我相信 Debiancut
是 0 索引。如果是这样,并且如果您在 Debian 机器上,请更改-f1
为-f0
并且分支命令应该可以正常工作
如果没有具体原因使用post-receive
,我宁愿建议使用update
,它将旧 ref、新 ref 和分支作为命令行参数。
git log
因此,您可以使用此处建议的命令并oldref..newref
作为参数给出(分别替换oldref
和)来获取整个日志newref
。
有关更多信息,请参阅更新挂钩上的 githooks(5) 手册页。如果需要,您甚至可以在此时中止更新。
post-receive
实际上,您在标准输入的钩子中获得了相同的信息。我不明白为什么您需要执行大量find
命令来完成该任务。