¿Hay una manera simple de hacer una copia de seguridad de un repositorio de git completo, incluidas todas las ramas y etiquetas?
¿Hay una manera simple de hacer una copia de seguridad de un repositorio de git completo, incluidas todas las ramas y etiquetas?
Respuestas:
¿Qué hay de solo hacer un clon?
git clone --mirror other/repo.git
Cada repositorio es una copia de seguridad de su control remoto.
git branch -a
. Tal vez sea más obvio de esta manera: después de clonar un repositorio, no obtiene cada rama, obtiene cada confirmación. Las ramas solo hacen referencia a una confirmación existente.
git clone
cubre todo eso. (1) es opcional, no es un requisito. Si el resultado aún está optimizado, todavía es una copia de seguridad (2) que ya está cubierta por git. - El punto que me gustaría dar es que, si git clone
ya cubre los puntos relevantes, ¿para qué necesita una herramienta diferente? Aunque también prefiero git bundle
no creo que mi respuesta sea incorrecta o inválida. Puede ver ambos enfoques como copia de seguridad en caliente o en frío.
git bundle
Me gusta ese método, ya que resulta en un solo archivo, más fácil de copiar.
Ver ProGit: pequeño paquete de alegría .
Consulte también " ¿Cómo puedo enviar un correo electrónico a alguien con un repositorio git? ", Donde el comando
git bundle create /tmp/foo-all --all
se detalla:
git bundle
sólo empaquetar las referencias que se muestran por git show-ref : esto incluye cabezas, etiquetas y cabezas remotas.
Es muy importante que la base utilizada sea mantenida por el destino.
Está bien errar con precaución, ya que el archivo de paquete contiene objetos que ya están en el destino, ya que estos se ignoran al desempacar en el destino.
Para usar ese paquete, puede clonarlo, especificando una carpeta inexistente (fuera de cualquier repositorio de git):
git clone /tmp/foo-all newFolder
git bundle
es la respuesta correcta en mi opinión, y no la aceptada. Creo que él conoce bien el comando de clonar, si puede hacer esa pregunta, y claramente no es suficiente para él (porque es un clon, y no un tugurio). Los volcados son cosas diferentes como copias simples, por ejemplo: 1) no son necesarios para ser óptimos (o incluso capaces) para el trabajo normal 2) pero deben tener una buena resistencia y capacidad de reparación contra la corrupción de datos 3) A menudo es útil si son fácilmente diferenciables para copias de seguridad incrementales, mientras que no es un objetivo en las copias.
git bundle
ni todo , por ejemplo, los scripts de enlace. git clone
git bundle
contra un repositorio remoto?
Ampliando algunas otras respuestas, esto es lo que hago:
Configura el repositorio: git clone --mirror user@server:/url-to-repo.git
Luego, cuando desee actualizar la copia de seguridad: git remote update
desde la ubicación del clon.
Esto hace una copia de seguridad de todas las ramas y etiquetas, 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 algo bueno).
Esto es atómico, por lo que no tiene los problemas que tendría una copia simple.
Ampliando las excelentes respuestas de KingCrunch y VonC
Los combiné a ambos:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Después de eso, tiene un archivo llamado reponame.bundle
que se puede copiar fácilmente. Luego puede crear un nuevo repositorio git normal a partir de ese uso git clone reponame.bundle reponame
.
Tenga en cuenta que git bundle
solo copia confirmaciones que conducen a alguna referencia (rama o etiqueta) en el repositorio. Por lo tanto, las confirmaciones de enredo no se almacenan en el paquete.
git bundle create reponame.bundle --all
?
Todo está contenido en el .git
directorio. Simplemente respalde eso junto con su proyecto como lo haría con cualquier archivo.
copy
o cp
y no se adapta a sus necesidades. Y también creo que él piensa en un repositorio desnudo (aunque también se puede copiar, creo que no es una copia de seguridad con todas las funciones).
use git bundle o clone
copiar el directorio git no es una buena solución porque no es atómico. Si tiene un repositorio grande que toma mucho tiempo copiar y alguien lo empuja a su repositorio, esto afectará su respaldo. Clonar o hacer un paquete no tendrá este problema.
Puede hacer una copia de seguridad del repositorio de git con git-copy en un tamaño de almacenamiento mínimo.
git copy /path/to/project /backup/project.repo.backup
Entonces puedes restaurar tu proyecto con git clone
git clone /backup/project.repo.backup project
git clone --bare
+ simple git push --force
.
La respuesta correcta de la OMI es git clone --mirror . Esto respaldará completamente su repositorio.
Git clone mirror clonará todo el repositorio, notas, encabezados, referencias, etc. y se usa generalmente para copiar un repositorio completo a un nuevo servidor git. Esto desplegará todas las ramas y todo, todo el repositorio.
git clone --mirror git@example.com/your-repo.git
Normalmente, clonar un repositorio no incluye todas las ramas, solo Master.
Copiar la carpeta del repositorio solo "copiará" las ramas que se han extraído ... por lo que, de forma predeterminada, es solo la rama maestra u otras ramas que haya extraído anteriormente.
El comando de paquete Git tampoco es lo que desea: "El comando de paquete empaquetará todo lo que normalmente se pasaría por el cable con un comando git push en un archivo binario que puede enviar por correo electrónico a alguien o poner en una unidad flash, luego desagrupar en otro repositorio ". (De ¿Cuál es la diferencia entre git clone --mirror y git clone --bare )
Este hilo fue muy útil para obtener algunas ideas sobre cómo se podrían hacer copias de seguridad de repositorios git. Creo que todavía le faltan algunas pistas, información o conclusión para encontrar la "forma correcta" (tm) para uno mismo. Por lo tanto, comparto mis pensamientos aquí para ayudar a otros y ponerlos a discusión para mejorarlos. Gracias.
Entonces, comenzando por retomar la pregunta original:
Luego enriqueciéndolo con los deseos típicos y especificando algunos ajustes preestablecidos:
El punto de vista difiere de lo que es una copia de seguridad "100%". Aquí hay dos típicos.
git es una herramienta para desarrolladores y admite este punto de vista a través de git clone --mirror
y git bundle --all
.
git gc
)git es una herramienta de desarrollador y lo deja al administrador. La copia de seguridad de la configuración de git y la configuración del sistema operativo debe verse como separada de la copia de seguridad del contenido.
La mayoría de ellos son genéricos para copias de seguridad.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Una copia de seguridad en frío siempre puede hacer una copia de seguridad de archivos completa: denegar todos los accesos a los repositorios git, hacer copias de seguridad y permitir nuevamente los accesos.
Las copias de seguridad de archivos no se pueden hacer con repositorios activos debido al riesgo de datos corruptos por confirmaciones en curso. Una copia en caliente proporciona un estado fijo de un repositorio activo para fines de copia de seguridad. Las confirmaciones en curso no afectan a esa copia. Como se mencionó anteriormente, las funcionalidades de clon y paquete de git lo admiten, pero para una copia de seguridad "100% admin", se deben hacer varias cosas a través de comandos adicionales.
git bundle --all
para crear archivos de volcado de contenido completos / incrementales y copiar / hacer copias de seguridad de los archivos de configuración por separado.git clone --mirror
, maneje y copie la configuración por separado, luego haga una copia de seguridad completa del espejo.
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
esto crea una copia de seguridad y realiza la configuración, de modo que puede hacer un gran esfuerzo para actualizar su copia de seguridad, lo que probablemente es lo que desea hacer. Solo asegúrese de que / path / to / backupdir y / path / to / repo sean al menos discos duros diferentes, de lo contrario no tiene mucho sentido hacerlo.
Aquí hay dos opciones:
Puede tomar directamente un tar del directorio git repo ya que tiene todo el contenido desnudo del repositorio en el servidor. Existe una ligera posibilidad de que alguien esté trabajando en el repositorio mientras realiza una copia de seguridad.
El siguiente comando le dará el clon desnudo del repositorio (al igual que en el servidor), luego puede tomar un alquitrán de la ubicación donde ha clonado sin ningún problema.
git clone --bare {your backup local repo} {new location where you want to clone}
Hasta donde sé, puede hacer una copia del directorio en el que se encuentra su repositorio, ¡eso es todo!
cp -r project project-backup
git clone --bare
le dará una instantánea consistente.