Informationen zum Mergen von Unterstrukturen
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:
- Erstellen eines leeren Repositorys namens
test
, das unser Projekt repräsentiert. - Hineinmergen eines anderen Repositorys als Unterstruktur namens
Spoon-Knife
. - Das Projekt
test
wird dieses Unterprojekt so verwenden, als sei es ein Teil desselben Repositorys. - Abrufen von Updates aus
Spoon-Knife
in unsertest
-Projekt.
Leeres Repository für das Zusammenführen einer Unterstruktur einrichten
-
Öffne TerminalTerminalGit Bash.
-
Erstelle ein neues Verzeichnis und navigiere zu diesem.
mkdir test cd test
-
Initialisieren Sie ein neues Git-Repository.
$ git init > Initialized empty Git repository in /Users/octocat/tmp/test/.git/
-
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
-
Füge eine neue Remote-URL hinzu, die auf das separate Projekt von Interesse verweist.
$ git remote add -f spoon-knife https://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 https://github.com/octocat/Spoon-Knife > * [new branch] main -> Spoon-Knife/main
-
Merge das
Spoon-Knife
-Projekt in das lokale Git-Projekt. 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
-
Erstelle ein neues Verzeichnis namens spoon-knife, und kopiere den Git-Verlauf des
Spoon-Knife
-Projekts in dieses Verzeichnis.$ git read-tree --prefix=spoon-knife/ -u spoon-knife/main > fatal: refusing to merge unrelated histories
-
Erstelle einen Commit der Änderungen, um sie zu sichern.
$ git commit -m "Subtree merged in spoon-knife" > [main fe0ca25] Subtree merged in spoon-knife
Hier wurde nur ein Unterprojekt hinzugefügt. Du kannst jedoch eine beliebige Anzahl an Unterprojekten 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 mithilfe des git remote add
-Befehls 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 REMOTE-NAME BRANCH-NAME
Im Beispiel oben würde dies so aussehen:
git pull -s subtree spoon-knife main
Weiterführende Themen
- Das Kapitel „Advanced Merging“ (Erweitertes Mergen) aus dem Pro Git-Buch
- How to use the subtree merge strategy (Verwenden der Unterstrukturmerge-Strategie)