使用SVN进行PHP网站版本控制的最佳方法是什么?
我一直只是通过FTP从站点下载文件,对其进行编辑,然后在创建站点时将其备份,但是我觉得值得学习正确地做事。
我刚刚将所有内容都提交给SVN存储库,并尝试将其切入服务器并签出带标签的内部版本,以及使用switch更新该内部版本。
一切都很好,但是比我当前的过程慢很多。
设置类似这样的最佳方法是什么?我大部分时间只是修正错误或者进行较小的更改,而不是进行大量的重写,因此我经常进行更新。
解决方案
我们不一定需要使用SVN将文件部署到服务器。继续使用FTP,而仅使用SVN作为修订历史记录。
为了快速更新,我只从服务器运行svn update
。
有时,对于真正非常快速的更新,我使用vim编辑文件并从服务器提交它们。
它不是很合适,但是很快并且很可靠。
如果要正确执行此操作,则绝对应考虑设置本地SVN存储库。我也强烈建议我们设置一个持续集成(CI)服务器,例如巡航控制,当我们登录svn时,它将自动对PHP代码运行任何测试。一旦CI服务器通过了测试,它也可以用于通过FTP通过FTP将文件发布到主机。
尽管这听起来需要做很多工作,但实际上并非如此,从长远来看,平稳部署过程的好处将超过回报。
对于我的项目,我通常有一个仓库。在我的笔记本电脑上是工作副本,实时网站是工作副本。我使用本地网络服务器在本地副本上进行更改。当一切都经过测试并准备就绪时,我提交更改,然后将ssh放入远程服务器并svn更新。
我还在此存储库中保留了一个文件夹,其中包含对数据库结构进行的任何更改的sql文件,并根据其修订号进行了标记。例如,当我提交修订版74并在其中一个表中有几个额外的列时,提交中将包括dbupdates / rev74.sql。这样,在完成svn更新后,我只需要运行sql文件(mysql db_name -p -u username <dbupdates / rev74.sql)就可以了。
我的工作是使用FTP将更改上传到测试服务器。然后,当我完成了我正在处理的网站部分时,我提交了更改并同时更新了两者。有时,如果我正在做某事,并且更改了不同目录中的许多文件,则会提交并更新测试服务器。但是我不更新生产服务器。但是我是这里唯一的程序员,如果有多个程序员,我不建议提交可能存在错误的代码。
如果我们想使其真正时髦,可以使用构建脚本从SVN获取当前版本,然后编译PHP代码,然后在成功构建后,将更改自动推送到服务器。
这将有助于调试,并可能使代码运行得更快。而且,养成构建习惯确实比仅将PHP直接推送到服务器并通过Firefox进行调试确实改善了我的编码。
源代码控制的好处随着项目的复杂性和开发人员数量的增加而得以体现。如果我们直接在远程服务器上工作,并且大部分时间仅在快速打补丁,则源代码控制可能对我们来说不值得。
最好是,我们应该在存储库的本地工作副本中工作(这意味着我们还应该设置本地服务器)。使用SVN作为唯一更新它的远程服务器,它将大大降低速度。
话虽如此,从长远来看,使用SVN(或者任何其他源代码控制)将带来很多好处,我们拥有完整的更改历史记录,我们始终可以确保服务器是最新的(如果我们运行更新),并且如果我们将更多开发人员添加到项目中,则可以避免成本高昂的源代码覆盖。
我将ZendStudio用于Eclipse(当前为6.1版)。而且我使用SVN来保持源代码可用。最初,我认为由于提交过程(以及输入提交评论)的影响,该过程有些缓慢,并且一直等到停止为止。
但是,在得知要按Ctrl + Alt + C提交并选中"始终在后台运行"后,该过程完全不会变慢。
另外,我确实在本地运行所有内容,然后过一会儿才使用SSH。
我们应该查看安装rsync来将更改上传到服务器。
Rsync很棒,因为它会将仓库的本地副本与服务器上当前的副本进行比较,然后仅发送已更改的文件。
这样省去了我们记住所有更改过的文件并将它们手动选择到FTP的麻烦,或者不必将整个本地副本重新上传到服务器(而让FTP进行比较)。
通过Rsync,我们还可以在服务器之间进行同步时排除文件/文件夹(即.svn /文件夹)。
我做了一个提交后的钩子来自动更新我的网站。它的速度很快,但我们可能会犯错误。
我建议我们继续使用Subversion来跟踪所有更改,甚至包括错误修复。当我们希望部署到生产服务器时,应该使用SSH并调用svn update
。使用Capistrano可以自动执行此过程,这意味着我们可以坐在本地机器上并调用cap deploy
-Capistrano将通过SSH进入服务器并执行Subversion更新。节省了大量繁琐的体力劳动。
如果在* nix服务器上,并且我们具有适当的SSH访问权限,并且我们有空间保留该网站的多个副本,那么我发现的最有用的版本控制技术就是使用一个符号链接来指向"当前"版本网站。 (我们仍然可以使用SVN来对源代码进行版本控制-这是一种轻松/即时在服务器上的网站版本之间进行切换的方法。)
- 设置Web服务器,使其指向/whatever.com作为网站的根目录。
- 拥有一个类似/ website / r1v00的文件夹,我们可以在其中将网站文件通过FTP传输到该文件夹,然后创建一个名为" whatever.com"的符号链接,该链接指向/ website / r1v00
- 当我们拥有网站的更新版本时,创建另一个名为/ website / r1v001的文件夹,将更新站点的所有文件通过FTP传输,然后将" whatever.com"的符号链接更改为现在指向/ website / r1v01. 如果新站点有任何问题,我们只需将" whatever.com"符号链接指向/ website / r1v00即可立即将其撤消。
当然,我们可以/应该设置脚本来自动创建和切换符号链接。就我而言,我有一个用PHP编写的"管理员"页面,其中列出了所有可用版本,并允许我切换到其中任何一个。这种技术已经节省了我的培根好几次...!
显然,这不能解决版本控制数据库模式或者数据库内容的任何问题。