web-dev-qa-db-fra.com

Comment synchroniser deux dépôts git

J'ai deux référentiels Git sur différents PC. J'ai quelques branches locales sur chacun d'eux. Je ne veux pas envoyer ces branches sur un serveur distant, conservez-les simplement locales. Comment puis-je synchroniser sans utiliser de site Web? Puis-je simplement compresser le référentiel sur un PC et passer à un autre? Est-ce sécuritaire? Peut-être que je peux exporter les modifications les plus récentes de chaque branche?

33
szaman

Plutôt que de créer un clone nu, je préfère créer un bundle (voir " Comment envoyer à un utilisateur un dépôt git? "), qui génère le fichier un, plus facile à copier (sur une clé USB par exemple)

Le bonus est qu’il présente certaines des caractéristiques d’un repo nu: vous pouvez en tirer ou le cloner.
Mais ne vous inquiétez que du fichier un.

machineB$ git clone /home/me/tmp/file.bundle R2

Cela définira une télécommande appelée "Origin" dans le référentiel résultant qui vous permettra de récupérer et d'extraire de l'ensemble. Le fichier $GIT_DIR/config dans R2 aura une entrée comme celle-ci:

[remote "Origin"]
    url = /home/me/tmp/file.bundle
    fetch = refs/heads/*:refs/remotes/Origin/*

Pour mettre à jour le référentiel mine.git résultant, vous pouvez extraire ou extraire après avoir remplacé l'ensemble stocké dans /home/me/tmp/file.bundle par des mises à jour incrémentielles.

Après avoir travaillé davantage dans le référentiel d'origine, vous pouvez créer un ensemble incrémentiel pour mettre à jour l'autre référentiel:

machineA$ cd R1
machineA$ git bundle create file.bundle lastR2bundle..master
machineA$ git tag -f lastR2bundle master

Vous transférez ensuite le paquet sur l’autre machine pour remplacer /home/me/tmp/file.bundle et vous en extrayez.

machineB$ cd R2
machineB$ git pull
24
VonC

Voir cet article de blog "Synchroniser les référentiels Git sans serveur" (par Victor Costan ).

Cet article décrit une méthode permettant de transférer des modifications entre deux référentiels sans utiliser de serveur avec des connexions réseau vers les deux hôtes disposant de référentiels.

Démarrez en créant un référentiel sur la clé USB.

mkdir /path/to/usb/stick/repository.git
git clone --local --bare . /path/to/usb/stick/repository.git

Ensuite, enregistrez le référentiel sur la clé USB en tant que référentiel distant et insérez-y la branche souhaitée (si vous ne souhaitez pas transmettre le fichier maître, remplacez-le par la branche souhaitée).

git remote add usb file:///path/to/usb/stick/repository.git
git Push usb master

À l'avenir, vous pourrez traiter le référentiel USB comme tout autre référentiel distant. Assurez-vous simplement qu'il est monté :) Par exemple, ce qui suit pousse les nouvelles modifications dans le référentiel USB.

git Push usb

Sur le destinataire, montez la clé USB et utilisez une URL de fichier pour le référentiel

file:///path/to/usb/stick/repository.git

Quelques commandes utiles:

# cloning the repository on the USB stick
git clone file:///path/to/usb/stick/repository.git
# updating a repository cloned from the USB stick using the above command
git pull Origin
# adding the USB stick repository as a remote for an existing repository
git remote add usb file:///path/to/usb/stick/repository.git
# updating from a remote repository configured using the above command
git pull usb master
22
mpenkov

La copie directe d'un référentiel vers l'autre système de fichiers est une alternative au clonage nu ou au regroupement. Après la copie, vous pouvez configurer directement le référentiel copié en tant que télécommande locale (il peut sembler inattendu, comme une télécommande locale peut sembler) de récupérer et de fusionner dans le premier référentiel. 

C'est à dire. pour fusionner repo2 d’un deuxième ordinateur dans ~/repo1, copiez d’abord repo2 dans le système de fichiers repo1 sous ~/repo2 (clé USB, copie réseau, etc.), puis utilisez la réponse à Git en modifiant les modifications entre deux dépôts :

~/repo1 $ git remote add repo2 ~/repo2
~/repo1 $ git fetch repo2
~/repo1 $ git merge repo2/foo

Cela fonctionne parce que l'article de Wikipédia sur git dit: "Un référentiel Git - données et métadonnées - est entièrement contenu dans son répertoire. Une copie normale au niveau système (ou renommer, ou supprimer) d'un référentiel Git complet est une opération sûre. La copie obtenue est à la fois indépendante et non consciente de l'original. "

5
sage

Je voudrais juste ajouter un peu de torsion aux choses. Les informations dans d'autres publications semblent correctes, mais j'aimerais mentionner quelques choses supplémentaires que je fais en pratique.

Si je fais

git remote -v

Je reçois des informations comme celle-ci

USB_F   file:///f/Git_repositories/projectname.git (fetch)
USB_F   file:///f/Git_repositories/projectname.git (Push)
USB_G   file:///g/Git_repositories/projectname.git (fetch)
USB_G   file:///g/Git_repositories/projectname.git (Push)

En gros, j'ai défini plusieurs télécommandes avec des noms USB au lieu d'un seul comme suggéré, car la lettre de lecteur attribuée à mon périphérique USB change en fonction du port dans lequel je l'insère.

Je lance ensuite un script avec un contenu comme celui-ci

cd /path/to/projectname

if [ -d /f/Git_repositories/projectname.git ] 
then
    git Push USB_F --all
    git Push USB_F --tags
fi
if [ -d /g/Git_repositories/projectname.git ] 
then
    git Push USB_G --all
    git Push USB_G --tags
fi

L'intention est de pousser toutes les branches et toutes les balises vers le référentiel USB s'il existe et où qu'il se trouve. (L'indicateur -d vérifie l'existence du répertoire du référentiel git et le code conditionnel ne s'exécute que si le répertoire existe.)

La question initiale était la suivante: J'ai des succursales locales sur chacune d’elles. Je ne veux pas envoyer ces branches sur un serveur distant, conservez-les simplement locales. Comment puis-je synchroniser ...

La commande Push -all et Push -tags effectue cette synchronisation en s'assurant que toutes les branches et les balises sont placées dans le référentiel USB, même les nouvelles dont le référentiel USB n'était pas conscient. Il n’existe aucun défaut de maîtriser ou de connaître les noms des branches et de les manipuler une à une.

J'exécute ceci à des fins de sauvegarde, donc je n'ai montré que le côté Push et réduit le nombre de projets et de référentiels. En réalité, je sauvegarde plusieurs projets sur plusieurs emplacements, mais seuls les éléments USB répétés sont pertinents ici.

Une autre chose qui est assez évidente mais que je n’ai pas vue mentionnée, c’est que pour synchroniser les PC A et PC B, vous devez 

1. sync PC A and the USB device
2. sync PC B and the USB device
3. sync PC A and the USB device again!

Ou vu différemment, allez 

PC A -> USB -> PC B
PC B -> USB -> PC A

de sorte que les branches et les étiquettes sont les mêmes sur les deux machines.

0
user3070485