将Mercurial文件夹转换为Git存储库


137

我在Mercurial方面没有丰富的经验,我主要是个Git家伙。

我很想在git Repository中镜像特定的Mercurial文件夹/文件。我实际上想做的是将文件的历史记录从Mercurial存储库导出到Git,并能够使其与将来的提交保持同步。

您对如何进行有任何建议吗?我认为,应该采取的方法是获取Mercurial补丁程序的历史记录,定期将每个提交提交为补丁程序,并将Mercurial补丁程序应用于Git存储库。


如今,GitHub.com将为导入它。
布拉德·图瑞克

Answers:


125

Linux或任何具有bash/sh或类似的东西,或上python,尝试快速导出

cd
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD

1
好的,您想保持git与mercurial同步吗?像这样
Yohann 2012年

1
请注意,“ / path / to / old / mercurial_repo”必须是文件系统上的路径(而不是URL),因此您必须先克隆原始存储库。
2013

1
就我而言不得不使用PYTHON=python2 ~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo。除此之外,它可以完美地工作。
Artur Czajka 2014年

5
感谢您的简洁回答!我必须sudo easy_install mercurial先。会很高兴在指示中
Marcus Westin

3
如果您使用的是Windows计算机,请使用Git bash并运行hg-fast-export.sh
Augustas

61

Windows:TortoiseHG Hg-Git扩展

Hg-Git可用于将Mercurial存储库转换为Git。您可以使用通过SSH,HTTP或HTTPS访问的本地存储库或远程存储库。

本地存储库转换示例。

  1. 安装Hg-Git。

    • 在Windows上,虽然您需要通过设置工具(在扩展部分中)启用它,但TortoiseHg随Hg-Git一起提供。

      TortoiseHg设置

      或手动 ~/mercurial.ini

      [extensions]
      hggit =
      
  2. 使用以下命令来转换存储库:

    $ mkdir git-repo; cd git-repo; git init; cd ..
    $ cd hg-repo
    $ hg bookmarks hg
    $ hg push ../git-repo
    

hg书签是必要的,以防止问题的发生另有HG-混帐推到当前已签出分支混淆的Git。这将hg在Git存储库中创建一个分支。要获得master的更改,请使用以下命令(仅在第一次运行时才需要,以后只需使用git merge或即可rebase):

$ cd git-repo
$ git checkout -b master hg

我发现git-hg有很多问题,但是这就像一个魅力,不需要任何额外的下载,这很好。
Timmmm 2015年

2
我想要一个文件夹,而不是整个仓库。
西蒙妮·卡莱蒂

github现在有一个直接从github支持此功能的工具,请参阅stackoverflow.com/questions/16037787/…–
Tommy

@SimoneCarletti看看这个问题。它应该可以帮助您在临时存储库中导出文件/文件夹及其历史记录。然后,您可以使用提供的任何解决方案将临时Mercurial存储库转换为Git。
naXa

13

您可以(从Mercurial方面):

  • 使用带有选项的转换扩展名--filemap仅将需要的文件|目录转换为原始存储库的一部分
  • 与hg-git扩展推剥离回购到Git

或(而不是hg-git),使用Git中的Mercurial桥,从Git克隆|拉存储库


11

Gitify

似乎是一种更现代且易于使用的替代方法来执行转换 https://github.com/buchuki/gitifyhg

pip install gitifyhg
git clone gitifyhg::<hgrepoaddress>
# done, you have a git repo with the entire history of the hg one

1
我不想转换整个存储库,而只是转换一个文件夹。
Simone Carletti 2015年


3
注意-gitifyhg当前严重滞后于最新的Mercurial版本。
Zoran Pavlovic

4

在Windows 10上将Mercurial存储库转换为Git

如果编码没有问题-请使用TortoiseHG Hg-Git扩展

md new-repo && cd new-repo
git init --bare .git
cd ..\old-mercurial-repo
hg bookmark -r default master
hg push ..\new-repo
cd ..\new-repo
git config --bool core.bare false

如果编码有问题-请使用快速导出

安装Bash

以管理员身份打开PowerShell并运行:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Microsoft Store安装Ubuntu 16.04 LTS

打开Bash并运行

安装

sudo -s
apt-get update
apt install mercurial

获得快速导出v180317(目前180317之后的版本无法正常运行)

cd /mnt/c/path_to_work_folder
git clone https://github.com/frej/fast-export.git
cd fast-export
git checkout tags/v180317
cd ..

转换资料库

git init new-repo && cd new-repo
git config core.ignoreCase false && git config core.quotepath off
../fast-export/hg-fast-export.sh -r ../path_to_mercurial_repo/ --fe cp1251
git checkout master

编码选项:

  • -f 编码,例如 -f cp1251
  • --fe 文件名编码像 --fe cp1251

3

hg-git-fast-import

https://github.com/kilork/hg-git-fast-import

另一个具有以下功能的实用程序:

  1. 将单个和多个Mercurial存储库导入到Git存储库。
  2. 从先前导入的Mercurial存储库中将新修订版导入到Git存储库中。
  3. 标签。
  4. 封闭的分支机构。
  5. 用diff验证最终结果。

您可以为平台下载二进制文件,然后将其放置在路径中或使用cargo(需要安装rust进行安装

cargo install hg-git-fast-import

然后用法是这样的:

hg-git-fast-import single /path/to/source_hg /path/to/target_git

它不需要PythonMercurial安装。高级配置允许替换作者或分支,为分支加上前缀等。


2

如果您使用的是github.com,它们似乎具有导入功能,可让您简单地输入hg项目的URL。

首先创建一个新的存储库,然后在新存储库的登录页面上滚动到底部,然后单击“导入代码”按钮

导入代码按钮的上下文

然后键入您以前的存储库URL,然后单击“开始导入”。

“开始导入”按钮的上下文

然后GitHub负责其余的工作!

Github为您做生意

请注意,如果需要,GitHub将要求您提供旧存储库的凭据。

哦!我找到了官方指南


0

在Windows上可能会有些棘手。在mercurial(hggit)中启用正确的插件后,也可以使用TortoiseHG。

  1. 克隆汞回购
  2. 克隆git回购
  3. 启用控制台: 启用控制台
  4. 使用控制台:

    % hg bookmarks hg

    % hg push <relative path to>/<git-repo>


0

也许今天对某人有帮助(在将历史存储库转换为git的同时保留历史记录)。经测试可与Mercurial 4.0.1一起使用。

~$ git clone https://*old_hg_repo*
~$ git clone https://github.com/frej/fast-export.git
~$ cd fast-export
~$ git checkout tags/v180317
~$ cd ..
~$ mkdir new_git_repo
~$ cd new_git_repo
~$ git init
~$ .../fast-export/hg-fast-export.sh -r ../old_hg_repo/ --force
~$ git checkout HEAD

最后,推动您新转换的本地存储库。

~$ git push REMOTE '*:*'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.