分支名称中的空格导致SVN迁移到GIT

时间:2018-05-17 15:58:18

标签: git version-control git-svn svn2git

我尝试使用svn2git(在我的Windows机器上)使用以下命令将旧的SVN存储库迁移到GIT:

svn2git https://my/svn/url --verbose --authors authors.txt

并且运行正常,直到我遇到以下错误:

fatal: Not a valid object name refs/remotes/svn/VS2010 Port
cat-file commit refs/remotes/svn/VS2010 Port: command returned error: 128

似乎有人(很久以前)创建了一个名称中带有空格的分支,这会对进程造成严重破坏。正在运行git branch -a会显示相关分支:

remotes/svn/VS2010%20Port

我在谷歌和StackOverflow上进行了一些搜索,并发现了一些帖子,包括这个one(虽然它指的是标签)。

首先,我尝试了使用git branch -r -d svn/VS2010%20Port删除分支的建议(保留此分支并不重要)然后我重新执行svn2git命令。它开始运行并最终以相同的错误失败。我还尝试删除分支并将标记--exclude '.*VS2010.*'添加到我的svn2git命令中,但这没有帮助:

svn2git https://my/svn/url --verbose --authors authors.txt --exclude '.*VS2010.*'

接下来,我尝试了另一个运行mv命令的建议,将名称中%20的文件/目录移动到具有实际空间的文件/目录:

mv VS2010%20Port VS2010\ Port

由于我的问题不是标签我不是100%在哪里运行,但我尝试了以下位置:

  • 的.git \ SVN \参\遥控\ SVN
  • 的.git \参\遥控\ SVN
  • 的.git \日志\参\遥控\ SVN

之后我运行svn2git命令时,我最终遇到了同样的问题。

最后我发现this post具体是关于分支但是解决方案是编辑packed-refs文件并用空格替换%20。虽然我没有看到此处列出的VS2010%20Port分支,但我无法使用此解决方案。

有没有人对我可以尝试的东西或我可能遗漏的东西有任何建议?

更新 通过添加--ignore-refs标志以及与VS2010 Port字符串匹配的正则表达式,我能够取得一些进展。它是一个大型存储库,所以它花了很长时间,但最终似乎完成了。不幸的是,我在目录中看不到任何文件(只是.git目录),所以我假设出了问题。我决定退后一步,再次使用git svn clone命令重新尝试,这次我从一开始就提供了--ignore-refs--ignore-paths标志。希望这次我能得到更好的结果。

2 个答案:

答案 0 :(得分:0)

看起来这个svn2git脚本支持" - 分支"选项,您可以在其中传递要导入的SVN分支的名称(相对路径)。像--branches X --branches Y --branches Z这样的东西应该导入3个分支:X,Y和Z。

同时尝试--nobranches --trunk trunk选项,它不会导入任何分支,只会导入主干。

--exclude可能无法正常工作,因为它似乎过滤了回购目录内的目录路径,而不是分支名称。

无论如何是svn2git 脚本不是一个黑盒子,它很简短,写得很好:https://github.com/nirvdrum/svn2git/blob/master/lib/svn2git/migration.rb

随意阅读,使用print / puts语句对其进行调试,并根据您的使用情况进行修改。

该脚本基于git svn命令。

答案 1 :(得分:0)

为了结束这个问题,我能够通过各种意见和建议让这个过程顺利进行。最后,我离开svn2git,我能够使用git svn clone--ignore-refs选项迁移我的存储库(达到我满意的程度)。我不清楚为什么svn2gitgit svn init后跟git svn fetch不起作用,但最终我得到了。