¿Puede un clon local de Git considerarse una copy de security completa del repository desde el cual fue clonado?

Supongamos que he clonado un repository de Git en mi disco local usando:

git clone [email protected]:someproject.git 

Ahora supongamos que git.example.com no está siendo respaldado, y cae en un arrebato de gloria. ¿Mi clon contiene todo lo necesario para rebuild el repository remoto que se perdió? La sección Ultimate Backups de Git Magic sugiere que la respuesta es "sí", pero no está claro para mí.

Tenga en count que no estoy preguntando "¿mi copy local es una copy de security suficiente de la twig master ?" Pregunto si mi clon local puede considerarse una copy de security completa de todo lo que estaba contenido en el repository remoto; todas las twigs, todas las tags, todo . Por ejemplo, ¿qué pasa con las sucursales remotas que no se rastrean en el repository local?

Para confundir aún más el problema, la existencia de git clone --mirror me sugiere que mi clon local no debe considerarse una copy de security completa del repository remoto.

Un clon puede considerarse una copy de security completa de todos los datos en su repository remoto, pero no necesariamente los metadatos (que es donde --mirror interruptor --mirror ). Su clon contendrá todos los objects de confirmación, tree, blob, twig y label que el repository hace de reference. Eso significa que su copy de security contendrá todo su código fuente, historial y twigs o tags asociadas.

La diferencia con el --mirror es que sin él, el clon no includeá elementos como los controles remotos que se han creado en el server. Estos no son importantes en un "¡Espero no haber perdido ninguna fuente!" de alguna manera, pero pueden ser para que su server vuelva a funcionar como estaba.

Si está interesado en crear una copy de security que se pueda restaurar en el server como si nunca hubiera habido ningún problema, entonces debería usar --mirror , pero para la mayoría de los escenarios, un clon simple está bien.

Su clon local no será una copy de security completa. Será una copy de security del estado de ese repository, pero no tendrá todas las references del repository de origen (por lo que no conocerá el estado de ninguna twig remota).

Para una copy de security completa, has encontrado correctamente git clone --mirror . Esto no solo tendrá las twigs para el repository original. También mapeará todas las references, incluidas las sucursales remotas.

IMPORTANTE

Sin --mirror , El clon no será una copy de security completa. Cualquier línea de trabajo no visible en la git branch -r será eliminada del clon.

Demo simple

Sea testigo de un simple repository.

 $ git init G $ cd G $ for f in 1 2 3 4; do date >1 && git add 1 && git commit -m $f; sleep 1.1; done $ git log --oneline --graph --all --decorate * 3c111bd (HEAD -> master) 4 * a08fea4 3 * d5c8d73 2 * 802856b 1 

Agregar una twig:

 $ git checkout d5c8d73 HEAD is now at d5c8d73... 2 $ git branch starts-at-2 $ git checkout starts-at-2 Switched to branch 'starts-at-2' $ for f in 1 2 3 4; do date >1 && git add 1 && git commit -m 2-$f; sleep 1.1; done $ git log --oneline --graph --all --decorate * 6bb05bf (HEAD -> starts-at-2) 2-4 * fe1b635 2-3 * a9323fb 2-2 * 33502af 2-1 | * 3c111bd (master) 4 | * a08fea4 3 |/ * d5c8d73 2 * 802856b 1 

Clona el repository.

 $ cd .. $ $ git clone G G2 Cloning into 'G2'... $ cd G2 $ git log --oneline --graph --all --decorate * 6bb05bf (HEAD -> starts-at-2, origin/starts-at-2, origin/HEAD) 2-4 * fe1b635 2-3 * a9323fb 2-2 * 33502af 2-1 | * 3c111bd (origin/master) 4 | * a08fea4 3 |/ * d5c8d73 2 * 802856b 1 

Multa. Clonar de nuevo.

 $ cd .. $ git clone G2 G3 $ cd G3 $ git log --oneline --graph --all --decorate * 6bb05bf (HEAD -> starts-at-2, origin/starts-at-2, origin/HEAD) 2-4 * fe1b635 2-3 * a9323fb 2-2 * 33502af 2-1 * d5c8d73 2 * 802856b 1 

Urk.