29

我有一个大型 Subversion 存储库,其中有近 15 GB 的数据分布在大约 500,000 个文件中。现在我需要将此存储库签出到远程主机,这需要几天时间才能完成。

我要签出的主机已经拥有存储库中数据的完整副本。但是由于文件没有直接从存储库中签出,它们不构成工作副本(没有“.svn”文件夹)。

我想避免通过网络复制所有这些数据,尤其是当它已经存在于目标主机上时。有没有我可以使用的技巧将预先存在的目录转换为工作副本,而无需使用存储库中的相同副本替换本地文件?

4

10 回答 10

27

从 SVN 1.7(但不是之前)开始,您可以通过以下方式轻松完成此操作:

svn co --force http://path/to/repo

这会将本地副本视为现有副本,并且您会在输出中的每个文件名之前看到“E”表示存在: E some/existing/file

如果文件与存储库不同(新的或修改的),它也会根据本书优雅地处理:

在 1.7 版之前,如果您尝试检出现有目录顶部的目录,其中包含检出本身会创建的文件或子目录,Subversion 默认会报错。Subversion 1.7 以不同的方式处理这种情况,允许检出继续,但将任何阻碍对象标记为树冲突。使用 --force 选项覆盖此保护措施。当您使用 --force 选项检出时,检出目标树中通常会阻碍检出的任何未版本化文件仍将变为版本化,但 Subversion 将按原样保留其内容。如果这些内容与该路径上的存储库文件不同(作为结帐的一部分下载),

另请注意,SVN 1.7 可能会导致这是一个更常见的问题(可能会激发解决方案)。将子目录移动到磁盘上的新位置时遇到了这个问题。在 1.7 之前的版本中.svn,它会随它一起移动目录,并且它本来可以独立存在的。在 1.7 中,该目录实际上是未版本化的。但svn co --force挽救了这一天。

于 2014-10-07T13:51:18.360 回答
3

有重定位命令:http ://svnbook.red-bean.com/en/1.1/re27.html

编辑:如果本地文件没有链接到存储库,那么您可以创建一个本地存储库,将文件导入其中,然后使用 relocate 命令。

或者,如果您对两台机器都有物理访问权限,则可以在本地签出存储库,然后通过外部 HD 将文件复制到远程机器。

于 2009-05-14T00:06:48.270 回答
1

svn co --force https://PATH/TO/REPO/ .

Where the . at the end assumes you are already inside the directory which you want to turn into a working SVN copy.

For instances, if you wanted to make your public_html directory a working svn copy of a repository:

cd /home/username/public_html; svn co --force https://PATH/TO/REPO/ .

于 2015-03-16T03:57:45.620 回答
1

以下命令是删除所有 .svn 目录。

chmod -R 0755 project_dir
find /project_dir -type d -name .svn -exec rm -rf '{}' +

如果您已经有结帐版本,则可以尝试.svn通过替换rm为来复制这些文件夹cp。不过我没试过。

于 2013-01-04T07:15:44.977 回答
1

如果您在网络上的其他地方已经有一个受 svn 控制的工作副本,您可以尝试使用 rsync。

于 2009-05-14T01:48:53.567 回答
0

您可以只在本地签出存储库,然后仅传输 .svn 目录(小心,它们包含工作区文件的副本,显然您不想复制这些)。这应该可行,因为您将拥有正确工作副本的确切文件。

当然,您必须编写某种脚本来传输 .svn 文件。在 Unix 系统上,您可以使用 find 和 Friends 来完成。

于 2009-05-14T00:45:00.847 回答
0

我的本地计算机上有一个工作存储库,当 Eclipse 崩溃时,它的所有 .svn 文件夹都被删除了。

我能够将它连接到远程 SVN 存储库的唯一方法是按照我找到的博客中的这些步骤(恢复损坏的 Subversion 工作副本):

# Backup your project in case you run into trouble
cp -Rp /path/to/project /temporary/location

# Strip out the old .svn folders (if any)
find /path/to/project -name .svn -print0 | xargs -0 rm -rf

# Check out a clean copy
svn co http://repo/location /temporary/location2

# Move the .svn folders from the clean copy into the correct relative
# place in the broken copy
cd /temporary/location2
find . -name .svn -print0 | xargs -0 -I {} mv '{}' '/path/to/project/{}'

# Remove the clean copy
rm -rf /temporary/location2
于 2013-08-27T23:56:03.640 回答
0

本机 svn 命令都不会校验现有文件的匹配项,也不会下载它们。

您使用什么协议来访问存储库?如果是https,那可能是您的问题。试试原生 svn 协议(使用 svnserve),或者 svn+ssh。或者甚至可以通过托管 svn 存储库的服务器上的 file:// URL 进行结帐,然后使用 rsync 通过网络传输。

只要您不为每字节的带宽付费,让“svn co --force”在 nice 或(Windows 上的 START /LOW)下运行而不浪费您自己的时间可能是有意义的。它不会在结帐过程中使本地文件系统上的任何内容不可用。

最后,我无法弄清楚为什么您的结帐速度如此之慢......我们有 500K 文件存储库,通过千兆位 LAN 上的 https 在大约 6 分钟内结帐。当然,所有文件都小得多(总共 1 GB)。就延迟而言,您离服务器有多远?

于 2011-09-15T18:27:15.790 回答
0

在服务器上进行检查,在本地(服务器本地)创建工作副本,然后通过现有目录结构将该工作副本同步到远程系统。

使用 Subversion 1.7,这样就没有带有原始文件副本的 .svn。

于 2012-08-27T16:17:56.967 回答
-1

如果不将这 15 GB 传输到目的地,我认为没有解决方案。在那里复制存储库并进行本地签出可能会更快、更容易。

于 2009-05-14T01:18:24.280 回答