如何将SVN文件夹重新命名时将其分割到自己的存储库中?

我想将一个目录从一个大型的Subversion版本库分离到一个自己的版本库中,并且保存这个文件的历史logging。

我尝试了一下这样做的常规方法

svnadmin dump /path/to/repo > largerepo.dump cat largerepo.dump | svndumpfilter include my/directory >mydir.dump 

但这是行不通的,因为目录已被移动和复制了多年,文件已被移入和移出到其他部分的存储库。 结果是很多这些:

 svndumpfilter: Invalid copy source path '/some/old/path' 

接下来,我尝试的是在出现这些/some/old/path ,包含的文件和目录长长的列表之后,svndumpfilter完成,但是导入生成的转储不会生成与当前目录相同的文件具有。

那么,如何在保留历史logging的情况下正确地从该存储库中拆分目录?

编辑:我特别trunk/myproj是一个新的存储库中的主干trunk/myproj有新的存储库包括没有其他的旧东西,即。 任何人都不应该有可能在拆分之前更新到旧的修订版本并获取/查看文件。

我试过的svndumpfilter解决scheme可以达到这个目的,不幸的是,由于path/文件已经移动,所以不可行。 由ng的解决scheme是不可接受的,因为它基本上是一个克隆+删除额外的保留所有的历史,不只是有关的myproj的历史。

当svndumpfilter包含的其中一个目录/文件最初被复制或从未包含的树的某个部分移动时,会发生此问题。

为了解决这个问题,使用这个脚本: svndumpfilter3

我有一个类似的问题分裂一个存储库..

 svndumpfilter: Invalid copy source path /dir/old_dir 

我所做的解决这个问题的方法是包括正在请求的其他旧的目录,或者你知道你已经移动了。 在我的情况下,我已经移动3个目录到另一个目录。

例如。 将文件夹A,B,C移到文件夹D中

 cat project.dump | svndumpfilter include ABCD > new.dump 

这似乎解决了我的问题。 我能够将文件夹D与Repo的其余部分分开。 另一方面,排除DI没有得到错误,我猜想,因为删除D不需要链接/历史到A,B,C

我已经尝试了至less4个不同的应用程序来做到这一点,唯一真正有用的是使用svndumpfilterIN

 cd /usr/local/bin/ sudo wget --no-check-certificate https://raw.github.com/jasperlee108/svndumpfilterIN/master/svndumpfilter.py sudo chmod +x svndumpfilter.py # To be sure nothing will happened on the original repo : cp -au /path/to/repo /tmp/largerepo.repo/ svnadmin dump /path/to/repo > /tmp/largerepo.dump svndumpfilter.py /tmp/largerepo.dump --repo=/tmp/largerepo.repo --output-dump=/tmp/mydir.dump include my/directory 

这是我试过的, 没有工作

auriarte链接到svndumpfilter3 404's。 这里有一个工作链接(截至2011年1月31日),任何人都在寻找它: http : //furius.ca/pubcode/pub/conf/bin/svndumpfilter3.html

我刚刚成功地将一个项目从现有的组合回购(在Google Code中)转移到了自己的回购项目中。 这里的post是非常有帮助的。

这是最后为我工作的…

  1. 按照这里的指示,使用svnsync制作我的Google代码回购的本地镜像。
  2. svnadmin dump to foo-dumpfile
  3. cat dumpfile | ./svndumpfilter3 --untangle mymirrorrepo trunk/foo > foo-dumpfile
  4. svnadmin create foorepo
  5. svnadmin load foorepo --ignore-uuid < foo-dumpfile

第3步中的--untangle选项设法解决所有困扰svndumpfilter和svndumpfilter2的path问题。

最初,在步骤5我被卡住的错误:

 <<< Started new transaction, based on original revision 2 svnadmin: File not found: transaction '1-1', path 'trunk/foo' 

