web-dev-qa-db-fra.com

Mercurial for Beginners: Le guide pratique définitif

Inspiré par Git pour les débutants: le guide pratique définitif .

Ceci est une compilation d'informations sur l'utilisation de Mercurial pour débutants pour pratiques .

Débutant - un programmeur qui a touché au contrôle de source sans très bien le comprendre.

Pratique - couvre les situations que rencontrent souvent la majorité des utilisateurs - créer un référentiel, créer des branches, fusionner, extraire/pousser de/vers un référentiel distant, etc.

Notes :

  • Expliquez comment faire quelque chose plutôt que comment quelque chose est mis en œuvre.
  • Traitez une question par réponse.
  • Répondez clairement et de la manière la plus concise possible.
  • Modifiez/étendez une réponse existante plutôt que de créer une nouvelle réponse sur le même sujet.
  • Veuillez fournir un lien vers le Mercurial wiki ou le HG Book pour les personnes qui souhaitent en savoir plus.

Des questions:

Installation/Configuration

Travailler avec le code

Marquage, branchement, versions, lignes de base

Autre

Autres références Mercurial

237
Laz

Comment le configurez-vous pour ignorer les fichiers?

Ignorer est configuré dans un fichier texte normal appelé .hgignore à la racine de votre référentiel. Ajoutez-le comme un fichier normal avec:

hg add .hgignore

Il existe deux options de syntaxe disponibles pour la correspondance de fichiers, glob et regexp. glob est une extension de nom de fichier semblable à Unix et regexp est une expression régulière. Vous activez chacun en ajoutant syntax: glob ou syntax: regexp sur une ligne à part. Toutes les lignes suivantes qui utiliseront cette syntaxe, jusqu'au prochain marqueur de syntaxe. Vous pouvez avoir autant de marqueurs de syntaxe que vous le souhaitez. La syntaxe par défaut est regexp. Par conséquent, si vous n'utilisez que regexp, vous n'avez besoin d'aucun marqueur de syntaxe.

Vous pouvez ajouter des commentaires avec #

Exemple:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Ignorer s’applique uniquement aux fichiers non gérés (c’est-à-dire aux fichiers qui ne sont pas déjà archivés). Pour ignorer les fichiers sous contrôle de version, vous pouvez utiliser les commutateurs -I et -X.

16
Joakim Lundborg

Comment voyez-vous ce qui n'est pas engagé ou le statut de votre base de code actuelle?

Pour voir une liste des fichiers qui ont été modifiés:

$ hg status

Cela imprimera chaque fichier modifié avec son statut, ce qui peut inclure:

  • M - Modifié. Le fichier a été modifié et les modifications n'ont pas été validées.
  • A - Ajouté. Le fichier n'a pas été suivi auparavant, mais si vous validez, Mercurial commencera à le suivre.
  • R - Supprimé. Le fichier avait déjà été suivi, mais si vous validez, Mercurial cessera de le suivre dans cette version et dans les futures.
  • ? - Inconnu. Le fichier n'est actuellement pas suivi par Mercurial. S'engager n'aura d'effet que si vous utilisez hg add pour l'ajouter.
  • ! - Manquant. Le fichier a été suivi, mais Mercurial ne le trouve pas dans la copie de travail.

Pour voir les modifications réellement apportées aux fichiers:

$ hg diff
7
Steve Losh

Comment créez-vous un nouveau projet/référentiel?

$ hg init my-repository
6
lutz

Comment comparez-vous deux révisions d'un fichier, ou votre fichier actuel et une révision précédente?

Les deux utilisent hg diff. Quand hg diff est utilisé pour toutes les modifications de la copie de travail et le conseil (le dernier commit) est affiché.

Pour "Comment comparez-vous deux révisions d'un fichier?"

$ hg diff -r{rev1} -r{rev2} {file.code}

La commande ci-dessus affichera une différence entre rev1 et rev2 de "fichier.code".

Pour "Comment comparez-vous votre fichier actuel et une révision précédente?"

$ hg diff {file.code}

