[技术贴]关于SVN的文章及其它

昨天在QQ群里强烈推荐SVN,大家一听有这样的好东西也都很感兴趣,所以我昨天晚上就花了两三个小时写了一篇东东介绍一下用法。

SVN的Local方式:个人源码管理的好办法

BTW:其它部分忘记说了,那就是gigix也开始8挂乐

BTW2:多谢mikeshi指正,已经作了一些修改。

BTW3:刚才准备为每天一日搜集材料时,系统崩溃了两次,差点就无法启动。而且都是在用Fx访问这个链接的时候:三一八惨案。吓S偶乐。

SVN的Local方式:个人源码管理的好办法

SVN的Local方式:个人源码管理的好办法

[Mental Studio]猛禽[Blog]

SVN、Local方式、个人源码管理

今天在QQ群里,有人在打听Delphi的VSS插件,于是被我B4了一番。正好我最近试用了SVN,感觉很不错,于是在群里强力推荐,以致于几乎被认为是SVN的托儿。-_-|||

事实上SVN的确是我用过的最好的源码管理工具,虽然我用过的这类工具并不多,只有VSS、CVS和SVN,其它像PVCS、TeamSource、ClearCase之类的只有耳闻,因为它们都是商业产品,并且通常用于管理大型的项目,没有机会试用,所以也不知道它们如何。VSS是我四年前在公司里用过的最早的一款源码管理工具,不过它实在是太一般了,而且也是商业产品。所以除了公司里工作需要,我自己是不用的。从那公司出来以后,我试用了CVS,这才开始对自己的源码进行管理。作为OSS圈里元老级的源码管理工具,CVS有多强我不用再多说。但是现在SVN这颗新星已经渐渐要盖过CVS的光芒了,可见SVN是有自己杀手锏的。还有一点很重要的就是:它也是一个开源免费的软件。

SVN全名Subversion。SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统。本文只讨论Windows的情况。其官方网站是:http://subversion.tigris.org(tigris是一个和sourceforge类似的开源网站,与sf不同的是,sf提供的CVS服务,而tigris提供的是SVN服务)。

在介绍SVN的应用前,先讨论一下源码管理的一个重要的基本概念:Repository。Repository就是源码的集中存放处,所有修改后提交的源码就是保存在这里,并在其中记录所有的修改版本,分支版本,版本合并,以及并发修改处理等。传统的VSS或CVS都是采用类似C/S的应用方式,有一个独立的服务端来做这些工作。而SVN则要灵活得多,它支持三种方式:独立服务器方式Web服务器方式(这是CVS所没有的)和本文将要着重讨论的Local方式

回到主题上。个人源码管理是我自己提的一个概念,以区别于团队开发的源码管理。本来像VSS、CVS、SVN这样的工具最主要的功能是用于团队开发时用的,用于处理源码修改的版本控制和并发修改冲突。但对于个人开发来说,就不存在并发修改冲突的问题了。但个人开发又存在一些新的问题:一般个人没有条件搭一个独立的服务器来做Repository,所以实际上即使是用了CVS一类,也是服务端客户端在一台机器上,而且也不需要用户权限管理这样的功能。但有时又需要在不同的机器间拷贝源码作开发,这又带来版本混乱的潜在风险。而SVN的Local方式可以说是最好的解决方案。

我现在的用法就是:在U盘里建立Repository,然后在每台机器上都装了SVN,这样我就不需要一台单独的Repository服务器,只要在任一台机器上把U盘插上即具备了完整的版本控制功能。
 

SVN的安装和使用

