Comment gérez-vous les modifications mineures que vous souhaitez conserver locales dans mercurial?


9

J'envisage de migrer un référentiel cvs de 14 ans (historique intact) vers mercurial. Je pense que j'ai tous les bits de conversion technique, mais j'ai encore des questions sur le travail efficace dans mercurial.

L'une des choses que je vois beaucoup dans les bacs à sable des développeurs individuels (y compris les miens) est les modifications locales non validées qui ne sont pas prêtes à être poussées vers la ligne principale. Je crois comprendre que c'est une mauvaise chose. La plupart de mes expériences avec hg suggèrent que des changements non validés sont une mauvaise chose à avoir. L'incapacité de fusionner avec eux suffit pour cela. Donc, ce que je veux savoir, c'est comment les autres personnes qui utilisent mercurial dans le codage quotidien y font face. Comment gérez-vous les modifications incomplètes du code lorsque vient le temps de mettre à jour votre référentiel? Comment gérez-vous les changements locaux que vous ne souhaitez pas (encore) partager avec d'autres développeurs?

Réponses:


5

Je le gère de cette façon:

Dans mon référentiel local, j'engage chaque modification, même si j'expérimente. Si je suis d'accord avec l'expérience et qu'elle est testée, je la pousse vers le référentiel distant. Sinon, il reste dans mon référentiel local (ou retourne à une ancienne révision).

L'idée est que le référentiel distant ne contient que des versions opérationnelles et testées de mes projets.


3
Trouvez-vous que votre référentiel distant est encombré de commits de type «bug corrigé dans le dernier commit»?
nmichaels

4

Il y a deux ou trois choses que j'ajouterai.

L'une consiste à suggérer un flux de travail qui utilise judicieusement les étagères , qui sont livrées en standard avec TortoiseHg .

Chaque fois que je voulais valider une partie de mon répertoire de travail actuel, je mettais de côté les modifications que je ne voulais pas valider, recompilais (pour m'assurer que je n'avais pas mis de côté les bits qui entraînaient maintenant une compilation cassée), puis exécutais mes tests . Ensuite, j'engagerais l'ensemble complet, fonctionnel et testé. Enfin, je voudrais exécuter unshelve pour restaurer mes modifications.

Si j'avais des changements plus permanents, disons que je voulais qu'un fichier de configuration sur ma machine de développement pointe toujours vers le port local 3333 plutôt que sur le serveur de production, alors je chercherais à utiliser l'extension Mercurial Queues, qui est livrée avec Mercurial et TortoiseHg .


4

Je ne pense pas que des changements non engagés soient intrinsèquement une mauvaise chose. Vous faites référence à une "incapacité à fusionner avec eux" - si vous avez une modification non validée dans un fichier et que vous extrayez et mettez à jour une modification dans ce fichier, Mercurial démarrera le processus de fusion comme si vous l'aviez validé, puis demandé une fusion. Voulez-vous dire quelque chose de différent?

Ainsi, pour les modifications locales que vous ne souhaitez pas encore partager avec d'autres développeurs, vous avez deux approches. La première consiste à conserver les modifications dans votre copie de travail, mais pas à les pousser, et l'autre consiste à les mettre de côté, hors de la copie de travail. Le choix dépend de si vous souhaitez que ces modifications soient disponibles pendant que vous travaillez.

Si vous les conservez dans la copie de travail, les modifications entrantes fonctionneront correctement, il vous suffit donc d'éviter de créer des modifications sortantes, ce qui signifie éviter de les valider. Si les fichiers sont nouveaux, c'est facile - ne les faites pas hg add. S'ils sont déjà suivis, vous pouvez les exclure spécifiquement des validations avec hg commit --exclude foo.txt. Si vous avez un grand nombre de fichiers à exclure, ou si vous allez les exclure de nombreuses validations (par exemple pour une modification permanente d'un fichier de configuration local), regardez l' extension exclude .

Si vous êtes prêt à annuler les modifications, vous disposez d'un autre ensemble d'options. La chose la plus simple consiste simplement à utiliser hg diffsur les fichiers pour produire un correctif les décrivant, que vous gardez dans un endroit sûr, puis hg patch --no-commità réappliquer ce correctif lorsque vous souhaitez récupérer les modifications. Vous pouvez rendre cela plus fluide en installant l' extension de l' étagère , l' extension du grenier ou un autre parent. Vous pouvez également utiliser l' extension des files d'attente , mais cela utilise un marteau pour casser un écrou. Vous pouvez même simplement valider les modifications, puis mettre à jour vers le parent et valider d'autres travaux là-bas, en laissant les modifications dans une branche anonyme tronquée - hg commit -m 'temporary branch' && hg up $(hg log -r 'parents(.)' --template '{node}')(même si cela peut être plus facile à faire manuellement!). Vous devrez alors faire attention à ne pas pousser ce changement, cependant.


3

Deux approches de base sont utilisées pour séparer les flux de développement.

  • Branches nommées. L'idée est que vous travaillez sur votre propre branche, la nmichaels_branch_of_awesome. De cette façon, vous pouvez valider vos modifications sans faire frire le travail des autres. Ensuite, vous fusionnez avec d'autres personnes lorsque vous avez besoin de leur travail, et lorsque le moment est venu pour la fonctionnalité, vous passez à la branche plus stable pour l'intégration. Je préfère les branches nommées.

  • Clone anonyme. Cela crée un référentiel séparé pour votre sandbox. Ici, vous jouez jusqu'à ce que vous obteniez ce que vous voulez, puis (probablement) faites un patch MQ pour vos commits et repoussez d'où vous êtes parti. Je ne suis pas aussi friand de cette approche, car elle nécessite une gestion de répertoire et potentiellement du travail MQ, ce qui peut être délicat. Et avec certains dépôts, ils peuvent commencer à devenir un peu gros pour cela. Cela dit, cela semble être préféré par les développeurs de Kiln.


Il semble qu'il y ait quelqu'un dont le travail consiste à faire les bits d'intégration. Je ne suis pas disposé à ajouter mq à la liste des nouvelles choses que les gens vont devoir apprendre immédiatement, mais je vais réfléchir à mon aversion initiale pour l'idée de branches nommées. Elle pourrait ne pas être bien fondée.
nmichaels

Pour votre deuxième puce, pourquoi ne pas cloner, travailler et pousser uniquement lorsque vous avez terminé? MQ semble bien compliqué ici
TheLQ

@TheLQ: Cela fonctionne aussi, mais ce n'est pas différent du clonage direct à partir du référentiel de base. MQ écraserait les commits en un seul commit.
Paul Nathan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.