【转】SVN ——开放源代码的版本控制系统

 1.SVN 的一些概念

  • repository(源代码库):源代码统一存放的地方
  • Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
  • Commit(提交):当你已经修改了代码,你就需要Commit到repository
  • Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
  • SVN是Subversion的简称,是一个开放源代码的版本控制系统。

    SVN是C/S架构,这说明svn的大部分逻辑处理是存在在客户端的,server端只有小部分的逻辑,主要用于存储。

    说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的,类似的软件还有git,vss等。

日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了) 。

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

 

2.SVN结构:

Server端:用于存储和整合和用户的资源  SVN服务端指令是指在服务器端进行操作用于对服务器进行系统级设定与操作

Client端:对于存在于server端的资源进行各版本的获取,和增删改等操作。

3.SVN Server 的下载

官方网站:

  http://subversion.apache.org/

Server端下载地址:

  http://subversion.apache.org/packages.html#windows

4.运行

5.SVN 查看历史信息

通过svn命令可以根据时间或修订号去除过去的版本,或者某一版本所做的具体的修改。以下四个命令可以用来查看svn 的历史:

  • svn log: 用来展示svn 的版本作者、日期、路径等等。

  • svn diff: 用来显示特定修改的行级详细信息。

  • svn cat: 取得在特定版本的某文件显示在当前屏幕。

  • svn list: 显示一个目录或某一版本存在的文件。

6.svn常用操作

建立库:

1、新建文件夹,目录和文件夹名称最好都用英文,不要使用中文;

2、打开文件夹,在空白处按下“shift键+鼠标右键”;

3、在弹出的菜单中选择“TortoiseSVN - Create repository here”;

4、弹出对话框,提示创建成功,并自动在文件夹中创建了目录结构

 

 导入项目:

1、打开已有的项目文件夹,在空白处按下“shift键+鼠标右键”;

2、在弹出的菜单中选择“TortoiseSVN - Import”;

3、选择导入路径,填写备注信息,点击“OK”开始导入;

4、导入完成后会弹出提示,可以拖动滚动条查看导入的文件,点击“OK”,完成导入;

 

建立工作目录(检出):

1、新建工作目录文件夹,在空白处按下“shift键+鼠标右键”;

2、在弹出的菜单中选择“SVN Checkout...”;

3、在弹出的对话框中选择库目录、工作目录,点击“OK”开始检出;

4、弹出详细信息对话框,导出完成后,点击“OK”;

可以看到工作目录中多出了库中的文件,这些文件就是有版本控制的,对这些文件的修改可以保存到库,也可以从库里恢复旧版本的文件。

更新工作目录:

1、通常在你对工作目录进行修改前,为保证你的文件是最新的,需要进行更新操作;

2、在工作目录空白处点击鼠标右键,选择“SVN Update”;

3、会弹出对话框开始更新,并显示更新了哪些内容,库版本是多少;

 

提交工作目录:

1、在做了修改,需要保存到库中时,用到提交操作;

2、在工作目录空白处点击鼠标右键,选择“SVN Commit”;

3、会弹出对话框,可以输入备注信息,显示将要提交哪些文件,点击“OK”开始提交;

4、弹出对话框显示提交进度,完成后点击“OK”完成提交;

新增档案及目录到Repository中

假设您开发的程序将放在前面建立的working目录下面的my_ prj子目录。如下所示:

图像:Tsvn_10.png 图像:Tsvn_11.png

假设您已经编辑好档案,准备把他们放到SVN的repository中。您需要在my_prj目录的icon上面,按鼠标右键,并且选择TortoiseSVN->Add:

图像:Tsvn_12.png

接着,TortoiseSVN会把准备要加入的档案及目录,显示给您看。打勾的就是等下要被加入到Repository中的。如果您有某些档案或是目录不想在这次加入,您可以让该项目不要被勾选。如此,它就不会被加入到Repository去。

图像:Tsvn_13.png

按下OK后,您将会看到如下的讯息窗口:

图像:Tsvn_14.png

