正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史记录

版本 1 当前 »

版本控制系统

VisualSVN server是一款免费的SVN版本控制系统服务端软件,TortoiseSVN是一款免费开源的SVN版本控制系统客户端软件,要通过两者搭建版本控制系统,首先要了解什么是版本控制(Rversion Control)以及版本控制的基本思想。所谓版本控制是指通过一定的手段记录文件的修改过程,比如文件某次修改的修改内容,修改时间,变量作者等,以便于在将来查阅特定版本的修改情况,或是恢复到之前的某个版本,生活中类似于以下的版本修改过程完全可以使用版本控制系统来进行管理。

版本控制在软件开发过程中也有着非常重要的作用,事实上,如何对源代码进行版本控制是大家在进入公司后必将学习的一个内容,我们通过以下几个例子来理解软件开发中的版本控制。

  1. 为了防止代码丢失,肯定要采用云+端的形式保存代码,本地机器与远程服务器都要存放一份,而且还需要有一份机制来让本地代码可以跟远程进行同步;
  2. 几个人一起做同一个项目,大家都需要对同一份代码进行修改,这个时候需要大家互不影响,又需要各自可以同步别人的代码;
  3. 开发的时候免不了有bug,有时候刚发布功能就出现了严重的bug,这时候需要紧急对代码进行还原;
  4. 随着代码版本迭代的功能越来越多,但是我们需要清楚的知道历史每一个版本的代码更改记录,甚至知道每个人历史提交代码的情况;

通过以上几个例子,相信大家都能体会到版本控制在软件开发中的重要作用。本文件中提到的文件与代码是互通的,代码也是文件,所有在代码上适用的概念在普通文件上也基本适用,在介绍功能是,会依据具体功能选择是用文件作介绍还是用代码来作介绍。

当前较著名的版本控制系统有SVN和Git,其中SVN是集中式版本控制系统的代表,而Git则是分布式版本控制的典范,对比两者的学习难度,SVN要比Git简单一些。实际使用中,不同的公司可能采用不同的版本控制系统,所以学习过程,两种版本控制都要掌握,对其原理和常用操作都要非常熟悉。

SVN版本控制

相较于Git版本控制,SVN版本控制要比较简单一些。SVN是Subversion的简称,它是一个开放源代码的版本控制系统。SVN是一种典型的集中式版本控制系统,所有要管理的代码都放在SVN服务器上(称为代码仓库Repository),所有开发者在开始工作之前,都要从服务器上把最新版的代码取回(称为代码检出-Checkout)本地,或是将本地的代码更新(Update)到服务器最新版本,然后进行开发。开发完成或是到一定阶段时,需要将成果物提交(Commit)到服务器,服务器负责记录本次提交的信息,包括提交内容,提交作者,提交日期以及作者本次提交所填写的日志(log),然后生成一个新的版本号,后续需要查阅本次提交信息时,可以依据该版本号在服务器上进行查找。如果提交的代码和别人的代码有冲突(Conflict),比如你和别人都修改了同一个函数,别人比你先提交,那么你的提交有可能覆盖别人的成果,此时服务器会不允许你提交并提示有冲突存在,需要先解决(Resolve)冲突才能提交。

VisualSVN server

VisualSVN server是一款Windows平台下免费的SVN服务端软件,用于搭建SVN服务器、创建代码仓库和分配工作账户。它的工作原理和我们平常使用的网盘其实比较类似,它们都提供文件网络存储备份、文件共享、文件访问账户控制等功能,不同的是,VisualSVN server还在这之上提供版本控制功能,它可以记录文件的修改过程,以后于后续查看或是恢复文件,所以可以把它形象地理解成文件管理的时间机器。

由于是一款windows平台下的软件,VisualSVN server提供图形化的管理界面,创建仓库、创建账户、分配权限等功能可以非常轻易的完成,即便是没有软件开发的经验,只要理解了版本控制的思想, 使用并掌握VisualSVN server都是非常容易做到的。

软件下载路径:https://www.visualsvn.com/server/download/

TortoiseSVN

