2009-04-28 7 views
131

Wie kann ich verzweigen und mit einem Google Code Subversion-Repository, das ich keinen Schreibzugriff habe, in ein GitHub-Repository synchronisieren?Fork und synchronisieren Google Code Subversion-Repository in GitHub

Ich möchte in der Lage sein, meine eigenen Funktionen in meinem Git-Repository zu entwickeln, aber ich möchte auch mit dem Google Code Subversion-Repository synchronisieren. Abrufen von Fixes von der Google Code-Projektseite.

Ich weiß über git-svn und benutzte es vorher zu Up- und Downstream zu einem Subversion-Repository, das ich volle Kontrolle über hatte. Aber ich weiß nicht, wie es mit einem Google Code Subversion-Repository synchron läuft.

Antwort

178

Die Remote-Zweigstelle von Git-Svn ist ziemlich genau die gleiche wie eine normale Git Remote. In Ihrem lokalen Repository können Sie also Ihren git-svn-Klon erstellen und Änderungen an GitHub vornehmen. Git ist es egal. Wenn Sie Ihren git-svn-Klon erstellen und die gleichen Änderungen an GitHub weitergeben, verfügen Sie über eine inoffizielle Spiegelung des Google Code-Repositorys. Der Rest ist Vanille Git.

Nun, da Sie dies haben, müssen Sie gelegentlich das Subversion-Repository mit Git synchronisieren Es wird in etwa so aussehen:

git svn rebase 
git push 

In gitk oder was auch immer, würde dies wie folgt aussehen:

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

Und wenn Sie git svn rebase laufen, würden Sie diese:

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

So jetzt läuft git push würde diese Commits auf GitHub, die [Fernbedienungen/Ursprung/Master] Niederlassung dort drücken. Und Sie würden zu dem Szenario im ersten ASCII-Kunstdiagramm zurückkehren.

Das Problem ist jetzt, wie arbeiten Sie Ihre Änderungen in den Mix? Die Idee ist, dass Sie sich nie auf den gleichen Zweig festlegen, den Sie git-svn-rebasing und git-pushing sind. Sie benötigen einen eigenen Zweig für Ihre Änderungen. Andernfalls würden Sie Ihre Änderungen am Anfang der Subversion-Dateien, die jeden verärgern könnten, der Ihr Git-Repository klont. Folge mir? OK, also erstellen Sie einen Zweig, nennen wir es "Features". Und du machst ein Commit und schiebst es zu GitHub zum Feature-Zweig. Ihre gitk würde wie folgt aussehen:

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

Hier haben Sie Ihre Eigenschaften Zweig bekam ein paar begeht vor dem Google Code Zweig, nicht wahr? Was passiert also, wenn Sie neue Inhalte aus Google Code integrieren möchten? Sie würden laufen git svn rebase erste und diese:

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

Wenn Sie git push Master aus, können Sie die [Fernbedienungen/origin/master] an der gleichen Stelle wie Herr zu sein vorstellen. Aber Ihr Feature-Zweig hat die Änderungen nicht. Ihre Auswahl besteht nun darin, den Master in Features oder Rebase-Features zu integrieren.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 drücken Sie Features auf GitHub. Ich habe die Fernbedienungen für Master weggelassen, um Platz zu sparen, sie wären am selben Punkt wie [Master].

Der Rebase-Ansatz ist etwas böser - Sie müssten mit --force pushen, da es sich bei Ihrem Push nicht um eine Schnellvorlauf-Zusammenführung handelt (Sie würden den Feature-Zweig unter jemandem herausziehen, der ihn geklont hat). Es ist nicht wirklich in Ordnung, dies zu tun, aber niemand kann Sie aufhalten, wenn Sie entschlossen sind. Es erleichtert auch einige Dinge, etwa wenn Patches in leicht überarbeiteter Form upstream akzeptiert werden. Es würde sparen, sich mit Konflikten herumärgern zu müssen, Sie können einfach umbuchen - die Upstream-Patches überspringen. Wie dem auch sei, wäre ein rebase so aussehen:

git rebase master features 

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

Und dann würden Sie git push --force diesem haben. Sie können sehen, warum Sie es erzwingen müssen, die Geschichte hat eine große alte Spaltung von der [Fernbedienungen/Ursprung/Eigenschaften] zu der neuen aktuellen Post-Rebase [Eigenschaften].

Das alles funktioniert, aber es ist eine Menge Mühe. Wenn Sie regelmäßig Beiträge schreiben, sollten Sie am besten so vorgehen, einige Patches upstream senden und prüfen, ob Sie Commit-Zugriff auf Subversion erhalten. Gelingt dies nicht, schieben Sie Ihre Änderungen vielleicht nicht auf GitHub. Halten Sie sie lokal und versuchen Sie, sie trotzdem stromaufwärts zu akzeptieren.

