Mercurial Hg
Mercurial (Hg) est un système de gestion de sources distribué (DVCS) écrit essentiellement en Python avec quelques fonctions en C pour des raisons de performance. Moyennant quoi, il est disponible sur les principales plateformes, y compris Windows.
Contemporain et très proche de Git, il propose une interface de commande élégante et plus simple, dont un noyau similaire aux commandes de SVN qui peut aider à la migration. Très léger, Hg est également très performant, y compris avec de gros dépôts (plusieurs centaines de Mo).
Si Mercurial et Git ont des fonctionnalités pratiquement équivalentes, ils diffèrent par leur approche de la gestion de l'historique. Pour Mercurial, celui-ci est plus ou moins sacré et le modifier n'est vraiment pas encouragé, alors que pour Git, 'nettoyer' l'historique avant de publier est couramment pratiqué.
Mercurial offre également une interface web simple qui permet de visualiser et d'exporter très facilement ses dépôts (hg serve
).
Comme tous les DVCS, Mercurial n'impose pas de serveur centralisé, mais organise la synchronisation volontaire entre plusieurs dépôts. Plusieurs caractéristiques facilitent la gestion des évolutions effectuées dans chacun des dépôts :
- en dissociant les opérations de 'commit' de la publication des modifications,
- en encourageant et en facilitant l'utilisation de branches et leurs fusions,
- en garantissant l'intégrité du dépôt, sans laisser de branches dans un état inconsistant.
Cette grande souplesse d'utilisation autorise toutes sortes de processus de développement, du plus simple, analogue à ceux pratiqués avec SVN, à d'autres plus complexes tel celui décrit ici et implémenté par ce script.
Mercurial 2.1 a introduit les phases, un moyen de marquer automatiquement une suite de modifications comme étant soit public, soit en développement, soit privée. Les phases permettent ainsi de se souvenir de ce qui a été publié et d'éviter de modifier l'historique associé.
Comme Git, Mercurial propose la commande hg bisect
qui permet une recherche très rapide et simple de la 1re révision contenant un bug donné.
Mercurial est facilement extensible à l'aide de modules écrits en Python. L'exemple ci-après (~/.hgext/info.py) montre comment rajouter ainsi une commande hg info
similaire à svn info
:
# Mercurial extension to provide a basic 'hg info' command
#
import time
from mercurial.i18n import
def info(ui, repo):
"""Print information about the repository"""
numrev = len(repo)
changeset = repo.changectx(numrev-1)
ui.write(("Repository: %s \n") % (repo.root,))
ui.write(('Revisions: %s \n') % (numrev,))
ui.write(("Files: %s \n") % (len(changeset.manifest()),))
ui.write(("Last modified on : %s ") % (time.ctime(changeset.date()[0]),))
ui.write((" by %s \n") % (changeset.user().split('<')[0],))
ui.write(_("Cloned from: %s \n") % (ui.config('paths','default'),))
cmdtable = {
# "command-name": (function-call, options-list, help-string)
"info": (info, [], _("hg info"))
}
Il suffit alors d'activer cette extension en la déclarant dans son fichier de configuration hgrc :
[extensions]
info = ~/.hgext/info.py
pour pouvoir l'utiliser comme n'importe quelle autre commande Mercurial :
$> hg help info
hg info
Print information about the repository
utiliser "hg -v help info" pour afficher les options globales
$> hg info
Repository: /Users/aperus/Projets/Test-ext
Revisions: 71
Files: 55
Last modified on : Wed May 19 17:18:42 2010 by Antoine Pérus
Cloned from: /Users/Shared/Depots/Test-ext
La commande hg convert
permet de convertir les dépôts :
- depuis Mercurial, SVN, CVS, Git, Bazaar, Darcs, Monotone, GNU Arch ou Perforce
- vers Mercurial
L'extension HgSubversion permet d'utiliser Mercurial comme client Subversion, en déconnectant les sauvegardes de la publication, en gérant localement ses branches et en ayant la totalité de l'historique en local.
L'extension hg-git permet de travailler avec un dépôt Git parallèlement avec d'autres clients Git.
Utilisé par plusieurs développeurs et physiciens à titre personnel ou dans des projets locaux.
Mercurial ne gère que des fichiers, si bien qu'un répertoire vide ne sera pas versionné.
La possibilité (apparue avec Mercurial 1.3) de gérer une collection de dépôts comme un groupe, permettant de cloner et synchroniser des projets et des librairies associées ou de traiter un gros projet organisé en sous-projets, reste expérimentale, voire déconseillée par la communauté (extension subrepo).
Comme tous les DVCS, Mercurial est mal adapté à la gestion de projets contenant de nombreux et/ou gros fichiers binaires ou considérés comme tels. Une extension bigfiles permet de gérer leurs versions tout en maintenant les fichiers à l'extérieur du dépôt.
Commentaires
Responsable thématique précédent
Cette fiche a d'abord été suivie par le responsable thématique Loïc Gouarin. Anne Cheylus l'a reprise en avril 2013.