Ich habe zwei SVN-Projekte aus einem anderen SVN-Repository mit svn: externals .
Wie kann ich in Git dieselbe Repository-Layoutstruktur haben?
git submodule
Kann jetzt emulieren svn:external
(seit März 2013).
Ich habe zwei SVN-Projekte aus einem anderen SVN-Repository mit svn: externals .
Wie kann ich in Git dieselbe Repository-Layoutstruktur haben?
git submodule
Kann jetzt emulieren svn:external
(seit März 2013).
Antworten:
Git hat zwei Ansätze, die svn ähneln, aber nicht genau gleichwertig sind: externals:
Beim Zusammenführen von Teilbäumen wird der Code des externen Projekts in ein separates Unterverzeichnis in Ihrem Repo eingefügt. Dies muss detailliert eingerichtet werden und ist dann für andere Benutzer sehr einfach, da es automatisch eingeschlossen wird, wenn das Repository ausgecheckt oder geklont wird. Dies kann eine bequeme Möglichkeit sein, eine Abhängigkeit in Ihr Projekt aufzunehmen.
Es ist einfach, Änderungen aus dem anderen Projekt abzurufen, aber es ist kompliziert, Änderungen zurückzusenden. Und wenn das andere Projekt aus Ihrem Code zusammengeführt werden muss, werden die Projektverläufe zusammengeführt und die beiden Projekte werden effektiv zu einem.
Git-Submodule ( manuell ) verknüpfen einen bestimmten Commit im Repository eines anderen Projekts, ähnlich wie svn: externals mit einem-r
Argument. Submodule sind einfach einzurichten, aber alle Benutzer müssen die Submodule verwalten, die nicht automatisch in Kassen (oder Klonen) enthalten sind.
Obwohl es einfach ist, Änderungen an das andere Projekt zurückzusenden, kann dies zu Problemen führen, wenn sich das Repo geändert hat. Daher ist es im Allgemeinen nicht angebracht, Änderungen an ein Projekt zurückzusenden, das sich in der aktiven Entwicklung befindet.
svn:externals
. Mit Version 1.5 wurde die Syntax in ein flexibleres Format geändert. Was hinzugefügt wurde, war die relative URL-Adressierung.
Wie ich in " Update der neuen Version des Git-Submoduls " erwähne , können Sie mit den Git 1.8.2-Submodulen dieselbe externe SVN-Funktion erreichen:
git config -f .gitmodules submodule.<path>.branch <branch>
Dies reicht aus, damit ein Submodul einem Zweig folgt (wie beim LATEST-Commit eines Remote-Zweigs eines Submodul- Upstream-Repos ). Alles was Sie tun müssen ist:
git submodule update --remote
Dadurch wird das Submodul aktualisiert.
Weitere Details finden Sie unter " git submodule
Neueste Verfolgung ".
So konvertieren Sie ein vorhandenes Submodul in ein Submodul, das einen Zweig verfolgt : Alle Schritte finden Sie unter " Git-Submodule: Geben Sie einen Zweig / ein Tag an ".
svn:externals
?
--depth
aber es geht das Problem nicht wirklich an.
Ich bin der Autor des Gil-Tools (Git-Links)
Ich habe eine alternative Lösung für das Problem - Gil (Git Links) Tool
Es ermöglicht die Beschreibung und Verwaltung komplexer Abhängigkeiten von Git-Repositorys.
Außerdem bietet es eine Lösung für das Abhängigkeitsproblem der rekursiven Git-Submodule .
Angenommen, Sie haben die folgenden Projektabhängigkeiten: Beispiel eines Git-Repository-Abhängigkeitsdiagramms
Anschließend können Sie eine .gitlinks
Datei mit einer Beschreibung der Repositorys definieren:
# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master
# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master
# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master
Jede Zeile beschreibt Git Link im folgenden Format:
Schließlich müssen Sie Ihr Root-Beispiel-Repository aktualisieren:
# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link
# The same result with a single command
gil update
Als Ergebnis klonen Sie alle erforderlichen Projekte und verknüpfen sie ordnungsgemäß miteinander.
Wenn Sie alle Änderungen in einem Repository mit allen Änderungen in untergeordneten verknüpften Repositorys festschreiben möchten, können Sie dies mit einem einzigen Befehl tun:
gil commit -a -m "Some big update"
Pull, Push-Befehle funktionieren auf ähnliche Weise:
gil pull
gil push
Das Gil-Tool (Git-Links) unterstützt die folgenden Befehle:
usage: gil command arguments
Supported commands:
help - show this help
context - command will show the current git link context of the current directory
clone - clone all repositories that are missed in the current context
link - link all repositories that are missed in the current context
update - clone and link in a single operation
pull - pull all repositories in the current directory
push - push all repositories in the current directory
commit - commit all repositories in the current directory
Weitere Informationen zum Abhängigkeitsproblem von rekursiven Git-Submodulen .
gil
.