with tag tab remove practices create commits commands best git synchronization repository

tab - github tags



¿Mantener automáticamente un repositorio secundario sincronizado con un repositorio primario? (2)

Tenemos una configuración de dos niveles.

Tenemos un repositorio primario (llamado ''primario'' a continuación).

Y un repositorio secundario (llamado ''secundario'' a continuación) que fue creado así:

$ git clone --bare --shared $REPO_A/primary secondary.git

Las personas que trabajan en el repositorio secundario ven las ramas que se originaron en el repositorio primario como de solo lectura, pero basan sus propias ramas en estas ramas.

Queremos sincronizar el repositorio secundario con el repositorio primario una vez al día.

Es decir, queremos compromisos y nuevas sucursales que fueron empujadas a la primaria para que sean visibles para las personas que trabajan desde el repositorio secundario (la próxima vez que hagan una extracción).

No queremos que esto sea simétrico, es decir, la actividad contra el repositorio secundario no será visible para aquellos que trabajan fuera del repositorio primario.

Idealmente, me gustaría ejecutar un trabajo cron que se ejecute en la máquina con el repositorio secundario simple que de alguna manera obtiene datos nuevos del primario y los incluye automáticamente en el secundario.

Esperaba que hubiera una forma sencilla de hacer esto (y espero que alguien aquí me diga que la hay).

Si tuviera que escribir un script para hacerlo, haría:

  • Crea un nuevo clon del secundario.

    $ git clone $REPO_B/secondary $ cd secondary

  • Consigue todas sus ramas.

    $ git branch -r | sed ''s?.*origin/??''

  • Consigue todas las ramas en el repositorio primario.

    $ git ls-remote --heads $REPO_A/primary | sed ''s?.*refs/heads/??''

  • Para cada rama primaria para la que no tengo ya una rama secundaria correspondiente:

    $ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME $ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME

  • Para cada rama primaria para la que ya tengo una rama secundaria correspondiente:

    $ git checkout -b $BRANCHNAME --track origin/$BRANCHNAME $ git pull $REPO_A/primary $BRANCHNAME $ git push

Como soy nuevo en git, no me sorprendería si no hubiera considerado ciertos temas fundamentales.

Y como dije, espero que haya una forma más sencilla de hacer esto, es decir, alguien dice "oh, no hagas todo eso, solo hazlo ...".



Puedes hacer un git clone --bare --mirror y hacer un git fetch periódicamente para que esto suceda.

Lo hago a tiempo real utilizando una herramienta llamada gitmirror que escribí en node.js que ejecuto en una máquina en casa para recibir webhooks de github, así como enlaces ad-hoc para sincronizar las confirmaciones.

Para un ejemplo no github, tengo un repositorio que se utiliza para una copia de seguridad couchdb que tiene un compromiso de una vez por hora. El trabajo cron básicamente se reduce a esto:

# do some backup stuff git commit -qam "Backup `date`" >> dump.log 2>&1

A partir de ahí, tengo un .git/hooks/post-commit post-commit ( .git/hooks/post-commit ) que se ve así:

#!/bin/sh curl -sS http://my.home.machine/gitmirror/bak/repo-name.git

Puedes lograr lo mismo empujando desde el lado receptor. Esto tiene la ventaja de disparar y olvidar la carga útil en el caso normal.