2

首先,几个操作参数:

  • 使用 Visual Studio 2005/2008 进行 .NET 开发
  • TortoiseSVN 客户端

我只主要使用 Visual Source Safe 和 SourceGear Vault 源代码控制系统。在每一个中,我将存储库的根映射到本地工作目录。例如:

$/  -->  C:\source

只要本地目录存在,我就设置好我的“工作副本”(svn)或“工作文件夹”(VSS)。

要处理已经在源代码存储库中的新项目,我需要“获取该项目目录的最新”(VSS)版本。

当我进入存储库中的任何子目录并“获取最新”(即 svn checkout)时,客户端将自动为我创建完整的目录层次结构,将结构镜像到我的本地磁盘上。因此,当我得到最新的

$/foo/bar/project1

它是在驱动器上创建的

C:\source\foo\bar\project1

在 subversion 中,当我签出一个目录时,我必须指定工作副本目录位置。如果我想正确地镜像我的工作副本目录结构以匹配存储库,我必须手动构建路径中的每个子目录,或者将存储库根目录检出到工作副本根目录,从而获取存储库中的所有内容。

有没有办法在层次结构中获取存储库目录,以便在没有所有手动干预的情况下在匹配的本地工作副本目录结构中创建它?

这对于小型存储库不是问题,但在大多数情况下,我不需要很大比例的源存储库。为了不破坏对项目和资源的文件引用,必须维护物理结构。加上 SVN 的磁盘成本是给定文件的所有工作基础副本的实际源大小的两倍。

我目前正在使用乌龟。是否有其他 SVN 客户端可以满足我的需求?

4

9 回答 9

3

Subversion“签出”操作创建一个的工作副本。你可能想要做的是检查你的整个项目(它会自动创建正确的目录结构,因为它在存储库中),然后使用 Subversion“更新”操作。更新将更新指定目录和子目录中的所有内容。

这可能是由于 VSS 和 Subversion 之间的术语不同。Subversion Book值得一读,尤其是关于基本用法的章节。

更新:我想我不太了解您的预期用例是什么。听起来您可能需要的 Subversion 1.5 新特性之一就是稀疏检出。这使您可以有选择地获取存储库的一部分,而不必获取全部内容。它为您提供管理所需数量的选项非常灵活。

由于稀疏结帐相对较新,我认为 SVN 书没有更新以包含有关此功能的信息。已更新,见评论。

更新 2:听起来您可以通过使用 --depth=empty 选项将存储库的顶层检出到 c:\source 中来构建所需的内容。然后,对于您想要的每个子目录,根据需要使用 --depth=empty 或 --depth=infinity 更新该子目录。

我相信这一切都源于 Subversion 的设计目标,即能够在您的系统上同时拥有多个独立的源代码树。使用 VSS,$/ 被全局配置为引用特定目录 (c:\source),因此您只能进行一次检出(每次切换时都不会弄乱全局配置)。

于 2008-10-30T03:02:01.533 回答
2

简而言之,回答您的粗体印刷问题:,无法在项目位置上方创建所有文件夹

这样做的原因略长:

您正在考虑 VSS 工作流程,其中您有 1 个工作文件夹,在您的本地目录中有一个固定路径。因此,您所能做的就是查看另一个项目,该项目将在您的工作文件夹内的本地 HD 上创建整个目录结构。

在 SVN 中,您有浮动工作副本,您可以将存储库中的特定位置检出到您想要的任何位置。您甚至可以将您的工作副本移动到不同的地方!您的工作副本不需要在 HD 上固定位置。

因此,您无需在项目上方重新创建文件夹结构。对于您的项目,它也不应该有任何区别。通过使用绝对路径不重要的浮动工作副本的 SVN 工作流程,您会更加灵活。

但是,如果您对使用旧的基于 VSS 的工作流程感到更自在,您可以使用--sparse-checkout参数签出并手动重新创建结构或编写一个简单的批处理文件来执行此操作。如果您继续使用 SVN 并忘记旧的生锈的 VSS 工作流程,我看不出这样做有什么好处,您肯定会忘记这样做

于 2008-10-30T09:23:47.690 回答
1
  1. 首先使用 Repo Browser 浏览您的 Subversion 存储库。
  2. 向下导航到您想要的目录;你应该得到一个显示类似https://subversion:8443/svn/BranchMerge/Branches/TestWeb的 URL
  3. 在左侧导航窗格中右键单击该目录,然后选择 Checkout...
  4. 从存储库文本框的 URL 复制(到剪贴板)目录路径“BranchMerge/Branches/TestWeb”。
  5. 将其粘贴到 Checkout directory 文本框中,以与其现有路径混合并匹配,以便它显示本地驱动器所需的层次结构。"C:\source\BranchMerge/Branches/TestWeb"
  6. 当你点击 OK 时,应该会出现一个对话框,要求自动创建那些丢失的目录。
  7. 当然同意。
于 2008-10-30T03:43:40.903 回答
1

我似乎找到了一个合适的解决方案来解决我的问题。

使用 TortoiseSVN,repo 浏览器中的“将项目更新到修订版”操作可用于在本地重建存储库的文件夹结构以获取任意 repo 路径。