+0

Danke für die hervorragende Anleitung. ('git' noob hier.) Schnelle Frage. Ich habe dies gegen einen großen SVN Repo getan und es kam zu ~ 141 Megabyte. Ich schob es auf GitHub und klonte es dann wieder runter, und es kam auf 130 Megabyte heraus. Ich habe 'git gc' auf beiden gespielt. Was könnte für den Unterschied verantwortlich sein? – mpontillo

+0

... herausgefunden. Ich brauchte 'git push Herkunft - Spiegel '. – mpontillo

+0

Arbeitete wie ein Charme, jetzt muss ich nur den ursprünglichen googlecode devs sagen, um github mit mir zu verwenden: D – electblake

1

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

Dann mit Svn Up und Git Push tat das Ding. Natürlich, wenn Sie viel abweichen, müssen Sie die Dinge von Hand zusammenführen.

+0

Ja richtig, aber ich möchte vermeiden, die .svn Metadaten zu haben und hoffte, dass Git in der Lage ist, ein Svn Repos als Downstream-Master zu verwenden – optixx

+0

So ist es nicht möglich mit git-svn repo auschecken und git push nach github? –

0

Ich bin nicht ganz sicher, was Sie wollen, aber natürlich können Sie aus einem Subversion-Repository ziehen und von derselben Arbeitskopie auf ein Git-Repository pushen. Und Sie können auch git svn dcommit zurück zum Subversion-Repository. Sie können das GitHub-Repository jedoch nicht mit dem Subversion-Repository synchronisieren. Wenn Sie in Ihrer Arbeitskopie Commits vorgenommen haben, die noch nicht im Subversion-Repository vorhanden sind, müssen Sie sie erneut relayen, wenn das Subversion-Repository aktualisiert wurde, und Sie müssen die "neuen" Commits für GitHub an git push --force senden.

10

Ein Durchlauf zur Synchronisierung von Google Code zu GitHub ist verfügbar unter fnokd.com. Der Autor verwendet einen Always-On-Remote-Server und einen Cron-Job, um die Synchronisation zu automatisieren, und behä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 einen neuen Repo und klicken Sie dann auf "Import from Subversion" auf dem Bildschirm "Next Steps". Die weitere Synchronisierung wird jedoch nicht unterstützt: /.

+0

Diese Methode existiert nicht mehr – magnetik

+0

Verwenden Sie stattdessen https://import.github.com/new. Siehe https://help.github.com/articles/importing-from-subversion/. –

15

svn2github Service

Die Website http://svn2github.com/ einen Dienst alle öffentlich zugänglichen SVN-Repository auf Github (bei https://github.com/svn2github/projectname) gabeln bietet. Ich versuchte es; Beim Drücken von "Make a Mirror" hat es scheinbar für einige Sekunden 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 Repository verzweigen, das es erstellt, und auf Ihrer eigenen Gabel arbeiten. Sie würden dann Ihre Änderungen mit ihrem Bugtracker an das Upstream-Projekt senden.

Betrachtet man vorhandene Repositories unter dem Github-Benutzer des Dienstes (z. B. "svn2github wurde vor svn2github/haxe vor 5 Stunden gemastert"), scheint es regelmäßig Änderungen aus dem SVN-Repository einzuziehen. Es gibt keine Informationen darüber, wer den Dienst auf der Website betreibt, also würde ich nicht darauf wetten, dass es weiterhin unbegrenzt läuft, aber es funktioniert vorerst (und wenn es jemals ausfällt, können Sie Ihre Gabel immer noch manuell aktualisieren).

Launchpad

Wenn Sie nicht über die Verwendung Git und Github werden eingestellt, ist eine weitere Alternative Launchpad.net zu verwenden. Launchpad kann automatisch SVN (auch CVS) Repositories in einen persönlichen bzr Zweig importieren. Erstellen Sie dazu ein Launchpad-Projekt, gehen Sie dann zu the new import page, wählen Sie Subversion und geben Sie die URL ein (z. B. http://projectname.googlecode.com/svn/trunk/). Abhängig von der Projektgröße kann der initiale Import einige Stunden dauern. Nachfolgende Importe werden regelmäßig ausgeführt.

Weitere Dokumentation finden Sie unter VCS Imports on Launchpad Help.

0

fand ich diese Anweisungen auf Yu-Jie Lin ‚s Blog:

Erste Klon der Subversion-Repository und drücken Sie auf die Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo 
git remote add git-foo [email protected]:username/foo.git 
git push git-foo master 

Nachdem im Subversion-Repository zu begehen, führte

cd /path/to/git-foo 
git svn fetch 
git svn rebase 
git push git-foo master 
Verwandte Themen