2010-03-22 5 views
1

Nous travaillons sur plusieurs sites géographiquement séparés. Aujourd'hui, j'ai nos clones git tous en direct sur un site A. Ensuite, les utilisateurs du site B doivent ssh plus de faire un clone git ou d'introduire des changements. Ce sont des repos sans frais où la mise à jour s'effectue par poussées.git: avoir 2 repos push/pull synchronisés (ou 1 push/pull et 1 pull-in sync)

Idéalement, pour les performances git clone/push, je voudrais limiter l'utilisation de ssh. Je voudrais avoir une copie de git repo X en direct sur le site A et le site B ... et avoir un mécanisme de synchronisation entre eux. OU avoir X sur les deux sites, mais permettre seulement de pousser à A (et avoir cette configuration correctement à l'heure de cloner sur B)

Je suis inquiet au sujet du cas où quelqu'un sur le site A pousse des changements au repo sur le site A en même temps que quelqu'un sur le site B pousse un changement vraiment contradictoire à la repo sur le site B.

Y a-t-il une solution de synchronisation intégrée dans git pour des repos ouverts distribués comme celui-ci?

Ou une façon d'avoir un clone de X définir l'origine/parent à l'X de l'autre site?

grâce,

-John

Répondre

0

Je sais que ce n'est pas la réponse à la question principale que vous avez demandé, mais il va être beaucoup, beaucoup plus facile si vous n'avez pas à faire face à l'intégration Deux référentiels centraux potentiellement conflictuels - bien sûr, vous pourriez trouver une configuration pour les synchroniser automatiquement, mais à un moment donné, les conflits doivent être résolus par l'homme.

Si les utilisateurs du site B peuvent se connecter au site A, ils devraient pouvoir pousser/tirer directement depuis le repo sur le site A - pousser/tirer via ssh est l'une des principales façons de travailler avec les télécommandes. Regardez le man page - vous ssh URLs parmi la liste.

donc sur le site B, vous aimerais ajouter une télécommande:

git remote add siteA ssh://[email protected]/path/to/repo.git 

Si vous avez vraiment des limites mauvaises de la bande passante et la nécessité de pousser/tirer très souvent, je suppose que cela pourrait en effet être un problème de performance? Je n'ai jamais eu de problème avec moi-même.

Vous pouvez théoriquement donner les deux points d'ancrage de post-mise à jour centraux qui poussent immédiatement vers l'autre repo central. Cela fonctionnerait bien jusqu'à ce qu'une poussée se produise dans les deux directions en même temps (peut-être cela est-il improbable?) - alors vous auriez besoin d'une vraie fusion, nécessitant un référentiel non nu, et éventuellement un intégrateur humain pour gérer les conflits. Mais tant qu'il n'y a pas de poussée simultanée, les repos seront toujours au même endroit, et vous n'avez pas à vous soucier des conflits. Si B est mis à jour, A est également mis à jour, et un utilisateur essayant de pousser quelque chose en conflit dans A sera forcé de le résoudre lui-même.

0

Il y a plusieurs façons de le faire. Il semble que vous vouliez surtout un endroit plus proche pour les gens à tirer sur le site distant B.

Depuis git repos ne font pas beaucoup de changements aux fichiers existants (surtout les fichiers refs/têtes) en utilisant quelque chose comme rsync fonctionne juste génial pour faire des copies de sauvegarde/doublons de repos. De cette façon, vous pourriez avoir un site B repo que les gens peuvent aller chercher/tirer sur le site B.Cela ne résout pas tout à fait le problème des deux sites qui poussent vers la même branche (ce problème est non destructif, dans le pire des cas, quelqu'un doit créer une fusion). commettre et pousser aux deux repos pour réconcilier les ensembles de patches).

Pour corriger cela, vous pouvez faire un site de la prise en pension primaire et le site B une seule lecture esclave. Vous pouvez spécifier une option dans votre fichier .git/config décrite dans la page de manuel git-fetch: pushInsteadOf. Dites que vos URL sont "ssh: // siteB" et "ssh: // siteA". Une configuration pour soutenir ce serait quelque chose comme ceci:

 
[url "ssh://siteB"] 
    pushInsteadOf = ssh://siteA 
Questions connexes