Copia de security de un repository de GitHub

¿Cuál es la mejor manera de crear una copy de security local de un repository git alojado en GitHub, dados los siguientes requisitos ?:

  1. La copy de security local debe ser un repository simple.

  2. La copy de security debe include todas las twigs.

  3. Debería ser fácil (incrementalmente) actualizar la copy de security.

Básicamente, quiero un espejo perfecto, con la posibilidad de actualizar fácilmente. Como tal, el command

git clone --mirror git://github.com/... 

Me viene a la mente, pero hasta donde sé, eso no permite una actualización sencilla (tendría que eliminar y volver a crear mi copy de security local). Además, la opción mirror para git clone parece bastante reciente, no la tengo en algunos de los sistemas en los que estoy trabajando (que tienen versiones un poco más antiguas de git clon).

¿Cuál es su solución recomendada para este tipo de problema?

Para crear el espejo:

 git clone --mirror git://github.com/user/project.git 

Actualizar:

 cd project.git git remote update 

Para actualizar sin cambiar el directory actual:

 git --git-dir project.git remote update 

No estoy seguro de que cubra todos tus requisitos, pero podrías consultar el package de git

 git bundle 

Este command proporciona soporte para git fetch y git pull para operar empacando objects y references en un file en la máquina de origen, luego importándolos en otro repository usando git fetch y git pull luego de mover el file de alguna manera.

Lo que me gusta de esa solución es el único file producido, con exactamente lo que quiero en él

git bundle solo includeá las references que se muestran en git-show-ref: esto incluye encabezados, tags y encabezados remotos.

 machineA$ git bundle create file.bundle master 

Nota: Kent Fnetworkingric menciona en los comentarios una sutileza de git rev-list :

 --all 

Supongamos que todas las references en $GIT_DIR/refs/ aparecen en la línea de command como <commit> .

Él añade:

su package actual solo includeá a los padres de la confirmación, probablemente necesite especificar --all para get un package completo de todo (twigs que son descendientes del maestro).

Para ver la diferencia:

 $ git bundle create /tmp/foo master $ git bundle create /tmp/foo-all --all $ git bundle list-heads /tmp/foo $ git bundle list-heads /tmp/foo-all 

pero por lo que puedo decir, eso no permite una actualización fácil (tendría que eliminar y volver a crear mi copy de security local).

No estoy seguro de lo que quiere decir con eso, actualizarlo debería ser tan simple como

 git fetch 

Se supone que git clone tal como está, capta todos los refs / commits que están visibles en la twig remota.

git clone --mirror tampoco es muy diferente a git clone --bare [fuente]

la única diferencia relevante es el git remote add --mirror shorthanded git remote add --mirror

(Ver la git help add para el comportamiento diferente)

Si estás realmente preocupado, puedes hacer esto:

 git clone --no-hardlinks --mirror $original $dest 

Lo cual solo hará algo diferente si estuvieran en el mismo sistema de files de todos modos.

Y si eres realmente paranoico, puedes atacar. (Gz | bz2) todo el directory y respaldarlo.

Si solo necesita hacer una copy de security de los repositorys de GitHub , puede echarle un vistazo al sencillo script de Bash.

https://github.com/ptrofimov/github-backup-sh

Lo que estás preguntando es bastante difícil de hacer dentro de las limitaciones de git. El problema es que ni la clonación ni la obtención te darán todas las twigs por defecto. Ver esta pregunta:

  • ¿Cómo actualizar todas las twigs a la vez ?

Para un ejemplo de clonación de un repository con múltiples twigs, aquí hay una transcripción:

 % git clone -o tufts linux.cs.tufts.edu:/r/ghc/git/experimental.git Initialized empty Git repository in /usr/local/nr/git/ghc/experimental/.git/ % cd experimental/ % git fetch % git branch -a * head tufts/HEAD tufts/experimental tufts/head tufts/norman % git branch --track experimental tufts/experimental Branch experimental set up to track remote branch refs/remotes/tufts/experimental. % git branch --track norman tufts/norman ... 

Puedes ver que clonar cada twig programáticamente va a ser un poco complicado.

Si github proporciona acceso a rsync o Unison estas son mejores herramientas para el trabajo. De lo contrario, tendrás que escribir algunas secuencias de commands de miedo …

Escribí un guión de ruby ​​con la ayuda de algunos otros:

https://github.com/walterjwhite/project.configuration/blob/master/scripts/github.com.backup.ruby

Ese script me permite download todos mis repositorys. Lo uso para realizar periódicamente una copy de security de los proyectos en los que estoy trabajando.

Espero que esto ayude, siéntete libre de ajustarlo. Creo que tiene un error, de vez en cuando, GitHub tendrá un time de espera y el script no se encarga de eso.