La commande ci-dessus affichera une différence entre la version actuelle de "fichier.code" et la dernière révision (la dernière validée).

:RÉ

5
NawaMan

Comment est-ce que je fais l'interface avec Subversion?

Il y a trois façons:


Le convert extension clonera un référentiel Subversion existant dans un référentiel Mercurial. Il vient avec Mercurial. Cela fonctionne à peu près comme ça:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Par exemple, cela va récupérer le coffre du référentiel memcached de SixApart.

hg convert http://code.sixapart.com/svn/memcached/trunk

L'extension peut introduire progressivement de nouvelles révisions d'un référentiel Subversion dans celui de Mercurial (un peu comme pull). Cependant, il ne prend pas en charge de prendre les révisions de Mercurial et de les renvoyer à Subversion (pas de Push). [XXX: Corrigez ceci s'il est erroné] .


Le extension hgsubversion . C'est à bien des égards la solution la plus sophistiquée car elle utilise l'API Subversion pour communiquer avec le référentiel Subversion. Il vise à devenir le pont le hg-svn. Cela permet un aller-retour complet des révisions (clone complet, tirer et pousser), cependant à la date de cette écriture [XXX: Modifiez ceci si/quand il devient incorrect] il est encore en développement et il n'y a pas encore de versions officielles. En conséquence, il ne fonctionne qu'avec le dernier Mercurial (1.3 au moment de la rédaction de cet article).

  • Il mappe les étiquettes et les branches (précédant toutes les étiquettes avec tags/ pour les distinguer des branches nommées de manière équivalente).
  • Il maintient une branche spéciale closed-branches pour fermer les branches supprimées dans Subversion.
  • Il nécessite que le référentiel Subversion soit aménagé selon la convention trunk/branches/tags.
  • Le jeu de commandes est typiquement hg svn <subcommand> bien que cela ait pour but d’être intégré au point que vous n’ayez pas besoin de la partie 'svn' (c’est-à-dire qu’il veut traiter un clone Subversion autant que possible comme tout autre référentiel Mercurial) .;

Cela fonctionne comme ceci:

cloner:

hg svnclone <Subversion URL> 

OU (uniquement pour svn:// URLs)

hg clone <svn:// URL>

tirez:

hg svn pull

Pousser:

hg svn Push

entrant:

hg svn incoming

sortant:

hg svn outgoing

Extraire un référentiel entier:

hg svnclone http://code.sixapart.com/svn/memcached

L'utilitaire hgsvn ( arborescence de bits ). Jusqu'à récemment, ceci ne vous permettait que de cloner et d'extraire un dépôt Subversion, mais à partir de hgsvn 0.1.7 il supporte Push. [Je ne sais pas comment bien il fait Push. Toute personne plus expérimentée devrait mettre à jour ceci.] Il présente les caractéristiques remarquables suivantes:

  • Il génère une étiquette Mercurial pour chaque étiquette SVN.
  • Il place une balise locale sur every pour marquer sa révision SVN.
  • Il place chaque révision Mercurial sur une branche nommée nommée d'après sa branche SVN. Par exemple branches/some-feature serait comme hg branch some-feature. Il place le coffre sur trunk (c'est-à-dire que rien ne se trouve sur la branche par défaut de Mercurial, à moins que l'utilisateur n'y accède explicitement.)
  • Il essaiera d'identifier les branches et les étiquettes et de les créer, mais s'il ne le peut pas, il les sautera simplement. C'est pratique lorsque le référentiel Subversion ne suit pas la disposition conventionnelle tronc/branches/balises.

Cela fonctionne comme ceci:

cloner:

hgimportsvn <Subversion URL>

tirez:

hgpullsvn

Pousser:

hgpushsvn

entrant:

hgpullsvn -n

sortant:

hgpushsvn -n

Extraire un référentiel entier:

hgimportsvn http://code.sixapart.com/svn/memcached

Vérifier juste le coffre:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk
5
quark

Comment vous branchez-vous?

$ hg branche my-branch

ou

$ hg clone le dépôt d'origine ma-branche

Notez bien que branch crée un répertoire "virtuel" (c'est-à-dire que les fichiers restent les mêmes, mais que hg les traite comme s'ils étaient différents dans le système), tandis que clone crée une copie complète et réelle. À proprement parler, clone n'est pas une branche.

4
lutz

Bon plugin GUI/IDE pour Mercurial?

Interface graphique

  • TortoiseHg pour à peu près n'importe quel système d'exploitation. Inclut l'intégration de Windows Explorer. Il fonctionne également sous Linux et quelques autres systèmes d'exploitation, notamment Max OS X. Il possède une interface un peu maladroite et est un peu difficile à utiliser au début, mais il est très complet et puissant.
  • Murky fonctionne sous Mac OS X 10.5 ou ultérieur. Murky est utile pour explorer le référentiel et les commandes de base, mais vous devrez également savoir utiliser la ligne de commande.
  • MacHg est une interface graphique conviviale pour Mac OS X qui offre un peu plus de fonctionnalités et d’optimisation que Murky, mais vous aurez également besoin de la ligne de commande.
  • SourceTree est un client Mac à l’origine, avec une version Windows récemment disponible. Pretty Nice UI (au moins sous OS X), supporte la majorité des fonctionnalités de Hg, y compris shelve.

Plugins

4
Macke

Comment "marquez-vous" ou "relâchez-vous" un ensemble particulier de révisions pour un ensemble particulier de fichiers afin que vous puissiez toujours extraire celui-ci plus tard?

$ hg tag my-tag

Vous pouvez également cloner votre référentiel pour créer un référentiel spécial tag.

$ hg clone working-repository my-tag-repository
4
lutz

Comment obtenez-vous le dernier code?

Mercurial se souvient de l'endroit où un référentiel a été cloné (en .hg/hgrc) afin que vous puissiez simplement exécuter:

hg pull

extraire le dernier code de Origin-repository. (Ceci ne met pas à jour le répertoire de travail)

hg update

mettre à jour le répertoire de travail.

hg pull -u

d'effectuer à la fois un pull et une mise à jour.

3
Laz

Comment installer Mercurial?

Veuillez éditer correctement si vous avez installé à partir du code source Linux, ou utilisé les programmes d’installation Windows.

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Utilisez easy_install de Python (avec Setuptools ):

Sudo easy_install Mercurial

Ceci trouve la dernière version (1.3.1 au moment de l'écriture) et s'installe à:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

Avec Python 2.6, cela contourne également le package d’installateur de Mercurial OS X (à la version 1.2.1 du 26 juillet 2009). ) se plaignant qu'il a besoin de Python 2.5. D'après la documentation , il semble que Fink et Macports installent la version 1.2.

Linux

La plupart des paquets Linux explicites semblent prendre du retard par rapport à la version actuelle, utilisez donc easy_install (comme ci-dessus) ou téléchargez le fichier . ) Mercurial tarball , extrayez l’archive, accédez au répertoire Mercurial et exécutez:

