我们在Git中使用post-receive钩子来部署PHP“app”。脚本(Bash)检查分支名称,并根据分支名称中的前缀在正确的服务器上执行rsync。
这项工作非常顺利,除了一件事:它在我们删除分支时尝试进行部署。
我在很多地方检查过,如果操作是删除,我没有找到从脚本中找到的方法。
有没有办法实现这一目标。该脚本位于裸存储库(由Gitolite管理)上,不在开发人员工作站上。
答案 0 :(得分:14)
当git收到推送时,调用post-receive
挂钩并在stdin上传递有关每个引用的数据,以<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
。