??xml version="1.0" encoding="utf-8" standalone="yes"?>先试试这个:(x)GRPWH-7CDHQ-K3G3C-JH2KX-C88H8
现在Ȁzoffice得靠q气Q前一D|间先?QFDX-PYH2G-PPYFD-C7RJM-BBKQ8 安装Q然后在控制面板-卸蝲E序-office 2010右键 更改-更改密钥 在输?
BDD3G-XM7FB-BD2HM-YK63V-VQFDK 可以激zR现在好像不行了。下面还有好多神key你可以试试,你好运?
VYBBJ-TRJPB-QFQRF-QFT4D-H3GVB
GCXQJ-KFYBG-XR77F-XF3K8-WT7QW
QY89T-88PV8-FD7H7-CJVCQ-GJ492
23TGP-FTKV6-HTHGD-PDWWP-MWCRQ
GDQ98-KW37Y-MVR84-246FH-3T6BG
FGVT2-GBV2M-YG4BD-JM823-XJYRY
TTWC8-Y8KD3-YD77J-RGWTF-DTG2V
GFWF2-R8H99-P4YWF-D2HY9-6PPXJ
GRPWH-7CDHQ-K3G3C-JH2KX-C88H8
1.?span class=t_tag onclick=tagshow(event) href="tag.php?name=WINDOWS">WINDOWS7的ISO镜像解压到D:\win7\...。(win7文g夹也可以不徏Q?br>2.q入PEQ格式化C盘ؓ(f)NTFS?br>3.从D:\win7\提取boot和bootmgrq两个文件到C盘根目录。再从D:\win7\sources提取boot.wim和install.wimq两个文件到C:\sources?br>4.在PE中运行cmdQ输?#8220;c:\boot\bootsect.exe /nt60 c:”Q注意exe??qing)nt60和c:之间有空|
回R后看到提Csuccessfulx功了Q?nbsp; 然后重v?sh)脑?br>5.出现安装界面Q注意一定不要点现在安装Q点左下?#8220;Repair Your computer”q入pȝ恢复选项Q选最后一?#8220;command prompt”Q进入DOSH口?br>6.q入DOS后,输入“D:\win7\sources\setup”Q回车,q入pȝ的正常安装,选安装位|时记得要格式化C盘?br> 整个q程和VISTA的安装过E一P15分钟l束Q比XP和VISTA都快?br>
目前QW(xu)in7试版在|上炒得火热Q多Ch的评价都比较正面Q说什?#8220;?#8221;之类Q搞得不h心痒痒的Q也惌来玩玩?br> 按常规,下蝲回来的DVD镜像要先ȝQ再从光盘启动来安装。可是很多h没有d机,甚至q光驱都没有。怎么办呢Q从盘安装啦!下面详细介绍XPpȝ下从盘安装Win7的方法和步骤Q按照步骤去做,肯定能成功?br> 友情提示Q?img src="http://www1.pconline.com.cn/itbbs/080506/old/emot/em217.gif">
本方法很适合安装64位的Win7 或Vista 。如果是在空盘(没用Mpȝ的硬盘)上安装,推荐用PE光盘QU盘)启动Q然后对照本文进行操作。如果硬盘已l有XPQX86Q系l,又是安装32位的Win7或Vista的话Q直接双d装文件SETUP.EXE卛_?br> 1、硬盘空间准备?br> 安装Win7pȝ的分Z般要30?0G大小Q且为NTFS格式。因你现在的?sh)脑已经在C盘安装了XPQ因此要先准备一?0?0G的D盘或E盘来装Win7 。如果D、E盘的I间不符合要求,则调整一下。调整方法是Q先备䆾D、E盘的资料Q然后下载Paragon Partition Manager l色版,在XPpȝ下用它将D盘或E盘的I间调整?0?0G 。具体方法可以参考这个帖子的部分章节Q?a target=_blank>http://softbbs.pconline.com.cn/7307078.html
Paragon Partition Manager 7l色版可以在点击q里下蝲Q?a target=_blank>WINPM.rar
2、Win7文g准备?br> ①下载Win7 的ISO文g到本机硬盘中?br> ②提取Win7 启动文g。用UltraISO软g或虚拟光驱加载Vista的ISO文gQ将bootmgr文g和boot、efi、sources文gҎ(gu)到C盘(sources只需拯boot.wim文gQ其余的不必拯Q因此可以事先在C盘新Z个文件夹sourcesQ再拯boot.wim文gq去Q?br> ③提取Win7 安装文g。用与②相同的方法将sources文gҎ(gu)贝到E盘中Q也可以攑ֈF盘等Q只要不攑֜Win7 要安装的D盘)?br>
3、Win7 启动格式准备?br> 在XPpȝ打开行命令行H口Q方法是Q开?#8594;q行Q填入CMD然后回RQ,在命令行H口键入命o(h)q回车:(x)
c:\boot\bootsect.exe /nt60 c:
注:(x)如果安装64位的Win7/VistaQ因为系l镜像中的bootsect.exe?4位的Q不能在32位系l下q行。下面提供一?2位的l大家下载,免得又要到处找。请安装64位系l的|友下蝲使用Q解压后覆盖boot文g夹中?4位的bootsect.exep了?br>bootsect86.rar
4、启动Win7 的PEpȝ?br> 重启?sh)脑Q就?x)进入WinPE pȝ Q启动完成后弹出Win7 安装界面Q点“下一?#8221;→“修复计算?#8221;→“?#8221;→“下一?#8221;→“命o(h)提示W?#8221;Q弹出命令行H口?br>
5、清理启动文件?br> 必须删除原来拯到C盘的bootmgr文g和boot、efi、sources文g夹,以免安装Win7 时启动文件乱导致失败。分别在命o(h)行窗口键入命令ƈ回RQ?br>del c:\bootmgr
rd /s c:\boot
rd /s c:\efi
rd /s c:\sources
6、格式化D盘?br> 键入以下命o(h)q回车:(x)format d: /q /fs:ntfs
如果D盘已l是NTFS格式Q可以不?fs:ntfsq个参数?nbsp;如果D盘是I盘Q就不必格式化了Q蟩q这一步?nbsp;
7、运行win7 安装命o(h)?br> 键入以下命o(h)q回车:(x)
E:\SOURCES\setup.exe
8、完成安装?br> 按提CZ步步完成win7 安装Q其q程跟光盘安装是一L(fng)?br> 安装完成后,你就拥有Win7-XP双系l了?br>
要注意的是:(x)
①在提示选择“安装cd”时不要?#8220;升”Q要?#8220;自定义(高Q?#8221;Q?br>②在提示安装到哪一个盘旉?#8220;分区2”Q即D盘)Q不要搞错了Q?br>③在提示输入产品密钥Ӟ输入你申P搜烦...Q?_-Q到的密钥,或可以留I,直接?#8220;下一?#8221;Q等安装完成后,再想法激zR?br>
版本Qv1.2
修订Q?008q??4?1:45:35
出处Q?a >blog.kysf.net
版权Q作者保留对本文的一切修攏V发布等权力。Q何h惌转蝲本文部分或全部内Ҏ(gu)Q必M留包括作者、版本、修订、出处、版权,׃信息。对本文的参考引用,则不受限制?/p>
关键词:(x)subversion, 安装配置, 权限, 目录讉K
1 前言
2 基本概念
2.1 什么是版本控制
2.2 什么是 Subversion
2.3 版本库(repositoryQ?br>3 安装配置
3.1 安装独立服务?SVNServer
3.2 安装 ApacheSVN 服务?br>4 FAQ
5 参考资?/p>
׃72时Q终于把 Subversion 初步掌握了。从一个连“什么是版本控制”都不知道的门外汉Q到配置出精至每目录访问的入门者,中间q卡了一天时间。其中费了许多气力,摸烦实验了多ơ,q差Ҏ(gu)弃了Q但是收h巨大的。现把我的配|和学习(fn)q程写下来,供大家参考,也让初学者少走弯路?/p>
׃本h不会(x) Unix/Linux Q正在学?fn)中Q,故仅?Windows q_Z讲解QUnix/Linux q_请参考相兌料。如其中有谬误的地方Q包括错别字Q请联系我修订?/p>
技术在分n中进步!
2.1、什么是版本控制
单点来说Q版本控制就是数据仓库,它可以记录你Ҏ(gu)件的每次更改。这Pq你在昏天黑地的改了几个月后老板说不要了Q还是按照过去那P你也不会(x)抓狂Q简单的恢复版本操作搞定一切?/p>
2.2、什么是 Subversion
Subversion是一个自?开源版本控制系l,它管理文件和目录可以越旉。一l文件存攑֜中心版本库,q个版本库很像一个普通的文g服务器,只是它可以记录每一ơ文件和目录的修改,q便使你可以取得数据以前的版本,从而可以检查所作的更改。从q个斚w看,许多人把版本控制pȝ当作一U?#8220;旉机器”?/p>
Subversion可以通过|络讉K它的版本库,从而用户可以在不同的?sh)脑上用。一定程度上可以_(d)允许用户在各自的地方修改同一份数据是促进协作。进展可能非常的q速,q没有一个所有的改变都会(x)取得效果的通道Q由于所有的工作都有历史版本Q你不必担心׃失去某个通道而媄响质量,如果存在不正的改变Q只要取消改变?/p>
一些版本控制系l也是Y仉|管理(SCMQ系l,q种pȝl过特定的精巧设计来理源代码,有许多关于Y件开发的Ҏ(gu)—本w理解编E语a、或者提供构建程序的工具。然而,Subversion不是q样一个系l,它是一个通用pȝQ可以管理Q何类型的文g集,对你q可能是源代码,对别人,可能是一个货物报价单或者是书稿{?/p>
2.3、版本库QrepositoryQ?/p>
Subversion 的核心就?rpository Q中文翻译成“版本?#8221;。就是位于服务器端,l一理和储存数据的地方?/p>
环境
OSQWindows XP SP2
WebQApache 2.2.6
SVNQsvn-win32-1.4.6
一、准备工?/p>
1、获?Subversion 服务器程?/p>
到官方网站(http://subversion.tigris.org/Q下载最新的服务器安装程序。目前最新的?.4.6版本Q具体下载地址在:(x)http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91 Q注意找 for apache 2.2.x 版本的?/p>
2、获?TortoiseSVN 客户端程?/p>
从官方网?http://tortoisesvn.net/downloads 获取最新的 TortoiseSVN 。TortoiseSVN 是一个客L(fng)E序Q用来与 subvers 服务器端通讯。Subversion 自带一个客L(fng)E序 svn.exe ,?TortoiseSVN 更好操作Q提高效率?/p>
二、安装服务器端和客户?/p>
首先安装 Apache 2.2.6 Q具体安装方法大家参考相兌料,或者参看我写的?a >Windows下安装Apache 2.2.x》?/p>
其次安装 SubversionQ以下简USVNQ的服务器端和客L(fng)。下载下来的服务器端是个 zip 压羃包,直接解压~即可,比如我解压到 E:\subversion 。客L(fng)安装文g是个 exe 可执行文Ӟ直接q行按提C安装即可,客户端安装完成后提示重启?/p>
三、徏立版本库QRepositoryQ?/p>
q行Subversion服务器需要首先要建立一个版本库QRepositoryQ。版本库可以看作是服务器上集中存攑֒理数据的地斏V?/p>
开始徏立版本库。首先徏?e:\svn I文件夹作ؓ(f)所有版本库的根目录。然后,q入命o(h)行ƈ切换到subversion的bin目录。输入如下命令:(x)
此命令在 E:\svn 下徏立一个版本库 repos1 。repos1 下面?x)自动生成一些文件夹和文件?/p>
我们也可以?TortoiseSVN 囑Ş化的完成q一步:(x)
先徏立空目录 E:\svn\repos1 Q注意一定是要空的。然后在 repos1 文g夹上“右键->TortoiseSVN->Create Repository here...”Q然后可以选择版本库模式,q里使用默认的FSFS卛_Q然后就创徏了一pd文g夹和文gQ同命o(h)行徏立的一栗?/p>
四、运行独立服务器
此时 subversion 服务q没有开始,只是通过它的命o(h)建立了版本库。l在刚才的命令窗口输入:(x)
svnserve 会(x)在端?3690 {待hQ?-daemonQ两个短横线Q选项告诉 svnserve 以守护进E方式运行,q样在手动终止之前不?x)退出。注意不要关闭命令行H口Q关闭窗口会(x)?svnserve 停止?/p>
Z验证svnserve正常工作Q用TortoiseSVN -> Repo-browser 来查看版本库。在弹出?URL 对话框中输入Q?/p>
?OK 按钮后就可以看见 repos1 版本库的目录?wi)结构了Q只不过q时 repos1 是个I库?/p>
你也可以使用--root选项讄根位|来限制服务器的讉K目录Q从而增加安全性和节约输入svnserve URL的时_(d)(x)
以前面的试作ؓ(f)例,svnserve 会(x)q行为:(x)
然后TortoiseSVN中的版本库浏览器URL~减为:(x)
五、配|用户和权限
用文本编辑器打开E:\svn\repos1\conf目录Q修改svnserve.confQ?/p>
:(x)
改ؓ(f)Q?/p>
卛_掉前面的 # 注释W,注意前面不能有空根{?/p>
然后修改同目录的passwd文gQ增加一个帐P(x)
:(x)
增加帐号Q?/p>
六、初始化导入
下面是我们的数据Q项目)导入到这个版本库Q以后就q本库理我们的数据。我们的M改动都回被版本库记录下来Q甚x们自׃失、改错数据时版本库也能帮我们扑֛数据?/p>
比如Q我?d:\wwwroot 下有?guestbook 文g夹,里面存放的是我编写的留言程序。在此文件夹?#8220;右键 -> TortoiseSVN -> Import...” Q在弹出对话框的“URL of repository”输入“svn://localhost/repos1/guestbook”。在“Import message”输入“导入整个留言?#8221;作ؓ(f)注释?br>?OK 后要求输入帐受我们在用户名和密码处都输入 test 。完成后 guestbook 中的内容全部导入C svn://localhost/svn/repos1/guestbook ?/p>
我们看到?e:\svn\repos1 没有M变化Q连?guestbook 文g多w没有建立Q唯一的变化就是e:\svn\repos1定w变大了。实际上我们源guestbook中的内容已经导入 repos1 版本库了Q源 guestbook 文g夹可以删除了?/p>
需要注意的是,q一步操作可以完全在另一台安装了 TortoiseSVN 的客h上进行。例如运行svnserve的主机的IP?33.96.121.22Q则URL部分输入的内容就?#8220;svn://133.96.121.22” ?/p>
七、基本操作流E?/p>
1、取出(check outQ?/p>
取出版本库到一个工作拷贝:(x)
来到LI目录下Q比如在f分区建立一个空文g?f:\work ?#8220;右键 -> SVN Checkout”。在“URL of repository”中输?#8220;svn://localhost/svn/repos1/guestbook”Q这h们就得到了一?guestbook 中内容的工作拯?/p>
2、存入(check inQ?提交QcommitQ?/p>
在工作拷贝中作出修改q提交:(x)
?guestbook 工作拯中随便打开一个文Ӟ作出修改Q然?#8220;右键 -> SVN Commit... ”。这h们就把修Ҏ(gu)交到了版本库Q版本库Ҏ(gu)情况存储我们提交的数据?/p>
在修改过的文件上“右键 -> TortoiseSVN -> Show Log” Q可以看到对q个文g所有的提交。在不同?revision 条目?#8220;右键 -> Compare with working copy”Q我们可以比较工作拷贝的文g和所?revision 版本的区别?/p>
Subversion的设计包括一个抽象的|络层,q意味着版本库可以通过各种服务器进E访问。理ZԌSubversion可以使用无限数量的网l协议实玎ͼ目前实践中存在着两种服务器?/p>
通过 Http 协议讉K版本库是 Subversion 的亮点之一?strong>ApacheSVN服务?/strong> 具备了许?svnserve服务?没有的特性,使用上更加灵z,但是有一炚w于配|,灉|通常?x)带来复杂性?/p>
׃ Subversion 需要版本化的控Ӟ因此标准?Http 协议不能满需求。要?Apache ?Subversion 协同工作Q需要?WebDAVQWeb-based Distributed Authoring and VersioningQ)Web 分布式创作和版本控制Q。WebDAV ?HTTP 1.1 的扩展,关于 WebDAV 的规范和工作原理Q可以参?IETF RFC 2518 ?/p>
一、必备条?/p>
Z让你的版本库使用HTTP|络Q你必需具备以下几个条gQ?/p>
下面以我的配|过E详l讲解?/p>
环境Q?/p>
OSQWindows XP SP2
WebQApache 2.2.6
SVNQsvn-win32-1.4.6
二、安?/p>
1、安装Apache
具体安装Ҏ(gu)见:(x)?a >Windows下安装Apache 2.2.x?/p>
2、安?Subversion
下载下来的 svn-win32-1.4.6.zip 直接解压卛_Q比如我解压?e:\subversion ?br>从Subversion安装目录?bin 子目录将 intl3_svn.dll、libdb44.dll、mod_authz_svn.so、mod_dav_svn.so 拯到Apache的模块目录(Apache 安装目录?modules 文g夹)?/p>
三、基本的Apache配置
修改Apache的配|文?httpd.conf Q用LoadModule来加载mod_dav_svn模块?/p>
:(x)
Ҏ(gu)Q?/p>
卛_掉前面的“#”受?/p>
dQ?/p>
一定确定它?mod_dav 之后?/p>
现在你已l设|了Apache和SubversionQ但是Apache不知道如何处理Subversion客户端,例如TortoiseSVN。ؓ(f)了让Apache知道哪个目录是用来作为Subversion版本库,你需要用编辑器Q例如记事本Q编辑Apache的配|文件?/p>
在配|文件最后添加如下几行:(x)
q个配置告诉Apache首先需要启?dav_moduleQ然后加?dav_svn_module 。版本库对外的URL是:(x)http://服务器IP/repository/ Q所有的Subversion版本库在物理上位于e:/svn/repos1/ ?/p>
配置完毕后重新启?ApacheQ打开览器,输入 http://服务器IP/ repository/ 会(x)看到如下画面Q?/p>
q表C?Apache ?dav_svn 模块已经可以正常工作了。用户可以用Q何一U?Subversion 的客L(fng)通过 Http 协议讉K你的版本库?/p>
如果惌指定多个版本库,可以用多?Location 标签Q也可以使用 SVNParentPath 代替 SVNPathQ例如在 e:\svn 下有多个版本?repos1Qrepos2 {等Q用如下方式指定Q?/p>
“SVNParentPath e:/svn ” 表示 e:\svn 下的每个子目录都是一个版本库。可以通过 http://服务器IP/repository/repos1/Qhttp://服务器IP/repository/repos2/ 来访问?/p>
现在你的版本库Q何h都可以访问,q且有完全的写操作权限。也是说Q何h都可以匿名读取,修改Q提交,以及(qing)删除版本库中的内?注:(x)q时不需要配|E:\svn\repos\conf\svnserve.conf 文gQƈ且也不需要启动E:\subversion\bin\svnserve.exe。因为提交是通过Apache的dav模块处理的,而不是由svnservice处理?。我们用 TortoiseSVN 客户端验证即知?/p>
昄大部分场合这是不W合需求的。那么如何进行权限设|呢QApache 提供了基本的权限讄Q?/p>
四、认证选项
1、基?HTTP 认证
最单的客户端认证方式是通过 HTTP 基本认证机制Q简单的使用用户名和密码来验证一个用L(fng)w䆾。Apache提供了一?htpasswd 工具来管理一个用hӞq个文g包含用户名和加密后的密码Q这些就是你希望赋予 Subversion 特别权限的用戗htpasswd 可以?Apache ?bin 安装目录下找到。具体用方法如下:(x)
创徏用户文gQ?br>htpasswd -c E:\usr\Apache2.2\bin\passwd.conf username
d新用P-m 表示?MD5 加密密码Q可选项Q:(x)
htpasswd [-m] E:\usr\Apache2.2\bin\passwd.conf Newusername
更改用户密码Q?br>htpasswd [-m] E:\usr\Apache2.2\bin\passwd.conf username
删除用户Q要用大写的 D Q:(x)
htpasswd –D E:\usr\Apache2.2\bin\passwd.conf username
接下来修?httpd.confQ在 Location 标签中加入如下内容:(x)
说明Q?/p>
AuthType BasicQ启用基本的验证Q比如用户名/密码寏V?/p>
AuthName "svn repos"Q当一个认证对话框弹出Ӟ出现在认证对话框中的信息。(最好用英文QTortoiseSVN 不支持中文,安装语言包除外。)
AuthUserFile E:/usr/Apache2.2/bin/passwdQ指定E:\usr\Apache2.2\bin\passwd为用hӞ用来验证用户的用户名?qing)密码?/p>
Require valid-userQ限定用户只有输入正的用户名及(qing)密码后才能访问这个\?/p>
重新启动 Apache Q打开览器访问版本库。Apache ?x)提CZ输入用户名和密码来认证登陆了Q现在只?passwd 文g中设定的用户才可以访问版本库。也可以配置只有特定用户可以讉KQ替换上q?"Require valid-user" ?"Require user tony robert" 只有用h件中?tony ?robert 可以讉K该版本库?/p>
有的时候也怸需要这样严格的讉K控制Q例如大多数开源项目允许匿名的d操作Q而只有认证用h允许写操作。ؓ(f)了实现更为细致的权限认证Q可以?Limit ?LimitExcept 标签。例如:(x)
以上配置匿名用户有读取权限,而限制只?passwd 中配|的用户可以使用写操作?/p>
如果q还不能满你的要求Q你希望_的控制版本库目录讉KQ可以?Apache ?mod_authz_svn 模块Ҏ(gu)个目录进行认证操作?/p>
2、用 mod_authz_svn q行目录讉K控制
首先需要让 Apache ?mod_authz_svn 模块加蝲q来。在 Subversion 的安装目录中扑ֈ mod_auth_svn 模块Q将其拷贝到 Apache 安装目录?modules 子目录下。修?httpd.conf 文gQ添加:(x)
现在可以?Location 标签中?authz 的功能了。一个基本的 authz 配置如下Q?/p>
AuthzSVNAccessFile 指向的是 authz 的策略文Ӟ详细的权限控制可以在q个{略文g中指定。访问文?accesspolicy.conf 的语法与svnserve.conf?Apache 的配|文仉常相|以(#Q开头的行会(x)被忽略;在它的简单Ş式里Q每一节命名一个版本库和一个里面的路径Q认证用户名是在每个节中的选项名;每个选项的值描qC用户讉K版本库的U别QrQ只读)或者rwQ读写)Q如果用h有提到或者值留I,讉K是不允许的; * 表示所有用P用它控制匿名用户的访问权限;@W号区分l和用户。如Q?/p>
使用 SVNParentPath 代替 SVNPath 来指定多个版本库的父目录Ӟ其中所有的版本库都按照这个策略文仉|。例如上例中 tony 对所有版本库里的 /tags 目录hd权限。如果要对具体每个版本库配置Q用如下的语法:(x)
q样目1?project1_committer l只能对 repos1 版本库下的文件具有写权限而不能修改版本库 repos2 Q同样项??project2_commiter l也不能修改 repos1 版本库的文g?/p>
1、\径或权限不时将出现错误信息提示Q?/p>
http://localhost Q\径不对)
Error * PROPFIND request failed on '/' PROPFIND of '/': 200 OK (http://localhost)
http://localhost/svn Q权限不I
Error * PROPFIND request failed on '/svn' PROPFIND of '/svn': 403 Forbidden (http://localhost)
http://localhost/svn/repos Q正常显C)
http://localhost/repos Q权限不允许Q?
Error * PROPFIND request failed on '/repos' PROPFIND of '/repos': 405 Method Not Allowed (http://localhost)
2、不启动E:\subversion\bin\svnserve.exe Q但启动了ApacheSVN Q访问(tortoiseSVN –> Repo – browserQ或提交QSVN CommitQ情形如下:(x)
现象Qsvn://localhost/svn/repos 不能讉K或提交,提示QError * Can't connect to host 'localhost': ׃目标机器U极拒绝Q无法连接??file:///e:/svn/repos ?http://localhost/svn/repos 可以讉K或提交?/p>
原因Qsvn:// 是独立服务器 svnserver 自己的协议。file:/// 是本地访问,x务器端和客户端在一个机器上?/p>
参考资料:(x)
Subversion 官方|站QSubversion 的官方网站,提供最权威的介l和最新的下蝲?br>Subversion 中文手册QSubversion 体中文官方网站翻译的中文手册?br>TortoiseSVN 中文文QSubversion 体中文官方网站翻译的 TortoiseSVN 中文文?br>我用SVN中文论坛Q国内h气非常旺?SVN 中文交流论坛?br>?a >用Apache和Subversion搭徏安全的版本控制环?/u>》:(x)IBM 工程师写的基?Linux ?SVN 教程?br>癑ֺ癄Q由全体|民共同撰写的百U全?/p>
~ 全文完~
印第?/p>
2007q?2?3?3:37:41 v1.0 初稿
2007q?2?5?:24:53 v1.1 更新。更改了几处路径Q之更加便于Win下调试。全文重新排版,阅读条理更清晰?
2008q??4?1:45:35 v1.2 修订。修改几处书写错误(谢谢׃南的网易博?42Q;修改1个关键配|\径?/p>
[本地工作区] Qwork copy Q本地工作副本; |
[主项目]Q引用共用模块的新项目(工程Q?/td> |
最新版本(HEAD revisionQ:(x)版本库里文g或目录的最新版?/td> |
SA QSVN服务器的理?/td> |
PRA Q单个项目库的管理员Q或者是目负责?/td> |
User Q普通工作h?/td> |
WC Qwork copy Q本地工作副?/td> |
1. 版本控制原则
SVNQ或者其他版本控制YӞ只是一个版本控制的辅助工具Q不可能把所有的问题都自动解x。尤Ӟ对于冲突q个ȝ事儿Q项目成员在目q程中要量通过优化程来解冻I而不是将希望寄托于Y件工h自动解决一切问题?br>的开发过E组l:(x)
<1>. 随行市>
目刚开始阶D,单独开发;目E_阶段Q完整开发。项目开发初期,各个目成员负责自己的文件夹Q或者模块)Q与SVN服务器间的更新、提交等操作只需 要针对自p责的文g夹(或者模块)p了,他h的文件夹Q或者模块)可以不必兛_Q项目稳定阶D,也就是每天的变更量很了Q所有项目成员与SVN服务 器的更新、提交等操作需要针寚w目的所有文件夹Q或者模块)Q各个项目成员在其本地编译时本地工作区的全部目E序Q或者资料)均ؓ(f)最新的版本Q保证项?作ؓ(f)整体能够利q行?br> <2>. 能躲p
量保证一份文件只有一个项目成员在~辑。D例说明:(x)E序员A负责底层中文?DBAccess.cs的编写,如果E序员B的工作要求他为DBAccess.cs增加两个Ҏ(gu)Q程序员B应该通知E序员A来增加而不是自己增加;如果?时A非常J忙需要B自己增加Q就需要B先更新本地的DBAccess.csQ然后开始修改,修改完成后立x交ƈ通知A更新本地的文Ӟ通过~短提交间隔 来减冲H?br>2. Z版本控制的开发流E?/strong>
版本控制下的软g开发基本流E?br>注意Q?/span>上述的流E中没有考虑试和审核的步骤?br>3.各阶D中svn的用方法介l?/strong>
<1>.安装后的常规讄
(1). 中文界面的设|?br>TortoiseSVN的操作语a讄Z文,控制文g夹?#8220;_SVN”以便支持Asp.net目?br>
(2).忽略文g
为防止在提交操作时将不必要的文g上传到SVN服务器上Q可项目中不需要受SVN控制的文件和文g多w过讄忽略选项的方式排除掉。常被忽略的文g ?_* obj *.db *.resharper* *.Load *.pdb *.bak。可以根据实际需要来修改忽略参数Q?每个需要忽略的文gQ文件夹Q名UC间用I格作分隔符Q需要忽略的文g夹只要写文g夹名U就行,例如 objQ忽略obj文g夹及(qing)所包含文gQ_*忽略所有_Q下划线Q开头的文g夹及(qing)所包含文g。注意,q个讄仅对本机有效Q而且Ҏ(gu)机的所有项目的本地?作区有效Q对其他目l成员没有媄响。被忽略的文件仍可以通过“d”命o(h)使其受SVN控制?br>
操作界面如下图,只需忽略参数填写在“全局忽略模式”后的文本框中卛_?
(3).配置强制注释
目负责人通过讄目的TortoiseSVN:logminisize讄?Q以便强制注释。设|方法:(x)在项目的本地工作区文件夹上点击鼠标右 键选择“属?#8221;Q进?Subversion标签Q选中TortoiseSVN: logminisizeQ确保复选框“递归应用该属?#8221;选中Q取D?Q其意思是指提交的注释最短长度ؓ(f)五个字。注意,q个讄对其他项目成员的也有 效,但是对别的SVN客户端工P如AnkhSVNQ无效?
<2>. 初始化版本库
初始化版本库有两U常用的方式Q?br> 1. 直接“导入Import…”
对要执行导入操作得项目文件夹q行如下清理Q?br> (1). 把项目中不需要的文g删除。(临时文g、编译器创徏的文Ӟ比如*.obj、二q制文g{。)
(2). 把文件夹和子文g夹中的所有文件整理一遍。虽然你可以在导入之后再来进行重命名或删除等操作Q但是还是推荐你在导入之前把你的目整理好?br>在资源管理器Qwindows explorerQ中选择目(本地盘?的根文g夹,单击鼠标右键Q选择导入Import…命o(h)Q蟩Z个对话框Q?br>
在这个对话框中你需要填写你要将目导入仓库的URL地址Qsvn必须写Q。导入信息(Important MessageQ是用来记录日志信息的。注意:(x)?#8220;忽略样式exclude pattern”匚w的文件或文g夹不?x)被导入Q除非选择?#8220;包含忽略的文?#8221;选项?br>按下“定”按钮后,TortoiseSVN开始把整个文gҎ(gu)(wi)Q包括所有文Ӟ导入C库。用来做“导入Import”操作的这个文件夹的名字不?x)?现在仓库中,只有文g夹中的内容会(x)出现。注意:(x)刚才用来?#8220;导入Import”操作的这个文件夹q没有处于版本控制下Q要获取一份处于版本控制之下的[?地工作区]副本Q你需要对刚导入的版本做一?#8220;(g)出Checkout”操作?br> 2.“(g)出Checkout”?gt;“提交Commit”
新徏一个空文g夹作为[本地工作区]的存放文件夹Q徏议与目同名Q,在文件夹上(或者文件夹里)单击鼠标右键后在命o(h)菜单中选择“(g)出Checkout…”Q出现操作窗口。注意:(x)只能(g)出CheckoutC个空文g夏V?br>
把本地硬盘上的项目文件夹中的内容Q不要复刉目的Ҏ(gu)件夹Q全部复制到[本地工作区] 文g夹中QƈҎ(gu)件夹中进行清理操作(?#8220;导入Import”操作前的清理操作Q。然后选择[本地工作区] 文g夹单击鼠标右键蟩单,选择命o(h)“提交Commit…”Q?br>
提交对话框会(x)昄每一个有修改的文Ӟ包括新增的,删除的,q有没有版本控制的。如果不?#8220;提交Commit”某个有变更的文gQ只需取消N那个文件即可。相反,如果要提交某个未受版本控制的文gQ只需N它?yu)可以然?#8220;提交Commit”卛_?br> 3.日常开发中的SVN操作
0.版本L(fng)解释
SVNpȝ中的版本号准应该叫?#8220;修订版本?#8221;Q每当版本库接受了一个提交CommitQ文件系l进入了一个新的状态,叫做一ơ修订(revisionQ,每一个修订版本被赋予一个独一无二的、递增的自然数Q这个自然数是修订版本受?br>受控目中Q何一个受控文?文g夹进行了修改提交Commit操作Q项目的版本号就?x)提升一ơ,没有q行修改的文?文g夹其版本号不?x)发生变化。受?目每一个装态都包含目的所有文?文g夹,引v该次版本号增加的即修改了的文?文g夹保存新副本Q没有发生修改的文g/文g夹保存引用,因此目?的文?文g夹可能与目的版本号不同?br>
0.更新(Update)工作副本
把他人做的修改融合到自己的本地副本当中,q个把改动从服务器拿到本地的q程是“更新Update”?#8220;更新Update”操作可以针对一个文Ӟ 或几个被选择的文Ӟ或某个文件夹中的所有文件。选择惌q行“更新Update”操作的文件和Q或Q文件夹Q单击鼠标右键,在菜单中选择“更新 Update”Q?执行H口昄正在“更新Update”的进度。他人做的修改会(x)合ƈ到自q文g中,而自己所做的修改?x)被保留。如果不能合qӞ会(x)出现冲突Q红色文字显 C)Q冲H的文g图标出现标志?br>命o(h) “更新至版本Update to Revision...” 可以使[本地工作区]更新到自己选择的一个特定版本?br>
0.解决冲突
选择的文Ӟ点击鼠标右键菜单中选择“~辑冲突Edit Conflict”来打开合ƈ工具或冲H编辑器Q做一些必要的修改Q然后保存文件。然后选择菜单中的“已解决的Resolved”命o(h)执行Q接着提交commit修改C库?br>注意Q命?#8220;已解决的Resolved”q没有真正的解决冲突Q它只不q是?#8220;文g名称.扩展?mine” ?“文g名称.扩展?r*”Qr*中星号代表Q意位数字Q即版本P删除Qƈ允许你提交修改而已。因此,在有冲突发生时要先执?#8220;~辑冲突Edit Conflict” 再执?#8220;已解决的Resolved”Q如果确信自q修改是正的Q不需要保留他人的修改Q可文件名U?扩展?mineL“.mine”后缀Qƈ?“.r*”后缀的文件和“
”的文件删除,然后正常“提交Commit”Q版本库中将保存自己的版本?br>
0.提交修改C?br>
强烈在提交之前,应该认[本地工作区] 是最新的。可以直接作一?#8220;更新Update”操作Q或者先“(g)查更新Check for Modifications”看看在本地或在服务器上哪些文件修改过。如果没有这L(fng)操作直接提交的话Q很有可能出现冲H现象?#8220;(g)查更新Check for Modifications”操作后的l果界面如下Q?
如果[本地工作区] 是最新的Qƈ且没有冲H,可以提交你的修改了。选中你想要提交的L文g或文件夹Q然后选择在菜单中选择“提交Commit…”在提交对话框中双M?有修改的文gQ可以启动外挂的比较工具来显CZ改细节?在按?#8220;定OK”按钮之后Q会(x)昄提交的进E情c(din)?br>
0.比较差异(Diff)
[本地工作区] 修改后,被修改的文g出现标志Q选择 “比较差异Diff” 命o(h)Q可以查看该文g与版本仓库中文g具体差异Q选择命o(h)后出现对应的差异察看H口?
0.加入(Add)新文?新文件夹
x在开发过E中创徏的新文g/文g夹加入到SVN控制之下Q可以这样做Q选中文g/文g夹(在新文g/文gҎ(gu)在父文g夹点d键)Q然后在菜单中选择“dAdd”命o(h)。不需要受SVN控制的文件请取消钩选?
在把文g或文件夹加入到控制之下后Q这些文件或文g夹就?x)显CZؓ(f)一个Added覆盖图标的样子,接下来必d[本地工作区] 执行提交commit操作Q以便其他团队成员能够看到这些文件或文g夏V?br>
0.删除、重命名、移?br>选择要删除(或重命名Q的文g/文g夹,点击鼠标右键选择相应命o(h)Q?
如果使用TortoiseSVN?#8220;删除Delete”操作删除了一个文?文g夹,文g已l从[本地工作区]中删除了Q而被“删除Delete” 的文件夹显CZؓ(f)覆盖图标。要恢复?#8220;删除Delete”文g/文g夹,只需对他的上U文件夹q行“SVNq原revert”操作卛_?br>如果要在[本地工作区]内移动文Ӟ可以使用鼠标来拖拽:(x)
1Q选中要移动的文g或文件夹?br> 2Q用鼠标右键拖拽他们到[本地工作区]中一个新的文件夹?br> 3Q松开鼠标右键?br> 4Q在跛_的菜单中选择相应命o(h)Q如下图Q?
如果一个删除操作不是用TortoiseSVN?#8220;删除Delete”操作完成的,而是像q_删除文g那样删除的。提交时Q对话框H口q是?x)显C?q些删除的文Ӟq提C己把它们从版本控制下删除。所以如果忘C用TortoiseSVN“删除Delete”操作来删除这些文Ӟ仍可在这里补上?br>
0.取消改变(revert)
如果要取消对一个文?文gҎ(gu)做的修改Q只需用鼠标右键单击该文g/文g夹,选择TortoiseSVN子菜单中?#8220;SVNq原revert”?令,在操作窗口中?x)显C需要还原的文g/文g夹,N文?文g夹后按下“定OK”按钮卛_。注意这里所做的取消修改只能q回到该文g/文g夹上?#8220;?新Update”后的状态?br>
0.修订日志H口
每一ơ修改和提交Q都应该做好日志记录。这样开发过E中有了一个详l的记录Q以后便可找出每一个修Ҏ(gu)如何修改以及(qing)Z么这样修改的?日志对话框会(x)昄所有日志信息。显C分?个部分:(x)
1.最上面部分昄的是所有被提交的版本列表。显C有日期旉、提交者、修订版本号和日志信息的前面一部分。用蓝色昄的行表示有某些文件被复制Cq个版本。(也许是从一个分支来的)
2.中间部分昄的是选中版本的所有日志信息?br> 3.底部昄的是选中版本所做修改的文g和文件夹列表?br>q不仅仅是这些,对话框中q提供了很多的菜单命令可以用?br>
0.文g库浏览器
选择“文g库浏览器”菜单Q就可以打开Subversion服务器上版本库的l构Qƈ可以对版本库中的文g/文g夹进行操作,如下图:(x)
Subversion快速指?/p>
SubversionQ简写ؓ(f)SVNQ作为开源社A(ch)献的C代版本控制系l,已经得到来广泛的使用。我用过CVSQConcurent Version SystemQSVN的前w)和微软的VSSQVisual SourceSafeQ,相比之下QSVNh更强大的功能和更单的操作Ҏ(gu)?/p>
|上已有一些文章介lSVN的安装和使用Q不q我在第一ơ配|时仍然遇到了几个问题。这里,我按照自q思\来进行讲解,以期寚w些初ơ用SVNq且对一些问题存在疑问的朋友有所帮助?/p>
1. SVN?/p>
光说SVN好,那SVNI竟有什么优点呢Q在SVN的手册里有着详细的说明,下面单介l几个重要方面:(x)
1) Z目录的版本控?/p>
传统的CVS或VSS都是Z单个文gq行版本控制的,q实际上满不了实际需求,因ؓ(f)在实际应用中Q我们都希望按照目或者工E进行管理,例如假设我们惌取出某个历史旉点的整个目文gQ那么基于文件的版本控制pȝ存在弊端,只能单个单个文g的处理。而SVN则能很方便的做到q一点,你可以随意的取出M一个文件、Q何一个目录的M一个历史版本?/p>
SVNq允许对文g和目录进行增加、删除以?qing)复制和重命名等操作Q这些都?x)被记录到历史信息中Q实现真正的版本控制功能?/p>
2) 原子提交
SVN里的每次操作都是原子的,要么全部成功Q要么全部失败。假设你要提交多个文Ӟ如果有一个存在冲H,那么其它修改都不?x)被提交?/p>
3) 高效的分支(branchingQ与标签QtaggingQ功?/p>
先说标签功能Q通俗的讲Q标{ְ是某个时间点的快照(snapshotQ,我们可以在项目进行到一些重要的里程之时ؓ(f)之徏立标{,q样可以方便以后随时取出q些历史版本。我想你?x)有一个疑问:(x)SVN不是本n有随意取出M一个历史版本的功能吗?是的Q标{作用主要是ؓ(f)了给q些特定的历史版本取一个友好的名字Q以方便使用和维护?/p>
分支则是用于创徏多个q行的工作线Q比如,当我们的一个项目需要ؓ(f)某个用户提供一些特D的功能Ӟ那么可以ؓ(f)之创Z个分支,q样能够保正大部分代码的qQ也使得整个目变得Ҏ(gu)l护和管理?/p>
SVN对于分支和标{实现都是一L(fng)Qƈ且采用了与Unix/Linux链接(Hard-LinkQ类似的机制Q即是说Q当我们创徏分支或标{时QSVNq不?x)立即?f)之创Z份拷贝,而是创徏一个链接,只有当这些文件以后被修改时才?x)真正生一份副本。这U?#8220;~式拯”Ҏ(gu)是一U常见的优化Ҏ(gu)Q能够有效的节约I间?/p>
那分支和标签又有什么不同呢Q不同之处仅仅在于其“U定成俗”的含义,标签意味着你不?x)再对其q行修改Q而分支意味着你会(x)对它q行开发?/p>
4) 多种讉K方式
SVN提供了一个抽象的|络讉K层,可以通过不同的协议来对其q行讉K。首先,SVN提供了自定义的svn协议讉K方式Q通过形如svn://host/repository的URLp使用。再有,SVNq提供了与Apache Web服务器相集成的功能,q样Q我们就可以通过http://host/repository的方式来讉KSVN了?/p>
5) 对二q制文g的支?/p>
CVS虽然对二q制文g也有支持Q但实现得ƈ不完善,你或?dng)R到过文本文g里有中文字符而被认ؓ(f)是二q制文g的事情,SVN则提供了对二q制文g全面的支持,使得非文本文件也能跟文本文g一栯行良好的版本控制?/p>
6) Windows下与资源理器集成的客户端:(x)TortoiseSVN
SVN本n只提供命令行的操作方式,TortoiseSVN是第三方开发的囑Ş化界面,它的出现使Windows下的版本理变得非常方便。不q,׃是嵌入到资源理器中Q它可能?x)媄响系l的速度——微乎其微,你可以自p一下?/p>
7) q_无关
SVNU承了开源Y件的一贯优点,无论是Windowsq是Linuxq_Q都可以怺讉KSVN服务器?/p>
如果你过LVSS用户Q那么这里还要提一点,与VSS相比QSVNq有一个理念不一PVSS版本冲H控制放在操作之前,你要操作某个目必须先执行CheckOut以进行锁定、防止他人同时修攏VSVN提供了同L(fng)Lock功能Q但通常情况下,我们只需各自独立的进行修改而无需锁定目Q如果有冲突在提交的时候再做处理,也就是说QSVN是将冲突控制攑֜操作之后、提交之时。也怽?x)觉得VSS更合理,但实际情况却相反Q因为在我们的实际用中l常发生有h整个项目CheckOut后忘了CheckInQ或者未选择Recursive忘了子目录中的文gCheckInQ这p其他人无法修改,于是不得不h为的通知其本人,非常ȝ?/p>
2. SVN服务器搭?/p>
本节是针对管理员写的Q普通用户可以蟩q本节。我q里只以Windows上的安装ZQLinux上可按类似方式进行(有些配置参数?x)存在差别,具体参考帮助手册)?/p>
1) 安装SVN服务?/p>
a. 下蝲
SVN的官方网站ؓ(f)http://subversion.tigris.org/Q当前最新版本ؓ(f)1.4.2。Windows下的二进制安装包分ؓ(f)两种Q一U是以setupl尾的安装文Ӟ另一U是普通的压羃包文Ӟsetup文g?x)自动注册一些信息,比如环境变量以及(qing)服务{,q些都是可以自己手动实现的。在我写q篇文章Ӟ官方|站上就只有普通二q制文gQ估计setup文gE晚些时候会(x)出来。特别注意,下蝲时要详细阅读注意事项Q看清与之配套的软g的版本号Q避免出现问题?/p>
我选择的版本ؓ(f)svn-win32-1.4.2.zip
b. 安装
svn-win32-1.4.2.zip解压~到安装目录下,我选择的是C:/Program Files/SubversionQ如果是setup文gQ直接运行安装文件即可。对于压~包Q我们可以将bin路径d到系l环境变量中Q以方便操作。可以看刎ͼbin目录下主要有如下几个文gQ?/p>
svnadminQ仓库管理工P包括创徏、修复和备䆾{操作?br minmax_bound="true">svnlookQ仓库查看工P包括信息、日志和锁定状态等内容Q不?x)造成仓库的改动?br minmax_bound="true">svnserveQsvn服务E序Q允?dng)R过svn|络协议来访问仓库?br minmax_bound="true">svnQSVN客户端,用于讉K仓库Q对目q行版本理?br minmax_bound="true">svnversionQ客L(fng)工具Q用于查看本地拷贝的修订信息?br minmax_bound="true">c. 创徏仓库QRepositoryQ?/p>
SVN是以仓库为版本控制单位的Q一个SVN服务器可以管理多个仓库,每个仓库拥有独立的修订号QREVISIONQ,仓库中的M一ơ更新都?x)带来修订号的递增。你可以Ҏ(gu)需要选择建立一个或者多个仓库,q里Q我以创建多个仓库ؓ(f)例子Q假设我们将仓库都放到D:/SVN_REPOS目录下,下面的命令将?x)在该目录下创徏一个Test仓库Q?/p>
svnadmin create D:/SVN_REPOS/Test
如果创徏成功QD:/SVN_REPOS/下将?x)多一个Test目录?
2) 搭徏svnserve讉K方式
svn和http是两Uƈ列的讉K方式Q你可以选择其中一U,也可以都采用?/p>
a. 注册服务
Z让SVN服务E序每次开机后自动q行Q我们需要将其注册ؓ(f)服务。在控制C执行如下命o(h)Q?/p>
sc create svnservice binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service -r D:/SVN_REPOS" start= auto
注意Q上q命令均在一行中。sc.exe是Windows 2000以后pȝ自带的一个工P2000下没有,可以从XP上拷q来。svnservice为服务名Uͼ后面的参数格式有严格要求Q等号前面没有空D后面有。binPath本n带有多个参数Q因此用引号括v来,而由于\径里面又有空|因此又加上了一层引受?--service?r均ؓ(f)svnserve.exe的参敎ͼ前者要求它作ؓ(f)服务q行Q后者指明了仓库的根路径Q多仓库Z库的父目录)?
带安装包的SVN?x)自动注册服务,q时我们可能需要修?r参数Q命令如下:(x)
sc config svnservice binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service -r D:/SVN_REPOS"
b. 讉K
注册完后Q通过q行sc start svnservice或者服务管理器Qservice.mscQ启动服务?br minmax_bound="true">接下来,我们可以通过下面的命令来试pȝ是否工作正常Q?/p>
svn info svn://localhost/Test
如果正确的显C出仓库的相关信息,那么大功告成了Q否则请(g)查服务的参数是否配置正确Q比如,如果未在服务参数中指定正的-r|׃(x)得到如下错误Q?/p>
No repository found in 'svn://localhost/Test'
如果安装了TortoiseSVNQ则可以直接在浏览器中输入svn://localhost/TestQ这样会(x)调出TortoiseSVN的Repos-Browser。到此,你就可以通过TortoiseSVN来导入工E进行版本管理了Q参见后文)?/p>
c. 权限配置
在进行权限配|前Q所有的用户都能q行M操作Q在很多情况下是不允许的。在创徏仓库Ӟ仓库目录下都?x)生成好几个文g夹,其中conf里面存储的是配置信息Q包括三个文Ӟ(x)
authzQ访问权限配|?br minmax_bound="true">passwdQ用户名和密码配|?br minmax_bound="true">svnserve.confQ基本配|信?br minmax_bound="true">先配|svnserve.confQ将里面几项配置前的注释LQ最后的内容如下Q?/p>
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
q些参数的含义文仉都有详细说明Q其中,anon-access和auth-access分别是对匿名用户以及(qing)认证用户的访问控Ӟpassword-db指明用户密码文g路径Qauthz-db指明权限配置文g路径。另外还有一个参数realm用于指明仓库所属的认证域,默认情况下每个仓库位于不同的域(每个仓库有一个唯一的uuidQ,因此我们可以不设|该,除非多个仓库需要共用同一份passwd配置?/p>
passwd文g的配|很单,格式如下Q等号前面ؓ(f)用户名,后面为密码)Q?/p>
[users]
harry = 123
sally = 123
guest = 123
authz则可以创建用L(fng)q精配|某个用h用户l对某个文g或目录的讉K权限Q下面是一个例子:(x)
[groups]
harry_and_sally = harry,sally
[/]
* = r
[/project1]
* =
harry = rw
sally = r
[/project1/foo]
sally =
[/project2]
@harry_and_sally = rw
guest = r
文g内容其实很简单易懂,groups用于定义用户l,后面便是对资源的具体讉K控制Q?表示仓库根目录,*表示所有用P用户l前面需加上@W号Qr表示可读Qw表示可写Q等号右边ؓ(f)I则表示没有权限。注意对于目录结构,当用戯问某个资源时QSVN?x)先看有没有直接针对该资源的讉K控制Q如果没有找刎ͼ则会(x)l承上一U目录的讉K权限Q如此递推?/p>
再提一点,当我们有多个仓库Ӟ我们?x)发现这些仓库的用户帐号在大多数情况下都是相同的Q因此,我们可以passwd文g攑ֈ公共的地方,然后所有仓库的password-db配置都指向该文g。相应的Qauthz-db也可以共用一个文Ӟ不过需要在配置具体的访问控制时指明所属的仓库Q如下:(x)
[/]
* = r
[repos1:/project1]
* = r
harry = rw
[repos2:/project1]
* = r
sally = rw
上述配置表明Q所有hҎ(gu)有仓库的根目录都有读权限Q但只有harry对仓库repos1里的project1有读写权限,只有sally对仓库repos2里的project1有读写权限?
3) 搭徏HTTP讉K方式
SVN可以通过Apache实现Web讉K方式Q但q不是必需的,除非你有此需求?/p>
a) 下蝲
Apache的官方网站ؓ(f)http://www.apache.org/Q注意不要用最新的2.2.xQ而要选择2.0.xQ这一点在SVN官方|站上有特别说明Q当初我没有注意到q一点,而导致Apache2.2启动时无法加载SVN的模块,出现“perhaps this is not an Apache module DSO”错误?/p>
我下载的版本为apache_2.0.59-win32-x86-no_ssl.msi
b) 安装和注?/p>
执行Apache安装E序。由?.0的版本不?x)自动注册?f)服务Q因此我们需要手工处理。运行cmd.exeQ进入apache安装目录下的bin文g夹,执行如下命o(h)卛_Q?/p>
apache -k install
更多的命令可以通过apache help查看?/p>
注册完后Q就可以通过pȝ托盘里的Apache Monitor来启动服务。如?0端口未被占用Q那么服务器应正常启动,通过http://127.0.0.1p看到Apache的测试页面?/p>
c) 配置
Apache是通过conf目录中的httpd.conf文gq行配置的,比如Q默认的监听端口?0Q在文g中搜索Listen 80Q将80Ҏ(gu)你所需的其它端口即可。配|完后必重起Apache才能生效。更多关于Apache的配|说明请参见其帮助手册或google之。下面网站ؓ(f)帮助手册的中文版本?/p>
Z让Apache支持SVNQ比如增加一些配|项Q一个典型的配置如下Q?/p>
# 加蝲mod_dav模块Q它是对WebDAVQWeb-based Distributed Authoring and VersioningQ协议的支持Q由Apache自带
LoadModule dav_module modules/mod_dav.so
# 加蝲mod_dav_svn模块Q它与mod_dav通信QApache支持SVNQ它位于SVN的bin目录下?br minmax_bound="true">LoadModule dav_svn_module "D:/Program Files/Subversion/bin/mod_dav_svn.so"
# 加蝲mod_authz_svn模块Q用于进行权限管?br minmax_bound="true">LoadModule authz_svn_module "D:/Program Files/Subversion/bin/mod_authz_svn.so"
# 配置SVN的访问\径以?qing)相关相兛_?br minmax_bound="true"><Location /svn/> # 通过http://HOST/svn/讉KSVN服务?br minmax_bound="true"> DAV svn # 必需
SVNParentPath D:/SVN_REPOS # 说明D:/SVN_REPOS下的所有目录均Z?br minmax_bound="true"> SVNListParentPath on # 在网中列出D:/SVN_REPOS下的所有仓?br minmax_bound="true">
AuthType Basic # 基本的用户名密码验证方式
AuthName "SVN REPOS" # 认证名称Q作提示?br minmax_bound="true"> AuthUserFile D:/SVN_REPOS/users # 用户名密码文?br minmax_bound="true"> AuthzSVNAccessFile D:/SVN_REPOS/authz # 权限控制文g
Require valid-user # 只有通过认证才能讉K|页
</Location>
# 重定向处理,用于?a href="http://host/svn" minmax_bound="true">http://HOST/svn地址重定向ؓ(f)http://HOST/svn/
RedirectMatch ^(/svn)Q?Q?/
下面对几个重要的地方作以说明Q?/p>
i. |上很多文章提到mod_dav_svn.so和mod_authz_svn.so两个文g直接拯到Apache的modules目录下,当初我按照这U方法做时结果在一台Windows 2000 Server上无法启动Apache服务Qؓ(f)此折腾了半天。后来才明白Q这些模块文件其实就是一些动态链接库Q它需要依赖SVN的bin目录下的其它几个dll文gQ可以把后缀改ؓ(f)dllQ然后通过VC带的depends查看其依赖关p)Q因此如果没有设|环境变量,那么Apache加蝲q些模块时就?x)失败,当然也可以把所有依赖文Ӟ主要是libdb43.dll Q拷贝过厅R实际上Q我们只需要通过l对路径来引用这些模块即可,q样SVN升后也不用再次拯?/p>
ii. URL的访问\径ؓ(f)/svn/而不?svnQ因为后者可能有问题Q导致通过http://HOST/svn讉K出现如下错误信息
iii. SVNParentPath用于有多个仓库的情况Q如果只有单个仓库,可以直接用SVNPath指明仓库路径?/p>
iv. AuthUserFile指明用户名密码文Ӟ但它与前面提到的SVN仓库下的passwd文g不是同一个文ӞAuthUserFile是Apache的认证文件格式,二者的区别主要是用户名和密码的分割W不同,passwd是等Pq里的users是冒P当初我就是把它们当成一个文件而造成客户端无法访问(Z么SVN不把passwd的格式定义成和AuthUserFile的一样呢Q这样二者可以共用一个文Ӟ。如果要对密码加密,那么users文g需通过Apache附带的htpasswd工具生成Q实际上我们也可直接采用明文方式?/p>
v. 权限控制文gAuthzSVNAccessFile与前面SVN里的authz一P因此可以q?/p>
4) 其它理功能
a. 备䆾
b. 修复
3. SVN客户端?/p>
本节针对客户端用P主要介绍一些常用的操作Ҏ(gu)?/p>
1) 客户端安?/p>
客户端可以采用命令行方式Q也可以采用TortoiseSVN囑Ş化方式,个h认ؓ(f)q是后者方便些?/p>
TortoiseSVN?a minmax_bound="true">http://tortoisesvn.tigris.org/上获取,注意版本应与服务器保持一致。如果是命o(h)行方式的话,那么?a minmax_bound="true">http://subversion.tigris.org/下蝲一个SVN二进制包p了,此处不多讌Ӏ?/p>
TortoiseSVN属于囑Ş化的客户端YӞ其实前面的SVN安装包里已经含有客户端程序,只不q是命o(h)行方式的Q你可以Ҏ(gu)需要选择是否安装。TortoiseSVN的官方网站ؓ(f)http://tortoisesvn.tigris.org/Q同P注意选择与SVN服务器配套的版本?/p>
我这里用的版本为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi
安装完后Q会(x)提示重v机器Q实际上不用重vp直接使用Q只不过重v后会(x)更新SVN文g图标的显C。下图是SVN工作区的右键菜单内容Q?/p>
2) 主要操作
TortoiseSVN使用h很简单,所有操作都通过右键菜单来完成。命令内容也很直观,而且有非常详l的帮助手册Q这里只单的介绍一下?/p>
a) 导入目QImportQ?/p>
首先要把需要进行版本管理的工程Q目录)整理好,L不必要的文gQ比如编译器生成的(f)时文件。然后在最上层文g夹上单击右键Q选择“TortoiseSVN -> Import...”Q输入要存放的SVN服务器\径,认卛_。这样就本地的目导入C服务器上?/p>
命o(h)行:(x)svn import [PATH] URL
b) (g)出项目(CheckoutQ?/p>
目初次导入成功后,刚才本地的内容就没有用了Q我们需要徏立一个新的工作区Q重CSVN服务器下载受控的目文gQ执?#8220;TortoiseSVN -> Checkout...”Q选择或者输入项目的URLQ确认即可,以后的工作都应在q个工作区里q行?/p>
默认是获取项目的最新版本(HEADQ,如果要获取历史版本,指定相应的修订号QRevisionQ即可?/p>
命o(h)行:(x)svn checkout URL[@REV]... [PATH]
c) 更新与提交(Update and CommitQ?/p>
他h修改了项目,我们需要从服务器下载最新版本,q通过“SVN Update”右键菜单实现?/p>
命o(h)行:(x)svn update [PATH...]
如果是自己本C了修改,则应?qing)时修?gu)新到服务器上去,q通过“SVN Commit...”实现。一个好的习(fn)惯是每次提交都应注明修改内容Q以方便日后查证?/p>
命o(h)行:(x)svn commit [PATH...]
d) 增加和删除文ӞAdd and DeleteQ?/p>
如果我们要向一个受控项目中d新文件或文g夹,只需在目标上执行“TortoiseSVN -> Add”操作。注意,q里只是本地dQ要提交到服务器Q还必须执行Commit才行?/p>
命o(h)行:(x)svn add PATH...
同样Q要删除受控文g或文件夹只需执行“TortoiseSVN -> Delete”操作?/p>
命o(h)行:(x)svn delete PATH/URL...
TortoiseSVNq提供了一个重命名操作“TortoiseSVN -> Rename”Q这其实是添加和删除的组合?/p>
e) 撤销操作QRevertQ?/p>
有时候,我们可能q行了错误的修改或者增加和删除Q只要未q行提交Q我们都可以通过“TortoiseSVN -> Revert”命o(h)来撤销本地的所有更攏V?/p>
命o(h)行:(x)svn revert PATH...
f) 查看信息
SVN提供了几U信息查看方式,其中Show log用于昄每次版本变更的日志信息,Repo-brower是仓库浏览器Q类g资源理器,Revision graph则以囑Ş化的方式让我们很直观的看到版本的变更情况Q尤其是对于分支和标{理很有帮助?/p>
3) 其它操作
a) 冲突解决QResolvedQ?/p>
如果我们本地q行了修改,而别人又把他的修Ҏ(gu)交到了服务器上,q时我们执行Update可能出现冲H(ConflictQ。Resolved的作用不是解军_H,它不q行M合ƈQ而是忽略掉他人的修改Q允许我们将自己的版本提交到服务器上?/p>
单的_(d)Revent是撤销本地修改Q而Resolved是保留本C攏V?/p>
b) 清除异常状态(CleanupQ?/p>
如果在执行某个命令的时候出现异常,比如服务器突然挂了,本地的工作区׃(x)处于一U异常状态,通过Cleanup能够清除q种状态,使工作区不受到媄响?/p>
c) 锁定QGet lockQ和解锁QRelease lockQ?/p>
冲突都是׃不同的开发h员同时修改了同一份文仉成的,因此Qؓ(f)了避免这U情况,我们可以锁定自己要修改的内容Q这样其他h在我们解锁前无法提交其修改?/p>
d) 分支和标{(Branch/tagQ?/p>
本文最开始就有说明,分支的目的是Z创徏q行的工作线Q标{作用是ؓ(f)了保存项目某个版本的快照。二者在实现上却是一L(fng)Q都是通过Branch/tag命o(h)执行?/p>
e) 导出QExportQ?/p>
Z实现版本理QSVN?x)在工作区的每个目录下都生成一个隐藏的.svn文g夹,而我们有时却希望得到一个干净的没?svn文g夹的目l构Q比如发布Y件时Q这U情况下可以用Export功能?/p>
f) 重定向(RelocateQ?/p>
有时候,SVN服务器的IP地址可能?x)发生变动,如果遇到q种情况Q我们每个h的本地工作区都要重新下蝲吗?不用Q只需通过Relocate重新配置一下本地工作区所对应的服务器地址可以?/p>
g) 补丁理QpatchQ?/p>
不要被patch的名U迷惑,实际上它不属于SVN版本理的范畴。这里所谓的patch是指那些寚w目没有写权限QCommitQ的人所作的修改Q通过“TortoiseSVN -> Create Patch”生成Q然后他们采用电(sh)子邮件等方式patch发给目理员,q理员执行“TortoiseSVN -> Apply Patch”q确认修改内容后再进行提交。该功能主要用于开源项目的理?/p>
注册?urKH3mXZVDiTNgCKQnFnfvaQB5tTtahv tUr5HqwT9YZu50+b3T9bkzYKwKsfjhhi DgzR9Dr5qbmJ2EmNzYfSAq4ocM7E8B0D kDvyvawgHd0gV-nFnVNBsqMgnxcKoJfZ 6WrrQotEiqs6H14Jk9Wjz+SLvovnUksb gT5K1ey7T7AV2C32NLt4gjavcM5tzDR0 GUbvAou+MKzhMHebccC+3fB0wwwKNPs0 fwCz3Xh16S6yB4xxeD2bS6JFV9JPZwkA