Wie verwende ich das Subversion Repository im Git Repository?

8

Ich entwickle ein Projekt in Git. Die IT hängt von einem anderen Projekt ab, das sich in einem Subversion-Repository befindet. Ich möchte in der Lage sein, Änderungen am Subversion-Projekt in der Baumstruktur vorzunehmen und das Subversion-Repository innerhalb des Git-Projekts zu bestätigen / zu aktualisieren. Ist das möglich?

Jona
quelle
In Anbetracht Ihrer Kommentare unten lautet Ihre Frage: "Kann ich eine SVN-Kasse in einem Git-Repo haben?" - und die einfache Antwort lautet: Ja. Die Antwort, die Sie akzeptiert haben, beantwortet diese Frage nicht.
AD7six

Antworten:

13

Ich kann nicht der einzige sein, der an das Mem mit verschachtelten Xzibit- Elementen denkt , oder? Wie auch immer...

Eines der verbleibenden coolen Dinge, die Subversion tut, heißt "externals". Auf diese Weise können Sie auf einen bestimmten Zweig oder ein bestimmtes Verzeichnis in einem anderen SVN-Repository verweisen. Sie können es sogar an eine bestimmte Version eines bestimmten Verzeichnisses anheften. Externe sind wirklich verdammt geschickt und würden dieses Problem sofort lösen, da Änderungen, die in einem externen Verzeichnis vorgenommen werden, beim Festschreiben automatisch an die Quelle zurückgeschoben werden.

Externes fehlt auch etwas in Git. Git hat Submodule , aber sie funktionieren nicht auf die gleiche Weise, da sie an ein bestimmtes Commit gebunden sind. Dies bedeutet effektiv, dass es keine native Lösung für das Problem gibt, "verschachtelte" Repositorys zu haben, die gleichzeitig gelesen und beschrieben werden können und perfekt synchron bleiben, nicht weniger verschachtelte Repositorys mit unterschiedlichen Backends.

Wenn Sie den Submodul-Revisions-Pinning-Tanz nicht ausführen möchten , gibt es eine weitere Problemumgehung.

Git hat eine anständige SVN-Emulation im git-svnTool. Sie verwenden es wahrscheinlich bereits. Die SO-Frage "Wie halte ich ein svn: external mit git-svn auf dem neuesten Stand?" bietet uns eine nützliche Option, indem wir dieses Tool missbrauchen.

Die akzeptierte Antwort bestand einfach git-svndarin, das Subversion-Repository außerhalb des von git kontrollierten Baums auszuchecken und einfach einen Symlink zu verwenden, um darauf innerhalb des Baums zu verweisen. In diesem Fall ist etwas mehr manuelle Arbeit erforderlich, da Sie daran denken müssen, dieses bestimmte Repository jedes Mal festzuschreiben, wenn Sie Änderungen daran vornehmen. Es ist jedoch einfach, unkompliziert und es ist bekannt, dass es funktioniert.

Eine weitere Option vollständig Blick auf Mercurial würde subrepositories , die sowohl git hosten kann und SVN. Ich bin mir nicht sicher, ob du wirklich drei Level tief gehen willst.