因为本文只讨论Windows下的Local方式,所以不需要独立服务器或Web服务器。SVN的客户端和CVS一样,也是命令行方式工作。但在Windows平台下,我们有还别的选择,这就是易用性很好的一个实现:TortoiseSVN(注意:这是一个独立于SVN的项目,类似于WinCVS与CVS的关系)。其官方网站是:http://www.tortoisesvn.org,下载其安装程序:TortoiseSVN-1.1.3-UNICODE_svn-1.1.3.msi(这个文件名是指NT/2k/XP版的)。这个集成发布包中包含了Local应用所需要的全部内容。如果想要中文版,还可以下载这个中文语言包:LanguagePack_1.1.3_zh_CN.exe(这是简体中文包,BTW:从进度上看,繁体中文的完成度还要高些:P)。至于其它的如独立服务器方式,Web服务器方式,命令行方式,Python支持等,都要相应的安装包提供,可自行参考SVN网站说明下载安装。

安装的过程非常简单,只是安装完成后必须重启一下,因为它要集成到Windows的资源管理器中。这也可以算是SVN的又一个大优点(多谢mikeshi指出:CVS也有一个TortoiseCVS,这不算是SVN的优点),虽然CVS也有一个WinCVS不错,但是它毕竟是一个额外的客户端,不如TortoiseSVN这么方便。TortoiseSVN装好后,只要在资源管理器中任何一个文件夹中点右键,即可出现如下图所示的菜单(我打了中文包,所以显示是中文,可以在Settings中选择任何一种已经安装的语言包):

第一步:建立Local Repository

假设现在要开始一个项目,叫做Project1。先在U盘(假设为U:)建立一个文件夹:u:svnproject1。然后在这个文件夹上点右键,选择:TortoiseSVN|在此创建文件库。有两种方式供选择,如下图:

Berkeley数据库和本地文件系统。本地文件系统方式有点类似于CVS,但实现方式上有所不同。Berkeley数据库据说是目前最好的嵌入式数据库解决方案,TortoiseSVN默认选择BDB方式,推荐。确定创建后稍等一会即会弹出一个提示窗,说明文件库创建成功。

第二步:创建工作文件夹

在本地硬盘(如D盘)创建一个工作文件夹:d:workingproject1。然后在这个文件夹上点右键,选择:SVN取出。显示如下对话框:

其中唯一需要指定的就是文件库URL,Local方式是使用file协议。确定后显示如下对话框:

点确定后完成创建工作,在文件夹中看到一个隐藏的文件夹:.svn。其中记录了工作文件夹的一些必要信息,功能与CVS的CVS文件夹一样。一个SVN的工作文件夹的图标上将会多了一个绿色的勾,所有被加入Respository的内容都会在图标上加上这样的绿勾,如图:

第三步:开始写程序

现在可以在此工作目录中创建源程序文件或文件夹。在工作文件夹中的任何文件或文件夹(除了.svn文件夹)的右键菜单上都会增加一些项目,下图分别为工作文件夹工作文件夹下的子文件夹工作文件夹中的文件已经提交的文件的右键菜单内容:

从最左边的菜单和最右边的菜单上可以看到,SVN/TortoiseSVN支持了CVS的几乎所有功能,还增加了一些很实用的功能(比如文件/文
件夹的重命名,在这CVS里是最让人头疼的问题之一)。这又是SVN的大优点。

如果你的源程序原来就存在,可以立即导入到Repository里:在你原来的源程序文件夹上点右键,选择TortoiseSVN|导入。即可。不过要注意:最好先在TortoiseSVN|设置里设定排除/忽略样式(可以设置文件夹或文件名,支持通配符,区分大小写!!!),或是先删除不必要导入的文件。然后再取出(Checkout)到工作目录即可。

第四步:将写好的程序提交到Repository

选择所有要加入的文件和文件夹,然后点TortoiseSVN|加入。将显示如下对话框(以将本文提交为例):

把它们加入Repository,确定后它的图标上将显示一个“+”号,表示这个文件已经加入,但还未提交。再在当前文件夹上点右键,选择SVN提交即可。将显示如下对话框(提交本文,其中的Repository是我实际使用的)

成功提交后,它的图标上也将显示一个前面所示的那样的绿勾。

第五步:日常使用

无非是重复前面的加入/提交等操作。如果在其它机器上使用,则需要重新创建工作目录,并取出(Checkout)Repository中的源码。如果同时在多台机器上使用,则需要使用SVN更新功能来将此工作文件夹中的内容更新为Repository中的相应版本。

