Mantener sincronizados los repositorios git en diferentes hosts

34

Estoy pensando en comenzar un pequeño proyecto y quiero hacer su versión con git.

Bitbucket me parece una buena opción con su plan gratuito. Quiero usarlo como la herramienta principal para trabajar con git ya que tienen buenas herramientas como una interfaz web, un cliente de Mac OS, etc. Pero, para tener una mayor protección contra cualquier daño accidental que pueda causar el uso de un servicio de terceros, también quiero instalar git en mi NAS como una segunda copia de seguridad del repositorio.

Ahora mi pregunta es, ¿es posible crear un repositorio en dos hosts diferentes y luego mantenerlos sincronizados? Por ejemplo, suponga que una vez por semana actualizo el repositorio en mi NAS para que coincida con el de Bitbucket. Luego, en caso de que ocurra algo con Bitbucket, aún tendré el repositorio completo con un historial completo de desarrollo en mi almacenamiento NAS local.

¿Y hay alguna manera de importar un repositorio existente con historial completo a otro servicio git?


Creo que duplicar es lo que necesito. Este artículo parece describir exactamente lo que necesito. Y esto uno también.

Creo que hará una copia completa con el historial completo e incluso confirmará automáticamente nuevas versiones a los repositorios en ambos hosts automáticamente.

Estoy en lo cierto?

BartoNaz
fuente
Estoy usando xpdev. Me pregunto en su situación del sistema 2 cuál sería el beneficio de engañar a git en su caso. solo para estar seguro de cada compilación final, hago una copia de seguridad usb. Pero, básicamente, el control de versiones se maneja dentro de xpdev, por lo que no es un requisito real. Por cierto, si posee un NASS Raid1 infalible o por lo que podría considerar ejecutar sus propios sistemas de versiones, también hay algunos freeones
user613326
Pero quiero tener versiones completas disponibles en 2 lugares. Si el alojamiento de terceros muere, o la compañía que lo ejecuta, simplemente desaparece, quiero tener exactamente la misma experiencia con todo el historial de versiones ...
BartoNaz
Significa que tendré Bitbucket para mayor comodidad y git en NAS para un 99.9% de seguridad.
BartoNaz
En cuanto a xp-dev, es poco probable que tal compañía muera, podrían cambiar los planes de alojamiento de códigos, precios, etc. o fusionarse con otra compañía. Pero es un dinero lechero para ellos. Y también harán una copia de seguridad de los datos valiosos. Es su negocio mantenerse en su lugar. Lo uso con 3 desarrolladores, y nuestro código existe en 5 máquinas diferentes, donde siempre hay una copia de origen local que se sincroniza en xp dev. XP dev es gratis si solo tienes unos pocos proyectos.
user613326
1
Por supuesto, es poco probable. Pero aún así, nunca puedes estar 100% seguro ...
BartoNaz

Respuestas:

19

Sí, esa es exactamente la belleza de DVCS como git. Puede usar cualquier número de repositorios diferentes con el mismo estado que el de bitbucket o github.

Incluso su copia local (el repositorio en su computadora) suele ser un clon completo del repositorio remoto.

Lo único que tiene que hacer para mantener sincronizados múltiples repositorios es extraer uno (generalmente llamado origen o ascendente) y empujar a las copias de respaldo.

Wilbert
fuente
11
Lamentablemente, no todo es tan brillante. Vea la toma de advertencia de KDE cerca del desastre . Es decir, asegúrese de que la copia de seguridad no elimine las cosas (ramas, repositorios, etc.) que se eliminaron en el servidor respaldado.
Jan Hudec
Todavía no estoy seguro si lo entiendo correctamente. Según tengo entendido, empujar y tirar funciona con una versión determinada. Pero digamos que tengo una versión reciente del código en mi máquina de trabajo. Tengo el repositorio git en el host remoto (Bitbucket, Github o cualquier otra cosa), que tiene un historial completo del desarrollo del código hasta la versión más reciente que tengo en la máquina de trabajo (si se confirmó). Y tengo un repositorio en el NAS que está vacío. ¿Puedo importar el historial completo del código desde el host remoto a mi NAS para tener dos repositorios idénticos en dos lugares, y cómo?
BartoNaz
2
Clone el repositorio remoto, luego extraiga todas las actualizaciones (todas las ramas) a intervalos regulares. Un clon de git contiene el historial, no es como un pago de svn que solo tiene la última versión.
Wilbert
11

Aquí hay una solución probada para el problema: Repositorios de sincronización remota automática Git 2

Un script simple para sincronizar 2 repositorios remotos de Git

He buscado en la web un script simple que se sincronice. ¡2 repositorios remotos, pero no pude encontrar ese script incluso si muchos parecen buscarlo! Así que he creado 2 repositorios de prueba simples y comencé a probar y construir tal script.

¿Qué tal script debería hacer?

Bueno, en general, los pasos para hacerlo son simples: 1. Clonar el primer repositorio 1. Agregar el segundo como repositorio remoto adicional 1. buscar todo lo que hay en el segundo repositorio 1. empujar el repositorio local actualizado al 2 repositorios remotos.

El problema pendiente es: ¿cuáles son los interruptores correctos para todos los comandos git anteriores?

Asi que aqui esta...

Guión gisp 2repos-sync.sh

# Clear the folder first - please use this carefully
rm -rf $REPO_NAME  
# clone the reposotory
git clone --bare $ORIGIN_URL

# add a remote repository
cd $REPO_NAME
git remote add --mirror=fetch repo1 $REPO1_URL

# update the local copy from the first repository
git fetch origin --tags

# update the local copy with the second repository
git fetch repo1 --tags

# sync back the 2 repositories
git push origin --all
git push origin --tags
git push repo1 --all
git push repo1 --tags

NOTA : ¡este script no está resolviendo casos de conflictos entre el contenido del repositorio!

yorammi
fuente
Es posible que desee mencionar en su respuesta que lo primero que debe hacer es eliminar un directorio local existente con $ REPO_NAME. Esto parece importante y podría evitar la pérdida de datos para las personas que simplemente copian su solución.
Wilbert
Para acompañar esto, LibGit2 es útil para este tipo de cosas.
RubberDuck
0

Utilizo un GitLab privado para almacenar todos mis repositorios, por lo que solo tengo un origen al que presiono y extraigo mientras realizo el desarrollo diario.

Pero, para proyectos de código abierto, GitHub es una comunidad mucho más vibrante, por lo tanto, si quiero aceptar contribuciones de la comunidad a mis proyectos, utilizo el sistema de enlace web de GitLab para hacer ping a un servidor que ejecuto, que luego actualiza mis repositorios públicos en GitHub.

Esto me permite tratar a GitHub como otro control remoto del que puedo sacar cuando alguien contribuye, luego me fusiono, no-ff localmente, y hay un flujo de cómo todos mis repositorios públicos y primarios distribuyen los cambios.

diffalot
fuente