前言

失踪人口回归了,最近因为工作和生活上的一些琐事,鸽了整整三个周,惭愧惭愧,欠的三篇先记账,之后会慢慢补。

说回正题,之前有更新过使用git管理github一文,里面介绍了Git这一用于代码管理的版本控制系统的使用,这一年多来也一直用Github来备份我这个网站的数据,但最近工作中用到最多的则是SVN,因此今天就详细介绍一下SVN与Git的区别以及SVN具体的使用。

 

SVN介绍

SVN是subversion的缩写,是一个开源的版本控制系统,可以管理随时间改变的数据,数据放置在一个中心仓库(repository)中,可以用于多人协同开发同一个工程。 

SVN是一个通用的系统,可用来管理任何类型的文件,一般多用于程序源码的版本控制。

 

SVN与Git的区别

1.SVN为集中式,Git为分布式

这是SVN与Git最重要的区别,虽然两者都有自己的服务器远端仓库(Remote Repository),但Git更倾向于分布式开发,每一个使用Git的开发人员电脑上都需要将远端完整的Git仓库克隆(clone)到本地仓库(Local Repository)。

使用Git提交更改时需要先提交(Commit)到本地仓库,再推送(Push)到远端仓库(实际是本地仓库和远端仓库的Sync同步操作),所以即使没有网络或者远端故障也一样可以在本地进行提交修改(Commit),查看历史版本记录,创建项目分支等操作,等网络连接后或远端修复后再提交到远端。可以说,如果不考虑与其他用户的协作,那么Git完全可以在不使用远端的情况下实现几乎所有操作。同时由于远端仓库和本地仓库内容一致,完全不需要担心Git服务器的损坏,抗风险性极强。

而SVN没有本地仓库,必须要在有网络并且服务器远端正常的情况下进行提交。

在Git本地仓库中,有.git文件夹,在SVN本地目录中,有.svn文件夹,但两者内容不同。.git文件夹是本地克隆的完整仓库,它拥有中心仓库上所有的东西,例如标签,分支,版本记录等;而.svn文件夹内存放的是SVN的控制信息,用于判断文件的新增、修改、未修改等状态,因此一般.git文件夹的大小远大于.svn文件夹的大小。

 

2.SVN把内容按文件方式存储,而Git是按元数据方式存储

Git中仓库信息都是以hash健值方式保存文件,相当于一个数据库,当用户的工作区做了修改、提交等操作后,就会根据文件对比得到的差异转化成数据库信息,在分支操作时则会根据数据库的内容对用户实际接触到的目录和文件进行修改,切换分支的实质是地址指针指向某次提交,因此开分支和切换分支很迅速,存储消耗也很少。

而由于SVN是按文件方式存储内容,因此在进行分支(Branch)操作时,SVN会直接把原来的文件复制一份,因此体积越大分支越多的仓库,Git下载的速度越快于SVN。

并且由于在SVN,分支是一个完整的目录,且这个目录拥有完整的实际文件,因此如果有工作成员想要开新的分支,那将会影响所有协作人员,每个人都需要更新这一新的分支。而在Git里,每个工作成员都可以任意在自己的本地版本库开无限个分支,并且只要这些本地的分支不合并提交到远端中心仓库库,其他人就不会被影响,而等到不需要这个本地分支时,可以简单地从本地仓库删除即可。

但反过来Git只能对整个仓库做分支和更新还原等操作,而SVN则可以针对任意子目录进行分支,因为SVN的分支本质上是一个拷贝操作,因此SVN可以实现局部更新或者局部还原。

 

3.Git 的内容完整性要优于 SVN

Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

 

4.SVN有严格的权限机制

SVN可以按组、按个人进行针对某个子目录的权限控制,并区分读、写权限,提交必须有写的权限,否则会提交失败;而Git没有严格的权限管理控制,只要有帐号,就可以提交代码,甚至执行回退操作,因为操作的是本地仓库,但是在本地仓库和远端仓库同步(Push)时,一般会有主开发进行者审核和合并。

 

5.SVN有全局的版本号

这是SVN相对于Git为数不多的优点之一,Git使用128位ID作为版本号;而SVN使用一个递增的序列号作为全局唯一的版本号,版本号实际代表一个相应时间的源代码快照。

 

总而言之,SVN的特点是简单,使用方便,适合普通的公司开发团队。

Git的特点版本控制可以不依赖网络做任何事情,对分支和合并有更好的支持,效率更高但易用性稍差,更加适合开源项目。

 