更多的功能请参考联机帮助及网站提供的其它文档资料。
 

最后祝大家都能体会到SVN所带来的方便和愉快。

[Mental Studio]猛禽 Mar.17-05

[技术贴]在这样的世界里,没人会不头晕的

昨天链接一篇DDJ的一位.net专家宣布退出.net圈子的8挂。今天令狐告诉我,这个话题是CSDN首页的热门话题。

CSDN就此对微软(中国)开发合作部的软件开发首席专家曹严明作了一个专访国内的一位MVP也就此发表了自己的反驳意见

其实Richard的原文我没有很仔细地看(E文8好),但大致上没有看到太多针对技术问题的评论,特别是因为此人是一个VB专家,所以他的大多数意见是集中在VB.net上,而对于.net Framework更多的是一些意气用事的话。如令狐评论:如果不是DDJ发的话,我绝对会以为这是一个菜鸟在胡说八道-_-||。这点我很同意,因为早在02年,我就曾经不知天高地厚地写过一篇《.net神话》,指出MS在.net上的宣传与实际的东东差距太大。当然那时的看法是有很大的偏差的,讨论的方面也太幼稚。但是遗憾的是,那后面几百个不知所云的回复者,根本不值一提。

这次的Richard的文章可谓一石激起千层浪,据说在TSS上讨论得很火爆–偶就8去看那么E文自虐了。仍然令人遗憾的是,有价值的评论还是少数,看了令狐在MSN上发给我的几个国外的开发人员评论,有些也不比国内的某些人强多少。

但毕竟Richard是DDJ的.net专家,影响力还是很大的,连MS的C#产品经理都出面了。可见这个乱子的规模之大。这种来自阵营内部的变节,对MS.net来说是一个大打击。

在这铺天盖地的评论中,MS的支持者的论调都差不多,与三年前几乎是一样一样的:那就是Richard的那些劳骚都不是问题。比如前面那个曹严明,那位MVP,还有刘如鸿的这篇。都差不多,虽然有些方面的确如此,但是有些方面就不敢苟同了。比如我在《.net神话》里说过的一些小问题,以及令狐所提出的版本问题:我这里装的.NET Framework 1.0跟没装一样,主要原因就是1.0、1.1、2005各个版本的差别太大,现在做.NET开发会有种无所适从跟不上节奏的感觉。我曾经也说过.net的这一问题,MS的支持们的回答是:你可以都装嘛,反正又不冲突。我倒想反问一句:TMD MS赞助偶硬盘伐?

反观JAVA,令狐说:比如Java,目前我装完JDK1.5之后把1.4删掉了,一点问题都没有。偶也有类似的经历:改一个用JDK1.1写的Applet,我先后在JDK1.3、1.4和1.5三个版本下改写,并用Eclipse 2.1/3.0编译调试,除了一些提示说用到了已经过时的内容以外,基本上没有问题。而且改好的程序在JRE1.1以上版本都可以正常运行。

这还只是问题的一个小方面。但却折射出对于开发人员来说,完全移植到.net上将会有多么巨大的风险。再说那个被MS专家们反复批评的说法:为什么Microsoft自己不将所有现有产品都彻底用.Net改写掉?

那位MVP说得很对:一家软件公司最愚蠢的事情之一,就是公司的管理层听信了开发人员的下面这句话:“天哪,旧版本的代码简直就是垃圾,我们唯一的选择就是重头设计一个全新的系统,用最棒的技术来构建!”无数软件公司都是死在了这句话之下

那么OK了,连MS这么大、这么有钱的公司都怕这么干。那么作为偶们这些小开发者来说,将现有代码移植到.net下岂不是自寻S路?MS这也太狠了吧?弄个.net难道是想把大家都搞死?

