2010-08-17 3 views
3

J'ai récemment commencé à utiliser Mercurial et comme la protection VCS pour mon développement individuel sans l'archiver dans le référentiel central, je pousse vers le dépôt central quand j'ai quelque chose de prêt le reste de l'équipe.Mercurial valider des messages du référentiel local vers le référentiel central

Lorsque je "commets", j'écris un message de validation relatif à l'ajout depuis la dernière fois que j'ai commis. Je peux avoir 5 commits locaux ou plus avant que je sois prêt à pousser des trucs au central. Quand je pousse, si je ne spécifie pas de révision, tous mes commits locaux et leurs messages sont ajoutés au dépôt central, mais je ne veux pas encombrer le journal central avec toutes mes petites étapes locales. Quand je pousse et spécifie la révision locale, je pense que seule cette révision et son message de commit sont poussés, non? Le problème est, je veux pousser avec un message de validation qui résume tout mon travail "hors ligne" local, parce que c'est ce que j'ajoute vraiment. Cependant, le message de validation qui est envoyé est celui que j'ai écrit le plus récemment. Dites que je travaille sur la fonctionnalité A et que j'ai cinq commits locaux pour cela; "A.1 ajouté" "Ajouté A.2" "Code nettoyé dans foo.cpp" et ainsi de suite, se terminant par "Added A.4." Ce que je veux pour se connecter au dépôt central est "Ajouté A, nettoyé foo.cpp" mais si je pousse cette dernière révision, il voit juste "Ajouté A.4". Maintenant, quand il y a eu des mises à jour de central, j'ai besoin de fusionner localement avant de pousser, mon message de commit local est "fusionné en tip". De toute évidence, ce n'est pas un bon message à faire.

Qu'est-ce qu'une bonne pratique ici? Je ne connais aucun mécanisme pour modifier un message de commit existant, ou pour pousser avec un nouveau message de commit. Je ne veux pas faire un changement trivial à mon repo local simplement pour entrer un nouveau message de commit avant de changer; c'est juste idiot. Je dois manquer quelque chose parce que cela semble basique. Ou est-ce que je ne pense pas à Mercurial de la bonne façon?

Répondre

1

Pousser cinq changesets est parfaitement acceptable et il sera plus facile pour les autres de revoir le code. Essayez simplement de faire des changesets cohérents sur le plan logique. J'essaye habituellement de m'assurer que le code compile et passe des tests après chaque commit.

Il y a quelques extensions (collapse, rebase, histedit, mq) qui vous permettent de modifier changesets après le fait. L'extension collapse est ce que vous voulez ici: elle vous permet de réduire (combiner) vos cinq changesets locaux en un seul changeset que vous pouvez ensuite envoyer au serveur.

Il est important de réaliser qu'ils le font en créant de nouveaux changesets et en rejetant les anciens. Cela a pour conséquence que vous ne devez les utiliser que sur privateets changesets, c'est-à-dire, changesets qui n'a pas encore été partagé avec quelqu'un d'autre.

Si vous parvenez à modifier un ensemble de modifications qui a déjà été transféré vers votre référentiel central, alors ce n'est pas catastrophique - ce qui se passe, c'est que vous vous retrouverez avec le changeset original et le changeset modifié. Cela est dû au fait que hg push est uniquement en annexe et que vous ne pouvez donc pas modifier un ensemble de modifications qui a été transmis à un référentiel central.

+0

J'ai choisi cette solution parce qu'elle ressemble à "s'effondrer", c'est vraiment ce que je cherche. Cela me permettra de m'abandonner à n'importe quelle petite amélioration que je ferai au niveau local, puis de ranger dans un ou plusieurs changesets plus complets avant de partager mes mises à jour. Je me rends compte que cela pourrait affaiblir la fusion de mercurial dans certains cas, si elle ne peut plus voir toutes les petites mesures prises, alors je ferai attention. Je vous remercie. – jasper77

1

Je ne crois pas que Mercurial supporte cette forme d'ensemble de fonctionnalités. La meilleure façon de procéder est la suivante:

1) Une fois les modifications terminées, clonez votre référentiel central dans un nouveau dossier.
2) Exportez les fichiers de correctifs de toutes vos modifications de votre référentiel de travail original.
3) Importez les fichiers de correctifs dans votre dossier vierge nouvellement cloné.
4) Validez toutes les modifications à la fois dans le dossier nouvellement cloné et apportez ces modifications. Faire un script pour faire ces étapes ne devrait pas être trop difficile!

+0

Le clone est sur ssh, donc le script doit être interactif, mais il semble que cette approche fonctionne. Merci! Est-ce que ce n'est pas le modèle d'utilisation généralement accepté? – jasper77

1

Lorsque vous appuyez sur et spécifiez une révision, tous les ancêtres de cette révision qui ne sont pas déjà dans l'autre référentiel seront poussés. Si le changeset dépend de ceux qui le précèdent, alors c'est probablement le comportement que vous voulez.

Si vous souhaitez envoyer un seul ensemble de modifications (et qu'il est indépendant de ses ancêtres), vous pouvez réorganiser votre historique local de sorte que le changeset que vous voulez envoyer soit l'ancêtre. Le histedit extension le permettra. Si vous souhaitez condenser vos modifications locales et les envoyer en un seul ensemble de modifications, vous pouvez les "plier" ensemble en utilisant histedit.

Si vous voulez contourner le problème d'avoir beaucoup de "fusion" message, vous pouvez rebase vos modifications locales lorsque vous extrayez du référentiel central. Le résultat sera que vos changements sont parentés par leur dernière modification et l'historique du développement est linéaire.

Les files d'attente sont une solution (bonne/populaire), mais conçues pour résoudre un problème légèrement différent (maintenir les correctifs contre un autre référentiel). Bien sûr, je dis que n'ayant jamais utilisé l'extension mq. Si ce que vous voulez vraiment, c'est avoir une histoire locale différente de la centrale (par exemple maintenir tous vos messages locaux) alors les files d'attente sont la seule solution que je connaisse.

Questions connexes