TortoiseSVN是SVN版本控制系统的一个免费开源客户端,用于在本地完成SVN的各种客户端操作,比如浏览版本库、文件检出、提交修改、查阅日志等。它与windows的资源管理器结合得非常紧密,很符合平常我们使用软件的习惯,所以上手难度很低。比如它在文件夹(版本仓库在本地检出后就是一个文件夹)上附加一个带颜色的标签来表示版本库的状态,将SVN的所有操作都集成到了右键菜单里,使用起来都非常方便。

TortoiseSVN下载径:https://tortoisesvn.net/downloads.html

软件安装与配置

通过以上内容我们可以知道,一个SVN版本控制系统包括服务端与客户端两部分,类似与网盘服务器与网盘客户端。在此,我们将这两个软件都安装在同一台机器上,那么就能够通过本地网络搭建一个可以单机运行的SVN版本控制系统了。

安装VisualSVN server

VisualSVN server充当的是服务器,首先到其官网上去下载一个安装包,下载路径https://www.visualsvn.com/server/download/,如下图所示,按照自己的操作系统位数选择合适的版本。

点击安装包按如下步骤进行安装。


下一步需要选择安装路径及版本仓库(Repositories)路径及https服务端口号,两个路径建议不要用中文以及空格字符,端口号使用默认即可。

再次点击Next有可能会提示如下错误信息,它的意思是上一步指定的服务端口号已经被占用了,需要先把占用端口的程序关掉再进行下一步。

在此推荐一种解决办法,原理是通过命令行先查找占用这个端口的进程号,然后再通过进程号查找进程名称,然后打开任务管理器杀死该进程即可。按win + R后输入cmd并回车,打开命令行,在命令行中输入 netstat -ano | findstr “443”,查找占用443端口的进程号,如下:

图中最后一列就是进程号,然后再输入 tasklist | findstr “3780”,最后一个参数是要查找哪个进程号的进程命名,如下:

可以看到查找到的进程名称是vmware-hostd.exe,打开任务管理器,找到该进程,结束即可。

结束相关进程后可以再尝试点击安装中的下一步,如图所示,进入安装过程。

如果结束进程还不行,则在任务管理器中进入“服务”一栏,结束相关服务。

等待一段时间后,安装就完成了。

配置VisualSVN server

创建版本仓库

安装好的SVN服务器需要经过配置才能使用,具体的配置包括创建版本仓库、创建账户、配置用户权限三项内容。打开VisualSVN server,界面如图所示,首先需要创建一个新的版本仓库,创建版本仓库其实就是在服务器上分配一个文件夹,用于存储那些需要进行版本管理的文件,这个文件夹具体保存在安装VisualSVN server时选定的Respository路径中。右击Respositories,点击Create New Respository...

接下来的仓库类型按默认即可。

下一步是给这个仓库命名,原则上同样是不要用中文。

下一步是选择仓库的目录结构,visualSVN server有推荐的基于分支管理模型的文件夹结构,但刚开始时我们可以不用,直接选择第一项,创建一个空的版本仓库即可。

下一步是配置这个仓库的访问权限,这一步非常重要,但由于我们现在还没有创建账户,所以先选择第一项,即所有人都没有访问权限,我们会在稍后创建完账户后再对该项进行配置。

点击Create之后,仓库就创建好了,下面给出了一些该仓库的概要信息,其中的Respository URL是这个版本库的标识符,将用于后续客户端检出该版本库,需要记住(在本机查找该URL时主机地址以主机名称显示,若想通过其他主机访问该仓库,只需要将主机名替换成IP地址即可)。

创建账户或账户组

每个人在访问SVN服务器时都需要一个账号和密码,服务器可以通过账号来配置用户权限,即哪些人可以完全访问仓库(可读可写,即可以检出,也可以将自己的修改提交到服务器),哪些人只可读(只可以检出用于查看,不可以将修改写回服务器),哪些人没有访问权限(无法访问仓库)。这一点在工作中尤其重要,因为出于保密性的需求,公司一般不会让所有员工都能够访问全部代码,而只是将员工开发的那部分代码开放权限。

