The vast majority of AppVeyor customers use Git, specifically GitHub. Historically, we’ve been using Mercurial for AppVeyor source control, but recently due to the growing popularity and ecosystem of Git and GitHub we thought maybe it’s time to jump Git train and start using it for AppVeyor projects.
The first problem we faced with was converting existing Mercurial repositories to Git with preserving all history and authors. If you search in Google for converting mercurial to git on Windows you will find some (mostly similar) posts on SO, but none of them worked for us if followed “as is” on Windows. After many trials we found the way that 100% works and could be easily reproduced - everything was done from scratch on a clean Windows Server 2012 machine.
Install required software
We assume you start from a clean Windows Server 2012 machine.
- Git for Windows (install the latest version, select “Run Git from the Windows Command Prompt” while installing Git)
- Mercurial 2.9 MSI installer - x86 Windows
- Python 2.7.6
Open command line prompt and make sure all tools are available in the
PATH: hg, git, python.
We will be doing everything in
Open command prompt.
Clone source Mercurial repository:
hg clone https://bitbucket.org/appveyor/demoapp
Create an empty GitHub repository and clone it to
git clone https://github.com/AppVeyor/DemoApp.git demoapp_git
git clone http://repo.or.cz/r/fast-export.git
c:\projects\fast-export\hg-fast-export.py in Notepad and replace highlighted region with the code below:
#!/usr/bin/env python # Copyright (c) 2007, 2008 Rocco Rutte <firstname.lastname@example.org> and others. # License: MIT <http://www.opensource.org/licenses/mit-license.php> import sys # import mercurial libraries from zip: sys.path.append(r'C:\Program Files (x86)\Mercurial\library.zip') from mercurial import node from hg2git import setup_repo, fixup_user, get_branch, get_changeset from hg2git import load_cache, save_cache, get_git_sha1, set_default_branch, set_origin_name from optparse import OptionParser import re import os
Copy content of
demoapp_git ignoring .git folder.
If you need to map authors to new repository with different name/email create
authors.txt with one mapping per line (old=new), like below:
Feodor Fitsner <email@example.com>=Feodor Fitsner <firstname.lastname@example.org>
Run Python script to import Mercurial repo into Git one (you are running this script from Git repository directory):
hg-fast-export.sh -r c:\projects\demoapp -A authors.txt
Checkout HEAD to check that everything looks good:
git checkout HEAD
Remove conversion files:
git clean -f del /Q hg2git.pyc
Rename .hgignore to .gitignore:
ren .hgignore .gitignore git add .gitignore git commit -m ".hgignore renamed to .gitignore"
Push Git repo to GitHub:
git push -u origin master