试着写我的第一个git钩子。我有一个远程起源,当我推动它时,我想要一个post-receive hook to fire,它将ssh进入我的live服务器和git pull。这可以做到,这是一个好方法吗?
好的,我已经开始了钩子,而且实时服务器正在进行git pull,但它说它已经是最新的?任何想法?
答案 0 :(得分:4)
是的,这可以做到,是的,在我看来,这是一种很好的做法。这是我们的用例: 我在一个小型开发小组工作,为不同的人群维护一些网站。
每个站点都有几个环境(测试版,这是一个适用于所有开发人员的沙箱,升级,这是我们在上线之前向内容所有者展示更改的地方,培训是我们的培训老师用来培训新内容管理员和直播,每个人都去消费内容。)
我们通过基于分支名称的post-receive挂钩来控制对所有这些环境的部署。我们可能有一个“热修复”分支,无法在任何地方部署,但是当我们将其与“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
希望有所帮助。
答案 1 :(得分:0)
当然可以做到,但这不是最好的方法。当您使用git pull
时,git将获取然后合并到您的工作副本中。如果可以保证该合并始终是快进,那可能没问题,但是否则您最终可能会在实时服务器上部署的代码中解决冲突,这很可能会破坏它。使用pull进行部署的另一个问题是,您不能简单地回到历史记录中的早期提交,因为pull只会告诉您分支已经是最新的。
此外,如果您要在实时服务器上插入非裸存储库,则需要采取措施防止.git
目录中的数据被公开访问。
类似但更安全的方法是通过实时服务器上的裸存储库中的钩子进行部署,该存储库将使用git checkout -f
但工作目录设置为应将代码部署到的目录。您可以找到设置此类系统{/ 3}}的分步指南。