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

314

Problem

Wie erstellt man mit git-svn eine flache Kopie aus einem Subversion-Repository, z. B. wie zieht man nur die letzten drei Revisionen?

Der git cloneBefehl kann die letzten n Revisionen aus einem Git-Repository abrufen, wenn Sie die Option verwenden --depth, dh Sie erhalten eine flache Kopie des Repositorys. Beispiel:

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

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

Meine bisherigen Entdeckungen

Bisher habe ich nur die -rNOption gefunden, wo Ndie Revision zu ziehen ist. Beispiel:

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

Laut Dokumentation besteht die Möglichkeit zur Verwendung -r$REVNUMBER:HEAD. Ich habe Folgendes versucht, um die letzten 3 Revisionen zu erhalten, die eine Fehlermeldung zurückgaben.

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

Also habe ich durch HEAD~3die tatsächliche Nummer der vorletzten Revision 534 ersetzt. Das hat funktioniert, aber dafür muss ich zuerst die Revisionsnummer des vorletzten Commits herausfinden.

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

Dokumentation

Git-Klon

git-svn

Lernkurve
quelle
6
Beantwortung meiner eigenen Frage: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(hat aber bei mir nicht funktioniert)
Sebastián Grignoli
Wie schwer wäre es, zu implementieren --depthfür git svn, da die Unterstützung schon da ist. Und muss es schon die neueste Version vom Server herausfinden?
Peter Cordes

Antworten:

238

Sie haben bereits den einfachsten Weg gefunden, einen flachen Klon in Git-SVN anzugeben, indem Sie die SVN-Versionsnummer angeben, unter der Sie Ihren Klon starten möchten ( -r$REV:HEAD).

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

Die Datenstruktur von Git basiert auf Zeigern in einem gerichteten azyklischen Graphen (DAG), was das Zurückgehen von nCommits trivial macht . Aber in SVN (und daher in Git-SVN) müssen Sie die Revisionsnummer selbst finden.

Paul
quelle
5
Was ist möglich, wenn ich die frühere Revision auch in Zukunft weiter klonen möchte?
Zennichimaro
5
@Zennichimaro: Sie können dies tun, indem Sie eine weitere git-svnFernbedienung hinzufügen, die auf dieselbe Stelle zeigt, und verwenden git-svn fetch, um mehr vom Baum zu erhalten. An diesem Punkt müssen Sie git filter-branchden alten (Teil-) Baum auf den rechten Ast reparieren.
Ben Jackson
Paul gibt es eine Möglichkeit für mich, die neuesten Revisionen zu erhalten, indem ich eine inkrementelle Migration von SVN zu Git durchführe ( stackoverflow.com/questions/29161646/… )
SabareeshSS
1
SVN verwendet aufeinanderfolgende Ganzzahlen, um Revisionen zu identifizieren, was es noch trivialer macht, nCommits zurückzulaufen ...
schädlich
Ich denke, nach -r fehlt ein Leerzeichen. Zum Beispiel git svn clone -r 1133: HEAD some / svn / repo
Gnana
92

Ich benutze häufig das Folgende, um eine begrenzte Anzahl von Revisionen aus unserem riesigen Subversion-Baum herauszuholen (wir erreichen bald die 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

Ein guter Weg, um herauszufinden, wo ein Zweig begonnen hat, besteht darin, einen zu svn logmachen und den ersten auf dem Zweig zu finden (der letzte, der dabei aufgeführt ist):

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

Bisher habe ich den Aufwand für die Verfolgung aller Branchen nicht wirklich gefunden. Das Klonen dauert zu lange und svn und git arbeiten nicht so gut zusammen, wie ich es gerne hätte. Ich neige dazu, Patch-Dateien zu erstellen und sie auf den Git-Klon eines anderen SVN-Zweigs anzuwenden.

Christian
quelle
1
+1 von mir - half mir, einen Fehler zu umgehen 128 Problem Ich hatte ein ganzes SVN-Repo geklont
Ian Oxley
Der Befehl svn log war genau das, wonach ich gesucht habe! danke
mrbrdo
1
Repos, mit denen ich arbeite, haben nicht standardmäßige Verzweigungen und Layouts, daher erstelle ich im Allgemeinen ein lokales Git-Repo für jeden SVN-Zweig und dann cherry-pick/ rebasezwischen diesen. Commit macht einen zusätzlichen Schritt ( pushdann dcommitvon Remote Repo), aber ich denke, es ist den Kompromiss wert.
Chronospoon
Hatte nicht darüber nachgedacht, könnte schneller sein, nur bestimmte Tags / Zweige zu klonen, wie Sie sagen :)
VeenarM
33

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

Ich war mit der akzeptierten Antwort nicht zufrieden und habe einige Skripte erstellt, um dies für Sie zu tun, die auf Github verfügbar sind . Diese sollten jedem helfen, der git svn clonedas gesamte Repository verwenden möchte, aber nicht das gesamte Repository klonen möchte und nicht nach einer bestimmten Revision suchen möchte, aus der er mitten im Verlauf klonen kann (möglicherweise klonen Sie eine Reihe von Repos). Hier können wir nur die letzten N Revisionen klonen:

Verwenden Sie git svn clonediese Option, um die letzten 50 Revisionen zu 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

Suchen Sie die vorherige N-Revision aus einem SVN-Repo

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

./svn-lookback.sh -u https://server/project/trunk -l 5     
jonathan.cone
quelle
Wird dies einen Riss geben, unser Repo hat ungefähr 170.000 Revisionen und es dauert viel zu lange, um ein einzelnes Projekt zu machen, und ich habe über 10 spezifische Projekte im Repo zu erledigen: | Wenn man bedenkt, nur 3-4 Jahre Geschichte zu machen.
VeenarM
1
Danke, dass du das geteilt hast!
Kai Mechel