0

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

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

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

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

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

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

4

2 回答 2

1

Subversion 旨在与 CVS 的工作流程兼容,并尽可能简单易用。稀疏结帐并不是真正需要的项目,因此该功能确实没有使用。在 95% 的项目中,开发人员想要签出特定目录,仅此而已。

但是,看到你在做什么,为什么不简单地这样做呢?

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

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

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(很可能是特定版本)结婚。不过,感谢这些建议。– 伊尔

为了比较,我提到了 Perforce。我知道你不能随意切换 VCS,但 Subversion 确实没有做你想做的事,这主要是由于 Subversion 的初始设计。

Subversion 被设计为易于使用并遵循 CVS 工作流程。CVS 是最流行的版本控制系统,设计也很简单。我折腾了一些关于 Perforce 的内容,主要是强调这一点。Perforce 可以沉着地做你所要求的事情,但代价是额外的复杂性,这使得 Perforce 成为许多开发人员讨厌的东西。

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

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

也许您这样做了,因此可以将二进制文件检入构建树中的其他位置以供其他构建使用。像Jenkins这样的构建工具能够将工件从一个构建作业复制到另一个构建作业。这允许您共享构建工件,而无需先将它们检入和检出构建工具。这会解决你的问题吗?

也可以创建一个工件存储库。在 Java 世界中,Maven 和带有 Ivy 扩展的 Ant 都做得很好。甚至还有一个全球通用的第三方 Java 工件的存储库网络,并且很容易添加严格本地的构建环境。

在非 Java 世界中使用相同的 Java 工具在非 Java 世界中执行此操作并不难。我见过一些使用Artifactory之类的工具来存储 C++ 共享对象库的地方。curl一个标准的 Make 文件可以使用或在构建时获取所需的工件wget,并且大多数构建工具将构建的工件发送到 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 命令行客户端中没有内置这样的功能。

于 2012-05-21T22:52:30.153 回答
0

我真的不知道是否有使用命令行客户端执行此操作的正确方法(从其他响应看来没有),但如果您在 Windows 上使用TortoiseSVN,这相当容易。

  1. 在您感兴趣的顶级文件夹上进行稀疏结帐。
  2. 右键单击文件夹并从 TortoiseSVN 集成资源管理器 shell 选项中选择“打开 repo 浏览器”
  3. 浏览到您关心的嵌套子文件夹,右键单击并选择“将项目更新到修订版”
  4. 在对话框中配置您需要的任何内容(默认值通常很好),然后按确定
于 2015-05-12T19:57:36.980 回答