2010-02-22 4 views
11

Ma situation:Git: existe-t-il un moyen plus rapide de fusionner d'une branche à plusieurs branches plutôt que d'effectuer chacune d'elles en série?

J'ai récemment rejoint sur le côté frontal d'un projet établi qui implique un nombre croissant d'instances d'une application de rails, chacun qui diffèrent par certains aspects (vues, style , paramètres etc), mais qui partagent tous la majorité de leur code de retour.

Notre repo Git a un certain nombre de branches ressemble à quelque chose comme ceci:

master 
apple 
banana 
cherry 
... 
strawberry 
tangerine 
... 

où chaque branche dérivée de fruits est contient le code de production pour une instance de production.

(Master n'est pas utilisé pour un déploiement en direct, mais contient tout le code partagé et est ce que nous avions clone à partir de mettre en place une nouvelle instance.)

Mon problème:

travail spécifique à une seule instance est assez simple, prenant place dans celui dans la branche (ou une branche de dev de celui-ci) etc etc

Cependant, si j'ai besoin d'apporter une modification qui affectera tous les sites dans le cluster Je fais ça en ce moment dans une branche de dev et je la fusionne en master, et ensuite (ce qui m'embête) y vérifie chaque branche de production à tour de rôle et y fusionne le maître.

Même mon humble cerveau de singe de code peut voir que cela ne se met pas bien à l'échelle.

Pour le moment, nous avons quelque chose comme 8 branches de production, donc ce n'est pas si mal, mais le plan est pour la croissance et au moment où cela atteindra 20 (encore moins 50+) ça va être une douleur sérieuse. Ça va aussi être ma douleur personnelle, car c'est moi qui suis susceptible de faire face à cela au jour le jour.

Donc, mes questions réelles seraient:

  • Y at-il quelque chose dans la fonctionnalité git de base que je suis absent qui me permettra de fusionner avec élégance du maître dans n d'autres branches d'un seul coup? (peu probable je pense, mais vaut la peine néanmoins)
  • Sinon, pourrait-il y avoir un moyen de le faire avec crafty certains scripts shell? (dont je pourrais ajouter, je sais très peu, et comprendre encore moins)

Si ce dernier de ceux-ci peut-il m'aider à démarrer/me diriger dans la bonne direction?

Merci beaucoup d'avance pour votre temps et votre aide.

Répondre

8

Avant de répondre à cette question, je tiens à préciser que ce n'est qu'une bonne idée dans des cas comme celui-ci où les branches à fusionner sont des branches de production, pas des branches de développement. Si vous avez trouvé ce post à la recherche d'un moyen de fusionner les branches d'intégration (maître) dans toutes vos branches (développement) de sujet, la réponse est que vous ne devriez certainement pas le faire (see here).

D'accord, et la vraie réponse. Il n'y a pas de méthode intégrée, car (en supposant que ce ne soit pas un fast-forward), vous devez vraiment faire vérifier les fichiers pour que git fasse sa magie de fusion.Heureusement, vous ne faites pas beaucoup de choses (git checkout && git merge) donc ce n'est pas un problème pour écrire un script. Vous pouvez compliquez cela avec un fichier de configuration, ou même ajouter quelques trucs personnalisés à .git/config (par exemple git config branch.<branchname>.productionbranch true, puis utilisez les commandes git pour vérifier quelles branches ont ce jeu de drapeau), mais serait quelque chose comme la façon la plus simple ceci:

#!/bin/bash 

production_branches=(branch1 branch2 branch3) 

for branch in ${production_branches[@]}; do 
    if ! (git checkout $branch && git merge master); then 
     exit 
     # Exit on the first error 
     # If you want to just plow ahead, do something like this: 
     # git reset --hard  # make sure there aren't merge conflicts in the tree 
     # failed_merges="$failed_merges $branch" # remember for later 
    fi 
done 

# if you plowed ahead above, print the branches which failed to checkout+merge 
# if [ -n "$failed_merges" ]; then 
#  echo "Failed merges: $failed_merges" 
# fi 

Il existe, comme toujours, de nombreuses améliorations que vous pourriez apporter. Par exemple, vous pouvez utiliser certaines commandes git pour vérifier si master a déjà été fusionné dans une branche donnée, et éviter de le vérifier. Si vous vous déplacez sur des fusions échouées, vous pouvez effectuer la vérification et fusionner séparément si la vérification échoue (ce qui peut impliquer une arborescence de travail sale, ce qui signifie qu'elles échoueront toutes). Espérons que cela soit suffisant pour vous aider à démarrer!

+0

Hey Jefromi, merci pour la réponse très claire et utile - le temps pour moi de me salir les mains je pense ... –

+0

+1 pour cet article génial auquel vous avez lié! –