使用一个(或几个)命令为长路径设置SVN更新深度

时间:2012-05-21 21:10:55

标签: svn

在我工作的地方,我们有一些非常大的存储库。我使用Subversion的稀疏目录功能非常有用。但是,我不知道为什么我似乎无法对存储库进行空(或以其他方式稀疏)检出,然后一次性递归地“添加”长路径的目录。说,我有一个名为“project1”的存储库,其布局如下:

foo/
bar/
  baz/
  brak/
  schwing/yadda/etc/i386/package/

(请记住,这只是一个例子。真正的仓库要复杂得多。)我想(出于各种原因)让工作目录布局镜像回购,除了我想省略一些路径,如“foo”和“bar / baz”一共。所以现在,我做这样的事情:

svn checkout --depth=empty svn+ssh://svn/project1 project1
cd project1
svn update --depth=empty bar
svn update --depth=empty bar/baz
svn update --depth=empty bar/baz/schwing
svn update --depth=empty bar/baz/schwing/yadda
svn update --depth=empty bar/baz/schwing/yadda/etc
svn update --depth=empty bar/baz/schwing/yadda/etc/i386
svn update --depth=infinity bar/baz/schwing/yadda/etc/i386/package

我是在密集还是没有更短的方法来做到这一点?我检查了SVN文档并用Google搜索了它。我喜欢做的事情是这样的:

svn checkout --depth=empty svn+ssh://svn/project1 project1
svn update --depth=infinity bar/baz/schwing/yadda/etc/i386/package

这样“package”的所有父项都会自动添加到文件系统中(类似于“mkdir -p”),但除了路径中指定的子项之外没有任何其他内容。当我尝试上面的命令时,SVN甚至没有给出错误,只是说路径被“跳过”并且检查工作目录显示没有发生任何事情。

我知道我可以写一个shell函数来处理这个(也可能会),但感觉应该有更好的方法。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Subversion旨在与CVS的工作流程兼容,并尽可能简单易用。稀疏结账并不是一个非常需要的项目,因此该功能确实没有用到。在95%的项目中,开发人员想要签出特定目录,就是这样。

然而,看到你正在做的事情,为什么不这么做呢?

$ svn co svn+ssh://svn/project1/bar/baz/schwing/yadda/etc/i386/package project1-package

您还可以在.profile.bashrc文件中设置网址环境变量,如下所示:

PACKAGE_URL=bar/baz/schwing/yadda/etc/i386/package

然后像这样使用它们:

$ svn co $svn+ssh://svn/project1/$PACKAGE_URL project1-package

这样,您只需查看您正在使用的目录。

顺便说一句,有些版本控制系统比Subversion更好地处理稀疏检查。例如,Perforce很擅长。

当然,凭借力量,你会失去简洁。要从Perforce结帐,您需要创建一个视图,将您要检出的内容映射到哪个目录。你可以用Perforce的映射做各种奇特的事情,但是大多数开发人员发现复杂性所带来的痛苦并不值得你轻易放弃。


响应

  

正如问题中所提到的,我需要工作目录布局或多或少镜像存储库的布局。 (主要是为了一些自动化工具的好处。)我知道可以在repo中的任意路径上启动他/她的工作目录。切换VCS不是一种选择,我工作的公司在后端与Subversion结合(很可能是特定版本,甚至是永恒的)。但是,赞赏这些建议。 - eil

我提到Perforce进行比较。我知道你不能随便切换VCS,但Subversion真的不能做你想要的,这主要是由于Subversion的初始设计。

Subversion旨在使用简单并遵循CVS工作流程。 CVS是最流行的版本控制系统,其设计也很简单。我把关于Perforce的一点点倾向于强调这一点。 Perforce可以随心所欲地完成你所要求的工作,但是以额外的复杂性为代价,使Perforce成为许多开发人员讨厌的东西。

你提到这与模仿你的构建工具有关,我不确定这意味着什么。

您的构建工具是否将内容放在结帐目录的超级目录中?对于构建工具来说,这通常是件坏事。它限制了它们的有效性,并且可能导致副作用,因为构建可能会对用户的文件和目录产生不良影响。你可以修改构建不执行此操作吗?

也许您这样做,因此可以将二进制文件检入构建树中的其他位置以供其他构建使用。像Jenkins这样的构建工具可以copy artifacts from one build job to another。这允许您共享构建工件,而无需先在构建工具中检查它们。这会解决你的问题吗?

还可以创建工件库。在Java世界中,使用Ivy扩展的Maven和Ant都可以很好地完成这项工作。甚至还有一个适用于常用第三方Java工件的全球存储库网络,并且很容易添加严格本地化的构建环境。

在非Java世界中,在非Java世界中使用相同的Java工具并不是那么困难。我见过一些使用像Artifactory这样的工具存储C ++共享对象库的地方。标准Make文件可以在构建时使用curlwget获取所需的工件,并且大多数构建工具都没有问题将构建的工件发送到Artifactory。

或许你迟早需要package2这是package的兄弟目录。在原始方案中,您可以上一个目录,然后执行svn update --set-depth=infinity package2

您可以通过单独的结帐执行类似操作:

 $ svn co svn+ssh://svn/project1/bar/baz/schwing/yadda/etc/i386/package project1/bar/baz/schwing/yadda/etc/i386/package 
 $ cd ..
 $ svn co svn+ssh://svn/project1/bar/baz/schwing/yadda/etc/i386/package2 package2

现在,您模仿了存储库结构,但不必使用深度稀疏检出完成所有工作。

如果以上都不能帮到你,除了可能会编写一个脚本来为你做稀疏结账之外你无能为力。您可以编写一个带有URL的脚本,然后将其解析为一系列稀疏检出,但没有类似于内置于标准Subversion命令行客户端的内容。

答案 1 :(得分:0)

我真的不知道是否有正确的方法可以使用命令行客户端执行此操作(来自其他响应,看起来似乎没有),但是如果您正在使用{在Windows上{3}}这很容易。

  1. 在您感兴趣的顶级文件夹中进行稀疏结帐。
  2. 右键单击该文件夹,然后选择"打开repo浏览器"来自TortoiseSVN集成的资源管理器shell选项
  3. 浏览到您关注的嵌套子文件夹,右键单击并选择"将项目更新为修订版"
  4. 在对话框中配置您需要的任何内容(默认设置通常正常),然后按确定