5

我们在 Git 中使用 post-receive 挂钩来部署 PHP“应用程序”。脚本 (Bash) 检查分支名称并根据分支名称中的前缀在正确的服务器上执行 rsync。

这工作得很好,除了一件事:当我们删除一个分支时它会尝试进行部署。

查了很多地方,没有找到从脚本中查出操作是否为删除的方法。

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

4

1 回答 1

15

当 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

于 2013-10-30T21:15:44.323 回答