git服务器的钩子如何获取git客户端的提交信息

【字号: 日期:2023-08-25浏览:38作者:雯心

问题描述

git服务器端的hooks有三个

pre-receive: 推送接受前update: 推送更新中post-receive: 推送接受后

我想在post-receive中执行一个脚本,需要知道客户端推送的时候推送的分支名。但是查阅不少资料都没有提到hooks脚本如何获取客户端推送信息的方法。

比如git客户端a向git服务器b推送了分支hotfix1.2.3的一些更新,我想在git服务器b的hooks里根据这次推送行为的分支名,也就是hotfix1.2.3,执行某个脚本。如何做到呢?

问题解答

回答1:

根据Server-side Hooks这个链接的内容,可以知道post-receive和pre-receive一样在执行前会得到3个参数:<old-value> <new-value> <ref-name>

The script takes no parameters, but each ref that is being pushed is passed to the script on a separate line on standard input in the following format:<old-value> <new-value> <ref-name> 如 b6b36c697eb2d24302f89aa22d9170dfe609855b 85baa88c22b52ddd24d71f05db31f4e46d579095 refs/heads/master

所以既然知道了ref-name和相应的hash值,就可以根据git相应的命令得到对应的信息.如git log refs/heads/master.

回答2:

https://git-scm.com/book/zh/v...

不同的Hook会在输入流中携带不同的参数,

pre-receive处理来自客户端的推送操作时,最先被调用的脚本是 pre-receive。 它从标准输入获取一系列被推送的引用。如果它以非零值退出,所有的推送内容都不会被接受。 你可以用这个钩子阻止对引用进行非快进(non-fast-forward)的更新,或者对该推送所修改的所有引用和文件进行访问控制。

updateupdate 脚本和 pre-receive 脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。 假如推送者同时向多个分支推送内容,pre-receive 只运行一次,相比之下 update 则会为每一个被推送的分支各运行一次。 它不会从标准输入读取内容,而是接受三个参数:引用的名字(分支),推送前的引用指向的内容的 SHA-1 值,以及用户准备推送的内容的 SHA-1 值。 如果 update 脚本以非零值退出,只有相应的那一个引用会被拒绝;其余的依然会被更新。

post-receivepost-receive 挂钩在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。 它接受与 pre-receive 相同的标准输入数据。 它的用途包括给某个邮件列表发信,通知持续集成(continous integration)的服务器,或者更新问题追踪系统(ticket-tracking system) —— 甚至可以通过分析提交信息来决定某个问题(ticket)是否应该被开启,修改或者关闭。 该脚本无法终止推送进程,不过客户端在它结束运行之前将保持连接状态,所以如果你想做其他操作需谨慎使用它,因为它将耗费你很长的一段时间。

相关文章: