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


283

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

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


Bitte beachten Sie die Antwort des Teilbaums unten von @ ruslan-kabalin. Hinweis: Pre-Commit- (oder Overcommit- ) Hooks sind eine Möglichkeit, um mit dem von Robert Dundon
Hedgehog

Antworten:


347

Der Schlüssel sind Git-Submodule .

Lesen Sie das Kapitel Submodule im Git Community Book oder im Benutzerhandbuch

Angenommen, Sie haben das 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 auf dem anderen Repo ...

Das Coole daran 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"

Dies hat gerade die Tatsache aufgezeichnet, dass das MEDIA-Submodul WITHIN PROJECT2 jetzt die Version XYZ hat.

Sie haben 100% Kontrolle darüber, welche Version von MEDIA jedes Projekt verwendet. Git-Submodule sind großartig, aber Sie müssen experimentieren und etwas darüber lernen.

Mit großer Kraft geht die große Chance einher, in den Rumpf gebissen zu werden.


Dieser Workflow erinnert mich an die Verwendung eines privaten NPM-Moduls stackoverflow.com/questions/7575627/…
cyrf

Wenn Sie die Standardversion als neueste Version bevorzugen, können Sie ein Skript hinzufügen, um das MEDIA-Commit an alle abhängigen Projekte weiterzugeben.
Jiggunjer

3
Wie integriert sich das in Github?
Theonlygusti

26

Erwägen Sie die Verwendung von Teilbäumen anstelle von Submodulen. Dies erleichtert Ihren Repo-Benutzern das Leben erheblich. Eine ausführlichere Anleitung finden Sie im Pro Git-Buch .


6
Hier ist ein weiterer informativer Artikel über Teilbaum vs. Submodul: blogs.atlassian.com/2013/05/…
Benny Neugebauer

3
Gemäß diesem Artikel ist einer der Nachteile:> Die Verantwortung, Super- und Teilprojektcode nicht in Commits zu mischen, liegt bei Ihnen. Niemand hat Zeit dafür (IMO)
Robert Dundon

20

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

  1. Speichern Sie Ihre Mediendateien in einem einzigen Git-Repository, 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 (damit Sie nicht ständig festschreiben + drücken + ziehen möchten).

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.

Zunächst 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 vor 2 Wochen verwendet wurde, oder die neueste ist 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 Medienrepository verweist. Sie können entweder einen relativen symbolischen Link erstellen (z. B. ../media) und davon ausgehen, dass jeder das Projekt auscheckt, sodass sich das Medienverzeichnis an derselben 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 Medienrepositorys haben. Der große Nachteil ist, dass es viel schwieriger ist, zwischen Projektversionen zu wechseln (wenn Sie zu einer anderen 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 Media Repo-Version. Auf diese Weise verfügen Sie normalerweise über 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 für die Verwendung von Submodulen entscheiden, können Sie noch viele Dinge tun, um Ihnen das Leben zu erleichtern:

  1. Vor dem Festschreiben können Sie das Submodulverzeichnis umbenennen und einen Symlink zu einem allgemeinen Medienverzeichnis einfügen. Wenn Sie zum Festschreiben bereit sind, können Sie den Symlink entfernen und das Submodul wieder entfernen und dann festschreiben.

  2. Sie können allen Ihren Projekten eine Kopie des Medienrepositorys als Remote-Repository hinzufügen.

Sie können lokale Verzeichnisse wie folgt 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 abrufen, 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 entfernen (mit Zurücksetzen von Git), da Sie sie nicht für andere Benutzer freigegeben haben.


1
Für webbezogene Projekte, bei denen Sie innerhalb des Apache- wwwOrdners arbeiten, sollten Sie eine .htaccessDatei im Stammverzeichnis des wwwOrdners oder Ihres Projekts ablegen Options +FollowSymLinks, oder noch besser <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> (durch eine {new line}neue Zeile ersetzen` )

3

Ich hatte Probleme mit Teilbäumen und Submodulen, die die anderen Antworten vorschlagen ... hauptsächlich, weil ich SourceTree verwende und es ziemlich fehlerhaft erscheint.

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

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

Grundsätzlich müssen Sie jedoch nur die beiden Pfade in einer Eingabeaufforderung mit erhöhten Rechten verknüpfen. Stellen Sie sicher, dass Sie das Präfix / J Hardlink verwenden. Etwas in dieser Richtung: mklink / JC: \ projects \ MainProject \ plugins C: \ projects \ SomePlugin

Sie können auch relative Ordnerpfade verwenden und diese in eine Fledermaus legen, die von jeder Person ausgeführt wird, wenn sie Ihr Projekt zum ersten Mal auscheckt.

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 auf ihn verweist. Ansonsten können Sie loslegen.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.