2009-03-18 4 views
47

Ho i miei progetti in 2 repository. Uno sotto SVN e uno sotto Git. Ogni volta che cambio qualcosa in SVN voglio fare la stessa cosa nel repository Git.Come applicare SVN diff a Git?

Dire di apportare una modifica al repository SVN, producendo la revisione 125. Come applicare le stesse modifiche al mio repository Git (assumendo che il mio repository Git sia aggiornato con la revisione 124).

Grazie.

risposta

46

Quello che ho effettivamente fatto/cercando era:

cd /path/to/svn/repo 
svn diff -r 125 > /tmp/patch.diff 
cd /path/to/git/repo 
patch -p0 < /tmp/patch.diff 
+1

non ha funzionato così bene! –

+1

Scusa, questa era una situazione molto specifica. Ti suggerisco di pubblicare una domanda in caso di problemi :( – drozzy

+1

In generale, git-svn è un modo migliore di importare (ed esportare) svn commit in repository git. Manterrà il messaggio di commit e le informazioni sull'autore e far fronte a molte (ovviamente, questo script potrebbe essere più appropriato per la tua situazione se ci sono vincoli esterni che non hai discusso qui) – Rich

18

Prova:

svn diff | patch -d /path/to/git/repo -p0 

Vedere svn help diff se si desidera esportare diff di una revisione specifica.

+1

Perché non fa questo lavoro con la -p0 viene lasciato fuori? –

+0

Vedere -pnum in http://linux.die.net/man/1/patch In particolare cerca nella pagina le parole "non specificando -p". Penso che se non lo specifichi, patch ignorerà il percorso file e userà solo il nome del file. – drozzy

2

Oltre a utilizzare patch come detto sopra si potrebbe anche prendere in considerazione la creazione di un post-commit hook quindi non c'è bisogno di farlo ogni volta che si commettono qualcosa di nuovo.

5

Perché a nessuno piace git-svn? Non posso pensare che nessuno lo sappia.

C'è git-svn (e git-hg e git-cvs e git-bzr afaict). Almeno con git-svn si può semplicemente fare

git svn clone --stdlayout http://myrepo/root here 

utilizzando -s (--stdlayout) assume standard di tronco/rami/tag/di layout, ma si può avere qualsiasi modo (man git-svn).

La mappatura è bidirezionale, quindi è possibile premere e tirare come con un telecomando nativo (git). Nessuna domanda chiesta.

+0

sentitevi liberi di aggiungere un hook post-commit per eseguire un push automatico dopo il commit :) – sehe

+0

Questo doesn funziona per me con svn-git su Windows poiché 'git apply' non funziona perché non è in grado di analizzare correttamente i percorsi relativi delle diff in stile svn. –

+1

@the_mandrill erm ... usa 'patch -p1' (o -p0, o quello che è necessario rimuovere) ?. Oh aspetta. Domanda oooolda Il punto è che non hai bisogno di differenze di stile svn. 'git cherry-pick' – sehe

0

Il sotto ha funzionato per me.

Fonte: How to create and apply a patch with Git

In primo luogo, dare un'occhiata a quali cambiamenti sono nella patch. Lo si può fare facilmente con git applicare

git apply --stat fix_empty_poster.patch 

Nota che questo comando NON applicare la patch, ma si mostra solo le statistiche su ciò che farà. Dopo aver sbirciato nel file patch con il tuo editor preferito, puoi vedere quali sono le modifiche effettive.

Successivamente, sei interessato a quanto sia fastidiosa la patch. Git ti permette di testare la patch prima di applicarla.

git apply --check fix_empty_poster.patch 

Se non si ottiene alcun errore, la patch può essere applicata in modo pulito. Altrimenti potresti vedere quali problemi incontrerai.

Per applicare la patch, userò git am invece di git apply. La ragione di ciò è che git am ti permette di firmare una patch applicata. Questo può essere utile per riferimento futuro.

git am --signoff < fix_empty_poster.patch 

Applying: Added specs to test empty poster URL behaviour 
Applying: Added poster URL as part of cli output 

OK, le patch sono state applicate in modo pulito e il ramo principale è stato aggiornato. Naturalmente, esegui di nuovo i tuoi test per assicurarti che non si rompa nulla.

In git log, scoprirai che i messaggi di commit contengono un tag "Signed-off". Questo tag verrà letto da Github e altri per fornire informazioni utili su come il commit è finito nel codice.

4

Se avete intenzione di generare una patch in SVN e applicarlo con Git tardi, non dimenticate di utilizzare --git command-line option:

--git

Consente di utilizzare una modalità di uscita speciale per svn diff progettata per compatibilità incrociata con il famoso sistema di controllo versione distribuito Git .

Ad esempio, eseguire

svn diff --git -r 125 > /tmp/patch.diff

+0

svn: opzione non valida: --git – sloven

+0

@Nik Immagino che il tuo client svn sia troppo vecchio. Qual è il risultato di svn --version? – bahrep

+0

svn versione 1.6.13 – sloven