it-swarm.com.de

SVN: Äußerliches Äquivalent in Git?

Ich verwende zwei SVN-Projekte aus einem anderen SVN-Repository mit svn: externals

Wie kann ich in Git dieselbe Repository-Layoutstruktur haben?

166
dsimard

Git hat zwei Ansätze ähnlich zu svn: externals:

  • Subtree merges fügt den Code des externen Projekts in ein separates Unterverzeichnis innerhalb Ihres Repos ein. Dies hat einen detaillierten Prozess zum Einrichten und ist dann für andere Benutzer sehr einfach, da er automatisch einbezogen wird, wenn das Repository ausgecheckt oder geklont wird. Dies kann eine bequeme Methode sein, um eine Abhängigkeit in Ihr Projekt aufzunehmen.
    Es ist leicht, Änderungen aus dem anderen Projekt zu übernehmen, aber es ist kompliziert, Änderungen zurückzuschicken. Wenn das andere Projekt aus Ihrem Code zusammengeführt werden muss, werden die Projektverläufe zusammengeführt und die beiden Projekte werden tatsächlich eins.

  • Git-Submodule ( manual ) Verknüpfung zu einem 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 Checkouts (oder Klone) 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 generell nicht angebracht, Änderungen an einem Projekt zurückzureichen, das sich in der aktiven Entwicklung befindet. 

127
Paul

Wie ich in " Git submodule neues Versionsupdate " erwähne, können Sie das gleiche externe SVN-Feature mit Git 1.8.2-Submodulen erreichen:

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

Dies ist ausreichend, damit ein Submodul einem Zweig folgen kann (wie beim LATEST-Commit eines Remote-Zweigs eines Submoduls Upstream-Repo ). Alles was Sie tun müssen, ist ein:

git submodule update --remote

Dadurch wird das Submodul aktualisiert.

Weitere Details finden Sie in " git submodule tracking latest ".

Um ein vorhandenes Submodul in ein einziges zu konvertieren, das einen Zweig: Verfolgt, sehen Sie alle Schritte in " Git Submodules: Geben Sie einen Zweig/Tag " an.

33
VonC

Ich habe eine alternative lösung für das problem - gil (git links) tool

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

Außerdem bietet es eine Lösung für das Abhängigkeitsproblem der rekursiven Submodule git .

Stellen Sie sich vor, Sie haben die folgenden Projektabhängigkeiten: Beispielgit-Repository-Abhängigkeitsdiagramm

Dann können Sie eine .gitlinks-Datei mit der Beschreibung der Repositories 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:

  1. Eindeutiger Name des Repositorys
  2. Relativer Pfad des Repositorys (ausgehend vom Pfad der .gitlinks-Datei)
  3. Git-Repository, das im Befehl git clone verwendet wird Repository-Zweig zur Kasse
  4. Leerzeilen oder Zeilen, die mit # beginnen, werden nicht analysiert (als Kommentar behandelt).

Zum Schluss 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 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

Gil (git links) unterstützt folgende 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 der rekursiven Submodule git .

0
chronoxor