hg版本库迁移到git版本库

一.背景     

之前有些老的项目采用的是hg进行版本管理,现在打算将这些采用hg 管理的老项目采用git来进行版本管理。所以就需要进行hg 到git的迁移。

     这里使用fast-export的转换工具实现这一过程。fast-export是一个用Python开发的命令行工具,可以将本地的Hg版本库迁移为Git版本库。其原理和CVS版本库迁移至Git时使用的cvs2git相仿,都是先从源版本库生成导出文件,再用Git的通用版本库转换工具git fast-import导入到新建的Git版本库中。

二. 下载fast-export

安装fast-export非常简单,只要用Git克隆fast-export的版本库即可。


$ git clone git://repo.or.cz/fast-export.git

完成克隆后,会看到/path/to/fast-export目录中有一个名为hg-fast-import.sh的脚本文件,该文件封装了对相应Python脚本的调用。使用该脚本可以实现Hg版本库到Git版本库的迁移。

三. 迁移

1.检查hg项目

进入到要转换的Hg项目中的.hg目录下。

执行hg heads

cd /home/sk/old_hg_code/.hg

hg heads 
结果:

changeset:   14956:dc25795a3ab9
parent:      14950:35a8c04026d9
user:        xxxxxx
date:        Mon May 25 16:53:33 2020 +0800
summary:     默认的default分支

changeset:   14955:b60d9c82099a
branch:      dev_pbs_web_4.11.0
parent:      14952:326dfaa96134
user:        xxxxxxxx
date:        Thu May 21 17:53:26 2020 +0800
summary:      xxxxxxxxx

。。。。。。。。。。

因为Hg不支持真正的分支,而且版本库中可能存在尚未合并的多个头指针。检查一下不要存在具有相同分支名但尚未合并的多个头指针,否则转换会失败。

四.创建一个新的git仓库

  这一步创建一个新的 Git 仓库,然后运行导出脚本:

$ git init /home/sk/new_git_code
$ cd /home/sk/new_git_code
$/home/sk/fast-export/hg-fast-export.sh -r /home/sk/old_hg_code -f

-r 选项告诉 hg-fast-export 去哪里寻找我们想要转换的 hg 仓库,这个脚本会分析 Mercurial 变更集然后将它们转换成 Git“fast-import”功能(我们将在之后详细讨论)需要的脚本。 这会花一点时间(尽管它比通过网格  快),输出相当的冗长:

Exporting tag [tag_pbs_4.10.0_test_rev3] at [hg r14879] [git :14880]
Exporting tag [tag_pbs_4.9.1_release_rev1] at [hg r14889] [git :14890]
Exporting tag [tag_pbs_4.10.0_test_rev4] at [hg r14899] [git :14900]
Exporting tag [tag_pbs_4.9.1_hotfix_rev1] at [hg r14901] [git :14902]
Exporting tag [tag_pbs_4.9.1_release_rev2] at [hg r14904] [git :14905]
Exporting tag [tag_pbs_4.9.1_release_rev3] at [hg r14917] [git :14918]
Exporting tag [tag_pbs_4.10.0_test_rev5] at [hg r14924] [git :14925]
Exporting tag [tag_pbs_4.10.0_test_rev6] at [hg r14927] [git :14928]
Exporting tag [tag_pbs_4.10.0_test_rev7] at [hg r14930] [git :14931]
Exporting tag [tag_pbs_4.10.0_test_rev8] at [hg r14937] [git :14938]
Exporting tag [tag_pbs_4.10.0_test_rev9] at [hg r14940] [git :14941]
Exporting tag [tag_pbs_4.10.0_test_rev10] at [hg r14943] [git :14944]
Exporting tag [tag_pbs_4.10.0_test_rev11] at [hg r14946] [git :14947]
Exporting tag [tag_pbs_4.10.0_release_rev1] at [hg r14949] [git :14950]
Issued 16769 commands
fast-import statistics:
---------------------------------------------------------------------
Alloc'd objects:     125000
Total objects:       121600 (    214832 duplicates                  )
      blobs  :        45620 (    157175 duplicates      34096 deltas of      45341 attempts)
      trees  :        61022 (     57657 duplicates      52581 deltas of      58224 attempts)
      commits:        14958 (         0 duplicates          0 deltas of          0 attempts)
      tags   :            0 (         0 duplicates          0 deltas of          0 attempts)
Total branches:        2297 (      1556 loads     )
      marks:        1048576 (     14958 unique    )
      atoms:          15071
Memory total:         13462 KiB
       pools:          4673 KiB
     objects:          8789 KiB
---------------------------------------------------------------------
pack_report: getpagesize()            =       4096
pack_report: core.packedGitWindowSize = 1073741824
pack_report: core.packedGitLimit      = 35184372088832
pack_report: pack_used_ctr            =      54354
pack_report: pack_mmap_calls          =      11691
pack_report: pack_open_windows        =          1 /          1
pack_report: pack_mapped              =  378083972 /  378083972
---------------------------------------------------------------------

转换完毕,执行git branch会看到Hg版本库中的具名分支都转换为相应的分支,没有命名的缺省头指针转换为master分支。

(base) sk@sk:~/new_git_code$ git branch
  dev_bs_3.10.0
  dev_bs_3.10.1
  dev_bs_3.10.2
  dev_bs_3.11.0
  dev_bs_3.12.0
  dev_bs_3.12.1

在转换后的Git版本库目录中,保存了几个用于记录版本库转换进度的状态文件(.git/hg2git-*),当在Git工作区不带任何参数执行hg-fast-export.sh命令时,会继续增量式的进行转换,将Hg版本库中的新提交迁移到Git版本库中。

  最后将当前分支切换到某个你要使用的分支,然后就可以看到git中这个分支的代码了。

如果转换过程中报以下的错误,可以按照下面的解决方法解决。

问题一
Error: Branch [master] modified outside hg-fast-export:
f8b24a1a35786cfcbb911592f4ad002ff76d4fae (repo) != None (cache)
解决:目标目录的git版本库不纯净,必须是空目录直接 git init 之后的。

问题二
repository has at least one unnamed head: hg r49
解决:加 -f 处理

问题三 - 日志乱码
解决:修改hg-fast-export.py,对日志进行编码转换(170行左右)
(revnode,_,user,(time,timezone),files,desc,branch,_)=get_changeset(ui,repo,revision,authors)
desc = desc.decode('gbk').encode('utf-8')
branch=get_branchname(branch)

问题四 - 中文文件名乱码
解决:修改hg-fast-export.py,对文件名进行编码转换(134行左右)
开头加入:
reload(sys)
sys.setdefaultencoding('cp936')
找到:
wr('M %s inline %s' % (gitmode(manifest.flags(file)),file))
改为
wr('M %s inline %s' % (gitmode(manifest.flags(file)),file.encode('utf-8')))

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值