详细步骤如下:

  1. 创建一个本地文件夹作为您需要为其维护物理文件夹结构的最高存储库文件夹的工作副本根
  2. 对存储库根进行浅层检出(检出,选择“完全递归”以外的任何内容的“检出深度”)
  3. 从工作副本文件夹启动 repo 浏览器
  4. 找到你想要获取的 repo 路径
  5. 右键单击所需的文件夹,选择“将项目更新到修订版”
  6. 保留 HEAD 修订和“工作副本”更新深度的默认值,单击确定

这将使用所选 repo 路径的内容更新您的工作副本,包括直到结帐工作副本开始的所有父目录,从而镜像工作副本中存储库的文件夹层次结构。

关于“将项目更新到修订版”上下文菜单选项的注意事项:

  • 此选项仅出现在本地工作副本中不存在的存储库路径上
  • 看起来将“更新深度”保留为“工作副本”的默认值对于获取所选路径的所有内容是很好的。(而不必显式选择“完全递归”。)
于 2009-07-08T14:05:44.247 回答
0

但问题的重点是,我不希望仅仅为了在初始结帐时创建目录结构而获取整个存储库。

抱歉,如果我不清楚我是从一个干净、空的工作副本位置开始的。

我已经阅读了 SVN 书的大部分内容。但是,它不包括这类问题。

于 2008-10-30T03:05:42.990 回答
0

ankhsvn(开源)和VisualSVN(商业)是与 Visual Studio 集成的产品,可能更适合您的开发模型。

于 2008-10-30T03:21:24.003 回答
0

我一般都理解你们所说的“SVN 是如何工作的”。也许问题不在于我对此不清楚,而是我正在成为更高代码组织问题的受害者。

问题的根源来自项目依赖。我有许多具有许多依赖项的应用程序。由于 .NET 项目的层次结构,依赖项预计位于某些物理位置。所以如果我要开始做这个项目:

http://mysvn/svn/foo/bar/project1

该项目将进入

C:\source\foo\bar\project1

现在该项目依赖于另一个项目。在 .NET 项目文件中,项目引用是相对“反向引用”的:

..\..\..\bar\foo\project2

所以依赖项应该在本地工作副本中

C:\source\bar\foo\project2

因此,父目录结构至关重要。

我不能将依赖项目存储为任何特定应用程序/项目的子项目,因为它们在许多项目之间共享。因此,他们住在一个特定项目树之外的自己的位置。因此,我确实需要确保将任何给定项目(及其依赖项)签出到相对于源树根的特定树位置,以确保对项目的引用不会中断或不会中断开发人员之间没有区别。否则,我们每个人都会不断更新引用以使它们工作,从而在源历史记录中产生大量噪音,并在开发人员之间不断中断。此外,构建服务器也不会将它们放在正确的位置。

我还没有找到任何关于使用 SVN 进行 .NET 开发的好信息。.NET 中有大量使用 SVN 或 CVS 的开源项目。然而,我看过的那些似乎总是处于一个相当孤立的结构中,以至于所有不同的项目都属于一个单一的源树位置。这使得获得所需的一切变得微不足道,因为您可以简单地递归地检查一条路径并获得所需的一切。

我很想听听任何使用 SVN 在 .NET 中进行企业开发的人以及跨项目存储位置边界的许多共享项目。

开始感觉在团队中唯一可行的解​​决方案是简单地检查整个存储库以确保结构正确且一致。这对于拥有许多源代码的存储库来说是不幸的。

于 2008-10-30T15:43:07.253 回答
0

好的,首先,你的工作方式最终会导致问题。

您寻找的原则是每个项目都应该有一个独立于任何其他项目的主干/分支/标签结构。签出trunk会自动获取所有代码,包括依赖项,这足以构建您的项目。

你显然不处于那种位置,而转向它需要一些努力。但是,您可以使用一种解决方法来让您随心所欲地使用外部设备。

  1. 在 Repo-browser 中,在根目录中创建一个新的树文件夹,可能是“Projects”。
  2. 在此 Projects 文件夹中,为您的项目“MyProject”创建一个文件夹。
  3. 在这个文件夹上,右键单击它并编辑属性,添加一个名为“svn:externals”的新属性 - 它会在列表中。
  4. 使用此属性定义项目所需的树。
  5. 签出http://svnserver/svn/Projects/MyProject并检索整个树。
  6. 正常工作。

svn:externals 属性的一个例子可能是:

http://mysvn/svn/foo/bar/project1 foo/bar/project1
http://mysvn/svn/bar/foo/project2 bar/foo/project2

尽管最好使用红皮书中详述的相对引用。

于 2008-12-04T16:03:06.520 回答
-1

不知道你为什么要按照你的要求去做。大多数人只是创建一个工作的本地副本,然后在他们想要的任何目录上工作。这是因为 Subversion 的工作方式。它不会锁定源代码。我通过使用 SourceSafe 开始了源代码控制,所以我对您正在经历的事情有了一点了解。

您可能想要的是使用 svn:externals 属性。这里有几个帖子讨论这个问题。这是其中之一:

如何使SVN只更新文件而不添加新文件

于 2008-10-30T03:19:05.757 回答