Índice

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 commit
mv .git/hooks/pre-commit.sample .git/hooks/post-commit
# Añadir el comando a ejecutar
echo -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/bash

git 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 hook post-commit, usaremos post-merge. Éste hook se ejecutará cada vez que se haga un git merge <rama distinta="distinta" de="de" master="master"> sobre master.

Para activarlo:


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

El contenido del hook es:


#!/bin/bash

git 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

Automatically mirror a git repository