hg 转换中止:文件名中不允许使用“\n”和“\r”:

hg convert abort: '\n' and '\r' disallowed in filenames:

我要将我的 git 存储库转换为 hg 存储库。

问题是几个月前有一个名为 'favicons/Icon\r' 的文件添加到 git 存储库,这对 git 没问题。该文件已被删除,但由于它在历史记录中,所以当 运行 hg convert 扩展名:

时我得到了这个输出
converting...
816 Favicons
transaction abort!
rollback completed
abort: '\n' and '\r' disallowed in filenames: 'favicons/Icon\r'!

有没有办法解决这个问题,还是我必须继续使用我的 git 存储库?非常感谢!

由于该路径名在 Mercurial 中无效,您必须执行以下一项或多项操作:

  • 使用跳过 "bad" 提交 and/or 文件的代码转换 Git 存储库
  • 使用替换为 "good" 文件名的代码转换 Git 存储库
  • 将 Git 存储库复制到更改后的 Git 存储库,其中没有出现文件名(删除或更改具有该文件的提交,如前两种方法,但执行它在 Git 内而不是在转换为 Mercurial 期间)。

前两个直接使用hg convert可能很容易实现。例如,the documentation 提到了通过文件名排除或重命名文件的能力。不过,我自己并没有实际尝试过。

最后一个相对容易,因为您可以使用 git filter-branch 来实现它。 "relatively easy"中的"relative"是非常相对的:filter-branch不是特别容易正确使用(只是比写一个新的[=39=容易]-to-Mercurial 转换器)。

请参阅 How to remove/delete a large file from commit history in Git repository? and Completely remove file from all Git repository commit history for examples. Note that Greg Bacon's answer 正确使用 --tag-name-filter 来调整标签(如果您的标签在复制期间更改提交的时间点或之后指向历史记录,则这是必要的)。

我是这样解决的:

echo "exclude \"favicons/Icon"$'\r'$"\"" >> omit
hg convert --filemap omit mygitrepo myhgrepo