2

我有一个包含大量目录和文件的仓库。对于scratchbuild,我只需要从根开始的树的一个子集。一些不需要的子树包含大量的文件,这些文件不需要用于临时构建。我玩过--depth empty只签出稀疏树的选项,但这既麻烦又倒退,因为我最终得到了我想要的目录白名单,而不是我不想要的目录黑名单。由于需要监视我可能需要进行临时构建的新目录,白名单方法变得更加复杂。

有没有办法递归地表达 Checkoutdir但跳过dir/foo/bar/baz而不dir/frob/tweak跳过箍?类似于-prune谓词的东西find(1)

4

1 回答 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)

以上将检查除foo和之外的所有目录树frob

你也可以做类似的事情find

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

但是,这需要您设置一个视图,这使得使用这些版本控制系统变得更加复杂。我喜欢 Perforce。它快速而强大,但开发人员讨厌它,因为它需要视图。对他们来说,它增加了一种复杂性,实际上并没有给他们带来太多好处。他们很少需要进行稀疏结帐。

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

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

于 2012-08-31T14:05:56.323 回答