2009/04 18
由于服务器修改,或者备份的原因,你可能需要对Subversio的源进行迁移。
迁移方法有几中。 最直接的是将库文件直接copy到新的位置就好。
如果原来的svn版本和新的svn版本不一样的话, 这样迁移并不是很安全。

更安全的方式也很简单,如下:

1. 导出:
svnadmin dump ~/svn/dede > svndump

2. 将svndump文件copy到新的位置

3. 导入dump文件:
svnadmin load /home/svn/dede < svndump

完成
Defined tags for this entry:

Posted by rollenc

Last modified on 2009-04-18 20:34
2007/03 21
PHP 手册
Smarty - the compiling PHP template engine
MySQL 5.1参考手册
JavaScript Reference
prototype.js
Apache HTTP Server Version 2.2 Documentation
Bash Reference Manual
Subversion
Defined tags for this entry: , , , ,

Posted by rollenc

Last modified on 2007-03-21 12:31
2007/01 26

1。混乱状态。



没有管理。
交流方式
通过相互的文件共享来达到代码交流的目的。
问题:无法立刻获取协作者间的代码。
不能同时对相同文件进行编辑。
代码覆盖的冲突经常发生,且不可还原


2。简单管理。



建立svn,使用文件服务器来简单的管理单一项目。
版本截图:100
rep100

解决了状态1下的各种代码交流问题。现在的交流模式方式如下图所示:

程序员中存在的错误观点:但是在刚开始使用时,很多人没有意识到meger的作用,不敢update,生怕update之后自己所修改的代码就没有了。

问题:没办法维护两个不同的版本。
由于项目的发展,第一个beta版本放出,而我们开始进行下一个版本的开发,而我个人也希望对一些代码进行整理。我初始使用了建立大量的其他文件,比如index2.php作为新版,而保持原有的index.php不变。
1。新的不能改动原有文件,因为新版还不完整,将导致错误;
2。原有文件中的bug修正可能在新的版本中同样需要,而我常常忘记把改动复制到新版。
陷入文件和版本的混乱,增加了对文件控制的复杂度。
截图rep1530
rep1530

3。subversion目录重新建构
开始使用分支:
个人分支:
我开始在建立rolelnc的个人分支,在自己的目录下进行新的开发,而不影响整个以前的版本。
而对主干只进行bug的修复
我可以随时使用meger命名来将主干的bug修复合并到我自己开发的分支上。
待我个人开发的新的功能完成时,我再使用meger命名把我的分支合并到主干上。
开发完毕之后,我可以再使用meger把我的修改合并到主干上。
流程:

截图1700


版本分支:
与个人分支相似,不过是多人对这一个分支进行开发,或者仅仅是一个版本的存档。不过后期我看到的资料显示,在tags目录下建立版本分支,如 http://192.168.0.2/svn/tags/version0.9/

4。目前的状态 截图head resp 3788


注:为了减少图片大小而展示更多的内容,以上部分图片经过了Fireworks处理。
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-29 21:22
2007/01 16

Subversion 1.2(最终版)




来源:Subversion中文站
这个站有很多关于subversion的文章。建议大家去看看。
我很感谢这个站,subversion的手册翻译的很好。我的subversion第一堂课使用的就是这个。
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-28 15:48
2007/01 15
很多人开始使用subversion之后,就想着,要建立一个测试用的服务器,不需要把文件update到本地再进行测试。这个在我以前的一篇文章中写过,但当时理解也不深,也写得很含糊。现在连自己都看不懂了。

原理: 基于subversion的钩子,即hook。在subversion执行一个操作时,那会相应的首先去调用相关的钩子程序(如果存在的话)。那么实现一个同步的测试服务器,我们只需要在一个用户执行完毕一个commit操作之后,让钩子程序去自动更新测试服务器的文件即可。通过这个思路,我们需要作的就是建立一个post-commit的钩子。

钩子文件在你的svn源目录下,即存放subversion版本数据的文件夹。以前面我写的两篇文章中的情况为例,
文一(win)的钩子文件应该在 E:\svn2\hooks
文二(Linux)的钩子文件应该在 /var/svn/hooks
文件夹内已经存在有一些.tmpl文件,这些只是一些模板(TeMPLate)或者说是示例文件。它们不会被执行。