Charles
quelle
1
Überprüfen Sie für die Beantwortung der Frage, +1 für die yo dawg :)
Jonah
Okay. Die Lösung, für die ich mich entschieden habe, besteht darin, einfach checkoutin den Git-Baum zu wechseln und die SVN-Arbeitskopie vollständig aus dem Git-Repository auszuschließen .gitignore.
Jonah
Abgesehen von sarkastischen Zusammenfassungen der Bearbeitung ist der Ruf dazu da, gutes Verhalten zu fördern und die Website zu einem besseren Ort für alle zu machen. Kommentare sollen hervorheben, wo Verbesserungen vorgenommen werden können. Ich denke, mit Ihren Änderungen ist Ihre Frage viel nützlicher, daher die Umkehrung einer nicht nützlichen Auswahl zu einer nützlichen . Wenn ich nicht gedacht hätte, dass Ihre Antwort von meinen Kommentaren profitieren würde, hätte ich sie nicht gemacht. Wenn sie mich beleidigt hätten, hätte ich mich gemeldet. Ich denke, wir alle profitieren davon, dass gute Antworten besser werden. (Dieser Kommentar wird sich in ... selbst zerstören))
Mark Booth
Yo dawg, ich habe gehört, dass du svn magst, also habe ich svn in deinen Git gesetzt, damit du svn kannst, während du git ...
Dave Arkell
Das Problem ist, dass, wenn Ihr SVN-Repo selbst Externals enthält, Sie die Verwendung vergessen können, git-svnweil es sie nicht behandelt
Daniel Alder
3

Obwohl durch entmutigt Charles , glaube ich , dass Sie wirklich sind für git suchen Submodule :

Die Submodul-Unterstützung von Git ermöglicht es einem Repository, als Unterverzeichnis das Auschecken eines externen Projekts zu enthalten. Submodule behalten ihre eigene Identität; Die Submodul-Unterstützung speichert nur den Speicherort des Submoduls und die Festschreibungs-ID, sodass andere Entwickler, die das enthaltene Projekt klonen ("Superprojekt"), problemlos alle Submodule mit derselben Revision klonen können. Teilweise Auscheckvorgänge des Superprojekts sind möglich: Sie können Git anweisen, keine, einige oder alle Submodule zu klonen.

Während Charles zu denken scheint, dass git Submodule mangelhaft sind, weil sie nicht wie svn externe Funktionen funktionieren können (die sich eher auf den Leiter eines Zweigs als auf eine bestimmte Revision beziehen), denke ich, dass dies ebenso auf den Unterschied im erwarteten Workflow zwischen gitund svnauf irgendetwas anderem zurückzuführen ist.

Je nachdem, wann und wo Sie Ihre Arbeitskopie aktualisiert haben, befinden sich Verzeichnisse an verschiedenen Stellen in Ihrer svnArbeitsverzeichnishierarchie möglicherweise in unterschiedlichen Revisionen. Das ist mit nicht möglich git. In gitjedem zu einer Revision aktualisieren, aktualisieren Sie die gesamte Arbeitskopie zu dieser Revision - Sie erwarten , dass , wenn Sie auf Revision 123abc gehen , dass Sie den exakt gleichen Code wie das letzte Mal ausgecheckt Sie 123abc bekommen, und das schließt jede und alle Submodule , die diese Revision haben könnte.

Wenn Sie ein Submodul aktualisieren möchten , müssen Sie es aktualisieren und dann ein neues Commit für das Supermodul vornehmen, um es zu aktualisieren und die neue Revision im Submodul zu verwenden . Dies bedeutet, dass Submodule weniger flexibel sind als externe Module, erzwingt jedoch das primäre gitParadigma eines repositoryweiten Snapshots.

Wenn Sie möchten, dass svn Externe immer die neuesten Revisionsfunktionen verwenden, sind Sie ziemlich allein. Wie bereits erwähnt, müssen Sie das svn Submodul nur manuell und dann .gitignoreauschecken.

  • In Anbetracht der Funktionsweise svnist die Funktionsweise von externen Geräten durchaus akzeptabel.
  • In Anbetracht der Funktionsweise gitist die Funktionsweise von Submodulen durchaus akzeptabel.

Soweit ich weiß, funktionieren Mercurial- Subrepositorys übrigens genauso wie Git- Submodule , sodass dies auch nicht hilft.

Mark Booth
quelle
2

Suchen Sie nur git-svn? Mit abhängig meinst du, dass die übergeordnete Version in svn ist oder Anbieter hat, die svn-Projekte sind?

Angenommen, hängt davon ab, dass Sie Abhängigkeit meinen:

