Les grands référentiels mercuriels souffrent-ils d'une «course push»?

9

La lecture de quelques "Pourquoi un DVCS est meilleur" répond à plusieurs questions sur les programmeurs. Ils semblent tous dire qu'en général, le DVCS est meilleur car vous n'avez pas de course de commit dans les grands projets, IE commit, obsolète donc mise à jour, validation, obsolète à nouveau, validation, toujours obsolète, etc.

DVCS limite cela avec le concept de push. Mais dans les très gros projets, n'y aurait-il pas de «push race», surtout en fin de compte? Je sais que dans Git, cela est quelque peu remédié par la ramification constante pour tout, mais dans Mercurial vous ne branchez pas, vous créez une nouvelle tête.

Problème que je vois

  1. L'utilisateur tente de pousser
  2. Obsolète (mercurial ne vous laissera pas pousser si votre repo local est obsolète), donc vous tirez et fusionnez vos modifications locales
  3. L'utilisateur tente de pousser à nouveau, mais pendant qu'il fusionnait, quelqu'un d'autre a poussé, il est donc à nouveau obsolète
  4. Tirez et fusionnez à nouveau
  5. Toujours obsolète
  6. Répéter

Semble familier?

Est-ce un problème réel avec des dépôts mercuriels très importants et populaires? Qu'en est-il à l'intérieur d'une entreprise lorsque tout le monde fait son dernier effort de la journée?

TheLQ
la source
qui ne branche pas dans mercurial? hg branch myfeature; hg ci -m "Starting feature branch"; hg push --new-branch
Carson Myers
@Carson In git branches sont bon marché. En mercure ils sont beaucoup plus permanents. En général, j'ai entendu dire que dans git vous vous branchez pour travailler sur une fonctionnalité, dans mercurial vous créez une nouvelle tête ou un clone dans un répertoire différent.
TheLQ
Eh bien, vous pouvez ajouter un --close-branchlors de la validation - et mercurial a nommé des branches, vous n'avez pas besoin de cloner dans un nouveau répertoire
Carson Myers
@Carson Je ne dis pas que vous ne pouvez pas ou que ce n'est pas possible, je dis juste que j'ai toujours entendu que la convention était de cloner ou de créer une nouvelle tête, pas une branche. La plupart des dépôts mercuriels que j'ai vus n'ont que quelques branches tandis que les dépôts git ont tendance à avoir un tas
TheLQ
Je ne suis pas sûr, je n'ai jamais utilisé git
Carson Myers

Réponses:

8

Pour autant que je sache, la plupart des grands projets open source utilisant DVCS utilisent des «pull request» au lieu de push, c'est-à-dire qu'un utilisateur demande que le projet tire de sa branche, et le prject peut choisir d'entreprendre ces pull pulls dans n'importe quel ordre. , le cas échéant. Cela élimine les besoins de la «course push», comme vous l'avez nommé.

Dans d'autres entreprises, je ne peux pas garantir le processus, mais là où je travaille, ce n'est pas un problème.

Vous voyez, lorsque vous travaillez sur un cas, vous travaillez sur une branche de l'ensemble du référentiel, de sorte que vos demandes push vont à une version distante du tronc principal. Lorsque vous souhaitez intégrer votre changement (terminé) dans le coffre, vous chargez le coffre, tirez, fusionnez, poussez.

À l'occasion ( très occasionnellement), deux personnes essaieront de le faire en même temps (ce qui est généralement dû à des problèmes de communication). Dans ce cas, celui qui "perd" n'aura plus qu'à tirer, fusionner, pousser. Comme il n'y a pas de précipitation à 17 heures pour valider un référentiel central, le problème que vous avez décrit n'est pas vraiment là.

C'est la beauté du DVCS: la ramification est indolore, donc tout le monde peut travailler sur sa propre branche.

ÉDITER

Oh, je viens de remarquer votre commentaire "Dans Mercurial, vous ne branchez pas ...": Oui, vous le faites. Vous n'avez pas à le faire, mais comme il est si facile de le faire et que les avantages de le faire l'emportent sur le fait de ne pas le faire, vous avez tendance à ne faire que brancher les dépôts.

Ed James
la source
J'ai toujours entendu dire que vous clonez pour travailler sur des fonctionnalités expérimentales, pas sur des branches. La plupart des raisons que j'ai entendues sont que dans les branches mercuriales sont beaucoup plus permanentes que dans Git. Je peux me tromper cependant
TheLQ
C'est la chose, en ce qui concerne mercurial, un clone est une branche, vous pouvez toujours faire à peu près tout ce que vous pouvez faire avec une "tête" standard (et quelques autres choses!), Mais vous avez le luxe supplémentaire de tirer / pousser le niveau de distance du tronc. Je ne sais pas ce que vous voulez dire sur la permanence, lorsque vous avez terminé avec votre clone, vous pouvez simplement le supprimer.
Ed James
Comment se fait-il qu'il n'y ait pas de poussée à 17 h?
Cem Catikkas
Comme je l'ai dit, la plupart du temps, tout le monde travaille sur sa propre branche (il est très peu probable que vous travailliez exactement sur le même problème qu'une autre personne), alors que tout le monde pousse à la fin de la journée, c'est dans différentes branches. De plus, à mon travail, nous avons du temps flexible, donc c'est plus une course de 16 h à 18 h;)
Ed James
1

Non, il n'y a pas de course push car le travail se fait dans des branches thématiques . Un maître de fusion gère la complexité (relativement inférieure) de la combinaison des branches en une branche d'intégration . Cela se fait généralement en continu. Pour plus d'informations sur les workflows de contrôle de version distribuée, la première source serait la bouche du cheval: man gitworkflowsen ligne ici . Les flux de travail Mercurial font ramification utilisation malgré votre demande et les techniques sont similaires.

Rein Henrichs
la source
L'OP fait une distinction sur git et hg ici mais votre réponse est destinée à git (le premier lien est très orienté git, par exemple). C'est une bonne réponse (car la mauvaise interprétation originale de l'OP de la ramification en hg conduit à la question elle-même), mais il convient de noter que c'est la même chose pour hg.
Ed James
@Ed Bon point, mis à jour pour préciser que la réponse s'applique à la fois à git et à mercurial.
Rein Henrichs
voir le dépôt git.git, c'est un bon exemple de fusion avec DVCS. Il y a beaucoup de points de fusion. Il peut y avoir plus de 10 branches temporaires en même temps avant de finalement fusionner en branche principale.
linquize