Convert a Mercurial Repository to Git
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
-
Open cmd.exe
-
mkdir c:\git_work
-
cd c:\git_work
-
git clone http://repo.or.cz/r/fast-export.git
This creates folder: c:\git_work\fast-export\ -
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
-
mkdir MyNewGitRepo
-
Copy content of fast-export to MyNewGitRepo, ignore .git*
-
hg-fast-import.sh -r c:\Path\To\MyOldHgRepo
-
If this fails with "Error: repository has at least one unnamed head..." call the last line with parameter: --force
-
Remove the migration scripts:
git clean -n # see what would happen git clean -f # delete migration files
-
Restore missing files by resetting the index and working tree.
git reset --hard
Related videos on Youtube
![Tigraine](https://i.stack.imgur.com/ms28d.jpg?s=256&g=1)
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, 2021Comments
-
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 almost 15 yearsThanks, but unfortunately I didn't find a way to make git apply those patches and preserve the commit message.
-
Ry4an Brase almost 15 yearsReally? 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 almost 15 yearsI 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 almost 12 yearsThis 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 getImportError: cannot import name repo
-
hieubk over 11 yearsThanks, 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 about 11 yearsThis 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 almost 11 yearsThe 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 aboutfast-export.git
potentially clashing with files from your original repo. -
Nowhere man almost 11 yearsWell, 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 over 10 yearsI 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 over 10 yearsIt is stressing me out just reading this well-organized post. Will try.
-
tofutim over 10 yearsI needed ez_setup.py (missed step)? Now waiting for VS2008 to come down from MSDN. Sheesh...
-
Trey Gramann over 10 yearsPlease update if I missed a step. This was from notes I took over the several weeks of trying to get this to work.
-
dpdearing about 10 yearsFYI, when running
hg-fast-export.sh
I got the error messageError: 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 almost 10 yearsAfter 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 almost 9 yearsI think the hggit extension has been renamed to just git.
-
Isochronous over 8 yearsYou 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 over 8 yearsNo, it hasn't. Thankfully it looks like Remi figured out the problem, as she has the correct solution posted as another answer.
-
jeremysawesome over 7 yearsThis worked well. Before step 10 you should
git checkout HEAD
because the export doesn't do that automatically. -
Tim Friesen over 7 yearsNote that the new Mercurial URL is www.mercurial-scm.org.
-
BMW almost 7 yearsThanks, 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 over 6 yearsCan 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 about 5 yearsDid 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.