但是在Charles Calvert博客的这篇文章中解释说,所有这些都是在foorapo之前创buildtrunk目录。

我遇到了这个问题,并最终使用svndumpfilter2。

具体来说,这个命令:

 sudo svnadmin dump /home/setup/svn/repos/main_repl | sudo ./svndumpfilter2.py /home/setup/svn/repos/main_repl Development QA compliance > ~/main_repl_dump.trim 

但是,由于我在虚拟机上运行svn,所以出现了内存不足的问题,我只是把内存提高到了2G。 虽然我意识到这可能不是每个人的select,但我注意到它的运行速度比512M 快。 (2G可能没有必要)。

目前正在处理修订18,631。

如果有人想知道,我需要打破部分回购的原因是因为我们正在创build标签/副本以分发到执行回购的另一个path中的文件。 出于某种原因,这个过程导致回购气氛膨胀到很大的比例。 (我们现在在17G。)

我在Debian Lenny 5.0.4的SVN版本1.5.6上做了这个复制回购。

为什么不复制整个存储库,将其转储到新的存储库中。 然后分出树干,删除头部,并将你想要回收的部分合并到树枝上。 然后你保留了历史logging,并将你想要的部分拆分成一个新的存储库。

  1. 转储到/ trunk
  2. 分行/主干/分行/主干
  3. 删除/中继
  4. 合并/ branches / trunk /不pipe回到/ trunk还是/ trunk / whatever

这样你就可以保留所有的历史,并有select地挑选你想要的部分。

这可能会帮助你:引用http://svnbook.red-bean.com/en/1.5/svn.reposadmin.maint.html#svn.reposadmin.maint.replication

在Subversion 1.5中,svnsync增加了镜像库的一个子集而不是全部的能力。 设置和维护这种镜像的过程与镜像整个存储库的过程完全相同,只是在运行svnsync init时不是指定源存储库的根URL,而是指定该存储库中某个子目录的URL。 同步到该镜像现在将只复制在该源存储库子目录下更改的位。 但是,这种支持有一些限制。 首先,您不能将源存储库中多个不相交的子目录镜像到单个镜像存储库中,而是需要镜像某些通用的父目录。 其次,过滤逻辑完全是基于path的,所以如果你正在镜像的子目录在过去的某个时刻被重命名,那么你的镜像将只包含修改,因为目录出现在你指定的URL上。 同样,如果以后将源子目录重命名,则在指定的源URL不再有效的时候,同步过程将停止镜像数据。

当然的问题是失去了预先更名历史…

我也在寻找这个问题的答案(不得不自己处理)。 基于Alex的回答,我发现http://furius.ca/pubcode/pub/conf/common/bin/svndumpfilter3.html声称修复了一些svndumpfilter2问题。; 我相信这是一个部分的解决scheme。

好:

在纯Python中重写Subversion的svndumpfilter,它允许你在排除和包含的文件/目录集之间解开移动/复制操作,把它们转换成附加的。 如果使用此选项,它将从给定的存储库中提取原始文件。

关心:

重要

有些人一直在报告这个脚本的一个错误,它会在一个大的版本库上创build一个空文件。 对于我在版本库中必须做的分割工作非常有效,但我没有时间解决其他人的版本库中出现的问题

这是一个疯狂而又疯狂的过度复杂事情,但是如何使用git-svn / tailor将SVN repo导入到git中,使用git-split拆分目录,然后使用git-svn将其导出到svn / 裁缝 ?

陷入这个问题,发现这个工具svndumpsanitizer它似乎工作得很好,我能够将它创build的文件导入到一个新的存储库。

