usar - Copia de seguridad de un repositorio de GitHub
github api tags (6)
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
Se supone que git clone
tal como está, capta todos los refs / commits que están visibles en la rama remota.
git clone --mirror
tampoco es muy diferente a git clone --bare
[source]
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 archivos de todos modos.
Y si eres realmente paranoico, puedes atacar. (Gz | bz2) todo el directorio y respaldarlo.
¿Cuál es la mejor manera de crear una copia de seguridad local de un repositorio git alojado en GitHub, dados los siguientes requisitos ?:
La copia de seguridad local debe ser un repositorio simple.
La copia de seguridad debe incluir todas las ramas.
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 hasta donde sé, eso no permite una actualización sencilla (tendría que eliminar y volver a crear mi copia de seguridad 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?
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 descargar todos mis repositorios. Lo uso para realizar periódicamente una copia de seguridad 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 tiempo de espera y el script no se encarga de eso.
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 ramas por defecto. Ver esta pregunta:
Para 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
...
Puedes ver que clonar cada rama 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 comandos de miedo ...
No estoy seguro de que cubra todos tus requisitos, pero podrías consultar el paquete de git
git bundle
Este comando proporciona soporte para
git fetch
ygit pull
para operar empacando objetos y referencias en un archivo en la máquina de origen, luego importándolos en otro repositorio usandogit fetch
ygit pull
luego de mover el archivo de alguna manera.
Lo que me gusta de esa solución es el único archivo producido, con exactamente lo que quiero en él
git bundle
solo incluirá las referencias que se muestran en 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
Supongamos que todas las referencias en
$GIT_DIR/refs/
aparecen 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 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
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
Si solo necesita hacer una copia de seguridad de los repositorios de GitHub , puede echarle un vistazo al sencillo script de Bash.