Wie arbeite ich mit einem Git-Repository in einem anderen Repository?

Ich habe ein Git-Medien-Repository, in dem ich alle meine JavaScript- und CSS-Master-Dateien und Skripte aufbewahre, die ich für verschiedene Projekte verwenden werde.

Wenn ich ein neues Projekt in einem eigenen Git-Repository erstelle, verwende ich JavaScript-Dateien aus meinem Medienrepository in meinem neuen Projekt so, dass ich nicht beide Kopien des Skripts aktualisieren muss, wenn ich Änderungen vornehme ?

Der Schlüssel ist Git Submodule .

Beginnen Sie mit dem Lesen des Submodules-Kapitels des Git Community Book oder des Bedienungshandbuchs

Angenommen, Sie haben Repository PROJECT1, PROJECT2 und MEDIA …

cd /path/to/PROJECT1 git submodule add ssh://path.to.repo/MEDIA git commit -m "Added Media submodule" 

Wiederholen Sie den Vorgang auf der anderen …

Das Tolle ist, dass Sie jedes Mal, wenn Sie Änderungen an MEDIA vornehmen, Folgendes tun können:

 cd /path/to/PROJECT2/MEDIA git pull cd .. git add MEDIA git commit -m "Upgraded media to version XYZ" 

Damit wurde gerade festgestellt, dass das MEDIA-Submodul WITHIN PROJECT2 jetzt in der Version XYZ ist.

Es gibt Ihnen 100% Kontrolle darüber, welche Version von MEDIA jedes Projekt verwendet. git Submodule sind großartig, aber Sie müssen experimentieren und etwas über sie lernen.

Mit großer Kraft kommt die große Chance, im Hinterteil gebissen zu werden.

Erwägen Sie Teilbaum statt Submodule, es wird Ihren Repo-Benutzern das Leben viel leichter machen. Sie können detailliertere Anleitung in Pro Git Buch finden .

Wenn ich Ihr Problem gut verstehe, möchten Sie Folgendes:

  1. Lassen Sie Ihre Mediendateien in einem einzigen Git-Repository speichern, das von vielen Projekten verwendet wird
  2. Wenn Sie eine Mediendatei in einem der Projekte auf Ihrem lokalen Computer ändern, sollte sie sofort in jedem anderen Projekt angezeigt werden (Sie möchten also nicht die gesamte Zeit commit + push + pull)

Leider gibt es keine ultimative Lösung für das, was Sie wollen, aber es gibt einige Dinge, mit denen Sie Ihr Leben leichter machen können.

Zuerst sollten Sie eine wichtige Sache entscheiden: Möchten Sie für jede Version in Ihrem Projekt-Repository einen Verweis auf die Version der Mediendateien speichern? Wenn Sie beispielsweise ein Projekt namens “example.com” haben, müssen Sie wissen, welche style.css-Datei vor zwei Wochen verwendet wurde, oder ist die neueste Version immer (oder meistens) die beste?

Wenn Sie das nicht wissen müssen, ist die Lösung einfach:

  1. Erstellen Sie ein Repository für die Mediendateien und eines für jedes Projekt
  2. Erstellen Sie in Ihren Projekten einen symbolischen Link, der auf das lokal geklonte Medien-Repository verweist. Sie können entweder einen relativen symbolischen Link erstellen (zB ../media) und davon ausgehen, dass jeder das Projekt auscheckt, so dass sich das Medienverzeichnis an der gleichen Stelle befindet, oder den Namen des symbolischen Links in .gitignore schreiben und jeder kann entscheiden wo er / sie die Mediendateien ablegt.

In den meisten Fällen möchten Sie jedoch diese Versionsinformationen kennen. In diesem Fall haben Sie zwei Möglichkeiten:

  1. Speichern Sie jedes Projekt in einem großen Repository. Der Vorteil dieser Lösung besteht darin, dass Sie nur eine Kopie des Medienarchivs haben. Der große Nachteil ist, dass es viel schwieriger ist, zwischen den Projektversionen zu wechseln (wenn Sie eine andere Version auschecken, werden Sie immer ALLE Projekte ändern)

  2. Verwenden Sie Submodule (wie in Antwort 1 erläutert). Auf diese Weise speichern Sie die Mediendateien in einem Repository, und die Projekte enthalten nur einen Verweis auf eine bestimmte Medienrepo-Version. Auf diese Weise haben Sie normalerweise viele lokale Kopien des Medienrepositorys, und Sie können eine Mediendatei nicht einfach in allen Projekten ändern.

Wenn ich Sie wäre, würde ich wahrscheinlich die erste oder dritte Lösung wählen (symbolische Links oder Submodule). Wenn Sie sich dafür entscheiden, Submodule zu verwenden, können Sie noch eine Menge Dinge tun, um Ihr Leben einfacher zu machen:

  1. Vor der Übergabe können Sie das Submodulverzeichnis umbenennen und einen Symlink in ein gemeinsames Medienverzeichnis einfügen. Wenn Sie zum Festschreiben bereit sind, können Sie den Symlink entfernen und das Submodul wieder entfernen und anschließend festschreiben.

  2. Sie können eine Ihrer Kopien des Medienrepositorys als Remote-Repository für alle Ihre Projekte hinzufügen.

Sie können auf diese Weise lokale Verzeichnisse als Remote hinzufügen:

 cd /my/project2/media git remote add project1 /my/project1/media 

Wenn Sie eine Datei in / my / project1 / media ändern, können Sie sie festschreiben und aus / my / project2 / media ziehen, ohne sie auf einen Remote-Server zu übertragen:

 cd /my/project1/media git commit -a -m "message" cd /my/project2/media git pull project1 master 

Sie können diese Commits später (mit git reset) entfernen, da Sie sie nicht mit anderen Benutzern geteilt haben.

Ich hatte Probleme mit Teilbäumen und Submodulen, die die anderen Antworten nahelegen … hauptsächlich, weil ich SourceTree benutze und es scheint ziemlich errorshaft zu sein.

Stattdessen habe ich SymLinks verwendet und das scheint gut zu funktionieren, also poste ich es hier als mögliche Alternative.

Es gibt eine vollständige Anleitung hier: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Aber im Grunde müssen Sie nur die beiden Pfade in einer erhöhten Eingabeaufforderung mklink. Stellen Sie sicher, dass Sie das / J Hardlink-Präfix verwenden. Etwas in dieser Richtung: mklink / JC: \ projects \ MainProject \ plugins C: \ projects \ SomePlugin

Sie können auch relative Ordnerpfade verwenden und sie in eine Fledermaus einfügen, die von jeder Person beim ersten Auschecken Ihres Projekts ausgeführt wird.

Beispiel: mklink / J. \ Assets \ TaqtileTools .. \ TaqtileHoloTools

Sobald der Ordner verknüpft wurde, müssen Sie möglicherweise den Ordner in Ihrem Haupt-Repository ignorieren, der darauf verweist. Sonst bist du gut zu gehen.

Hinweis: Ich habe meine doppelte Antwort aus einem anderen Beitrag gelöscht, da dieser Beitrag als doppelte Frage zu diesem Beitrag markiert wurde.