1.SVN中的基础概念
- repository:源代码库,源代码统一存放的地方
- checkout:当手上没有源代码时,可以从源代码库中checkout一份
- commit:当你已经修改了代码,就需要commit到源代码仓库
- update:当你已经checkout了一份源代码后,update一下就可以和源代码仓库上的源代码同步,手上的代码就会有最新的变更。日常使用流程:假设你已经在几天前checkout,update获取最新的代码->自己进行修改并调试成功源代码->commit(大家就可以看到你的修改)
- 如果两个程序员同时修改了同一个文件, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,即两个程序员只要不是修改同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。
2.linux系统下安装SVN
- yum install subversion(Centos下安装)
- sudo apt-get install subversion(Ubuntu下安装)
- 查看SVN的版本:subversion --version
cdl@cdl-Inspiron-5421:~$ svn --version svn,版本 1.9.3 (r1718519) 编译于 Jul 26 2019,15:51:17 在 x86_64-pc-linux-gnu
3.SVN启动模式
- 在服务端进行SVN版本库的相关配置,手动创建版本库目录:
cdl@cdl-Inspiron-5421:~$ sudo mkdir /opt/svn [sudo] cdl 的密码:
- 利用SVN命令创建版本库:
svnadmin create /opt/svn/CurryCoder
- 使用命令svnserve启动服务:
- authz配置文件中对版本库的配置:
[groups] admin=user1 dev=user2 [CurryCoder:/] @admin=rw user2=r [CurryCoder01:/] @admin=rw user2=r
- 使用svn://192.168.0.1/CurryCoder即可访问CurryCoder版本库
- authz配置文件中对版本库权限的配置为:
[groups] admin=user1 dev=user2 [/] @admin=rw user2=r
- 使用svn://192.168.0.1/即可访问CurryCoder版本库
- -r:决定了版本库的访问方式;
- --listen-port:指定svn监听端口,不加此参数,默认为3690
svnserve -d -r 目录 --listen-port 端口号
- 单库svnserve方式:一个svnserve只能为一个版本库工作;
svnserve -d -r /opt/svn/CurryCoder
- 多库svnserve方式:指定到版本的上级目录,一个svnserve可以为多个版本库工作。
svnserve -d -r /opt/svn
3.创建版本库
- 使用svnadmin create 目录进行创建版本库。
cdl@cdl-Inspiron-5421:~$ sudo svnadmin create /opt/svn/CurryCoder01 [sudo] cdl 的密码: cdl@cdl-Inspiron-5421:~$ ll /opt/svn/CurryCoder01/ 总用量 32 drwxr-xr-x 6 root root 4096 5月 26 11:19 ./ drwxr-xr-x 4 root root 4096 5月 26 11:19 ../ drwxr-xr-x 2 root root 4096 5月 26 11:19 conf/ drwxr-sr-x 6 root root 4096 5月 26 11:19 db/ -r--r--r-- 1 root root 2 5月 26 11:19 format drwxr-xr-x 2 root root 4096 5月 26 11:19 hooks/ drwxr-xr-x 2 root root 4096 5月 26 11:19 locks/ -rw-r--r-- 1 root root 246 5月 26 11:19 README.txt
- 进入/opt/svn/CurryCoder01/conf目录,修改默认配置参数,包括svnserve.conf、passwd、authz等信息。
- svn服务配置文件为版本库目录中的文件conf/svnserve.conf,该文件仅由一个[general]配置字段组成:
[general] anon-access = none # 控制非授权用户访问版本库的权限 auth-access = write # 控制授权用户访问版本库的权限。 password-db = /home/svn/passwd authz-db = /home/svn/authz # 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。默认值:authz realm = tiku # 指定版本库的认证域,即在登录时提示的认证域名称。
- 用户名口令文件passwd:用户名口令文件由svnserve.conf的配置项password-db指定,默认为conf目录中的passwd。该文件仅由一个[users]配置段组成:
[users] admin = admin # <用户名> = <口令> CurryCoder = 123456
- 权限配置文件:权限配置文件由svnserve.conf的配置项authz-db指定,默认为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成:
[groups] # <用户组> = <用户列表> g_admin = admin,CurryCoder [admintools:/] # [<版本库名>:<路径>] @g_admin = rw * = [test:/home/CurryCoder] CurryCoder = rw * = r
4.checkout(克隆副本)操作
- 通过svn://192.168.0.1(具体的svn服务器地址)/CurryCoder01 --username=user01,如下所示:
cdl@cdl-Inspiron-5421:~$ svn checkout svn://192.168.0.1/CurryCoder01 --username=user01 A CurryCoder01/trunk A CurryCoder01/branches A CurryCoder01/tags Checked out revision 1.
- checkout成功后在当前目录下生成CurryCoder01副本目录,如下所示:
root@cdl-Inspiron-5421:/home/cdl# ll CurryCoder01/ total 24 drwxr-xr-x 6 root root 4096 Jul 21 19:19 ./ drwxr-xr-x 3 root root 4096 Jul 21 19:10 ../ drwxr-xr-x 2 root root 4096 Jul 21 19:19 branches/ drwxr-xr-x 4 root root 4096 Jul 21 19:19 .svn/ drwxr-xr-x 2 root root 4096 Jul 21 19:19 tags/ drwxr-xr-x 2 root root 4096 Jul 21 19:19 trunk/
5.解决版本冲突
- 版本冲突的产生原因:假设A和B两个程序员都在版本号为100时,修改了HelloWorld.html文件。程序员A在修改完成后提交HelloWorld.html文件到服务器。此时,提交成功后HelloWorld.html文件的版本号变为101。同时,B程序员在版本号为100的HelloWorld.html文件上修改。修改完成后,提交到服务器时,由于不是在当前最新的101版本上修改的,所以提交时会失败。
- 查看修改后的文件内容:
root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# cat HelloWorld.html HelloWorld! http://www.runoob.com/
- 查看更改:
root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn diff Index: HelloWorld.html =================================================================== --- HelloWorld.html (revision 5) +++ HelloWorld.html (working copy) @@ -1,2 +1 @@ -HelloWorld! http://www.runoob.com/ +HelloWorld! http://www.runoob.com/!
- user01提交会出现失败:
root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn commit -m "change HelloWorld.html first" Sending HelloWorld.html Transmitting file data .svn: E160028: Commit failed (details follow): svn: E160028: File '/trunk/HelloWorld.html' is out of date
- 提交失败的原因:HelloWorld.html已经被user02修改并提交到了仓库。svn不会允许user01提交更改,因为user02已经修改了仓库,所以user01的工作副本已经失效。为了避免两人的代码被互相覆盖,svn不允许进行这样的操作。所以user01在提交更改之前必须先更新工作副本。所以使用update命令,如下:
root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn update Updating '.': C HelloWorld.html Updated to revision 6. Conflict discovered in file 'HelloWorld.html'. Select: (p) postpone, (df) show diff, (e) edit file, (m) merge, (mc) my side of conflict, (tc) their side of conflict, # 输入mc表示以本地文件为主,也可以使用其他选项对冲突文件进行不同的操作。 (s) show all options: mc Resolved conflicted state of 'HelloWorld.html' Summary of conflicts: Text conflicts: 0 remaining (and 1 already resolved)
- 默认是更新到最新的版本,也可以指定更新到哪个版本:
svn update -r6
- 工作副本已经与仓库同步,可以进行提交:
root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn commit -m "change HelloWorld.html second"