先以linux为例,来讲讲如何构建一个同步的测试服务器127.0.0.2(在Ubuntu 6.10, apache2.0.55,subversion1.3.1下调试通过。2007/1/18)
我们假设你已经建立好了一个apache+subversion的环境。
0.准备工作
为同步服务器建立访问subversion版本的权限,清参考以前的文章
sudo htpasswd2 /etc/apache2/dav_svn.passwd server

1. 使用checkout建立一个工作复本
cd /var/www
sudo mkdir /var/www/127.0.0.2 #建立测试服务器站点根目录
sudo chown www-data.www-data 127.0.0.2 #更改用户所有者
sudo su www-data #切换到www-data,需要使用sudo,因为超级权限可以使用任何用户,而不需要密码,执行后会发现命令提示符可能会有变化
svn checkout http://127.0.0.10/lab.luochunhui.com/trunk 127.0.0.2  #取出subversion上的文件,可能需要密码
                                                                                  # 请保证执行checkout语句的用户是www-data,否则在以后钩子调用update时会出现无法创建或修改文件的错误
exit #退出www-data用户

说明:我们必须把/var/www/127.0.0.2目录的所有者设置成apache的运行者(www-data), 他必须对文件夹具有完全的可读写操作权限。我使用
sudo chown www-data www
sudo su www-data

这样的方式来避免把/var/www/127.0.0.2目录设置成777的权限。
另外可以执行下面的代码实现相同的功能:
cd /var/www
sudo mkdir /var/www/127.0.0.2 #建立测试服务器站点根目录
sudo svn checkout http://127.0.0.10/lab.luochunhui.com/trunk 127.0.0.2 #取出subversion上的文件,可能需要密码
sudo chown -R www-data.www-data 127.0.0.2/ #把文件用户修改成apache的执行用户

之后使用

ls -Al 127.0.0.2


应该可以得到

drwxr-xr-x 7 www-data www-data 4096 2007-01-17 10:21 .svn
...一些其他的文件


2。设置apache,把你需要的域名指向这个文件夹。
sudo gedit /etc/apache2/sites-available/127.0.0.2

输入以下文字

        ServerAdmin rollenc@localhost.com
        ServerName localhost
        DocumentRoot /var/www/127.0.0.2
	
	Options FollowSymLinks
	AllowOverride None
	
	
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
		# Uncomment this directive is you want to see apache2's
		# default start page (in /apache2-default) when you go to /
		#RedirectMatch ^/$ /apache2-default/
	

	ErrorLog /var/log/apache2/127.0.0.2_error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog /var/log/apache2/127.0.0.2_access.log combined
	ServerSignature On


启用他
sudo ln -s /etc/apache2/sites-available/127.0.0.2 /etc/apache2/sites-enabled/127.0.0.2

重启apache。
sudo apache2 -k restart

在浏览器上使用http://127.0.0.2可以浏览到你subversion上最新版本

3。建立钩子
现在是关键的一步,我们需要使我门的测试服务器127.0.0.2进行同步更新:
在/var/svn/hooks/目录下建立post-commit文件
cd /var/svn/hooks/
sudo gedit post-commit

输入以下内容
#!/bin/sh
REPOS="$1"
REV="$2"
svn update /var/www/127.0.0.2 --username server --password serverpassword
#echo `whoami`,$REPOS,$REV >> /home/rollenc/svn_hook_var.txt
#svn update /var/www/127.0.0.2 --username server --password serverpassword 2>/home/rollenc/svn_hook_log.txt

说明:REPOS即第一个变量$1是subversion数据库的地址,REV即第二的变量$2是commit之后的版本号。
编辑完毕后设置文件权限为可执行:
sudo chmod 755 post-commit

搞定。
下面来试一下,同步有没有成功。
再建立一个工作副本,然后添加或者修改一些东西,最后上传。
以下的操作是在客户端中进行了,不需要在服务器断进行。
cd /var/www
svn checkout http://127.0.0.10/lab.luochunhui.com/trunk 127.0.0.6 #取出subversion上的文件作为你的工作副本,你的工作以后就在这个文件夹内展开。
                                        #所以,不需要sudo,但要保证有127.0.0.6文件夹存在,而且可写
