2010-11-28 19 views
6

J'ai besoin d'aide pour planifier le déroulement du workflow pour un environnement de développement de site spécifique récemment converti en Git (à partir de SVN).Workflow de développement Web Git: jongler avec la publication de correctifs urgents et de jalons multiples

J'ai 4 développeurs, des sites live et de transit sur le serveur client, et un serveur de dev qui héberge le "hub" (repo nu) plus 2 des repos des développeurs. Nous avons plusieurs étapes à franchir, avec un ordre d'avancement inconnu et travaillé par plusieurs développeurs. En outre, le site en direct a besoin de nombreuses solutions rapides à la volée.

Mes principales questions sont:

  • Comment les corrections urgentes adressées
  • Comment devrait publier une étape importante des changements vont

Mon cerveau commence à aller dans les boucles à essayer de comprendre le meilleur flux de travail Pour référence dans ce post, disons que j'ai deux jalons de changements: mobile et refonte. Voici ce que j'ai trouvé jusqu'à présent:

Chaque développeur, le repo de concentrateur et le repo de scène ont tous ces branches: mobile, refonte, master. Live repo a une branche: maître

FIXATIONS RAPIDES: développeur fait la modification de leur branche maître, pousse à hub. Puis, en direct, tire le changement du moyeu (ou de la scène d'abord s'ils ont besoin de tester auparavant). "RECADRER" MILESTONE: le développeur pousse la branche re-conception vers le hub et tire les changements sur scène. Le client teste et approuve. Au hub, le développeur fusionne la redesign en master (et crée une balise ici je pense), puis tire master en live. Ou serait-il préférable pour le développeur de fusionner les branches dans sa copie, alors il suffit de pousser son maître au hub. En outre, si un tag est créé, est-il préférable de simplement tirer le tag (si possible) sur live au lieu de tirer sur la branche master? Et les étiquettes devraient-elles seulement résider sur le repo de hub?

Répondre

2

Le flux de travail semble solide, à l'exception de la partie "fusion". Je précéderais toujours toute fusion avec un rebase d'abord: le développeur rebase son travail sur la branche master afin de résoudre tout conflit localement (comme le premier scénario que je décris dans "rebase vs. merge").
Cela rendra toute fusion ultérieure (après la rebase initiale) une fusion rapide.

(Jefromi mentions dans le commentaire que rebasage est pas toujours possible.
Il est vrai que chaque fois que des travaux ont déjà été poussé/tiré ailleurs, rebasage ce même travail est dangereux.)

Comme pour tirer l'étiquette ou maître à vivre, je préfère avoir seulement des balises déployées, pas HEAD de la branche. Signification Je pousserais un repo nu à vivre, qui aurait un post-receive ensemble de crochet pour mettre à jour un repo non nu (le site en direct réel) avec une étiquette que si ladite étiquette est au HEAD de la branche master (git describe peut vérifier facilement)

+0

Bien sûr, vous ne pouvez pas toujours rebaser, en particulier avec les correctifs - vous pouvez les fusionner dans une branche de maintenance et dans la version actuelle. Vous pouvez toujours faire en sorte qu'un développeur s'assure qu'il s'agit d'une fusion rapide dans le rapport public en effectuant la fusion localement. – Cascabel

+0

Génial, merci d'expliquer en profondeur sur les rebasages et quand le faire. A propos du hook, dites-vous que chaque fois que je crée un tag sur master, il va automatiquement pousser ce tag pour vivre? Je ne sais pas si j'ai bien compris. – spadeworkers

+0

@spadeworkers: l'idée est d'avoir un script capable de détecter si le commit poussé est une étiquette (c'est là que 'git décrit' entre). Si c'est un commit (ie avec un tag), alors ce tag sera poussé vers un repo non nu et ce repo non nu sera extrait avec ce tag (par le même script de hook 'post-receive') – VonC

1

À mon avis, votre flux de travail est de 75%. Voici comment je le ferais:

Le concept de base est que chaque branche représente un état du site Web.La branche principale est le travail en cours, c'est-à-dire ce que vous voyez sur votre site de transfert. Vous créez une branche "en direct" qui représente le site réel en cours. Vous avez alors autant de branches que vous avez besoin pour d'autres tâches. Vos développeurs insèrent leurs modifications dans le référentiel du concentrateur, chacune avec leurs branches. Lorsque vous êtes prêt avec une fonctionnalité, vous fusionnez/rebasez vos modifications dans la branche principale et vous le déplacez vers le concentrateur. Ensuite, vous synchronisez (push ou pull) ces modifications sur le site intermédiaire. Vous faites cela jusqu'à ce que vous soyez satisfait des changements. (Sur votre PC de développement), vous devez ensuite rebaser la branche en direct de la branche principale. Poussez-le sur le concentrateur, puis synchronisez (push/pull) vers le serveur live, ce qui met à jour le site Web.

Le bit vraiment important ici est que vous avez une branche distincte pour le site en direct. Cela permet à vos développeurs d'aller chercher la branche en direct et de faire des changements rapides sur le site.

Enfin une chose à noter, à l'exception des branches des développeurs locaux, toutes les branches sont dupliquées dans tous les dépôts. Cela permet à chacun de voir les différentes étapes du travail.

+0

Merci Cela rend les choses très claires. Je peux envisager d'utiliser ce modèle pour notre flux de travail. Et puis la balise serait créée après rebasage en direct de master sur mon pc dev, ce qui serait également (la balise) dupliquée après la poussée au hub et ailleurs. Est-ce correct? – spadeworkers

+0

Oui, c'est vrai. – rioki