Cómo git agrupar un repositorio completo

116

Necesito transferir un repositorio completo a una nueva máquina que no esté en red, preferiblemente como una entidad de archivo único. El paquete git permite una git fetch, git pulloperación de estilo en un ambiente sneakernet pero parece suponer que usted ya tiene una versión de trabajo de la cesión temporal en la máquina de destino.

Cuál es la invocación correcta para:

  1. Agrupar todas las ramas en el repositorio actual
  2. Inicie el nuevo repositorio en el directorio de destino, es decir, instale correctamente la confirmación de root

Envié un parche en sentido ascendente para aclarar:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

Así que $ git bundle create repo.bundle --branches --tagsmejor coincide con la clonación.

$ git bundle create repo.bundle --all proporcionará una imagen reflejada de su máquina fuente, incluidas sus referencias remotas.

Philip Oakley
fuente

Respuestas:

189

Cuál es la invocación correcta para:

  • Agrupar todas las ramas en el repositorio actual

Sencillo:

$ git bundle create repo.bundle --all

Aquí repo.bundleestá el nombre del archivo de paquete que desea crear. Tenga en cuenta que --allno incluiría ramas de seguimiento remoto ... al igual que el clon ordinario tampoco lo haría.

  • Inicie el nuevo repositorio en el directorio de destino, es decir, instale correctamente la confirmación de root

Primero, clonees solo init+ fetch(+ administrativia).

En segundo lugar, puede usar el archivo de paquete en cualquier lugar donde se pueda usar la URL del repositorio, por lo que puede simplemente clonedesde un archivo de paquete:

$ git clone repo.bundle

Esto se crearía repocomo un repositorio de git.

Jakub Narębski
fuente
6
Gracias, las --allopciones no están en mi página de manual para bundle(estoy viendo la versión 1.7.6.msysgit.0), ni tampoco el uso del archivo .bundle en la sección de URL para clone. Me da mayor confianza recomendar su uso.
Philip Oakley
20
La sinopsis del comando create es git bundle create <file> <git-rev-list-args>. Correr man git-rev-list(o man git-log) te daría --all. Pero estoy de acuerdo en que debería ser más visible en la documentación del comando del paquete.
Jakub Narębski
1
Veo que la página del manual del paquete, bajo Especificación de referencias, dice que "solo empaquetará las referencias que se muestran por git show-ref", que no incluye [lista] las opciones de git-rev-list.
Philip Oakley
2
@Philip Oakley: así git-rev-list-argses como se seleccionan las referencias que se muestran con el git show-refcomando.
Jakub Narębski
2
--allincluyó ramas de seguimiento remoto para mí (git 2.1.4). Pude ver refs/remotes/origin/*con git bundle list-heads bundlefileo git ls-remote bundlefile. Aunque recuperarlos del paquete es un poco complicado.
Alex
32

Primero clone el repositorio e incluya la --mirroropción.

git clone --mirror [email protected]:path/repo.git

Esto asegura que todas las sucursales remotas también sean sucursales locales listas para agruparse.

Entonces corre

git bundle create repo.bundle --all como se describe en la respuesta de Jakub Narębski

thoutbeckers
fuente
3

Te sugiero que tar o zip la carpeta .git y simplemente descomprimirla en la nueva ubicación y luego hacerlo git reset --hard HEAD. Todo lo que se requiere para todas las ramas está en .git y todo lo que debe hacer es ajustar los controles remotos en el archivo .git / config o eliminarlos.

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD
patthoyts
fuente
4
Una advertencia es que deberá mirar el archivo .git / config para verificar si el propietario del repositorio original tenía cosas específicas del usuario allí.
Noufal Ibrahim
@patthoyts: Dado que está desconectado, no habría controles remotos ;-) Parece que al paquete le falta (puede) una opción, y tal vez clonar (necesito pensar en la clonación de un paquete)
Philip Oakley