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 rebase
zuerst rennen und folgendes bekommen:
o [features][remotes/origin/features]
[master][remotes/trunk] o |
| o
o /
|/
o[remotes/origin/master]
|
o
Wenn Sie git push
beherrschen, 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 --force
das. 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.
git
noob 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 bingit gc
auf beiden gelaufen . Was könnte den Unterschied erklären?