镜像管理:保持怎样的同步(sync)频度

Filed Under (Administration) by rocksun on 20-05-2008

CollabNet的一个客户最近发布了这样一个问题:

我们为CollabNet主持的多个Subversion版本库设置了镜像,我有一个关于同步频率的问题,保持怎样的同步频率?在一些小的修改就同步还是在一些大的修改完成时再同步?

结果是我确实曾经考虑这个问题,Subversion的动态镜像管理非常有趣,所以这给了我机会来润色我的一些思考,因为这个客户的Subversion开发场景并不独特,所以您也能够从我的回复里得到益处。

我的回复时:

这是一个有趣的问题,我最近曾经认真思考过。如果你希望“每X分钟同步一次”之类的回答,那你不会满意的,答案需要你平衡镜像的作用和维护他们所经受的复杂度之间的关系。

让我们从最原始的同步方法开始,你每过几分钟同步一次。依赖于你如何使用镜像,精确的分钟可能会变化。如果是简单的夜间备份,60 x 24 = 1440分钟足够好,但是如果镜像会作为开发者使用的快速变化的代码基时,这就不够了。你也许需要每20,5或1分钟同步一次。当然你不希望因为太频繁的同步影响服务器的性能(发起拒绝服务攻击(DoS)并不明智),但是尝试已经同步过的镜像的代价并不是那么大。

现在,如果版本变更数据是同步任务唯一维护的数据,选择svnsync sync会和上面一样简单。不幸的是,也有一些未版本化的属性也需要关注,因为当你同步Subversion版本库的时候,Subversion不会记录你所做的事情,完整的Subversion版本库同步变得复杂起来。假如你在master版本库有100个修订版本,你保持了镜像的同步。之后,一个开发者修改了修订版本50的日志信息,svnsync不会识别出发生的百年更,以后的svnsync sync只会同步修订版本的增加(r101或后面的),但是r50的日志在镜像中已经不同了。svnsync copy-revprops子命令可以弥补这个问题,但是你需要告诉这个子命令一些关于对于那个版本操作的信息。

所以修订版本同步增加了复杂性。大多数时候,开发者可以快速的识别日志信息的错误,并在提交后迅速修正这个问题,只要他们能在同步工作同步这个修订版本之前执行修正,对镜像来说毫无问题。所以这让我们不要频繁的执行同步(只要修正发生在之前),但是多长是足够的呢?但是如果修改的日志信息是几个月以前的修订时怎么办?这个问题需要根据镜像的目的来回答,在你的情况下,修订版本属性是否不同步是否很重要?也许不是,也许很久以前的修订版本属性不同步没有关系。可能在你的情况下,是每10分钟的一个修订版本同步和一个每夜的全修订版本同步。

(我承诺过的,我会提供更多的答案。)

依我看来,最好的方法是多方面的,实时的事件驱动的触发器和预定的以防万一的同步工作。

第一部分的情况是,除非在master版本库和镜像之间发生通讯错误,都会尽可能保持同步。理想情况下,你的主版本库可以推出修改到镜像,或至少能够推出变更的通知。例如,你的主版本库可能有post-commit和post-revprop-change钩子来运行svnsync 来直接同步镜像,如果由于防火墙或安全的原因这样做不到,,那么或许可以让post-commit 和post-revprop-change钩子至少发送变更的通知邮件,镜像主机有一些自动化的方法可以发现这些邮件并触发相关的sync任务,一个提交邮件触发svnsync sync;,一个属性变更邮件触发修订版本的svnsync copy-revprops。

另一方面覆盖了万一的情况。如果镜像主机为能够获得提示邮件?或如果sync工作遭遇网络问题?为此,你或许需要一些有规律的计划任务,会尝试svnsync sync(可能没有同步的东西,因为事件驱动的属性同步工作正常),然后svnsync copy-revprops跨越多个修订版本(通常会重写相同的属性,因为同样的原因),当然需要避免的是防止svnsync任务对同一个版本库的资源争用。

也许不是完全的有指导意义,我希望你能够有足够的信息来决定如何实现最适合你的工作。

 

 

About the Author

C. Michael (Mike) Pilato has been on the Subversion project as a committer since 2000. Mike is one of the co-authors of “Version Control with Subversion” and he is on the board of the non-profit Subversion Corporation.

Permalink

Categories: Administration

Technorati Tags: CollabNet, SCM, Software Configuration Management, SourceForge, Subversion, SVN, Version Control

Subversion 1.5 RC5

