我们在 Git 中使用 post-receive 挂钩来部署 PHP“应用程序”。脚本 (Bash) 检查分支名称并根据分支名称中的前缀在正确的服务器上执行 rsync。
这工作得很好,除了一件事:当我们删除一个分支时它会尝试进行部署。
查了很多地方,没有找到从脚本中查出操作是否为删除的方法。
有没有办法做到这一点。该脚本位于一个裸存储库(由 Gitolite 管理)上,它不在开发人员工作站上。
我们在 Git 中使用 post-receive 挂钩来部署 PHP“应用程序”。脚本 (Bash) 检查分支名称并根据分支名称中的前缀在正确的服务器上执行 rsync。
这工作得很好,除了一件事:当我们删除一个分支时它会尝试进行部署。
查了很多地方,没有找到从脚本中查出操作是否为删除的方法。
有没有办法做到这一点。该脚本位于一个裸存储库(由 Gitolite 管理)上,它不在开发人员工作站上。
当 git 收到推送时,将post-receive
调用钩子并在标准输入上传递有关每个已交付的 ref 的数据,以 . 行为单位<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
。