2009-09-08 23 views
7

Il problema è semplice. Ho usato git cvsimport per importare un repository cvs in un ramo remoto in un repository git locale. Quindi desidero sincronizzare questo repository: rami, tag e tutto, in un repository git nel cloud (github/gitorious). Per fare questo non ho l'accesso a rsync o copiare direttamente il repository, devo usare git push.Come rispecchiare un git remoto con un altro con push

Come faccio a fare il mirroring del mio repository locale in modo che altri possano accedere alla cronologia _cvsimport_d completa?

Concretamente:
posso importare e monitorare un repository utilizzando cvsimport:

git cvsimport -i -v -C cdt-make-core -d :pserver:[email protected]:/cvsroot/tools -r cvs org.eclipse.cdt/all/org.eclipse.cdt.make.core

Le importazioni suddette org.eclipse.cdt.make.core nelle remote cvs nel cdt- git repo fare-core.

Posso quindi spingere la testa del ramo CVS principale per GitHub:

git push github cvs/master:refs/heads/cvs/HEAD

(ho specificare il percorso sul telecomando in modo esplicito, quindi se non esiste è stato creato.)

Is c'è un modo per sincronizzare tutti i rami: cvs/* => cvs/* sul telecomando?
C'è un modo per sincronizzare tutti i tag?

risposta

3

I miei risultati sono che se si utilizza la seconda soluzione ragionevole di seguito, è necessario eseguire lo --mirror in primo luogo, perché cancella quei cv/rami che si sta tentando di inviare. Quindi la formula completa è:

git push --mirror -v github 
git push --force github cvs/master:refs/heads/cvs/HEAD 
for x in `git branch -r | grep '^..cvs/[a-zA-Z0-9_-]*$' | sed -e 's/^..//'` ; do 
    git push -v github $x:refs/heads/$x 
    git config branch.$x.remote github 
    git config branch.$x.merge refs/heads/$x 
done 
5

Penso che stai cercando l'opzione --mirror a spingere:

git push --mirror github 

Questo spingerà tutti gli arbitri (rami e tag) inclusi gli aggiornamenti non-fast-forward. Lo uso per creare backup del mio repository locale.

Il man page descrive così:

Invece di nominare ogni ref spingere, specifica che tutti arbitri sotto $GIT_DIR/refs/ (che include ma non è limitato a refs/heads/, refs/remotes/, e refs/tags/) il mirroring al repository remoto. I ref locali appena creati verranno inviati al terminale remoto, i ref aggiornati localmente verranno forzati all'aggiornamento sul terminale remoto e gli errori eliminati verranno rimossi dal terminale remoto. Questa è l'impostazione predefinita se è impostata l'opzione di configurazione .

[OT:! Io uso CDT nel mio lavoro di tutti i giorni e mi piace]

+0

Grazie. Purtroppo questo non sembra fare quello che voglio. Sembra che questo renda il repository nel cloud simile al mio, il che significa che il repository github ha un telecomando 'cvs', ma nessun ramo cvs visibile. Quello che volevo era copiare l'intero contenuto dei telecomandi/cvs/* in cvs/* su github. –

+0

Ah, vedo ora. Mi dispiace per il vicolo cieco. –

1

aver sperimentato, non credo ci sia alcun supporto integrato per quello che voglio fare.

Tuttavia sembra che ci siano due soluzioni ragionevoli:

  • Non specificare -r a cvsimport.
    I rami importati saranno quindi presenti direttamente nel repository e --mirror può essere utilizzato come suggerito da Pat.
  • Scrivere uno script di shell per spingere i telecomandi * cvs/** uno alla volta (che è semplice).
    Usa --mirror in modo che i tag siano correttamente sincronizzati

Originariamente ho voluto mantenere le cvsimport d rami separati per namespacing. Comunque con la prima opzione ha senso mantenere il repository cvsimport completamente separato (e solo clonarlo da esso). Posso quindi continuare a tracciare CVS senza il rischio di sporcare il repository git di tracciamento.

Problemi correlati