文章目录
一、SVN介绍
1.1、版本控制系统(VCS)
1、版本控制系统(VCS) 的目标
允许开发者们同时工作
不会重写每个人的改变
维持每个版本的全部的历史
2、VCS 被分成两种
集中版本控制系统 (CVCS)
分散或不集中的版本控制系统 (DVCS)
3、术语
仓库: 仓库是任何一个版本系统的核心,它是开发者们保存工作的总部,被所有的成员共享。
主干:trunk 是主要开发所在的目录,经常被项目开发者们查看。
标签:tags 目录用于储存项目中被命名的快照,标签操作允许给对仓库中特定版本一个描述和一个难忘的名字。
分支:分支操作用于创建开发的另一条线,当你想把开发进程复制进两个不同的方向是很有用的。
工作副本:是仓库的一个快照。工作副本是一个私人工作空间,开发者可以独立于其他成员做自己的工作。
提交更改:提交是一个保存更改的过程,从私人工作空间到中央服务器。
1.2、SVN(Subversion)
1、Apache Subversion 通常被缩写成 SVN;
2、是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目;
3、是集中式的版本管理,如果脱离了服务器,开发者基本上可以说是无法工作的。
4、一般工作流程:
从服务器下载项目组最新代码。
进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。
下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
5、一般目录约定如下:
/trunck:开发主线
/branches:支线副本
/tags:标签副本(一旦创建,不允许修改)
6、一般的,我们的所有的开发都是基于trunk进行开发,当一个版本(release)开发告一段落(开发、测试、文档、制作安装程序、打包等结束后),代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。
当下一个版本/阶段的开发任务开始时,继续在trunk进行开发。此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。解决方法是基于发行版对应的tag,做相应的分支(branch)进行开发。
二、SVN安装配置
2.1、准备
1、环境:
服务端:windows8.1 专业版 32位
客户端:windows7 专业版 64位;
2、下载: http://subversion.apache.org/packages.html
服务端采用:Win32Svn 1.8.16
客户端采用:TortoiseSVN 1.9.4
2.2、服务器安装配置
1、服务器安装
直接默认安装到 C:\Program Files\Subversion\
2、配置环境变量PATH到该目录
2.3、客户端安装配置
直接默认安装 到 D:\Program Files\TortoiseSVN
我选择了command
三、SVN使用(命令)
1、检出
svn checkout [-depth ARG] [--ignore-externals] [-r rev] URL PATH
2、更新
svn info URL_of_WC svn update [-r rev] PATH #更新到版本 svn info URL_of_WC svn update [-r rev] [-depth ARG] [--ignore-externals] PATH
3、提交
svn status -v PATH svn add PATH... svn commit -m "LogMessage" [-depth ARG] [--no-unlock] PATH...
4、差异
svn diff PATH
5、显示日志
svn log -v -r 0:N --limit 100 [--stop-on-copy] PATH #or svn log -v -r M:N [--stop-on-copy] PATH
6、检查修改
svn status -v PATH # or svn status -u -v PATH
7、版本图
svn info URL_of_WC svn log -v URL
8、版本库浏览器
svn info URL_of_WC svn list [-r rev] -v URL
9、编辑冲突
这个命令没有控制台等价实现。它调用TortoiseMerge或者外部三路差异/合并工具察看棘手的冲突,挑选出冲突行。
10、已解决
svn resolved PATH
11、改名
svn rename CURR_PATH NEW_PATH
12、删除
svn delete PATH
13、恢复
svn status -v PATH svn revert [-R] PATH...
14、清理
svn cleanup PATH
15、获得锁
svn status -v PATH svn lock -m "LockMessage" [--force] PATH...
16、释放锁
svn unlock PATH
17、分支/标记
svn copy -m "LogMessage" URL URL #or svn copy -m "LogMessage" URL@rev URL@rev #or svn copy -m "LogMessage" PATH URL
18、切换
svn info URL_of_WC svn switch [-r rev] URL PATH
19、合并
svn merge [--dry-run] --force From_URL@revN To_URL@revM PATH svn diff From_URL@revN To_URL@revM
20、输出
svn export [-r rev] [--ignore-externals] URL Export_PATH
21、重新定位
svn switch --relocate From_URL To_URL
22、在当前位置创建版本库
svnadmin create --fs-type fsfs PATH
23、添加
svn add PATH...
24、导入
svn import -m LogMessage PATH URL
25、追溯
svn blame -r N:M -v PATH svn log -r N:M PATH
26、加入忽略列表
svn propget svn:ignore PATH > tempfile {edit new ignore item into tempfile} svn propset svn:ignore -F tempfile PATH
27、创建补丁
svn diff PATH > patch-file
四、练习-界面模式
4.1、服务器新建项目仓库
1、服务器端,新建一个项目文件夹: E:\svnroot\myproject
2、然后创建仓库,在命令行中输入命令如下:
svnadmin create E:\svnroot\myproject
生成的项目仓库如下所示
3、配置用户权限,配置文件在 E:\svnroot\myproject\conf 目录下,配置过程如下:
A.authz文件:创建用户组group1,里面有三个用户user1, user2和user3,权限为rw(读写权限)。
B.passwd文件:用来修改用户密码
C.svnserve.conf文件:需要更改的就是如下几行,把每行前面的注释#拿掉,如下图:
realm要指定为我们的源码版本库,在这里为myproject.
备注:最后认证不成功,我把服务器权限从新设置了,默认有读写权限.
4、启动SVN服务,利用以下命令:
svnserve -d -r E:\svnroot\myproject
这样就启动了myproject这个仓库的服务(单仓库),如果在svnrepo目录下还有其他仓库,且要同时启动多个仓库,执行svnserve -d -r E:\svnroot即可(多仓库)。
一般情况下,访问SVN仓库的URL格式形如:svn://10.18.77.60/myproject,但如果启动的是单仓库,则URL直接用:svn://10.18.77.60表示。svn协议的默认端口号为3690。
小技巧:如果需要频繁使用该仓库,则可将该SVN服务注册成windows服务,这样在计算机开机时就可以启动该服务。如下图:
删除该windows服务:sc delete svnService。
4.2、客户端设置源
1、新建文件夹 C:\Users\evanxia\Desktop\project
2、右击文件夹project –》 TortoiseSVN –》 Export,如下所示:
单击就会弹出一个对话框,然后输入URL,其他选项不需要更改,Omit externals不要勾选,HEAD Revision选中表示最新的代码版本,接着点击OK即可将代码导出到这个目录中。如下图所示:
此时,该文件夹下面是空的,需要转到下一步中。
4.3、同步拉取项目
1、选中project文件夹右击,选择“SVN Checkout”,并在提示框内输入用户名和密码:
2、完成后,project文件夹下会出现一个隐藏的文件夹“.svn”;
3、为了模仿多个用户,C:\Users\evanxia\Desktop\pj2文件夹也进行同样的操作。
4.4、project新建文件
1、在project文件夹下新建txt文件“test-1605151929.txt”,文件内容如下:
test-1605151929test-1605151929
4.5、project添加提交
1、将文件“test-1605151929.txt”添加到项目,选中文件夹–》右击–》TortoiseSVN–》Add–》OK。如下图所示:
2、提交更新,选中文件夹–》右击–》SVN Commit–》OK,如下图所示:
现在代码已经提交到了服务器端的仓库中了。
3、注意:
update是从SVN服务器上把最新版本下载到本地来;相当于Git的pull;
commit是将本地做过的改动(修改、新增、删除、改名、移动等)上传到SVN服务器;
add是将本地新增的文件或文件夹标注为受SVN控制,但还未上传到服服务器,一般后面会跟一个commit操作。
4.6、多用户冲突解决
1、为了模仿多个用户,建立文件夹 C:\Users\evanxia\Desktop\pj2,以同样的方式Checkout项目;
2、pj2修改test-1605151929.txt文件内容为:
test-1605151929.txttest-1605151929.txt xia
3、project修改test-1605151929.txt文件内容为:
test-1605151929.txttest-1605151929.txt evan
4、pj2进行commit,结果正常
5、project进行commit,OK前,先查看log如下:
然后单机OK,提交修改,会有如下提示:
6、单机OK后,会提示“Update”or“Cancel”,选择“Update”后,会有如下操作
然后选中右侧对话框中的文件,双击,然后在新的窗口手动修改,然后合并,如下图:
然后右击进行commit即可。现在pj2进行Update就可以得到最新的修改了;
建议:在自己对项目修改之前,先进行Update。
4.7、关于恢复
4.8、关于回滚
4.9、关于分支
1、新建分支:选择project目录–》右击–》TortoiseSVN-》Branches/tag
其中branches为规定的分支名称,evanxia为分支名。
2、切换分支:选择project目录–》右击–》TortoiseSVN-》Switch
3、同样pj2新建分支branches/xiaoxia,然后切换到该分支;
4、project修改内容为
test-1605151929.txttest-1605151929.txt xia evan evanxia
pj2修改为:
test-1605151929.txttest-1605151929.txt xia evan feng xiaoxia
然后pj2commit提交,正常,最后project提交不会和之前一样出现冲突,因为两个修改在不同的分支里面。
5、合并分支xiaoxia到evanxia:pj2先切换到evanxia,然后Update,此时evanxia即为当前最新的,然后切换到xiaoxia分支。然后如下操作:
6、
4.8、关于标签
五、实战练习-命令行模式
参考:
1、简单教程:http://www.flyne.org/article/851
2、系统教材:http://wiki.jikexueyuan.com/project/svn/
3、使用笔记:http://mintisan.github.io/notes/svn-tutorial.html#terminologies
4、官网:http://subversion.apache.org/packages.html
5、服务器端配置:http://www.programgo.com/article/17312665314/;jsessionid=B411B3ADD08F5B7E0975F4DEB32A9FEE
6、SVN命令:https://tortoisesvn.net/docs/release/TortoiseSVN_zh_CN/tsvn-cli-main.html
7、http://km.oa.com/group/2280/articles/show/72450?kmref=search&from_page=1&no=1&is_from_iso=1
转载标明出处:https://blog.evanxia.com/2016/05/636