我有一个大型Subversion存储库,其中大约有15 GB的数据分布在~500,000个文件中。现在我需要将这个存储库签出到远程主机,这需要几天时间才能完成。
我正在检出的主机已经拥有存储库中数据的完整副本。但是看到文件没有直接从存储库中检出,它们不构成工作副本(没有“.svn”文件夹)。
我希望避免在网络上复制所有这些数据,尤其是当它已经存在于目标主机上时。有没有我可以使用的技巧,可以将预先存在的目录转换为工作副本,而无需从存储库中替换具有相同副本的本地文件?
答案 0 :(得分:25)
从SVN 1.7开始(但之前没有),你可以通过以下方式轻松完成:
svn co --force http://path/to/repo
这会将本地副本视为已存在,并且您将在输出中的每个文件名之前看到现有的“E”:
E some/existing/file
如果文件与存储库不同(新的或修改过的),它将根据the book优雅地处理:
在版本1.7之前,如果您尝试检查现有目录顶部的目录,Subversion会默认投诉,该目录包含结帐本身将创建的文件或子目录。 Subversion 1.7以不同的方式处理这种情况,允许结帐进行,但将任何阻碍对象标记为树冲突。使用--force选项覆盖此安全措施。当您使用--force选项签出时,结帐目标树中通常会阻碍结帐的任何未版本化文件仍会变为版本,但Subversion将按原样保留其内容。如果这些内容与该路径中的存储库文件(作为结帐的一部分下载)不同,则该文件似乎具有本地修改 - 将您签出的版本化文件转换为检查前的无版本文件所需的更改结账时结账时间。
另请注意,SVN 1.7可能会导致这是一个更常见的问题(可能会激发解决方案)。将 sub 目录移动到磁盘上的新位置时遇到此问题。在1.7之前的版本中,它会移动.svn
目录并且它本身就可以了。在1.7中,该目录实际上是无版本的。但是svn co --force
挽救了这一天。
答案 1 :(得分:4)
有重新定位命令:http://svnbook.red-bean.com/en/1.1/re27.html
修改: 如果本地文件未链接到存储库,则可以创建本地存储库,将文件导入其中,然后使用relocate命令。
或者,如果您可以物理访问这两台计算机,则可以在本地检出存储库,然后通过外部HD将文件复制到远程计算机。
答案 2 :(得分:1)
如果你已经在网络上的其他地方的svn控件下有一个工作副本,你可以尝试使用rsync。
答案 3 :(得分:1)
以下命令是删除所有.svn目录。
chmod -R 0755 project_dir
find /project_dir -type d -name .svn -exec rm -rf '{}' +
如果您已有结帐版本,则可以尝试使用.svn
替换rm
来复制这些cp
文件夹。我没试过。
答案 4 :(得分:1)
svn co --force https://PATH/TO/REPO/ .
最后的.
假设您已经在要转换为有效SVN副本的目录中。
例如,如果您想使public_html
目录成为存储库的svn副本:
cd /home/username/public_html; svn co --force https://PATH/TO/REPO/ .
答案 5 :(得分:0)
您可以在本地签出存储库,然后只传输.svn目录(小心,它们包含工作区文件的副本,显然您不想复制它们)。这应该有效,因为你可以获得正确工作副本的确切文件。
当然,您必须编写某种脚本来传输.svn文件。在Unix系统上,你可以用find和朋友来做。
答案 6 :(得分:0)
我不相信没有将这15 GB转移到目的地的解决方案。 在那里复制存储库并进行本地结账可能会更快更容易。
答案 7 :(得分:0)
所有本机svn命令都不会校验现有文件的匹配项而不下载它们。
您使用什么协议来访问存储库?如果是https,那可能是您的问题。尝试使用本机svn协议(使用svnserve)或svn + ssh。或者甚至可以通过托管svn repo的服务器上的file:// URL进行结账,然后使用rsync通过网络进行传输。
只要你不是支付每个字节的带宽,让“svn co -force”在nice或(Windows上的START / LOW)下运行可能是有意义的不要浪费你自己的时间。在结账过程中,它不会使本地文件系统上的任何内容不可用。
最后,我无法弄清楚为什么你的结账速度太慢......我们有500K文件存储库,可以在千兆局域网上通过https在约6分钟内结账。当然,所有文件都要小得多(总共1 GB)。在延迟方面你离服务器有多远?
答案 8 :(得分:0)
在服务器上签出,在本地(服务器本地)创建工作副本,然后通过现有目录结构rsync工作副本到远程系统。
使用Subversion 1.7,这样就没有带有原始文件副本的.svn。
答案 9 :(得分:0)
我的本地计算机上有一个工作存储库,当Eclipse崩溃时,它删除了所有的.svn文件夹。
我能够将其连接到远程SVN存储库的唯一方法是从我找到的博客( Recovering a broken Subversion working copy )中执行以下步骤:
# 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