这样就表示成功了。有一点要注意的是,这个Add的动作并未真正的将档案放到Repository中。仅仅是告知SVN准备要在Repository中放入这些档案。此时,如果您透过档案管理员查看这些档案,应该会看到一个白色红底的惊叹号在档案icon的下方。

图像:Tsvn_15.png

这是表示您的working目录中的档案与Repository中的档案还没有同步。现在我们要多一个commit的动作。让这些档案真正 的放入到 Repository中。您可以在my_prj目录的icon上或者是my_prj目录内的空白处按下鼠标右键,叫出如下的选单,并且选择SVN commit。

图像:Tsvn_16.png

紧接着,您将会看到如下的窗口出现:

图像:Tsvn_17.png

在这个窗口中,下半部会列出一个清单,让您清楚的了解到哪些档案要被commit到repository中。同样的,如果您有档案不想在这个时候commit到Repository,您可以取消选取的档案,这样他们就不会被commit到Repository中。

在档案列表的上方是Message栏,您可以在栏中输入本次commit的目的。这是十分重要的字段,当您commit的次数很多时,可以 靠这个讯息知道版本与版本之间的差异。当您输入好Message,按下OK之后,就可以看到如下的窗口出现,通知您已经将指定的档案送到 Repository中。

图像:Tsvn_18.png

您可以到先前的folder中,确定是否所有的档案icon都有如下的绿色勾勾在上面,这样代表您的档案都正确无误的到repository中。

图像:Tsvn_19.png

有时候,因为Windows本身的问题,您可能会看到有些icon没有变成绿色的勾勾。此时,多按F5几次,应该就可以解决这个问题。如果,仍然不行,表示您之前的commit动作真的有问题。请仔细检查之前的commit动作是否正确。

七.更新至特定版本

有时我们需要回溯至特定的日期或是版本,这时就可以利用SVN的Update to revision的功能。在想要更新的档案或目录icon上面按下鼠标右键。并且选择TortoiseSVN->Update to revision。

图像:Tsvn_22.png 图像:Tsvn_23.png

在这个Update窗口中,您可以选择更新到最新版本(HEAD)。也可以选择更新到某个指定的版本(Revision)。当然,您可能早就记不起来正确的版本号码。可能只隐约的记得大概在什么时间。没关系,按下Show log按钮,您就可以回顾历史了。

图像:Tsvn_24.png

所有您曾经做过的动作,及其日期与对应的版本都会列在这个窗口上面,只要在你想要的版上面点一下,让他变成反白,然后按下OK。这个版本就会自动填入Update窗口中的Revision字段中。您只要再按下一次OK,这个版本就会被取出来到您的硬盘中。

 

八、SVN服务端指令

SVN服务端指令是指在服务器端进行操作用于对服务器进行系统级设定与操作

1.查看svn版本信息

svnadmin --version

2.创建数据仓库

svnadmin create E:repositorysvnjavahelp

准备工作

1. 首先手动创建磁盘目录作为总数据仓库:E:repositorysvn

2. 再手动创建磁盘目录作为具体的数据仓库:E:repositorysvnjavahelp

3. 执行指令将指定目录设置为具体的数据仓库

指令结果

将设置指定目录为SVN仓库路径,用于保存共享数据

conf

目录

存放版本库所用配置文件的目录

authz

文件

授权信息

passwd

文件

用户安全信息,包含用户名与密码

svnserve.conf

文件

服务相关信息

db

目录

版本数据存储目录

hooks

目录

存放版本库勾子目录

locks

目录

存储库锁目录,用来跟踪库的访问者

注意事项

创建数据仓库对应的路径必须存在,而被创建的仓库名称路径则自动创建

1.启动SVN服务器(单仓库)

svnserve –d –r E:repositorysvnjavahelp

准备工作

必须存在该路径,且是一个有效的SVN数据仓库

指令结果

启动对应的数据仓库,作为服务,等待响应用户的SVN管理操作

2.启动SVN服务器(多仓库)

svnserve –d –r E:repositorysvn

准备工作

必须存在该路径,并且其中包含有效的SVN数据仓库路径

指令结果

