如何将Mercurial特定分支的变更拉取到Git并保留历史?
将Mercurial分支变更同步到Git并保留历史记录
方法一:通过Git直接拉取Mercurial分支变更
这种方式需要先确保Git环境安装了git-remote-hg工具(多数包管理器可直接安装,比如apt install git-remote-hg或brew install git-remote-hg)。
进入已有的Git本地仓库,添加Mercurial仓库作为远程源:
git remote add hg-origin hg::<Mercurial仓库地址> # 本地Mercurial仓库示例:hg::/Users/xxx/local-hg-repo # 远程Mercurial仓库示例:hg::https://hg.example.com/project-repo拉取Mercurial特定分支的完整历史到Git本地新分支:
git fetch hg-origin <Mercurial分支名>:<Git本地临时分支名> # 示例:拉取Mercurial的dev分支到Git本地hg-dev-sync分支 git fetch hg-origin dev:hg-dev-sync合并到目标Git分支(比如主开发分支main):
git checkout main # 用--no-ff参数保留分支合并历史,便于追溯 git merge --no-ff hg-dev-sync -m "Merge changes from Mercurial dev branch"若合并出现冲突,手动解决冲突后执行
git commit完成合并即可。
方法二:通过Mercurial的hg-git扩展推送变更
如果更熟悉Mercurial操作,可使用hg-git扩展完成同步:
编辑Mercurial配置文件(全局的
~/.hgrc或仓库本地的.hg/hgrc),启用hg-git扩展:[extensions] hggit =克隆Git仓库作为Mercurial镜像仓库:
hg gitclone <Git仓库地址> hg-git-mirror cd hg-git-mirror拉取原Mercurial仓库的目标分支变更:
hg pull -r <Mercurial分支名> <原Mercurial仓库地址> hg update <Mercurial分支名>推送到Git仓库对应的分支:
hg push git::<Git仓库地址> <Mercurial分支名>:<Git目标分支名>
后续预防措施
为避免再有人提交到Mercurial,可采取以下手段:
- 将Mercurial仓库设置为只读权限(比如服务器端修改权限);
- 在Mercurial仓库添加提交钩子,阻止提交并提示切换到Git:
在仓库的.hg/hgrc中添加:[hooks] precommit = echo "⚠️ 该仓库已迁移至Git,请使用Git提交代码!" && exit 1
内容的提问来源于stack exchange,提问作者hookenz
相关产品推荐
相关产品推荐