SVN安装和配置

Windows平台下,服务端一般用VisualSVN,客户端则用tortoisesvn客户端安装。

VisualSVN安装很简单,对于新手来说一路下一步就可以搭建好,比较重要的就是下面这一步

Location是软件安装位置,默认即可;Repositories是仓库的存放路径,建议选个大容量的硬盘存放仓库。

安装后打开VisualSVN界面,首先新建仓库

安全起见,新建仓库时权限设置为任何账号都不能访问,之后再创建账号添加到仓库权限中。

然后新建用户账号

再将账号添加指定仓库的权限

账号可以设置只读权限和读写权限,可以更好地保证仓库的安全性。

然后就可以通过该账号从浏览器访问仓库了。

创建的是全新的仓库,因此里面没有内容。

接下来是客户端的使用,安装tortoisesvn客户端也很简单,一路下一步即可,安装好后即可在文件夹内的右键菜单中看到SVN的菜单命令。

首先是Checkout操作,点击右键菜单中的SVN Checkout即可,与Git的git clone命令类似,都是将服务器上的仓库下载到本地。

接着是Update操作,也很简单,在本地的SVN目录中,右键菜单中点击SVN Update即可,作用是更新本地的SVN目录到最新的版本。

还有最常用的Commit操作,同样是点击右键菜单中的SVN Commit,作用和Git的commit操作相似,是将本地的修改提交到server端。

并且点击Show log按钮可以查看历史版本的详细修改记录。

下面是SVN客户端的所有命令

其中也比较常用的操作还有Revert(还原)等。

这两个软件有着完善的图形界面,免去了手动输入SVN命令行的麻烦,并且查看历史版本和文件对比都比较方便。

 

SVN常用命令

虽然tortoisesvn客户端使用比较方便,但很多人不喜欢图形界面客户端的臃肿,或是习惯了Linux上SVN的简洁,因此这里也把SVN的命令行操作也介绍一下。

 

svn checkout
svn checkout url --username=*** --password=*** path

功能是将服务器上的仓库下载到本地,svn checkout可简写为svn co,其中url是服务器地址,path是将要本地存放的路径。

也可以直接运行svn checkout url path ,回车会提示输入用户名和密码,如果已经验证过用户名和密码,就不用再输入了。

 

svn add
svn add path

功能是向仓库中添加新的文件,path为想添加的文件或者文件夹的路径,其中可以使用部分正则表达式进行匹配,例如path\*.py为把path文件夹下所有.py格式的文件添加到仓库。

 

svn commit
svn commit -m"提交信息"

功能是将修改的文件提交,可以简写为svn ci -m””

 

svn lock
svn lock -m"加锁信息" path

功能是给文件加锁,被锁定的文件只有自己可以提交,其他人的提交会被拒绝,只有文件解锁后其他人才能提交修改,确保同一个文件在同一时间上只能被一个人修改,很大程度上避免了冲突。

文件加锁以后为避免忘记了锁,所以每次commit操作时都会自动选中加锁的文件,并且在commit后锁会自动释放。如果单纯想要解锁的话可以执行svn unlock path,如果加锁或解锁操作失败,可以尝试添加--force参数(简写为-f)强行加锁解锁。

 

svn delete
svn delete path -m "删除文件"

功能是删除文件。

 

svn revert
svn revert path

功能是指定路径恢复成原始未修改的状态。

 

svn update
svn update -r m path

功能是更新文件或者目录到某个版本,m为目标版本例如100,path为要更新的路径,如果不加-r参数和m版本号,则默认更新至最新版本,如果不填写path,默认将当前目录以及子目录下的所有文件都更新到最新版本。

 

svn status
svn status path

功能为查看文件或者目录状态,可简写为svn st,打印的内容中?为不在svn的控制中,M为内容被修改;C为发生冲突;A为预定加入到版本库;K为被锁定。

如果加上-v参数,则打印的内容中第一列不变,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。

 

svn log
svn log path

功能是查看该路径的日志,包含所有修改记录及其版本号的变化。

 

svn diff
svn diff path

功能是将修改的文件与基础版本比较差异,可以简写为svn di,如果加上-r参数,例如svn diff -r m:n path,就是比较该文件m版本和n版本的差异。

 

svn merge
svn merge -r m:n path

功能是将两个版本之间的差异合并到当前文件,但是一般都会产生冲突,需要处理。

 


世界上最大的勇气,
是压力下的优雅。

——海明威