目录
1. SVN 是干什么的?
同学们是不是在小组协作完成项目的过程中,常常因为文件版本混乱而苦恼,由于多人修改而导致某些修改内容的丢失?找不到最新版本?
看到下面的图片,同学们有没有似曾相识的感觉,为了保留更改记录,我们会保存若干个版本的副本,通过这种方式把修改的历史版本保存下来。这样万一某个版本有问题,我们还可以找到之前的版本。
但是这种copy方式有一些明显的缺陷:
1.很难知道各个版本之间做了那些修改呢?必须打开文档进行比对查看。
2.如果遇到多人同时编辑修改文档,则往往容易出现文件混乱,部分信息丢失的问题,尤其是大家的期末设计,多个同学完成代码,就常常遇到这样的困惑。
那么有没有比copy方式更好的解决方法呢?
当然有更好的解决方法!!!工于利其事必先利其器,下面我们就来介绍较为流行的版本管理工具SVN,它可以帮助你记录文件的历史版本,并让多人协同工作,完成文件的编辑。.
SVN是一个开放源代码的版本控制系统,。它是集中式版本管理,用户将文件提交到服务器。当然用户也可以根据需要下载后修改指定版本的文件,然后再提交到服务器。
由于它是集中管理,所以存在单点故障的问题。
SVN只关心每个版本更新了那些文件,以及更新了哪些内容
2.SVN的安装
Svn分为服务器端和客户端。
服务器端:保存文件版本仓库。通常一个公司在服务器安装一个服务器端,保存文件历时版本,
客户端:每位开发安装一个客户端。开发人员通过客户端连接到服务器后,下载指定版本的文件。修改后,可以更新到服务器形成性的版本
从超星班级资料中下载服务器安装包进行安装
同学们可以到超星班级资料下载服务器端和客户端安装程序。如果是演练,则只需要安装客户端。
不能访问超星的同学可以从百度网盘下载。
链接:https://pan.baidu.com/s/1unHFP27MlTu_wCmZkdrzvg
提取码:1234
2.1 SVN服务器的安装
- 双击安装包
- 点击 【Next】
3.同意许可协议后,点击 【Next】
4.采用默认安装选项,点击 【Next】
5.根据需要设置安装路径和版本库位置后,点击【Next】
6.选择授权方式后,点击【next】
7.点击【install】
8.点击【Finish】开始安装svn
此时,我们会进入svn服务器控制界面
以后可通过安装路径下的VisualSVM server.msc启动SVN服务器控制面板
9.安装之后可以到安装路径下查看下程序文件夹和版本仓库文件夹
10.使用命令可以查看已经安装svn server的版本号
2.2 SVN客户端的安装
1.双击安装包
2.在用户许可协议上点击 【Next】
3.设置安装路径后,点击【Next】
4.点击【Install】开始安装
5. 点击【finish】,完成安装
6. 安装完成后,可以到安装目录中去看一下
也可以到桌面上点击右键菜单验证,是否出现如下所示的右键菜单以验证客户端是否安装成功。
3. SVN的使用
3.1 创建用户(服务器端)
请同学们尝试:服务器端创建3个用户 user1/123456 user2/123456 user3/123456
输入账号信息后,点击【ok】
三个用户添加后的效果如下所示:
3.2 创建用户组(服务器端)
在服务器端点击创建用户组
请同学们尝试:创建1个图书管理系统开发组,组名为:book_dev ,并在组中添加 user1,user2
效果如下:
3.3 创建版本库(服务器端)
服务器端创建仓库
选择仓库的类型
设置访问权限
如下图所示。已经成功创建了仓库“图书管理系统”
3.4 为仓库设置用户访问权限(服务器端)
3.5 项目导入到服务器
目前svn服务器上的仓库”图书管理系统“目前是空的。
开发人员想将本地的项目上传到svn服务器,我们来看看他怎么完成。
开发人员进入要上传的文件夹的根目录下,点击右键菜单 Tortoise -> import
在'URL of repository"中输入配置管理员给你的项目地址, 填写日志后,点击【ok】,即可完成提交
如果是第一次进行svn操作,需要输入用户信息,以便配置管理工具了解,是谁在操作。
此时,SVN服务器上刷新仓库,就可以看到刚才提交的文件了。
3.6 检出文件(客户端)
新额开发人员加入团队,那么他需要先下载最新的项目文件,然后进行功能的开发或者bug的修改。
我们看看他怎样能把最新的项目文件下载到本地。
1. 开发在本地创建一个文件夹(文件名合法即可),用来存放下载文件。
2.在文件夹中点击右键菜单 SVN chekout
在 “URL of repostorise”中输入要下载的仓库地址
在 “checkout directory” 中输入你要保存文件的路劲。默认就是当前路径
你还可以根据需要选择版本号,现在仓库只有一个版本,我们就下载最新版本即可
效果如下,svn的工作区有一个隐藏的文件“.svn”,它用来监控文件的变更。有了它,后期才可以修改、删除、更新等操作。
如果没有该隐藏文件夹,那么它只是一个普通的文件夹。
如果看不到隐藏文件的,请进行设置。
开发人员后续就可以在工作区添加、更新、删除文件,并提交到服务器。
3.7 添加文件(客户端)
刚才我们已经把项目下载到本地,现在我们尝试添加一个。
大家进入到刚才检出的工作区下额“13 svn添加文件练习” 目录中,新建文件“005.txt”,并保存。
现在我们把它提交到svn仓库。
1. 先 svn add
本操作并不会将文件添加到仓库,下次提交时,才能正在提交到仓库
2. svn commit
在文件夹的空白区域点击右键菜单 SVN commit,弹出窗口上点击【ok】即可。
输入修改日志,点击【ok】即可完成提交
日志信息方便日后查找某个版本
3.7 添加文件夹(客户端)
假设某个开发希望新建一个文件夹,该文件夹及其下的文件如何提交到仓库呢》
方法与文件添加基本相同
1.在想要的工作区路径下新建文件夹,并添加相关文件
2. 在文件夹上上点击右键菜单 TortoiseSVN -> add
那么现在只是告诉svn,这些文件和文件夹想要纳入版本管理。并没有提交到服务器。
3. 点击右键菜单 SVN commit ,
输入日志后,点击【ok】
成功提交文件夹到服务器后,文件夹会有绿色对勾标识,而在服务器上刷新也可以看到该文件夹。
3.8 修改文件(客户端)
开发想要修改一个文件。需要先从svn checkout 最新版本,然后再本地修改后,commit到服务器。
如下图所示,开发乙已经检出了代码,将caculate.java文件做了如下修改
下面来看开发乙如何将修改提交到服务器的
可以选中修改的文件commit,当然选中文件所在的祖先目录也是可以commit的。
若不选中任何文件夹,则表明对文件夹中的所有修改进行提交。
若点击版本比较,则可以查看本版本与父版本之间的差异
3.9 删除文件(客户端)
某个文件已经提交到svn服务器,但是现在不需要改文件了,要从服务器上删除。那该怎么操作呢?
下面我们来练习删除2个文件。
下面我们进入文件夹 “16 svn删除文件练习” ,选中要删除的文件003.txt和004.txt,点击右键菜单TortoiseSVN -->delete按钮,之后进行commit,就可以将文件从服务器上上删除了
此时虽然本地003.txt和004.txt已经删除了,但是这个修改并没有提交到服务器
3.10 更新至最新文件(客户端)
开发团队的每天有很多添加、修改、删除操作。大家每日早上应当将最新的版本文件更新到本地,下午下班前将修改提交到版本库。
那么早上我们是如何更新我们的本地工作区呢?
在工作区 的空白文件夹 点击右键菜单 “SVN update”
3.11 版本比较(客户端)
版本比较可以帮我们快速了解不同版本的差别。svn的版本比较很方便。
例如,上午你提交的版本功能还是正常的,但是下午你提交的版本登录功能就不正常了,那么这应该是你下午修改代码引起的,这时,我们通过代码比较,快速找到修改的代码,从而定位和解决问题。
选中要比较的文件,点击右键菜单 TortoiseSVN -> Diff with previous versioon .
当然你可以与之前的任何版本比较,在显示日志(show log),可以完成指定版本的比较。
下面我们来看看 显示日志功能。
3.12 查看版本日志(客户端)
在你想要查看日志的文件夹或者文件上,点击右键菜单 TortoiseSVN->show log,可以查看到具体的日志信息
为了减少同学们之间的相互干扰,更好的练习,建议大家每人创建一个以自己姓名命名的文件夹,所有的操作在自己的文件夹操作,
3.13 锁定文件
防止其他人修改文件,可以锁定文件
其他人试图提交枷锁文件会报错。
加锁人自己可正常提交
加锁的人可以释放锁
3.14 未提交时撤销文件的修改
文件内容回复到修改前的状态
3.15 得到一个去除了指定版本修改后的文件
文件经过 版本1,,2,3,4,5,6,7等修改后 如果想去除 3,4版本的修改工作,该如何撤销修改呢?
这时候就可以使用 revert changes from this version 。
例如,大家可以修改 13 svn添加文件练习 下的 003.txt
第一次将第一行修改为 11 提交
第二次将第二行改为 22 提交
第三次将第三行改为33提交
然后撤销第二次的修改。 就可以使用该功能。
3.16 解决版本冲突
例如。假设版本库中的 main.cpp文件如下:
#include <stdio.h>
int main(int argc, char *argv[]) {
int n=10;
int i;
for(i=0;i<n;i++)
printf("%d\n",i);
return 0;
}
如下图所示,假设最开始版本库中的文件版本是 V1 , 张三、李四都下载了该版本的文件到本地。
张三、李四修改后,分别依次进行提交,根据两者修改的内容是否涉及同一行,结果不同。
1)如果不涉及同一行或相邻行。
那么,李四提交时,会在张三修改的基础上合并李四的修改。
张三修改后,提交到版本库。版本升级为V2 ;
李四修改后,也去提交文件,如果修改的地方不一样,
此时,提交,系统会提示需要先更新。update时,会将张三的修改合并到李四的文件中,
然后再提交,则版本可以正常升级到V3.
为了演示方便,大家可以从svn服务器检出两个工作副本,模拟2个用户。
此时的,main.cpp已经包含了张三和李四的修改,
此时再次commit即可将合并的内容提交到版本库
2)如果涉及同一行或相邻行。
那么,张三、李四分别检出代码后,张三修改后可以正常提交
但李四提交时,将会冲突,通常需要手工解决冲突后才能提交。
-
解决冲突方式之一——手动解决冲突
假设张三把n=10 改为了 n=20 修改后,提交到版本库。版本升级为V2 ;
李四把int n = 10 改为了 long n=10
return 0 改为 return 1;
张三可以正常提交,产生新版本
但是李四提交时,会报冲突
关闭后,进行svn更新
解决冲突方式之二——取消修改
删除冲突文件
-
解决冲突方式之三——使用自己的,放弃版本库
假设 张三、李四下载最新文件后,张三改为“return 3;” ,李四改为“return 4;”
张三提交后
李四提交时,出现冲突
对每一处冲突选择是用版本库的,还是我的修改,或者两者都使用,也可以手动修改,将所有冲突确定好解决方案后,点击“Mark as resolved”
此时版本库上的文件,已经是我的文件了。
3.17 撤销修改
删除本地文件,直接update下载最新文件到本地即可、
3.18 切换svn账号
有时我们需要切换到其他账号进行svn操作
选择要删除的用户后,点击 【ok】按钮
此后,进行svn操作时会让你输入新的账号。例如,svn update时,弹出登录窗口
4.svn使用经验:
早上开工前先更新代码,保证自己在最新代码上工作 update代码
下班提交代码。保存劳动成果
有问题的代码不提交。
版本冲突,谁发现,谁解决
执行commit之前,先update
问题解决办法:
1. 操作中如果遇到svn的图标(绿色对勾,加号,红色的叉叉等不能正常显示),请参考https://blog.csdn.net/weixin_44541320/article/details/119418867http://xn--svn-928dw0oiqjj00am4aq3itvpb3z6ghgs2d
2. SVN 图标若不显示,解决办法见链接
https://blog.csdn.net/weixin_44541320/article/details/119418867
3. SVN的详细使用可以参考
SVN 安装 | 菜鸟教程https://www.runoob.com/svn/svn-install.html 菜鸟变成上的svn使用帮助