所以博客园的这篇《.NET, 想说爱你不容易》文章题目就很能说明问题。总的来说,孟岩的这篇《.NET面临信任危机,根源在于目标模糊》说得相当的中肯。令狐说:孟岩这家伙,前段时间还在帮Lippman说C++/CLI有多么多么优秀,今天这篇文章也来批评.NET战略模糊,呵呵~~。我说:在这样的世界里,没人会不头晕的。令狐说:把微软看得太重要尤其头晕

GIGIX作为JAVA的一贯支持者,这篇《独裁是一种风险》难免偏向JAVA,这也无可厚非。如令狐所说:孟岩基本上算是最中肯的了。Richard和Dan算是两个当事人,偏激也是情有可原,gigix么Java一向的支持者,FUD一下.NET也无可厚非

不过对GIGIX提出的MS独裁者论我是很赞同的,早在去年我就计划要写一篇关于这个方面的文章,只是因为种种原因,到现在也没写几个字。

杂7杂~~~~~8

昨天哈郁闷,因为听说KFC的新奥尔良烤翅和烤鸡腿堡含有苏丹红一号!偶前天刚吃了一个烤鸡腿堡~~~

TNND为什么不早一天发现,偏偏在我吃完第二天就发现,然后KFC就停止了这个产品。昨天晚上把MSN的ID改成:昨天吃了苏丹红一号TOT。结果早上上班,一个同事在MSN里跟我说:

那么你不就快要辞世了?哦。。。我会想念你的~~~~~~(FT)
奥尔良那么难吃你也吃?死了活该~~~~~(再FT)
哈。。。超郁闷~~~~~赶死队~~~~~~(当她听说偶吃的是最后一批时说)(完全彻底的FT乐)

另一个坏消息是:SM(上头有令,加马赛克ing/050406)被封了。步了一塌糊涂的后尘。

还是娱乐新闻比较有意思:林忆莲与20年前旧男友再续前缘

BTW:今天大家都能看懂乐吧。

[技术贴]语言的特性及其它

把这几天有关技术的东东都随便说一下,没有什么主题,题目是随便写的。

从令狐的一篇《声音》链到这两篇《<Coding在西元前>–写给所有热爱C++的朋友》和《我眼中的Python》。

在ABP那个贴子里,ajoo说得很在理(就是被令狐收录的那段^O^)。而在JAVAEYE的那个贴子里,ajoo也跟了一贴,对贴主Robbin所说的:我虽然使用Java开发软件已经有5年的历史了,但是能不用Java的时候,我一定不会用Java的。表示同意。

没有什么语言是万能的,必须根据实现情况选择合适语言进行开发。

但这同样会有问题。

昨天和令狐在MSN讨论了一下他最近接触的WebWork–一个JAVA的轻量级WEB开发框架,谈到其中的非侵入WEB应用实现。令狐说:

在以前的框架比如Structs里,你无法独立测试这些模型,因为他们跟框架本身有耦合(extends了Structs中的Action基类),所以,除非把整个框架跑起来,否则不能测试。
而在WebWork中,用户是通过实现接口来和框架进行耦合的,而我们知道,接口本身是一个虚的东西,并没有实际的代码,所以,这个模型实质上是和框架独立开的(除了对接口的一个import之外)。所以,它可以独立测试。至于测试所需的上下文,在WebWork中也有考虑,你可以通过实现一个简单的MockObject来模拟用户提交过程。

我说,这正是我理想中的Web解决方案。

但是这样的方案要移植到别的语言上就会有困难。C++就算了,Python倒还可以考虑。^O^

令狐还发现JAVA中的JMX正是他早就想要实现的一个通用管理框架。

我们的感觉就跟JAVAEYE那位Robbin对Python/Zope/Plone所作的形容:……直到我看到了python和zope,我终于找到了梦寐以求的东西,兼有脚本语言开发的高效率,兼有低部署成本的易用性,同时又有完备的面向对象的强大支撑能力,同时又具备完善的强大的appserver支持。最令我生气的还是plone,这个运行在zope之上的软件,你可以称之为portal,或者称之为cms,或者其他的什么名词,但是我知道它几乎可以实现任何网站想要实现的功能。……

