2009-06-30 20 views
7

Sto facendo del lavoro per rintracciare un bug percepito in uno strumento di supporto git, e voglio copiare un repository (possibilmente molte volte) a fini sperimentali. Vorrei che i collegamenti fisici vengano creati nel database degli oggetti del repository originale in modo da non sprecare spazio su disco memorizzando più copie di oggetti identici con valori SHA identici. clone git realizza questo bene, ma purtroppo non riesco a trovare un modo per rendere git clone darmi una nuova copia del repository impostato come l'archivio originale:Come faccio a copiare/clonare un repository git senza sprecare spazio?

  1. i punti clone di nuovo nel repository copiato come la sua origine, ma voglio che abbia la stessa origine del repository copiato
  2. il clone finisce con un solo ramo, ma voglio di avere tutti i rami del repository copiato

i si può migliorare un po 'di ciò usando git clone --mirror, ma questo funzionerà solo per creare un repository spoglio e il repository che sto sperimentando on non è nullo, e lo strumento di supporto che sto cercando di eseguire il debug non funziona su repository nudi.

Ho pensato di scrivere un ciclo di shell veloce per creare un nuovo database di oggetti pieno di collegamenti fisici nel database dell'oggetto originale, quindi copiare tutto il resto dalla directory originale .git e quindi eseguire un checkout git, ma sono preoccupato che questo sia abbastanza complicato da essere soggetto a errori e che non conosca abbastanza per eseguire correttamente questo tipo di chirurgia di basso livello e costruirò un deposito con errori sottili. Questo approccio dovrebbe funzionare, in teoria?

Ancora meglio, c'è un modo per passare le opzioni a clonare git per farlo fare ciò che voglio?

C'è un modo per creare un nuovo repository ma dirgli che il suo database degli oggetti si trova in un'altra directory, in pratica dicendo di condividere il database degli oggetti dal repository originale?

Se nessuna delle operazioni precedenti funziona, mi rimane solo un cp -pr, che consuma molto spazio e richiede molto tempo.

risposta

5

Penso che tu sia alla ricerca di

git clone --reference=/path/to/existing/repo url 

In git gergo questo conosciuto come l'utilizzo di "sostituti". Ci sono potenziali problemi con questa opzione, come menzionato nel git clone help ma potrebbe essere adatto ai tuoi scopi.

Potresti essere interessato anche a Dustin's helper git-alternates.

0

Utilizzare "git clone --mirror", quindi cambiarlo da repository nudo a non bare (rinominare repo.git in repo/.git, copiare .git/config file, checkout directory di lavoro utilizzando "git checkout HEAD"). Nota: non ho controllato se funziona come previsto!

0

Utilizzare clone git con l'opzione --no-checkout. Aggiorna il repository git con git fetch invece di git pull per evitare un checkout.

Problemi correlati