如何使用git部署web应用程序,而不必在每次部署时都查看应用程序目录?

如何使用git部署web应用程序,而不必在每次部署时都查看应用程序目录?,git,web-deployment,Git,Web Deployment,使用git进行部署的一个好方法是什么,现在每次部署时都必须将整个应用程序目录“chown-R”给www用户 基本上,我希望使用post接收挂钩进行部署。目前我有一个post接收钩子,看起来像这样: #!/bin/sh git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f sudo chown -R www:www /home/www/my-web-app sudo /ho

使用git进行部署的一个好方法是什么,现在每次部署时都必须将整个应用程序目录“chown-R”给www用户

基本上,我希望使用post接收挂钩进行部署。目前我有一个post接收钩子,看起来像这样:

#!/bin/sh
git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
sudo chown -R www:www /home/www/my-web-app
sudo /home/john/scripts/reload-my-web-app.sh
这是可行的,但问题是chown步骤很慢,因为my web app文件夹中有数百万个文件

我想使用git作为用户www可以解决这个问题,这样签出的文件就已经有了正确的所有者。因此,我更改了,以便post接收挂钩中的git行为:

sudo -u www git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
但这不起作用,因为我遇到了一个权限错误,即无法在git repo中写入index.lock文件。显然,用户www没有权限在git repo中写入,我不想给www这个权限,因为这似乎对服务器安全不利


那么,在这种情况下,什么是优雅的解决方案?您是否要签出到临时目录,然后从临时目录rsync到/home/www/myweb-app目录,以便复制文件并同时更改所有者?我觉得一定有一些简单的解决办法,我错过了

考虑到Git不是一个部署工具,您的rsync可能是一个更好的解决方案


但是,在您的
my web app
文件夹中使用
setgid
检查设置组是否足够,如图所示。这可能避免了对文件的重读。

考虑到Git不是一个部署工具,您的rsync可能是一个更好的解决方案


但是,在您的
my web app
文件夹中使用
setgid
检查设置组是否足够,如图所示。这可能会避免对文件进行检查。

谢谢-setgid看起来是个不错的选择。我现在的计划是
chmod g+s+w/home/www/My-web-app
,这样git签出的文件将属于组www(感谢g+s),并且当web-app作为用户www数据运行时,它将能够在My-web-app目录中写入/删除文件(感谢g+w)。而且我可以摆脱后接收钩子中的chown行。谢谢-setgid看起来是个不错的选择。我现在的计划是
chmod g+s+w/home/www/My-web-app
,这样git签出的文件将属于组www(感谢g+s),并且当web-app作为用户www数据运行时,它将能够在My-web-app目录中写入/删除文件(感谢g+w)。我可以摆脱后接钩上的chown线。