Subversion学习笔记2

分享Subversion by 达达 at 2008-02-13

晚上尝试在U盘上建立我的单人项目的SVN代码仓库。学习了到不少有用的东西。

我晚上跟喳喳鸟讨论我的MaxLab.Common.Data项目有哪些需要修改的,讨论完后我就动手改进。改进完毕将代码签入团队的TFS后,想到干脆把试验性质的个人项目用SVN管理好了,因为还未全部完善,放TFS似乎有点不妥。

于是我拿出那我个非常迷你的2G优盘,折腾起SVN来。

建立代码仓库的过程就和上一篇笔记中的一样,没有什么特别之处。项目依然是按trunk和branches这样的目录结构来管理。另外还多了一个vendor目录用来存放第三方代码,因为我的MaxLab.Common.Data项目用到了System.Data.Sqlite驱动。

在建立MaxLab.Common.Data项目时遇到一个问题,MaxLab.Common.Data的配置读取用到了MaxLab.Common中的AppContext类,而我不能把这个类的代码在不同项目间复制来复制去,这样就失去版本控制的意义了。所以马上就用到了项目间共享源代码的技巧。还好我事先阅读了《版本控制之道》知道到哪一页找我需要的知识,真是居家旅行必备良书啊 :D

在设置代码共享前,先得再建立MaxLab.Common项目的代码仓库,这一步就不用多说了,照旧。

项目间共享源代码我用的是svn:externals属性的方式,书中有提到另外一种方式,但我觉得不是我需要的。关于如何使用svn编辑文件夹属性我这里就不多提,大家可以查书或者文档,我只纪录TortoiseSVN的使用方法。

用TortoiseSVN编辑文件夹属性非常容易,不过首先你要编辑的文件夹必须在SVN控制下,所以刚新建的文件夹你得commit后才能对其设置属性。

在你要设置属性的文件夹上右击,找到TortoiseSVN的Properties菜单项,在弹出窗口中点Add(TortoiseSVN甚至已经帮你列出来了常用的属性),选择svn:externals,然后在属性值的文本框中填入类似"MaxLab.Common file:///Z:/SVN-Repos/MaxLab.Common/trunk/MaxLab.Common"这样的值。

补充说明:假设我要让MaxLab.Common.Data/trunk/MaxLab.Common映射到MaxLab.Common/trunk/MaxLab.Common目录,我需要在MaxLab.Common.Data/trunk文件夹上右击。

svn-pic13.PNG

上面一长串属性值中,开头部分的MaLab.Common是存放外部共享代码的文件夹注意接着有个空格,然后file:///....那一串是MaxLab.Common项目所在代码仓库的的路径,再加上我要引用的内容在项目中的位置,项目仓库路径是file:///Z:/SVN-Repos/MaxLab.Common而trunk/MaxLab.Common是我要引用的代码所在文件夹

当按上面步骤设置完后,MaxLab.Common.Data/trunk/MaxLab.Common中的代码就和MaxLab.Common/trunk/MaxLab.Common中的代码同步了。 :) 当你update MaxLab.Common.Data项目时,SVN会自动到MaxLab.Common代码仓库update引用的代码。

不知道大家有没有注意到我的代码仓库的位置是Z:盘,之所以设置为Z:盘是因为U盘在不同电脑上可能盘符不一样,但是文件夹属性中对其他代码仓库的引用路径却是不会变的,这样就会出问题了。所以考虑到这一点,我便将我的U盘重新分配盘符为Z:,我想没哪台电脑会用到Z盘吧 :)

我将System.Data.Sqlite的dll放到了MaxLab.Common项目的vendor文件夹下,因为考虑到有可能其他MaxLab.Common下属项目也会引用到System.Data.Sqlite,而我不想重复管理同一个文件。用跟上面一样的手法,我将MaxLab.Common的vendor目录共享到MaxLab.Common.Data项目中。

在建立项目过程中我还遇到了设置忽略文件的问题,可能做脚本开发的朋友不会遇到,但做编译型语言开发的同志得注意了。因为代码编译后会生成一些文件,谁都知道这些文件不用也不应该放到版本控制器中,所以我们需要设置SVN让它忽略这些文件。

设置忽略文件一样要用到SVN的文件夹属性设置,这次用到的属性是svn:ignore,我将debug目录和release目录的svn:ignore属性都设置为*.*也就是这两个目录下的所以文件都会被SVN忽略,不进行版本控制。

svn-pic14.PNG

另外VS项目文件夹下的obj文件夹也要注意,项目编译时obj这里面也会生成一些七七八八的东西所以也要将obj文件夹的子文件夹(Debug和Release,还有他们下属的子文件夹)设置成忽略所有文件。

最终的目录结构:

svn-pic16.PNG