在VisualSVN server中创建账户也十分简单,如下图所示,右击Users,选择Create User进行用户创建:

在新界面中输入创建的用户名,密码,点击确认即可,此时右边用户列表即可看到新增的用户。

除了可以创建用户之外,还可以创建用户组,即可以将用户划分为不同的组,组内的人共享同样的权限,方法是在Groups处右键,按照提示输入组名及添加组内成员即可。

分配权限

在上面的过程中我们创建了一个版本仓库,但是没有分配访问权限,所有没人有能够访问这个仓库。下面我们将上面创建的zhangsan这个用户添加到该仓库的允许访问成员列表中。点击Repositories左边的小三角,弹出下拉列表,再右键刚创建的版本仓库repo_test,点击Properities...,配置仓库属性。

进入属性配置界面,在第一栏Security中,配置用户权限,可以看到当前的访问用户和用户组是空的。

点击add,选择刚才创建的zhangsan添加,然后配置在下面配置访问权限是Read/Write,配置其访问权限为可读可写。

除了可以添加账户外,还可以添加用户组,以组为单位分配仓库的访问成员,亦可将访问方式改成只读(Read Only)或是无访问权限(No Access)。

安装TortoiseSVN

TortoiseSVN是按照默认配置安装就可以了,不需要专门配置。下载路径:https://tortoisesvn.net/downloads.html

TortoiseSVN常用操作

SVN的大部分操作都是在客户端,即TortoiseSVN中完成的。服务器一般配置好仓库和用户权限之后就不需要维护了,下面我们就来看看客户端中有哪些操作。安装好TortoiseSVN后右键菜单会多出来一些和SVN相关的操作,后续所有的操作都从右键开始。

代码检出(Checkout)

首次在SVN上进版本管理时,需要先将代码库检出到本地,一般代码仓库都位于远端的SVN服务器上,服务器与本地的TortoiseSVN客户端通过网络以SSH加密协议进行通信,在本地的TortoiseSVN中需要提供远程仓库的URL地址,该URL是你想要检出的代码库的唯一标识。可以在VisualSVN server中右键该仓库,点击Copy URL to Clipboard将该URL地址拷贝到剪切板。(访问本地VisualSVN server时URL中的主机地址用主机名表示,将该主机名替换成主机IP 地址也可行的)

远程仓库在检出后就是一个带版本控制功能的文件夹。在任一空白位置右键,选择SVN Checkout,弹出代码检出对话框,填入仓库的URL地址,以及检出的目的路径,如下图:

点击OK后,会出现以下提示框,要求输入用户名和密码。此处的用户名和密码就是我们在VisualSVN server上创建的用户,只有在该用户对该代码仓库具有检出权限时,检出才能成功。

检出完毕后,会在指定路径(以上图为例,在C盘根目录下)出现以该代码仓库命名的文件夹,由于并未上传任何东西,所以文件夹是空的。文件夹上有一个绿色的颜色标签,表示这个文件夹是带版本控制的,已经被SVN监管。TortoiseSVN以文件和文件夹颜色标签来区分文件的状态,绿色表示这些文件或文件夹在本地还未被修改过,是最新的。

新增文件(Add)+ 提交(Commit)

这一步要向服务器上传一个文本文件(SVN可以对任何类型的文件进行版本控制,但是对文本文件是最友好的,因为SVN自带了许多工具可以用于对文本文件作更详细的分析与对比)。先进入刚才检出的空文件夹,然后新建一个空白文本文件。下一步,右键该文件,选择TortoiseSVN->Add,这一步是将该文件加入版本控制系统,SVN不会对未加入版本控制系统的文件进行监管,只有在Add之后,才可以对文件进行提交、查看日志等操作。

新增成功之后,该文件如下图所示,此状态表示文件已新增成功。

下一步是要将文件提交回服务器,由于我们检出的内容是服务器上的一个副本,所以,在本地所做的任何修改如果不提交的话,是不会影响到服务器上的版本的。右键已经新增成功的文件,选择SVN Commit(有的可能是在TortoiseSVN->SVN Commit),会弹出提交对话框。

