2010-07-26 2 views
42

Sono uno sviluppatore solista, che lavora in un repository Git locale. Per i backup, voglio inviare una copia esatta di quel repository su un altro server."git push --mirror" è sufficiente per eseguire il backup del mio repository?

E 'sufficiente fare questo?

git push --mirror 

Mi sto chiedendo perché posso a volte eseguire questo comando due o tre volte prima di Git me "Tutto up-to-date" dice, così apparentemente non è uno specchio esatto. Sembra che si riesca a spingere i rami di rilevamento ...?

$ git push --mirror 
Counting objects: 42, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (30/30), done. 
Writing objects: 100% (30/30), 5.09 KiB, done. 
Total 30 (delta 17), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 mybranch -> mybranch 
$ git push --mirror 
Total 0 (delta 0), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 origin/mybranch -> origin/mybranch 
$ git push --mirror 
Everything up-to-date 

Che cosa sta succedendo, ed è una buona strategia?

Modifica: non mi piace utilizzare qualcosa come gli archivi git bundle o .tar.bz2, perché mi piacerebbe che il backup fosse una copia di lavoro accessibile. Poiché il mio server di backup è connesso alla rete e sempre acceso, questo è un buon modo per accedere al repository quando sono in viaggio.

+2

Vedi anche: [Backup un Git repository locale] (http://stackoverflow.com/questions/2129214/backup-a-local-git-repository) – miku

+0

fa questo sostegno la reflog pure ? In caso contrario, questo è un backup piuttosto scarso. – onionjake

risposta

6

Direi che questa è una strategia perfettamente accettabile per il backup del repository. Dovrebbe eseguire una spinta al tuo telecomando di origine per ogni ref nel repository. Rendendolo un "mirror" completo del tuo repository locale.

EDIT: Ho appena visto la tua descrizione aggiornata nella domanda. Sembra che Git stia spingendo il tuo telecomando verso il remoto stesso insieme a tutto il resto. Una volta che la spinta è finita, il ref remoto verrà aggiornato per riflettere che ci hai appena spinto. Questo sarà ora obsoleto con il repository remoto, quindi è necessaria un'ulteriore spinta. Se questo non ti soddisfa. È possibile eliminare questo riferimento a distanza con

git push: origine/mybranch

e quindi utilizzare

git push --all

ricordare che questo ha vinto' Tuttavia, spinga qualsiasi nuovo ramo che crei.

+0

Allora perché fa qualcosa quando lo eseguo una seconda volta? – Thomas

+0

Cosa intendi con "qualcosa"? Il repository stai spingendo verso un clone nudo? Puoi fornire maggiori dettagli in quanto sono sicuro che git push --mirror dovrebbe fornire la funzionalità che stai cercando. –

+5

Inoltre, vale la pena conoscere clonare il repository usando l'opzione --mirror e poi usare 'git remote add --mirror '. Questo sarà automaticamente speculare, quindi dovresti essere in grado di eseguire 'git push'. –

0

Perché non comprimere semplicemente una copia della cartella .git e inviarla a un altro server?

+0

Vedere la mia modifica. :) – Thomas

3

Io di solito uso git push --all. Io uso solo --mirror quando ho bisogno di spingere rami appena creati o ho cancellato alcuni rami e non voglio nominarli uno per uno. Altrimenti il ​​push --all di solito funziona come ho bisogno.

28

La ragione per cui si vede una seconda volta spinta è che --mirror spinge un po 'più di quanto ci si aspetti. Oltre alle filiali locali, spinge anche le filiali remote, perché lo specchio implica tutto.Pertanto, quando si preme normalmente (o con --mirror), viene inviato mybranch e origin/mybranch viene aggiornato per riflettere il nuovo stato sull'origine. Quando si preme con --mirror, viene inviato anche origin/mybranch.

Ciò si traduce nella stranezza che si vede, e anche in una peggiore stranezza quando si tira da quel telecomando; si otterrebbero i rami denominati origin/origin/mybranch ecc. Di solito è preferibile utilizzare --mirror per le copie una tantum e utilizzare solo la normale pressione (forse con --all) per gli usi normali.

Per spingere sempre tutti i rami e tag, è possibile aggiornare .git/config in questo modo:

[remote "origin"] 
    url = ... 
    fetch = ... 
    push = +refs/heads/* 
    push = +refs/tags/* 

che farà una spinta normale simile a uno specchio, tranne che non cancellerà i rami che non esistono all'origine o per gli aggiornamenti non rapidi.

+0

Grazie, è bello saperlo. Ricordo di aver visto questi rami "origine/origine/*" a un certo punto, ma a quanto pare li ho cancellati. Il problema con '--all' è che non sposterà nuovi rami, né cancellerà i rami cancellati. Non è abbastanza infallibile, e a volte posso essere un pazzo. Non c'è modo di dire a '--mirror' di ignorare i rami remoti? – Thomas

+0

Non penso che ci sia un modo per farlo ignorare i telecomandi. Potresti comunque modificare '.git/config' per spingerne di più per impostazione predefinita. Ho aggiornato la risposta. –

19

Sfortunatamente, non si ottiene una copia esatta con push. È lose your stash.

+3

Grazie, è bello saperlo. Non importa, però, perché lo stash dovrebbe essere comunque una cosa a breve termine. – Thomas

+2

Sì, penso che sia abbastanza buono per il backup, ma non ideale per la sincronizzazione. Inoltre, sappiamo tutti per quanto a volte dipendiamo da cose apparentemente a breve termine. ;) – nschum

+4

Se stai conservando le casse per un certo periodo di tempo, forse hai bisogno di fare più comodo a creare rami (: – Jacob

3

Quello che faccio è:

Setup repo: git clone --mirror [email protected]:/url-to-repo.git

Poi, quando si desidera aggiornare il backup: git remote update dalla posizione clone.

Questo esegue il backup di tutti i rami, inclusi i nuovi rami che vengono aggiunti in seguito, sebbene valga la pena notare che i rami che vengono eliminati non vengono eliminati dal clone (che per un backup può essere una buona cosa).

Da http://www.garron.me/en/bits/backup-git-bare-repo.html