令狐说:我们的视野还是不够宽。而且还是比较矛盾。不接触么有些东西别人做了很多自己还在傻乎乎的想,接触太多么又没那么多精力

其实视野宽了也很郁闷。

如何取舍?如何整合?都是问题。

比如前面说的移植,我最近一直在尝试将JAVA的轻量级容器的思路移植到DELPHI下,但问题是一堆接着一堆。上次我说过我试图用DELPHI自动的接口变量引用计数来模拟GC–本质上跟C++中的带引用计数的SmartPtr差不多。但结果却是很难看:

定义一个:IGCInterface = interface
提供一个:function GetObject : TObject;
再定义一个:TGCObject = class( TInterfacedObject, IGCInterface )
实现GetObject:Result := Self;

本来想说只要让一个CLASS从TGCObject派生即可,但使用中却发现因为Delphi没有template,不支持GP,所以应用代码就会变成:

TMyGCObject = class( TGCObject )

obj : IGCInterface;

obj := TMyGCObject.Create…
( obj.GetObject As TMyGCObject ).doSomething…

不但难看,而且需要进行动态的向下类型转换,存在着出错的风险和性能的问题。

貌似这样说来,支持GC和GP的C#是一种各种特性都比较平衡的“好”语言。但是.net平台却一直是阻碍重重。比如我自己,常用的三台电脑中,只有一台装了.net(这也是我后来舍弃SharpReader改用Sage的一个重要原因)。上次DDJ的一位.net专家宣布退出.net圈子,而MS的Charles Sterling的一句话又被这位周星星同学批了一通。呵呵。

最近感觉比较混乱,今天先写到这。

每天一日–315

今天要算是咱消费者最像“上帝”的一日了。不过这事跟前几天的“妇女节”一样,哪天没人再把这个315当回事了,那消费者才真是成“上帝”了。

8过,介素8可能滴。所谓“无商不奸,无奸不商”啊。

今天晚上CCTV又是一年一度的315晚会了,早上看新闻才知道是夏丹MM主持,难怪这两天都是颖颖MM在主播《第一时间》。

其实CCTV自己在这事上也做得不怎么样。比如去年曾经被人垢病过的《非常6+1》让人发短信去参与砸蛋抽奖,却没有告知这个活动是收费的,在网上闹大了以后才用一个小小字幕告诉观众这个是要收每个月8块钱的。再后来经济频道整合一周年那个特别活动《梦想中国》时,也有字幕提示投票每条1块了。如果不是有网络,还不知道有多少人要被骗了钱去,都以为那个砸蛋是天上掉馅饼,哪有这么好的事。

大致估算一下吧:以《梦想中国》七天,每天六名参赛者,共42人次(第七天决赛是前六天的冠军)。平均每人的选票都在百万左右,则光这一周,CCTV就可以净入4200万。砸蛋是不算的,因为李咏每次都有声明,这些奖品都是南孚电池赞助的。假设《非常6+1》登记参与砸蛋的人数按《梦想中国》投票数的一半计(因为那次投票是不计重复的),则约有三百万,每个月CCTV可以从这里收入2400万。

当然,CCTV办节目是要有投入的,但是不要忘记了,还有广告,这可是从来没有少过的。

真是不算不知道,一算吓一跳啊。

前天《剧院魅影》的演出结束了,共演出一百场,三个月来的总票房约6800万。

毛主席说得多么对:人多力量大。

斗毒

8知道什么时候又中了TNND的病毒,是一个叫做PWSteal.Lemir.Gen的火星病毒,据说也是一个盗《传奇》密码的木马。还好偶从来8玩那种烂游戏。

NAV早就查到了,它就是8杀,要不是今天看了一下NAV的LOG,还没发现。

难怪我一直在防火墙的LOG里看到有一个连到北京某IDC的未知连接。

最后还是毛主席他老人家说得对:自己动手丰衣足食。

新华网一则消息让偶想到前不久在网易上看到的一个贴子。这年头总有些这么强的事,比如这个真TM牛B网站(强烈推荐)。

下班先。

