Verzweigen und synchronisieren Sie das Google Code Subversion-Repository in GitHub


131

Wie kann ich ein Google Code Subversion-Repository, auf das ich keinen Schreibzugriff habe, in ein GitHub-Repository aufteilen und synchronisieren?

Ich möchte in der Lage sein, meine eigenen Funktionen in meinem Git-Repository zu entwickeln, möchte aber auch mit dem Google Code Subversion-Repository synchronisieren. So holen Sie Korrekturen von der Google Code-Projektseite ab

Ich kenne git-svn und habe es zuvor verwendet, um ein Subversion-Repository, über das ich die volle Kontrolle hatte, zu aktualisieren. Ich weiß jedoch nicht, wie ich mit einem Google Code Subversion-Repository synchron bleiben soll.

Antworten:


178

Der Remote-Zweig von git-svn ist so ziemlich der gleiche wie ein normaler Git-Remote. In Ihrem lokalen Repository können Sie also Ihren git-svn-Klon haben und Änderungen an GitHub übertragen. Git ist das egal. Wenn Sie Ihren git-svn-Klon erstellen und genau dieselben Änderungen an GitHub übertragen, erhalten Sie einen inoffiziellen Spiegel des Google Code-Repositorys. Der Rest ist Vanille Git.

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

Nachdem Sie dies haben, müssen Sie gelegentlich das Subversion-Repository mit Git synchronisieren. Es wird ungefähr so ​​aussehen:

git svn rebase
git push

In gitk oder was auch immer würde das ungefähr so ​​aussehen:

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

Und wenn du rennst git svn rebase, hättest du folgendes:

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

Wenn Sie jetzt ausgeführt werden git push, werden diese Commits an GitHub, den dortigen Zweig [remotes / origin / master], weitergeleitet . Und Sie kehren zum Szenario im ersten ASCII-Grafikdiagramm zurück.

Das Problem ist nun, wie arbeiten Sie Ihre Änderungen in den Mix ein? Die Idee ist, dass Sie sich nie auf denselben Zweig festlegen, auf den Sie git-svn-rebaseing und git-push anwenden. Sie benötigen einen separaten Zweig für Ihre Änderungen. Andernfalls würden Sie Ihre Änderungen zusätzlich zu den Subversion-Änderungen neu festlegen, was jeden verärgern könnte, der Ihr Git-Repository klont. Folge mir? OK, Sie erstellen einen Zweig. Nennen wir ihn "Features". Und Sie machen ein Commit und senden es an GitHub in den Feature-Zweig. Dein Gitk würde ungefähr so ​​aussehen:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

Hier haben Sie Ihren Feature-Zweig ein paar Commits vor dem Google Code-Zweig, oder? Was passiert also, wenn Sie neue Inhalte aus Google Code einbinden möchten? Du würdest git svn rebasezuerst rennen und folgendes bekommen:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

Wenn Sie git pushbeherrschen, können Sie sich vorstellen, dass sich die [Fernbedienungen / Ursprung / Master] am selben Punkt wie der Master befinden. Ihr Feature-Zweig enthält jedoch keine Änderungen. Sie haben jetzt die Wahl, den Master in Features zusammenzuführen oder Features neu zu starten. Eine Zusammenführung würde so aussehen

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

Dann schieben Sie Funktionen an GitHub. Ich habe die Fernbedienungen für den Master weggelassen, um Platz zu sparen. Sie befinden sich am selben Punkt wie [Master] .

Der Rebase-Ansatz ist etwas bösartiger - Sie müssten mit --force pushen, da Ihr Push kein schneller Vorlauf wäre (Sie würden den Feature-Zweig unter jemandem herausziehen, der ihn geklont hat). Es wird nicht wirklich als OK angesehen, dies zu tun, aber niemand kann Sie aufhalten, wenn Sie entschlossen sind. Dies erleichtert auch einige Dinge, z. B. wenn Patches in leicht überarbeiteter Form vorgelagert akzeptiert werden. Sie müssen sich nicht mit Konflikten herumschlagen, sondern können die Upstream-Patches einfach überspringen. Wie auch immer, eine Rebase wäre wie folgt:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

Und dann müsstest du git push --forcedas. Sie können sehen, warum Sie es erzwingen müssen. Die Geschichte hat ein großes altes Schisma von [Fernbedienungen / Ursprung / Funktionen] bis zur neuen aktuellen Post-Rebase [Funktionen]. .

Das alles funktioniert, aber es ist viel Aufwand. Wenn Sie regelmäßig Beiträge leisten, ist es am besten, eine Weile so zu arbeiten, einige Patches vorab zu senden und zu prüfen, ob Sie einen Commit-Zugriff auf Subversion erhalten können. Andernfalls werden Ihre Änderungen möglicherweise nicht an GitHub weitergegeben. Halten Sie sie lokal und versuchen Sie trotzdem, sie stromaufwärts zu akzeptieren.