启动对应目录下所有的数据仓库,作为服务,等待响应

注意事项

多仓库启动模式下只有有效的仓库路径才可以被加载

【补】window指令:

查询当前计算机启动服务列表,SVN默认端口为3690

netstat an

创建SVN服务器启动为window服务

sc create SVN-Service binpath= "D:Program FilesSubversionbinsvnserve.exe --service -r E:repositorysvn" displayname= "SVN-Service" start= auto depend= Tcpip

注意:上述指令为DOS指令,格式要求严谨,不能随意修改sc delete 服务名称

八、SVN客户端指令

SVN客户端指令是指在客户端进行操作用于对完成与服务器信息的交互

1.检出数据仓库信息(单仓库)

svn checkout svn://192.168.1.100 .

准备工作

磁盘中创建一个目录,用于存放与SVN服务器进行交互的数据

执行指令时,将当前路径设置为上述目录

指令结果

将指定的SVN服务器中的信息检出到当前目录,并在当前目录中生成与SVN服务器的连接数据,方便下一次与SVN服务器的连接。该目录中的不能手工修改

注意事项

如果执行指令时,没有进入到保存数据的目录,需要将指令修改为保存到指定路径的格式

svn checkout svn://192.168.1.100 E:workjt

本机操作时,可能存在有多个IP地址,不妨换用localhost识别当前计算机

svn checkout svn://localhost E:workjt

连接时,可以添加端口号进行,默认可以不加,自动访问3690端口

svn checkout svn://localhost:3690 E:workjt

指令的最后一个参数,也就是同步的目录如果省略,默认为当前,等同于输入了.作为当前目录

svn checkout svn://localhost:3690.

svn checkout svn://localhost:3690

2.检出数据仓库信息(多仓库)

svn checkout svn://192.168.1.100/javahelp.

准备工作

磁盘中创建一个目录,用于存放与SVN服务器进行交互的数据

执行指令时,将当前路径设置为上述目录

指令结果

将指定的SVN服务器指定仓库中的信息检出到指定目录,并在指定目录中生成与SVN服务器的连接数据,方便下一次与SVN服务器的连接。

注意事项

所有注意事项参看单仓库提供模式

由于多仓库启动模式下,提供有多个仓库可使用,因此在指定了SVN服务器位置后,必须指定仓库名称

多仓库检出后会在检出目录中产生一个与被检出仓库相同名称的目录

3.将本地文件/目录加入版本控制

svn add User.java

准备工作

在本地目录中创建文件/目录,用于加入版本控制

指令结果

将本地文件/目录加入到版本控制,受SVN管理。

注意事项

未加入版本控制的文件/目录,无法与服务器进行交互

目录加入到版本控制后,目录中的所有文件与目录都将一并加入版本控制

如果是多仓库检出,需要设定仓库名称,然后设定文件名称

svn add javahelp/User.java

或进入对应目录,使用add指令加入版本控制

4.将加入版本控制的文件/目录提交到服务器

svn commit User.java

准备工作

在本地目录中存在有已加入版本控制的文件/目录

指令结果

将指定文件或目录提交到SVN服务器,并记录相关日志描述信息

注意事项

由于日志信息是SVN进行版本控制中的重要信息,因此不能省略

只有加入SVN版本控制的文件/目录才可以进行提交,未加入SVN版本控制的文件/目录不参与提交,因此执行前必须保障add操作的完成

提交版本到SVN服务器时,需要进行权限认证,除进行正常的登录认证,也可以使用匿名用户进行操作,需要修改匿名用户的访问权限

开启匿名用户的操作功能

打开数据仓库中conf/svnserve.conf文件的anon-access = write选项,并设定对应的操作权限

SVN服务器的认证操作是在每次与SVN服务器进行数据交换时完成,因此无需重启服务器

提交后的文档不接受重复提交,SVN服务器发现当前代码与服务器代码版本相同时,不进行提交操作

SVN服务器中保存的文档不是源文件格式,

5.更新本地版本为SVN服务器最新版本

svn update

指令结果