$ make
$ Sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(from Introduction à Mercurial, un système de contrôle de version distribué )

Les fenêtres

Il existe un paquet binaire de la dernière version de Mercurial . TortoiseHg est une extension Windows Shell pour Mercurial, qui l'installe. Cygwin peut également installer Mercurial.

Alternativement (instructions trop longues donc liées ici), vous pouvez construire un Python pur optimisé version de Mercurial à partir des sources.

3
Dave Everitt

Comment mettre en place Mercurial?

Mercurial enregistre ses informations de configuration dans ~/.hgrc sur les systèmes * nix et dans %UserProfile%\Mercurial.ini sur les systèmes Windows. (%UserProfile% est typiquement "C:\Documents and Settings\[username]\" sur Windows 2000 ou Windows XP, et généralement C:\Users\[username]\ sur les systèmes Windows Vista et Windows 7.)

Pour commencer, vous devez définir votre nom d'utilisateur Mercurial en plaçant le texte suivant dans votre .hgrc ou Mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <[email protected]>

Les utilisateurs TortoiseHg sur les systèmes Windows peuvent également exécuter hgtk userconfig

Voir aussi " Création d'un fichier de configuration Mercurial " dans chapitre 2 de " Mercurial: le guide définitif ."

3
las3rjock

Comment fusionnez-vous des branches?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
3
lutz

Comment vérifiez-vous le code?

hg clone [OPTION]... SOURCE [DEST]

Où option peut être:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

Où source est la source des fichiers d'origine situés dans le référentiel, où il peut s'agir d'un fichier distant URL ou d'un répertoire du système de fichiers. Par exemple:

Et la destination est où le code source sera situé dans votre système de fichiers local.

3
Joshua Partogi

Comment commettez-vous des changements?

Appeler cette commande à partir du référentiel local * Mercurial actuel

hg commit [OPTION]... [FILE]...

alias: ci

  • Un référentiel Mercurial local a .hg dans le répertoire en cours

Où option peut être:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Un exemple de commande serait:

hg commit -m "added readme" README

NOTE :

  • Si une liste de fichiers est omise, toutes les modifications signalées par "hg status" seront validées.
  • Si vous validez le résultat d'une fusion, ne spécifiez aucun nom de fichier ni aucun filtre -I/-X.
  • Si aucun message de validation n'est spécifié, l'éditeur configuré est lancé pour vous demander un message.
3
Joshua Partogi

Comment fusionner des parties d'une branche dans une autre?

Activer l'extension 'greffe' dans votre .hg/hgrc

[extensions]
transplant=

Chargez la branche cible puis transplantez la révision cible.
ex.: sélection de cerises révision 81 de la branche 'foo' dans la branche actuelle

$ hg transplant -b foo 81
1
John Mee

Comment supprimer un fichier du référentiel?

Pour supprimer un fichier du référentiel et le supprimer lors de la prochaine validation:

$ hg remove {file(s)}

Pour supprimer un fichier du référentiel sans le supprimer

$ hg remove -Af {file(s)}

ou de Mercurial 1.

$ hg forget {file(s)}
1
David Sykes

Comment voyez-vous l'historique des révisions d'un fichier ou d'un référentiel?

Pour afficher l'historique de révision d'un référentiel entier ou de fichiers

$ hg log {file(s)}

ou

$ hg history {file(s)}

Et à voir la liste en ordre inverse

$ hg log -r:
1
David Sykes

Comment extraire un patch d'un changeset spécifique?

$ hg export -o patchfile changeset

Vous pouvez ensuite importer ceci dans une autre branche avec:

$ hg import patchfile
1
David Sykes

Comment inversez-vous un jeu de modifications?

Quelques options disponibles

Easy Way (sauvegarde d'un seul jeu de modifications)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

Hard Way (diff manuellement et appliquer)

Étape 1: Créez un fichier de correctif pour rétablir ce qui a changé entre les révisions 107 et 108:

hg diff -r107 -r108 --reverse  > revert-change.patch

(alternativement, hg diff -r108 -r107 sans --reverse fera la même chose)

Étape 2: Appliquez le fichier de correctif:

patch -p1 < revert-change.patch

Certaines des différences peuvent ne pas s'appliquer, par exemple:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

Le fichier .rej contiendra le contenu du diff qui a échoué, vous aurez besoin de regarder.

1
slf

Comment revenez-vous à une version précédente du code?

De cette question

$ hg update [-r REV]

@van: Si vous vous engagez plus tard, vous créerez effectivement une nouvelle branche. Ensuite, vous pouvez continuer à travailler uniquement sur cette branche ou éventuellement y fusionner celle existante.

1
David Sykes

Comment commettez-vous des changements?

$ hg commit -m "Commit message"
1
NawaMan

Comment voyez-vous les modifications qui seront envoyées au référentiel en amont lorsque vous poussez?

Utilisation hg outgoing pour obtenir la liste des changesets à définir sur le référentiel par défaut:

$ hg outgoing

Pour obtenir les changements de code réels, utilisez -p (--patch). Cela produira chaque changeset dans son intégralité:

$ hg outgoing -p
1
robotadam