在第一个输入框中输入提交日志。日志是SVN中非常重要的内容,一般用于说明本次提交的内容和目的,后续在查阅SVN历史版本时,日志信息显得尤为重要。第二个选择框内是要提交的文件,文件Status那一列显示的是文件当前状态,一般有added(新增)/changed(被修改)/deleted(被删除)等。确认信息无误后,点击OK进入提交,如果提交成功,则该文件就被上传到版本控制系统。而且一旦上传成功,SVN服务器会生成一个版本号,用这个版本号来表示此次提交,后续也可以通过这个版本号来找到这次提交纪录。下图是提交成功的提示,可以看到版本号为1,因为这是第一次提交。

以上操作对文件夹也是适用的,SVN中可以一次新增并提交一整个文件夹。操作方式与单个文件一样。

查看日志(show log)

对于已经加入SVN版本库的文件,我们可以查看其提交的历史记录,右键选择Tortoise SVN->Show log即可。右键单个文件或文件夹可以查看此文件的日志记录,右键文件夹内的空白处可以查看整个文件夹的历史记录(前提是文件夹是带SVN颜色标签的)。以下是右键test.ext进入的日志查看界面。

可以看到这个文件只有1次修改记录,版本号是1,后面有它的提交作者,提交时间,提交日志。如果历史记录比较多,还可以使用菜单栏上的搜索日志功能,用版本号或是提交日志进行搜索。默认情况下向下翻阅历史记录最终可以翻到第一条日志,但是如果提交次数过多,则只会显示一部分,可以通过下面的Show All显示完整所有日志。

在日志查看界面还可以做很多其他的事,比如,右键某条日志会弹出一大堆菜单功能,比如保存该版本文件,或是与上一版本进行比较等,意思一般不难理解,我们会在后面单独介绍一部分。

检查更改(Check for modifications)

紧接上一步,我们对test.txt的内容进行修改,往里面写入一行文字,但是不要提交。保存退出后,会发现test.txt的图标变成了如下的样子。

这个状态表示的是文件已经被修改。如果想查看文件被修改了哪些地方,则可以使用右键菜单栏的Check for modifications功能。tortoiseSVN以两栏比较的方式查看文件的修改,非常直观。选中被修改的文件,右键TortoiseSVN->Check for modifications,双击要查看的文件即可:

左边的是原始版本,右边的是工作区副本(Working Copy),可以看到工作区的副本多了一行hello world.

文件恢复(Revert)

如果觉得对文件的修改不妥,那么只要文件还未提交,就可以使用Revert功能撤销对文件的修改,让文件恢复到刚检出时的状态。选中需要撤销的文件或文件夹右键TortoiseSVN->Revert即可,可以看到文件的颜色标签发生改变。

文件删除(SVN Delete)

同样可以将一个文件从版本库中删除,右键需要删除的文件,选择TortoiseSVN->Delete,然后提交(Commit)这次操作即可。注意,不可以用普通删除的方式将文件从版本库中删除,如果用普通方式删除文件(比如按Delete键删除),文件在版本库中任然存在,执行一次SVN update就会恢复该文件,如果要从版本库中删除,必须要执行 SVN Delete操作并再次提交。而且,就算是使用了SVN Delete功能,文件同样可以通过查看日志的方式从历史版本中找回,从这一点来看,说SVN是文件管理的时间机器一点也不为过。

文件更新(SVN Update)

如果本地的版本库长时间没有操作的话,SVN服务器的版本库可能已经被其他人更新了很多次,这时如果本地的版本库要跟上SVN服务器上的版本,可以对本地的版本库进行更新操作,更新到最新版本。右键本地版本库,执行SVN Update,即可以进行更新,更新界面可以看到对哪些文件进行了更新。

