使用移动和重定位的提交迁移git svn提交

时间:2014-04-29 20:30:50

标签: git svn git-svn

我们正在尝试将我们的主源代码库从svn迁移到git 我的第一次尝试是简单地做一个git svn克隆。克隆完成后,我发现第一次提交是在2012年11月。我知道这个代码已经有几年了 检查svn repo看起来好像是第一次提交主目录发生在2012年11月,而repo中的几个文件已经提交了多年。那么如何在父目录之前提交目录中的文件..

我告诉周围,因为我是公司的新人,没有人确切知道,但是这个回购经历了一些svn重新定位和svn以不寻常的方式移动,例如他们发展成一个分支然后移动了分支作为主干内的目录,或者发展成分支,然后将该分支重命名为trunk等。

我选择了2012年11月之前发生的旧提交之一,可以使用git log查询并尝试

svn up -r 599 http://myrepo/trunk

并收到错误:

svn: E195012: Unable to find repository location for 'http://myrepo/trunk' in revision 559

此错误对于2012年11月之前的所有提交都是可重现的,即那些可以使用svn日志查询但无法检出的提示

好消息是我可以做类似的事情:

svn diff -r 599 http://myrepo/trunk

我的下一个方法是使用svn diff运行所有提交,创建补丁并使用原始作者,日期等将它们应用于git ...

如何更好地提取如何提取此类已损坏的提交?

我没有物理访问回购,我不能使用svnadmin

修改1:

事实证明我没有查询根目录,而是在树下一层,这就是我遇到这样的错误的原因。 无论如何我做了一个svnrdump并成功转储了整个存储库(> 32K提交),而且repo包含了我必须跳过的损坏的提交。

此外,它已在本地导入。这有助于我进一步了解发生的事情

基本上,回购曾经有一个非常混乱的结构,比如

svn 
   |_Project1 
         |_subproject1 
               |_branches 
                      |_branch1 
                      |_branch2 
               |_trunk 
               |_tags 
                      |_tagv1 
   |_Non-JavaProject 
         |_subproject 
   |_Project2 
          |_AnotherSubproject 
               |_SubSubproject 
          |_Subproject2 
               |_branches 
               |_tags 
          |_Subproject3 
               |_trunk 
          |_Subproject4 
               |_Subsubproject 
                       |_branches 
                       |_tags 
                       |_trunk

之后发生的事情是,使用svn mv和copy的混合,结构有点精炼

SVN     | _mainProject          | _trunk          | _branches          | _tags

所以现在我们有像

这样的路径
mainProject/trunk/_Project1
mainProject/trunk/_Project1/subproject1
mainProject/trunk/Project2/AnotherSubproject/SubSubproject 

分支/标签也是如此

换句话说,我需要在fetch和其他头文件中的.git / config中定义一个方法,以便mainProject的不同目录将遵循不同的(多个)旧路径

这可能吗?

1 个答案:

答案 0 :(得分:0)

在SVN分支中,包括中继基本上只是存储库中的目录。在r599之前,您可以通过在详细模式下运行SVN repo根目录登录来确定文件的位置。即svn log -v http://myrepo/@599它将向您显示所有提交和他们在该存储库中的r599之前触及的路径,包括提交到分支,重命名等。其中一个将是移动目录的提交。这将帮助您在提交之前文件所在的位置,并且可以从旧位置签出以前的修订版。