如何在不替换本地文件的情况下将现有目录转换为SVN工作副本(WC)?

如何在不替换本地文件的情况下将现有目录转换为SVN工作副本(WC)?,svn,working-copy,Svn,Working Copy,我有一个大型Subversion存储库,其中有近15GB的数据分布在约500000个文件中。现在,我需要将此存储库签出到远程主机,这需要几天才能完成 我要签出的主机在存储库中已经有一个完整的数据副本。但是,由于这些文件不是直接从存储库中签出的,因此它们并不构成工作副本(没有“.svn”文件夹) 我希望避免通过网络复制所有这些数据,特别是当目标主机上已经存在这些数据时。我是否可以使用一种技巧将预先存在的目录转换为工作副本,而不使用存储库中相同的副本替换本地文件?有重新定位命令: 编辑: 如果本地文

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

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


我希望避免通过网络复制所有这些数据,特别是当目标主机上已经存在这些数据时。我是否可以使用一种技巧将预先存在的目录转换为工作副本,而不使用存储库中相同的副本替换本地文件?

有重新定位命令:

编辑: 如果本地文件未链接到存储库,则可以创建本地存储库,将文件导入其中,然后使用“重新定位”命令。


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

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


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

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

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

任何本机svn命令都不会对现有文件进行匹配校验和,也不会下载它们

您使用什么协议访问存储库?如果是https,这可能是您的问题。请尝试本机svn协议(使用svn服务)或svn+ssh。或者甚至可以在承载svn repo的服务器上通过文件://URL进行签出,然后使用rsync在网络上传输

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


最后,我不明白您的签出速度为何如此之慢……我们有500K个文件存储库,通过千兆局域网上的https在6分钟内签出。假定所有文件都要小得多(总共1 GB)。就延迟而言,您离服务器有多远?

在服务器上签出,在本地(服务器本地)创建一个工作副本,然后通过现有目录结构将该工作副本rsync到远程系统


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

以下命令用于删除所有.svn目录

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

如果您已经有了签出版本,您可以尝试通过将
rm
替换为
cp
来复制那些
.svn
文件夹。我没有尝试过。

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

我能够将它连接到远程SVN存储库的唯一方法是从我找到的博客()中执行以下步骤:

从SVN 1.7开始(但不是之前),您可以使用以下工具轻松完成此操作:

svn公司--forcehttp://path/to/repo

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

如果文件与存储库不同(新的或修改的),它也将根据以下标准优雅地处理:

在版本1.7之前,如果您尝试签出现有目录上的目录,其中包含签出本身将创建的文件或子目录,则默认情况下Subversion会投诉。Subversion 1.7以不同的方式处理此情况,允许签出继续进行,但将任何阻碍对象标记为树冲突。U使用--force选项覆盖此保护。当您使用--force选项签出时,签出目标树中通常会阻碍签出的任何未版本化文件仍将成为版本化文件,但Subversion将保留其内容不变。如果这些内容与该路径上的存储库文件不同(作为签出的一部分下载),文件将显示为具有本地修改—签出完成时,将签出的版本化文件转换为签出之前的未版本化文件所需的更改

还请注意,SVN 1.7可能会导致这样的情况,即这是一个更常见的问题(可能会激发解决方案)。我在将子目录移动到磁盘上的一个新位置时遇到了这个问题。在1.7之前的版本中,它会将
.svn
目录与之一起移动,并且它可以独立运行。在1.7版本中,该目录实际上变为未版本。但是
svn co--force
节省了时间。

svn co--forcehttps://PATH/TO/REPO/ .

其中,末尾的
假定您已经在要转换为工作SVN副本的目录中

例如,如果您想使您的
public_html
目录成为存储库的svn工作副本:


cd/home/username/public\u html;svn公司——强制https://PATH/TO/REPO/ .

我不知道如何在此处使用重定位。重定位仅更新.svn文件夹中的metada。根据OP,没有.svn文件夹。我怀疑这是否可行,因为您只能重定位到与我链接的文档具有相同存储库UID的存储库
# 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