UML软件工程组织

 

 

Subversion 1.5中的稀疏目录
 
2008-08-01 来源:rocksun.cn
 

上一周我们blog了Subversion 1.5的合并跟踪特性,当然也有许多其他的新特性,让我们来看看有什么。

Subversion 1.5发布说明(当然还没有完稿)提到了如下1.5新特性:

  • Merge Tracking合并跟踪
  • 稀疏检出
  • 通过代理透明写WebDAV
  • ra_svn和svnserve对Cyrus SASL的支持
  • 拷贝/移动改进:peg修订版本,’svn mv file1 file2; svn mv file2 file3′, ’svn cp *.c dir’
  • 取消改进
  • 变更列表支持
  • FSFS sharding
  • 命令行客户端改进
  • JavaHL绑定改进
  • 许多改进的API

如果你对这个blog不是很熟悉,并且希望找一些关于合并跟踪的信息,可以看Merge Tracking Early Adopter Program,下面的几周我们会blog一些新的Subversion特性,也许不是所有的事情,如果其他人有介绍1.5,我们会链接进来。例如 Malcolm Rowe的mod_dav_svn improvements tree-structured FSFS repositoriesbacking up FSFS repositories, Subversion 1.5 style

在本文,我们会介绍稀疏目录。

稀疏目录

当你第一次检出Subversion版本库,或版本库的一个目录,你会得到其中的所有内容,在一些大项目里,这可能会是一个问题,因为在网络上传递文件需要耗费时间,这与Subversion后来传递小的变更形成鲜明对比,另外,你希望所有文件将你的磁盘搞乱?

Subversion 1.5引入了稀疏目录,给你提供了控制检出和更新哪些内容的能力,你可以读这里的规格,但是我没有从阅读中获得什么,我需要实践,所以我们开始(但是需要留意SVN 1.5的特性还没有全部完成)。

