【问题标题】:Space in branch name causing SVN to GIT migration issues分支名称中的空格导致 SVN 到 GIT 迁移问题
【发布时间】:2018-05-17 15:58:18
【问题描述】:

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

我在 Google 和 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\refs\remotes\svn
  • .git\refs\remotes\svn
  • .git\logs\refs\remotes\svn

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

最后我找到了this post,它专门针对分支,但解决方案是编辑packed-refs 文件并将%20 替换为空格。虽然我没有看到这里列出的VS2010%20Port 分支,所以我无法通过这个解决方案。

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

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

【问题讨论】:

  • 您的问题解决了吗?
  • 我会更新问题。
  • 如果直接使用git svn clone命令呢?
  • 我现在正在测试的 :D
  • 使用命令git svn clone https://my/svn/url --trunk='trunk' --branches='branches' --tags='tags'可以将所有分支迁移到git repo中(包括VS2010 Port)。而如果要切换到分支VS2010 Port,可以使用命令git checkout -b branchname remotes/origin/VS2010%20Port。如果迁移过程中有任何问题,请随时告诉我:)

标签: git version-control git-svn svn2git


【解决方案1】:

看起来这个 svn2git 脚本支持“--branches”选项,您可以在其中传递要导入的 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 命令。

【讨论】:

  • 是的,对于我遇到的其他问题,我已经不得不修改 svn2gitmigration.rb 文件。我相信我确实尝试了 --nobranches 选项(没有运气),但我没有使用 --trunk 选项。我目前正在搞砸的一件事是我自己调用git svn fetch 并使用--ignore-refs 标志(因为svn2git 不使用该标志)来忽略.*VS2010.*。到目前为止,它运行没有问题,所以我祈祷。
  • 到目前为止,我使用--ignore-refs 选项取得了最大的进步。
【解决方案2】:

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

【讨论】:

  • 因为 git clone 比 init 然后 fetch 做更多的工作;)一般来说 clone 做一个 init,添加一个远程,做一个 fetch,然后是你 repo 的主分支的结帐克隆。 git svn 在组合中添加了一些 perl,但行为确实没有任何不同。您之前没有看到任何文件,因为结帐部分可能从未发生过。
猜你喜欢
  • 2018-11-17
  • 2016-02-02
  • 2020-01-19
  • 2016-11-24
  • 1970-01-01
  • 2019-06-24
  • 2016-08-18
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多