Vielen Dank für die hervorragende Anleitung. ( gitnoob hier.) Kurze Frage. Ich habe dies gegen ein großes SVN-Repo gemacht und es kam auf ~ 141 Megabyte heraus. Ich schob es auf Github und klonte es dann wieder nach unten, und es kam auf 130 Megabyte heraus. Ich bin git gcauf beiden gelaufen . Was könnte den Unterschied erklären?
mpontillo

... herausgefunden. Ich brauchte git push origin --mirror.
mpontillo

Hat wie ein Zauber funktioniert, jetzt muss ich nur noch den ursprünglichen Googlecode-Entwicklern sagen, dass sie Github bei mir verwenden sollen: D
Electblake

Dies funktionierte bei mir mit der -sOption für nicht git svn clone, aber ohne sie funktionierte der Rest einwandfrei.
user1027169

15

svn2github service

Die Website http://svn2github.com/ bietet einen Dienst zum Aufteilen eines öffentlich zugänglichen SVN-Repositorys auf Github (unter https://github.com/svn2github/projectname) ). Ich versuchte es; Beim Drücken von "Make a Mirror" hat es anscheinend einige Sekunden lang nichts getan und die Meldung "error" angezeigt, aber es hat tatsächlich funktioniert. Das neue Repository wurde tatsächlich erstellt und enthält den Code aus dem SVN-Repo.

Sie würden dann das von ihm erstellte Repository aufteilen und an Ihrer eigenen Abzweigung arbeiten. Sie würden dann Ihre Änderungen mit ihrem Bugtracker an das Upstream-Projekt senden.

Wenn man sich vorhandene Repositorys unter dem Github-Benutzer des Dienstes ansieht (z. B. "svn2github wurde vor 5 Stunden bei svn2github / haxe an den Master gesendet"), scheint es regelmäßig Änderungen aus dem SVN-Repository zu ziehen. Es gibt keine Informationen darüber, wer den Dienst auf der Website ausführt, daher würde ich nicht darauf wetten, dass er weiterhin auf unbestimmte Zeit ausgeführt wird, aber er funktioniert vorerst (und falls er jemals ausfällt, können Sie Ihre Abzweigung trotzdem manuell aktualisieren).

Launchpad

Wenn Sie nicht auf Git und Github eingestellt sind, können Sie auch Launchpad.net verwenden. Launchpad kann SVN-Repositorys (auch CVS-Repositorys) automatisch in einen persönlichen bzr-Zweig importieren. Erstellen Sie dazu ein Launchpad-Projekt, wechseln Sie zur neuen Importseite , wählen Sie Subversion und geben Sie die URL ein (zhttp://projectname.googlecode.com/svn/trunk/ . ). Je nach Projektgröße kann der Erstimport einige Stunden dauern. Nachfolgende Importe werden regelmäßig ausgeführt.

Weitere Dokumentation finden Sie unter VCS-Importe in der Launchpad-Hilfe .


10

Eine Anleitung zum Synchronisieren von Google Code mit GitHub finden Sie unter fnokd.com . Der Autor verwendet einen ständig aktiven Remote-Server und einen Cron-Job, um die Synchronisierung zu automatisieren, und hält den SVN-Trunk in einem GitHub-Zweig namens "Vendor".


2

GitHub unterstützt jetzt das direkte Importieren von Subversion-Projekten (siehe http://help.github.com/import-from-subversion/ ). Erstellen Sie einfach ein neues Repo und klicken Sie im Bildschirm "Nächste Schritte" auf "Aus Subversion importieren". Eine weitere Synchronisierung wird jedoch nicht unterstützt: /.


Diese Methode gibt es nicht mehr
Magnetik


1

Hmm .. In meiner Firma habe ich fast das gleiche gemacht. Nur .svn und .git repo im selben Verzeichnis haben (Sie checken svn repo aus und erstellen git repo in dieser Arbeitskopie).

Dann hat svn up und git push das Ding gemacht. Wenn Sie stark voneinander abweichen, müssen Sie die Dinge natürlich von Hand zusammenführen.


Ja richtig, aber ich möchte vermeiden, die .svn-Metadaten zu haben und hoffte, dass git ein svn-Repos als
Downstream-

Ist es also nicht möglich, git-svn zum Auschecken von Repo und git push to github zu verwenden?
Marcin Gil

0

Ich bin mir nicht ganz sicher, was Sie wollen, aber Sie können natürlich aus einem Subversion-Repository ziehen und von derselben Arbeitskopie in ein Git-Repository pushen. Sie können auch git svn dcommitzum Subversion-Repository zurückkehren. Sie können das GitHub-Repository jedoch nicht mit dem Subversion-Repository synchronisieren. Wenn Ihre Arbeitskopie Commits enthält, die sich noch nicht im Subversion-Repository befinden, müssen Sie diese neu starten, wenn das Subversion-Repository aktualisiert wurde, und Sie zu git push --forceden "neuen" Commits für GitHub zwingen .


0

Ich habe diese Anleitung am gefunden Yu-Jie Lins Blog gefunden:

Klonen Sie zuerst das Subversion-Repository und drücken Sie es auf den Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Führen Sie nach dem Festschreiben im Subversion-Repository aus

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.