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

使用移动和重新定位的提交迁移git svn提交,git,svn,git-svn,Git,Svn,Git Svn,我们正在尝试将我们的主要源代码存储库从svn迁移到git 我的第一次尝试是简单地做一个git svn克隆。克隆完成后,我发现第一次提交是在2012年11月。我知道这个代码已经有几年的历史了 在检查svn回购协议时,第一次提交主目录似乎发生在2012年11月,而回购协议中的几个文件在此之前已经提交了数年。那么,如何在父目录之前提交目录中的文件呢 由于我是公司的新员工,我四处询问,没有人确切知道,但这次回购经历了几次svn重新定位和svn以一种不寻常的方式移动,例如,他们发展成一个分支,然后将该分支

我们正在尝试将我们的主要源代码存储库从svn迁移到git 我的第一次尝试是简单地做一个git svn克隆。克隆完成后,我发现第一次提交是在2012年11月。我知道这个代码已经有几年的历史了 在检查svn回购协议时,第一次提交主目录似乎发生在2012年11月,而回购协议中的几个文件在此之前已经提交了数年。那么,如何在父目录之前提交目录中的文件呢

由于我是公司的新员工,我四处询问,没有人确切知道,但这次回购经历了几次svn重新定位和svn以一种不寻常的方式移动,例如,他们发展成一个分支,然后将该分支作为主干内的目录移动,或者发展成一个分支,然后将该分支重命名为主干,等等

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

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/_Project1
mainProject/trunk/_Project1/subproject1
mainProject/trunk/Project2/AnotherSubproject/SubSubproject 
分支/标记也是如此

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


这可能吗?

在SVN分支中,包括主干在内的分支实际上只是存储库中的目录。在r599之前,您可以通过在SVN repo的根目录下以详细模式运行日志来确定文件的位置。即svn日志-vhttp://myrepo/@599它将向您显示该存储库中r599之前的所有提交和路径,包括对分支的提交、重命名等。其中之一是移动目录的提交。这将帮助您确定提交之前文件的位置,您可以从以前的位置签出以前的版本。

听起来您正试图用一只手绑在背后诊断此问题。如果您无法访问实际的Subversion存储库,请查看是否可以在本地使用它的副本。至少,svnadmin转储输出的副本可能会有所帮助。但是,如果源存储库以某种方式损坏,那么转储也会损坏。svn是否会恢复http://myrepo/trunk@为你工作?有关PEG修订的详细信息,请参阅,这可能会有所帮助。我不相信svn up需要URL。您只能在工作目录上使用它。感谢您的快速评论。我现在正在本地尝试svnsync,然后执行svndump。希望我能通过svndump解决这个问题,并/或手动修复它,然后再将转储文件作为repo导入并尝试一个git svn cloneI现在将整个存储库都放在我的磁盘上,并尝试将其克隆到git中,使git知道svn的移动/复制