Ist es möglich, ein Subversion-Repository als Git-Submodul zu haben?


154

Gibt es eine Möglichkeit, ein Subversion-Repository als Git-Submodul in mein Git-Repository aufzunehmen?

Etwas wie:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

Wobei https://svn.foo.com/svn/projauf ein Subversion-Repository verweist.

Ich weiß, dass git-svnes eine gibt, die es einem ermöglicht, mit einem Subversion-Repository zu interagieren. Ich denke also, vielleicht gibt es eine Möglichkeit, ein Subversion-Repository mit auszuchecken git-svnund es dann als Submodul zu verwenden.

Antworten:


127

Nein. Am besten richten Sie einen Spiegel des SVN-Repositorys in einem dedizierten Git-Repository ein.

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com:project.git
git push origin master

Anschließend können Sie das Git-Repository als Submodul zum ursprünglichen Projekt hinzufügen

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

Es gibt einen konzeptionellen Unterschied zwischen svn: externals und git submodule, der Sie möglicherweise stolpern lässt, wenn Sie sich dem unter dem Gesichtspunkt der Subversion nähern. Das Git-Submodul ist an die von Ihnen angegebene Revision gebunden. Wenn sich "Upstream" ändert, müssen Sie die Referenz Ihres Submoduls aktualisieren.

Wenn wir also mit der Upstream-Subversion erneut synchronisieren:

cd /path/to/mysvnclone
git svn rebase
git push

... das Git-Projekt wird weiterhin die ursprüngliche Revision verwenden, die wir zuvor festgelegt haben. Um auf den svn HEAD zu aktualisieren, müssten Sie verwenden

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"

1
Haben Sie diese Codes ausprobiert, bevor Sie sie hier veröffentlichen? Submodule können bei git svn nicht richtig funktionieren.
Xhan

4
@xhan ja, und ich befürworte nicht das Mischen von git-svn und Submodulen im selben Repository. Der Klon, der git-svn verwendet, ist nur eine Brücke zum Erstellen eines nativen git-Klons des svn-Repositorys.
Richq

Es tut uns leid. Ich habe nicht festgestellt, dass Sie zwei Ordner als Submodule verwenden. Guter Trick.
Xhan

Schöne Technik. Benötigen Sie keinen Schritt "git init --bare" auf dem Server, bevor Sie das git-svn-Repo dorthin verschieben? Ich musste das machen.
Clayton Stanley

Dies ist wahrscheinlich nicht die Standardeinstellung, aber Sie können svn: externals genau wie Git-Submodule an eine bestimmte Revision binden.
MarcH

8

Ich habe das gerade durchgemacht. Ich mache etwas ähnliches wie rq, aber etwas anders. Ich habe einen meiner Server so eingerichtet, dass er diese Git-Klone der benötigten SVN-Repos hostet. In meinem Fall möchte ich nur schreibgeschützte Versionen und benötige ein nacktes Repo auf dem Server.

Auf dem Server starte ich:

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

Dies richtet mein nacktes Repo ein, dann habe ich ein Cron-Skript, um es zu aktualisieren:

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

Dies erfordert auch fix-svn-refs.sh von http://www.shatow.net/fix-svn-refs.sh. Dies wurde hauptsächlich inspiriert von: http://gsocblog.jsharpe.net/archives/12

Ich bin mir nicht sicher, warum das git gchier gebraucht wird, aber ich konnte nicht git pulldarauf verzichten.

Nach all dem können Sie das Git-Submodul gemäß den Anweisungen von rq verwenden.


Man würde denken, Sie könnten dies sogar als Commit-Hook tun.
Andres Jaan Tack

6

