subversion checkout:有没有办法跳过子树?

时间:2012-08-31 09:17:57

标签: svn svn-checkout

我有一个包含大量目录和文件的repo。对于scratchbuild,我只需要从根开始的树的子集。一些不需要的子树深入包含了不需要用于临时构建的大文件。我已经使用--depth empty选项来检查只有一个稀疏的树,但这很麻烦而且倒退,因为我最终得到了一个我想要的目录的大白名单,而不是我没有的小目录黑名单想。由于需要监视我可能需要用于临时构建的新目录,因此白名单方法变得更加复杂。

有没有办法以递归的方式表达 Checkout dir但是跳过dir/foo/bar/bazdir/frob/tweak 而不跳过篮球?类似于-prune的{​​{1}}谓词?

1 个答案:

答案 0 :(得分:3)

Subversion假设您需要整个目录树。有一种方法可以进行稀疏检查,但它是一种箍跳机制:

首先,结帐并将--depth设置为immediates:

 $ 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中并不太难,因为整个存储库只是一个包含分支和标记的文件树。我们已经多次决定放弃 trunk 并将其替换为特定分支,或者重命名和重构我们的存储库以使其更易于使用。

请务必与开发人员协调任何大规模重组。如果你移动他们正在处理的目录树,他们会突然发现他们无法提交他们的更改(大多数时候,他们可以做svn switch --relocate来解决这个问题。但是,我的经验是开发人员宁愿检查他们的东西,然后从干净的结账开始。