2009-04-14 15 views
289

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

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

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

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

Esiste un'opzione simile per git-svn?

mie scoperte finora

Finora ho trovato solo l'opzione -rN dove N è la revisione di tirare. Esempio:

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

Secondo la documentazione v'è 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 

Così ho sostituito HEAD~3 con il numero effettivo della terza, ma ultima revisione 534. Che ha funzionato, ma che mi richiede prima capire il numero di revisione del terzo, ma dell'ultimo commit.

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

Documentazione

git-clone

git-svn

+1

cosa fa '-s' fai qui? –

+5

Rispondere alla mia stessa domanda: '-s è per --stdlayout che presume il layout consigliato da svn per tag, trunk e rami. (ma non ha funzionato per me) –

+0

Quanto sarebbe difficile implementare' - -depth' per 'git svn', dal momento che il supporto è già lì. E deve già scoprire l'ultima versione del server? –

risposta

211

hai già scoperto il modo più semplice per specificare un clone superficiale in Git-SVN, specificando il numero di revisione SVN che si vuoi avviare il tuo clone in (-r$REV:HEAD).

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

struttura dati di Git è basata su puntatori in un grafo orientato aciclico (DAG), che lo rende banale per tornare indietro n commit. Ma in SVN (e quindi in Git-SVN) dovrai trovare il numero di revisione da solo.

+47

Quindi, ad es. git svn clone -s -r1450: HEAD http: // some/svn/repo. –

+5

E se fosse possibile continuare a clonare la revisione precedente in futuro, è possibile? – Zennichimaro

+5

@Zennichimaro: Puoi farlo aggiungendo un altro puntatore remoto 'git-svn' nello stesso posto e usando' git-svn fetch' per ottenere più dell'albero. A quel punto devi usare 'git filter-branch' per riparare il vecchio (parziale) albero sul ramo destro. –

83

Mi trovo ad usare spesso quanto segue per ottenere un numero limitato di revisioni dal nostro albero di sovversione enorme (stiamo per raggiungere presto la versione 35000 di svn).

# 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 un ramo iniziare è quello di fare un svn log e trovare il primo sul ramo (l'ultimo elencato quando si fa):

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

Finora Non ho davvero trovato il problema ne vale la pena nel tracciare tutti i rami. Ci vuole troppo tempo per clonare e svn e git non funzionano insieme come vorrei. Tendo a creare file di patch e applicarli sul clone git di un altro ramo svn.

+1

+1 da me - mi ha aiutato a risolvere un problema di errore 128 Stavo avendo clonato un intero repository svn –

+0

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

+1

I Repos con cui lavoro hanno un branching e un layout non standard, quindi generalmente creo un repo Git locale per ogni ramo SVN, e poi 'cherry-pick' /' rebase' tra quelli. Commit fa un passo in più ('push', quindi' dcommit' dal repository remoto), ma penso che valga la pena. – chronospoon

24

... 7 anni più tardi, nel deserto, un tumbleweed soffia da ...

non ero soddisfatto con la risposta accettata così ho creato alcuni script per fare questo per voi available on Github. Questi dovrebbero aiutare chiunque voglia usare git svn clone ma non vuole clonare l'intero repository e non vuole cacciare una revisione specifica da clonare nel mezzo della cronologia (forse stai clonando un mucchio di repository) . Qui possiamo solo clonare gli ultimi N revisioni:

Usa git svn clone per clonare le 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 alla precedente revisione N da un repo SVN

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

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

Daremo questo un crack, il nostro repo ha circa 170.000 revisioni e ci stiamo prendendo troppo tempo per fare un singolo progetto, e ho oltre 10 progetti specifici nel repository da fare: | Considerando solo fare 3-4 anni di storia solo. – VeenarM

Problemi correlati