技术交流QQ群:1027579432,欢迎你的加入!

1.SVN中的基础概念repository:源代码库,源代码统一存放的地方

checkout:当手上没有源代码时,可以从源代码库中checkout一份

commit:当你已经修改了代码,就需要commit到源代码仓库

update:当你已经checkout了一份源代码后,update一下就可以和源代码仓库上的源代码同步,手上的代码就会有最新的变更。 日常使用流程:假设你已经在几天前checkout,update获取最新的代码->自己进行修改并调试成功源代码->commit(大家就可以看到你的修改)

如果两个程序员同时修改了同一个文件, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,即两个程序员只要不是修改同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。

2.linux系统下安装SVNyum 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启动服务:-r:决定了版本库的访问方式;

--listen-port:指定svn监听端口,不加此参数,默认为3690

svnserve -d -r 目录 --listen-port 端口号

单库svnserve方式:一个svnserve只能为一个版本库工作;

svnserve -d -r /opt/svn/CurryCoderauthz配置文件中对版本库权限的配置为:

[groups]

admin=user1

dev=user2

[/]

@admin=rw

user2=r

使用类似这样的URL:svn://192.168.0.1/ 即可访问CurryCoder版本库

多库svnserve方式:指定到版本的上级目录,一个svnserve可以为多个版本库工作。

svnserve -d -r /opt/svnauthz配置文件中对版本库的配置:

[groups]

admin=user1

dev=user2

[CurryCoder:/]

@admin=rw

user2=r

[CurryCoder01:/]

@admin=rw

user2=r

使用类似这样的URL:svn://192.168.0.1/CurryCoder 即可访问CurryCoder版本库

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(克隆副本)操作通过url 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"

6.SVN提交操作在版本库中增加一个readme的说明文件:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# cat readme this is SVN tutorial.

查看工作副本的状态:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn status ? readme # ?说明它还未加到版本控制中

将文件readme加到版本控制,等待提交到版本库。

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn add readme A readme

查看工作副本的状态:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn status A readme # A意味着这个文件已经被成功地添加到了版本控制中

为了把readme存储到版本库中,使用commit -m加上注释信息来提交:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn commit -m "SVN readme." Adding readme Transmitting file data . Committed revision 8. svn commit -m "SVN readme."

7.SVN版本回退当我们想放弃对文件的修改,可以使用 SVN revert 命令。svn revert操作将撤销任何文件或目录里的局部更改。

对文件readme文件进行修改(readme文件还没有被提交),查看文件状态:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn status M readme # M表示readme文件已经被修改

但是,发现修改readme文件出现错误,要撤销修改,通过svn revert命令将文件readme回退到未修改状态:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk$# svn revert readme Reverted 'readme'

revert操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用-R命令:

svn revert -R trunk

如何恢复一个已经提交的版本?为了消除一个旧版本,必须撤销旧版本里的所有更改然后提交一个新版本。首先,找到仓库的当前版本,假设现在是版本22,我们要撤销回之前的版本,比如版本21。

svn merge -r 22:21 readme

8.SVN查看历史信息svn log: 显示svn的版本作者、日期、路径等信息;如果只希望查看特定的某两个版本之间的信息,可以使用:svn log -r 6:8

如果只想查看某个文件的版本修改信息,可以使用:svn log 文件路径

如果希望得到目录的信息要加 -v 如果希望显示限定N条记录的目录信息:svn log -l N -v

svn diff: 显示特定修改的行的详细信息;如果用svn diff,不带任何参数,它将会比较你的工作文件与缓存在.svn的"原始"拷贝

比较你工作拷贝和版本库中版本号为3的文件rule.txt: svn diff -r rule.txt

比较 svn 工作版本中版本号2和3的这个文件的变化:svn diff -r 2:3 rule.txt

svn cat:将特定版本的某个文件内容显示在屏幕上;如果只是希望检查一个过去版本,不希望查看它们的区别: svn cat -r 版本号 rule.txt

svn list:可以在不下载文件到本地目录的情况下来察看目录中的文件;

9.SVN分支应用场景:当有人希望开发过程分开成两条不同的路线时,此时使用分支。比如项目下有两个小组,svn下有一个trunk版本。由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组1继续完成原来正进行到一半的工作(某个模块),小组2进行新需求的开发。那么此时,我们就可以为小组2建立一个分支,分支其实就是trunk版(主干线)的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,最后我们可以通过(合并)功能,将分支合并到trunk上来,从而最后合并为一个项目。

本地副本中创建my_branch分支:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# svn copy branches/my_branch

查看状态:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# svn status A + branches/my_branch A + branches/my_branch/HelloWorld.html A + branches/my_branch/readme

提交新增的分支到版本库中:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# svn commit -m "add my_branch" Adding branches/my_branch Replacing branches/my_branch/HelloWorld.html Adding branches/my_branch/readme Committed revision 9.

切换到分支路径并创建index.html文件:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# cd branches/my_branch/ root@cdl-Inspiron-5421:~/svn/CurryCoder01/branches/my_branch# ls HelloWorld.html index.html readme

将index.html加入版本控制,并提交到版本库中:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/branches/my_branch# svn status ? index.html root@cdl-Inspiron-5421:~/svn/CurryCoder01/branches/my_branch# svn add index.html A index.html root@cdl-Inspiron-5421:~/svn/CurryCoder01/branches/my_branch# svn commit -m "add index.html" Adding index.html Transmitting file data . Committed revision 10.

切换到trunk主分支,执行svn update,然后将my_branch分支合并到trunk主分支中:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk# svn merge ../branches/my_branch/ --- Merging r10 into '.': A index.html --- Recording mergeinfo for merge of r10 into '.': G .