我首先从 Merge Tracking Early Adopter Program 下载Subversion 1.5预发布程序,并创建了一个版本库。

  • 下载二进制程序(我的是Windows)。
  • 拷贝.exe和.dll files到c:\svn,并将c:\svn加入到%PATH%。
  • 在c:\svn创建版本库(svnadmin create repo)(版本库在c:\svn\repo),下载合并跟踪beta版本随带的版本库dump文件
  • 加载dumpfile(svnadmin load c:\svn\repo < c:\svn\mergetracking.dump)。
  • 创建工作拷贝的目录
  • 检出版本库(svn checkout file:///c:/svn/repo/trunk)

trunk的主目录包含一个文件和一些子目录:

index.html
about
jobs
news
products
support

假定我是另一个开发者(假装工作在工作拷贝wc2),我不需要子目录,在目前版本的SVN,我可以用-N选项(即非递归)来只检出trunk的主目录,而没有子目录:

现在我有了trunk顶级目录以及其中的文件,但没有子目录,对于一个大的版本库,这会减少检出的时间,保持你的工作拷贝更加干净,后续的更新只会更新已经检出的目录,-N是你控制的方法。

SVN 1.5会更加灵活,通过-N选项将会多余,我们使用–depth选项代替它,根据规格,–depth的可能值有:

  • –depth=empty: 更新不会拉出任何不存在的文件或目录
  • –depth=files: 更新会拉出所有的文件,但不包括子目录
  • –depth=immediates: 更新会拉入所有不存在的文件或子目录;但子目录的设置为depth=empty。
  • –depth=infinity: 更新会拉入所有不存在的文件和目录,子目录的设置为depth=infinity,与目前的缺省更新行为方式相同。

现在我是wc3的第3个开发者,让我们使用–depth=empty检出:

一个trunk目录添加到了wc3,就像.svn管理目录(换句话说:创建了一个真的工作拷贝),但是除此以外,trunk目录是空的。

让我们使用wc2添加一个文件(test1.txt)到版本库,根据规格,如果我运行svn update,wc3不会添加任何文件:

很好,如我们的预料:没有文件。

让我们在wc3创建一个文件,并且添加到(test2.txt),然后回到wc1,svn update做出了一些更改,也提交一个文件test3.txt,提交,现在更新wc3。

Test2.txt已经修改,但是test3.txt没有添加到wc3(记住:–depth=empty意味着svn update拉出已经存在文件或目录)。

现在我们试试–depth=files。

所有顶级目录的文件都回被拉入,但是没有子目录,当我在wc1将test4.txt和test5.txt添加到trunk,并添加一个包含目录的文件,然后提交。

当在wc4使用svn update时,会拉入test4.txt和test5.txt,而不会包含子目录及其中的文件。

此刻我有一个问题,假设我只希望有test4.txt,我可以只拉入test4.txt,而不必拉入test5.txt吗?Subversion 1.5支持吗?

Nice!

很好!

让我们试一下–depth=immediates。我猜”immediates”的意思是”邻居”:如果你是和我在同一个目录的一个文件,你是一个邻居,如果你是我的目录的一个子目录,你也是一个邻居,但是如果你是一个子目录的文件或目录,那么你不是直接的邻居。我们来试一下。

我使用svn checkout file:///c:/svn/repo/trunk –depth=immediates创建了wc5

它会检查trunk中的文件,包含子目录而不包含子目录中的文件。然后,在wc1我们在trunk的最高级目录添加了test6.txt,以及一个包含test7.txt的子目录。

这个新文件在trunk的主目录,子目录已经进来了,但是子目录的文件没有,那个目录实际上使用了–depth=empty创建。

–depth的最后一种情况是”infinity”

svn checkout file:///c:/svn/repo/trunk –depth=infinity

这与使用svn checkout file:///c:/svn/repo/trunk相同,那还要它做什么?命令的一致性。–depth不仅仅应用到checkout,也应用到update,例如,如果你已经使用 –depth=empty检出了一个目录,你仍然可以通过update获取所有的东西:

svn update –depth=infinity

哎哟,好像不行。Merge Tacking Early Adopter Program的SVN 1.5 beta版本只有几周的大小,显然只会更新稍深一级的目录(我们会立刻更新beta)。

这在我的构建中执行正常:

其他的方式也工作正常。我使用infinity 创建了wc7,然后使用wc1提交了一个文件以及一个包含文件的目录(你知道是如何操练的),更新wc7:

svn update -depth=immediates

包含了文件和子目录(直接的),但没有子目录中的文件。

系数目录也会影响一些其他的命令:

  • svn info会显示工作拷贝的深度
  • svn switch可以使用–depth选项,且会根据url使用你指定的深度更新工作拷贝
  • svn status只会报告深度depth指定的文件和目录,例如如果你创建一个包含文件的目录,则svn status –depth=immediates只会报告新目录(一个邻居),而没有子目录中的文件。
  • SVN帮助中说提交也可以使用 –depth,允许你,例如提交当前目录的文件:–depth=files。它还不能工作,这是一个缺陷。

让我们关注一下兼容性,Subversion客户端和服务器版本会是稀疏目录的一个问题,然而,我认识到Subversion 1.5版的客户端会足够聪明的指出忽略什么,换句话说,如果服务器是1.5版本以前的,将会爆所有的脏盘子交给客户端,而客户端回检测检出时需要哪些,稀疏目录的支持也会工作正常。

稀疏目录何时使用呢?对很多用户来说检出单个文件(使用-depth=empty,然后对单个文件update)很有用,我们使用 Subversion来保存openCollabNet的HTML内容,页面分布在同一服务器的多个版本库(每个项目都有一个自己的版本库),对于一个版本库我通常会管理顶级目录,然后将子目录给其他人,例如保存需要下载的二进制文件,文档或其他东西。通过使用–depth=files检出版本库,将会得到我需要的,而不包括其他人在其他目录管理的文件。

琐事: 何时何地第一次讨论稀疏目录?这里有答案。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号