欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用 fast-export 将代码库由 Hg(Mercurial) 迁移至 Git

程序员文章站 2022-03-20 13:33:04
...

问题描述

由于生产需要,代码托管库由Hg全面倒向Git,工作量很大,因此希望借助自动化工具处理。

问题解决

找工具

网上搜索很快发现fast-export能实现想要的功能,并且有在官方文档Git Book中提及,因此决定使用该工具完成迁移工作。

环境准备

依据fast-exportREADME文档描述,我们需要:

Python 2.7 or 3.5+, and the Mercurial >= 4.6 package (>= 5.2, if Python 3.5+)

我这里使用的Python 版本为3.9,Mercurial版本5.4.2.

  1. 下载安装Python并设置好环境变量(如果用的是miniconda或者anaconda,将对应的Python路径设置好);
  2. 安装Mercurial;
  3. 安装Python扩展:
pip install Mercurial

脚本准备(注意所有的命令都是在 git bash 下执行的)

Mercurial的官方用户手册提供了最简单的hg的库,可以先以这个库为demo测试各种情况,比如用户名为中文,message为中文,或者文档本身为中文等等。

  1. 生成authors映射文件
    fast-exportREADME下有提到hg-export-tool,根据文档描述,该工具可以用来生成authors映射文件。
  2. 将源码下载下来,根据example,我们可以生成hg repository对应的authors.map
    首先要编辑repo_mapping.json,example中提供的如下:
    使用 fast-export 将代码库由 Hg(Mercurial) 迁移至 Git
    其中.hg代表hg repository路径,.git代表git的,这里git可以先不创建。我们仿写repo_mapping.json
    然后在git bash中执行下面的命令:
python list-authors.py repo_mapping.json

如果找不到路径可以使用绝对路径,注意地址分割为/而非\
author中如果有中文并且报错,则修改list-authors.py中的decode方式为gbk
3. (如果报错)同理修改hg2git.pyget_git_sha1函数的decode方式为gbk
4. git创建库

git init
git config core.ignoreCase false
  1. 执行命令:
E:/TestDir/fast-export-201029/hg-fast-export.sh -r E:/TestDir/my-hello --force -A E:/TestDir/authors.map -fe gbk

其中--force属性设置是为了解决hg中的multiple heads的问题,-fe gbk是为了解决中文乱码的问题;
6. 执行:

git checkout HEAD
  1. 迁移完成。

总结

不知道是福是祸,一切中文问题都起源于hg的默认用户设置,有<未指定>这样的描述:
使用 fast-export 将代码库由 Hg(Mercurial) 迁移至 Git
英文对应<unspecified>,在某个issue中有人提到,但是被作者回怼回去了,不是bug,你们要自己维护好map文件????:

Missing < in ident string…

其实并不是因为没有指定好,而是因为是中文不认识,所以失效了。绕了一圈回来,只需要解决乱码的问题就可以了。
如果生成失败了,可以在.git文件夹下查找日志。
中文tag可能还是乱码,不过tag可以删了重新打,不碍大事;