尚硅谷SVN版本控制软件教程(一套掌握svn操作)
学习网址:https://www.bilibili.com/video/BV1mW411M7yR/?spm_id_from=333.999.0.0&vd_source=461545ff50a35eaeaa8218ecdc5f7152
学习时长:1小时46分钟
未学习
5.启动服务器
6.命令行
12.权限
1.提出问题
开发中的实际问题
- 小明负责的模块就要完成了,就在即将 Release 之前的一瞬间,电脑突然蓝屏, 硬盘光荣牺牲!几个月来的努力付之东流——需求之一:
备份
! - 这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这 被改得面目全非的代码已经回不到从前了。什么地方能买到哆啦 A 梦的时光机啊? 需求之二:
代码还原
! - 小刚和小强先后从文件服务器上下载了同一个文件: Analysis.java 。小刚在Analysis.java 文件中的第 30 行声明了一个方法,叫 count(),先保存到了文件服务器上;小强在 Analysis.java 文件中的第 50 行声明了一个方法,叫 sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记忆中了——需求之三:
协同修改
! - 老许是一位项目经理,我会告诉你他把每一个版本都保存一份吗?我会告诉你这些工程里其实有很多文件都是重复的吗?我会告诉你老许为这事删了很多电影吗?——需求之四:
多版本项目文件管理
! - 老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个该死的 Bug 调试了 30 多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘流和正经牛都不承认是自己干的!——需求之五:
追溯问题代码的编写人和编写时间
! - 小温这两天幸福的如同掉进了蜜罐里,因为他成功的得到了前台 MM 丽丽的芳心, 可他郁闷的是这几天总是收到 QA 小组的邮件,要求他修正程序中存在的 Bug, 可他自己本地电脑上是没有这些 Bug 的,“难道我的代码被哪个孙子给改了?”。是的,小温没来的时候,丽丽是 QA 小组小郑的女朋友啊!——需求之六:
权限控制
!
2.SVN简介
版本控制简介
版本控制
[Revision control],最初来源于工程设计领域,是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。是一种记录若干文件内容变化, 以便将来查阅特定版本修订情况的系统。- Subversion 就是一款实现版本控制的工具软件,通常也称为版本控制器,简称 SVN。Subversion 是 Apache 软件基金会组织下的一个项目。
- Subversion 的优良特性
①目录版本控制
CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录树的修改,文件和目录都是版本控制的,结果就是可以在客户端对文件和目录执行移动和复制命令。
②原子提交
提交要么完全进入版本库,要么一点都没有,这允许开发者以一个逻辑块提交修改。
③版本控制的元数据
每个文件和目录都有一组附加的“属性”,你可以发明和保存任意的键/值对, 属性也会像文件内容一样被纳入版本控制。
④可选的网络层
Subversion 在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制,Subversion 的“高级”服务器是 Apache 网络服务器的一个模块,使用 HTTP 的变种协议 WebDAV/DeltaV 通讯,这给了 Subversion 在稳定性和交互性方面很大的好处,可以直接使用服务器的特性,例如认证、授权、传输压缩和版本库浏览等等。也有一个轻型的,单独运行的 Subversion 服务器,这个服务器使用自己的协议,可以轻松的用 SSH 封装。
⑤一致的数据处理
Subversion 使用二进制文件差异算法展现文件的区别,对于文本(人类可读) 和二进制(人类不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在版本库中,差异在网络上双向传递。
⑥高效的分支和标签
分支与标签的代价不与工程的大小成比例,Subversion 建立分支与标签时只是复制项目,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少并且相对固定的时间,以及很小的版本库空间。 - SVN 的工作原理:采取
客户端/服务器
模式——在服务器的版本库中保存项目文件的各个版本,所有参与协同开发的程序员在自己本地电脑上保存一个工作副本。SVN 支持程序员将本地副本更新到服务器端的最新版本,也支持将本地副本的最新改变更新到服务器端,而且后面的更新不会覆盖前面的更新,而是作为一个新 的版本被保存下来——SVN 甚至支持将本地工作副本恢复为服务器端保存的某一个历史版本。 - SVN 基本操作
①检出
(checkout):将一个服务器端创建好的项目整个下载到本地,这是到项目组后参与开发的第一步,只需执行一次。
②更新
(update):将本地文件更新为服务器端的最新版本,通常为每天上班时
或修改公共文件之前执行一次。
③提交
(commit):将本地修改提交到服务器端。通常每天下班前或每实现一个功能、完成一个模块时执行一次。
3.服务端程序安装
参考文章:【图文详解】入职必备——SVN使用教程
SVN官网:https://svnbucket.com/
4.创建版本库
①为什么要配置版本库?
Subversion 是将文件数据信息保存到版本库中进行管理的,为了满足用户的不同需求,Subversion 允许用户对版本库目录进行定制。
②在一个非中文无空格目录下创建一个文件夹,作为版本库的根目录。例如:D:\DevRepository\Subversion
③在版本库根目录下创建与具体项目对应的子目录——这样做的目的是使一个
SVN 服务器能够同时管理多个项目,而不是为每一个项目搭建一个 SVN 服务器——这显然太浪费资源了。
例如:D:\DevRepository\Subversion\CRM D:\DevRepository\Subversion\ERP D:\DevRepository\Subversion\OA
④创建版本库命令格式
⑤版本库目录结构
版本库创建成功后会在指定目录下产生如下的目录结构
5.启动服务器
6.命令行
7.Eclipse插件安装
1.Eclipse 插件应用市场
在 Eclipse 中访问 Eclipse Marketplace Client 可以搜索 Subversion,下载插件,按提示安装即可。
2.使用压缩包
如果不能联网可以使用下载好的插件压缩包 eclipse_svn_site-1.10.5.zip,这个压缩包是从 http://subclipse.tigris.org/网站(subclipse 是这款 Eclipse 插件的名称)上下载的。安装方法是:
- 解压 eclipse_svn_site-1.10.5.zip 中的 features 和 plugins 这两个目录
- 将 features 和 plugins 复制到 Eclipse 安装目录/dropins/eclipse_svn_site-1.10.5 下面
- 重启 Eclipse
- 进入 Eclipse 依次打开 Window→Preferences→Team→SVN,看到如下界面即说明 SVN 插件安装成功
8.Eclipse分享和检出
共享项目
1.在 Eclipse 中创建的新项目想要发布到 SVN 服务器端,可以通过“共享”项目实现
2.在项目上点右键→Team→Share Project…→选择一种版本控制工具
选择一个资源库位置
切换到 Team Synchronizing 透视图,选择项目中要提交的内容,通常是项目中的全部内容
检出
检出(下载文件)分两种情况
1.从服务器端获取到的是一些零散的文件,不能作为项目检出
此时会弹出一个新建项目向导,之所以会这样是因为我们需要创建一个项目来保存从服务器端取回的文件
2.从服务器端获取到的是一个完整的项目
例如
此时必须作为项目检出
项目从服务器检出后,会成为一个工作副本,根目录下会自动创建.svn 隐藏目录
9.更新提交
提交
- 新创建文件后,文件图标上会以“?”标识,表示该文件尚未纳入版本控制
- 在新创建的文件上点右键→Team→添加至版本控制,这样文件图标上会显示“+”,表示当前文件已纳入版本控制,但还未提交至服务器。
- 在要提交的文件上点右键→Team→提交…会提交文件,在弹出的对话框中可以不填写日志。文件提交后,图标会变为“金色的圆柱体”表示当前文件的版本和服务器端一致。
- 文件修改后图标会变为“*”,表示当前文件或目录包含未提交的修改。在文件上点右键→Team→提交,进行提交
更新
①更新整个项目时可以在项目上点右键→Team→更新
②更新某个具体的文件时,可以在文件上点右键→Team→更新
10.仓库分析
创建资源库位置
1.切换到透视图 SVN 资源库研究
2.创建资源库位置
此时可以查看版本库中的文件及目录结构
补充:如何确定版本库地址?
11.冲突
什么情况下会发生冲突
1.两个开发人员,Harry 和 Sally,分别从服务器端下载了文件 A。
2.Harry 修改之后,A 变成了 A’,Sally 修改之后,A 变成了 A’’。
3.Harry 先一步提交,使服务器端文件的版本也变成了 A’
4.Sally 本地的文件 A’’已经过时了,此时她已无法提交文件,服务器会要求她先进行一次更新操作。
5.此时 Sally 的更新操作有两种可能
(1) Sally 所做的修改与 Harry 不是同一个位置,更新操作尝试合并文件成功。
(2) Sally 所做的修改与 Harry 恰好是同一个位置,更新操作尝试合并文件失败, 发生冲突。
发生冲突后,本地工作副本会发生如下变化
(1)文件 A 中的内容发生如下改变
public static void main(String[] args) {
System.out.println("Edit By Command!");
System.out.println("Edit By Command!");
<<<<<<< .mine
System.out.println("Edit By Eclipse!");//本地文件
=======
System.out.println("Edit By Command!New Edit");//服务器文件
>>>>>>> .r14
System.out.println("Edit By Command!");
System.out.println("Edit By Command!");
}
其中,从mine 到=之间是发生冲突时本地副本的内容。从
=到r14 是发生冲突时服务器端的最新内容。注意这里 r 后面的数字是发生冲突时服务器端的版本号,有可能是任何整数值,r14 只是一个例子。
同时文件图标变成一个“黄色的!”。
(2)与冲突文件同目录下新增文件,扩展名为.mine,其内容是发生冲突时本地副本的文件内容。
(3)与冲突文件同目录下新增文件,扩展名为.r 小版本号,例如 MyCRM.java.r13, 其内容是冲突发生之前,服务器端的文件内容,可以作为解决冲突的参照。
(4)与冲突文件同目录下新增文件,扩展名为.r 大版本号,例如 MyCRM.java.r14, 其内容是冲突发生时,服务器端的文件内容。
解决冲突
(1)在冲突文件上点右键→Team→编辑冲突…→出现如下界面
Merged
:合并(本地版本)
Theirs
:他们的(服务器版本)
以对比的方式将本地内容与冲突内容显示出来,其中左侧为本地内容,右侧为冲突内容。其中本地内容是可以修改的。
(2)根据需要和实际情况将本地内容更正——这个过程很可能需要牵涉冲突的
两位开发人员进行必要的沟通——机器与程序目前还不能完全取代人工智能。更正后文件图标会变成一个“四角形”,同时冲突文件内的<<<<<<< .mine、======= 以及>>>>>>> .r14 等标记都会被去掉。
(3)在冲突文件上点右键→Team→标记为解决
随便选
此时.mine 文件和.r 版本号文件都会被自动删除,冲突文件的图标变为“*”,表示可以提交。文件本身变为解决冲突之后的状态。
(4)提交文件,文件图标变为“金色圆柱体”。
12.权限
13.时光机
回复历史版本
1.在需要回复的文件上点右键→Team→显示资源历史记录→得到如下界面
2.选择某一个历史记录点右键→获取内容。文件就会恢复到指定版本的状态,同时图标变为“*”。
3.获取历史记录时,如果出现如下错误提示
可以通过将对应版本库中的 svnserve.conf 文件中的 anon-access 设置为 none 解决。
14.TortoiseSVN
TortoiseSVN 简介
TortoiseSVN 是一个 Windows 下的版本控制系统 Apache™ Subversion®的客户端工具。
TortoiseSVN 的优良特性
①外壳集成
TortoiseSVN 无缝地整合进 Windows 的外壳(例如资源管理器)。
②重载图标
每个版本控制的文件和目录的状态使用小的重载图标表示,可以让你立刻看出工作副本的状态。
③图形用户界面
当你列出文件或文件夹的更改时,你可以点击任意版本查看提交注释。也可以看到更改过的文件列表 - 只要双击文件就可以查看更改内容。
提交对话框列出了本次提交将要包括的条目,每一个条目有一个复选框,所
以你可以选择包括哪些条目。未版本控制的文件也会被列出,以防你忘记添加新文件。
④Subversion 命令的简便访问
所有的 Subversion 命令存在于资源管理器的右键菜单,TortoiseSVN 在那里添加子菜单。
1.检出
①创建一个目录用来存放检出得到的文件,例如 MyCRM
②进入目录 MyCRM,点右键
③可以看到检出得到的文件
此时文件图标上没有任何标识。可能你会想到通过重启电脑的方式解决这一问题——其实不用这么麻烦。文件图标是受外壳程序控制的,我们只需要重启外壳程序——explorer.exe 就可以了。打开任务管理器,选中 explorer.exe 进程,结束进程,然后新建进程 explorer.exe 就可以了。
如果一切顺利的话,你会看到文件图标变成了这样:
2.TortoiseSVN 图标含义
3.纳入版本控制
①新建文件 abc.txt
②在文件上点右键
③添加后文件图标发生变化
4.提交
1.使用 TortoiseSVN 可以提交具体某一个文件,或某一个目录下的所有改变。方法就是在想要提交的项目下点右键,然后 SVN Commit…,就可以看到如下界面
2.日志内容如果不填,TortoiseSVN 会提交一个空字符串作为日志信息。
3.提交后显示信息如下
4.没有纳入版本控制的文件默认是不在提交范围内的,直接在新创建的文件上点右键只能看到 add 操作的选项,如前所述。但在新创建的文件所在目录点右键选择 SVN commit…,可以看到如下界面
将文件 newFile.txt 选中
同样可以提交文件,TortoiseSVN 会帮我们自动将 newFile.txt 纳入版本控制
5.更新
在要更新的文件或目录上点右键→SVN Update
6.回复历史版本
①查看历史版本内容
[1]首先需要把对应版本库的匿名访问权限设置为 none:anon-access = none
[2]在要查看历史版本的文件上点右键→TortoiseSVN→Show log
[3]在感兴趣的历史版本上点右键,可以与当前工作副本进行比较,或直接打开。
②在要回复历史版本的文件上点右键→Update to revision
填上想要回到的版本即可
7.解决冲突
1.文件发生冲突时的状态和在 Eclipse 中一样,这里就不赘述了。
2.在冲突的文件上点右键→Edit Conflicts
Theirs
:远程文件
Mine
:本地文件
Merged
:已合并文件
3.有“叹号”的行是发生冲突的行
4.在冲突行点右键
可以选择四种操作:
[1]使用他们的:from ‘theirs’
[2]使用我的:from ‘mine’
[3]把我的放在他们的前面:from ‘mine’ before ‘theirs’
[4]把他们的放在我的前面:from ‘theirs’ before ‘theirs’
5.在冲突解决后,直接保存——这时 TortoiseSVN 自动弹出如下确认界面
冲突解决
保留冲突
6.文件变为红色叹号标志,自动生成的三个文件被删除。提交修改即可。