Meilleures pratiques pour les dépôts git sur les projets open source

Je contribue à un projet open source assez petit hébergé sur Github. Pour que d'autres personnes puissent profiter de mon travail, j'ai créé ma propre fourchette sur Github. Malgré le choix de terminologie de Github, Je ne souhaite pas totalement diverger du projet principal. Cependant, je ne m'attends pas à ce que tout mon travail soit accepté dans le référentiel principal. Certaines d'entre elles ont déjà été fusionnées dans le référentiel principal et je m'attends à ce que cela continue. Le problème que je rencontre est la meilleure façon pour garder nos deux arbres dans un état où le code peut être partagé entre eux facilement.

Certaines situations que j'AI ou que je rencontrerai incluent:

  • Je commit le code qui est accepté plus tard dans le référentiel principal. Quand je tire de ce référentiel à l'avenir, mon commit est dupliqué dans mon référentiel.
  • Je commit du code qui n'est jamais accepté dans le référentiel principal. Quand je tire de ce référentiel à l'avenir, les deux arbres ont divergé et le réparer est dur.
  • une autre personne arrive et fonde son travail sur mon dépôt. Ainsi, je devrais si possible éviter de changer les commits que j'ai poussés, par exemple en utilisant git rebase.
  • je souhaite soumettre du code au référentiel principal. Idéalement, mes modifications devraient facilement pouvoir être transformées en correctifs (idéalement en utilisant git format-patch) qui peuvent s'appliquer directement et proprement au référentiel maître.

Autant que je sache, il y a deux, voire trois façons de gérez cela, dont aucun ne fonctionne particulièrement bien:

  • exécutez fréquemment git rebase pour garder mes modifications basées sur la tête du référentiel amont. De cette façon, je peux éliminer les commits dupliqués, mais je dois souvent réécrire l'histoire, ce qui pose des problèmes aux personnes qui veulent tirer leur travail du mien.
  • fusionne fréquemment les modifications du référentiel amont dans le mien. Cela fonctionne bien de mon côté mais ne semble pas faciliter la soumission de mon code au référentiel amont.
  • Utilisation une combinaison de ceux-ci et peut-être git cherry-pick pour garder les choses en ordre.

Qu'ont fait les autres personnes dans cette situation? Je sais que ma situation est analogue à la relation entre les différents contributeurs du noyau et le référentiel principal de Linus, donc j'espère qu'il existe de bonnes façons de gérer cela. Je suis assez nouveau pour git, donc je n'ai pas maîtrisé toutes ses nuances. Enfin, en particulier en raison de Github, ma terminologie peut ne pas être entièrement cohérente ou correcte. N'hésitez pas à corriger je.

32
demandé sur orangejulius 2009-09-05 07:22:14

1 réponses

Quelques conseils que j'ai appris d'une situation similaire:

  • avoir une branche de suivi à distance pour le travail de l'auteur en amont.
  • Tirez les modifications de cette branche de suivi dans votre branche maître de temps en temps.
  • créez une nouvelle branche pour chacun des sujets sur lesquels vous travaillez. Ces succursales devraient généralement être locales seulement. Lorsque vous obtenez des modifications d'amont en maître, rebasez vos branches de sujet pour refléter ces modifications.
  • Lorsque vous avez terminé le travail sur un sujet, fusionnez en maître. De cette façon, les personnes qui dérivent du travail du vôtre, ne verront pas trop d'histoire réécrite, puisque le rebasage s'est produit dans vos branches de sujet locales.
  • soumettre des modifications: votre branche master sera essentiellement une série de commits, dont certains sont les mêmes qu'en amont, le reste est à vous. Ce dernier peut être envoyé en tant que correctifs si vous le souhaitez.

Bien Sûr, votre choix de noms de branches et de télécommandes est le vôtre. Je ne suis pas sûr que ce soit exhaustif pour le scénario, mais ils couvrent la plupart de mes obstacles.

17
répondu sykora 2009-09-05 03:53:26