Derzeit git-svn nicht unterstützt svn: externals . Es gibt jedoch zwei weitere Tools, die Ihnen helfen können:

  1. SubGit

    SubGit ist eine serverseitige Lösung, die Git den Zugriff auf das Subversion-Repository ermöglicht und umgekehrt. Weitere Informationen finden Sie in der Dokumentation. Im Allgemeinen ist die Verwendung von SubGit jedoch recht einfach:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Der obige Befehl erkennt das Layout der Zweige im SVN-Projekt und erstellt dann ein leeres nacktes Git-Repository, das zum Spiegeln des SVN-Projekts bereit ist. Möglicherweise werden Sie nach Anmeldeinformationen gefragt, es sei denn, diese sind bereits im SVN-Anmeldeinformations-Cache im Verzeichnis ~ / .subversion gespeichert. Sie können auch anpassen $GIT_REPO/subgit/authors.txt, um SVN-Autorennamen Git-Identitäten zuzuordnen.

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    In diesem Moment ist das Subversion-Repository mit dem neu erstellten Git-Repository verbunden. SubGit übersetzt die SVN-Revision in Git-Commit bei jedem svn commitund Git-Commit in SVN-Revision bei jedem git push.

Alles, was Sie weiter benötigen, ist, das Git-Repository für Committer verfügbar zu machen. Schauen Sie sich dazu das git-http-backend an. Anschließend können Sie das erstellte Git-Repository als übliches Submodul hinzufügen. SubGit ist auch als Add-On für den Bitbucket-Server erhältlich. Weitere Informationen finden Sie hier . Es ist also nicht erforderlich, externe Tools wie git-svn oder andere zu verwenden.

SubGit ist eine proprietäre Software, die jedoch für kleine Unternehmen (bis zu 10 Committer), akademische und Open-Source-Projekte kostenlos ist.

  1. SmartGit

    SmartGit ersetzt git-svn auf der Clientseite. Weitere Informationen zu den Funktionen finden Sie hier .

    Insbesondere unterstützt SmartGit sowohl Git-Submodule als auch svn: externals . Sie können diese in Ihrem Repository mischen.

    SmartGit ist eine proprietäre Software, die jedoch für den nichtkommerziellen Gebrauch kostenlos ist.


Sowohl das subgit( subgit.com/documentation/… ) als auch das smartgitunterstützen das svn:externalsin gleicher Weise durch eine explizite .gitsvnextmodulesDatei in einer Arbeitskopie. Das bedeutet, dass Sie diese Software weiterhin zum Auschecken von externen Geräten verwenden müssen und das Basisdienstprogramm nicht gitzum Auschecken dieser externen Geräte direkt von einem externen Git-Hub-Server wie githuboder verwenden können gitlab. Daher können die Quellen, die snv:externalsauf einen externen Git-Hub-Server übertragen werden, ohne diese Software nicht beobachtet und heruntergeladen werden, was immer noch ein wichtiges Problem darstellt.
Andry

4

Zusätzlich zu den Aussagen von rq wäre eine andere Methode die Verwendung des "externen" Projekts eines Drittanbieters ( http://nopugs.com/ext-tutorial ), das die Funktionsweise externer SVN-Referenzen besser nachahmt. Mit externen Geräten können Sie entweder Git- oder SVN-Repositorys verfolgen, und es scheint einfacher zu sein, Ihre Änderungen in diese Repos zu übertragen. Die Projektmitglieder müssen jedoch das separate Paket herunterladen und installieren.

Ich habe noch keine Submodule oder externen Geräte verwendet. Ich habe jedoch einige Stunden damit verbracht, über alle Alternativen zu lesen, und es sieht so aus, als würden externe Geräte besser zu meinen Bedürfnissen passen. Es gibt eine ausgezeichnete Diskussion über diese und andere benutzerdefinierte Methoden in Kapitel 15 von "Versionskontrolle mit Git" von Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), die ich dringend empfehle.


0

Der Kolben wird neu geschrieben, um dies und das Gegenteil zu unterstützen, sowie die vorhandene Subversion-URL in einem Subvresion-Repoistory und git + git.

Überprüfen Sie das Kolben-Github-Repository .

Leider scheint es nicht veröffentlicht worden zu sein.


3
Der Kolben versagt in deinem Gesicht, wenn du ihn am meisten brauchst;), deshalb empfehle ich das nicht. Außerdem gibt es keine Bugfixes mehr für den Kolben.
Henrik

0

Nun, das gibt es git-remote-testsvn, also denke ich so etwas

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

sollte arbeiten. Macht es?

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.