Svn多项目管理
Subversion的目录结构是很自由的,所有的规划都必须是你自己规定,考虑一个 subversion仓库的目录树,你可以把任何一个目录认定为一个项目,你可以只checkout这个目录下的所有文件进行编码,跟CVS不同,CVS 显式指定一个个module。所以你可以在一个仓库内保存 多个项目,也可以一个仓库保存一个项目而使用多个仓库。我个人比较喜欢第二种,因为 Subversion的每次commit都会导致整个仓库 版本号增加一个,会使得 多个项目的 版本号出现断层。而且如果 多个项目参与人不同,就必须使用apache2进行细粒度的权限控制,不是太方便。一个仓库一个项目,显得更优雅一些。
以下是我研究出的仓库规划。
在server端,新建一个目录用来存放所有的仓库。比如c:\svnrepos。然后在这个目录下建立每个项目独立
svnadmin create "c:\svnrepos\rolex"
svnadmin create "c:\svnrepos\omega"
使用 svnserve -d -r "c:\svnrepos" 启动。这样你的项目的url是:
svn://IP/rolex
svn://IP/omega
在 客户端新建一个目录,作为import的内容,比如c:\svnimport\rolex,然后在里面建立branches,tags,trunk子目 录,把你需要源代码管理的项目放入trunk目录,注意删除垃圾文件。在c:\svnimport\rolex上点击Import...,选择url为 svn://IP/rolex,导入。你可以使用仓库浏览器查看导入的效果。
需要工作时,新建一个目录比如c:\svnclient\rolex\trunk,然后在trunk上checkout出svn://IP/rolex/trunk上的内容。
SVN Checkout 不包括源文件夹根目录,比如我要checkout trunk/ 下面的所有文件,但是不包括trunk 文件夹我们可以在svn文件夹后面打个空格,在加个“.”就行了
eg: “svn co http://192.168.1.10/svn/project/trunk/“ 改为 ”svn co http://192.168.1.10/svn/project/trunk/ .“
利用SVN的POST-COMMIT钩子自动部署代码
创建一个post-commit的文件 (上传到SVN项目的HOOKS目录),内容为
#!/bin/sh
export LANG=zh_CN.UTF-8
REPOS="$1"
REV="$2"
/usr/bin/svn update --username yujianlong –password yujianlong /www/web/dakang_test_com/public_html/
设置该文件的权限,需要有apache的权限才可以,设为777就行了也不用管用户组了。
然后将项目checkout到apache web目录下
Ok了,下次commit之后就会触发post-commit文件了 执行update操作
三、权限配置
进入test目录之后,你会看到里边有个“conf”文件夹,进入conf文件夹,ls一下,你会看到有三个文件authz、passwd、svnserve.conf三个配置文件,其中authz用来配置用户访问权限的,passwd用来配置用户及密码,svnserve.conf是对整个svnserve的进程进行配置的。
使用nano或者vi工具打开svnserve.conf,找到“# password-db = passwd”,这一句是指定当前库所对应的用户配置文件的,我们需要把最前边的“#”和空格删掉;
找到“# anon-access = none”
“# auth-access = write”这两句,第一句是用来控制匿名访问的,我们直接给它设置成none就好了,第二句用来控制经过验证允许访问库的用户的权限,这里我们设置成write就可以,当然,也要把前边的“#”和空格都删掉;
找到“# authz-db = authz”,这一句是用来指定当前库对应的用户权限配置文件的,我们把最前边的“#”和空格都删掉,这样库在运行的时候要根据authz这个配置文件去匹配用户权限。
到这里,我们的所有配置文件都可以起到他们应有的作用了,接下来就是对细节的具体配置:
对于passwd:
很简单,在最后直接添加用户就好,格式为:“用户名 = 密码”,例如:“test_user = 12345”
对于authz:
主要是分为两类配置:[groups]类配置、以[repo:/]开头的配置。
1.[groups]的配置很容易理解,就是群组。格式也比较简单,即“group_name = user1,user2,user3”,如果有多个用户,可以直接通过“,”的方式拼接就可以了,例如:
[groups]
# 经理
g_manager = michael
# 北京办人员
g_beijing = scofield
# 上海办人员
g_shanghai = lincon
# 总部一般员工
g_headquarters = rory, linda
2.以[repo:/]开头的配置,上边的[gourps]配置是用来划分用户分组的,那么以[repo:/]开头的配置就是用来具体的划分用户读写权限的了,其中repo是你的库的名字,即上边我们通过“svnadmin create /home/user/svn/test”命令所创建的库“test”,下边我们直接用例子来说明它的使用方法:
对项目根目录做限制,该目录只允许经理才能修改,其他人都只能拥有读的权限:
[test:/]
@g_manager = rw
* = r
“[test:/]” 表示这个目录结构的相对根节点,或者说是 test 项目的根目录。这里的 “@” 表示接下来的是一个组名,不是用户名。因为目前 g_manager 组里面只有一个 michael,你当然也可以将 “@g_manager = rw” 这一行替换成 “michael = rw” ,表达的意义完全一样。
“*” 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部门经理外的其他所有人”
“* = r” 则表示“那些人只能读,不能写”。
对于根目录下边的子目录,其权限配置方式是相同的,是需要把地址指明就可以了,即[test:/folder1/folder2],这里就不赘述了。
注意:配置中我们可能会遇到“* =”这样的情况,他的目的是用来隔断权限的继承性。如果在某一级目录的权限配置里加上这一句,则表明除了该配置中的用户之外的其他用户完全没有这一级目录的任何权利,既不可读,更不可写。
当所有的三个文件全都配置完成之后,接下来就是要让它们都生效了,首先我们需要确保svnserve服务已经停掉了,可以通过“ps aux|grep svn”的方式来查看svn时候还在运行,如果还在运行的话直接通过“kill -9 [svn进程编号]”的方式把它停掉就可以了,然后在通过命令“svnserve -d -r /home/user/svn/”来重新启动svn服务,以上配置的三个文件就都起作用了!