意外收获

昨天买了书回来,准备在偶的小书厨里腾个位置来放,因为已经塞得很满了,所以只好把前面一层的书倒几本到后面一层去,踌蹰了半天,才挑出两本比较厚的(因为这三本比较薄)。

偶然发现其中一本是几年前在当当买的打折书,买来后就一直没有看过,便注意了一下。书名为《自画像-卡萨诺瓦、司汤达、托尔斯泰》、显然是一本传记……等等,传记……好像有位同志是专业写传记的。

仔细一看,果然不错,正是:斯蒂芬·茨威格。

一个意外的收获。

今天睡到中午起来,按计划陪老爸老妈去逛街。正走得累得半S时,看到前面一块牌子–XX书店,凭优惠卡8.8折,正要移开视线时,注意到了下面的一行小字:部分特价书3-5折。立即两眼放光、口水横流,硬把老爸老妈一起拉进书店。一进门就四处搜索特价区,然后直奔而去,他们则趁机在门口的几张凳子上坐下休息了。

迅速扫荡了一圈,抱着十本书就出来结帐,一摞书把两个收银MM吃了一惊,算完帐倒是把我吃了一惊,才76块钱。

这回收获大发了。

十本书

(为避免被大家看出偶的猥琐品味,特地PS了一下)

淘书记

上周被老方刺激了,他说买了《资治通鉴》《二十五史》《中国成语/歇后语大全》,每本才十元。我怎么就碰不到这样的好事。

虽然后来在网上找到了电子版的《二十五史》(还缺周书、南史、辽书和清史稿-下),《资治通鉴》和《续资治通鉴》。但电子书也只是仅供搜索,收藏的话还是要纸质的书比较好,供起来别人看到也很醒目。

中午下班路上,小Y急哄哄地发SM叫偶上网,回家吃完饭上来一看,才知道又8幸地被BT鸟。偶为什么要说“又”呢?

想起四年前在华师大淘过一些便宜书,所以决定今天下午再去看看。

在轨道交通三号线下来就碰到传说中的黄鱼车,也看到skyone所说的《他改变了中国》和《我的前半生》、《我的后半生》,8过偶都8感兴趣–另一本偶感兴趣的,这里却没有。-_-|||

另外也看到《资治通鉴》,拿来一翻,居然是白话版。

一路沿着四年前的路线走,结果越走越郁闷,当年那些低价大甩卖的大大小小的书店现在都变成了大大小小的饭店,果然是“民以食为天”。好不容易找到两间小书店,进去一看也少有什么让我感兴趣的书,卖的不是教材就是外语。

在其中一间里泡了一会,居然看到岳麓书社版的《资治通鉴》,四大本,标价112,想了想还是没有买–所谓叶公好龙就是这么回事。

还看到那部据说会让人看成神经病的《追忆似水年华》,上下两大本,标价68。也没买。随便买了三本书就打道回府去。

郁闷啊。

难道现在读书人都不读书了吗?

更郁闷的是……

逛了一下午,居然么看到一个米女。

每天一日及其它

忽然发现今天是传说中的植树节。

印象中有十几年没有参加这种活动乐,十几年前在学校时种的树也不知道还有没有活着的。

昨天一时头脑发热,也去赶时髦注册了toPimBloglines。因为没找到Bloglines怎么导入OPML–英文差就是没办法啊。试了一下toPim,感觉还可以。难怪有那么多人在鼓吹这种RSS online模式将取代传统的RSS client模式。不过用了一天下来,感觉这种Online方式的RSS阅读还是有一些不足之处,特别是在整理RSS时的用户体验具有一切WEB应用的通病:麻烦而且慢。这恐怕只能寄希望于以后提供Rich Client才可能有改善了。

今天继续赶时髦地注册了textamericaFlickr。textamerica其实不能算是时髦了,grace JJ、刺猬、restart他们都用了很久,我已经是落伍份子了。-_-|||

在公告里把toPim和textamerica加上–这里的东东越来越多了,不知道会不会太影响到速度。