2010-03-19 14 views
5

Sono in una posizione in cui sono l'unico che usa git, tutti gli altri usano svn. Ho usato 'git svn' per connettermi al team svn e per lo più funziona bene. Ultimamente, ho iniziato un progetto inizialmente da solo, separato da repo git e ora ho bisogno di unire le cose da esso allo svn. Tuttavia, mi piacerebbe continuare a perfezionare l'implementazione nella mia privacy tra le versioni.Cherry-picking da git a svn (o, Come mantenere una cronologia del progetto in git e versioni in svn)

Quindi, quale sarebbe il modo più diretto per selezionare i commit dal mio repo privato al repository svn-clonato? Il requisito è mantenere la cronologia locale completa e avere solo un commit svn per ogni prelievo. O c'è qualche schiacciamento da fare?

Come metodo per ottenere ciò, esiste un modo per ottenere il repository privato come un'altra origine per il repository svn-clonato?

risposta

2

Si potrebbe provare a git graft il commit dal proprio repository Git al commit del repository git-svn prima di git dcommit il repository git svn.

Il commit dal repository potrebbe essere isolato in un ramo speciale, quando all kind of squashing può avvenire per esportare una cronologia più pulita.

1

Se sei l'unica persona che utilizza il repository git al momento, puoi considerare di riposizionare tutto il tuo lavoro sopra il clone di subversion vuoto che hai creato. Quindi imposta un ramo per trattenere le tue spinte indietro a subversion, schiacciare ogni release su di esso e reinserirlo in SVN.

Per una soluzione più approfondita, è consigliabile utilizzare git commit-tree direttamente - fornire con l'albero che si desidera impegnarsi (trovato eseguendo git show --format=raw HEAD e guardando la seconda linea ("albero")), il genitore corretta commit (qualunque cosa sia attualmente in sovversione) e il messaggio di registro corretto su stdin. Questo sta usando l'impianto idraulico direttamente, probabilmente vuoi scrivere uno script per farlo per te ... L'effetto è che hai creato un nuovo commit contenente il contenuto del file di un commit esistente (confronta con cherry-pick, che prende il diff aggiunto da un commit esistente, piuttosto che copiare l'albero).

+0

Sì, sono l'unico utente GIT per ora. Il ribasamento implicherebbe che tutto il lavoro futuro sarà fatto nello svn clonato? Il repository svn clonato non è altro che vuoto ... Anche se questo potrebbe non cambiare nulla. Quindi, in breve, potrei riformulare che il mio progetto è in realtà un sottoprogetto da unire a un singolo trunk contenente più progetti correlati nelle proprie directory. – Jawa

+0

Non c'è alcun motivo per fare il lavoro nel repository che è stato direttamente clonato da subversion, ma si vorrebbe lavorare sui rami che hanno il clone di subversion come genitore. Puoi ottenere questo risultato rimuovendo i rami rebased nel tuo repository di lavoro e usando 'git branch -f' per impostare i tuoi rami di lavoro correnti in modo che puntino ai tuoi riferimenti rebased. –