首页 > 代码库 > VisualsSVN的使用
VisualsSVN的使用
(本文主要基于安装了TortoiseSVN和VisualSVN插件,在VisualSVN下的使用)
本文内容基于本机已装完Visual Studio、Tortoise SVN 、VisualSVN
一、svn的常用操作
1、 首次获取代码至本机
安装VisualSVN后,Visual Studio工具栏上会多出VisualSVN这样一个标签。选择"VisualSVN"=>"Get Solution from Subversion"以获取最新的源代码。
点击"Get Solution from Subversion"后,打开以下窗体。Repository URL是项目所在svn Sever的地址;Name是获取到本地之后的文件夹的名称;Location是获取到本地的文件路径。
可以看一下窗体的最后一句话,Working copy will be create at D:\workspace\FollowMe 可以了解到获取到本地的最后路径是什么样的。
点击OK后,会开始获取项目至本地。获取完成后,visualSVN会提示是否选择直接打开解决方案。选择你想要打开的解决方案打开就行或取消。
2、更新(Update)
想要更新哪些文件就选中相应的文件,右键选择“Update”以获取最新,也可以选择文件夹或项目根目录获取最新。
3、签出(Checkout)
签出分独占签出和共享签出,当您以独占模式签出文件时,其他任何用户都不能再签出该文件,直到您将其签入为止。而当您以共享模式签出文件时,其他用户也可以签出和修改这个文件,当您将其签入时,可能需要将自己签出的版本与其他用户创建的版本进行合并。默认情况下,文件都以共享模式签出。在visual Studio中直接编辑某个文件,这个文件会被默认以共享模式签出,并显示为黄色。
如,当我编辑SampleController后,SampleController会被直接签出。
4、签入(Commit)
SampleController修改完后,右键选择Commit进行签入。如果期间没有人签入过新的版本,则会提交成功。
如果在上次获取代码至这次Commit中间有人提交了新的版本,可能提交失败,或者造成版本冲突。
1)如果其他人签入的内容和你修改或增加内容没有涉及到同一代码段或同一行,svn会提示你的版本已经过期,需要获取最新,直接点击OK,svn会获取最新,再提交就行了。
2)相反,其他人签入的内容和你修改或增加的内容涉及到了同一代码段或同一行,svn会提示你的版本已经过期,需要获取最新,直接点击OK,svn会获取最新,获取最新后再提交会出现如下提示,说明文件冲突。
点击OK。
接下来,我们看一下冲突文件,冲突部分会变成如下。
以下描述了三种解决方案,建议以解决方案三解决。
解决冲突方法一:
直接修改上图内容,将文件更新为最后正确的内容,将乱码内容去掉后,保存,右键Mark as Resolved,再签入。此方法不好的地方是,在整理的过程当中容易不小心把他人提交的内容删多了,且要整理代码会比较麻烦。
解决冲突方法二:
这个时候,如果你本地对这个文件进行的修改你不需要了,直接右键选择“Revert Changes”撤销(放弃)掉你自己本地的这份,再获取最新,就可以解决(当然,你刚修改的内容是不存在了)
解决方法三:
如果你要手动解决(需要留自己本地这份,或者留一部分服务器上的版本又留一部分自己的等),选择该文件,右键点击“Edit Text Confilicts”
下图分三个区域,上左区域是他人提交的内容,上右区域是自己要提交的内容,下区域是最后合并后的内容。
如果使用他人提交的版本,刚勾选箭头1指向的复选框,点击左上角的接受合并按钮;
如果使用本地版本覆盖他人的版本则勾选箭头2指向的内容,点击左上角的接受合并按钮;
如果都不是想要直接保留的,则可以直接编辑合并后的版本,或勾选1或2后编辑,完成后点击左上角的接受合并按钮。
再选择文件,点击Commit
5、撤销(Revert)
文件编辑后,不想提交,想放弃这些修改,则选择文件右键Revert Changes。这个功能在当你做了很多修改后,你发现这个想法是错的,要还原文件时,很好用
6、新增文件后签入
我新增了一个文件NewTestController,新增文件后,NewTestController和FM.Mgt.Api这个项目默认是会被签出的。打开项目所在的文件夹你会发现,FM.Mgt.Api被签出的实际是这个文件。
为什么这个文件会被签出呢。
原因是:项目文件FM.Mgt.Api.csproj记录着这个项目的framework版本、project信息、引用、debug信息等(选择项目,右键属性能看到的内容大部分都记录在这里),还有这个项目包含了哪些文件及文件的路径都记录在这里。因为新增了NewTestController,FM.Mgt.Api.csproj中会新增下图打上标记的这一行,因此在签入时这份文件也需要签入。
以下两份文件都需要签入
1)如果在签入时,只签入了NewTestController这个文件FM.Mgt.Api.csproj未签入,那么其他人获取到你提交后的版本时,会出现文件夹下有这个文件,但项目下并没有这个文件,需要在项目下重新添加一下现有文件。
2)如果只签入了FM.Mgt.Api.csproj,NewTestController这个文件未签入,会出现NewTestController这个文件找不到的情况。
这种情况会经常出现在dll引用时,很多人会把dll直接拷贝到bin文件夹下,但bin文件我们一般是不签入到svn下管理的。因此当添加完引用后,把项目的csproj签入,但是bin下dll没有签入,其他人获取项目后就会出现引用会出现找不到的情况。出现上图中的这个警告图标。
因此,我们一般都使用nuget管理dll的安装,dll安装后会在packages.config生成相应的记录(包括dll名称、版本号、对应兼容的framework版本号),其他人获取项目后,VisualStudio会先在本机的packages文件夹下找相应的dll,如果找不到会连nuget服务器下载此dll。
以下图片展示了一小段packages.config的内容
7、删除文件后签入
同样的,删除文件也需要签入。
1)如果在签入时,只签入了NewTestController这个文件,而FM.Mgt.Api.csproj未签入,那么其他人获取到你提交后的版本时,项目会去找这个文件,但文件已经不存在
2)如果只签入了FM.Mgt.Api.csproj,NewTestController这个文件未签入,那么其他人获取到你提交后的版本时,会出现这个文件还存在,但项目下并没有这个文件(出现未在源代码管理下的垃圾文件,其他人加同名的文件会提示文件已存在)
8、设置签出自动加锁
在源代码管理中,如果一个项目组的人比较多,要迁出的文件经常有交叉,经常出现文件冲突,我们会希望项目组成员在签出时自动加上锁,那样就不会存在经常冲突。
1. 将现有文件加锁:
选中项目根文件夹或某个文件右键 — 选择 ”TortoiseSVN” – 选择 “Properties” – 点击 “New…” – 选择 “Needs-Lock” -- 选择 ”Locking required(read-only update)” 后 点击 “OK”;
点击"Properties"
点击OK之后,所选择的整个项目都会被自动签出,将所有签出文件签入。
再次去编辑这个项目下的文件时,会提示是否要锁定。选择OK,就会把这个文件锁定。当然
2. 新添加的文件自动加锁:
如果只是做完第一步,新加的项目或不会提示是否锁定签出,如果需要新添加的项目也提示锁定签入,需要设置第2步
在项目文件夹下,右键 Tortoise=> “settings” – 在 “常规设置” 中 点击 “编辑”任意文件夹中右键 --选择 ”TortoiseSVN” – 选择 按钮 – 搜索到 ”enable-auto-props” 属性 – 将该属性前端的”#”和空格去除
– 找到 “[auto-props]” 并将 “* = svn:needs-lock=x” 复制到 “[auto-props]” 下方 – 最后保存
9、恢复到某一个版本
代码写了一段时间了,发现最近的实现方法不对或出现问题,想要把代码回退以前的版本,使用Update To Revision。
选择要恢复的文件或项目,右键VisualSVN=>Update To Revision
在弹出的窗体中选择Show log,Show log中显示出针对该文件所有的修改历史,选择你想要还原到的一个历史版本,点击OK。显示日志的这个窗体,还可以通过关键字或日期区间筛选,这个功能在多年维护的项目的源代码管理下很有用。
此恢复功能还可以用于恢复整个项目或解决方案,选择相应的文件目录即可。
在demo我选择恢复到5月29号的这个版本,则选择log(选择后前面的复选框会被勾上),点击OK。当前文件会被恢复,确认文件没有问题,则签入(需要签入一下,否则只是在本地)
10、文件对比
想要查看到近期的文件修改情况(自己或别人的)
选择相应的文件,右键=》Visual SVN =>show log,弹出框会显示针对该文件的所有修改记录。选中需要对比的两次log(按住ctrl键进行多选),右键“Compare Revisions”,
弹出的对比窗体会显示两个版本的差异,差异部分会高亮显示。版本号越小说明越早,越大越晚。
从图中我们可以看出来,做的操作有:去掉了以下内容(原版本上带“-”):
增加了以下内容(新版本上带“+”)
VisualsSVN的使用