维护人:戴荔春 (6016)
介绍SVN的安装以及使用
SVN是一个开放源代码的版本控制系统,目前公司就是通过SVN进行代码版本控制的
前人栽树,后台乘凉,本文参考了以下来源
使用SVN前需要先了解SVN服务端和客户端的区别
先了解SVN运行流程,很容易区别服务端和客户端
SVN服务端主要作用是用来存储数据,有如下特点
这一点很重要,很多自动更新方案都是这样实现的,参考 SVN自动更新方案
SVN客户端的作用是用来协同开发,有如下特点
也就是说,实际上存储数据的只是服务端,客户端里只是每一位开发者各自的分支备份而已
这一点,SVN和Git不同,SVN只确保一份最终数据
这一点很重要,你必须明白,服务端只是一些数据,只有客户端上才是能直接运行的文件,所以任何想要运行的代码都必须通过客户端拉取
这一点很多新人会有所迷惑,其实“服务端”指的就是上面的存储数据用的后台,而“服务器上的客户端”指的是每一台服务器一般都会在本机存储每一个项目的SVN文件备份,所以需要客户端来拉取数据。
当每次服务端对应项目检测到更新时,通过hook更新本机上对应的客户端项目
这一点的前提是你已经理解前面一点了。
因为由于服务器上的客户端需要自动更新的关系,所以每次开发者客户端提交数据,服务端检测到更新后,就会通过hook来更新本机上的客户端数据,这时候就必须要求“服务器上的客户端”版本小于开发者客户端版本,否则会报错
对于一些刚接触开发的新人,可以不需要完全了解SVN的使用,只需要能用SVN客户端提交,更新代码即可,后续可慢慢学习
一般都会采取TortoiseSVN作为客户端
请注意,客户端一定要和电脑系统位数一致,另外,开发者客户端版本请尽量高
服务端这里采取了VisualSVN-Server(特点是便捷,免费)
请注意,客户端一定要和电脑系统位数一致
这里请记录安装的Repositories目录和VisualSVN-Server\bin目录的地址
//svn默认的本机地址 'https://*****/svn/testProject/trunk/gulpTestDemo/src/test.dcloud.testGulpDemo' //svn的外网地址 'https://对应ip/svn/testProject/trunk/gulpTestDemo/src/test.dcloud.testGulpDemo'
到了这一步,开发者们就可以通过对应的svn地址进行代码管理了
svn客户端的最基本的就是提交代码和更新代码
比如锁定,还原,显示历史资源等等,多使用就知道效果了
SVN服务端的使用最主要的也是用户管理,创建项目等
这里介绍一些SVN中比较高级的用法
这里介绍下SVN自动更新解决方案以及为何要实现自动更新
比如先在有一个项目,项目服务器上安装了SVN服务端,开发者在各自不同的电脑上进行协同开发,项目最终需要部署在服务器上的Ngnix上被外网访问,然后需要达到的效果就是开发这提交源码(一般有一个文件控制更新)时,部署项目能实时更新。请问如何实现?
解决这个问题的第一步是, 项目服务器上安装一个SVN客户端,然后每次服务端检测到更新时,自动更新这个客户端,那么项目服务器上的客户端可以确保每次都是最新源码
解决这个问题的第二步是, 用自动构建工具检测服务器上的客户端的代码,如果发现有更新则自动部署在Nginx上,这一步这里不赘述,如何实现请参考 gulp自动构建开发大纲
这里注意,为什么不能直接将SVN客户端的源码发布?因为一般发布时需要解决缓存问题,以及源码的保护问题,所以源码是不可能直接发布的,一般发布的都是自动构建出来后的发布包(里面可以进行文件压缩,代码混淆,md5解决缓存等一系列操作)
服务器上只需要找到SVN服务端 Repositories下对应的需要更新的project目录的hook文件夹,并将"post-commit.bat"文件放入其中,即可实现自动更新对应客户端项目
hook即所谓的windows钩子,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。比如SVN服务端的项目目录下的hook文件夹的“post-commit.bat”就是当svn提交完毕后会调用的(一般默认是没有.bat这个文件的,自己需要用到时可以创建)
@echo off SET REPOS=%1 SET REV=%2 SET DIR=%REPOS%/hooks SET PATH=%PATH%; SET WORKING_COPY=D:/Websites/www svn update %WORKING_COPY% --username yourname --password yourpsd
以上是对应的被执行的post-commit.bat文件内容,具体请将WORKING_COPY换位对应需要更新的SVN客户端项目所在路径,将密码和用户对应的
需要将SVN服务器的bin目录加入到path路径中
需要设置SVN服务对文件桌面系统权限,否则会报无法读写文件的错
windows->查看本地服务->找到 VisualSVN Server->属性
请注意,这里的登录并不是指开发者登录,而是指本地SVN服务的登录,只有当登录为本地系统账号,并运行服务于桌面交互时,才能更新本机其它路径下的svn客户端,否则会提示错误 post-commit hook failed (exit code 1) with output:
'svn' 无法读写文件。
另外,如果没有添加PATH也一样会提示错误'svn' 不是内部或外部命令,也不是可运行的程序或批处理文件。
服务端目录下放好hook程序后,客户端更新提示post-commit hook failed (exit code 1) with output:SVN被锁定...请clean up
,而且计算每次收到clean up后,再次提交仍然有提示
原因: 没有经过上面的步骤, VisualSvn Server登录用户没有改为本地系统账户登录
提示 the working copy is too old...
原因: 开发者svn客户端版本过低,所以需要升级svn客户端,比如测试服务器的客户端版本号为1.77的话,开发者版本就不能低于这个
在尝试了上述步骤后,仍然提示 'svn' 不是内部或外部命令,也不是可运行的程序或批处理文件。
,而且在服务器本地执行post-commit.bat正常,但是远程提交后出现这个问题
原因是因为服务器端账号权限的问题,请将SVN 服务对应的登录身份换位管理员登录,如下:(对应密码是服务器端管理员对应的密码)
问题:svn https使用内网地址能访问,使用域名能访问,但是外网不能访问
原因: 归根结底还是因为这台服务器没有开放外网访问的443端口,而是只允许内网访问