2012-08-31 58 views
2

我有一个包含大量目录和文件的仓库。对于scratchbuild,我只需要从根开始的树的一个子集。深层次的一些不必要的子树包含了大量不需要用于构建临时文件的文件。我已经玩了--depth empty选项来检出一棵稀疏的树,但这很麻烦和倒退,因为我结束了一个我想要的大白名单目录,而不是一个我不想要的小黑名单目录。由于需要监控我可能需要用于临时构建的新目录,因此白名单方法更加复杂。颠覆结账:有没有办法跳过一个子树?

是否有表达结帐递归dir但跳过dir/foo/bar/bazdir/frob/tweak没有通过箍跳跃的方式?类似于-prune谓词find(1)

回答

3

Subversion假定你想要整个目录树。有一种方法做稀疏检出,但它是排序的箍通过机制跳跃:

首先,检出的操作和设置--depth来立即数:

$ svn co --depth=immediates svn://localhost/myproject/trunk myproject-trunk 

这将签出的所有文件和立即在根目录下的目录。

接下来,你可以使用所有种类的shell脚本魔法与--set-depth标志更新只有那些你想要的目录:

$ shopt -s extglob #Needed on BASH, but not Kornshell 
$ svn co --depth=immediates $REPO_URL 
$ svn up --set-depth=infinity !(foo|frob) 

上面会做所有的目录树的结账除了foofrob

你也可以用find做类似的事情。

问题是Subversion非常简单,并且被设计成这样。在其他版本控制系统(如Perforce和ClearCase)中,您可以指定要检出的内容,并在Perforce中指定要如何检出。

但是,这要求您设置一个视图这使得使用这些版本控制系统变得非常复杂得多。我喜欢Perforce。它快速且功能强大,但开发者因为需要意见而讨厌它。对他们来说,它增加了一些复杂性,但并没有给他们带来太多的好处。他们很少需要做稀疏结账。

如果这是您的Subversion存储库的常见问题,您可能需要重新考虑您的布局以使其更便利。这在Subversion中并不难,因为整个存储库只是一个包含分支和标签的文件树。我们曾多次决定放弃中继并将其替换为特定的分支,或者重新命名和重构我们的存储库以使其更易于使用。

只要确保与开发人员协调任何大规模重组。如果你移动他们正在处理的目录树,他们会突然发现他们不能提交他们的改变(大多数情况下,他们可以做一个svn switch --relocate来解决这个问题。但是,我的经验是,开发者宁愿检查在他们的东西,并开始一个干净的结帐。

+0

如果我正确理解你,这可以归结为从短黑名单(使用Unix工具箱)创建长白名单,然后让svn工作在白名单,对吗? – Jens

+0

@Jens这几乎是它。我想可能[changelists](http://svnbook.red-bean.com/en/1.7/svn.advanced.changelists.html)可能会有帮助,但它们只适用于文件而不适用于目录。 –

+0

我相信第二个svn命令应该是更新,而不是结帐。正确?这是现在的一个旧的答案,所以也许有些改变。 – Pianosaurus

相关问题