我有一个包含大量目录和文件的repo。对于scratchbuild,我只需要从根开始的树的子集。一些不需要的子树深入包含了不需要用于临时构建的大文件。我已经使用--depth empty
选项来检查只有一个稀疏的树,但这很麻烦而且倒退,因为我最终得到了一个我想要的目录的大白名单,而不是我没有的小目录黑名单想。由于需要监视我可能需要用于临时构建的新目录,因此白名单方法变得更加复杂。
有没有办法以递归的方式表达 Checkout dir
但是跳过dir/foo/bar/baz
和dir/frob/tweak
而不跳过篮球?类似于-prune
的{{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)
以上内容将检查除foo
和frob
以外的所有目录树。
您也可以使用find
执行类似的操作。
问题是Subversion非常简单,并且设计成这样。在Perforce和ClearCase等其他版本控制系统中,您可以指定要签出的内容以及Perforce中的签出方式。
但是,这需要您设置视图,这使得使用这些版本控制系统变得更加复杂。我喜欢Perforce。它快速而强大,但由于需要视图,开发人员讨厌它。对他们而言,它增加了一定程度的复杂性,实际上并没有给他们带来太多的好处。他们很少需要做稀疏的结账。
如果这是Subversion存储库的常见问题,您可能需要重新考虑布局以使其更方便。这在Subversion中并不太难,因为整个存储库只是一个包含分支和标记的文件树。我们已经多次决定放弃 trunk 并将其替换为特定分支,或者重命名和重构我们的存储库以使其更易于使用。
请务必与开发人员协调任何大规模重组。如果你移动他们正在处理的目录树,他们会突然发现他们无法提交他们的更改(大多数时候,他们可以做svn switch --relocate
来解决这个问题。但是,我的经验是开发人员宁愿检查他们的东西,然后从干净的结账开始。