Converting Mercurial folder to a Git repository

GitMercurial

Git Problem Overview


I don't have a huge experience with Mercurial, I'm mostly a Git guy.

I would love to mirror a specific Mercurial folder/file in a git Repository. What I'm actually trying to do is to export the history of a file from a Mercurial repository to Git and being able to keep this in sync with future commits.

Do you have any suggestion on how to proceed? I believe that the way to go should be to get the history of the Mercurial patch, periodically export every single commit as a patch and apply the Mercurial patches to the Git repository.

Git Solutions


Solution 1 - Git

On Linux or anything with bash/sh or similar, or python, try with fast export:

cd
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD

Solution 2 - Git

##Windows: TortoiseHG Hg-Git extension

Hg-Git can be used to convert a Mercurial repository to Git. You can use a local repository or a remote repository accessed via SSH, HTTP or HTTPS.

###Example of local repositories conversion.

  1. Install Hg-Git.
  • On Windows, TortoiseHg comes with Hg-Git, though you need to enable it via the setting tool (in extensions section)

    [![TortoiseHg Settings][4]][4]
    
    or manually in `~/mercurial.ini`
    
        [extensions]
        hggit =
    
  1. Use the following commands to convert the repository:

     $ mkdir git-repo; cd git-repo; git init; cd ..
     $ cd hg-repo
     $ hg bookmarks hg
     $ hg push ../git-repo
    

The hg bookmark is necessary to prevent problems as otherwise hg-git pushes to the currently checked out branch confusing Git. This will create a branch named hg in the Git repository. To get the changes in master use the following commands (only necessary in the first run, later just use git merge or rebase):

$ cd git-repo
$ git checkout -b master hg

Solution 3 - Git

You can (from Mercurial side):

  • using Convert extension with --filemap option convert part of original repo into smaller with only needed files|directories
  • with hg-git extension push stripped repo to Git

or (instead of hg-git), using Mercurial bridge in Git, clone|pull repository from Git

Solution 4 - Git

Gitify

Seems as a more modern and easy to use alternative to perform the conversion https://github.com/buchuki/gitifyhg

pip install gitifyhg
git clone gitifyhg::<hgrepoaddress>
# done, you have a git repo with the entire history of the hg one

Solution 5 - Git

Convert a Mercurial repository to Git on Windows 10

If no problem with encoding - use TortoiseHG Hg-Git extension

md new-repo && cd new-repo
git init --bare .git
cd ..\old-mercurial-repo
hg bookmark -r default master
hg push ..\new-repo
cd ..\new-repo
git config --bool core.bare false

If something wrong with encoding - use fast-export

Install Bash

Open PowerShell as Administrator and run:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Install Ubuntu 16.04 LTS from Microsoft Store

Open Bash and run

install mercurial

sudo -s
apt-get update
apt install mercurial

get fast-export v180317 (at the moment versions after 180317 does not work correctly)

cd /mnt/c/path_to_work_folder
git clone https://github.com/frej/fast-export.git
cd fast-export
git checkout tags/v180317
cd ..

convert repository

git init new-repo && cd new-repo
git config core.ignoreCase false && git config core.quotepath off
../fast-export/hg-fast-export.sh -r ../path_to_mercurial_repo/ --fe cp1251
git checkout master

encoding options:

  • -f encoding, like -f cp1251
  • --fe file name encoding like --fe cp1251

Solution 6 - Git

hg-git-fast-import

https://github.com/kilork/hg-git-fast-import

Another utility with the following features:

  1. Import of single and multiple Mercurial repositories to Git repository.
  2. Import of new revisions from previously imported Mercurial repositories to Git repository.
  3. Tags.
  4. Closed branches.
  5. Verification of the end result with diff.

You may download binary for you platform and put somewhere in path or install with cargo (require rust to be installed):

cargo install hg-git-fast-import

Then usage is like this:

hg-git-fast-import single /path/to/source_hg /path/to/target_git

It does not need Python and Mercurial to be installed. Advanced configuration allows to replace authors or branches, make branches prefixed and more.

Solution 7 - Git

If you're using github.com, they appear to have an import feature that lets you simply type in the URL of your hg project.

First create a new repository and then on the new repository's landing page scroll to the bottom and click the "Import code" button.

context for the import code button

Then type the URL of your previous repository and hit "Begin import".

context for

Then GitHub takes care of the rest!

Github taking care of business for you

Note that GitHub will ask you for your credentials for the old repository if it needs them.

Ooh! I found the official guide

Solution 8 - Git

On Windows can be a bit tricky. After enabling the right plugins in mercurial( hggit), the TortoiseHG can also be used.

  1. Clone mercurial repo

  2. Clone git repo

  3. Enable console : Enabling console

  4. Using the console :

    % hg bookmarks hg

    % hg push <relative path to>/<git-repo>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSimone CarlettiView Question on Stackoverflow
Solution 1 - GitYohannView Answer on Stackoverflow
Solution 2 - GitnaXa stands with UkraineView Answer on Stackoverflow
Solution 3 - GitLazy BadgerView Answer on Stackoverflow
Solution 4 - GitsorinView Answer on Stackoverflow
Solution 5 - GitSandreView Answer on Stackoverflow
Solution 6 - GitAlexander KorolevView Answer on Stackoverflow
Solution 7 - GitBrad TurekView Answer on Stackoverflow
Solution 8 - GitIvasanView Answer on Stackoverflow