批量修改 SVN 库中的用户名

Redmine 提供了整合 SVN 的功能,整合后可以在 Redmine 中直接查看 SVN 的修订记录。当 SVN 修订记录中的修改者名称与 Redmine 系统中的用户名一致时,Redmine 还会自动将用户名解析为真实姓名。

这个功能非常好用,不过因为有些用户的 Redmine 用户名和 SVN 用户名不一致,导致帐号无法关联。所以才有了我批量修改 SVN 库中用户名的需求。

修改某个 SVN 修订记录的用户名,可以使用以下 SVN 命令:

svn propset --revprop -r $rev svn:author $new_author $svn_url

不过 SVN 库默认是不允许修改用户名的,所以需要在版本库目录下的 hooks/ 目录中新建一个钩子文件:pre-revprop-change,这个文件可以直接从pre-revprop-change.tmpl复制,内容修改如下:

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:author" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

保存后将权限修改为 755。

当然,修订记录可能很多,我们不可能一条条去执行命令修改,所以需要写个脚本去批量修改。不过我发现 TortoiseSVN 就有这个功能,查看 log 日志,然后搜索要修改的的用户名相关的修订记录,全选,右键,Edit Author,填入新用户名,确认后即可完成批量修改了 😛

Redmine 似乎会对 SVN 修订记录进行缓存,所以改完用户名后,回到 Redmine 上,把原有的 SVN 删除掉,重新新建就可以了。

— EOF —

SVN 的锁定与解锁

一直习惯于单枪匹马作战,因此使用 SVN 做版本控制时,就没有协同开发的概念,自然就用不到 SVN 的锁机制了。

现在在公司上班就不一样了,几个人做同一个项目,代码就有可能被被人修改。

这个项目初期就告诉他们,为了操作的简易性,项目成员修改一个文件时,不需要锁定文件。但是前提条件是,每个人负责一个独立的模块。

一直都很正常,直到昨天晚上,一个同事修改了我的模块的内容,并提交了……

我 UPDATE 代码后,发现我的代码被 SVN 太过“聪明”地覆盖了,导致昨天写的许多代码段被覆盖,大杯具也 T_T

自此,我就要求项目成员把自己负责的模块下的所有文件加锁,其他任何人需要修改你的模块代码前,得先通知你,再强制锁定相应的模块。

当然,如果文件太多,或者一个文件经常需要由好几个人修改,你可能不希望将所有文件回锁,那么可以要求项目成员在修改这些模块之前加锁,防止其它成员同时修改并提交修改。

提交的时候,如果想要继续维持锁状态,要勾选上“保持锁定/keep lock(s)”的选项,否则提交后会自动释放锁。

如果你的工作目录丢失,重新 check out 之后你可能会发现,锁定者是自己但是无法获取锁,这时你需要使用“强制获取锁/steal lock(s)”来获取锁。

如果一个文件被别人锁定,而你一定要修改这个文件,那么先通知锁定人,再“强制获取锁/steal lock(s)”。

— EOF —

给 Zend 6 装上 SVN 插件 Subclipse

既然用了 IDE,就希望直接在 IDE 中集成版本控制管理功能,因此今天我在 Zend 6 下安装了 SVN 插件——Subclipse。

安装步骤:

1. 打开 Zend,”帮助”-“软件更新”-“查找并安装”-“搜索要安装的新功能部件”-“下一步”

2. 新建远程站点:
名称: Subclipse 1.6.x (Eclipse 3.2+)
URL: http://subclipse.tigris.org/update_1.6.x
点击”完成”
3. 如果出现以下错误提示:

Subclipse Integration for Mylyn 3.x (Optional)(3.0.0)需要 插件“org.eclipse.mylyn.tasks.core(3.0.0)”或者兼容项。

把以下项目前的勾去掉就可以了:

Subclipse Integration for Mylyn 3.x (Optional)(3.0.0)

4. 继续完成安装,如果提示安装未签名的部件,接受安装即可。
5. 安装完成后重启 Zend,”窗口”-“首选项”-“小组”-“SVN”,做出必要设置
6. “窗口”-“打开透视图”-“SVN资源库研究”,右键”新建资源库位置”,填入相关信息后可以在该透视图中浏览版本库信息
7. 选定资源后,右键”检出为”,将代码从 SVN 服务器检出,”作为工作空间中的项目检出”
8. 检出成功后,”窗口”-“打开透视图”-“PHP”,回到默认的 PHP 透视图,这时文件夹和文件的图标就带有版本标识了
9. 在文件/文件夹上点右键,在”小组”菜单组中就可以进行 SVN 操作了 🙂

— EOF —

gentoo 下 svn 服务器搭建

无废话安装:

emerge apr

emerge apr-util

emerge apache

USE=”apache2″ emerge subversion

创建仓库:

svnadmin create /svn/test

apache 配置:

Listen 88

NameVirtualHost *:88

DocumentRoot “/svn/test”

<Directory “/svn”>

Options None

Order allow,deny

Allow from all

</Directory>
<VirtualHost *:88>

ServerName test.svn

<Location /test>

DAV svn

SVNPath /svn/test

AuthType Basic

AuthName “SubVersion Login”

AuthUserFile /etc/svn/passwd

Require valid-user

</Location>

</VirtualHost>

apache 启动时提示错误:

# /etc/init.d/apache2 start

* Caching service dependencies … [ ok ]

* apache2 has detected an error in your setup:

apache2: Syntax error on line 135 of /etc/apache2/httpd.conf: Cannot load /usr/lib64/apache2/modules/mod_dav_svn.so into server: /usr/lib64/apache2/modules/mod_dav_svn.so: undefined symbol: dav_register_provider

修正方法:

# vim/etc/conf.d/apache2

在 APACHE2_OPTS 后面加入 -D DAV -D DAV_FS -D SVN -D AUTHZ_SVN

nginx前端配置:

server {

listen       80;

server_name svn.local;

charset      utf-8;

access_log      /work/www/log/svn.access_log main;

error_log       /work/www/log/svn.error_log error;

location / {

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Proto https;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass              http://svn.local:88;

}

}

创建身份验证文件:

htpasswd -c /etc/svn/passwd hilyjiang

登录 http://svn.local/test 输入密码后即可访问SVN。

— EOF —