SVN:最小化将项目移动到自己的仓库所需的转储

时间:2014-08-27 22:00:44

标签: svn svndump svndumpfilter

我原来的问题如下。我已经尝试了一些事情,看看我是否可以让它发挥作用。

我有一个小的shell脚本,如下所示:

svnadmin dump -r108917 ./repo \
    | svndumpfilter include /KeyManagement \
          --drop-empty-revs \
          --skip-missing-merge-sources \ 
          --renumber-revs > km.svndump \

while read rev
do
    svnadmin dump -r$rev --incremental ./repo \
        | svndumpfilter include /KeyManagement \
             --drop-empty-revs \
             --skip-missing-merge-sources \
             --renumber-revs >> km.svndump
done << km.revs.txt

km.revs.txt是一个文本文件,其中只包含包含/KeyManagment项目更改的修订。

当我第一次这样做时,我以为我之后会进行过滤。但是,在转储的第一个修订版中,km.svndump的大小增加到超过68千兆字节。哎呦。在第二次尝试中,我通过svndumpfilter过滤项目。

这已经持续了一段时间(我nohup'这个并且不时地检查它。当我完成后,我得到km.svndump,显示UUID,第一个修订版和内存不足错误。显然,我的脚本没有通过要转储的第一个修订版。

任何想法如何继续?


我们有一个存储库,其中包含特殊项目,该项目与存储库的其余部分实际上不兼容。 LDAP组Development中的任何用户都可以看到整个存储库。但是,一个项目包含的信息我们只希望在该项目上工作的人看到。 (我们的KeyManagement项目)。 Repo布局如下所示:

  • /trunk - 其余回购的主干
  • /branches - 其余回购分支
  • /tags - 其余回购的标签
  • /KeyManagement - 特殊KeyManagement项目。

为避免窥探,我们使用svn_acces文件指定可以看到此内容的用户。这在维护方面造成了很多问题,我只想让KeyManagement成为一个拥有自己的LDAP访问组的独立存储库。 (我们已经有多个使用自己的LDAP组的repos。)

问题是我们的仓库中有超过175,000个修订版,其中只有124个修订版与KeyManagement项目有关。倾销所有175,000个修订版需要大约30多个小时。如果我可以直接删除我需要的修订版,我可以在几个小时内完成整个转储。

另一个问题是:

$ svn log -r108917:108918 -v $REPO
------------------------------------------------------------------------
r108917 | svnadmin | 2011-03-23 00:46:04 -0500 (Wed, 23 Mar 2011) | 1 line
Changed paths:
A /KeyManagement

New folder KeyManagement
------------------------------------------------------------------------
r108918 | svnadmin | 2011-03-23 00:47:18 -0500 (Wed, 23 Mar 2011) | 1 line
Changed paths:
A /KeyManagement/trunk (from /trunk/KeyManagement:108917)
D /trunk/KeyManagement

Move the KeyManagement
------------------------------------------------------------------------

显然,KeyManagement曾在/trunk下。我以前使用svndumpfilter进行转储和加载的经验是我必须同时转储和加载/KeyManagement/trunk/KeyMangement。说实话,我不关心/trunk/KeyManagement,因为应用程序完全重做,没有人关心代码。

据我所知,转储的第一个版本是完整版本。我有可能做这样的事情:

$ svnadmin dump -r108917:108918 old_repo > dump_file
$ svnadmin dump -r108103 --incremental old_repo >> dump_file #Revision with KeyManagement
$ svnadmin dump -r107429 --incremental old_repo >> dump_file #Revision with KeyManagement
...

$ svnadmin load --parent-dir new_repo < dump_file

然后转储与KeyManagement有关的修订版。我不关心/trunk下的版本。从那时起,该项目已经完全修订。我知道修改,我可以轻松编写一个shell脚本来执行此操作。与KeyManagement有关的任何修订都没有任何其他项目与它们纠缠在一起。

我只是不想花费40多个小时才能做到这一点。

1 个答案:

答案 0 :(得分:0)

我终于使用了svnrdump。我不得不转储所有修订版,但它允许我指定我只想要/ KeyManagement。对于svndumpsvndumpfilter,我必须指定/KeyManagement /trunk/KeyManagment,因为原始项目所在的位置。< / p>

很遗憾,您无法在svndumpfilter上使用svnrdump,并且由于所有修订都已报告,因此我无法对其进行重新编号并省略空白。

仍然svnrdump允许我只捕获一个目录,即使我无法更改其位置或跳过空修订并重新编号。