注意,如果本地版本库有文件被修改过而且没有提交,即某些文件或文件夹处理于黄色标签状态,且恰巧这些文件在SVN服务器上被别人更新过,那么这时进行SVN Update的话,会发生冲突,表示这个文件在本地的修改与别人的修改有冲突,需要先解决冲突,解决冲突实际上要解决的是,本地的修改的远程的修改,到底该用哪个的问题。

替换SVN Revert的一种简单做法还可以直接删除对应文件再SVN Update,这样,最新的文件又会从版本库中检出。

文件重命名(Rename)

如果要更新版本仓库中文件的文件名,则要使用SVN的Rename功能,而不是直接通过windows右键重命名,具体方法是右键需要重命名的文件,选择TortoiseSVN->Rename,输入新名称后,点击该文件进行提交。

重命名操作其实是相当于先执行SVN Delete操作,再执行SVN add操作,重命名之后,查看文件的日志纪录将只能追溯到新名称开始的地方,所以要慎用。

版本回退(Revert to this version)

版本回退也是SVN的一个非常重要的功能,而且要使用版本回退的情景往往都比较“紧急”。版本回退是指回退到之前的某一版本,具体方法是,选中版本库中的文件,右键show log,查看其提交日志,然后右键需要回退到的日志,点击Revert to this version,确认之后,工作区就会回退到这个版本,但是,如果要让服务器端的代码也回退,则仍然需要提交一次,并生成一个新的版本号,只不过这个版本号下的文件内容与回退的那版本号的内容是一样的。

代码导出(SVN export)

代码导出(Export)和代码检出(Checkout)非常类似,但是,导出的代码是不带版本控制信息的(没有颜色标签),仅仅是将代码拿到本地,所以,导出的速度比检出的速度要快很多,如果只想使用代码而不需要提交修改,则可以使用代码导出功能,使用方式与检出一样,选择合适的位置右键TortoiseSVN->Export即可。

保存某个版本的文件(Save reversion to…)

在查看代码库的日志时,对某条日志右键单击,选择Save reversion to…可以将该版本的文件另存为一份,便于与当前文件进行比较。

查看代码库(Repo-browser)

这个功能用于以浏览器的方式查看服务器端的代码库,这样做的好处是可以通过版本库的URL地址查看服务器端的代码库状态,而不需要将其检出到本地。在任一空白处右键选择TortoiseSVN->Repo Browser,填入代码库的URL地址即可。或是对本地的代码库右键,直接查看其在SVN服务器上的状态。

代码追溯(SVN Blame)

这个命令可用于查看一份文件的修改历史,就是哪些版本号是谁提交的,修改了哪些内容。(blame是问责,怪罪的意思,此功能取名为blame非常形象)。右键TortoiseSVN->Blame即可。

svn命令行模式

Linux系统同样也可以安装svn客户端,Ubuntu系统下可以用apg-get install svn命令安装svn客户端,只不过这个svn客户端是用命令行模式来执行各种操作的,比如可以在命令行执行svn checkout命令,填入URL进行检出操作,更多的操作请查看svn help。

SVN日志提交规范

为了方便查看和查找SVN日志,让日志更加醒目,一般者会对日志提交加以规范。以下是一种规范的示例,通过在提交日志之前加上若干对[]来表示,具体可以有以下几个:

  • ADD:表示有新增文件
  • CHG:表示修改文件
  • DEL:表示删除文件
  • REVERT:表示版本回退
  • MERGE:表示代码合并

以上选项可以多选,表示一次进行多个操作,提交示例如下:

扩展

将visualSVN server和TortoiseSVN都安装在同一台电脑上可以搭建一个本地的SVN版本控制系统,但在了解SVN的工作原理之后,我们完全可以将两者安装在不同的主机上,以便于在局域网或公网上搭建自己的版本管理系统。其中,在局域网内搭建SVN版本管理系统,只需要将服务器安装在局域网内的一台主机上,那么其他主机上的客户端就可以通过这台主机的IP地址去访问该主机上的版本库了。如果是在公网上搭建,比如购买一台云主机,在云主机上安装服务器,那么在本地的客户端中也可以按照服务端的IP去访问,这样就可以轻松构建自己的云端版本控制服务器。


  • 无标签