SVN使用教程
SVN使用教程
1.安装客户端与配置服务端 (2)
2.SVN引入的新概念 (5)
3.SVN软件设置 (6)
4.SVN使用基本流程: (7)
5.如何实现版本分支 (8)
6.如何实现版本合拼 (10)
7.版本间的比较 (13)
8.版本合拼时出现冲突 (15)
9.版本的回退 (15)
10.转换工作拷贝(跳转到另外一个分支) (17)
11.FAQ (19)
注释:
SVN-Subversion
锁定-在VSS上进行check out的操作
解锁-在VSS上进行check in的操作
拷贝-在SVN上进行创建分支时的操作
合并-在SVN上进行不同版本分支合成的操作
版本库-它储存所有的数据,版本库按照文件树形式储存数据—包括文件和目录。
修订号-每一个修订号代表了一次提交后版本库整个目录树的特定状态,另一种理解是修订号N代表版本库已经经过了N次提交。
冲突-在合并文件时,你提交的版本与版本库中的不一至,就是在你提交之前已经有其他用户提交了该文件的修改,以至当合并后会出现错误的情况。
1.安装客户端与配置服务端
1.安装客户端:
下载TortoiseSVN然后在本机安装(安装后可选择是否重启)。
2.配置服务端:
STEP 1:首先创建SVN储存库(repository),可以选择命令行方式或者通过TortoiseSVN 插件进行GUI操作,命令行运行如下:svnadmin create E:\svn\repository,e:\svn \repository就是我指定的储存库目录,如果用GUI方式,可以在这个目录下点击右键选择[TotoiseSVN]->[Create Repository href...]进行创建,版本库模式指定为默认的即可。
补充说明:
repository创建完毕后会在目录下生成若干个文件和文件夹,dav目录是提供给Apache与mod_dav_svn使用的目录,让它们存储内部数据;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号;
STEP 2: 创建新用户,打开之前你创建的SVN储存库下的conf目录,打开svnserve.conf,找到
# [general]
#auth-access = write
#authz-db = authz
# password-db = passwd
去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件
anon-access = read中的read改为none。
同样打开passwd文件,将
# [users]
# harry = harryssecret
# sally = sallyssecret
这几行的开头#字符去掉,这是设置用户,一行一个,存储格式为“用户名 = 密码”,如可插入一行:admin = 123456,即为系统添加一个用户名为admin,密码为123456的用户
在打开authz文件,在[groups]下添加以下两句
[/]
admin = rw
admin是在passwd文件中添加的用户名。
STEP 3: 运行SVN服务,在命令行执行,svnserve --daemon --root E:\svn,服务启动,--daemon可简写为-d,--root可简写为-r。
补充说明:
如果要将SVN变成系统一个服务,而且默认为自启动的话,可以建立一个批处理文件并放在windows启动
组中便于开机就运行SVN服务,或者在这个地址https://www.360docs.net/doc/f25000858.html,/~mbn/svnservice/下载那个svnservice.exe文件,拷贝到E:svnbin目录下,再从命令行下执行:
svnservice -install --daemon --root "E:\svnRepository"
sc config svnservice start= auto
net start svnservice注意:执行第三句时确保前面以命令行方式运行的SVN服务已经停止,如果没停止可在其窗口中按Ctrl+C中止运行。
STEP 4: 创建项目版本树,确定SVN服务(命令行或windows服务)运行后,在你需要导入储存库的目录下单击右键选择[TortoiseSVN]-> [Import...],在弹开的窗口的URL框中输入"svn://localhost/myproject" 点击 "OK" 执行导入,如果没有报错,数据就全部加入SVN 储存库目录树上了。用命令行也可以完成这些操作,这需要你在系统变量中新建一个“SVN_EDITOR”的系统变量,变量值为本地的一个文本编辑器执行文件路径,一般指到windows的记事本上就行了 "c:\windows\notepad.exe" ,然后新开一个CMD窗口,执行svn mkdir svn://localhost/myproject,随即关闭记事本打开的log文件窗口后按"c"键继续后生成项目树。
如果需要查看版本树,在目录下单击右键,然后TortoiseSVN,再选Revision graph,
如下图:
另外使用要http进行访问的设置:
1、subversion不支持apache 2.2以上版本,采用2.0.59版,安装好subversion 后,假设现在的subversion 装在 E:\Tool 目录上,在 E:\svn下创建repository版本库,打开控制台输入以下命令:
svnadmin create E:\svn\repository
repository 目录就是我们要创建的版本库;
2、停止IIS,因为Apache默认安装为80端口,需要关闭IIS避免端口冲突。可以在安装好之后再调整端口。迅雷也是用80端口的,安装时后也把迅雷关了。
将E:\Tool\Subversion\bin 下的以下文件复制到 E:\Tool\Apache2\modules 目录下:mod_authz_svn.so
mod_dav_svn.so
将 E:\Tool\Subversion\bin 下的以下文件复制到 E:\Tool\Apache2\modules 目录下:libdb44.dll
intl3_svn.dll
2、编辑httpd.conf的文件
去掉dav_module的注释,并在下面增加以下两行
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
3、编辑httpd.conf文件
在最后增加在httpd.conf文件的最后,加入下面的内容:
DAV svn
SVNParentPath E:\svn
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile E:\Tool\Apache2\passwd
AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
保存之,接下来要创建Apache用户验证文件,打开控制台进入Apache所在目录,执行如下操作:
E:\Tool\Apache2>htpasswd -c passwd jordan(当下次添加用户时,用-m,如果继续用-c 的话,之前创建的用户会被取消。)
其中的-c代表新生成一个密码, passwd是生成密码文件的文件名,jordan 是指定的用户名,回车后会提示你输入两次密码.输入完成后,将在当前文件夹下建立一个passwd的密码文件。不要进入apache2\bin这个目录,因为进入这个目录所创建的 passwd 文件会在bin 目录下,这与我们在上面所指定的目录不一致。
这样基本的配置就设置好了,重新启动 Apache 服务以后,在浏览器输入
http://localhost/svn/repository后会弹出验证窗口,输入用户名和密码,看到:Revision 3: /simple_test
?..
?ExampleTestCase.cpp
?ExampleTestCase.h
?Main.cpp
?Makefile.am
?Makefile.in
?SimplePlugIn.cpp
Powered by Subversion version 1.4.3 (r23084).
就表示设置成功了。
2.SVN引入的新概念
Subversion即SVN,是一个自由/开源的版本控制系统。也就是说,在Subversion管理下,文件和目录可以超越时空。Subversion将文件存放在中心版本库里。这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况。于是我们就可以籍此将数据回复到以前的版本,并可以查看数据的更改细节。正因为如此,许多人将版本控制系统当作一种神奇的“时间机器”。Subversion的版本库可以通过网络访问,从而使用户可以在不同的电脑上进行操作。从某种程度上来说,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作。因为修改不再是单线进行(单线进行也就是必须一个一个进行),开发进度会进展迅速。此外,由于所有的工作都已版本化,也就不必担心由于错误的更改而影响软件质量—如果出现不正确的更改,只要撤销那一次更改操作即可。某些版本控制系统本身也是软件配置管理(SCM)系统,这种系统经过精巧的设计,专门用来管理源代码树,并且具备许多与软件开发有关的特性—比如,对编程语言的支持,或者提供程序构建工具。不过Subversion并不是这样的系统。它是一个通用系统,可以管理任何类型的文件集。对你来说,这些文件这可能是源程序—而对别人,则可能是一个货物清单或者是数字电影。
对于一直以来我们使用的VSS,当我们需要对里面的文件进行修改时,基本的操作为checkout - modify –checkin,该过程也可以看作为锁定-修改-解锁,而在SVN上,基本操作为copy –modify –merge,该过程可看作拷贝-修改-合并,基于VSS的操作方式下,对用户会产生以下3点问题
1.锁定可能会导致管理问题,假设A修改完后一直没有解锁,B就不能及时的锁定,因而延迟了修改的时间。
2.锁定可能会导致不必要的线性化开发,假设A和B同时要修改一个文件的两个部分,但是没有相互的影响,可以同时进行,但是基于以上模式就能并行修改。
3.锁定可能回到导致错误的安去状态,A,B同时修改两个文件,两个文件都分别给A,B 自己锁定,但如果两个文件是互相依靠的,修改必须是并行的,这样两份文件就不能正确的工作了,锁定机制对防止此类问题将无能为力—从而产生了一种处于安全状态的假相。很容易想象A和B都以为自己锁住了文件,而且从一个安全,孤立的情况开始工作,因而没有尽早发现他们不匹配的修改。
而在SVN的操作方式下,并不存在以上3点问题,每一个客户联系项目版本库建立一个个人工作拷贝—版本库中文件和目录的本地映射。用户并行工作,修改各自的工作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。
3.SVN软件设置
1.语言设置和忽略文件
先安装中文语言包LanguagePack-1.4.3.8645-win32-zh_CN.exe ,然后进入SVN 的[Setting]的[General]中,在下图Language选择区内,选择合适的语种。
在Exclude/Ignore patter,设置需要忽略的文件以便忽略掉一些临时的、无用的文件,常被忽略的文件有*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak。
2.合并比较工具设置
在Merge Tool中可以选择用来合并的工具。在[Setting]->[Diff]中填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe";在[Setting]->[Merge]的选项中,填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe" %theirs %mine %merged ;其中"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"是指合并工具的路
径,%theirs %mine %merged分别指..将要合并到主干的分支,主干,及合并后的结果。
4.SVN使用基本流程:
a. 初次(initial)取出(checkout)repos,建立本地工作拷贝(WC WorkingCopy)。
b. 与repos同步(update),保证将要进行的编辑是最新版本。
c. 编辑源代码(包括创建、修改、删除)。
d. 与repos同步(update),提交之前先要同步到最新的版本,保证所有在自己之前的有关提交已经在本地有所知晓。
e. 解决冲突(resolve conflict)。
f. 提交(commit),一定要写上这次提交的内容的摘要,便于以后查阅。
g. 继续b。
每次开始新的编辑前的同步repos很重要,另外经常地update没有坏处,特别是多人项目中。如果每次提交(commit)前不进行更新(update)的到最新的版本的话,svn会提示当前的拷贝过期,需要更新。
在使用的过程中,时刻注意当前的工作拷贝(WC WorkingCopy)所对应的URL很重要,特别是当有了branches和tag等时候。使用svn info可以查看到这些信息。使用TortoiseSVN 时,通过下面的操作查看这些信息:右键单击工作拷贝的根文件夹(不是上级文件夹),菜单中选择则属性(不是TortoiseSVN那个菜单),然后在出现的对话框中选择Subversion 标签就可以看到了。
Subversion允许你并行的维护文件和目录的分支,它允许你通过拷贝数据建立分支,记住,分支互相联系,它也帮助你从一个分支复制修改到另一个分支。最终,它可以让你的工作拷贝反映到不同的分支上,所以你在日常工作可以“混合和比较”不同的开发线。
无论是创建分支还是合拼版本,先了解下SVN仓库目录结构。
SVN仓库的负责人规划好仓库的目录结构。推荐的目录结构如下图所示。
仓库的一级目录只有两个,分别为code和doc。其中,doc主要用来放置先期的文档,code 主要用来放置工程的代码,也可以包含后期的文档。
仓库的二级目录只可以是branch与trunk两个目录,分别存放主干与分支。trunk目录下直接存放工程文件。branch目录下包括一些子目录分别对应各个分支。
本地目录结构
从SVN仓库中取出代码时,一定不要把整个仓库取出来,而应该只取出trunk目录,或只取出branch下的某个分支目录(比如上图中的svn:\\code\branch\xw_051206)。
1)为什么要分支?
假如你将要对项目做基本的重新组织,这需要花费大量时间来完成,会影响项目的所有文件,同时有其他人正在使用或者修改同样的文件,此时最佳方案是创建你自己的分支,或者是版本库的开发线。这允许你保存破坏了一半的工作而不打扰别人,尽管你仍可以选择性的同你的合作者分享信息,你将会看到这是怎样工作的。
xb与lzj分别在onlytest这个工程中建立两个分支,分别为xb _051115和lz_051115。创建完分支后我们可以看到这个工程的目录结构如下图所示:
建完之后, xb和lzj分别在本地取出对应的分支进行开发。
使用命令行进行此操作:
我们可以使用svn copy,它可以直接对两个URL操作。
$ svn copy https://www.360docs.net/doc/f25000858.html,/repos/calc/trunk \
https://www.360docs.net/doc/f25000858.html,/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
Committed revision 341.
命令作用是得到在版本341建立了一个新目录作为/calc/trunk的一个备份,操作后结果如下图:
分支的关键概念:
1.不像其他版本控制系统,Subversion的分支存在于真实的正常文件系统中,并不是存在于另外的维度,这些目录只是恰巧保留了额外的历史信息。
2.Subversion并没有内在的分支概念—只有拷贝,当你拷贝一个目录,这个结果目录就是一个“分支”,只是因为你给了它这样一个含义而已。你可以换一种角度考虑,或者特别处理,但是对于Subversion它只是一个普通的拷贝的结果。
6.如何实现版本合拼
程序到达一个比较稳定的阶段,就需要把分支合并到主干上,下面讲述一下合并的流程。在本节中继续使用上一节中所示的工程与SVN仓库讲解。
1.xb与lzj分别修改自己分支上的代码
现在,主干上的test_SVN.txt是空文档。
由xb与lzj修改提交后,两个分支中test_SVN.txt分别如下两图所示:
2.xb将xb_051129分支合并到主干
xb先把主干check out到本地。然后在主干的目录上右键选择svn->merge,弹出如下窗口:
此对话框的含义是把From指定的分支版本到To指定的分支版本之间的差异合并到主干上。如果使用命令行操作,可以使用svn commit提交修改,在那一刻,修改已经合并到你的分支上了
在这里分支选的是xb_051129。版本号的选定方法是点击From中的Show Log,在Log窗口中按住Ctrl键,点击选择”made a copy”之上的那个版本,以及最顶上的那个版本,如图2.11所示。然后点击确定回到上图中的对话框,会自动填写From与To中的Revision号。
然后直接点击merge进行合并,你也可以通过dry run来看是不是两者之间有差异。由于没有其它人修改主干,所以合并的很顺利,下图是xb_051115与主干合并后的结果。合并完毕之后,由xb对主干进行提交。
如果用命令行操作,可使用svn update进行操作,不过在使用该命令前,先使用svn status –u来预测是否有版本冲突,如果发现有,以下第7点,会详细说明如何操作。
7.版本间的比较
1.文件间的对比
可以点击右键,选择Browser,进入后点击你要对比的两个文件,然后右键选择对比。如下图所示:
以下是对比中的两个文件,如下图:
2.版本间的对比
具体操作与文件对比相同,只是在最开始选工程目录进行对比,如图:
然后会出现对比结果的筐,如图:
如果用命令行进行对比,我们可以使用svn diff进行操作,两个文件的不一至的地方,会在终端命令行中打印出来。
8.版本合拼时出现冲突
如在上面第4点提到,xb合并完毕之后,lzj要将他的分支合并到主干上去,方法同上。但是由于xb已经修改过主干,所以产生了冲突,会弹出一个冲突对话框。双击对话框中的产生冲突的文件名,就可以调出工具对此文件进行合并,下图是用merge工具显示的界面。
?首先比较第一个窗口与第二个窗口,把结果修改合并到第二个窗口。
?然后确保光标处于第二个窗口时,点击上图中红色圈圈所示的按钮。这样会把第二个窗口的内容全部复制到第三个容口。之后保存,退出。
?然后在工程目录上点右键,进行SVN->Resolved。这样会删除无用的临时文件。
?最后提交所作的修改,并添加详细的注释。
如果用命令行进行,可以使用svn merge命令或者svn diff,svn merge和svn diff的区别在于svn merge不是打印区别到你的终端而是直接作为本地修改作用到你的本地拷贝,svn diff则只会在你终端打印出具体有区别的地方。
9.版本的回退
当你许需要回退到某一个版本,但是在这个过程中可能有一些文件你想保留,也有一些文件
你不想保留,这就牵扯到很复杂的版本管理过程,以下有几种方法。
1. 若是你编辑了工程,在没有提交的前提下,你想放弃这些修改,你可以直接选择revert 就可以更新到工程的最新的版本。
2. 若是你想退回到某一个版本,你就可以直接选择update to reversion如图,这样我们就可以把我们的版本回退到你选中的版本去,这种情况下SVN并没有显示出有什么冲突,并且新建立的文件也还在,但是在这种情况下你并不能直接在你回退后的版本上进行编辑,因为SVN的版本控制还是在最新的主干上。我们需要 update并解决冲突。
3. 你可以直接选择revert changes from this revision如图,这样的话你可以直接解决冲突并提交。不过这种方法的不足是,你新建的文件都没有了,整个工程都回退到之前的版本了。
4.直接export一个你需要的版本,然后用你export的版本覆盖你的最新的版本,这样你就可以不丢失你新建的文件,同时获得head的SVN控制文件。
如用命令行操作,可以使用svn merge来“取消”这个工作拷贝上所作的操作
10.转换工作拷贝(跳转到另外一个分支)
当需要从一个工作拷贝到另外一个分支上继续工作时,可以点击右键,然后选择Switch。
当出现提示筐后,填入需要转换到的目的地址即可进行该操作。
完成了到分支的“跳转”,你的目录与直接取出一个干净的版本没有什么不同。这样会更有效率,因为分支只有很小的区别,服务器只是发送修改的部分来使你的工作拷贝反映分支。
如果用命令行,可以使用svn switch命令改变存在的工作拷贝到另一个分支。svn switch 命令也可以带--revision(-r)参数,所以你不需要一直移动你的工作拷贝到最新版本。
如果一个用户知道分支工作只发生在部分子目录,我们使用svn switch来跳转部分目录(有时候只是单个文件),这样的话,他们依然可以继续得到普通的“trunk”主干的更新,但是已经跳转的部分则被免去了更新(除非分支上有更新)。这个特性给“混合工作拷贝”概念添加了新的维度—不仅工作拷贝的版本可以混合,在版本库中的位置也可以混合。
如果你的工作拷贝包含许多来自不同版本库目录跳转的子树,它会工作如常。当你更新时,你会得到每一个目录适当的补丁,当你提交时,你的本地修改会一直作为一个单独的原子修改提交到版本库。
注意,因为你的工作拷贝可以在混合位置的情况下工作正常,但是所有的位置必须在同一个版本库,Subversion的版本库不能互相通信。
11.FAQ
问题:tortoisesvn 1.4客户端连接不上服务器
现象:服务器一切正常, 其它组员都能连接上服务器,一切使用正常,用IE可以访问,可以正常使用,但是用 tortoisesvn 1.4客户端连接不上服务器 ,在客户端输入地址后,一直就是出现"沙漏" 过很长一段时间就报错, Eorr~~~~~~ 连接不上后面跟着是IP地址
原因:
是卡巴斯基 6.0 版本的原因,, 其他同事可以用,是因为他们安装的是,卡巴斯基 5.0版本的,因为卡巴 6.0 会分析网络通信,所以可能引发延时之类的问题。
解决方案:
设置可信区域就可以了,如图