2010-10-08 4 views
3

J'ai un repo appelé MySharedLib, et un autre repo appelé MyProject. MySharedLib est inclus dans de nombreux repos différents en tirant la force (comme un Jedi), et en n'utilisant PAS les sous-états.Comment puis-je envoyer des modifications spécifiques à un dépôt de bibliothèque partagé dans Mercurial?

Si vous clone MyProject, il vous reste la structure suivante:

/MyProject 
    MySharedLib 
    OtherStuff 
    Files... 

MySharedLib est pas un subrepo. Tirer des changements de MySharedLib est aussi facile que la course:

hg pull -f path/to/MySharedLib. 

Mais si des modifications sont apportées à/MyProject/MySharedLib, quelle est la façon la plus simple/standard pour pousser uniquement les modifications à la prise en pension de MySharedLib?

MQ? hg exportation? hg diff? greffe de hg? Ma compréhension est que presque toutes ces options fonctionnent (certains ensemble, certains à part), mais j'aimerais avoir une direction.

Et puis ce qui se passe si un dev fait un commit qui inclut d'autres fichiers que ceux au sein MySharedLib? Évidemment, c'est quelque chose à éviter, mais je suis juste curieux.

+0

Et maintenant j'ai le problème de choisir une réponse à approuver parmi deux bonnes réponses. Est-ce que l'un de vous a une préférence? Je pense à Ry4an, car il a une utilité plus générale, mais Omnifarious semble avoir besoin de plus de points que Ry4an ... – Andrew

Répondre

2

Wow, quelle configuration bizarre. Comment empêcher que les modifications apportées à MySharedLib soient transférées vers MyProject? Comment les fichiers de MySharedLib apparaissent-ils à moins que vous ne fassiez une fusion après les avoir tirés? Une fois que vous faites la fusion, les repos sont joints et vous devrez faire usage avancé de hg convert (comme décrit dans ce question about splitting repositories) pour les séparer à nouveau.

Ne faites pas cela. Utilisez les sous-états. Ce problème est ce qu'ils existent pour résoudre.

+0

Merci pour le commentaire. Utiliser des sous-états est en fait ce que j'essaie d'éviter, car c'est ce que nous avons maintenant. C'est un grand projet .net, et les bibliothèques partagées avec lesquelles nous traitons sont activement développées et ne sont pas externes. Les sous-rapports ont des problèmes de statut et de clonage local et de branchement, et donc j'essayais de le rendre aussi facile que possible pour les développeurs. Mais, si les sous-déclarations sont la façon la plus simple et la plus standard d'aller, alors c'est ce que je vais suivre. – Andrew

+0

@Andrew - Avez-vous soumis des rapports de bogues ou êtes-vous allé sur la liste d'utilisateurs ou sur IRC pour vous poser des questions sur les problèmes que vous rencontrez avec les sous-enregistrements? Ce n'est pas comme si la façon dont ils travaillaient était gravée dans la pierre. S'il y a un problème avec eux, il est possible qu'ils puissent être corrigés. Votre méthode d'avoir plusieurs arbres parallèles «non reliés» dans le même rapport est ... intéressante. Mercurial doit aussi avoir une façon de travailler sur une partie seulement d'un projet, et une façon de travailler avec une histoire incomplète. Je me demande si un moyen pour que votre méthode fonctionne ne tombe pas en panne. – Omnifarious

+0

Je pense que le problème principal avec eux en ce moment est d'utiliser un serveur central et d'avoir des sous-bibliothèques partagées, au lieu de bibliothèques distantes ... comme dans, cette bibliothèque est partagée, mais le travail se fait en interne, contrairement à quelque chose que vous utilisez, mais ne contribuez jamais.Pour un développeur novice, avoir à faire face à des sous-dépôts est confus et sujet aux erreurs. Une fois que vous comprenez comment ils fonctionnent, les problèmes disparaissent, mais cela prend beaucoup de temps et ne convainc pas mon équipe que «mercurial is awesome» est plus facile! :) J'ai lu une page wiki qui parlait des changements à venir ... – Andrew

7

Voici les contraintes qui régissent ce que vous pouvez pousser:

  • vous ne pouvez pousser tout le changesets - si vous vous engagez quelques changements ensemble, il est tout ou rien sur le front de pousser, vous ne pouvez pas briser une fois que vous commettez changeset il
  • vous ne pouvez pas pousser sans pousser un changeset tout cela ancêtre changesets à

donc, une fois que vous avez commis une histoire linéaire comme ceci:

[0]---[1]----[2]-----[3] 

vous pouvez pousser changesets zéro et un sans pousser deux et trois, mais si vous voulez pousser deux vous devez aussi pousser zéro et un.

Et si l'un contient changeset changements à la fois/MyProject/autreschoses et/MyProject/MySharedLib/vous devez pousser les ensemble.

Votre seule flexibilité est avant de vous engager où vous pouvez contrôler:

  • ce qui se passe dans un changeset
  • ce que les parents d'un changeset sont (qui doivent également être poussé avec elle)

donc, si votre histoire ressemble actuellement à ceci:

[0]---[1] 

une nd hg status est montrant quelque chose comme ceci:

M MyProject/OtherStuff/file1 
M MyProject/OtherStuff/file2 
M MyProject/MySharedLib/file3 
M MyProject/MySharedLib/file4 

Alors, vous voulez faire un nouveau changeset qui n'a que les changements pour MySharedLib que vous voulez pousser:

hg commit --include MyProject/MySharedLib 

rendre votre histoire ressembler à:

[0]----[1]-----[2] 

puis, avant de vous engager les changements dans autreschoses vous ne voulez pas vous pousser faire un hg update pour changer le cours parent révision afin que votre nouveau changeset aura un parent d'un au lieu de deux:

hg update 1 

Maintenant, quand vous faites:

hg commit 

votre nouveau changeset, trois, aura uniquement les modifications non MySharedLib et un parent d'un, de sorte que vous l'histoire ressemblera à ceci:

[0]-----[1]--------[2] 
      \ 
      --------[3] 

Depuis deux et trois ne sont pas un autre ancêtres, vous pouvez pousser l'un sans pousser l'autre. Cela dit, omniforme est juste: votre utilisation n'est pas seulement étrange, c'est faux et out out. Vous devriez regarder une configuration de subrepo. Il atteint presque certainement vos objectifs mieux que ce que vous ou moi venons de décrire.

+0

Merci beaucoup pour l'explication claire de la façon de gérer plusieurs têtes à dessein. Comme je l'ai dit dans le commentaire à la réponse de omnifarious, j'utilise actuellement des sous-états, et je cherchais simplement à savoir s'il y avait un meilleur moyen, puisque les sous-états ont des problèmes de clonage local, de branchement et ne montrent pas nécessairement leur statut . Toute mon équipe est nouvelle à Mercurial, et les sous-états ne sont qu'une chose de plus à enseigner et à gérer, et je voulais être sûr d'avoir fait le bon choix au départ. Merci encore pour la bonne explication. – Andrew

+0

Pas de problème. Les sous-rapports sont définitivement un peu compliqué en ce moment, mais ils s'améliorent à chaque sortie. –

+0

En effet! Je pense qu'un aperçu des sous-éléments est que leur utilisation pour les bibliothèques partagées (c'est-à-dire que vous y contribuez) est complètement différente de leur utilisation pour les bibliothèques distantes (que vous venez juste d'utiliser comme API). – Andrew

Questions connexes