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?
8
Antworten:
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-svn
Tool. 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-svn
darin, 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.
quelle
checkout
in den Git-Baum zu wechseln und die SVN-Arbeitskopie vollständig aus dem Git-Repository auszuschließen.gitignore
.git-svn
weil es sie nicht behandeltObwohl durch entmutigt Charles , glaube ich , dass Sie wirklich sind für git suchen Submodule :
Während Charles zu denken scheint, dass
git
Submodule mangelhaft sind, weil sie nicht wiesvn
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 zwischengit
undsvn
auf irgendetwas anderem zurückzuführen ist.Je nachdem, wann und wo Sie Ihre Arbeitskopie aktualisiert haben, befinden sich Verzeichnisse an verschiedenen Stellen in Ihrer
svn
Arbeitsverzeichnishierarchie möglicherweise in unterschiedlichen Revisionen. Das ist mit nicht möglichgit
. Ingit
jedem 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
git
Paradigma 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 dassvn
Submodul nur manuell und dann.gitignore
auschecken.svn
ist die Funktionsweise von externen Geräten durchaus akzeptabel.git
ist die Funktionsweise von Submodulen durchaus akzeptabel.Soweit ich weiß, funktionieren Mercurial- Subrepositorys übrigens genauso wie Git- Submodule , sodass dies auch nicht hilft.
quelle
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
usw.
Und dann schaffen
svnproject
Sie es wie gewohnt. Sie könnengit-svn
stattdessen natürlich stattdessen mit git-Befehlen mit Ihrem svn-Repo interagieren.Sie können dies dann auch tun:
In diesem Fall werden Aktualisierungen, die Sie an Dateien vornehmen,
svnproject
sowohl als SVN- als auch als Git-Unterschiede angezeigt. Ein Beispiel, bei dem/tmp/gitproject
es sich um ein .. git-Projekt handelt und/tmp/gitproject/vendor/minify
es sich um eine (zufällige) SVN-Prüfung handelt:Wenn Sie
git-svn
mit Ihrem svn-abhängigen Repository interagieren, können Sie es mit den Änderungen synchronisieren, die Sie im übergeordneten Git-Projekt vorgenommen haben,git-filter-branch
und 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.
quelle
Git hat einen SVN-Wrapper. Hier ist ein kurzer Überblick: Git mit Subversion effektiv nutzen
quelle