Esiste un modo semplice per eseguire il backup di un intero repository git compresi tutti i rami e i tag?
Esiste un modo semplice per eseguire il backup di un intero repository git compresi tutti i rami e i tag?
Risposte:
Che ne dici di farne un clone?
git clone --mirror other/repo.git
Ogni repository è un backup del suo telecomando.
git branch -a
. Forse è più ovvio in questo modo: dopo aver clonato un repository non si recupera ogni ramo, si recupera ogni commit. Le filiali fanno riferimento solo a un commit esistente.
git clone
copre tutto ciò. (1) è facoltativo, non obbligatorio. Se il risultato è ancora ottimizzato, è comunque un backup (2) già coperto da git stesso. - Il punto che vorrei sottolineare è che, se git clone
già trattano i punti rilevanti, per quello che ti serve uno strumento diverso? Anche se preferisco anche git bundle
non credo che la mia risposta sia sbagliata o non valida. Puoi vedere entrambi gli approcci come hot-vs cold-backup.
git bundle
Mi piace quel metodo, in quanto risulta in un solo file, più facile da copiare.
Vedi ProGit: piccolo fascio di gioia .
Vedi anche " Come posso inviare a qualcuno un repository git? ", Dove è il comando
git bundle create /tmp/foo-all --all
è dettagliato:
git bundle
impacchetterà solo i riferimenti mostrati da git show-ref : questo include head, tag e head remoti.
È molto importante che la base utilizzata sia detenuta dalla destinazione.
Va bene sbagliare sul lato della cautela, facendo sì che il file bundle contenga oggetti già nella destinazione, poiché questi vengono ignorati quando si decomprime nella destinazione.
Per usare quel bundle, puoi clonarlo, specificando una cartella inesistente (al di fuori di qualsiasi repository git):
git clone /tmp/foo-all newFolder
git bundle
è la risposta corretta secondo me, e non quella accettata. Penso che conosca bene il comando clone, se può fare una domanda del genere, e chiaramente non è abbastanza per lui (perché è un clone e non una discarica). Le discariche sono cose diverse come semplici copie, ad esempio: 1) non sono necessarie per essere ottimali (o addirittura in grado) per il normale lavoro 2) ma devono avere una buona resistenza e riparabilità contro la corruzione dei dati 3) Spesso è utile se sono facilmente difflabili per backup incrementali, mentre non è un obiettivo per le copie.
git bundle
o git clone
ottiene tutto , ad esempio gli script hook.
git bundle
contro un repository remoto?
Espandendo su alcune altre risposte, questo è quello che faccio:
Imposta il repository: git clone --mirror user@server:/url-to-repo.git
Quindi, quando si desidera aggiornare il backup: git remote update
dalla posizione del clone.
Questo esegue il backup di tutti i rami e tag, compresi quelli nuovi che vengono aggiunti in seguito, anche se vale la pena notare che i rami che vengono eliminati non vengono eliminati dal clone (che per un backup potrebbe essere una buona cosa).
Questo è atomico, quindi non ha i problemi che una semplice copia avrebbe.
Espandendo le grandi risposte di KingCrunch e VonC
Li ho combinati entrambi:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Dopo di che hai un file chiamato reponame.bundle
che può essere facilmente copiato. È quindi possibile creare un nuovo repository git normale da tale utilizzo git clone reponame.bundle reponame
.
Si noti che git bundle
solo le copie eseguono il commit che portano a qualche riferimento (branch o tag) nel repository. Quindi i commit aggrovigliati non vengono archiviati nel bundle.
git bundle create reponame.bundle --all
?
Tutto è contenuto nella .git
directory. Esegui il backup insieme al tuo progetto come faresti con qualsiasi file.
copy
o cp
e non soddisfi i suoi bisogni. E penso anche, pensa su un repository nudo (anche se può essere copiato, penso che non sia un backup completo).
usa git bundle o clona
copiare la directory git non è una buona soluzione perché non è atomica. Se si dispone di un repository di grandi dimensioni che richiede molto tempo per essere copiato e qualcuno spinge nel proprio repository, ciò influirà sul backup. La clonazione o la creazione di un pacchetto non avrà questo problema.
È possibile eseguire il backup del repository git con git-copy alla dimensione minima di archiviazione.
git copy /path/to/project /backup/project.repo.backup
Quindi puoi ripristinare il tuo progetto con git clone
git clone /backup/project.repo.backup project
git clone --bare
+ git push --force
.
La risposta corretta IMO è git clone --mirror . Ciò eseguirà il backup completo del repository.
Git clone mirror clonerà l'intero repository, note, head, refs, ecc. E viene generalmente utilizzato per copiare un intero repository su un nuovo server git. Questo eliminerà tutti i rami e tutto, l' intero repository.
git clone --mirror git@example.com/your-repo.git
Normalmente la clonazione di un repository non include tutti i rami, ma solo il Master.
La copia della cartella dei repository "copia" solo i rami che sono stati inseriti ... quindi, per impostazione predefinita, si tratta solo del ramo Master o di altri rami che hai estratto in precedenza.
Anche il comando bundle Git non è quello che vuoi: "Il comando bundle impacchetterà tutto ciò che normalmente verrebbe trasferito via cavo con un comando git push in un file binario che puoi inviare via e-mail a qualcuno o mettere su un'unità flash, quindi disaggregarsi in un altro repository ". (Da Qual è la differenza tra git clone --mirror e git clone --bare )
Questo thread è stato molto utile per ottenere alcune informazioni su come eseguire i backup dei repository git. Penso che manchi ancora qualche suggerimento, informazione o conclusione per trovare il "modo corretto" (tm) per se stessi. Pertanto, condividendo i miei pensieri qui per aiutare gli altri e metterli in discussione per migliorarli. Grazie.
Quindi, a partire dal raccogliere la domanda originale:
Quindi arricchendolo con i desideri tipici e specificando alcune preimpostazioni:
Il punto di vista differisce su cosa sia un backup "100%". Eccone due tipici.
git è uno strumento di sviluppo e supporta questo punto di vista tramite git clone --mirror
e git bundle --all
.
git gc
)git è uno strumento di sviluppo e lo lascia all'amministratore. Il backup della configurazione git e della configurazione del sistema operativo deve essere visto come separato dal backup del contenuto.
Molti di questi sono generici per i backup.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Un backup con copia a freddo può sempre eseguire un backup completo del file: negare tutti gli accessi ai repository git, eseguire il backup e consentire nuovamente gli accessi.
Non è possibile eseguire i backup dei file con repository attivi a causa del rischio di dati danneggiati da commit in corso. Una copia a caldo fornisce uno stato fisso di un repository attivo a fini di backup. I commit in corso non influiscono su quella copia. Come elencato sopra, le funzionalità clone e bundle di git supportano questo, ma per un backup "100% admin" è necessario eseguire diverse operazioni tramite comandi aggiuntivi.
git bundle --all
per creare file di dump completi / incrementali di contenuto e copiare / eseguire il backup dei file di configurazione separatamente.git clone --mirror
, gestire e copiare la configurazione separatamente, quindi eseguire il backup completo del file del mirror.
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
questo crea un backup e rende l'installazione, in modo che tu possa fare un git push per aggiornare il tuo backup, cosa è probabilmente quello che vuoi fare. Assicurati solo che / path / to / backupdir e / path / to / repo siano almeno dischi rigidi diversi, altrimenti non ha molto senso farlo.
Ecco due opzioni:
È possibile prendere direttamente un tar della directory repository git in quanto ha l'intero contenuto nudo del repository sul server. Esiste una leggera possibilità che qualcuno stia lavorando al repository durante l'esecuzione del backup.
Il seguente comando ti darà il clone nudo del repository (proprio come è nel server), quindi puoi prendere un tar della posizione in cui hai clonato senza alcun problema.
git clone --bare {your backup local repo} {new location where you want to clone}
Per quanto ne so, puoi semplicemente fare una copia della directory in cui si trova il tuo repository, tutto qui!
cp -r project project-backup
git clone --bare
ti darà un'istantanea coerente.