具体的命令如下,我将假定该存储库托pipe在http(s)://服务器上,尽pipe相同的命令将适用于svn://或file://。

 svnadmin dump /path/to/repository > dumpfile svnadmin create /path/to/new_repository svnadmin load /path/to/new_repository < dumpfile svn co https://localhost/svn/new_repository_url new_repository_checkout cd new_repository_checkout svn move https://localhost/svn/new_repository_url/trunk https://localhost/svn/new_repository_url/branches/head -m "Moving HEAD to branches" svn move https://localhost/svn/new_repository_url/branches/head/whatever https://localhost/svn/new_repository_url/trunk -m "Creating new trunk" svn update cd branches svn remove head svn commit 

您现在应该从旧存储库中获取所需的部分作为新存储库的中继。

我现在看到这个比较老,但是添加“–skip-missing-merge-sources”有帮助吗? 看起来好像可能…

如果你不需要整个历史,你可以在错误发生后立即提取。 如果您的错误是在修订版412,那么您可以尝试使用以下方法进行拾取:

 svnadmin dump /path/to/repo -r 413:HEAD > largerepo.dump 

我意识到这可能不是一个完美的解决scheme,但它可能会足够你的情况。

您可能也想要一步完成这一切

 svnadmin dump /path/to/repo -r 413:HEAD | svndumpfilter include my/directory > mydir.dump 

一些关于svndumpfilter的更多信息,以及如何解决 – http://blog.rlucas.net/uncategorized/some-gotchas-with-using-svndumpfilter/

或者你可以尝试svndumpfilterreplace脚本,现在叫做svndumpfilter2 – http://cogo.wordpress.com/2009/03/10/problems-with-svndumpfilter/

我没有试过这个脚本,因为我需要一些时间做一个回购备份,testing中(我有一个备份转储玩,但在Windows上,这是一个Linux脚本)。

刚刚遇到了这个问题,并写了一个脚本来重试转储,直到所有无效的源path解决。

 #!/usr/bin/env ruby require 'open3' include Open3 paths = [ "/your/path" ] command = "" new_path = "xx" while (! new_path.nil?) lines = nil popen3(" svndumpfilter include #{paths.join(' ')} > svn.result.dump < svn.original.dump") do |i, o, err| i.close puts "Processing, please wait ..." lines = err.readlines end new_path = nil lines.each do |line| if line =~ /Invalid copy source path '(.*)'/ new_path = $1 end end puts "Adding #{new_path}" paths << new_path end 

基于ng。的答案,但过滤和删除空的修订版。

步骤1.转储和过滤:

 svnadmin dump /path/to/repository > fulldumpfile svndumpfilter include trunk/the/part/you/want --drop-empty-revs --renumber-revs < fulldumpfile > dumpfile 

第2步。创build新的回购。 (请注意,这也可以使用Tortoise SVN完成)

 svnadmin create /path/to/new_repo 

请记住添加任何你需要能够结帐(权限等)。

步骤3.签出并添加基础文件夹(也可以使用Tortoise SVN完成)

 svn checkout http://localhost/new_repo /some/checkout/path/newrepo cd /some/checkout/path/newrepo # to be able to create "trunk/the/part/you/want" you will need to add parent dir: mkdir -p trunk/the/part/you svn add trunk svn commit -m "old base" 

第4步。加载过滤的转储

 svnadmin load /path/to/new_repo < dumpfile 

第5步。将旧的根目录移动到新的根目录(也可以用Tortoise SVN完成)

 cd /some/checkout/path/newrepo svn update svn move trunk/the/part/you/want/* trunk/ svn move tags/the/part/you/want/* tags/ svn move branches/the/part/you/want/* branches/ svn commit -m "re-structure base" 

您现在应该从旧存储库中获取所需的部分作为新存储库的中继。

我们开发了Subdivision ,一个用于分割svn仓库的GUI工具。

细分分析存储库,并计算文件在存储库中复制和移动时的历史logging。 使用这些信息,您的select会被智能地增强以避免所有“无效的复制源path”错误。

除了拆分存储库之外,还可以使用Subdivision从存储库中删除文件以及将文件和文件夹提取到新的存储库中。

对于小型软件仓库,细分是免费的。