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% 运行 但我在以下位置尝试过:
- .git\svn\refs\remotes\svn
- .git\refs\remotes\svn
- .git\logs\refs\remotes\svn
当我 运行 之后的 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
选项迁移我的存储库(达到我满意的程度)。我不太清楚为什么 svn2git
或 git svn init
后跟 git svn fetch
不起作用,但最后我得到了。
我正在尝试使用 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% 运行 但我在以下位置尝试过:
- .git\svn\refs\remotes\svn
- .git\refs\remotes\svn
- .git\logs\refs\remotes\svn
当我 运行 之后的 svn2git
命令时,我最终遇到了同样的问题。
最后我找到了 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
选项迁移我的存储库(达到我满意的程度)。我不太清楚为什么 svn2git
或 git svn init
后跟 git svn fetch
不起作用,但最后我得到了。