将本地文件/目录信息更新到与服务器相同版本信息

注意事项

更新时,如果不添加指定的文件/目录名称,则更新整个数据仓库

svn update fileName.txt

如果本地版本与服务器相同,则不进行任何操作

6.删除本地文件

svn delete User.java

准备工作

在本地目录中存在有将要被删除的SVN控制文件/目录

指令结果

将本地文件/目录信息删除

注意事项

delete指令只能删除本地文件,并没有提交/同步到SVN服务器

该指令删除的文件/目录,在未进行提交之前可通过revert指令进行恢复

7.恢复本地文件

svn revert User.java

准备工作

在本地目录中存在有使用delete指令删除的SVN控制文件/目录且未提交到SVN服务器

指令结果

将本地被删除文件/目录信息恢复

注意事项

revert指令只能恢复未提交的数据

1.获取服务器信息

svn info

2.获取服务器目录层次结构

svn list

3.获取服务器状态信息

svn status

4.获取svn指令帮助

svn help

九、SVN图形用户界面操作——TortoiseSVN

TortoiseSVN是一款基于SVN服务器的图形化操作用户界面工具。TortoiseSVN提供了基于鼠标操作为主导的SVN版本控制管理工具

安装完毕后,对当前操作系统重新启动,启动完成后,系统主菜单加入了使用TortoiseSVN对SVN服务器进行管理的工具

使用TortoiseSVN完成SVN版本控制管理

十、服务器相关操作

1.创建数据仓库

svnadmin create E:repositorysvnjavahelp

在任意不是SVN数据仓库的目录中右键打开菜单,选择将当前目录创建为数据仓库

注意:满足如下条件之一,将弹出如下错误提示

  • 当前目录已经是数据仓库
  • 当前目录是数据仓库的子目录

2.启动SVN服务器(单仓库)

svnserve –d –r E:repositorysvnjavahelp

日常工作中,SVN服务器多采用独立硬件服务器构建,并发布为服务启动,因此无需进行手工启动服务器的操作

3.启动SVN服务器(多仓库)

svnserve –d –r E:repositorysvn

日常工作中,SVN服务器多采用独立硬件服务器构建,并发布为服务启动,因此无需进行手工启动服务器的操作

十一、客户端相关操作

1.检出数据仓库信息(多仓库)

svn checkout svn://192.168.1.100/javahelp.

创建新目录,用于本地保存SVN服务器对应的本地文件,并在目录中执行如下操作,即可创建于SVN服务器的关联

设置SVN服务器仓库名称与检出保存到对应的目录路径

与SVN服务器进行有效关联后,对应的文件夹将以特殊图标的形式呈现

2.将本地文件/目录加入版本控制

svn add User.java

在本地仓库中新创建的文件/目录,不受SVN服务器控制,需要先将其加入版本控制,对新建文件/

加入版本控制后,对应的文件/目录将以特殊图标的形式呈现

此时,由于本地仓库中存在有与SVN服务器中不同步的信息,因此图标发生变化

3.将加入版本控制的文件/目录提交到服务器

svn commit User.java

在待提交的文件上面通过右键菜单,完成对SVN服务器的提交操作

选择提交后,打开提交对话框,输入提交日志信息

提交成功后,返回提交成功信息回执,同时被提交文件/目录的图标发生变化

提交失败后,返回提交失败错误原因

4.更新本地版本为SVN服务器最新版本

svn update

在待更新的文件/目录/工程上面通过右键菜单,完成从SVN服务器进行更新的操作

更新完毕后,弹出对应的提示信息

5.删除本地文件

svn delete User.java

在待删除的文件/目录上面通过右键菜单,完成本地文件/目录的删除操作,该操作在未提交之前是可恢复的

6.恢复本地文件

svn revert User.java

对已删除的文件/目录,在未进行提交操作之前,可以对其进行恢复。在任意位置通过右键菜单完成。

选择恢复后,出现对话框,选择要恢复的文件/目录,然后完成恢复操作

选择确认操作后,完成恢复操作

7.提交冲突问题

