Convert a Mercurial Repository to Git

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.

Thanks in advance!

Answers


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

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!!!)

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://git@github.com/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 git@github.com:bolinfest/plovr.git

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.


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\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
    

If you happen to be using GitHub and your Mercurial repo is available via HTTP/HTTPS...

In the course of using fast-import (a great tool, that converted my repo without issue) and pushing my new git repo from my dev box to GitHub, I noticed an option to "Import Code from Another Repository" during the "Quick Setup" portion of my git repo on GitHub.

I tested it out and achieved the same results as using fast-import. Using the GitHub import option turned out to be a bit easier in my case than fast-import (again, nothing against that tool, and no, I don't work for GitHub). The steps which worked for me were:

  1. Create a new GitHub repo
  2. Choose the "Import Code" option in Quick Setup once the repo is created
  3. Enter the URL of a publicly available hg, svn, or tfs repo and press "Begin import" in the "Github Importer" dialog

If you're really only looking to do it this once you can use hg export like this:

hg export 0:tip -o all-changesets-in-one.patch

or if git prefers only one patch per file you can create one per changeset like this:

hg export 0:tip -o changeset-%r.patch

presumably git apply can take one or the other of those formats.


Have you tried tailor? It can pretty much convert anything to anything, as VCS go, and is even able to do it incrementally (that is, you convert once, then add new commits from the source to the target, without reconverting from scratch). You may not need it now, but it still is a nice feature.


An easy way to convert between Git & Hg with no local process is to open a free KilnHg / Fogbugz account, create a private repo, push one format to it then pull in the other format, it works with both Git & Hg and (should) do seamless conversions.


I tried some of the other answers here and didn't have much luck. Here is the pretty straightforward method that what worked for me, after much trial and error:

First, download the hggit extension and add it to your ~/.hgrc or mercurial.ini file if you have not already done so:

[extensions]
hggit=\path\to\hg-git

For each branch you want to bring over to Git, add an Hg bookmark to the tip of the branch:

hg bookmarks hg-default

Then use hggit to create a git repo in the same folder as your current Hg repo by running hg gexport. A .git folder will have been added as a result. When you then delete the .hg folder from your repo, you will be left with a local git repo.


There doesn't seem to be any reason you can't run hg2git on windows. It's python which has a windows port. Just make sure the proper libraries are there and run it on the window box.


If anyone is using Homebrew on OS X and wants to know the minor tweaks to get it to work properly please see the article here: http://www.ccannon.net/mercurial-to-git-conversion-with-homebrew.html


Need Your Help

In C#, What is the best way to aggregate and transform one DateTime collection into another?

c# datetime collections

I have a little calendar tool in C# and I am trying to figure out how to do a conversion from one array of DateTime objects to another. Here are the details:

RightJS Lightbox Plugin Not Working In IE

javascript jquery internet-explorer lightbox rightjs

I am using the RightJS Lightbox plugin for a Lightbox to show inline HTML data. It works perfectly in FF and Chrome but alas IE is a no-go. I had it working yesterday for a short time and have trie...