我有一个网站,我定期更新代码。我把它保存在版本控制中。当我想部署新版本的站点时,我会进行导出,然后将服务目录名称符号链接到部署目录。
有一个用户可以上传文件的地方,我注意到,在我部署了新版本之后,用户文件就消失了!当然,我没有将它们添加到存储库中,并且由于服务的站点来自导出,因此它们无论如何都不会上载到版本控制的目录中。
PHP还没有集成的svn功能,所以我无法以编程方式对用户上传的文件做太多工作。我的解决方案是创建一个额外的网站files.website.com,它位于服务网站的并行目录中,并且是在受版本控制的目录下提供的。这样,当我升级到网站时,它们不会被删除。我不时手动将上传的文件添加到svn项目,删除用户删除的文件,并提交新版本。我正在研究一个从cron运行的shell脚本来执行此操作,但这不是我的强项,因此它不是紧迫的需要。
有更好的方法吗?
答案 0 :(得分:4)
我通常不会在svn中保留用户生成的数据/文件。只有代码,db schema / test数据。我通常要部署的是来自最新工作副本的rsync,它排除了上传目录和.svn dirs。 IMO内容应该由更传统的文件系统/ db备份机制处理,而不是版本控制。
修改强>
要明确你的符号化策略似乎是一种很好的做法。你错过了它想到的备份部分。我可能只是tar | gzip
在cron作业中上传的内容而不是与SVN交互。然后可能有一个单独的使用mysqldump
转储数据库和gzip
。
答案 1 :(得分:4)
我会继续执行导出网站的做法,因为需要升级但是有一个符号链接指向版本控制目录之外的目录以及用户上传的内容。这样,当您进行导出时,只需要重新创建符号链接,如果它被吹走了。您当然应该根据需要备份该用户内容。
答案 2 :(得分:0)
您可以将部署目录设置为subversion checkout(来自生产分支),而不是手动执行导出和管理符号链接。这样,部署就像检查生产分支的更新一样简单。
只要您对subversion服务器和托管设置有足够的控制权,并且您的subversion存储库“已准备好运行”,这就可以正常工作。在这种情况下,您的用户目录可能是subversion中的空占位符,并且将由提交时运行的更新进程(svn update
的常规操作)保留。我仍然建议(如@ Flash84x和@prodigitalson所述)一个单独的进程来备份用户内容。
有一个Ars Technica article,其中包含如何进行设置的说明。
更新:如果您遵循此方法,请确保您的Web服务器不允许访问部署检出中的.svn文件。