将合并好的trunk主分支提交到版本库中:

root@cdl-Inspiron-5421:~/svn/CurryCoder01/trunk# svn commit -m "add index.html" Adding index.html Transmitting file data . Committed revision 11.

10.SVN标签版本管理系统支持tag选项,通过使用tag的概念,可以给某一个具体版本的代码一个更加有意义的名字。

在本地工作副本创建一个tag:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# svn copy trunk/ tags/v1.0

A tags/v1.0

上面的代码成功完成,新的目录将会被创建在tags目录下:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# ls tags/

v1.0

root@cdl-Inspiron-5421:~/svn/CurryCoder01# ls tags/v1.0/

HelloWorld.html readme

查看状态:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# svn status

A + tags/v1.0

提交tag内容:

root@cdl-Inspiron-5421:~/svn/CurryCoder01# svn commit -m "tags v1.0"

Adding tags/v1.0

Transmitting file data ..

Committed revision 14.

svn如何退回软件版本_SVN版本控制工具的使用相关推荐

  1. 小汤学编程之JavaEE学习day07——版本控制工具:SVN、GIT

    一.SVN 1.SVN介绍     2.SVN安装     3.SVN操作 二.GIT 1.GIT介绍     2.集中式和分布式     3.GIT的基本使用     4.GIT时光机     5. ...

  2. (一)版本控制工具(svn)

    1.SVN是什么 svn是一个集中式的版本控制工具 2.SVN解决什么问题 SVN Repository可以是自己计算机上的一个目录,或者是随身碟(不建议这样用).当然也可以是公司的服务器. SVN有 ...

  3. Git(分布式版本控制工具)

    [标注]:该笔记是转载自黑马Git教程,里面是包含自己做的笔记,黑马笔记开放共享,不存在侵权的问题,文章最后给出了资料的网盘链接 Git的学习是不依赖我们前面学习的知识,就算没有学习java也可以学习 ...

  4. Git分布式版本控制工具【IDEA版】【安装和使用以及上传代码到Gitee】(一篇文章精通系列)

    一.目标 了解Git基本概念 能够概述git工作流程 能够使用Git常用命令 熟悉Git代码托管服务 能够使用idea操作git 二.Git概述 1.开发中的实际场景 场景一:备份 小明负责的模块就要 ...

  5. 各种版本控制工具的对比

    1.集中式版本控制工具 有   SVN, CVS,  ClearCase 集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网 ...

  6. 如何在版本控制工具中管理Sencha Architect的項目

    根據數次痛苦的經歷結合stack overflow上的解答,發現原來還是可以使用svn.git之類的版本控制工具管理Sencha Architect生成的項目的. 具體的要點如下,假定項目記作{PRO ...

  7. 版本控制工具 svn 一

    一.svn 概述 1).svn的作用 1.多人协作开发:2.远程控制:3.版本控制 2).软件控制管理工具发展之路 SCM:软件配置管理,所谓的软件配置管理实际就是软件源代码的 控制与管理. CVS: ...

  8. 版本控制工具(CVS、SVN、GIT)简介

    2019独角兽企业重金招聘Python工程师标准>>> 版本控制工具:  提供完备的版本管理功能,用于存储.追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基 ...

  9. 项目管理实践之版本控制工具SVN在Windows平台下的平台搭建

    通过<项目管理实践之版本控制工具SVN>我们知道,在windows平台下,如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为 ...

  10. 项目管理实践之版本控制工具SVN

    SVN,即Subversion,是一个自由开源的版本控制系统,可以将数据恢复到早期版本,或者检查数据修改的历史,这些数据可以是源代码,也可以是其他类型的文件. 在SVN出现之前,CVS是开源世界版本控 ...

最新文章

  1. 今天,进程告诉我线程它它它它不想活了
  2. PHP - 获取音频长度
  3. 第一个dotnetcore程序,Hello World
  4. UIScrollView的delegate方法妙用之让UICollectionView滑动到某个你想要的位置
  5. 黄聪: Bootstrap之Form表单验证神器: BootstrapValidator(转)
  6. SAP Spartacus cxFocus的config属性的赋值原理
  7. mysql insert插入的3种方法
  8. hdu_3555 bomb
  9. 泛函编程(7)-数据结构-List-折叠算法
  10. 后摩尔时代下先进封装技术
  11. Matlab 棋盘制作
  12. telnet控制路由器交换机与微信公众平台
  13. cordova 实现第三方登录及分享,qq,微信,微博
  14. ETL数据清洗Kettle工具
  15. 本地代码推到远程仓库——gitee
  16. mysql判断字段是否存在不存在添加字段_mysql 新增字段时判断字段是否存在
  17. 东北大学软件学院数据库系统概述——常用的聚合函数
  18. 时间管理-项目管理的核心
  19. fit parse解析佳明.fit 运动数据,模仿zwift数据展示
  20. 帝国EmpireCMS7.5最新后台漏洞审计

热门文章

  1. 中国物流产业发展形势与竞争格局展望报告2022版
  2. 虚幻引擎源码分析(3)
  3. power iso linux启动盘,怎么用poweriso制作u盘启动盘win10_poweriso制作u盘启动盘win10详细步骤...
  4. android fmod,Android采用fmod库实现变声效果
  5. 开源可视化网页抓取工具Portia 爬虫
  6. kb4023057安装失败_微软向旧版Windows 10推送易升补丁出现无法安装问题
  7. ZBrush建模的15个小技巧,萌新小白都用得上的干货,速看
  8. python身份证验证程序_python验证身份证信息实例代码
  9. MATLAB2016b 下载和安装(亲测)
  10. edius隐藏快捷键_超级实用的edius常用快捷键