本周末我将使用fast-export将一个大型 Mercurial 项目转换为 Git 。我已经测试了几次,结果很好。
我们还想将我们的源代码编码(许多带有变音符号的德语注释/字符串文字)从 ISO-8859-1 转换为 UTF-8(repo 中的所有其他非 java 文件应保持原样),并且Git 迁移为我们提供了一个机会,因为无论如何每个人都需要再次克隆。但是,我没有找到一个好的方法。
- 我已经尝试过
git filter-tree --tree-filter ...
来自SO 的评论中的方法。然而,虽然这看起来很理想,但由于存储库的大小(大约 200000 个提交,18000 个代码文件),这将花费比我周末更多的时间。我已经尝试直接从具有 72 个内核的 linux VM 上的 64GB tmpfs 卷运行它(在一个高度优化的版本中,文件列表被分块并且子列表被并行转换(使用GNU 并行)),它仍然会需要几天... - 或者,我尝试了一种简单的方法,即在任何活动分支上单独执行转换并提交更改。但是,结果并不令人满意,因为在合并或挑选预转换提交时,我几乎总是会遇到冲突。
- 现在我再次运行方法 1,但没有尝试重写所有分支的完整历史记录(
--all
as<rev-list>
),而是仅从当前活动分支可访问的所有提交,并且无法通过某些过去的提交(希望)是所有当前的前身分支(branch-a branch-b branch-c --not old-tag-before-branch-a-b-c-forked-off
as<rev-list>
)。它仍在运行,但我担心我不能真正相信结果,因为这似乎是一个非常糟糕的主意。 - 我们可以像方法 2 一样使用正常提交来切换主分支中的编码,但这又会使从/到主控的樱桃采摘修复成为一场灾难。而且它会引入很多编码问题,因为开发人员在主分支和非转换分支之间切换时肯定会忘记更改他们的 IDE 设置。
所以现在,不知何故,我觉得最好的解决方案可能就是坚持 ISO-8859-1。
有人有想法吗?有人提到,也许reposurgeon基本上可以使用它的transcode
操作来完成方法 1,其性能要好得多,git filter-tree --tree-filter ...
但我不知道它是如何工作的。