Space 在分支名称中导致 SVN 到 GIT 迁移问题

Space in branch name causing SVN to GIT migration issues

我正在尝试使用 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

似乎有人(很久以前)创建了一个名称中带有 space 的 b运行ch,这对进程造成了严重破坏。 运行 git branch -a 显示有问题的 b运行ch:

remotes/svn/VS2010%20Port

我在 Google 和 Whosebug 上做了一些搜索,发现了一些帖子,其中包括这个 one(尽管它指的是标签)。

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

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

接下来,我尝试了 运行 宁 mv 命令的另一个建议,将名称中带有 %20 的 file/directory 移动到实际 space:

mv VS2010%20Port VS2010\ Port

因为我的问题不在于标签,所以我不是 100% 运行 但我在以下位置尝试过:

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

最后我找到了 ,它专门针对 b运行ches,但解决方案是编辑 packed-refs 文件并将 %20 替换为 spaces。虽然我没有看到这里列出的 VS2010%20Port b运行ch,所以我无法完成这个解决方案。

有没有人对我可以尝试的事情或我可能错过的事情有任何建议?

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

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

也可以尝试 --nobranches --trunk trunk 选项,它不导入任何分支,只导入主干。

--exclude 可能没有用,因为它似乎过滤了 repo 中目录的路径,而不是分支名称。

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

请随意通读,使用 print/puts 语句对其进行调试,然后根据您的用例进行修改。

脚本基于 git svn 命令。

只是为了结束这个问题,多亏了各种评论和建议,我才能够让这个过程正常工作。最后,我离开了 svn2git,并且能够使用 git svn clone--ignore-refs 选项迁移我的存储库(达到我满意的程度)。我不太清楚为什么 svn2gitgit svn init 后跟 git svn fetch 不起作用,但最后我得到了。