04/04/2019Artículo original
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
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