Copia de seguridad de un repositorio de GitHub

5 minutos de lectura

Copia de seguridad de un repositorio de GitHub
Michael Goerz

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

  1. La copia de seguridad local debe ser un repositorio simple.

  2. La copia de seguridad debe incluir todas las sucursales.

  3. Debería ser fácil (incrementalmente) actualizar la copia de seguridad.

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

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

me viene a la mente, pero por lo que puedo decir, eso no permite una actualización fácil (tendría que eliminar y volver a crear mi copia de seguridad local). Además, la opción de espejo 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 en ejecución).

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

Copia de seguridad de un repositorio de GitHub
VonC

No estoy seguro de que pueda cubrir todos sus requisitos, pero puede consultar paquete git

git bundle

Este comando proporciona soporte para git fetch y git pull para operar empaquetando objetos y referencias en un archivo en la máquina de origen, luego importándolos a otro repositorio usando git fetch y git pull después de mover el archivo por algún medio

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

git bundle solo empaquetará referencias que se muestran mediante git-show-ref: esto incluye encabezados, etiquetas y encabezados remotos.

machineA$ git bundle create file.bundle master

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

--all

Pretende como si todos los árbitros en $GIT_DIR/refs/ se enumeran en la línea de comando como <commit>.

Él añade:

su paquete actual solo incluirá a los padres de la confirmación, probablemente necesite especificar --all para obtener un paquete completo de todo (ramas que son descendiente 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

  • nb: su paquete actual solo incluirá a los padres de la confirmación, probablemente necesite especificar –all para obtener un paquete completo de todo (ramas que son descendientes del maestro). git paquete crear /tmp/foo maestro; git bundle create /tmp/foo-all –all ; git paquete list-heads /tmp/foo ; git bundle list-heads /tmp/foo-all . Pequeño, pero significativo.

    – Kent Fredric

    9 de agosto de 2009 a las 17:01

  • Intenté todos estos pero nunca obtuve ramas para guardar en el paquete.

    – haysclark

    12 de septiembre de 2012 a las 5:47

  • @Infinite ¿stackoverflow.com/a/3639182/6309 funcionaría mejor? (al menos el hostA$ git bundle create hostA.bundle --branches --tags parte al principio?)

    – VoC

    12 de septiembre de 2012 a las 5:51


  • Ver también: restaurar el repositorio de git desde la copia de seguridad del paquete

    – Martín Tomas

    29/10/2014 a las 11:47

Copia de seguridad de un repositorio de GitHub
fernando correya

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 directorio actual:

git --git-dir project.git remote update

  • Este procedimiento es la forma correcta de obtener una copia local completa de un repositorio remoto; que luego se puede utilizar con git bundle create --all para exportar todo el repositorio como un solo archivo.

    – Lee

    18 de enero de 2013 a las 16:45

  • @Lee me estoy poniendo error: rev-list died cuando trato de ejecutar git bundle create --all ../project.bundle desde dentro de project.git/.

    – Jonathan Reinhart

    4 de febrero de 2015 a las 18:12

  • @Lee Ah, no importa. los --all es un argumento para git-rev-list. Así que el orden correcto en el comando sería git bundle create ../project.bundle --all

    – Jonathan Reinhart

    04/02/2015 a las 18:15

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

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

git fetch

git clone como se supone que debe buscar todos refs/commits que son visibles en la rama remota.

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

la única diferencia relevante es la taquigrafía git remote add --mirror

( Ver git help add por el diferente comportamiento)

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 archivos de todos modos.

y si eres De Verdad paranoico, puedes tar.(gz|bz2) todo el directorio y viceversa que arriba.

1646964433 100 Copia de seguridad de un repositorio de GitHub
norman ramsey

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 recuperación le darán todas las ramas por defecto. Ver esta pregunta:

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

Para ver un ejemplo de clonación de un repositorio con múltiples ramas, 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
   ...

Puede ver que clonar cada rama programáticamente será un poco complicado.

Si github proporciona acceso a rsync o Unísono estas son mejores herramientas para el trabajo. De lo contrario, tendrás que escribir algunos guiones de miedo…

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad