2009-04-14 10 views
289

ProblemWie git-svn die letzten n Revisionen aus einem Subversion-Repository klonen?

Wie man von einem Subversion-Repository eine flache Kopie mit git-svn erstellen zu tun, zum Beispiel Wie ziehst du nur die letzten drei Revisionen? Der git clone Befehl kann die letzten n Revisionen von einem Git-Repository abrufen, wenn Sie die Option --depth verwenden. Beispiel:

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

Gibt es eine ähnliche Option für git-svn?

Meine Entdeckungen bisher

Bisher habe ich fand nur die -rN Option wo N die Revision zu ziehen ist. Beispiel:

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

Gemäß der Dokumentation gibt es die Möglichkeit -r$REVNUMBER:HEAD zu verwenden. Ich versuchte Folgendes, um die letzten 3 Revisionen zu erhalten, die eine Fehlermeldung zurückgaben. So

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

I ersetzt HEAD~3 mit der tatsächlichen Anzahl der dritten aber letzter Revision 534. Das funktionierte, aber das erfordert mich zuerst die Revisionsnummer der dritten herauszufinden, aber zuletzt zu begehen.

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

Dokumentation

git-clone

git-svn

+1

was tut '-s' hier? –

+5

Beantworten Sie meine eigene Frage: '-s ist für --stdlayout, die das SVN empfohlene Layout für Tags, Stamm und Zweige vorausgesetzt. (aber nicht für mich arbeiten) –

+0

Wie schwer wäre es zu implementieren' - -depth für 'git svn', da die Unterstützung schon da ist. Und es muss schon die neueste Version vom Server herausfinden? –

Antwort

211

Sie haben bereits entdeckt, die einfachste Art und Weise eine flache Klon in Git-SVN zu spezifizieren, indem Sie die SVN-Revisionsnummer angeben, dass Sie möchte deinen Klon bei (-r$REV:HEAD) starten.

Zum Beispiel: git svn clone -s -r1450:HEAD some/svn/repo

Gits Datenstruktur basiert auf Zeiger in einem gerichteten azyklischen Graphen (DAG), die es trivial macht n Commits zu Fuß zurück. Aber in SVN (und damit in Git-SVN) müssen Sie die Revisionsnummer selbst finden.

+47

Das ist z.B. git svn Klon -s -r1450: HEAD http: // einige/svn/Repo. –

+5

Was ist, wenn ich die frühere Revision in Zukunft weiter klonen möchte? – Zennichimaro

+5

@Zennichimaro: Sie können das tun, indem Sie eine andere 'git-svn'-Fernbedienung hinzufügen, die auf die gleiche Stelle zeigt und' git-svn fetch' verwendet, um mehr von der Baumstruktur zu erhalten. An diesem Punkt müssen Sie 'git filter-branch' verwenden, um den alten (Teil-) Baum auf dem rechten Zweig zu reparieren. –

83

Ich benutze die folgenden häufig, um eine begrenzte Anzahl von Revisionen aus unserem riesigen Subversion-Baum zu bekommen (wir erreichen bald svn Revision 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 

Und ein guter Weg, um herauszufinden, wo ein Zweig gestartet, um ein svn log, es zu tun und finden Sie das erste auf dem Zweig (die letzten aufgeführt, wenn tun): So

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

weit Ich habe den Aufwand nicht wirklich gefunden, um alle Filialen zu verfolgen. Es dauert zu viel Zeit zu klonen und svn und git arbeiten nicht so gut wie ich es möchte. Ich neige dazu, Patch-Dateien zu erstellen und sie auf den Git-Klon eines anderen SVN-Zweiges anzuwenden.

+1

+1 von mir - half mir um einen Fehler 128 Problem Ich hatte Klonen eine ganze svn Repo –

+0

der Svn Log-Befehl war genau wonach ich gesucht habe! danke – mrbrdo

+1

Repos, mit denen ich arbeite, haben nicht standardmäßige Verzweigungen und Layout, so dass ich in der Regel ein lokales Git Repo für jeden SVN-Zweig erstellen, und dann 'cherry-pick' /' rebase' zwischen denen. Commit nimmt einen zusätzlichen Schritt ("push", dann "dcommit" aus dem Remote-Repo), aber ich denke, es lohnt sich. – chronospoon

24

... geschrieben 7 Jahre später, in der Wüste, bläst ein Tumbleweed von ...

ich mit der akzeptierte Antwort nicht zufrieden war, damit ich einige Skripte erstellt diese available on Github für Sie tun. Diese sollten jedem helfen, der git svn clone verwenden möchte, aber nicht das gesamte Repository klonen will und nicht nach einer bestimmten Revision suchen möchte, um mitten in der Historie zu klonen (vielleicht klont man eine Menge Repos) . Hier können wir klonen gerade die letzten Revisionen N:

Verwenden git svn clone die letzten 50 Revisionen klonen

# -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 

Finden Sie die vorherige N Revision aus einer SVN-Repo

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

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

Wird dies einen Riss geben, hat unsere Repo etwa 170.000 Revisionen und es dauert waaaay zu lang, um ein einziges Projekt zu tun, und ich habe über 10 spezifische Projekte im Repo zu tun: | Bedenkt man nur 3-4 Jahre Geschichte. – VeenarM