Filed Under (General) by rocksun on 13-05-2008

本周早先时候,Subversion社区发布了包含最新bug修正的RC5版本,和我们以前做的一样,CollabNet会提供二进制程序,包括Windows、Linux、OSX和Solaris,CollabNet合并客户端和Subclipse也包含了此更新。

下面是一些我认为比较显著的修订(按照合入的顺序):

  • r30741
    Fix bug whereby ’svn status –depth=files’ still showed some dirs.
  • r30743, r30751
    Fix memory leak in recursive remote propget.
  • r30776, r30777, r30779
    svndumpfilter drops mergeinfo when it is *not* run with –renumber-revs.
  • r30666, r30684, r30726
    Fix for issue 3181. Compare repository UUID with working copy when opening RA session
  • r30761, r30762
    Fix for issue 3172. ‘log -g’ fails the moment it encounters a bogus mergeinfo which claims a merge from a non-existentpath@REV1-REV2.
  • r30820
    Fix pool issue which definitely can lead to assertion failures in reintegrate, and quite possibly to other mergeinfo corruption.
  • r30868, r30871
    In svnserve, tolerate unreadable passwd files. Don’t error over svn+ssh:// when the user can’t read passwd.
  • r30843
    Fix abort in ra_serf when server sends invalid xml during replay.
  • r30907
    Fix for issue 3185. Fix the ‘log –limit’ compatability code in ra_svn, ra_serf, and ra_neon to ignore nested logs when in ‘-g’ mode.
  • r30883, r30888
    Fix issue 3187. Fix reverse merges where merge target or subtree has non-inheritable revision ranges intersecting with the merged range.
  • r30931
    Remove ‘blind deletion of argument to mkdir –parents’, delete only if this invocation has created it.
  • r30896, r30905
    Make Cyrus SASL client support DIGEST-MD5.
  • r30986
    Fix potential segfault in svn_io_remove_dir2(path=’.').
  • r29191, r29398, r29833, r30663, r30963, r30964
    Improve the responsiveness and accuracy of ’svn log -g’.
About the Author

Mark Phippard is Director Subversion Engineering at CollabNet. He leads the CollabNet Subversion team and is a project owner of the Subclipse project as well as a full committer for Subversion.

原始链接:http://blogs.open.collab.net/svn/2008/05/subversion-15-r.html

Subversion 1.5发布候选已可用

Filed Under (General) by rocksun on 29-04-2008

 

在4月24日,Subversion开发社区发布了第一个Subversion 1.5的候选发布。你可以看到这个邮件列表的声明,你会注意到发布的标签是RC4,你可能会奇怪如果你错过了RC1-3。答案是否,这是第一个官方的发布,我们在发布任何发布之前进行了内部复审,提交构建和测试并为这个发布候选投票,在开始的三次尝试中,有人发现了一些不喜欢的事情,所以我们选出了这个发布,因为版本号很廉价,我们在尝试时增加了版本,这样我们就和其他人使用的没有任何混淆了。

无论如何,这是发布的一个重要的里程碑,离最终GA的很近。这个发布可以进行正式的使用,将会持续至少四周。你可以阅读我们网站上的hacking指南中的发布稳定过程,作为发布候选阶段的一部分,我们开始了发布说明最终,你也可以在网上看到这个,这个文档对于发布有许多纵览信息。

就像我们在1.5开发生命周期中,CollabNet提供了此版本的二进制程序,我们希望让用户测试这个发布来提供反馈。请提供反馈,通过合适的反馈,可以帮助我们知道人们实际测试这个候选者。有些时候,如果我们不能得到足够的反馈,我们会延长检查的时间,来给用户更多的时间试用。所以如果我们发现了bug,请报告,如果工作的话你好,告诉我们。反馈可以发送到openCollabNet论坛,或者是tigris.org的Subversion用户邮件列表

为了得到Subversion的二进制程序,你可以使用新的Subversion1.5的图形化合并客户端(基于Subclipse),我们也有TortoiseSVN和其他工具的1.5版本的链接,如果你可以尝试这些工具并给我们和开发者你的反馈。

Mark Phippard

About the Author

Mark Phippard is Director Subversion Engineering at CollabNet. He leads the CollabNet Subversion team and is a project owner of the Subclipse project as well as a full committer for Subversion.

原始链接:http://blogs.open.collab.net/svn/2008/04/subversion-15-r.html

SharpSvn将Subversion带到.NET

Filed Under (General) by rocksun on 20-04-2008

CollabNet主持了Visual Studio的插件AnkhSVN的开发,一些目标促使AnkhSVN 社区成长和加速插件的开发。作为开始,我们建立了AnkhSVN的路线图。 Subversion1.5的兼容性是众多路线的首要问题,包括良好的合并支持。为了正确的支持Subversion 1.5,我们需要更新我们的内部C#绑定(NSvn),或采用Subversion 1.5的.NET绑定SharpSvn,。我们选择了SharpSvn,为什么如此呢?让我们介绍一下SharpSvn。

Bert Huijben开始的SharpSvn项目,也是AnkhSVN的提交者。SharpSvn的目标不仅仅是一套Subversion的API,而是成为符合微软公共语言规范的语言抽象,结果是SharpSvn成为了.NET 2.0或更新.NET程序的Subversion客户端的绑定。(注意:因为Subversion 1.5和SharpSvn的最终API还没有确定,在最终版本发布之前,SharpSvn的API还可能改变。)

为了显示SharpSvn给.NET的Subversion应用带来的的价值,我创建了一个使用SharpSvn的简单程序。

当你下载并且查看源代码,你会看到大多数代码关于UI和线程,我只是用了很少的SharpSvn类。

 

这里是SharpSvn例子代码的主要部分:

/// <summary>/// Retrieves the Subversion log entries and potentially updates the/// DataGridView in a streaming fashion./// </summary>
private void retrieveAndRenderLog()
{     …..     // The Subversion target to run log against     SvnTarget target;         // Attempt to create an SvnTarget by parsing the targetPath     if (string.IsNullOrEmpty(targetPath) ||         !SvnTarget.TryParse(targetPath, out target))         {             …..                 // SvnClient is disposable, using makes sure it’s disposed every time         using (SvnClient client = new SvnClient())         {             // Bind the SharpSvn UI to our client for SSL certificate and credentials             SharpSvn.UI.SharpSvnUI.Bind(client, this);                          try             {                 // Run the log subcommand                 client.Log(target,                 delegate(object lSender, SvnLogEventArgs le)                 {                     …..                     // Iterate over each changed path for each log entry                     foreach (SvnChangeItem path in le.ChangedPaths)                     {                         tooltip.AppendLine("");                         tooltip.Append(path.Action + " " + path.Path);                                                  if (path.CopyFromRevision != -1)                             tooltip.Append(" (" + path.CopyFromPath +                                 "[" + path.CopyFromRevision + "])");                     }                     ….. 

当用来编写.NET的Subversion应用时,SharpSvn是非常易于操作的API,可以简单的指出完成某些任务所需的类和API,文档和帮助在#ankhsvn (irc.freenode.net的AnkhSVN频道),允许我们在一个小时内完成例子程序。你也应该很高兴SharpSvn减轻了在使用语言绑定时手工维护认证callback、baton对象以及aprpool等低级对象的需要,。

SharpSvn的客户端API是与Subversion 1.5的同步API,也是未来AnkhSVN 2.0版本的核心。代码质量和完成度给人印象深刻,如果你希望采用SharpSvn开发,可以访问openCollabNet的本项目。

About the Author

Jeremy Whitlock is a sofware developer in CollabNet’s Subversion Engineering team. He is also an open source advocate who contributes to many projects. Jeremy loves playing video games and still continues to be amazed at the personal growth of his three year old son.

http://privacyreel.info/index.php?q=uggc%3A%2F%2Foybtf.bcra.pbyyno.arg%2Ffia%2F2008%2F04%2Ffunecfia-oevatf.ugzy

原始网站被屏蔽,很遗憾不能访问。

从远程版本库合并

Filed Under (Subversion Client) by rocksun on 02-04-2008

对于很多人来说,Subversion1.5 被宣传为“合并跟踪还有其他”,也确实如此,花费在合并跟踪特性上的力量远大于其他领域,当然,Subversion 1.5不仅仅是合并跟踪这一项功能,也有一些其他的特性。Subversion社区为解决无数的bug话费了一年半的时间,但是现在我要讲的是一个半bug,半特性,或许会被你忽略的一个功能:从远程版本库合并。

Subversion现在允许你 — 部分的,近似的 –  允许你将版本库合并到另一个版本库的工作拷贝,因为Subversion模型的合并就是区别(diff)的应用,你也许会希望不应考虑diff的源,但是这是一个没有人讨论的特性,Subversion的public API 没有提及此事,Subversion book也没有涉及,Subversion的发布说明也没有吹嘘此时。实际上,我是在修改Subversion合并跟踪特性时注意到代码的注释,为何要隐藏这个秘密?当然,也许这只是一个意外的特性 — 并没有刻意去实现,但是却完成了。亦或许原因是这个特性仅仅有时候有效,无论怎样,从另一个版本库合并实际上是一个隐藏特性。

Apparently empowered by the spirit of "by golly this ought to work", one openCollabNet community member found this feature, though and found its shortcomings. User "argeman" posted the following to the merge-tracking beta program forums:

显然,在“by golly this ought to work”精神的鼓舞下,一个openCollabNet 成员发现了这个特性,也发现了其缺陷,用户“argeman”在合并跟踪beta程序论坛发布了这些内容:

我测试了svn 1.5 aopha2(转化了一些版本库然后使用了一下),它工作良好,唯一还没有工作的事情是(它不能在以前的subversion版本上工作),如果我尝试从另一个版本库合并时,无法正常添加文件。

我确实没有从另一个版本库上进行合并,但我立刻认识到了这个特性的价值,我可以用两个词来总结:“卖主分支(Vendor branches)”,卖主分支通常用来在不断变化中保存其他人的代码中的自定义修改,有很多方法可以实现,例如,你可以使用独立的分支,是某个卖主发布包的镜像,而另一个分支包含了你的软件中正在使用的包含你自定义修改的卖主包,你通过将纯卖主发布的区别应用到你的自定义拷贝实现升级。或者,你可以在你的版本控制分支中只包括卖主包的自定义拷贝,使用diff生成未版本化卖主包数据的差别,一些受虐狂比买你版本控制集成的力量,而喜欢维护自定义补丁文件,用来更新卖主包。(如果你是这样的人,一些人可以帮助你治疗)

从外部Subversion版本库合并的能力,提供了前面说的第一种和第二种方法的混合方法,在这个方法里,你只是维护自定义的卖主包拷贝,而不会去跟踪卖主发布的镜像(因为纯版本可以通过卖主的Subversion版本库获得),但是你现在要做的就是将这些纯版本的区别应用到你的自定义拷贝,而不是从乱糟糟的补丁文件中应用。

很不幸,“argeman”没有说“嗨,我发现了这个特性,并且它工作的很好”,这个帖子说明有这样一个潜在的特性,但是却不能够处理合并中要添加的文件,现在是享受开源软件的快乐的时候了,我花了大约40分钟修改了Subversion的代码,并进行了回归测试,并做了一些后续的相关修改,所以Subversion 1.5中,希望从外部版本库合并与内部合并会有一样的效果。合并源中的重命名依然会与Subversion一样,当从外部版本库合并时合并跟踪逻辑会被绕过,但合并在大多数情形下都会成功完成。

About the Author

C. Michael (Mike) Pilato has been on the Subversion project as a committer since 2000. Mike is one of the co-authors of “Version Control with Subversion” and he is on the board of the non-profit Subversion Corporation.

原文链接:http://privacysurf.info/index.php?q=uggc%3A%2F%2Foybtf.bcra.pbyyno.arg%2Ffia%2F2008%2F03%2Fqb-abg-cbfg-zre.ugzy

因为那个网站被GFW屏蔽了,所以请使用其它方式访问吧。

单个版本库还是多个?

Filed Under (Administration, Subversion Server, Subversion in the Enterprise) by rocksun on 11-11-2007

我前一个blog中讨论了版本库的布局,这个条目会尝试回答是选择单版本库单项目还是单版本库存放所有项目的问题,这里没有一个唯一的正确答案,但希望本文可以帮助你理解代价,你才可以做出正确的决定来满足你的需求,下面是单版本库方法的优点:

  1. 管理简单,只需要部署一组钩子,备份一个版本库等等。
  2. 分支/标签灵活性,因为所有的代码在一个版本库,这样可以容易的创建跨多个项目的分支或标签。
  3. 移动代码更简单。你或许希望把代码从一个项目移动到另一个,或者将其作为多个项目的库,这样可以容易的将代码在同一个版本库移动,并保持代码的历史。

下面是单版本库的缺点,以及多版本库的优点。

  1. 大小。对付多个小版本库会比对付一个大版本库容易,例如你结束了一个项目,你只需要归档版本库到媒介,然后从磁盘删除并释放空间。也许因为某些原因你需要转储/导入版本库,例如利用新的Subversion特性,如果库很小,会很容易做且影响很小,即使你最终希望对所有的版本库作这些事,也比一次完成的影响小,当然我们假定没有急迫的需要一次完成这些任务。
  2. 全局修订版本号。即使这不应该是一个问题,一些人还是要求使用一个修订版本号,不希望来看到版本库修订版本号的自己增加,造成修订版本历史的横沟。
  3. 访问控制。Subversion的authz机制允许你根据版本库的部分需要限制访问,如果你有一个项目,只有一些选定的人可以访问,对于一个版本库,这样做很简单。
  4. 管理灵活性。如果你有多个版本库,可以根据版本库/项目的需要实现不同的钩子,如果你希望统一钩子脚本,单个版本库会更好,但是如果每个项目希望自己的email样式,在不同的版本库中实现会更容易。

这里只是每种方法的赞成和反对意见,希望它可以帮助你做出决定,我更喜欢一个版本库一个项目的方法,如果我有多个项目互相关联,我会喜欢多项目单版本库的方法,我也希望通过组或团队分离版本库,尽管实际上是项目概念的变种。

例如,我有一个文档部门项目使用的版本库,当然,在这个例子里在线帮助经常与应用代码位于一个相同的项目,但是文档组也有他们制作的其他材料,我们给了他们另一个版本库。同样的,市场部也有一个版本库存放他们需要的东西,例如公司网站。因为我们讨论版本库的布局,这是可以最好工作的决定,也可以说,在设置好后,改变版本库可能会或多或少有点麻烦。

所以,很值得花时间理解需求来决定哪种方法更适合他们。

原始链接

Mark Phippard is Director, Subversion Engineering at CollabNet. He works on the CollabNet Subversion team and is a project owner for the Subclipse project as well as a partial committer for Subversion.


Technorati : , , , , , , , , , , ,

什么关于分支与合并?

Filed Under (General) by rocksun on 02-11-2007

很荣幸参加了最近Subversion 1.5合并跟踪中关于分支与合并的webinar,第一个webinar名字为” Branching and Merging Strategies for Subversion 1.5“,关注的是分支和合并模型,第二个,” Advanced Merge Tracking and Branching with Subversion 1.5“,则关注于在第一次webinar中读者的问题,两次的目的都是提供一些关于企业应用中很重要的实践信息的主题,但是并没有很好的覆盖Subversion到底有什么能力。

我希望发布一些第二次webinar上的问题和回答,我希望这能有用且能够鼓励你重放webinars来学习更多(http://www.collab.net/webinar21http://www.collab.net/webinar22)。

如果安装1.5服务器,可以让服务器拒绝1.4客户端的请求来保证合并跟踪吗?

一个潜在的方法是开发是pre-commit钩来拒绝1.5之前客户端的提交,但现在还只是讨论,并没有保证会实现。我想起了users.subversion.tigris.org邮件列表中的一些有趣的讨论,这些场景通常包括一个进程和一个服务器升级,来确保你的环境,所有的特性可以被所有用户访问和利用,Subversion社区制作升级服务器,并且客户端需要直接确保指向的发布不会出现问题,在你希望新功能使用的完整时,你会得到进程的辅助。那是合并跟踪特性没有钩子时的回答。

每个文件的的完整拷贝都存放在版本库吗?

不是,Subversion使用二进制区别算法识别和存储修订版本的区别,这是简单的答案,但是还有很多故事。Subversion使用跳过区别方法来提供每个修订版本文件的快速访问,跳过区别是在检索文件任何修订版本时的一种确保只有部分区别需要组合的技术,解释起来有一点复杂,如果你对跳过区别的实现感兴趣,可以阅读官方的 文档March ‘07 openCollabNet Technical Newsletter)。

你有捕获每夜发布快照进行测试的策略吗?

我想使用修订版本号码或时间都很适合执行此类快照的构建,标签(tags)只是用来其他人需要能够跟踪构建到源程序或在将来你自己需要。

第三方工具需要改变来支撑新的合并跟踪吗?

简短的回答是”不”,因为这些功能可以看作是通过标准的merge操作,log和blame。也就是说,可以肯定的是以更用户友好的方案利用这个核心功能,另一方面,我们在我们的CollabNet Desktop - Eclipse Edition添加了特定功能,来帮助”合并管理“以及与命名的修改集关联,我期待着其他对于合并跟踪功能扩展的出现。

一个有些重复的问题:”有修改集的概念并可以基于之上合并吗?”

一个Subversion的基础特性就是原子提交定义的修改集,合并跟踪提供了优选特定修订版本作为合并的源,这个合并就是到目标分支中与修订版本关联的特定修改集,如果目标修改集没有限制为一个单独的修订版本,一个解决方案就是与问题管理工具关联,修改集关联到一个问题,例如CollabNet的修改集合并可以与CollabNet/SourceForge企业版一起使用。

你能提供一个svnmerge客户端和1.5核心功能的高级别比较吗?

通常情况下,1.5提供了对于svnmerge.py更广泛的支持,而一些svnmerge.py特性,例如修订版本阻塞将会出现在Subversion以后的版本,而不会出现在1.5,更广泛的支持包括:

  • 支持每路经而不是branch级别的粒度。
  • 对于svn:mergeinfo属性的合并修改作为后续作的合并或修改。
  • 支持普通客户端,相对于使用客户端以外的工具。这样给了我们更加详细的审计工具。

1.5合并跟踪可以使用svnmerge.py的数据吗?

1.5会提供移植脚本,允许你将svnmerge的数据移植到新的核心方案中,这个脚本利用了移植数据的转换将客户端方法的svnmerge转化为核心方案。一个用户可以选择对整个版本库或特定路经执行移植,这意味着你现在可以使用svnmerge来减轻管理跟踪合并的负担,也可以将数据带到以后,这样合并跟踪可以审计1.5安装之前的合并。

在我发布一些关于第三次基本分支策略讨论的内容之前,我会给你机会至少看一下第一次webinar的回放

原始链接

Bob works (> 5 years) for CollabNet Services, Marketing or whomever needs an opinion. He has been focused on the delivery of version control and SCM for more than 10 years with the last three making people successful with Subversion. He helps CollabNet identify what our engineers should focus on with the Subversion open source project based on his experience, customer feedback, and his own prejudices.


Technorati : , , , , , , , , , , , ,

Subversion提名作为developer.com年度产品

Filed Under (General) by rocksun on 31-10-2007

今天是developer.com接受”2008年度产品”提名的最后一天,让我们在提名页上以下类别中输入Subversion吧:

Development Tool of the Year

Open Source Tool of the Year

不用两分钟就可以完成表格。

Subversion应该在这些领域得奖,如果我们提名Subversion很多,它将会成为11月15号投票的一部分(我会在这里提醒你)。

原始链接

Guido Haarmans is Director Developer Relations at CollabNet, he works on openCollabNet and CollabNet Subversion product marketing.


Technorati : , , , , , , , , , ,

TortoiseSVN与Subversion 1.5

Filed Under (Subversion Client) by rocksun on 27-10-2007

许多人在谈论TortoiseSVN以及它在合并跟踪方面的计划,有些人可能不知道TortoiseSVN ,TortoiseSVN是Windows下的一个Subversion客户端。它嵌入到了Windows Shell而且让Subversion客户端命令出现在Windows浏览器和任何打开保存对话框的右键当中。TortoiseSVN是赢得Sourceforge.net Community Choice Award 2007的伟大工具,你可以从openCollabNet下载,它也是CollabNet的一系列Subversion集成支持的一部分。

我自己一直使用TortoiseSVN,所以我一直很关心TortoiseSVN对于合并跟踪的计划,他们的网站有一些信息,但是我联系了TortoiseSVN的项目领导Stefan Küng,向他询问了目前的状态,下面是他的反馈和一些抓图(感谢Stefan):


合并跟踪通常是被Subversion库完成,而我们用户不需要知道。用户不会看到Subversion会忽略掉已经从主干合并到分支的修订版本,所以对于TSVN的界面没有太多事情可以做,需要给用户显示更多的地方,我们已经做了,另外,我们以及已经尽力隐藏细节。

现在我们已经完成的:

Logalreadymerged_2 日志窗口,当我们从合并窗口选择需要合并的修订版本,会使用灰色而不是黑色来显示已经合并的修订版本,这可以提示用户灰色的版本已经不需要合并了(再一次)。

Logincludedmerge_2 日志窗口会缩进现实合并修订版本,每一个缩进级别显示了一个合并级别,这个UI也许将会在1.5最终发布前修改,因为我对现在的缩进样式不是非常满意 - 很难察看不同的级别,也许我会添加一些竖线或其他什么来改进缩进。

Blamemerges2_2 当显示blames时,合并行会使用斜体显示,用户可以选择显示合并路径的所有行。


TortoiseSVN网站的夜构建与从Merge Tracking Early Adopter Program下载的Subversion 1.5的预发布二进制程序可能不会一直可以工作,下一周我们会更新Subversion 1.5二进制程序到最后开发状态,我们会将根据最后Subversion构建的内容发布TortoiseSVN构建。

另外一件事,在10月30号,CollabNet会做另一个Subversion 1.5的webinar,会覆盖Subversion 1.5的高级分支和合并,这个webinar会紧跟上个月的关于分支策略的webinar,也会回答当时大多数人问的问题。 这里注册

Guido Haarmans is Director Developer Relations at CollabNet, he works on openCollabNet and CollabNet Subversion product marketing.
Permalink


Technorati : , , , , , , , , , , ,

Subversion 1.5的WebDAV通过代理写

Filed Under (Subversion Server) by rocksun on 16-10-2007

在昨天慕尼黑的预SubConf的Subversion Workshop中,我展示了一点Subversion 1.5的新特性 - WebDAV通过代理写支持。这个特性允许基于Apache 2.2.x和mod_proxy的Subversion服务器使用一个主服务器和关联的版本库,一个或多个副服务器可以处理读操作,同时通过(代理)将写操作转给主服务器。在这种部署场景中,每个副服务器都使用某种进程与主版本库拷贝同步,通常是通过主版本库本身钩子脚本驱动。

为什么人们需要这样的安排?相对于写操作(例如commit, revision property修改和lock/unlock请求),人们会更多地使用读操作(例如checkouts, updates, status checks, log历史请求, diff计算等),你一定希望使用多个服务器来分担处理读请求(压力测试的场景)的压力,或者你有一个世界级的组织(例如CollabNet的),办公室分布在United States, Eastern Europe和India,如果你部署一个跨整个组织的中央服务器,你一定会紧张用户对于Subversion服务器性能的要求,WebDAV通过代理写将会允许你为每个地区配置地域副服务器,普遍提高用户读请求的性能。

为了我的描述,我们来描述一个WebDAV通过代理写的简单场景,包含一个副服务器,使用svnsync机制来从主服务器传播修改。如下描述了怎样做。

首先,你需要在主副服务器上安装Apache的HTTP服务器,而且副服务器的版本必须是高于 2.2.0,并开启了mod_proxy。现在,你需要配置你的主服务器来发布你的版本库。假定你的Subversion版本库位于/opt/svn/project,你一定会在httpd.conf添加如下的代码:

<Location /svn/project>
DAV svn
SVNPath /opt/svn/project
</Location>

你的副服务器最终是主服务器版本库的完全复制品(这是我们需要小心的),但是此刻我们需要一些httpd.conf的魔法来发布他们的复制(再次,我们假定位于/opt/svn/project):

<Location /svn/project>
DAV svn
SVNPath /opt/svn/project
SVNMasterURI http://IP-ADDR-OF-MASTER/svn/project/
</Location>

注意SVNMasterURI指示 - 只有这一点是Subversion 1.5的新东西。它告诉副服务器将写类型操作代理到主服务器,并提供了主服务器版本库的URL。

现在,在每个副服务器上的httpd.conf文件中还有第二点需要修改的地方,记住我们使用svnsync将修改从主服务器推到副服务器上,svnsync使用普通的提交同步,如果你将提交代理回主服务器,那不会工作。所以我们需要另一个Location块,用来发布服务器的版本库,但不是写操作代理的对象,只是允许从主服务器IP地址的提交:

<Location /svn/project-proxy-sync>
DAV svn
SVNPath /opt/svn/project
Order deny,allow
Deny from all
Allow from IP-ADDR-OF-MASTER <Location /svn/project>

好的,让我们讨论一下实际的版本库,就像我提到的,每个副版本库需要一个主版本库的复制品,而且根据我们的目的,复制品必须是主版本库只读镜像。(见此文)你将会从主服务器运行svnsync init,为了性能的缘故(在这个场景中非常重要),你将会对主服务器使用file:///的访问。需要小心的事情还有很多,包括在每个副服务器上使用svnadmin create(或Subversion第三方工具等价的命令)创建新的版本库,创建允许pre-revprop-change的许可钩子,然后使用svnsync init http://IP-ADDR-OF-SLAVE/svn/project-proxy-sync file:///opt/svn/project (注意我们使用了特别的sync URL),最后我们使用svnsync sync http://IP-ADDR-OF-SLAVE/svn/project-proxy-sync 将每个修订版本拷贝到副服务器。喜欢冒险的你一定会在每个方法中找到捷径,从只创建一个副服务器准备好同步的版本库,然后将其拷贝到其他副服务器,到手工修改主版本库版本库的修订版本0的属性来优化副服务器的同步代价,我会把这些技巧留给读者作为练习。

让我们看看我们在哪里。我们已经有了配置完成的Apache HTTP服务器,我们已经放置好了每个机器上的版本库,所有的副版本库已经准备好了与主版本库的同步,我们现在需要自动机制来保持镜像的同步,我们使用主版本库的钩子子系统来实现。如果你计划允许修订版本属性修改,你需要在版本库存放 pre-revprop-change钩子脚本,然后可能还有post-revprop-change钩子来告诉svnsync来重新拷贝修订版本属性:

#!/bin/sh
REVISION=${2}
# Launch (backgrounded) sync jobs for each slave server.
svnsync copy-revprops http://IP-ADDR-OF-SLAVE1/svn/project-proxy-sync ${REVISION} &
svnsync copy-revprops http://IP-ADDR-OF-SLAVE2/svn/project-proxy-sync ${REVISION} &
svnsync copy-revprops http://IP-ADDR-OF-SLAVE3/svn/project-proxy-sync ${REVISION} &

你也需要一个post-commit钩子来将修订版本传递到新的版本库:

#!/bin/sh
# Launch (backgrounded) sync jobs for each slave server.
svnsync sync http://IP-ADDR-OF-SLAVE1/svn/project-proxy-sync &
svnsync sync http://IP-ADDR-OF-SLAVE2/svn/project-proxy-sync &
svnsync sync http://IP-ADDR-OF-SLAVE3/svn/project-proxy-sync &

为什么我们要将svnsync进程放到后台?就像我们提到的,性能在这里非常关键,如果有用户执行提交或属性修改,我们副服务器同步时,他可能会立刻执行读操作(例如svn update),如果他这这样做,他会得到修订版本在服务器不存在的错误,虽然并不致命,但是很让人困惑。

此刻,我们可以使用我们的服务器工作了,几乎所有的事情都工作了。用户可以从某个存在的s副服务器检出工作拷贝,当他们执行读操作时,服务器将会使用主版本库的复制品返回数据。当他们提交或修改修订版本属性时,他们的副服务器会将之交给主服务器,完成真正的动作,同时将修改传播会所有的副服务器,但是在继续使用之前你还有一些额外的事情要做。

首先,我们没有为我们的用户添加任何认证和授权信息,有趣的是,你需要匹配所有服务器的认证事务(也需要一个方法保持这些东西同步),但你只需要副服务器的读授权,所有的读和写授权事务都在主服务器。(可能只是保持所有服务器上的的所有事情同步是最简单的。)

第二,我们没有做任何处理lock/unlock客户端请求事情,为此我们可以在主版本库实现post-lock和post-unlock钩子脚本,然后将lock/unlock执行到副服务器,就像他们被执行过一样。 这是一项复杂的工作,幸运的是,如果省去此步,开发场景的锁定改进依然可以工作,只是锁定查询(询问”锁定什么了,谁干的?”)会一直为空。

最后,我们没有办法处理主服务器和副服务器之间连接中断时的问题,如果连接是在某个客户端提交操作进行的时候,那样的话 - 提交不会在主服务器上结束,而他的副服务器会提示一些错误,最坏的情况就是主服务器的提交已经完成,而用户客户端永远不会知道这一点。(同样的事情也会发生在独立服务器配置情况下,连接在服务器尝试返回最终的MERGE请求时中断的时候)如果连接在提交之后的svnsync阶段中断,副服务器可以继续工作,但是在下次提交之前会一直提示过时,你可以在主服务器实现一个cron任务来偶尔执行所有副版本库的同步,来减少过期的时间。svnsync在修订版本属性修改后失败会怎样?那样会更加复杂 - 你或许需要实现一种进程的包裹,可以可靠的跟踪成功和失败,并提供一个重试机制。对于传递lock/unlock状态到副服务器时也会出现类似的问题。

就像你看到的,当前的技术发展水平不像你拨动开关那样立刻开始使用一个主服务器到多个副服务器的版本库复制部署场景,这是一件需要技巧的事情,充满了犯错误的机会,并有许多问题没有被发现。但是这是Subversion 1.5提供的新特性,提供了基础需求,如果你希望看一下直到完成的复杂性。

原始链接

C. Michael (Mike) Pilato has been on the Subversion project as a committer since 2000. Mike is one of the co-authors of “Version Control with Subversion” and he is on the board of the non-profit Subversion Corporation.


Technorati : , , , , , , , , , , , ,