2010-07-26 18 views
42

Soy un desarrollador en solitario, trabajando en un repositorio local de Git. Para las copias de seguridad, quiero enviar una copia exacta de ese repositorio a otro servidor.¿Es suficiente "git push --mirror" para hacer una copia de seguridad de mi repositorio?

¿Es suficiente hacer esto?

git push --mirror 

Lo digo porque a veces se puede ejecutar este comando dos o tres veces antes de Git mí "Todo en marcha hasta la fecha" dice, lo que al parecer no es un reflejo exacto. Parece estar volviendo a presionar rastrear ramas ...?

$ git push --mirror 
Counting objects: 42, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (30/30), done. 
Writing objects: 100% (30/30), 5.09 KiB, done. 
Total 30 (delta 17), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 mybranch -> mybranch 
$ git push --mirror 
Total 0 (delta 0), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 origin/mybranch -> origin/mybranch 
$ git push --mirror 
Everything up-to-date 

¿Qué está pasando, y esta es una buena estrategia?

Editar: No me gusta usar algo como git bundle o .tar.bz2 archivos, porque me gustaría que la copia de seguridad sea una copia de trabajo accesible. Como mi servidor de respaldo está conectado a la red y siempre encendido, esta es una buena forma de acceder al repositorio cuando estoy de viaje.

+2

Ver también: [Copia de seguridad de un repositorio Git local] (http://stackoverflow.com/questions/2129214/backup-a-local-git-repository) – miku

+0

hace esto la copia de seguridad, así reflog ? Si no, esta es una copia de seguridad bastante pobre. – onionjake

Respuesta

6

Yo diría que esta es una estrategia perfectamente aceptable para hacer una copia de seguridad de su repositorio. Debería realizar un push a su control remoto de origen para cada referencia en el repositorio. Haciéndolo un "espejo" completo de su repositorio local.

EDIT: Acabo de ver su descripción actualizada en la pregunta. Parece que git está presionando tu control remoto hacia el control remoto junto con todo lo demás. Una vez que el empuje haya finalizado, la referencia remota se actualizará para reflejar que acaba de empujar hacia ella. Esto ahora estará desactualizado con el repositorio remoto, por lo que es necesario realizar un nuevo impulso. Si esto no te satisface Puede eliminar esta ref remoto con empuje

git:/MyBranch

y luego usar

git push origen --all

recordar que este won' Sin embargo, empuje cualquier nueva rama que cree.

+0

¿Entonces por qué hace algo cuando lo ejecuto por segunda vez? – Thomas

+0

¿Qué quiere decir con 'algo'? ¿El repositorio que estás enviando a un clon desnudo? ¿Puede proporcionar más detalles, ya que estoy seguro de que git push --mirror debería proporcionar la funcionalidad que está buscando? –

+5

También vale la pena saber si está clonando el repositorio usando la opción --mirror y luego usando 'git remote add --mirror '. Esto se reflejará automáticamente, por lo que solo deberías poder ejecutar 'git push'. –

0

¿Por qué no comprimir una copia de la carpeta .git y enviarla a otro servidor?

+0

Ver mi edición. :) – Thomas

3

Suelo usar git push --all. Solo uso --mirror cuando necesito empujar ramas recién creadas o eliminé algunas ramas y no quiero nombrarlas una por una. De lo contrario, el push --all generalmente funciona como lo necesito.

28

La razón por la que ve algo empujado por segunda vez es que --mirror empuja un poco más de lo esperado. Además de sus sucursales locales, también empuja sus sucursales remotas, porque el espejo implica todo.Por lo tanto, cuando presiona normalmente (o con --mirror), se empuja mybranch y se actualiza origin/mybranch para reflejar el nuevo estado en el origen. Cuando presiona con --mirror, también se presiona origin/mybranch.

Esto resulta en la extrañeza que ves, y también en una peor extrañeza cuando extraes de ese control remoto; obtendría sucursales con el nombre origin/origin/mybranch etc. Por lo tanto, generalmente es mejor usar --mirror para copias de una sola vez, y simplemente use la inserción normal (tal vez con --all) para usos normales.

Para empujar siempre todas las ramas y las etiquetas, puede actualizar .git/config así:

[remote "origin"] 
    url = ... 
    fetch = ... 
    push = +refs/heads/* 
    push = +refs/tags/* 

que hará que un empujón normal, similar al de un espejo, excepto que no se eliminarán las ramas que no existen en la fuente o para actualizaciones que no avanzan rápido.

+0

Gracias, eso es bueno saberlo. Recuerdo haber visto estas ramas de origen/origen/* en algún momento, pero aparentemente las borré. El problema con '--all' es que no empujará ninguna nueva rama, ni eliminará ninguna rama eliminada. No es lo suficientemente infalible, y puedo ser un tonto a veces. ¿No hay forma de decirle a '--mirror' que ignore las sucursales remotas? – Thomas

+0

No creo que haya una manera de hacer que ignore los controles remotos. Sin embargo, podría modificar su '.git/config' para enviar más por defecto. He actualizado la respuesta. –

19

Lamentablemente, no se obtiene una copia exacta con push. Usted lose your stash.

+3

Gracias, eso es bueno saberlo. Sin embargo, realmente no importa, porque el alijo se supone que es algo a corto plazo de todos modos. – Thomas

+2

Sí, creo que es lo suficientemente bueno para la copia de seguridad, pero no es ideal para la sincronización. Además, todos sabemos cuánto tiempo a veces dependemos de cosas supuestamente a corto plazo. ;) – nschum

+4

Si mantiene escondites por cualquier cantidad de tiempo, tal vez necesite sentirse más cómodo haciendo ramas (: – Jacob

3

Lo que hago es:

Configuración del repositorio: git clone --mirror [email protected]:/url-to-repo.git

Luego, cuando se desea actualizar la copia de seguridad: git remote update desde la ubicación clon.

Esto respalda todas las ramas, incluidas las nuevas que se agregan más tarde, aunque vale la pena señalar que las ramas que se eliminan no se eliminan del clon (lo que para una copia de seguridad puede ser bueno).

De http://www.garron.me/en/bits/backup-git-bare-repo.html

Cuestiones relacionadas