SVNSubversion详解.docx
《SVNSubversion详解.docx》由会员分享,可在线阅读,更多相关《SVNSubversion详解.docx(22页珍藏版)》请在冰豆网上搜索。
SVNSubversion详解
1SVN服务器配置
下载SubVersion,有安装版和解压缩版
设置svn_home\bin为path
创建资源库,假设资源库为F:
\SVNRepositoryRoot\repository,,则要分两步创建,
先mkdird:
\svnroot\,这个可以使用操作系统命令创建
然后用svn命令,svnadmincreateF:
\SVNRepositoryRoot\repository
配置svn_home\conf\svnserve.conf,
启用anon-access=read,
并添加anon-access=write,
修改配置文件特别要注意:
默认没有anon-access=write,默认时anon-access=read下面是#auth-access=write
去掉注释符#后,要使得anon-access顶格,即要去掉前面的空格,否则可能报需要option的错误。
当出现'目标机器积极拒绝,无法连接'或svn:
Can'tconnecttohost...时,请依次检查下面各项
1,服务器有没有运行,有没有打开相应端口
如果服务器是svnserve,检查有没有运行svnserve,有没有打开3690端口
如果服务器是apache,检查apahce是否运行,是否打开80端口
检查时可以在服务器运行netstat-na看看相应端口是否在LISTEN
2,防火墙有没有开放相应端口
3,客户端是否可以连接服务器的相应端口
使用命令telnet服务器IP相应端口
如:
telnet192.168.0.13690有效,可测试端口是否打开
启动服务,导入导出都是在服务启动后才能使用的。
启动服务两种方式:
命令窗口,启动后则不能关闭该命令窗口,与Tomcat一样
svnserve-d-rF:
\SVNRepositoryRoot\repository
设置成Windows服务形式,这中非常好,可以设置随操作系统启动
sccreatesvnservebinPath="E:
\ProgramFiles\svn\bin\svnserve.exe--service--root
F:
\SVNRepositoryRoot\repository"displayname="Subversion"depend=tcpipstart=auto
导入项目,先在svn资源库中创建对应得虚拟目录,然后导入
F:
\test>svnmkdir-FF:
\SVNRepositoryRoot\log.txtsvn:
//localhost/test
F:
\test>svnimport-fF:
\SVNRepositoryRoot\log.txtsvn:
//localhost/test
导入时需给出一个记录日志的文件,如上即可,否则正确不能执行该命令。
接下来的操作可以用Tortoise或Eclipse插件轻松实现
2权限管理
2.1概念解释
比如有两个仓库aa和bb,管理员有两个admin和administrator
用户访问控制文件内容如下:
[groups]
admin=admin,administrator//组admin有两个成员admin和administrator
[/]
*=r//每个用户都有读权限
[aa:
/]//在仓库aa根目录下
admin=r//管理员admin有读权限
administrator=rw//管理员administrator有读写权限
[bb:
/]//在仓库bb根目录下
admin=r//管理员admin有读权限
administrator=rw//管理员administrator有读写权限
[bb:
/db]//在仓库bb的db文件目录下
admin=rw//管理员组admin有读写权限
2.2详细步骤
用SVN(Subversion)取代CVS的呼声越来越高。
SVN也确实比CVS优胜很多,没有辜负众望。
在日常工作中,如何配置好和利用好SVN,是很值得花些时间去研究研究的。
在我应用SVN的这段时间里,更喜欢的是用svnserve加客户端来搭配使用。
也就是将svnserve配置成为一个服务端,然后在Windows下安装个TortoiseSVN。
这是一个不错的搭配选择。
1SVN安装
1.1FreeBSD下安装SVN
1.1.1安装SVN
#cd/usr/ports/devel/subversion
#makeNOPORTDOCS=YES-DWITH_SVNSERVE_WRAPPERinstallclean
1.1.2创建用户
#pwuseradd-s/bin/sh-d/var/empty-nsvn
1.2Linux下安装SVN
1.2.1下载及编译安装SVN
#wgetsubversion.tigris.org/downloads/subversion-1.3.2.tar.bz2
#tar-jxvfsubversion-1.3.2.tar.bz2
#cdsubversion-1.3.2
#./configure--with-zlib--enable-all-static
1.2.2创建用户
#useradd-d/var/emptysvn
2svnserve配置
2.1创建仓库
2.1.1创建仓库存放目录
#mkdir-p/opt/svn/{repos,etc}
2.1.2创建SVN仓库
#svnadmincreate/opt/svn/repos/source1
#svnadmincreate/opt/svn/repos/source2
#chown-Rsvn:
svn/opt/svn/
仓库名称可以根据自己的规划或喜好设定。
2.2配置仓库
SVN的svnserve对于每个仓库,有一个独立的配置文件和独立的用户、权限管理。
在这里仍然要保持配置文件svnserve.conf的独立,但是用户、权限管理是用统一的一个文件来存储。
这样方便以后的管理和维护。
另外要注意,即使svnserve服务已经运行,修改配置文件或者用户、权限管理文件,保存后马上生效,不需要重启服务。
2.2.1配置source1仓库
进入仓库目录
#cd/opt/svn/repos/source1
2.2.2修改配置
你可以直接删除默认的svnserve.conf文件,然后使用下面的配置:
#visvnserve.conf
[general]
anon-access=none
auth-access=write
password-db=/opt/svn/etc/svn-user.conf
authz-db=/opt/svn/etc/svn-authz.conf
realm=MyFirstRepository
说明:
anon-access=none#不允许匿名用户访问
auth-access=write#通过验证的用户可以读和写
password-db=/opt/svn/etc/svn-user.conf#用户保存文件
authz-db=/opt/svn/etc/svn-authz.conf#权限管理文件
realm=MyFirstRepository#仓库名称
2.2.3配置source2仓库
#cd/opt/svn/repos/source2
2.2.4修改配置
你可以直接删除默认的svnserve.conf文件,然后使用下面的配置:
#visvnserve.conf
[general]
anon-access=none
auth-access=write
password-db=/opt/svn/etc/svn-user.conf
authz-db=/opt/svn/etc/svn-authz.conf
realm=MySecondRepository
如果有更多的仓库,可以类推配置。
----------------------------------------------------------------------
svnserve.conf的原始内容:
###Thisfilecontrolstheconfigurationofthesvnservedaemon,ifyou
###useittoallowaccesstothisrepository.(Ifyouonlyallow
###accessthroughhttp:
and/orfile:
URLs,thenthisfileis
###irrelevant.)
###Visitsubversion.tigris.org/formoreinformation.
[general]
###Theseoptionscontrolaccesstotherepositoryforunauthenticated
###andauthenticatedusers.Validvaluesare"write","read",
###and"none".Thesamplesettingsbelowarethedefaults.
#anon-access=read
#auth-access=write
###Thepassword-dboptioncontrolsthelocationofthepassword
###databasefile.Unlessyouspecifyapathstartingwitha/,
###thefile'slocationisrelativetotheconfdirectory.
###Unmentthelinebelowtousethedefaultpasswordfile.
#password-db=passwd
###Theauthz-dboptioncontrolsthelocationoftheauthorization
###rulesforpath-basedaccesscontrol.Unlessyouspecifyapath
###startingwitha/,thefile'slocationisrelativetotheconf
###directory.Ifyoudon'tspecifyanauthz-db,nopath-basedaccess
###controlisdone.
###Unmentthelinebelowtousethedefaultauthorizationfile.
#authz-db=authz
###Thisoptionspecifiestheauthenticationrealmoftherepository.
###Iftworepositorieshavethesameauthenticationrealm,theyshould
###havethesamepassworddatabase,andviceversa.Thedefaultrealm
###isrepository'suuid.
#realm=MyFirstRepository
----------------------------------------------------------------------
3用户及权限管理
3.1用户管理3.1.1创建用户存储文件
#vi/opt/svn/etc/svn-user.conf
3.1.2设置用户XX
[users]
harry=harryssecret
sally=sallyssecret
bote=botessecret
说明:
[users]#是必须的,标记为用户配置开始
harry=harryssecret#harry是用户名,harryssecret是密码。
注意,是明文密码
sally=sallyssecret#同上
bote=botessecret#同上
往后所以仓库的用户都在这里记录就可以了。
至于那个用户,允许访问那个仓库,在权限管理里限制。
3.2权限管理3.2.1创建权限管理文件
#vi/opt/svn/etc/svn-authz.conf
3.2.1设置权限管理
[groups]
source1=harry
source2=sally
[source1:
/]
source1=rw
source2=r
[source2:
/]
source2=rw
bote=rw
2.3成功案例
资源库为:
svnadmincreateF:
\SVNRepositoryRoot\repository
Svnserver.conf
anon-access=none
auth-access=write
password-db=/opt/svn/etc/svn-user.conf
authz-db=/opt/svn/etc/svn-authz.conf
realm=MySecondRepository
Authz
[groups]
#harry_and_sally=harry,sally
#harry_sally_and_joe=harry,sally,&joe
qingdaowebsite=darren,lp,qrq
[/]
qingdaowebsite=rw
*=r
[repository:
/QingDaoWebSite]
qingdaowebsite=rw
*=r
Passwd
[users]
darren=darren
lp=lp
qrq=qrq
3SVN版本冲突解决详解
3.1版本冲突原因:
假设A、B两个用户都在版本号为100的时候,更新了kingtuns.txt这个文件,A用户在修改完成之后提交kingtuns.txt到服务器,这个时候提交成功,这个时候kingtuns.txt文件的版本号已经变成101了。
同时B用户在版本号为100的kingtuns.txt文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的101版本上作的修改,所以导致提交失败。
3.2版本冲突现象:
冲突发生时,subversion会在当前工作目录中保存所有的目标文件版本[上次更新版本、当前获取的版本(即别人提交的版本)、自己更新的版本、目标文件]。
假设文件名是kingtuns.txt
对应的文件名分别是:
kingtuns.txt.r101
kingtuns.txt.r102
kingtuns.txt.mine
kingtuns.txt。
同时在目标文件中标记来自不同用户的更改。
3.3版本冲突解决:
3.3.1场景:
1、现在A、B两个用户都更新kingtuns.txt文件到本地。
2、文档中原始文件内容如下:
3、A用户修改文件,添加内容“A用户修改内容”完成后提交到服务器
4、B用户修改文件,添加内容“B用户修改内容”完成后提交到服务器
B用户提交更新至服务器时提示如下:
B用户将文件提交至服务器时,提示版本过期:
首先应该从版本库更新版本,然后去解决冲突,冲突解决后要执行svnresolved(解决),然后在签入到版本库。
在冲突解决之后,需要使用svnresolved(解决)来告诉subversion冲突解决,这样才能提交更新。
3.3.2解决冲突有三种选择:
A、放弃自己的更新,使用svnrevert(回滚),然后提交。
在这种方式下不需要使用svnresolved(解决)
B、放弃自己的更新,使用别人的更新。
使用最新获取的版本覆盖目标文件,执行resolvedfilename并提交(选择文件—右键—解决)。
C、手动解决:
冲突发生时,通过和其他用户沟通之后,手动更新目标文件。
然后执行resolvedfilename来解除冲突,最后提交。
3.3.3解决步骤如下:
1、 在当前目录下执行“update”(更新)操作
2、 在冲突的文件上(选中文件--右键菜单—TortoiseSVN—Editconflicts(解决冲突)),出现如下窗口
Theirs窗口为服务器上当前最新版本
Mine窗口为本地修改后的版本
Merged窗口为合并后的文件内容显示
3、 如果要使用服务器版本,在Theirs窗口选中差异内容,右键,选择Usethistextblock(使用这段文本块)。
同理如果要使用本地版本,在协商后,在Mine窗口右键,选择Usethistextblock(使用这段文本块)。
4、 修改完成后,保存kingtuns.txt文件内容。
5、 在B用户的冲突目录下,选中文件--右键菜单—TortoiseSVN—Resolved(解决)。
会列出冲突的文件列表,如果确认已经解决,点OK。
6、 冲突解决
7、提交解决冲突后的文件。
3.4如何降低冲突解决的复杂度:
1、当文档编辑完成后,尽快提交,频繁的提交/更新可以降低在冲突发生的概率,以及发生时解决冲突的复杂度。
2、在提交时,写上明确的message,方便以后查找用户更新的原因,毕竟随着时间的推移,对当初更新的原因有可能会遗忘
3、养成良好的使用习惯,使用SVN时每次都是先提交,后更新。
每天早上打开后,首先要从版本库获取最新版本。
每天下班前必须将已经编辑过的文档都提交到版本库。
4Subversion中如何checkout出单个文件
4.1通过命令行操作
1、检出目录images
svnco--depth=empty.iusesvn./project1/images
images_work_dir
这样就在本地形成了一个工作拷贝目录images_work_dir
2、进入images_work_dir目录,单独更新logo.jpg
svnuplogo.jpg
这样,我们就单独检出了logo.jpg,后面就可以对这个文件进行修改、提交等操作。
4.2通过TortoiseSVN操作
目前还不清楚TortoiseSVN该如何操作,希望知道的朋友补充
根据楼主上面的提示,我使用TortiseSVN客户端试验了一下,能正常检出,我做如下补充(还以楼主举的例子为例)。
1、使用TortiseSVN客户端(以1.5.3版为例)右键菜单中的“svncheckout”检出logo.jpg文件的上级目录images文件夹,在检出窗口中的“检出深度”处要选择“仅此项”,这样检出来才是一个空目录,本地命名为temp。
2、然后在temp文件夹上点右键,在弹出的TortiseSVN右键菜单中选择“检查更新”,在“检查更新”窗口中点击“检查版本库”,会列出该“images”目录下的所有文件。
3、在“检查更新”窗口中选中要检出的“logo.jpg”文件,点右键,在右键菜单中选择“更新”,即可将该文件单独检出。
5SVN插件安装
我刚刚安装好,我写在我的博客中elf8848.javaeye./blog/630864,方法如下:
安装subclipse,SVN插件
1、从官网下载site-1.6.9.zip文件,网址是:
subclipse.tigris.org,官网可以下载,找到地方就行,之前找错了
2、从中解压出features与plugins文件夹,复制到E:
\MyEclipse\myPlugin\svn里面,其它的*.xml文件不要。
3、在E:
\MyEclipse\MyEclipse8.5\dropins下新建文件svn.link,内容是:
path=E:
\\MyEclipse\\myPlugin\\svn保存。
4、删除E:
\MyEclipse\MyEclipse8.5\configuration\org.eclipse.update文件夹
5、重启myeclipse就一切正常了。
6SVN迁移,备份,重装系统后恢复数据
svn服务要迁移到其它linux主机上
原服务器svn配置
仓库路径:
/home/svn/repos
权限文件:
/home/svn/svn-access-file
用户认证文件:
/home/svn/passwordfile
apache配置文件:
/etc/httpd/conf.d/subversion.conf
svn服务启动脚本/etc/init.d/svn
做法如下
一、在原服务器上备份svn,备份内容如下
1.备份/home/svn/svn-access-file文件
2.备份/home/svn/passwordfile文件
3.备份/etc/httpd/conf.d/subversion.conf文件
4.备份/etc/init.d/svn文件
5.将版本库导出为一个文件,使用如下命令
viewplaincopytoclipboardprint?
01.svnadmindump/home/svn/repos>svn_bak
svnadmindump/home/svn/repos>svn_bak
将以上备份的文件传到linux新主机的某个目录下,如/root/
二、在新的linux环境上安装svn和apache,配置
1.安装svn,使用如下命令
viewplaincopytoclipboardprint?
01.yuminstallsubversion
02.yuminstallhttpd
03.yuminstallmod_dav_svn
yuminstallsubversion
yuminstallhttpd
yuminstallmod_dav_svn
2.创建仓库文件夹
viewplaincopytoclipboardprint?
01.mkdir/home/svn/
02.mkdir/home/svn/repos
mkdir