星期二, 四月 03, 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....

0 Comments:

发表评论

<< Home