我有一个包含大量目录和文件的存储库。对于临时构建,我只需要从根开始的树的子集。一些不需要的子树深处包含了临时构建不需要的巨大文件。我尝试过使用 --深度空
选项来仅 checkout 稀疏树,但这很麻烦而且倒退,因为我最终得到了一个大的我想要的目录白名单,而不是一个很小的黑名单我不想要的目录。由于需要监视我可能需要进行临时构建的新目录,白名单方法变得更加复杂。
有没有办法以递归方式表达 checkout dir
但跳过dir/foo/bar/baz
和dir/frob/tweak
不跳圈?类似于 find(1)
的 -prune
谓词?
最佳答案
Subversion 假定您需要整个目录树。有一种方法可以进行稀疏结帐,但它有点像跳圈机制:
首先,进行检查并将 --深度
设置为立即数:
$ svn co --depth=immediates svn://localhost/myproject/trunk myproject-trunk
这将 check out 根目录下的所有文件和目录。
接下来,您可以使用各种 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 等其他版本控制系统中,您可以指定要 checkout 的内容,而在 Perforce 中,则可以指定 checkout 的方式。
但是,这需要您设置一个 View ,这使得使用这些版本控制系统变得非常非常复杂。我喜欢佩福斯。它快速而强大,但开发人员讨厌它,因为需要 View 。对他们来说,它增加了一定程度的复杂性,但实际上并没有给他们带来太多好处。他们很少需要进行稀疏结账。
如果这是您的 Subversion 存储库的常见问题,您可能需要重新考虑您的布局以使其更加方便。这在 Subversion 中并不太困难,因为整个存储库只是一个包含分支和标签的文件树。很多时候,我们决定放弃主干并将其替换为特定分支,或者重命名和重组我们的存储库以使其更易于使用。
请务必与您的开发人员协调任何大规模重组。如果您移动他们正在处理的目录树,他们会突然发现他们无法提交更改(大多数时候,他们可以执行 svn switch --relocate
来解决此问题.然而,我的经验是,开发人员宁愿检查他们的东西并从干净的结账开始。
关于svn - 颠覆结帐: is there a way to skip a subtree?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212375/