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?
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
enR2
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
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
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."
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.
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