Aug 30 2008

安装SVN服务

这个SVN服务在Windows下还是很好装的,记录一下:

1. 先下载SVN服务程序安装(我下载的是1.4.6版本的)

2.安装后,要设置一个环境变量SVN_EDITOR,将它设为一个编辑器路径就可以了,我就设置到c:\winnt\notepad.exe,这个编辑器是在以后调用一些SVN命令时会用到的。

3. 现在就可以创建一个SVN仓库了,在dos命令行下运行 svnadmin create "e:\svn_repos" 这个目录不用事先存在,svn会自动创建出来的。

4. 在仓库目录下的conf子目录下,打开svnserve.conf,这就是这个仓库相关的配置文件,将其中下面几句去除注释:
[general]
anon-access = read
auth-access = write
password-db = passwd

5.  上面的设置使得匿名用户可以读和增加文件(read),而认证用户才可以修改 (write)文件,认证方法是使用password文件,这个文件也是在conf目录下,可以修改这个文件来设置所需要的用户名和密码。

6. 现在可以试试了,启动svn服务器:
svnserve --daemon --root "e:\svn_repos"

7. 上面的方式是用--daemon方式来运行svn的,会留下一个大大的dos窗口,如果你想用windows服务的方式来运行,用sc命令来将svnserve安装为windows服务(sc命令是很多windows版本自带的一条命令,如果没有的话,可以找一个xp系统从windows\system32目录下拷贝一个过来);

sc create svn binpath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service  --root \"e:\svn_repos\"" displayname= "Subversion Repository" depend= Tcpip

注意上面的每个参数,binpath=  的等号前面没有空格,后面则一定要有一个空格(可笑的dos命令行参数就是这个样子的)

8. OK,现在可以通过 svn://your.ip 访问你的svn服务器了,别忘了告诉svn的用户去安装一个图形客户端TortoiseSVN,收工!


Jun 7 2007

ChangeLog 的维护

开发软件过程中,ChangeLog是很重要的历史记录,这个甚至被GNU写进项目规范了,但是另外一点是,随着版本控制系统的使用,又不得不在这些版本控制系统里维护另一份ChangeLog,对于程序员来说,重复是极其不爽的一件事。但程序员是聪明的,在cvs时代有个有名的工具叫做cvs2cl(就是CVS-log-message-to-ChangeLog的意思),就可以自动抓出cvs的log到Changelog文件中,这样就只需要维护cvs的log就可以了。

到了svn时代,很多程序员很怀念这个小工具,于是有人完成了svn2cl,算是向cvs致敬。


Jun 4 2007

Subversion的merge

刚开始用svn的时候,不太敢相信它的自动merge,不过人总是比较懒惰的,时间长了,就逐步丧失了对svn merge的监视能力,不过说实话,svn 自动merge的结果相当的不错,少有出错的时候,而且它总是留给用户再修改的机会。

svn的merge实际上是diff and patch,但只要你给它正确的指示(主要是做diff的两个版本号要给对),它工作的很好,不知道其它版本控制系统是怎么做merge的?


Apr 4 2007

Effective SVN

Subversion中实际上没有branch的概念,它只懂得如何做copy,当我们将项目从主干branch到分支下的时候,Subversion只是做了一个浅拷贝(cheap
copies),把这个拷贝当作branch只是用户的理解。

Subversion的版本标识数是针对整个Repository的,每个文件的版本号实际上是这个文件在Repository的这个版本下的状态。

Subversion的merge其实不是真正的merge,而只是"diff-and-patch",这方面比clearcase差,因此要实现真正的merge操作,你必须牢记"diff-and-patch"原则,比如你想将branch1
merge到trunk上,需要对branch1的base和current做diff,再patch到当前trunk的working
copy。由于Subversion不会记录merge,所以只能在commit时的comment中记录,比如你可能两次merge同一个branch到主干,在第二次merge时,你只有参考第一次merge的comment才知道上次的merge是在哪个版本做的,这样可以从那个版本之后开始做,省去大量的工作。

Subversion的svn move也不是真正的rename,而是copy-and-delete,而且Subversion不会记住新文件的历史来源,这在大部分情况下不会造成问题,但在分支Merge时,某个分支上的move操作可能就会掩盖其它分支上对源文件的修改。

Subversion提供了一个有意思的feature--svn switch,可以高效的在分支间切换,它在本质上和svn
update同义,但svn update仅仅是在同一个路径的不同时间进行diff操作,但svn
switch则在不同路径(分支)的不同时间进行diff操作。由此引申了一个用法,在对主干文件修改后,你忽然意识到应该是在分支上做修改而不应该是主干,你可以使用svn
switch在commit,没有问题。

Tag和branch本质上完全相同,都是svn
copy,唯一的不同是我们"认为"不应该对tag进行commit,如果一旦用户做了commit,那么这个tag就变成了branch。

Subversion repository的备份不是直接的cp这么简单,因为简单的cp命令可能导致一个不一致的备份(假设有多人频繁commit),需要使用svnadmin
hotcopy....


Apr 2 2007

SVN 使用小结

Subversion的使用还是很简单的,下面列出10条/组基本命令,分支属于高级功能,不在此列出。
1)安装Subversion
apt-get install subversion

2)创建Repository, create后的参数一定是一个本地的path.
svnadmin create /usr/path/repos

3)import当前目录下所有文件到Repository中, 这里的参数则是一个URL了.
svn import file:///usr/path/repos/ -m "Initial import"
svn可以支持符号连接文件(symbol link),但在windows系统下不支持.

4)checkout一个repos到工作目录
svn co file:///usr/path/repos

5)从repos更新文件
snv update
显示更新的每个文件都有一个字符描述更新类型: A-added, D-deleted, U-updated, C-conflict, G-Merged

6)更改目录结构, 这些命令通常对working copy执行,但也可以对URL执行,对working
copy执行时,生效要等到commit时,而对URL做时,直接生效。
svn add/ svn copy/ svn move/ svn mkdir

7)检查Working copy的修改情况 通常在commit/update前要做的事
svn status

8)对于冲突文件,需要手工解决(修改此文件),然后执行
svn resolved
当然如果不想要自己的修改了,可以用svn revert恢复服务器版本

9)提交修改
svn commit

10)放弃修改
svn revert