SVN 加载新存储库

Posted

技术标签:

【中文标题】SVN 加载新存储库【英文标题】:SVN load new repository 【发布时间】:2012-01-13 14:51:45 【问题描述】:

我目前正在将一个 repo 从 Linux 迁移到 Windows。我遇到的问题是,当加载新存储库时,层次结构是[reponame]\[reponame]。有没有办法将所有文件夹上移一级?

更新

使用以下命令获取 repo 负载 svnadmin 加载 [repo] > [repofile].dump

【问题讨论】:

您采取了哪些步骤来进行迁移?了解自己在做什么将使您更加更轻松地了解您需要采取哪些不同的措施来实现自己的目标。 【参考方案1】:

Unix 下的存储库层次结构是什么?你在那里使用http吗?

我不是 100% 确定你的意思。您是说存储库包含一个包含存储库名称的目录吗?或者,您是说当您进行结帐时,您现在执行以下操作:

C> svn co http://server/foo/foo/trunk

结帐命令现在是什么样子的?

当您说 repository 时,您是指使用 svnadmin create 命令创建的单个存储库目录,还是说单个存储库中的多个项目?

假设我正在使用svnserve 为我的存储库提供服务。我们将调用我的存储库myproj,我想在我的机器上提供我的存储库softserve。当我想结账时,我会这样做:

$ svn co svn://softserve/trunk myproj-trunk

请注意,我只有服务器的名称。该 URL 甚至不包括我的存储库的名称。那是因为svnserve 只能为单个存储库提供服务。如果我有多个存储库,我要么必须拥有单独的机器,要么将所有存储库合并到一个存储库中,要么使用不同的端口。

Apache 可以为多个存储库提供服务,但每个存储库都需要一个虚拟 Web 目录才能访问,因此 Apache 在看到 URL 时知道它是一个 Subversion 存储库,而不是 httpdocs 目录之外的目录。因此,Apache URL 中至少还有一个目录。

指定 Apache Subversion 存储库有两种不同的方法。您可以像这样指定单个存储库:

<Location /myproj>
   DAV svn
   SVNPath C:/path/to/repository/myproj
</Location>

<Location /project_two>
   DAV svn
   SVNPath C:/path/to/repository/project_two
</Location>

在这种情况下,每个 Apache 虚拟目录都有一个存储库。因此,当我进行结帐时,我的命令如下所示:

$ svn co http://softserve/myproj/trunk myproj-trunk

请注意,此 URL 中的 svn URL 上有一个额外的目录。那是因为我现在不仅要指定服务器,还要指定 Apache 虚拟目录。在这种情况下,我使我的虚拟目录名称与我的存储库名称一致。我没有理由需要这样做,但否则会很愚蠢。

就用户而言,他们只是将存储库名称添加到 URL 中。这仍然是有道理的。如果我想从myproj 结帐,我使用http://softserve/myproj,如果我想从project_two 结帐,我使用http://softserve/project_two

但是,有时一家公司可能有数百个 Subversion 存储库,他们在其 Subversion 服务器上提供服务。在 Apache 配置中指定每个存储库是很困难的,尤其是当他们不断添加新项目并删除旧项目时。

要解决此问题,您可以使用 SVNParentPath 规范而不是 SVNPath。这允许您指定的不是 Subversion 存储库目录,而是它应该驻留的父目录:

<Location /source>
   DAV svn
   SVNParentPath C:/path/to/repository
</Location>

现在,我可以将所有存储库放在服务器上的一个目录下,Apache 会自动为它们提供服务。创建新存储库时,我只需将其放在我的SVNParentPath 下。我不必修改我的 Apache 配置。

现在的问题是我不仅要指定 Apache 虚拟目录,还要指定存储库名称。因此,我的 URL 中有 another 目录。 (在这种情况下,我调用了我的 Apache Parent 虚拟目录source)。

$ svn co http://softserve/source/myproj/trunk myproj-trunk

我刚刚下载了 VisualSVN Server 并查看了它。 VisualSVN Server 在后端运行 Apache。它只是自动为您配置它并创建一个漂亮的简单前端。查看C:\Program Files\VisualSVN Source\conf\httpd.conf下创建的Apache配置,我看到了:

我可以想象,当您设置 VisualSVN 时,它会自动执行后者。毕竟,这就是人们为 VisualSVN 付费的原因——它为您处理所有 Apache 存储库。而且,在你的情况下,你做了一些导致这样的事情:

<Location /foo>
   DAV svn
   SVNPath C:/path/to/repository
</Location>

而且,C:/path/to/repository 下的唯一存储库是您的 foo 存储库。因此,您的 URL 如下所示:

<Location /svn/>
   [...]
   SVNParentPath C:/Repositories/
   [...]
</Location>

因此,如果您将 foo 存储库放在 C:\Repositories 下,您的结帐将如下所示:

 svn co http://softserve/svn/foo/trunk foo-trunk

我没有使用 VisualSVN Server 来查看是否可以从前端更改 svn Apache 虚拟目录名称,但我可以想象您购买了允许更多配置的完整版本,并且您命名您的目录与您的存储库名称相同。因此,你有

<Location /foo/>
   [...]
   SVNParentPath C:/Repositories/
   [...]
</Location>

而且,当您从foo 结帐时,您会看到:

 svn co http://softserve/foo/foo/trunk foo-trunk

您提到的双重存储库名称。

我可以想象你可以破解原始的http.conf 文件以使用SVNPath 而不是SVNParentPath,因此你的网址会是这样的:

 svn co http://softserve/foo/trunk foo-trunk

但是,我不知道 Visual SVN 会如何处理它。我怀疑您最好的选择是将您的 Apache 虚拟目录名称更改回默认的 svn 或将其更改为 sourcesrc

【讨论】:

以上是关于SVN 加载新存储库的主要内容,如果未能解决你的问题,请参考以下文章

svnadmin 从 svn 1.4 加载到 1.7

svnadmin 加载但保留修订号

svnadmin 加载到现有目录?

svn 迁移但转储存储库的一部分

当我在存储库中丢失一些修订时,如何转储所有 svn 数据?

从 SVN 转储中删除空修订的问题