Come clonare git-svn le ultime n revisioni da un repository Subversion?


314

Problema

Come si crea una copia superficiale con git-svn da un repository Subversion, ad esempio come si estraggono solo le ultime tre revisioni?

Il git clonecomando può ottenere le ultime n revisioni da un repository Git se si utilizza l'opzione --depth, ovvero si ottiene una copia superficiale del repository. Esempio:

git clone --depth 3 git://some/repo myshallowcopyrepo

Esiste un'opzione simile per git-svn?

Le mie scoperte finora

Finora ho trovato solo l' -rNopzione dove Nè la revisione da tirare. Esempio:

git svn clone -rN svn://some/repo

Secondo la documentazione c'è la possibilità di utilizzare -r$REVNUMBER:HEAD. Ho provato quanto segue per ottenere le ultime 3 revisioni che hanno restituito un messaggio di errore.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Quindi ho sostituito HEAD~3con il numero effettivo della terza ma ultima revisione 534. Ha funzionato, ma ciò mi richiede di capire prima il numero di revisione della terza ma ultima commit.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Documentazione

git-clone

git-svn


6
Rispondere alla mia domanda: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(ma non ha funzionato per me)
Sebastián Grignoli

Quanto difficile sarebbe da implementare --depthper git svn, dal momento che il supporto è già lì. E deve già scoprire le ultime rev dal server?
Peter Cordes

Risposte:


238

Hai già scoperto il modo più semplice per specificare un clone superficiale in Git-SVN, specificando il numero di revisione SVN da cui desideri avviare il clone ( -r$REV:HEAD).

Per esempio: git svn clone -s -r1450:HEAD some/svn/repo

La struttura dei dati di Git si basa su puntatori in un grafico aciclico diretto (DAG), il che rende banale tornare indietro ai ncommit. Ma in SVN (e quindi in Git-SVN) dovrai trovare tu stesso il numero di revisione.


5
e se mi piacerebbe continuare a clonare la revisione precedente in futuro, è possibile?
Zennichimaro,

5
@Zennichimaro: puoi farlo aggiungendo un altro git-svnpuntamento remoto nello stesso punto e usando git-svn fetchper ottenere più albero. A quel punto devi usare git filter-branchper ripartire il vecchio albero (parziale) sul ramo giusto.
Ben Jackson

Paul c'è un modo per me di ottenere le ultime revisioni eseguendo incrementale migrazione da SVN a Git ( stackoverflow.com/questions/29161646/... )
SabareeshSS

1
SVN usa numeri interi consecutivi per identificare le revisioni, rendendo ancora più banale tornare indietro, ncommessi ...
Harmic

Penso che manchi uno spazio dopo -r. Per esempio git svn clone -r 1133: HEAD some / svn / repo
Gnana,

92

Mi ritrovo a utilizzare spesso quanto segue per ottenere un numero limitato di revisioni dal nostro enorme albero di sovversione (presto raggiungeremo la revisione svn 35000).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

E un buon modo per scoprire dove è iniziato un ramo è quello di farlo svn loge trovare il primo sul ramo (l'ultimo elencato quando lo si fa):

svn log --stop-on-copy svn://some/repo/branch/some-branch

Finora non ho davvero trovato la seccatura che valga la pena seguire tutti i rami. Ci vuole troppo tempo per clonare e svn e git non funzionano insieme come vorrei. Tendo a creare file patch e applicarli sul clone git di un altro ramo svn.


1
+1 da parte mia - mi ha aiutato a risolvere un problema di errore 128 Stavo avendo la clonazione di un intero repository svn
Ian Oxley

il comando svn log era esattamente quello che stavo cercando! grazie
mrbrdo,

1
I repository con cui lavoro hanno ramificazioni e layout non standard, quindi generalmente creo un repository Git locale per ciascun ramo SVN e quindi cherry-pick/ rebasetra quelli. Commit fa un passo in più ( push, quindi dcommitdal repository remoto), ma penso che valga la pena il compromesso.
Chronospoon,

Non ci avevo pensato, potrebbe essere più veloce solo clonare tag / rami specifici come dici tu :)
VeenarM,

34

... 7 anni dopo, nel deserto, un'asfalto soffia vicino ...

Non ero soddisfatto della risposta accettata, quindi ho creato degli script per farlo disponibili su Github . Questi dovrebbero aiutare chiunque voglia usare git svn clonema non vuole clonare l'intero repository e non vuole cercare una revisione specifica da cui clonare nel mezzo della storia (forse stai clonando un sacco di repository). Qui possiamo solo clonare le ultime N revisioni:

Utilizzare git svn cloneper clonare le ultime 50 revisioni

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Trova la precedente revisione N da un repository SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

Daremo una svolta, il nostro repository ha circa 170.000 revisioni e sta impiegando troppo tempo per fare un singolo progetto, e ho oltre 10 progetti specifici nel repository da fare: | Considerando di fare solo 3-4 anni di storia.
VeenarM,

1
Grazie per averlo condiviso!
Kai Mechel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.