Cómo sincronizar dos repositorios git


Tengo dos repositorios git en diferentes PCs. Tengo algunas sucursales locales en cada una de ellas. No quiero enviar estas ramas al servidor remoto, solo mantenerlas locales. ¿Cómo puedo sincronizar entonces sin usar una web? ¿Puedo simplemente comprimir el repositorio en un PC y moverme a otro? ¿Es seguro? Tal vez pueda exportar de alguna manera los cambios más recientes de cada rama?

Author: Wolf, 2011-02-01

4 answers

En lugar de hacer un clon desnudo, prefiero hacer un paquete (ver " ¿Cómo puedo enviar un correo electrónico a alguien con un repositorio git?"), que genera un archivo , más fácil de copiar (en una memoria USB, por ejemplo)

La ventaja es que tiene algunas de las características de un repo desnudo: puedes extraerlo o clonarlo.
Pero solo hay que preocuparse por un archivo.

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

Esto definirá un control remoto llamado "origin " en el repositorio resultante que le permite obtener y extraer del paquete. El archivo $GIT_DIR/config en R2 tendrá una entrada como esta:

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

Para actualizar la mina resultante.repositorio git, puede obtener o extraer después de reemplazar el paquete almacenado en /home/me/tmp/file.bundle con actualizaciones incrementales.

Después de trabajar un poco más en el repositorio original, puede crear un paquete incremental para actualizar el otro repositorio:

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

Luego transfiere el paquete a la otra máquina para reemplazar /home/me/tmp/file.bundle, y tirar de ella.

machineB$ cd R2
machineB$ git pull
 24
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:17

Ver esta entrada de blog "Sincronización de repositorios Git sin un servidor " (por Victor Costan).

Este post describe un método para enviar cambios entre dos repositorios sin usar un servidor con conexiones de red a ambos hosts que tengan repositorios

Inicie creando un repositorio en la memoria USB.

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

Luego registre el repositorio en la memoria USB como un repositorio remoto, y empuje la rama deseada a él (si no quiero empujar maestro, sustituir la rama deseada).

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

En el futuro, puede tratar el repositorio USB como cualquier otro repositorio remoto. Solo asegúrese de que esté montado :) Por ejemplo, lo siguiente envía nuevos cambios al repositorio USB.

git push usb

En el extremo receptor, monte la memoria USB y use una URL de archivo para el repositorio

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

Unos cuantos comandos útiles:

# 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
Author: mpenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-01 08:39:50

La copia directa de un repositorio al otro sistema de archivos es una alternativa al clon desnudo o al bundle. Después de copiar, puede configurar el repositorio copiado directamente como un remoto local, lo que puede parecer poco intuitivo, para obtener y fusionar en el primer repositorio.

Es decir, para fusionar repo2 de un segundo equipo en ~ / repo1, primero copie repo2 al sistema de archivos repo1 en ~ / repo2 (memory stick, network copy, etc.) y luego puedes usar la respuesta a Git tirando de cambios entre dos repositorios locales :

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

Esto funciona porque como el artículo de wikipedia sobre git dice: "Un repositorio Git - datos y metadatos - está completamente contenido dentro de su directorio, por lo que una copia normal a nivel de sistema (o renombrar, o eliminar) de todo un repositorio Git es una operación segura. La copia resultante es independiente e inconsciente del original."

 5
Author: sage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:18

Me gustaría añadir un pequeño giro a las cosas. La información en otras publicaciones parece correcta, pero me gustaría mencionar algunas cosas adicionales que hago en la práctica.

Si lo hago

git remote -v

Obtengo información como esta

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)

Básicamente he definido varios controles remotos con nombres USB en lugar de solo uno como se sugiere ya que la letra de unidad asignada a mi dispositivo USB cambia dependiendo del puerto en el que lo inserte.

Luego corro un script con contenidos como esto

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

La intención es enviar todas las ramas y todas las etiquetas al repositorio USB si existe y donde quiera que esté. (El indicador-d está comprobando la existencia del directorio del repositorio git y el código condicional solo se ejecuta si el directorio existe.)

La pregunta original decía: Tengo algunas ramas locales en cada una de ellas. No quiero enviar estas ramas al servidor remoto, solo mantenerlas locales. ¿Cómo puedo sincronizar ...

El push-ally push tags tags comando hacer esta sincronización, asegurándose de que todas las ramas y etiquetas se empujan al repositorio USB, incluso los nuevos que el repositorio USB no era consciente de. No hay incumplimiento para dominar o la necesidad de saber los nombres de las ramas y el manejo de ellos uno por uno.

Corro esto con fines de copia de seguridad, por lo que solo he mostrado el lado push de las cosas, y reducido el número de proyectos y repositorios. En realidad hago copias de seguridad de varios proyectos a múltiples ubicaciones, pero solo los elementos USB repetidos son relevantes aquí.

Otra cosa que es bastante obvia pero que no he visto mencionada, es que para sincronizar PC A y PC B, necesitaría

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!

O visto de manera diferente, ir

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

De modo que en última instancia las ramas y las etiquetas son las mismas en las dos máquinas.

 0
Author: user3070485,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 13:14:32