I’ve been a bit lazy, I have to admit. When Bitbucket shuttered its support for Mercurial and then eventually deleted all Mercurial repositories, I just carried on using Mercurial locally as I am a sole developer.
However, as I am now having to use git for client work, I have become comfortable with using git (especially via the excellent TortoiseGit) so it is time to convert.
In the spirit of DataHamster, this is a quick précis of the steps needed to do conversion, with particular reference to Bitbucket.
The procedure that I followed is from Helge Klein and the reason I used it over other methods is that it does not require you to download an additional plugin or extension. It just works. Well, it did for me anyway.
You can read the whole procedure at helgeklein.com/blog/2015/06/… but I will reproduce the basic steps here in case that link ever goes dead. No copyright infringement is intended by this! I give full credit to Helge Klein and do not claim the work as my own.
This procedure assumes that you are running Windows, and you have Git for Windows installed, and that you selected “Use Git from the Windows Command Prompt” when you installed it. It also assumes you are using Bitbucket as your host. However, it should still be useful even if you are not.
Preparation
First, make sure that the hggit extension is enabled.
If you are using TortoiseHg then you can do this by selecting Global Settings, clicking on Extensions, and then ticking “hggit”.
Alternatively, edit your mercurial config file (located at %userprofile%\mercurial.ini), and ensure that it has the following lines:
[extensions] hggit = hgext.bookmarks = [git] intree = True
It’s worth doing that even if you are running TortoiseHg, in which case you would click the “Edit File” button after you have ticked the hggit extension.
Then, on a command line, verify that it is installed by running the following:
hg help hggit
That should yield some sensible-looking text.
If you get errors then it is not installed and you are probably going to need to google for some answers!
The conversion
Navigate to the folder that contains your Mercurial repo and open a command prompt.
Run the following command to make a bookmark of master for default, so a reference gets created:
hg bookmark -r default master
Run the following command to create the .git repository directory:
hg gexport --debug
You now have a bare Git repository, which we need to turn into a working repository.
Run
git config --bool core.bare false
then
git reset HEAD -- .
You should now have both a working hg and git repository.
Starting Over
If you made a mistake or forgot something and want to start over simply delete the .git subdirectory and run:
hg gclear
Uploading to Bitbucket
Ok, this is where I add something over and above what Helge wrote.
Go to Bitbucket and create a new git repository. But it needs to be totally empty! This is really important!
This is my whole reason for making this post, because if you allow Bitbucket to create any files then it isn’t going to work when you do your first push.
So, create the repo, making sure that you set “Include a README?” and “Include .gitignore?” to ‘No’.
And now you will see the commands you need to run to complete the procedure.
So let’s run those.
If you then go to Bitbucket, and select Source, you will see that your repo has been imported. If you go to Commits, you will see your Mercurial commit history has been imported too. Sweet.
Finishing up
If your .hgignore file is in a git-compatible format (ie. is in glob syntax) then you may want to rename it to .gitignore, then commit and push.
git mv .hgignore .gitignore git commit -m "Renamed" .\.gitignore .\.hgignore git push
You can now go ahead and delete your .hg folder if you are no longer going to use Mercurial.
And that’s it! That was much more simple than I thought it would be!
I hope this is of use to someone. And, if it’s not, then that’s fine as it just reminds me what I need to do in future.