2010-10-06 5 views
1

Est-ce que svn-rebasing-and-pushing de plusieurs clients vers le même repo Git est vulnérable aux conditions de concurrence si les deux clients tentent de svn-rebase et de pousser simultanément?conditions de course si deux clients git svn rebase et git push au même repo git?

En savoir plus: Je suis en train de configurer un miroir hébergé par GitHub d'un projet SVN. Pour ce faire, la mise en miroir, je vais exécuter ce travail cron toutes les quelques minutes (par this article):

git svn rebase 
git.exe push origin master 

Pour la redondance, je voudrais avoir un autre serveur exécutant le même travail cron. Mais cela va-t-il rompre avec les conditions de course comme celles-ci?

  • Les deux serveurs se remastent presque en même temps. L'un va changer les changements et l'autre va essayer de pousser les mêmes changements.
  • Un serveur est rebasé, puis il y a un enregistrement SVN, puis l'autre serveur rebase et repousse rapidement la nouvelle vérification, puis le premier serveur, plus lent, essaie de repousser une vérification.

On souhaite que l'opération ultérieure renvoie simplement un no-op (alias "Tout mis à jour"). C'est également OK si le push en conflit échoue, aussi longtemps que si son job cron s'exécute plus tard sur un tmie non conflictuel, alors cela fonctionnera bien. Ce qui ne va pas, c'est si le repo local sur l'un ou l'autre serveur peut tomber dans un état où une intervention manuelle est nécessaire. Si ce genre d'échec est possible, comment devrais-je changer les commandes ci-dessus pour les rendre auto-récupérables?

+0

Je sais que ce n'est pas ce que vous avez demandé, mais pourquoi auriez-vous besoin de ce genre de redondance s'il n'y a qu'un seul serveur SVN en premier lieu? –

+0

Question raisonnable. Le repo SVN est dans un centre de données géré par des administrateurs système professionnels, tandis que les tâches cron en miroir seront sur des serveurs personnels gérés par un administrateur système très peu professionnel ... moi! Donc, avoir une certaine redondance est bon. De plus, je veux la liberté de prendre un serveur de mise en miroir pendant un jour ou deux sans que le miroir ne vole. –

Répondre

2

Je ne pense pas que vous rencontrerez des problèmes particuliers à faire cela. Pousser dans un référentiel nu avec Git par défaut interdit les poussées non "fast-foward", donc s'il y avait n'importe quel type de conflit alors cette poussée échouerait temporairement. (Le suivant, s'il n'y a pas de conflit à ce moment-là, réussirait.)

Ces situations doivent être faciles pour vous de tester manuellement, par des séquences en cours d'exécution comme:

Instance A   Instance B 
----------   ---------- 
git svn rebase 
         git svn rebase 
git push 
         git push 

et

Instance A   Instance B 
----------   ---------- 
git svn rebase 
         git svn rebase 
         git push 
git push 
+0

Je pense que vous voulez dire "Pousser dans un dépôt nu avec Git par défaut interdit les poussées NON-'fast-foward '." :-) – ebneter

+0

@ebneter: Bonne prise, merci! –

+0

Merci @greg, ça sonne bien. –