#pragma section-numbers 3
#language fr
(Traduction du texte original en anglais : [[Tag]])
== Tag ==
(''Note: Si vous migrez depuis CVS, veuillez [[CvsConcepts#tag|lire cette discussion en anglais sur les tags CVS]] avant de continuer.'')
`hg tags`<
>
`hg tag [-l] [-m TEXTE] [-d DATE] [-u UTILISATEUR] [-r REV] NOM...`
Un '''tag''' est un identifiant symbolique pour un [[FrenchChangeSet|changeset]]. Il peut contenir n'importe quel caractère sauf ":" (deux points), "\r" (retour-chariot) ou "\n" (saut de ligne). Mercurial dispose de deux types de tags : local et normal.
Un tag ''local'' est une commodité d'identification qui n'est pas inscrite dans une révision, il ne se propage pas avec les autres changements et réside dans le fichier {{{.hg/localtags}}} d'un [[FrenchRepository|dépôt]].
Un tag "normal" (sans spécification spéciale) ''est'' inscrit dans une révision, il ''se propage'' avec les autres changements et il demeure dans le fichier {{{.hgtags}}} d'un dépôt.
<>
=== Exemple ===
{{{
hg tag voici_mon_tag
}}}
=== Comment fonctionnent les tags dans Mercurial ? ===
Les tags fonctionnent légèrement différemment dans Mercurial que dans la plupart des autres systèmes de révision.
L'architecture implique les pré-requis suivants :
* être sous contrôle de version et [[FrenchMerge|fusionnable]] comme n'importe quel autre fichier
* autoriser la signature des tags
* autoriser l'ajout d'un tag à un changeset déjà [[FrenchCommit|validé]]
* autoriser le changement futur des tags
Pour cela, mercurial stocke les tags dans un fichier dans le [[WorkingDirectory|dossier de travail]]. Ce fichier est
nommé .hgtags et consiste en une liste d'[[FrenchChangeSetID|IDs de changeset]] et de leur
tags correspondants. Pour ajouter un tag au système, il suffit d'ajouter une ligne dans
ce fichier et de faire un commit pour qu'il prenne effet. La commande
{{{hg tag}}} fera cela pour vous et {{{hg tags}}} montrera les tags effectifs courants.
Notez que puisque les tags font référence à des IDs de changeset et que l'ID d'un changeset est
effectivement la somme de tous les contenus du dépôt pour ce changement, il est impossible dans Mercurial de
faire un commit et d'ajouter un tag pour ce commit simultanément. Par conséquent le tag d'une révision doit être réalisé
dans un second temps. Donc, comme précédemment, les seuls changesets qui peuvent être "taggés" sont ceux déjà validés.
Le fait que les tags identifient les changesets et soient aussi des parties de changesets
a quelques implications pouvant prêter à confusion :
* Le changeset référencé par un tag est toujours plus ancien que le changeset validant le tag lui-même.
* Faire un [[FrenchUpdate|update]] d'un dossier de travail vers un tag particulier va ramener ce dossier à un point précédent l'existence du-dit tag.
* Faire un [[FrenchClone|clone]] d'un dépôt à un tag précis va donner un nouveau dépôt qui ''ne'' contient ''pas'' ce tag.
La sagesse populaire incite à d'éviter la confusion d'un tag disparaissant, vous devriez cloner le dépôt en entier et ensuite faire un update du dossier de travail vers le tag. Ainsi le tag sera préservé dans le dépôt.
=== Et si je veux juste utiliser les tags locaux ? ===
Vous pouvez utiliser la commange "hg tag" avec l'option {{{-l}}} ou {{{--local}}}. Ceci
stockera le tag dans le fichier .hg/localtags, qui ne sera ni distribué ni versionné.
Le format de ce fichier est identique à celui de .hgtags et les tags stockés dedans le
seront à l'identique.
=== Mes tags sont en conflit quand je fusionne. Pourquoi ? Comment dois-je les fusionner ? ===
Divers ensembles de tags, venant de différentes branches et heads, peuvent provoquer des conflits de fusion. Bien que Mercurial sache comment gérer divers {{{.hgtags}}} dans divers heads, il n'utilise pas cette connaissance lors d'une tentative de fusion. Au lieu de cela, les fichiers {{{.hgtags}}} sont fusionnés comme n'importe quels autres fichiers, il peut donc résulter de cela un conflit de fichiers, même lorsque la résolution est triviale.
En cas de conflit de fusion sur vos tags, l'option la plus sûre est de récupérer l'ensemble des deux versions.
=== Comment se comportent les tags avec des heads multiples ? ===
Les tags qui sont effectifs à un moment donné sont ceux spécifiés dans chaque [[FrenchHead|head]].
Un cas délicat se pose, si les mêmes tag spécifient deux révisions différentes dans deux heads. Il n'y a pas de solution générale "correcte" à ce problème.
Si deux définitions/changements de tags semblent décousues comme dans le diagramme suivant, le "meilleur [[FrenchTip|tip]]" (c-à-d celui qui à le plus grand numéro de révision) gagne.
{{{#!dot
digraph G {
"..." -> "Rev: 12" -> "Rev: 13\ntag_a=1"
"Rev: 12" -> "Rev: 14\ntag_a=2"
}
}}}
Dans le schéma ci-dessus {{{tag_a}}} référence la révision 2, puisque la révision 14 est plus élevée que la révision 13.
/!\ Notez que le numéro de révision dépend de l'ordre dans lequel les changements ont été rapportés au dépôt, c'est pourquoi ils peuvent varier même sur des dépôts contenant les mêmes changesets.
Cependant si un tag a été défini dans un ancêtre commun des deux heads, mais changé dans un seul head, celui changé l'emporte sur celui inchangé.
{{{#!dot
digraph G {
"..." -> "Rev: 12\ntag_b=9" -> "Rev: 13\ntag_b=10"
"Rev: 12\ntag_b=9" -> "Rev: 14\n (cette révision contient toujours tag_b=9) "
}
}}}
Dans le diagramme ci-dessus {{{tag_b}}} fait référence à la révision 10, bien que la révision 13 ne soit pas le Tip.
/!\ Notez que cet ''algorithme de résolution des conflits de tag pour les head multiples'' dépend du fichier {{{.hgtags}}} qui doit être ajouter uniquement et qui sera soigneusement fusionné.
Les tags locaux surchargent tous les autres tags.
Voir aussi : [[MultipleHeads]]
=== Et si plusieurs lignes avec des révisions différentes utilisent le même nom de tag dans .hgtags ? ===
S'il y a juste un head, seul la dernière ligne ou le tag apparaît est prise en compte. S'il y a des heads multiples, les définitions précédentes du tag sont utilisées pour déterminer quel head contient le tag le plus récent. Voir "Comment se comportent les tags avec des heads multiples ?".
Si un tag pointe vers {{{0000000000000000000000000000000000000000}}} il est considéré comme effacé.
La règle est la même en ce qui concerne .hg/localtags.
=== Comment supprimer un tag ? ===
Au choix par :
* {{{hg tag --remove nom_du_tag}}} (c'est ce qui s'approche le plus de {{{cvs tag -d}}})
* en ajoutant {{{nom_du_tag 0000000000000000000000000000000000000000}}} à la fin de {{{.hgtags}}}
* en supprimant toutes les références à ''nom_du_tag'' dans {{{.hgtags}}} (mais ceci peut créer des confusions dans l'algorithme de résolution des conflits de tag pour les head multiples)
=== Références manuel ===
* http://www.selenic.com/mercurial/hg.1.html#tag
* http://www.selenic.com/mercurial/hg.1.html#tags
----
FrenchCommand FrenchGlossary