Sie können jede Art von Repo problemlos in ein Git-Repository stellen. z.B

$ mkdir ~/project
$ cd ~/project
$ git init
$ ...
$ git commit -va
[master (root-commit) xxxxxxx] Did something
 ...
$ mkdir vendors
$ cd vendors
$ svn checkout svnproject(url)
$ cd svnproject
$ ...
$ svn ci -m "committing to svnproject"

usw.

Und dann schaffen svnprojectSie es wie gewohnt. Sie können git-svnstattdessen natürlich stattdessen mit git-Befehlen mit Ihrem svn-Repo interagieren.

Sie können dies dann auch tun:

$ cd ~/projects
$ git add vendors/svnproject
$ git commit -m "adding svnproject source to main repo"

In diesem Fall werden Aktualisierungen, die Sie an Dateien vornehmen, svnprojectsowohl als SVN- als auch als Git-Unterschiede angezeigt. Ein Beispiel, bei dem /tmp/gitprojectes sich um ein .. git-Projekt handelt und /tmp/gitproject/vendor/minifyes sich um eine (zufällige) SVN-Prüfung handelt:

[andy@laptop:/tmp/gitproject/vendor/minify]$ vim README.txt 
[andy@laptop:/tmp/gitproject/vendor/minify]$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working     directory)
#
#   modified:   README.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[andy@laptop:/tmp/so/vendor/minify]$ svn status
M       README.txt
[andy@laptop:/tmp/so/vendor/minify]$

Wenn Sie git-svnmit Ihrem svn-abhängigen Repository interagieren, können Sie es mit den Änderungen synchronisieren, die Sie im übergeordneten Git-Projekt vorgenommen haben, git-filter-branchund müssen daher nicht jedes Repository einzeln festlegen.

Nebenbei bemerkt: Erfahrungsgemäß ist es im Allgemeinen recht problematisch, ein Git- und SVN-Projekt synchron zu halten, es sei denn, das eine oder andere ist schreibgeschützt.

AD7six
quelle
Ich denke, ich möchte nicht, dass Git die SVN-Arbeitskopie nachverfolgt, da dies überflüssig wäre.
Jonah
Dies wird nicht der Fall sein, es sei denn, Sie fügen sie ausdrücklich dem Git Repo Jonah hinzu
AD7six
1

Git hat einen SVN-Wrapper. Hier ist ein kurzer Überblick: Git mit Subversion effektiv nutzen

Wie viele Organisationen, die Rails verwenden, haben wir die Git-Welle erfasst und befinden uns im Übergang zwischen Git und Subversion. Unsere Open-Source-Arbeit wird in Git-Repositorys gespeichert, aber unsere Client-Arbeit wird weiterhin in Subversion-Repositorys gespeichert und wird wahrscheinlich einige Zeit dauern. Obwohl Git erstaunlich ist, hat Subversion immer noch seine guten Eigenschaften und ist ein ausgezeichnetes zentrales Repository, insbesondere mit seinem Ökosystem benutzerfreundlicher Tools.

Die Integration zwischen git und Subversion (git-svn) ist so gut gelungen, dass einige von uns git als Schnittstelle zu allen Subversion-Repositorys verwendet haben. Dies zu tun ist ziemlich einfach, aber es gibt einige interessante Tricks, und so dachte ich, ich würde einen Tag im Viget-Leben mit git-svn teilen ...

Craige
quelle
1
Ich habe diesen Link schon einmal gefunden, aber es scheint sich um die Verwendung von Git zum Verwalten einer Subversion-Arbeitskopie zu handeln. Ich möchte die Subversion-Arbeitskopie in ein Git-Repository einfügen.
Jonah
Würde es Ihnen etwas ausmachen, mehr darüber zu erklären, was es tut und wofür es gut ist? "Nur-Link-Antworten" sind bei Stack Exchange nicht ganz willkommen
Mücke