这两天公司需要配置svn服务器,可是俺以前只是用过checkin checkout的,对于svn本身了解甚少,正好借此机会搞一下,内容非常浅显,高手勿笑。
#{
//v0.2
想了想还是把模板换成了比较舒服的样子。:) 今天又又有了新的进展,昨天有的没说清,现在做第一个修正版,不过时间不早了,可能不会太详细。
//v0.3/110407
直接从0.2跳到0.3啊,不是我的研究深入了,而是。。。发现了一个华丽丽的CollabNet Subversion Edge,看文章前请跳到补充5先。
#}
因为对Linux知之甚少,我们就在windows下配置服务器,其实就是一台xp的普通pc,其实就是我自己使用的赛扬开发机 - -#,鉴于我们只有4台电脑,项目也不多,应该够用了,我想在windows下配置的话,应该大体上差不多的。在Linux下貌似也很有共通之处。
首先我搜了下svn,先大概了解下基本概念,原来svn可以托管到http服务器上的,在svn中文站上有svn的中文手册,感谢。
一般来说svn服务器主要使用svnsever和Apache托管,前者是轻量级,后者是重量级,俺完全不懂web,貌似大家都在用Apache,俺就去Apache站下了no ssl版,不过白下了。为啥白下,且听我道来。顺便说下,貌似中国的一些企业为Apache提供了镜像下载,甚至还有无耻的从,汗,希望越来越多的国内企业不光是索取,也要贡献,多攒些rp。
搜svn到svn官方主站先,人家说现在这个网站过期了,你要干啥啥要去新的官方站点,--,好吧,那我们就去新的站点好了,注意左边的Getting Subversion-Binary Packages,点击,然后选windows,然后看见没,多种选择哦,有四种svn的包装,这里要说下,svn本身是没界面的一个啥啥程序,比较难用,这几个版本都是包装过的,有的含带web服务器,有的有图形界面,总之就是让我们用着更方便更爽,很多人喜欢VisualSVN,好像图形界面相当友好,不过可能要使用破解的吧。俺凭感觉选择了CollabNet SVN,nnd,费了很大劲儿才明白CollabNet SVN和svn的关系,唉,CollabNet SVN包含了一个Apache,而且还是和svn集成好的,后面就不用配置太多了,太好了。有人说windows下用Apache2.2配合svn可能会有问题,不过我没有遇到。貌似CollabNet SVN里还有个viewVC,不过俺没弄起来,它需要Python2.5,俺去Python官网只有2.7,而且那个Python在windows下使用好像还要个东东,不知道称为什么,是2.6的,- - ,shit,我试了下,失败。言归正传,现在知道为啥不用单独下Apache了吧,来,现在让我们来装CollabSVN.恩,不要怕,对,双击,下一步,然后中间会有个地方要你选择svn_repository的目录,目录名字随便起,个人建议目录别太深,ok,我选择的是D:\svn_repository,别的什么80,3690端口的不用管,viewVC我不会,然后就装完了,装完了要重启下电脑,这是必须的,Apache和svn会以服务形式启动,你在windows管理工具中可以看见。我的程序安装目录是D盘,就是把c改成d那么简单,个人习惯,你看着办,但是你要记住程序的安装目录,很有用。下面我们就开始来配置吧。最开始我参考了这篇文章,还有这篇文章,很实用,可是文章貌似是拼的,我也走了弯路的说,现在我结合经验来总结下,刚开始接触svn最难的倒不是操作,是概念的理解。
关于概念:
关于svn的目录:首先我们在前面选择的svn_repository不是svn的目录,这个目录叫做SVNParentPath,其实也存在SVNPath,可是使用Parent概念是有好处的,因为我们的svn源码仓库可能有许多个,现在我来比方说,我们有一个C#软件仓库,一个java软件仓库,我们总不能把这些项目混在一起吧,那样是找死,所以我们最起码要有一个cs软件仓库,一个java软件仓库,现在开始,我会用实例讲解了。
关于svn仓库:首先要记住,不要用windows资源管理器的概念跑到svn_repository文件夹下右键单击”新建文件夹”建立目录,也不要copy什么文件过来,最起码现在不要,这很蠢,我开始就是这样,走了弯路。svn的管理其实是数据库式管理,看不到什么项目什么文件什么文件夹的,你今后在svn里面建的文件夹其实就像在数据库里建文件夹,你在资源管理器下看不见的,明白?嗯,这个概念要是不明白,最好别继续操作了。
svn更像一个数据库管理软件,每个源码仓库是一个数据库。
和web服务器的关系:这个我也不太清楚,貌似是利用http传输协议的,并且可以在web页上管理,svn也有自己的协议,别的真的不太清楚,想过深入了解的请读官方文档。
另外:
你现在要把你的防火墙关掉,无论是windows的还是杀软的,我们是内网,没有安全问题,如果你有安全需求,你可以求助于专业人士。
你不需要将svn_repository设为共享文件夹,真的。
现在我们开始吧,剩下的工作主要是配置文件的改写,就是纯文本操作,在这里,强烈推荐EditPlus,很好用。另外,每次更改配置文件后,你需要重启Apache,很简单,很快,不需要重启电脑。后边会讲到方法。
别嫌俺罗嗦,这就快开始了,俺是折腾了两天啊。前面的你都做好了吧,之前告诉你要记住CollabNet的安装目录的吧,你现在找到它,然后再进一个目录,你会发现httpd这个目录,这下面就是Apache的目录,你现在进去。找到ApacheMonitor,这是Apache控制台,图形化的,看见没?打开它先,看见最下面会有Apache/2.2.15 (Win32) SVN/1.6.12DAV/2的字样,还有,看见restart按钮没,你以后会经常用到,这是用来重启Apache的。
配置文件中的# 代表注释的意思。
现在你要进入httpd目录中的conf目录,用文本编辑器打开httpd.conf这个文件,找到第84行,把
84 #LoadModule dav_module modules/mod_dav.so
85 #LoadModule dav_fs_module modules/mod_dav_fs.so
这两行前面的#去掉,当然,行数供参考,以内容为准,其实第85行我不知道是否需要去掉#,84肯定要的。
然后找到115行
115 LoadModule dav_module modules/mod_dav.so
116 LoadModule dav_svn_module modules/mod_dav_svn.so
你懂的,去掉#,貌似和上面的重复了,不过我实在没法掌控这玩意儿,重复了应该也不会有副作用吧。
在116行下面加入第117行,注意,是加入,这很重要
LoadModule authz_svn_module modules/mod_authz_svn.so
保存 然后再次打开
把文件拉到最后,会看见<Location /svn>标记,我们要修改这里面的代码,不过现在先不急。关掉先。
我们要先建立源码仓库(其实创建源码仓库也可以不用命令提示行的,利用小乌龟可以方便的进行图形化操作,下面讲到小乌龟的时候我会提到,但是建议开始接触的时候用命令提示行,加深理解。)
我的CollabNet的安装目录在d盘program files下,我的svn_repository目录是D:\svn_repository,你自己的你看着办,这你要了解,下面我要建立cs和java两个源码仓库。
运行-cmd 打开命令提示符
然后
输入D: 回车
输入cd D:\program files\CollabNet\Subversion Server 回车
输入svnadmin create d:\svn_repository\cs 回车
这是建立cs软件仓库,顺便说下,如果你想删除这个软件仓库,你就直接把cs文件夹删掉好了
然后输入svnadmin create d:\svn_repository\cs 回车
这是建立java软件仓库
然后随便挑一个软件仓库 进去文件夹 赋值conf文件夹到d:\svn_repository下,然后各个软件仓库下的conf我们是不使用的,我们使用这个总的,我不会分别使用多个conf,conf就是各种账号权限什么的配置文件,当然,如果你只有一个软件仓库,那你可以直接使用仓库里的conf,这只是个人习惯,你要理解才能使用灵活,无论你使用哪里的conf,下面,我们都是要修改的,你要有耐心。
我不会画ASCII图画,好羡慕别人啊- -。
现在你要先设计好,svn的各个软件仓库下有哪些目录,使用svn的有哪些角色,各需要哪些权限,各个配置文件都有用#注释起来的示例,你可以参照下它的语法。
看看我的设计,cs和java每个软件仓库下各有projects,demo,temp三个文件夹,projects文件夹下有若干projectA,projectB这样的项目目录,主要放正式项目。另外还有demo目录,这里存放一些demo项目。还有一个temp文件夹,存放任意的东西。
角色:经理,cs程序员,java程序员,可怜的实习生。
经理可以读写所有目录,cs程序员只能读写所有cs软件仓库下的文件,java程序员只能读写所有java软件仓库下的文件。
cs程序员可以只读java软件仓库下的demo文件夹,可以读写java软件仓库下的temp,没有别的权力。
java程序员可以只读cs软件仓库下的demo文件夹,可以读写cs软件仓库下的temp,没有别的权力。
可怜的实习生只能读各个软件仓库下的demo文件夹,可以读写各个软件仓库下的temp文件夹。
现在先别急,设计好了,然后我们先暂停,先回到httpd目录中的conf目录,用文本编辑器打开httpd.conf这个文件,拉倒最后,定位到<Location /svn>标记,别说你找不到。
DAV svn这行你不用管。
如果看见SVNPath这行,你要把它注释掉或删掉,它和SVNParentPath不共存,我们要有一行
SVNParentPath d:\svn_repository
这是我的,你参照自己的来。
AuthType Basic不用管
AuthName "my SVN" 引号里是svn服务器的名字,你自己起一个吧。
然后是两行很重要的
AuthUserFile d:\svn_repository\conf\passwd
AuthzSVNAccessFile d:\svn_repository\conf\authz
还是那句,这是我的,你看着自己的来,你看下目录,想一想,应该能明白的
最后一行是Require valid-user 也不用管
这就是标记里面的内容,好了,保存,关闭吧,我们在回去,进入d:\svn_repository\conf
用文本编辑器打开svnserve.conf
找到[general]
把下面
anon-access = none
auth-access = none
password-db = passwd
authz-db = authz
这四行前面的注释#去掉,第一行和第二行分别是匿名用户和验证用户的权限,不过我没弄懂,我改成了none
有人说realm=My First Repository这行的注释也去掉,我没弄明白啥意思,我给去掉了。
然后用文本编辑器打开passwd文件
找到[user]
然后在下面添加账户=密码
不用怀疑,就是明文的。
我添加的是,
admin=admin
manager=12345
cscoder1=12345
javacoder1=12345
student1=12345
看看我前面设计的角色,应该知道这几个账户的含义。admin账户是必须的,超管账户嘛。
=可以换成:
保存,关闭,再打开authz文件。
找到[groups]
添加
g_admin=admin,manager
g_cscoder=cscoder1
g_javacoder=javacoder1
g_student=student1
这是这是设置用户组,保存,下面我们来规定各个用户组的权力,还是在这个文件里,就在刚才的下面添加。
[cs:/]
@g_admin=rw
[cs:/projects]
@g_admin=rw
@g_cscoder=rw
[cs:/demo]
@g_admin=rw
@g_cscoder=rw
@g_javacoder=r
@g_student=r
[cs:/temp]
*=rw
[java:/]
@g_admin=rw
[java:/projects]
@g_admin=rw
@g_javacoder=rw
[java:/demo]
@g_admin=rw
@g_javacoder=rw
@g_cscoder=r
@g_student=r
[java:/temp]
*=rw
保存,关闭,ok,你做好了,恭喜你。
*=rw 代表任意角色都可以读写。
*= 代表任意角色无权限。
现在重启Apache,别说你忘了怎么做。
先打开浏览器,比如ie,输入127.0.0.1,应该会显示,It works!
恭喜,说明Apache正常,再打开127.0.0.1/svn
会提示你输入账号密码,其实你输了也没用,应该会显示Forbidden,这个其实是在远程打开了d:\svn_repository,而我们没有提供访问d:\svn_repository的权力,当然被拒绝,这点你要明确,当然,我不懂web,只了解这么一点。
你输入127.0.0.1/svn/cs 回车
输入127.0.0.1/svn/java 回车
127.0.0.1可以换成你在内网中的ip,当然,localhost也可以的,再说一次,把防火墙关了。
这样才是真正的访问svn仓库,分别是访问cs仓库和java仓库,貌似可以输入127.0.0.1/svn就进入默认的svn仓库,不过我不会弄。
怎么样,输入了账号密码后正常情况下是可以看见文件结构的了,如果没有,呃,对了,我还没说怎么在svn仓库中创建目录呢。 - -
当然,如果提示错误的话,你要去D:\program files\CollabNet\Subversion Server \httpd\logs\error.log去看看。
好了,我们现在要创建目录,虽然我们可以使用命令行建立,可是我们有更好的选择,我们要使用一个可以管理svn的非常方便的一个图形化工具,TortoiseSVN,俗称小乌龟,搜一下,找到它的官网,别的不多说,选择Download,貌似它和VisualSVN是一伙的,咱不管,找到current version,我下载的是32 Bit版,下载后安装,没什么要说的,安装完会要你重启,别抓狂,照着办吧。
好了,你重启好了没有,现在你爽了,随便找一个文件夹,空白的地方,或者在桌面空白的地方,右键单击,看看你都发现了啥,哈哈,我就不多说了,你选择Repo-browser,填入
127.0.0.1/svn/cs或者127.0.0.1/svn/java
是不是就看见了?右键单击,Create folder…填上名字,然后分别建立projects,demo,temp三个文件夹,两个软件仓库都要建。各个菜单功能都一目了然,我就不累述了,至此服务器的配置完成了。
常用的源码仓库结构设计有两种模式,其实就是两种管理概念,你要选择自己合适的,关于这两种常用目录设计方式,在这里我就不累述了,你可以查看这篇文章。 另外还有一篇文章相当棒!
另外关于Apache和权限配置,可以参照这篇文章。
在这里不得不说一下,iusesvn真的是一个很不错的关于svn的中文社区。
还有就是关于trunk, branches,tags这三个词儿,这三个目录名,这三个标记,你怎么叫都可以,不用纠结,他们其实就是一种名称,是用来给人看的,更多的是用来表达一种管理理念,更多信息请搜索,我看的网页被我关掉了,所以没办法提供传送门了。
终于把服务器的事儿写完了,--#,好累啊,后面的我就写简短点了啊,后边的也不复杂了,唉。我先歇会儿。
在这里补充一下我是怎么用小乌龟来方便地创建源码仓库的,比如说我要再建立一个名字叫做cpp的源码仓库,先在d:\svn_repository下右键单击新建文件夹,命名为cpp,对,就是用windows资源管理器,不用怀疑,然后进入d:\svn_repository\cpp文件夹,右键单击空白处,选择TortoiseSVN-Creaate repository here,怎么样,简单吧。
继续。
先说一下关于Eclipse和VS下的SVN插件的概念
Eclipse的插件是subclipse,VS的插件叫AnkhSvn,名字都挺怪,不过很好用,VS的连2010都支持。
subclipse与AnkhSvn是和TortoiseSVN是同样地位同等级的东西,都是和SVN服务器进行交互的东西,都可以取项目出来,提交项目上去,但是各有好处。前两者依赖于IDE,可以自动识别哪些文件需要提交,哪些不需要,而且菜单集成到IDE中,非常方便,按照惯例,貌似VS的更傻瓜一些,小乌龟是与IDE无关的,不过建议小乌龟是一定要装的,不冲突。
打开第一个过期的svn主页,注意左下角,看见没,Subversion and IDE下面,有Eclipse,Visual Studio。
Eclipse的有很多版本,注意看 ,一般3.3,3.4的都是用1.6x的subcliipse,关于Eclipse插件的一般搜索安装我就不多说了,我是下载zip包安装的,大家安装的时候千万不要解压,要导入安装,而且安装所有项目,安装完后就可以使用了。打开windows,Open Perspective-other,然后会看见SVN资源库研究,就是这样,现在在项目上可以检出,一般不使用导出导入,这样不好,不好。
VS下的AnkhSVN兼容性很好,下载最新版本安装下一步到底即可,使用方式大同小异,不过好像vs的插件不如Eclipse和小乌龟强大,小乌龟是必备的了。右键单击项目就能看见svn菜单了,或者从svn打开项目,相当简单。常用功能就是提交修改,检出,lock。
v0.2
补充1:
在父文件夹下查看版本库(源码仓库)。
首先说这是什么意思,意思就是让你把127.0.0.1/svn打开的时候,可以在浏览器中看见所有的源码仓库,并且打开。
首先,打开httpd目录中的conf目录,用文本编辑器打开httpd.conf,忘了在哪里的可以翻看前面的内容,定位到<Location /svn>标记,先在你要做些修改。
1 把<Location /svn>改为<Location /svn/>
2 在SVNParentPath那一行下面增加一行 SVNListParentPath on
3 你要在authz文件中增加一个访问权限,比如说你想让admin用户组可以访问这个页面,那么你就在authz文件中增加
[/]
@g_admin=r
[/]就是代表d:\svn_repository这个目录
打开网页的时候你要填入127.0.0.1/svn/这个地址,
而不是127.0.0.1/svn,看清楚了没有?
这样,我们就可以在浏览器中方便地查看源码仓库了。
我是从这里学到的。
补充2:
设置权限的时候,你也可以这样,
[/]
admin=r
单独设置一个用户的权限,而不是一个用户组。
authz文件中[aliases]下可以用来设置别名,比如说设置
[aliases]
ad=admin
那么你在后面配置的时候,&ad就相当于admin,比如
[/]
&ad=r
示例我没看懂,不知道[aliases]是否支持正则表达式,也不知道它是否支持用户组别名。
补充3
如果你想要源码仓库中使用中文,请用EditPlus将配置文件转换为无BOM的UTF-8格式存储,利用记事本另存为转换的文件,是带有BOM的。更多信息请查看这里。
关于字符集的问题,请看这篇神文。另外还有Jake Lin的文章。
补充4
passwd文件中的账户密码,其实不光可以弄成明文,也可以使用md5加密的,这要使用httpd/bin目录下的Apache工具htpasswd来生成文件和添加账户。
使用方法:
打开命令提示符,就是cmd,定位到httpd/bin目录,然后
输入
htpasswd -cm d:\passwd user1 //用htpasswd命令创建第一个用户(user1),同时生成密码认证文件,c参数为create,m参数为MD5加密方式,会提示你输入密码的。
New password: ******
Re-type new password: ******
Adding password for user user1 //加入用户成功
然后你就会在d:\下找到passwd这个文件,啥也别说了,把它挪到d:\svn_repository\conf目录下吧,替换原来的passwd文件,你可以打开看看,确实是加密的。
怎那样添加账户呢?
假设你现在还没有挪动刚创建好的passwd文件。
htpasswd -m d:\passwd user2 //用htpasswd命令创建第二个用户(user2),注意如果在这时加入c参数会覆盖掉之前创建的用户及文件。
New password: ******
Re-type new password: ******
Adding password for user user2 //加入用户成功
看见没,c参数是在第一次创建文件的时候才会使用的,千万注意。我比较懒,所以用 d:\passwd 这个目录来做例子,你自己可以一步到位。
附上
apache htpasswd命令选项参数说明
-c 创建一个加密文件
-n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上
-m 默认apache htpassswd命令采用MD5算法对密码进行加密
-d apache htpassswd命令采用CRYPT算法对密码进行加密
-p apache htpassswd命令不对密码进行进行加密,即明文密码
-s apache htpassswd命令采用SHA算法对密码进行加密
-b 在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码
-D 删除指定的用户
在Windows, NetWare and TPF 系统中 ‘-m’选项是默认的,在使用apache htpasswd命令时可以忽略。在其他系统中,’-p’选项可能不能工作。
不知道m和p一起使用是什么后果啊,知道的同学告诉一下吧。 - -
就先写到这里了,后面可能还会修订下,但也不一定,有时间的话想试试看弄明白viewVC和linux下的配置,希望能给大家带来帮助,晚安。:)
不知道CollabNet Subversion Edge是啥时候出现的,很犀利,看看简介,A certified software stack containing the latest versions of Subversion®, Apache, and ViewVC,
是啊,人家包含了ViewVC,而且包含了python运行环境,而且还配置好了Apache,ViewVC貌似就是用来在web上查看代码仓库等信息的,还有一个web页面的svn管理工具,内牛满面啊,不用再苦逼了。当然了,如果你需要复杂的账户和权限配置,还是要学一学怎么写配置的,也算俺文章木有白写- -#。
详情及下载请见:http://www.collab.net/downloads/subversion/
看样子CollabNet Subversion这个产品终于算成型了啊,真的是很棒很不错的东西,还在壮大,希望功能今后能够更丰富人性。
补充6 //v0.3
另外匆匆说一下经典的branch,trunk,tag目录设置,我们公司目前是每个项目下分别有这三个目录,trunk存放项目的主线,最主要的地方,branch存放项目的分支,比如oem版本软件,新功能试验版本等,tag是用来发布的,这里的代码是不更改的,和你的软件的release版本对应。匆匆忙忙,查了一下这里的说法,我比较赞同文章里面的前一种说法。
虽然没有强制规定,但是这也算一种约定吧,最起码别人用的时候你能明白。如果你木有什么更好的方式,不妨采用这种方法。当然,复杂的情况怎么办俺也不知道,等俺有经验了再说咯。
ps:我们老大说了,一般人都这样用,其他的要么是菜鸟,要么是高手。 - -#