2010-11-30 4 views
8

J'ai lu ce document: A Guide to Branching with Mercurial, en particulier la section intitulée Branching with Bookmarks.Mercurial, "Branchement avec des signets"

Il dit:

Maintenant, vous avez deux signets (essentiellement un tag) pour vos deux branches au courant changeset.

Pour passer à l'une de ces branches, vous pouvez utiliser hg update feature pour effectuer la mise à jour de l'ensemble de modifications de pointe de cette branche et vous identifier comme travaillant sur cette branche. Lorsque vous commettez, il déplace le signet vers le changeset nouvellement créé.

J'ai essayé ceci, mais cela a fini par déplacer les deux signets en même temps.

Ce guide est-il erroné, obsolète ou ai-je fait quelque chose de mal? Notez que je sais que le fait d'avoir des signets sur des branches séparées ne fait que déplacer le signet lié à la branche sur laquelle je travaille actuellement, mais ce guide (que beaucoup de gens disent être le guide définitif) indique spécifiquement le texte ci-dessus, qui indique qu'il aurait dû travailler en "disant" à Mercurial quel signet (branche) je travaille.

Les tests montrent cependant le contraire.

Des idées?

Exemple:

 
> hg init 
> echo 1 >test.txt 
> hg commit -m "initial" --addremove 
adding test.txt 

> hg bookmark main 
> hg bookmark feature 
> hg log 
changeset: 0:c56ceb49ee20 
tag:   feature 
tag:   main 
tag:   tip 
user:  Lasse V. Karlsen <[email protected]> 
date:  Tue Nov 30 23:06:16 2010 +0100 
summary:  initial 

> hg update feature 
0 files updated, 0 files merged, 0 files removed, 0 files unresolved 

> echo 2 >test2.txt 
> hg commit -m "feature 1" --addremove 
adding test2.txt 

> hg log 
changeset: 1:9f2f5869b57b 
tag:   feature        <---- both were moved 
tag:   main        <---- 
tag:   tip 
user:  Lasse V. Karlsen <[email protected]> 
date:  Tue Nov 30 23:06:45 2010 +0100 
summary:  feature 1 

changeset: 0:c56ceb49ee20 
user:  Lasse V. Karlsen <[email protected]> 
date:  Tue Nov 30 23:06:16 2010 +0100 
summary:  initial

Répondre

16

Si je vous ai bien, vous voulez que le signet que vous avez mis à jour de se déplacer sur le prochain commit. A cet effet, les extensions de signets ont l'option track.current.

De BookmarksExtension:

Par défaut, lorsque plusieurs signets pointent vers le même changeset, ils vont tous aller de l'avant ensemble. Il est possible d'obtenir une expérience plus semblable à Git en ajoutant l'option de configuration suivante à votre.hgrc

[bookmarks] 
track.current = True 

Dans votre exemple, cela maintiendrait le principal signet à la révision 0.

Si l'option track.current est activée, le signet actuellement actif est annotés d'un astérisque dans la sortie hg bookmarks.

MISE À JOUR: Depuis Mercurial 1.8 le comportement par défaut est de ne déplacer le signet en cours, à savoir l'option mentionnée ci-dessus n'est plus nécessaire [1].

+0

Peut-être que c'était le comportement par défaut à un moment donné, et a été changé? De toute façon, vous avez raison, avec cette configuration, il se comporte exactement comme le guide décrit. Merci! –

+0

Non, l'option 'track.current' a toujours par défaut False. Il y a eu une discussion récente au sujet de faire de la commande bookmark une commande de base et par rapport à cela, il a été suggéré que 'track.current' devrait commencer par défaut à True. –

+3

+1 pour la réponse utile, mais cela conduit à une question évidente: quand track.current * n'est * pas approprié? Je ne peux pas imaginer une situation où j'ai plusieurs signets et je les veux * tous * aller de l'avant sur un commit. –

3

Si vous lisez la description de l'BookmarksExtension, il dit:

Les signets sont des références à commits automatiquement mis à jour lorsque de nouveaux commits sont faits.

et:

Depuis les signets sont automatiquement mis à jour lorsque commiting au changeset qu'ils pointent vers, ils sont particulièrement utiles pour garder une trace des différentes têtes.

Dans votre cas, vous n'aviez qu'une tête dans le référentiel au moment de la création des deux signets. Si vous utilisez une séquence comme suit, il devrait fonctionner comme prévu:

hg init foo 
# edit, edit, edit 
hg commit -A -m "root" 
hg bookmark main 
# edit, edit, edit ... 
hg commit -m "main 1" 
hg update 0 
# edit, edit edit 
hg bookmark feature 
hg commit -m "feature 1" 
+1

Donc, fondamentalement, vous dites que le guide est faux? C'est ma question après tout. Je sais que les signets individuels, comme votre exemple, fonctionnent comme prévu. Mais ce guide semble dire que si vous exécutez 'hg update feature', seul ce signet sera avancé. –

+0

@Lasse: non, je pense que le document omet quelques détails pour la brièveté; l'auteur _does_ dit de lire plus sur les signets avant de les utiliser. –

+1

Je suppose que l'auteur du guide (en silence) a supposé que l'option * track.current * de l'extension bookmarks est activée (voir ma réponse connexe). –