Sincronización de proyectos en git con hooks (ganchos)

04/04/2019Artículo original

Sincronización de proyectos en git con hooks (ganchos)

Repositorio espejo (Mirror repo)

Problema

Hace unos días me encontré con un problema a resolver. Supongamos que tenemos dos repositorios en git, y queremos que todo lo que publicamos en uno se publique automáticamente en el otro, para mantenerlos sincronizados. Ésto es lo que se llama un repo espejo (mirror repos)

Repositorios a sincronizar

Supongamos que los repositorios se llaman repo1 y repo2. Pretendemos que repo2 esté sincronizado (sea un espejo) del repo1. Ésto significa que no tendremos que clonar en ningún momento el repo2. En local únicamente tendremos el repo1.

Solución

La respuesta, como es habitual, la encontré tras buscar un poco en stackoverflow. Gracias a Manoj Govindan

Añadir repo2 como remote

Dentro de repo1 añadiremos un nuevo remote que sea el repo2:

git remote add repo2 <url-repo2>

Configurar el hook (gancho) post-commit

Dentro del repositorio, crearemos un nuevo hook que se ejecute cada vez que hagamos un commit en repo1. Por cada commit, ejecutaremos un git push repo2, lo cual enviará los cambios al repo2.

# Crear el hook que se ejecutará en cada commitmv .git/hooks/pre-commit.sample .git/hooks/post-commit# Añadir el comando a ejecutarecho -e "#!/bin/bash\n\ngit push repo2 -f --mirror" > .git/hooks/post-commit

En contenido del hook, para que se vea más claro es el siguiente:

#!/bin/bashgit push repo2 -f --mirror

Conclusión

Nota: Con este gancho, se mantendrán sincronizados ambos repositorios. Es necesario notar que tras hacer el commit del repo1, sigue siendo necesario ejecutar git push en repo1

Mantener sincronizada una única rama

Un problema similar podría ser mantener sincronizado en repo2 únicamente las ramas master. De forma que podamos crear tantas ramas como necesitemos en repo1 sin que se vean reflejadas en repo2. Para ello, en lugar de usar el hookpost-commit, usaremos post-merge. Éste hook se ejecutará cada vez que se haga un git merge sobre master.

  Google Cloud Industries revela que la COVID ha acelerado la implementación de la Inteligencia artificial en la industria

Para activarlo:

# Crear el hook que se ejecutará en cada commitmv .git/hooks/pre-commit.sample .git/hooks/post-merge# Añadir el comando a ejecutarecho -e "#!/bin/bash\n\ngit push repo2 master:master" > .git/hooks/post-merge

El contenido del hook es:

#!/bin/bashgit push repo2 master:master

git push repo2 master:master podría leerse como: Publica en el repo2 en la rama master, el contenido de la rama master del repo actual

Referencias

  Copiado de texto al portapapeles con JavaScript

Relacionados

  Hay más demanda que nunca para el talento open source: un nuevo informe de la Fundación Linux muestra que sobran ofertas de trabajo
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad