199 Stimmen

Entspricht SVN:externals in Git?

Ich habe zwei SVN-Projekte in Verwendung von einem anderen SVN-Repository mit svn:externals .

Wie kann ich die gleiche Repository-Layout-Struktur in Git haben?

142voto

Paul Punkte 16115

Git hat zwei Ansätze, die svn:externals ähnlich, aber nicht genau gleich sind:

  • Zusammenführung von Teilbäumen Fügen Sie den Code des externen Projekts in ein separates Unterverzeichnis innerhalb Ihres Repos ein. Dies hat eine detailliertes Verfahren zur Einrichtung und dann ist es für andere Benutzer sehr einfach, da es automatisch einbezogen wird, wenn das Repository ausgecheckt oder geklont wird. Dies kann ein bequemer Weg sein, um eine Abhängigkeit in Ihr Projekt einzubinden.
    Es ist einfach, Änderungen aus dem anderen Projekt zu übernehmen, aber es ist kompliziert, Änderungen zurückzuschicken. Und wenn das andere Projekt Ihren Code zusammenführen muss, werden die Projektverläufe zusammengeführt und die beiden Projekte werden effektiv eins.

  • Git-Untermodule ( Handbuch ) auf einen bestimmten Commit im Repository eines anderen Projekts verweisen, ähnlich wie svn:externals mit einem -r Argument. Untermodule sind einfach einzurichten, aber alle Benutzer müssen die Untermodule verwalten, die nicht automatisch in Checkouts (oder Klonen) enthalten sind.
    Es ist zwar einfach, Änderungen an das andere Projekt zurückzusenden, aber das kann zu Problemen führen, wenn sich das Projektarchiv geändert hat. Daher ist es im Allgemeinen nicht sinnvoll, Änderungen an ein Projekt zurückzusenden, an dem gerade gearbeitet wird.

45voto

VonC Punkte 1117238

Wie ich in " Git-Submodul neue Version aktualisieren ", können Sie Folgendes erreichen die gleiche externe SVN-Funktion mit Git 1.8.2 Untermodulen:

git config -f .gitmodules submodule.<path>.branch <branch>

Dies reicht aus, damit ein Untermodul einem Zweig folgt (wie bei der LATEST-Übertragung eines entfernten Zweigs eines Untermoduls Upstream-Repositorium ). Alles, was Sie tun müssen, ist a:

git submodule update --remote

Dadurch wird das Submodul aktualisiert.

Weitere Einzelheiten finden Sie in " git submodule Verfolgung der neuesten ".

So wandeln Sie ein bestehendes Submodul in ein Submodul um, das einen Zweig verfolgt : siehe alle Schritte in " Git-Untermodule: Einen Zweig/Tag angeben ".

9voto

chronoxor Punkte 2531

Ich bin der Autor von gil (git links) Werkzeug

Ich habe eine alternative Lösung für dieses Problem - gil (git links) Werkzeug

Es ermöglicht die Beschreibung und Verwaltung komplexer Abhängigkeiten von Git-Repositories.

Außerdem bietet es eine Lösung für das Git rekursives Submodul-Abhängigkeitsproblem .

Nehmen wir an, Sie haben die folgenden Projektabhängigkeiten: Beispiel eines Git-Repository-Abhängigkeitsgraphen

Dann können Sie definieren .gitlinks Datei mit der Beschreibung der Repositories-Beziehung:

# 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 den Git-Link im folgenden Format:

  1. Eindeutiger Name des Repositorys
  2. Relativer Pfad des Repositorys (ausgehend vom Pfad der .gitlinks-Datei)
  3. Git-Repository, das für den Befehl git clone verwendet werden soll Repository-Zweig zum Auschecken
  4. Leerzeilen oder Zeilen, die mit # beginnen, werden nicht geparst (als Kommentar behandelt).

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 auf geeignete Weise miteinander.

Wenn Sie alle Änderungen in einem Repository mit allen Änderungen in den untergeordneten verknüpften Repositories verbinden wollen, können Sie dies mit einem einzigen Befehl tun:

gil commit -a -m "Some big update"

Pull- und Push-Befehle funktionieren auf ähnliche Weise:

gil pull
gil push

Das Werkzeug Gil (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

Mehr über Git rekursives Submodul-Abhängigkeitsproblem .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X