在进行正常的提交时,如果本地版本与服务器版本不相同,会引发冲突问题。

解决冲突问题共分为三个步骤:

步骤一:获取服务器最新版本

同时,针对版本不统一的文件信息,会生成对应的文件,供用户查看

带有黄色惊叹号的文件表示当前文件与SVN服务器中的文件冲突,并已将冲突内容进行了合并,需要用户手工修改。

.mine后缀的文件是用户在更新之前的最后修改版本内容,可通过原始编辑器查看

.r*后缀的文件是当前文件对应的各个版本的文件内容,r后面的数字是版本号,可通过原始编辑器查看

步骤二:查看并修改冲突文件

打开原始文件,其中包含有冲突内容,用户根据需要进行调整

步骤三:删除冲突备份信息,并进行提交

将除冲突文件之外所生成的所有文件进行删除,并对原始文件进行合并冲突处理后,原始文件状态由冲突状态转换为已编辑状态。

此时即可正常提交,实际开发此现象大多发生在公共配置文件或系统配置文件上。

界面操作解决方案:

步骤一:获取服务器最新版本(同上)

步骤二:查看并修改冲突文件

针对冲突代码进行建议处理

选中冲突行(红色标识)

步骤三:标识解决冲突

确认解除冲突,操作完毕后,临时文件将被删除

8.避免提交冲突——为文件加锁(基于权限)

对不希望出现冲突的文件添加属性

添加新的属性

添加svn:needs-lock属性

确认添加属性

加锁操作是为文件设置了一种状态,也属于对文件的修改,因此需要进行提交。加锁前与加锁后,文件的显示状态发生变化。

提交冲突问题是使用SVN等版本控制工具中令用户最为头疼的问题,为避免提交冲突,可以为任何一个加入版本控制的资源提供锁,避免多用户同时操作同一文件引发冲突。由于文件锁定后,只能由一个用户操作,实际开发中没有实用性,不推荐使用。

对加锁文件的操作分为三个步骤:

步骤一:获取锁

获取锁后,显示当前被文件被某个用户锁定

此时其他用户再次获取当前文件锁时出现冲突,同时无法对文件进行操作

此时锁定文件的用户显示文件被锁定

步骤二:操作编辑文件,并提交,提交完毕后,恢复未锁定状态。

主线(trunk):一个项目建立时就存在,并伴随着项目的成长而不断的成长,直到项目完全结束。

分支(branch):一般是指功能分支,例如:我们的某个项目要添加一个模块,但这个模块又比较复杂,实现难度比较大。为了不影响主线的稳定,我们就可以创建一个功能分支来专门开发这个模块,当这个模块开发完成以后,并通过测试部门的各项测试,再合并到主线中去。再比如,我们的交警GPS 项目已经开发完成了,但是这个项目是给泉州交警做的,现在我们又接到了一个交警项目,不过是要给厦门交警大队的。现在厦门交警大队要求我们给他们定制一些功能。我们又不想再主线上进行修改,这个时候,我们也可以创建一个分支,并在这个分支上开发,这时是不会对主线造成影响的。等给厦门开发完成了以后,我们发现,他们要求的有些功能其实很好,以后别的地方可能也需要同样的功能。这个时候我们就可以根据我们的需要,将有用的模块有选择的合并到主线中来。

标签(tag):标签和分支一样,也是一个目录,不过这个目录中一般存放的是发布的信息(当然我们也可以只用分支,但是用标签更清楚明了一些)。还是拿我们的交警项目来举个例子:我们的交警项目开发完成了以后,要拿给泉州交警大队用了,也就是要发布(release),假设这个版本叫做1.0.2。这个时候,我们就要创建一个标签,当泉州交警大队用了三个月,发现了一个 BUG,我们只需要签出这个标签中的代码(它和我们刚提供给泉州交警大队时候的是一模一样的),进行调试,并修正这个 BUG。然后再发布一个版本,假设叫做1.1.0,这个时候我们就在创建一个 1.1.0的标签……

要注意,标签目录里面的代码,要进行严格的控制,除了修正BUG 外,不能做任何其他的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值