echo '' > phpinfo.php #建立一个phpinfo文件
svn add phpinfo.php   #把phpinfo加入版本库
svn commit  #提交

在浏览器中你设定的同步服务器地址http://127.0.0.2/phpinfo.php,愿上帝保佑你的成果一切正常。可以看到phpinfo的信息。

如果不正常你可以稍微修改上面使用#注释掉的命名,使其输出的文件目录符合你的系统。
去掉#,重新运行,并通过查看上面设置的txt来获得一些信息。
第一句[#echo ...]是获取当前的执行用户(如果正常应该与apache的执行用户和测试服务器文件所有者相同),$REPOS,$REV是获得的两个参数
第二句[#svn...]是把update的获取update的结果,一般错误信息在这里可以得到。


在Windows下我使用同样的方法试图建立钩子,但没有成功。感谢水蓝色青蛙(QQ:565259)的帮助,windows下的钩子问题解决。
以下是方法和代码,在windows XP下测试成功。
1,2步很类似,不再重复了
经过1,2步的操作之后,DIR的值E:/htddocs/testserver.lab.luochunhui.com 为测试服务器的根目录。如果是win2003,你可能还需要参照ubuntu的方法设置一些权限。
第三步的中的钩子程序名称需要改为:post-commit.bat写成如下:
@echo off
SET REPOS=%1
SET USER=%2
SET SVN="D:/subversion/bin/svn.exe"
SET DIR="E:/htddocs/testserver.lab.luochunhui.com"
(call %SVN% update %DIR% --username server --password serverpassword --non-interactive)


-------------以下内容已删除-----------
SET REPOS=%1
SET REV=%2
SET svn="D:/subversion/bin/svn.exe"
SET DIR="E:/htdocs/testserver.lab.luochunhui.com"
%svn% update %DIR%

按理说,和linux的执行是一样的,但就是出错。
如commit一个test文件,则显示错误信息为:

Modified: E:\htdocs\testcopy\test.php
Sending content: E:\htdocs\testcopy\test.php
Error: Commit failed (details follow):
Error: MERGE request failed on '/lab.luochunhui.com/trunk'
Error: MERGE of '/lab.luochunhui.com/trunk': 200 OK (http://127.0.0.10)

而此时,test.php已经commit成功,在subversion数据库中已经存在有本次记录,但E:\htdocs\testcopy工作复本还是显示为没有commit。需要同步的E:/htdocs/testserver.lab.luochunhui.com也没有update。

我个人压根不懂windows下的编程,以上代码是边google边学来的。所以还是希望有达人帮忙,好让我完成这篇blog,我也好给大家一个完整的交待。

最终参考了一些文档,还是没能解决win下的问题,我把测试和输出结果放下面:
@echo off
echo "" >  E:/hookLog.txt
echo "1" >> E:/hookLog.txt
SET REPOS=%1
echo "2" >> E:/hookLog.txt
SET USER=%2
echo "3" >> E:/hookLog.txt
echo %REPOS%, %USER% >> E:/hookLog.txt
SET SVN="D:/subversion/bin/svn.exe"
echo "4" >> E:/hookLog.txt
SET DIR="E:/htdocs/testserver.lab.luochunhui.com"
echo "5" >> E:/hookLog.txt
REM call %SVN% update %DIR% >> E:/hookLog.txt
REM SET PATH=D:/subversion/bin/
REM svn update "E:/htdocs/testserver.lab.luochunhui.com" >> E:/hookLog.txt
(call %SVN% update "E:/htdocs/testserver.lab.luochunhui.com") >> E:/hookLog.txt
echo "6" >> E:/hookLog.txt

REM是注释,REM掉了我使用的很多种测试,切换REM可以运行其它的一些测试,但是全部无效。
以下是上面代码的输出:
"" 
"1" 
"2" 
"3" 
E:/svn2, 54 
"4" 
"5" 
"6" 

1-6全部正常输出,惟一的是 svn update这一句没有输出任何东西。
完全放弃!等待达人。。。。
------------以上内容已删除-----------------



有问题也欢迎在下面贴出,乐意帮忙:)
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-02-04 22:52
2007/01 15
1。安装subversion和apache2的组件(已经认为您已经安装了apache2),

 sudo apt-get install subversion subversion-tools  libapache2-svn



在/etc/apache2/mods-enabled中会多出来一下几个链接文件(实际文件在mods-available中,我们不需要去管,只需要关注enabled目录就成):

dav_fs.load dav_svn.conf dav_fs.conf dav.load dav_svn.load


2。建立svn数据库
sudo svnadmin create /var/svn 


ls /var/svn

你将得到这样的结果,则说明建立成功
conf dav db format hooks locks README.txt


3。配置apache
cd /etc/apache2/mods-enabled
sudo vi dav_svn.conf



按照提示去掉一些文件注释,最终的文件看起来如下
# dav_svn.conf - Example Subversion/Apache configuration
#
# For details and further options see the Apache user manual and
# the Subversion book.

#  ... 
# URL controls how the repository appears to the outside world.
# In this example clients access the repository as http://hostname/svn/


  # Uncomment this to enable the repository,
    DAV svn

  # Set this to the path to your repository
    SVNPath /var/svn

  # The following allows for basic http authentication.  Basic authentication
  # should not be considered secure for any particularly rigorous definition of
  # secure.

  # to create a passwd file
  # # rm -f /etc/apache2/dav_svn.passwd
  # # htpasswd2 -c /etc/apache2/dav_svn.passwd dwhedon
  # New password:
  # Re-type new password:
  # Adding password for user dwhedon
  # #

  # Uncomment the following 3 lines to enable Basic Authentication
    AuthType Basic
    AuthName "Subversion Repository"
    AuthUserFile /etc/apache2/dav_svn.passwd

  # Uncomment the following line to enable Authz Authentication
  # AuthzSVNAccessFile /etc/apache2/dav_svn.authz

  # The following three lines allow anonymous read, but make
  # committers authenticate themselves.

  
    Require valid-user
  




或者象这样来实现独立的域名情况:

        ServerName svn.luochunhui.com
        DocumentRoot /var/svn

      
                DAV svn
                SVNPath /var/svn
                AuthType Basic
                AuthName "Subversion Repository"
                AuthUserFile /etc/apache2/dav_svn.passwd
                
                        Require valid-user
                
        




4。建立密码文件
建立第一个用户需要加-c参数

sudo htpasswd2 -c /etc/apache2/dav_svn.passwd username


输入两次密码
建立其他用户:

sudo htpasswd2 /etc/apache2/dav_svn.passwd username2


注意没有加-c,加-c的话会清除掉以前存在的密码。
如果username2为已存在用户,那这句命令的意义就是修改密码

5.重启apache

sudo apache2 -k restart


如果一切正常的话,使用浏览器打开http://127.0.0.1/svn 应该看到如下信息
Revision 0: /
Powered by Subversion version 1.3.1 (r19032).


OK,安装完成
你可以对他进行一些import,commit等操作了

导入版本的文件框架
mkdir -p tmp/lab.luochunhui.com/trunk tmp/eemap/trunk #如果你有其他已经写好的需要一起导入的文件,cp过来让在相应的trunk目录下,然后下一步。
svn import tmp http://127.0.0.10/ #更具提示输入message信息和用户,密码。

我在实验时发现有权限问题,这是你可能需要修改/var/svn的权限为可读写
sudo chmod -R 777 /var/svn

然后再继续执行上面的import操作。
现在使用浏览器打开http://127.0.0.10,可以得到

Revision 1: /

* eemap/
* lab.luochunhui.com/


继续checkout和commit吧,祝你有一个愉快的subversion。
Defined tags for this entry: , ,

Posted by rollenc

Last modified on 2010-04-20 14:51
2007/01 15
上次参加php上海策进会的聚会,去的早了点,被h058拉着狂捧,结果就被忽悠着答应下次聚会的一个subversion讲演。
聚会的日期有定下来了,本月的27号。现在也得好好准备一下了。
虽然blog上已经稍稍的写了点subversion的东西,但是很基础的。高级的东西自己也是仅在使用而已,没有进行很深入的研究。如果被追根寻底的一问,绝对玩完。
哎,到时真的要插根葱在鼻子上才敢登台了。
Defined tags for this entry: , ,

Posted by rollenc

Last modified on 2007-01-18 12:49
2007/01 6
安装Subversion
1.安装ApacheSubversion
版本:
apache2.0.59: 我安装在D:/apache2
subversion 1.4.2: 我安装在D:/Subversion/
注意:subversion暂不能在apache2.2上运行
下载两个文件,先安装apache,在安装subversion,一路下一步就行,没什么好说的。惟一说明是在安装subversion时选择附加步骤时需要选中 install and configure apache(默认是选中的,没有注意到也没关系)。贴图如下:
图subversion_install.png
subversion install

安装完成后,apache配置文件http.conf中自动加入了两行:
LoadModule dav_svn_module "D:/Subversion/bin/mod_dav_svn.so"
LoadModule authz_svn_module "D:/Subversion/bin/mod_authz_svn.so"


2.安装TortoiseSVN
版本:
TortoiseSVN-1.4.1.7992-win32-svn-1.4.2.msi我安装在D:/TortoiseSVN
一路下一步就成,安装完成时提示重启,重启只是影响外观,对使用不造成任何影响,所以暂时不管,选No。你也可以选择重新启动explorer.exe进程来完成。

3.建立repository
建立文件夹,我选择在E:/svn2,(因为现在是重新安装演示,E:/svn有我原有数据,所以,建立一个空的svn2)
右键,在E:/svn2建立一个repository
图subversion_createrepository.png,

这时弹出一个subversion存储类型的选择框,只是使用的话,两种类型可以随便选,选择FSFS。选择后安装完成。

图subversion createrepositoryOK.png,

4.配置apache
在第一步subversion安装时自动插入的两行一下插入:
Location 的值为访问svn时的url后缀,如127.0.0.1/svn,也可以使用二级域名
SVNPath的值为第三步建立的repository路径
AuthUserFile 为访问密码文件路径
LimitExcept 为权限控制。这里设定的是除了GET(获取)等操作外,都需要对用户验证, 更多权限配置管理参考svn_book

	DAV svn
	SVNPath "E:/svn2"
	AuthType Basic
	AuthName "Subversion Repository"
	AuthUserFile "D:/Apache2/svn.password"
	
		Require valid-user
	


如果是域名绑定则使用:

        ServerName svn.luochunhui.com
	DocumentRoot E:/svn2

      
		DAV svn
		SVNPath "E:/svn2"
		AuthType Basic
		AuthName "Subversion Repository"
		AuthUserFile "D:/Apache2/svn.password"
		
			Require valid-user
		
	


5.建立密码文件

图subversion createusers.png
注意 -c
文件内容如下:
rollenc:$apr1$ek/.....$esgXZzlr/JLPsnxkfQjss1
test:$apr1$qr/.....$b95NrDKp9mHU84of3KX8c1


6.重启apache,察看127.0.0.1/svn
得到了:Revision 0: /

7.规划subversion结构
7.1:建立一个项目EEmap:
任意目录右键,TortoiseSVN->Repo-browser->输入地址http://127.0.0.1/svn
create Folder -> 输入name (EEmap)->输入 logmessage (EEmap Project)
这时就需要密码了。填入刚才的自己的用户名,密码,建立成功

7.2: 建立项目的内部结构:

按照这种方法。建立整个svn的结构,如下
svn
|-EEmap
| |-trunk
| |-branch
|-lab.luochunhui.com
| |-trunk
| |-branch

如图:subversion_constructOK.png
图subversion constructOK.png

7.建立工作复本
建立文件夹,checkout
如图subversion_checkout.png
图subversion checkout.png
建立成功之后,在EEmap目录下自动创建一个服务器上的备份,以及一个.svn的隐藏文件,EEmap文件夹上也会出现一个绿色的钩记

8.导入工作复本
由于lab.luochunhui.com已经在我的文件中了,所以,我不需要建立,而需要导入
在lab.luochunhui.com中导入
如图:subversion_import.png
图subversion import.png

但是import之后,这个还并不是你的工作复本,你需要check out才能建立你的工作复本,而直接在lab.luochunhui.com文件中check out则会出错,因为该目录中已经存在它需要取出的文件。
解决方法:
由于这个工作复本已经在subversion服务器上了,所以,你完全可以放心直接删除lab.luochunhui.com里面的所有文件,再checkout一次。


9.建立、修改文件,并提交
略去,参看svn_book

10. 建立版本号:
现在,如果我们建立了EEmap的原始模型,团队认为,可以发布0.1版本了,那么,简单的建立一个版本:
在repo中选择copy to
输入 http://127.0.0.1/EEmap/branch/versions/version0.1
图subversion copyto.png
ok,建立成功
在任何时候你都可以使用check来取出0.1版本,这个版本不收主干文件的干扰 http://127.0.0.1/EEmap/branch/versions/version0.1

完成之后,现在我的subversion内的文件如下:
subversion_basedone.png



基本的使用告一个段落

进阶使用
待续。。

[感谢samon对我上文中部分错误的指正]
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-16 09:35
2006/07 21
服务器端安装:
Ubuntu下:
在synaptic中选择apache2,libapache2-svn,subversion,subverion-tool,libsvn0以及其他依赖的软件包,自动安装。
windows下:
下载安装包:svn-1.2.3-setup.exe,双击安装。

服务器端配置:
1.建立版本库
svnadmin create /var/svn (Ubuntu)
svnadmin create E:/svn (Win32)
或者使用服务端也成,具体可以参考其他相应文章.这些方式在 http://www.subversion.org.cn/content/view/18/1/ 文中写的很详细。你会发现在/var/svn(E:/svn)中有不少的文件夹。这说明版本库建立成功。
2.建立服务器进程:
1)可以使用svnserve,但我个人不推荐,这种方式在 http://www.subversion.org.cn/content/view/18/1/ 文中也详细有介绍,不再重复了。
2)使用apache当服务器:
Ubuntu:
$cd /etc/apache2/mods-enabled
$ls //你会发现有 dav.load,dav_fs.conf, dav_svn.conf ,dav_fs.load , dav_svn.load 这些文件。
$sudo kate dav_svn.conf
按照上面的英文提示操作,把dav_conf改为(去掉了注释,在实际中你只需要做相应修改。其实具体方法全部在注释里写明了。WINDOWS用户就没这么运气):
<Location /svn>
DAV svn
SVNPath /var/svn #你在上面建立版本库时的路径
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
保存,建立密码:
$rm -f /etc/apache2/dav_svn.passwd
$htpasswd2 -c /etc/apache2/dav_svn.passwd firstUser
$htpasswd2 /etc/apache2/dav_svn.passwd secondUser #请注意,加以后的用户时不要加 -c ,-c会将以前的所有用户全部删除.
$sudo apache2 -k restart #重启apache2.
这样你现在就可以通过http://yourhost/svn/访问你的版本库了。访问不需要密码,但存入等操作需要用户名和密码,具体权限问题可以参考官方说法,
Windows:
操作基本相同,只是Apache配置文件组织不同而已,相应乍改变。
3.创建钩子,自动更新测试服务器上文件:
$cd /var/
$sudo mkdir www #如果本来有文件,请备份后删除此文件夹
$sudo chown www-data www #改变这个文件夹为APACHE进程用户
$sudo su www-data #以apache进程的使用者登陆,具体为什么样的值可以在APACHE的CONF中找到
$svn checkout http://yourserver/svn www #取出一次,不管现在版本里面有没有东西
$exit #退出www-data用户
$cd /var/svn/hooks/
$sudo chmod 777 post-commit
$sudo kate post-commit
更改文件为:
REPOS="$1"
REV="$2"
E=(`svn update /var/www`)
#/var/www为你的测试服务器WEB根目录。
保存。测试服务器完成。
Windows下需要把文件保存为post.commit.bat或.com等可以被WINDOWS直接运行的文件后缀。svn运行目录也许要更改,具体我没有测试,抱歉了。

现在可以使用http://yourserver/svn进行版本控制,使用http://yourserver/进行测试。

参考:
用 Subversion 构建版本控制环境 http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
Subversion中文站 http://www.subversion.org.cn/


Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-15 21:30