Í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 de 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
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.
Quizá también te interese leer...
- Cómo Eliminar Ficheros Demasiado Grandes Para GitHub
- Cómo mostrar información de un repositorio Git en el prompt de tu terminal
- La generación GitHub: Por qué ahora todos estamos en el opensource
- 21 alias útiles para git
- Minería en tu comunidad de github con R - Analizando la popularidad de los lenguajes