所以我在我们的网络服务器上安装了SVN。我们的想法是将工作副本加载到开发人员计算机上,当它们提交(冲突协助)时,服务器执行提交后的bash。
存储库是基于每个项目的,想法是在提交后,bash文件需要强制删除整个项目文件夹和文件,并将更新的repo导回到项目文件夹中,以通过SVN保持网站更新......我知道这种方法肯定存在一些分歧,但它对我们有用......除了一件事......
当服务器重新导出项目时,对网站的任何请求都会引发错误,因为缺少大量的文件......有什么办法在SVN导出时“排队”apache / php,然后“恢复” “请求?
服务器很快导出文件,但有人抓住服务器并引发PHP错误的几毫秒......
请告诉我是否有一种典型的解决方法......
由于
答案 0 :(得分:2)
您可以通过在新目录树中构建内容然后重命名来来最小化中断。也就是说,假设您的内容在/var/www/myproject
下可用,您的更新后脚本将:
/var/www/myproject.new
/var/www/myproject
重命名为/var/www/myproject.old
/var/www/myproject.new
重命名为/var/www/myproject
/var/www/myproject.old
虽然不是原子更新,但执行两次重命名所需的时间很短,应该会大大改善这种情况。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不知道以下是否对您的案例有用,但您可以制作两步代码升级脚本:
你永远不会经历冲突。
BTW我不认为这是最佳做法。您应该解决客户端开发人员计算机上的冲突。答案 3 :(得分:0)
我真的觉得@Larsks的回答足够实用,可以提供当时几乎原子性和需要的解决方案,所以我保持他的回答是“正确的”,但我认为我会考虑This Post考虑以及:
假设mv是完全原子的,post-commit hook bash可能如下所示:
svn export file:///svn/repo /var/www/projectdir_NEW --force
mv /var/www/projectdir /var/www/projectdir_OLD
mv /var/www/projectdir_NEW /var/www/projectdir
rm -rf mv /var/www/projectdir_OLD
唯一的事情是2 mv命令之间的几秒钟,这是最接近原子和最干净的方式来做到这一点......但是,对于完全原子的影响,让我说我不介意使用小PHP,因为我的项目有一个全局的init.php,post-commit可以做到这一点:
date > /var/www/projectdir.updating
svn export file:///svn/repo /var/www/projectdir_NEW --force
mv /var/www/projectdir /var/www/projectdir_OLD
mv /var/www/projectdir_NEW /var/www/projectdir
rm -rf mv /var/www/projectdir_OLD
rm /var/www/projectdir.updating
创建一个名为“projectdir.updating”的临时文件,其中包含日期,执行更新,然后删除临时文件,我现在可以使用我的init.php来“限制”任何请求:
while (file_exists("/var/www/projectdir.updating")) usleep(200);
此外,我可以检查临时文件中保存的日期详细信息,以查找带错误的退出...(如果导出失败以删除.updating文件)