Informationen zum Zusammenführen von Git-Unterstrukturen

Wenn Du mehrere Projekte innerhalb eines einzigen Repositorys verwalten musst, kannst Du subtree merge (Unterstruktur zusammenführen) benutzen, um alle Referenzen zu verwalten.

About subtree merges

Typischerweise wird eine Unterstruktur zusammengeführt, um ein Repository innerhalb eines anderen Repositorys einzubinden. Das „Unterrepository“ wird in einem Ordner des Haupt-Repositorys gespeichert.

Das Zusammenführen von Unterstrukturen lässt sich am besten anhand eines Beispiels erläutern. Dabei sind folgende Schritte notwendig:

  • Ein leeres Repository namens test erstellen, das das Projekt repräsentiert
  • Ein anderes Repository als Unterstruktur namens Spoon-Knife hineinführen.
  • Das Projekt test wird dieses Unterprojekt so verwenden, als wäre es Teil desselben Repositorys.
  • Aktualisierungen von Spoon-Knife in das Projekt test abrufen

Leeres Repository für das Zusammenführen einer Unterstruktur einrichten

  1. Öffne TerminalTerminalGit Bash.
  2. Erstelle ein neues Verzeichnis und navigiere zu diesem.
    $ mkdir test
    $ cd test
  3. Initialisiere ein neues Git-Repository.
    $ git init
    > Initialized empty Git repository in /Users/octocat/tmp/test/.git/
  4. Erstelle eine neue Datei mit Commit.
    $ touch .gitignore
    $ git add .gitignore
    $ git commit -m "initial commit"
    > [main (root-commit) 3146c2a] initial commit
    >  0 files changed, 0 insertions(+), 0 deletions(-)
    >  create mode 100644 .gitignore

Ein neues Repository als Unterstruktur hinzufügen

  1. Füge eine neue Remote-URL hinzu, die auf das separate Projekt von Interesse verweist.

    $ git remote add -f spoon-knife git@github.com:octocat/Spoon-Knife.git
    > Updating spoon-knife
    > warning: no common commits
    > remote: Counting objects: 1732, done.
    > remote: Compressing objects: 100% (750/750), done.
    > remote: Total 1732 (delta 1086), reused 1558 (delta 967)
    > Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done.
    > Resolving deltas: 100% (1086/1086), done.
    > From git://github.com/octocat/Spoon-Knife
    >  * [new branch]      main     -> Spoon-Knife/main
  2. Führe das Projekt Spoon-Knife in das lokale Git-Projekt zusammen. Dadurch wird keine Deiner Dateien lokal geändert, aber Git wird auf den nächsten Schritt vorbereitet.

    Bei Verwendung von Git 2.9 oder höher:

    $ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main
    > Automatic merge went well; stopped before committing as requested

    Bei Verwendung von Git 2.8 oder älter:

    $ git merge -s ours --no-commit spoon-knife/main
    > Automatic merge went well; stopped before committing as requested
  3. Erstelle ein neues Verzeichnis mit dem Namen spoon-knife, und kopiere den Git-Verlauf des Projekts Spoon-Knife in dieses Verzeichnis.

    $ git read-tree --prefix=spoon-knife/ -u spoon-knife/main
  4. Erstelle einen Commit der Änderungen, um sie zu sichern.

    $ git commit -m "Subtree merged in spoon-knife"
    > [main fe0ca25] Subtree merged in spoon-knife

Wir haben hier nur ein Subprojekt hinzugefügt. Du kannst jedoch eine beliebige Anzahl an Subprojekten in ein Git-Repository integrieren.

Tipp: Wenn Du in Zukunft einen neuen Klon des Repositorys erstellst, werden die von Dir hinzugefügten Remotes nicht für Dich erstellt. Du musst sie erneut mit dem Befehl git remote add hinzufügen.

Mit Aktualisierungen und Änderungen synchronisieren

Wenn ein Subprojekt hinzugefügt wird, wird es nicht automatisch mit den vorgelagerten Änderungen synchronisiert. Du musst das Subprojekt mit dem folgenden Befehl aktualisieren:

$ git pull -s subtree remotename branchname

Im Beispiel oben würde dies so aussehen:

$ git pull -s subtree spoon-knife main

Weiterführende Informationen

Did this doc help you?Privacy policy

Help us make these docs great!

All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.

Make a contribution

Oder, learn how to contribute.