【发布时间】:2011-11-12 00:36:01
【问题描述】:
只是想写我的第一个 git 钩子。我有一个远程来源,当我推送到它时,我希望触发一个接收后挂钩,它将 ssh 到我的实时服务器和 git pull。这可以做到吗,这是一个好方法吗?
好的,我已经触发了钩子,并且实时服务器正在执行 git pull 但它说它已经是最新的了?有什么想法吗?
【问题讨论】:
只是想写我的第一个 git 钩子。我有一个远程来源,当我推送到它时,我希望触发一个接收后挂钩,它将 ssh 到我的实时服务器和 git pull。这可以做到吗,这是一个好方法吗?
好的,我已经触发了钩子,并且实时服务器正在执行 git pull 但它说它已经是最新的了?有什么想法吗?
【问题讨论】:
是的,这是可以做到的,是的,在我看来,这是一个很好的做法。这是我们的用例: 我在一个小型开发小组工作,该小组为不同的人群维护几个站点。
每个网站都有多个环境(测试版,它是所有开发人员的沙盒,登台,这是我们在上线之前向内容所有者展示更改的地方,培训是我们的培训人员用来培训新内容经理和上线的地方,每个人都去消费内容)。
我们通过基于分支名称的接收后挂钩控制对所有这些环境的部署。我们可能有一个没有部署到任何地方的“热修复”分支,但是当我们将它与“beta”分支合并时,它会自动部署到 beta 服务器,以便我们可以测试我们的代码如何交互与其他开发人员的代码。
有很多方法可以做到这一点,我们所做的是设置你的 ssh 密钥,以便 git 服务器可以 ssh 到你的 web 服务器并执行 git pull。这意味着您必须将 git@gitserver 的公钥添加到您的 git@webserver authorized_keys 文件中,反之亦然,然后,在 post-receive 挂钩上,您解析出分支并为其编写“case”语句,如下所示:
read line
echo "$line" | . /usr/share/doc/git-core/contrib/hooks/post-receive-email
BRANCH=`echo $line | sed 's/.*\///g'`
case $BRANCH in
"beta" )
ssh git@beta "cd /var/www/your-web-folder-here; git pull"
;;
esac
希望对您有所帮助。
【讨论】:
当然可以,但这不是最好的方法。当您使用git pull 时,git 将获取然后合并到您的工作副本中。如果可以保证该合并始终是快进的,那可能没问题,但否则您最终可能会在实时服务器上的已部署代码中解决冲突,这很可能会破坏它。使用 pull 部署的另一个问题是您不能简单地回到历史中较早的提交,因为 pull 只会告诉您您的分支已经是最新的。
此外,如果您要拉入实时服务器上的非裸存储库,则需要采取措施防止 .git 目录中的数据被公开访问。
一种类似但更安全的方法是通过钩子部署在实时服务器上的裸存储库中,该存储库将使用git checkout -f,但工作目录设置为您的代码应部署到的目录。您可以找到设置此类系统的分步指南here。
【讨论】:
HEAD 状态快进,您将不会遇到任何此类冲突。但是,情况并非总是如此——您可能希望从不同的开发分支部署一个版本。更重要的是,如果您想在同一分支上恢复到较旧的提交,则拉取将使您处于相同状态并告诉您您已经是最新的。