Migrer un repository de Mercurial vers Git

2012-08-22 #git#mercurial

Ça m'a demandé quand même un peu de temps pour réussir à trouver un système qui marche et qui soit assez simple à refaire.

Grosso-modo, il existe 3 méthodes :

  • soit passer par le plugin Hg-Git pour Mercurial,
  • soit utiliser Fast-Export pour alimenter git-fast-import,
  • soit demander à Codeplex de [faire la conversion](http://codeplex.codeplex.com/wikipage?title=CodePlex FAQ#TFStoMercurial) à ma place.

Comme j'ai pu trouver assez vite comment installer simplement Hg-Git, j'ai donc pris cette option.

Installation du plugin Hg-Git sous Windows 7 64 bits

Au début, ça fait un peu peur, mais en fait y'a quasiment rien à faire.

Étant donné que j'ai la chance d'avoir déjà installé TortoiseHg sur mon PC, il s'avère que je n'ai pas à m'embarrasser avec Python, MSysGit et tutti-quanti.

J'ai juste à cloner le repository de Hg-Git :

C:\Tools> hg clone http://bitbucket.org/durin42/hg-git/ C:\Tools\hg-git

Puis à activer / configurer Hg-Git et bookmark dans mon fichier Mercurial.ini :

[extensions]
bookmarks =
hggit = C:\Tools\hg-git\hggit

Faire un push de Mercurial vers Git

Là aussi, j'ai un peu galéré. Y'avait pas moyen de faire un push de Mercurial vers Git. J'ai cherché et essayé tout plein de trucs mais rien n'y faisait.

Jusqu'au moment où je suis tombé sur le blogue d'un danois qui avait tout fait comme il faut : Converting a Mercurial repository to Git (Windows).

Le truc magique, c'est de ne pas pousser vers un repository Git, mais vers un repository Git "bare". La différence entre les deux, c'est que le repository Git "bare" correspond uniquement au contenu du dossier ".git" d'un repository Git "normal" (cf What is the difference between "git init" and "git init --bare"?).

Et là, du coup, j'ai pu pousser :

C:\Gits> md MongoContactsBare
C:\Gits> cd MongoContactsBare
C:\Gits\MongoContactsBare> git init --bare

=> Initialized empty Git repository in C:/MVC/MongoContactsBare/

C:\Gits\MongoContacts> cd \Hgs\MongoContacts
C:\Hgs\MongoContacts> hg bookmark -r default master
C:\Hgs\MongoContacts> hg push C:/Gits/MongoContacts/Bare

=> pushing to C:/MVC/MongoContactsBare

=> creating and sending data

Ça y est, mon historique est dans mon repository Git "bare". Reste plus qu'à clone the bare repository to a working directory.

Ça aurait été mieux s'il avait expliqué comment faire, mais j'y suis arrivé :

C:\Hgs\MongoContacts> cd \Gits
C:\Gits> md MongoContacts
C:\Gits> git clone -l .\MongoContactsBare .\MongoContacts

=> Cloning into .\MongoContacts...

=> done.

Finitions

Quelques dernières dernières retouches pour avoir un "vrai" repository Git :

C:\Gits> copy .\Repertoir\.gitignore .\MongoContacts
C:\Gits> del .\MongoContacts\.hgignore

Un fichier readme.md et un petit coup de GitHub for Windows plus tard et mon projet est archivé chez GitHub !