Convert a Mercurial Repository to Git

20,741

Solution 1

Did the following on my Mac to successfully export a Mercurial repo to Git (with full branches):

mkdir myrepo; cd myrepo;
git clone git://repo.or.cz/fast-export.git .
rm -rf .git .gitignore
git init
./hg-fast-export.sh -r ../path/to/local/hg/repo
git clean -f # remove fast-export files

Solution 2

Windows 7 64-bit Solution

How to convert a Mercurial repo into a Git repo.

This is one of the most asinine sequences of events I have ever had to figure out, but I am not a Python guy at all.

My Start Environment

  • Visual Studio 2010/2012
  • TortoiseHg 2.8.2; Includes Mercurial 2.6.3 & Python 2.7.3
  • Git 1.8.3

Errors I Got Along the Way

  • Could not find Python
  • Could not find Mercurial module in Python
  • Easy_Install does not exists
  • Could not compile Mercurial module

What I Did

  • Had to install Python27 stand alone (http://www.python.org/)
  • Make sure to put path in Path in Environment Variables
  • Had to install Easy_Install (http://sourceforge.net/projects/pywin32/files/)
  • Make sure the Python Scripts path is also in Environment Variables
  • And get this... Had to go to MSDN and download full version of Visual Studio 2008 and only install C++ with the 64-bit option turned on (so Easy_Install could compile the Mercurial module for Python), but I could not get it to work with the Express edition because could not find the 64-bit option.

Steps

  • In Command Console (after everything is installed)
    • C:\easy_install mercurial

(If you installed everything you should see it download and compile the Mercurial module)

  • In Git Console
    • Follow steps by @mauvis-ledford and @benno (Thanks guys!!!)

Solution 3

Here is a simple example of how to export your local clone of a Mercurial repo to GitHub.

First, add the hggit extension to your ~/.hgrc file if you have not already done so:

[extensions]
hggit =

Then run the following commands from the root of your Mercurial repository:

hg bookmark -r default master
hg push -f git+ssh://[email protected]/bolinfest/plovr.git

Personally, I had to specify -f when running hg push, though I suspect it is because I had some complicated branches in my Mercurial repo. You may not find it necessary for your migration.

Make sure that you have the git+ssh: URI to your GitHub repo rather than the git: URI. (The git+ssh: URI is a bit harder to find in the new GitHub UI.)

Depending on the size of your repo, running hg push may take awhile, so be patient. When you are done, you should be able to see your project on GitHub. In this example, my project was available at https://github.com/bolinfest/plovr.

As you would expect, now anyone can clone your public GitHub repo as follows:

git clone [email protected]:bolinfest/plovr.git

Solution 4

As of today, git distribution includes a tool to convert mercurial repositories to git, hg-to-git. If you have a recent git version installed, it is there. Worked very well for me.

Solution 5

Here are all the pieces put together for a migration on Windows.

Prerequisites

  • Git
  • Mercurial or TortoiseHg
  • Python 2.7 (3.x won't work)

During install, allow binding to .sh files.
Ensure that all tools are available in the PATH environment variable.

Migration

  1. Open cmd.exe

  2. mkdir c:\git_work

  3. cd c:\git_work

  4. git clone http://repo.or.cz/r/fast-export.git
    This creates folder: c:\git_work\fast-export\

  5. Now you need mercurial libs for python. Either get them from here or do the following steps.
    Edit c:\git_work\fast-export\hg-fast-export.py:

    import sys # move this line up here
    # Add a new line that imports [mercurial libraries][2] from this zip:
    sys.path.append(r'C:\Program Files\TortoiseHg\lib\library.zip')
    # ...above the old line:
    from mercurial import node
    
  6. mkdir MyNewGitRepo

  7. Copy content of fast-export to MyNewGitRepo, ignore .git*

  8. hg-fast-import.sh -r c:\Path\To\MyOldHgRepo

  9. If this fails with "Error: repository has at least one unnamed head..." call the last line with parameter: --force

  10. Remove the migration scripts:

    git clean -n # see what would happen git clean -f # delete migration files

  11. Restore missing files by resetting the index and working tree.

    git reset --hard

Share:
20,741

Related videos on Youtube

Tigraine
Author by

Tigraine

Hi, my name is Daniel Hoelbling-Inzko, Software Engineer at Bitmovin living in the beautiful Austrian town of Klagenfurt. In my free time I'll sometimes work on things that interest me - usually related to JavaScript, Go or Ruby. I am also one of the committers of the dotless project that makes writing good CSS in a .NET environment easy. You can find more info about dotless @ http://www.dotlesscss.com@Tigraine #SOreadytohelp

Updated on November 21, 2021

Comments

  • Tigraine
    Tigraine over 2 years

    I've already tried hg2git through fast-export and I've already tried hg-git.

    Both with no success. hg2git actually worked, but I had to ask a friend who runs a Unix machine to do it. And that messed up all the linefeeds throughout the files.

    hg-git simply failed with some libzip compression error.

    Has anyone had any success converting a hg repo to git on Windows?

    To be clear, I don't care about interop. I want to port the whole repo from hg to git, taking the history with me. I don't need to push changes back and forth - only convert once.

  • Tigraine
    Tigraine almost 15 years
    Thanks, but unfortunately I didn't find a way to make git apply those patches and preserve the commit message.
  • Ry4an Brase
    Ry4an Brase almost 15 years
    Really? Managing patches received by email is one of the things git is supposed to do well, and mercurial uses the git diff format, so I'd think with minimal massaging you could get the emailed patches applied.
  • Tigraine
    Tigraine almost 15 years
    I also have to admit that I didn't really try all that hard. It kept reporting a whitespace error in the file. Seems like "hg export --diff" isn't the same patch format after all..
  • Andrei
    Andrei almost 12 years
    This works only for Mercurial 2.2. If you have Mercurial 2.3, then try installing an older Python package, e.g. pip install mercurial==2.2, otherwise you get ImportError: cannot import name repo
  • hieubk
    hieubk over 11 years
    Thanks, this was exactly what I needed. For me this worked, hg v2.0.2, git v1.7.9.5, python v2.7.3
  • ben.snape
    ben.snape about 11 years
    This worked for me on OSX using Mercurial 2.4+20121105 and git 1.7.10.2. Also, I cloned from https://github.com/frej/fast-export rather than the repo above.
  • erickthered
    erickthered almost 11 years
    The instructions above are a little complicated; checking out fast-export into your new repo and then cleaning is a bit kludgy. Simpler would be: git clone git://repo.or.cz/fast-export.git; mkdir myrepo; cd myrepo; git init; ../fast-export/hg-fast-export.sh -r ../path/to/local/hg/repo. This way you don't need to worry about fast-export.git potentially clashing with files from your original repo.
  • Nowhere man
    Nowhere man almost 11 years
    Well, tailor had stopped being actively maintained for a while, it's no surprise. It's a bit sad because it could have been a real swiss-army knife of VCS conversion. But if you work with git, you now have a bunch of plugins that add the ability to directly clone, pull and push to antoher VCS (there are at least Subversion, Mercurial and Bazaar).
  • Tomasz
    Tomasz over 10 years
    I got hggit to move data from a local Hg repo to a local git repo, but it looks like it moved all commits across into the master branch and didn't respect the Hg branches I had. Did I miss something?
  • tofutim
    tofutim over 10 years
    It is stressing me out just reading this well-organized post. Will try.
  • tofutim
    tofutim over 10 years
    I needed ez_setup.py (missed step)? Now waiting for VS2008 to come down from MSDN. Sheesh...
  • Trey Gramann
    Trey Gramann over 10 years
    Please update if I missed a step. This was from notes I took over the several weeks of trying to get this to work.
  • dpdearing
    dpdearing about 10 years
    FYI, when running hg-fast-export.sh I got the error message Error: Branch [master] modified outside hg-fast-export: which happened because I didn’t init into a clean git repository, but was trying to fast export into an existing repo. Don't do that
  • ruuter
    ruuter almost 10 years
    After countless hours of hair pulling with fast-export, hg-git, python, cygwin and all the hopeless tutorials/errors, KlinHg did the trick painlessly. Thank You!!! And for everyone else struggling, it is not worth it. Just use KlinHg ;)
  • user975326
    user975326 almost 9 years
    I think the hggit extension has been renamed to just git.
  • Isochronous
    Isochronous over 8 years
    You don't have to install the full Visual Studio package, you just have to install the correct version of the Visual C++ Redistributable package. The 2005 version was what wound up working for me.
  • Isochronous
    Isochronous over 8 years
    No, it hasn't. Thankfully it looks like Remi figured out the problem, as she has the correct solution posted as another answer.
  • jeremysawesome
    jeremysawesome over 7 years
    This worked well. Before step 10 you should git checkout HEAD because the export doesn't do that automatically.
  • Tim Friesen
    Tim Friesen over 7 years
    Note that the new Mercurial URL is www.mercurial-scm.org.
  • BMW
    BMW almost 7 years
    Thanks, that's the simplest way to convert mercurial repo to git. I tried other solutions above, always stuck with some error messages, such as complain core.ignoreCase set, repo is not local, etc.
  • JIANG
    JIANG over 6 years
    Can anyone help me out here? When I run this script ./hg-fast-export.sh -r ../path/to/local/hg/repo I'm getting this error message. File "./fast-export/hg-fast-export.py", line 6, in <module> from mercurial import node ImportError: No module named mercurial
  • peter.hrasko.sk
    peter.hrasko.sk about 5 years
    Did not work for me. And although link-only answers are not allowed, let's add a comment only, this one solved two weeks of my headaches: helgeklein.com/blog/2015/06/… and I just had to share it with all of you.