2012-11-02 7 views
5

ProblemVerwenden von Git als Brücke zwischen Git und SVN Repos?

Mein Team nutzt git für die Quellcodeverwaltung auf bitbucket, unser Client verwendet Subversion im Hause. Wie kann unser Team weiterhin git verwenden, während Code in Subversion eingecheckt wird? Und nein, ich glaube nicht, dass Git-Svn funktionieren wird.

Anforderungen

Mein Team will eine reine git-Lösung verwenden, nicht git-svn. Der Grund dafür ist, dass unser Kunde uns Zugang zu seiner svn-Umgebung nur innerhalb unseres Büro-LAN gewährt hat; Wir können keine Zusagen machen, wenn wir außerhalb des Büros arbeiten.

Mein Ansatz

Ich dachte, dass ich die Subversion-Repository mit git-svn Kasse könnte, dann ist unsere bitbucket git Instanz als Fernbedienung auf die gleiche git-wrapped SVN-Repository hinzuzufügen. Ein Cron-Job könnte dann die git pull aus unserem Bitbucket Repo machen, dann tun Sie eine git svn dcommit, um die Änderungen in Bitbucket bis zum Subversion-Repository unseres Kunden zu pushen.

Dies war problematisch aus dem Grund, dass Git würde immer zeigen, dass ich 'x' Anzahl der Revisionen vor dem Git bitbucket Repository nach dem Pull, svn dcommit Prozess beendet wurde.

Während noch nichts äußerlich Seltsames vor sich geht, bin ich irgendwann zuversichtlich, dass unser Client Eincheck-Vorgänge in ihr Subversion-Repository starten wird, die ich irgendwann an unsere bitbucket-Instanz weitergeben muss.

Technische Daten

Hier ist eine grobe Reihe von Schritten, die ich diese Arbeit zu versuchen, habe mit zu bekommen:

git svn clone -s http://svn.my-client.us/my-proj/ 
cd my-proj 
git remote add origin path-to-bitbucket-repo 
git fetch origin 
git checkout -b develop remotes/develop 
git branch --set-upstream develop origin/develop 
git pull 
#add merge comment here 
git svn rebase 
git svn dcommit #takes a while to transfer all the individual commits 

Nach all den oben, Ausführung git status:

[[email protected] myDir]$ git st 
# On branch develop 
# Your branch is ahead of 'origin/develop' by 59 commits. 
# 
nothing to commit (working directory clean) 

Gegeben, ich muss in der Lage sein, Check-Ins von jedem Ort zu tun, nicht nur, während ich im Büro bin, gibt es s trategie, sie als Brücke dafür zu nutzen?

Danke!

Antwort

4

Ihr Ansatz ist korrekt, aber Sie müssen sich bewusst sein, dass dcommit Geschichte noch mehr umschreibt als eine normale rebase tut. Zum Beispiel fügt es eine git-svn-id Zeile an jedes Commit an, das an svn übergeben wird. Das ist der Grund, warum Ihr Zweig develop vor origin/develop erscheint - weil er 59 commits enthält, die git-svn-id in der Nachricht enthalten, und keiner davon ist in origin/develop vorhanden. Daher müssen Sie Ihre Git-Zweige nach jedem Commit oder zumindest vor dem nächsten Commit neu erstellen. Dies bedeutet, kraft drückt die Geschichte des Upstream neu zu schreiben:

git push -f origin develop 

Wenn andere Zweige auf dieser vorgeschalteten beruhten, würden sie nun an werden müssen indexiert.

Die CAVEATS-Sektion der git-svn man page geht in mehr Details, so sollten Sie es auf jeden Fall lesen.

Änderungen, die von Ihrem Client auf der SVN-Seite vorgenommen werden, werden automatisch in Ihren Entwicklungszweig über die git svn rebase integriert und erreichen Bitbucket schließlich über die git push -f oben.

Wenn diese Art von Workflow Sie nicht zufriedenstellt, kann es sich lohnen, sich die SubGit anzusehen. Ich habe es nie versucht, aber sie behaupten, eine viel weniger begrenzte Integration zwischen den beiden SCMs anzubieten.