2013-10-30 36 views
5

我们在Git中使用post-receive hook来部署PHP“app”。脚本(Bash)检查分支名称,并根据分支名称中的前缀在正确的服务器上执行rsync。Git:删除分支时不要调用post-receive hook

这项工作非常好,除了一件事:它试图在我们删除分支时进行部署。

我检查了很多地方,并且我没有找到一种方法从脚本中找出操作是否是删除。

有没有办法做到这一点。该脚本位于裸仓库(由Gitolite管理),它不在开发人员工作站上。

回答

14

当GIT中接收一推,所述post-receive钩被调用和传递关于以后被输送的每个参考文献的标准输入数据,在<old-sha> <new-sha> <ref-name>行,像这样:

e1f5c274e296f1c5148161f9d4e5eb43a6743e54 1eea3f51cf926c3710f8fa4a06f503041c4597f0 refs/heads/master 

当分支被删除时,<new-sha>项全部为零,就像这样:

6b239c481453c7fc2513b02e8aa0cd9c1ffa25cb 0000000000000000000000000000000000000000 refs/heads/foo 

所以,你可以使用逻辑诸如调整post-receive钩来检测它(并阻止这个分支从触发部署):

#!/bin/sh - 

while read OLDSHA NEWSHA REF ; do 
    if [ "$NEWSHA" = "0000000000000000000000000000000000000000" ]; then 
    # This ref has been deleted! Respond appropriately. 
    fi 
done 

请记住,单次推送也可以包含更新多个分支!您可能需要累积应部署的一组分支,该分支以适当的前缀开始并且具有非零值NEWSHA

+0

这是缺少的部分,非常感谢! –