SVN实验手册.docx
《SVN实验手册.docx》由会员分享,可在线阅读,更多相关《SVN实验手册.docx(12页珍藏版)》请在冰点文库上搜索。
SVN实验手册
svn实验手册
kingkongmao@龙梦
本实验手册使用一个本地的代码库操练日常的svn使用流程,访问本地的库无须用户验证
1.准备:
建立版本库(repos)和本地工作拷贝(workingcopy)
2.本地更改与提交
3.查看历史
4.分支与合并
1.准备:
建立版本库(repos)和本地工作拷贝(workingcopy)
1)建立本地版本库
mkdir~/expe
cd~/expe
svnadmincreaterepos
在~/expe/repos建立了代码库
loongson@debian:
~/expe$lsrepos/
conf dav db format hooks locks
2)建立代码库的的基本目录结构
mkdirworking_copy
cdworking_copy
loongson@debian:
~/expe/working_copy$svnco.
取出修订版0。
loongson@debian:
~/expe/working_copy$mkdirtrunkbranchestags
loongson@debian:
~/expe/working_copy$ls
branches tags trunk
loongson@debian:
~/expe/working_copy$svnaddbranches/tags/trunk/
A branches
A tags
A trunk
loongson@debian:
~/expe/working_copy$svnci-m"svncommondirectorystructure"
新增 branches
新增 tags
新增 trunk
提交后的修订版为1。
3)svninfo可以看到你的本地和哪个库相连以及当前版本
loongson@debian:
~/expe/working_copy$svninfo
路径:
.
地址(URL):
RepositoryRoot:
档案库UUID:
9c193024-16a0-4d5b-b53c-aaddca74e1cf
修订版:
0
节点种类:
目录
调度:
正常
最后修改的修订版:
0
最后修改的时间:
2007-05-2322:
15:
44+0800(三,23 5月2007)
2.本地更改与提交
基本步骤:
svnupdate(查看别人有没有更新)
svnstatus(查看本地更改与版本管理的关系,哪些文件将提交到版本库)
svncommit/svnci(提交)
1)本地修改
我随便做了两个文件,准备加到库里面,作为本地修改的一个示例
loongson@Loongson:
~/expe/workingcopy/trunk$cathello
helloword.
Iamloongson,whoareyou.
loongson@Loongson:
~/expe/workingcopy/trunk$svnaddhello
A hello
loongson@Loongson:
~/expe/workingcopy/trunk$catREADME
whynotreadme?
loongson@Loongson:
~/expe/workingcopy/trunk$svnaddREADME
A hello
svnadd只修改本地内容,并没有提交
2)查看别人有没有更新
这个时候我准备提交(commit)我的更改了,首先我会运行svnupdate查看别人是否对代码进行了修改
loongson@Loongson:
~/expe/workingcopy$svnup
于修订版1。
up是update的简写,update的作用是把别人修改的代码先取到本地,上面的结果是没有人进行了修改。
为什么要先up呢,这是因为如果有冲突的话,应该在本地解决冲突以后,再进行commit,事实上你可以直接svnci(commit),但是如果别人和你修改了同一个文件,svn也不会让你成功提交,还是需要先进行本地的update。
3)查看将要提交的内容
现在我已经可以commit了,我先查看一下我需要commit什么,基本的规则是:
一个patch应该一个的commit,一个patch可以是特定的一个功能实现,一个bugfix等。
loongson@Loongson:
~/expe/workingcopy/trunk$svnstatus
A 0 hello
A 0 README
状态于修订版:
1
svnstatus的作用还包括,你可能有文件没有添加到版本管理中,比如我下面做了个extra文件作为例子
loongson@debian:
~/expe/working_copy/trunk$touchextra
loongson@debian:
~/expe/working_copy/trunk$ls
extra
loongson@debian:
~/expe/working_copy/trunk$svnstatus
extra
文件前面的就表示没有加入到版本管理,有些时候是可能的,比如说生成的.o文件。
但是这里extra是需要加入版本管理的,因此需要执行svnaddextra。
4)真正的提交
详细查看一下更改的内容svndiffhello,svndiffREADME,我发现这两个是无关的更改,他们属于两个不同的patch,应该单独提交
因此我提交了两次,并指明提交的文件
loongson@Loongson:
~/expe/workingcopy/trunk$svncommithello-m"addhello"
新增 hello
传输文件数据.
提交后的修订版为2。
loongson@Loongson:
~/expe/workingcopy/trunk$svncommitREADME-m"addREADME"
新增 README
传输文件数据.
提交后的修订版为3。
例子中的-m的内容也太过简单,每次提交都应该有详细的comment,特别是对bug的修复,应该详细说明bug的产生原因,修复的道理等
从上面看到,应该勤commit,不要等到修改了一大堆文件以后,才想起来要commit。
3.查看历史
svnlog
svndiff
经过上面的commit以后,看看info
loongson@debian:
~/expe/working_copy/trunk$svninfo
路径:
.
地址(URL):
RepositoryRoot:
修订版:
1
节点种类:
目录
调度:
正常
最后修改的作者:
loongson
最后修改的修订版:
1
最后修改的时间:
2007-05-2322:
23:
05+0800(三,23 5月2007)
你可以发现虽然我们提交了两次,版本已经增长到了3,但是整个workingcopy的版本还是1,因此为了看到完整的log,需要执行
loongson@debian:
~/expe/working_copy/trunk$svnup
于修订版3。
1)svnlog
loongson@debian:
~/expe/working_copy/trunk$svnlog
------------------------------------------------------------------------
r3|loongson|2007-05-2322:
45:
14+0800(三,23 5月2007)|1line
addREADME
------------------------------------------------------------------------
r2|loongson|2007-05-2322:
45:
09+0800(三,23 5月2007)|1line
addhello
------------------------------------------------------------------------
r1|loongson|2007-05-2322:
23:
05+0800(三,23 5月2007)|1line
svncommondirectorystructure
------------------------------------------------------------------------
或者看看每次提交更改了哪些文件
loongson@debian:
~/expe/working_copy/trunk$svnlog-v
------------------------------------------------------------------------
r3|loongson|2007-05-2322:
45:
14+0800(三,23 5月2007)|1line
改变的路径:
A/trunk/README
addREADME
------------------------------------------------------------------------
r2|loongson|2007-05-2322:
45:
09+0800(三,23 5月2007)|1line
改变的路径:
A/trunk/hello
addhello
------------------------------------------------------------------------
r1|loongson|2007-05-2322:
23:
05+0800(三,23 5月2007)|1line
改变的路径:
A/branches
A/tags
A/trunk
svncommondirectorystructure
------------------------------------------------------------------------
2)svndiff
可以是用svndiff命令查看版本之间的差异,比如我想知道r2具体发生了哪些更改
loongson@debian:
~/expe/working_copy/trunk$svndiff-r1:
2
Index:
hello
===================================================================
---hello (修订版0)
+++hello (修订版2)
@@-0,0+1,2@@
+helloword.
+Iamloongson,whoareyou.
这是标准的patch格式,表示hello这个文件在版本0,从0行到0行发生了如下的删除动作(其实没有删除),在1行到2行发生了如下的增加(就是增加了加号的那两行)
4.分支与合并,解决冲突
分支就是在另外一个地方管理代码的版本,而不影响主线(trunk)的代码。
分支的原因有很多,第一次使用svn都希望建立一个分支,然后在自己的分支上工作,相当于自己的独立的工作空间,这种工作方式没有错,但是svn支持并不是很好,需要编写comment的时候记录下每次合并代码的版本号,因此我认为目前分支最佳的实践是为某个工作目的创建一个分支,功能实现以后立刻在trunk中合并这个内容,分支的使命完成后就可以删除了。
分支其实很简单,就是copy一下
loongson@Loongson:
~/expe/workingcopy/trunk$svncopy4。
现在你可以选择把那个hi分支checkout出来修改,这样子很简单直接,也可以把本地switch过去,省一点网络带宽
loongson@Loongson:
~/expe/workingcopy/trunk$svninfo|grepURL
地址(URL):
loongson@Loongson:
~/expe/workingcopy/trunk$svnswitch
于修订版4。
loongson@Loongson:
~/expe/workingcopy/trunk$svninfo|grepURL
地址(URL):
copy已经和新的URL发生联系了,所有的commit都朝向新的URL
ok现在我开始修改,就是把hello换成hi。
loongson@Loongson:
~/expe/workingcopy/trunk$cathello
hiword.
Iamloongson,whoareyou.
但是我发现我错了,其实我是想加一行hi,我觉得我改了太多了太乱了,索性恢复到我checkout时候的版本
loongson@Loongson:
~/expe/workingcopy/trunk$svnreverthello
已恢复“hello”
我加了一行以后重新commit
loongson@Loongson:
~/expe/workingcopy/trunk$cathello
helloworld.
hiworld,heihei~~~
Iamloongson,whoareyou.
loongson@Loongson:
~/expe/workingcopy/trunk$svncihello
正在发送 hello
传输文件数据.
提交后的修订版为5。
这个时候我转回去,开始合并
loongson@Loongson:
~/expe/workingcopy/trunk$svnswitch
U hello
更新至修订版5。
loongson@Loongson:
~/expe/workingcopy/trunk$cathello
helloword.
Iamloongson,whoareyou.
当然我不急于合并,我添加一个文件模拟主线仍然进行着有序的开发
loongson@Loongson:
~/expe/workingcopy/trunk$vimaccessory
loongson@Loongson:
~/expe/workingcopy/trunk$svnaddaccessory
A accessory
loongson@Loongson:
~/expe/workingcopy/trunk$svnci-m"addaccessory"
新增 accessory
传输文件数据.
提交后的修订版为6。
OK,开始合并
合并的过程一开始比较难理解,其实简单的说就是把分支上面两个版本之间所作的修改作为一个patch,然后应用到你的本地上面
记住你比较的是分支的两个版本,比如说分支开发是从r10到r20,执行svnmerge的效果相当于把r20到r10两个版本树做一个diff-urN生成一个patch,然后执行patch-p1命令。
问题是怎么找出这两个版本呢?
首先我们找出我们是从那个版本开始分支的
loongson@Loongson:
~/expe/workingcopy$svnlog--stop-on-copy
------------------------------------------------------------------------
r5|loongson|2007-01-0211:
52:
56+0800(二,02 1月2007)|2lines
addhi
------------------------------------------------------------------------
r4|loongson|2007-01-0211:
43:
08+0800(二,02 1月2007)|4lines
hellotohi
------------------------------------------------------------------------
也就是说我们从r4开始我们的分支,到r5完成,因此我们执行
loongson@Loongson:
~/expe/workingcopy$svnmerge-r4:
5
U hello
loongson@Loongson:
~/expe/workingcopy$cathello
helloworld.
hiworld,heihei~~~
Iamloongson,whoareyou.
完成了合并,注意所有的更改都在本地,应该提交一次,并且要记录合并的版本
loongson@Loongson:
~/expe/workingcopy$svnci-m"merge-r4:
5"
正在发送 hello
传输文件数据.
提交后的修订版为7。
如果hi分支仍然继续开发,请注意下次合并应该从r5开始,避免合并重复的内容
建SVN版本库
2010-05-1914:
31
svn服务器:
1.6.2
svn客户端:
装完两个软件且重启,没有配置svn服务器任何文件得情况下:
在E盘根目录下建立svn
运行svnadmincreateE:
\svn\testtest版本库建立成功
之后启动svn服务器--daemon,
之后使用TortoiseSVN->Repo-browser来查看版本库。
在弹出的URL对话框中输入:
svn建立一个本地版本库
2007-12-2715:
51
软件需求:
客户端:
1.4.6
建立过程:
1、安装客户端软件即可。
2、先建立一个版本库根目录文件夹如:
svnRespoistory
3、然后在根目录里,建立对应项目的版本库。
在目录E:
\svnRespoistory\repository下"右键->TortoiseSVN->CreateRepositoryhere...",选择版本库模式,这里使用默认即可,然后就创建了一系列目录和文件。
4、来到项目根目录,进行初始化导入。
右键->TortoiseSVN->Import...
在URLofrepository输入"file///E:
/svnRespoistory/repository"
注:
在这个过程中,并不会把导入的文件复制到版本库中,而只是将内容导入到版本库中。
此时,这个源文件是可以删除了。
5、基本客户端操作,取出版本库中的一个工作拷贝。
运行右键->Checkout
在URLofrepository中输入:
file///E:
/subRespoistory/repository,这样我们就得到了一份工作拷贝。
注:
同样我们在这里提交的修改也就是版本库根据情况来进行相应的存储。
并不会在复制文件到导入的地方或到版本库这个文件夹里。
6、配置用户和权限
在版本库根目录里的conf/
#password-db=passwd (去掉#)
同样修改该目录下的passwd文件
增加一个用户帐号如test=test
参考:
&task=view&id=56&Itemid=9
SVN的个人本地版本库的使用方法
2011-01-2413:
04
1下载和安装:
downloads
下载一个安装版和一个简体中文包2个安装包,并安装之。
2建立版本库目录(Project'sDataBaseFolder)
在你的重要资料的分区新建一个目录叫“SVNDB”
在这个目录里面再建立一个属于你的某个工程的子目录例如“Project1”,假如你有多个工程,则建立几个
在“Project1”的资源管理器的目录树右键菜单“tortoisesvn”->“在此创建版本库”
新建版本库后,再在此目录按右键菜单找到“版本库浏览器”,在版本库浏览器里,把URL里面的地址(例如“
3将现有工程的目录和文件导入版本库(ExistsProject'sSourceTempFolder)
将你的现有工程的目录复制到一个临时的目录(例如C:
\Project1),将里面的不需要加入版本库的文件或目录清理好
在的那个版本库浏览器里,右键,加入文件夹C:
\Project1(加入完成后,C:
\Project1这个目录就可以彻底删除了)
版本库在浏览器里右键把Project1改名为trunk
4建立日常使用的工作目录(Project'sWorkspaceFolder)
在你的日常使用的目录中建立一个文件夹(例如:
E:
\Project1)
资源管理器的目录树中,在E:
\Project1右键菜单点击“SVN检出”
在“SVN检出”的对话框中,URL地址里面填“
检出完成后,此目录里面就填充满工程的文件和目录了,那么日后编辑或开发代码就在此目录里面工作了。
其他说明:
·日后写了部分代码,觉得需要备份时就“SVN提交”,过了些时间要刷新一下就“SVN更新”
·Windows的资源管理器的右键菜单在工作目录里面有点不太正常,可以换其他的资源管理器(例如:
Q-Dir/FreeCmd/MDIE/TotalCmd等)
·在SVN中最重要的目录:
DataBaseFolder,此文件夹其实就是个备份的数据库,把工程的目录和文件都用zip压缩在此目录里面(可以观察一下此目录下文件的更改)
·如果要撤销某个工程使用的SVN,则在资源管理器删除DataBaseFolder和WorkspaceFolder即可。
补充几个目录的说明:
trunk-- 主干日常开发
branches-- 新分支做定制
tags-- 历届版本存档