Come git raggruppare un repository completo


116

Devo trasferire un repository completo su una nuova macchina non in rete, preferibile come entità di file singolo. Il bundle git permette una git fetch, git pulloperazione stile in un ambiente sneakernet, ma sembra scontato che avete già una versione funzionante del pronti contro termine sulla macchina di destinazione.

Qual è l'invocazione giusta per:

  1. Raggruppa tutti i rami nel repo corrente
  2. Avvia il nuovo repository nella directory di destinazione, cioè installa correttamente il commit di root

Ho inviato una patch a monte per chiarire:

`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>`.

Quindi la $ git bundle create repo.bundle --branches --tagsmigliore corrispondenza con la clonazione.

$ git bundle create repo.bundle --all fornirà un'immagine speculare della macchina sorgente, inclusi i suoi riferimenti remoti.

Risposte:


190

Qual è l'invocazione giusta per:

  • Raggruppa tutti i rami nel repo corrente

Semplice:

$ git bundle create repo.bundle --all

Ecco repo.bundleil nome del file del bundle che desideri creare. Nota che --allnon includerebbe i rami di tracciamento remoto ... proprio come il normale clone non lo farebbe neanche.

  • Avvia il nuovo repository nella directory di destinazione, cioè installa correttamente il commit di root

Primo, cloneè solo init+ fetch(+ administrativia).

In secondo luogo, puoi utilizzare il file del pacchetto ovunque sia possibile utilizzare l'URL del repository, quindi puoi semplicemente cloneda un file del pacchetto:

$ git clone repo.bundle

Questo creerebbe repocome un repository git.


6
Grazie, le --allopzioni non sono nella mia pagina man per bundle(sto guardando la versione 1.7.6.msysgit.0), né l'uso del file .bundle nella sezione URL per clone. Mi dà maggiore fiducia nel consigliarne l'uso.
Philip Oakley

20
La sinossi del comando create è git bundle create <file> <git-rev-list-args>. Correre man git-rev-list(o man git-log) ti darebbe --all. Ma sono d'accordo che dovrebbe essere più visibile nella documentazione del comando bundle.
Jakub Narębski

1
Vedo che la pagina man del bundle, sotto Specifying References, dice che "includerà solo i ref del pacchetto mostrati da git show-ref", che non include [list] le opzioni git-rev-list.
Philip Oakley il

2
@Philip Oakley: git-rev-list-argsè il modo in cui selezioni i riferimenti mostrati dal git show-refcomando.
Jakub Narębski

2
--allincludeva rami di monitoraggio remoto per me (git 2.1.4). Potrei vedere refs/remotes/origin/*con git bundle list-heads bundlefileo git ls-remote bundlefile. Anche se recuperarli dal pacchetto è un po 'complicato.
Alex

33

Per prima cosa clona il repository e includi l' --mirroropzione.

git clone --mirror git@example.org:path/repo.git

Ciò garantisce che tutti i rami remoti siano anche rami locali pronti per il raggruppamento.

Allora corri

git bundle create repo.bundle --all come descritto dalla risposta di Jakub Narębski


3

Ti suggerirei di tarare o comprimere la cartella .git e semplicemente decomprimerlo nella nuova posizione e poi farlo git reset --hard HEAD. Tutto ciò che è necessario per tutti i rami è sotto .git e tutto ciò che dovresti fare è regolare i telecomandi nel file .git / config o rimuoverli.

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

4
Un avvertimento è che dovrai esaminare il file .git / config per verificare se il proprietario del repository originale aveva elementi specifici dell'utente.
Noufal Ibrahim

@patthoyts: Dato che è disconnesso, non ci sarebbero telecomandi ;-) Sembra che al bundle manchi (potrebbe essere) un'opzione e forse clone (bisogna pensare alla clonazione da un bundle)
Philip Oakley
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.