Wie kann ich Abhängigkeiten in einem Git-Repo verknüpfen?

148

In meinen Skripten verwende ich häufig Bibliotheken (meine oder die anderer), die ihre eigenen Repos haben. Ich möchte diese nicht in meinem Repo duplizieren und sie jedes Mal aktualisieren, wenn eine neue Version herauskommt. Wenn jedoch jemand das Repo klont, sollte es weiterhin lokal funktionieren und keine defekten Links haben.

Irgendwelche Ideen, was ich tun könnte?

Lea Verou
quelle

Antworten:

211

Sie können dies mit Submodulen in Git tun. Führen Sie in Ihrem Repository Folgendes aus:

git submodule add path_to_repo path_where_you_want_it

Wenn das Repository der Bibliothek eine URL von hätte git://github.com/example/some_lib.gitund Sie diese lib/some_libin Ihrem Projekt haben möchten, geben Sie Folgendes ein:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Beachten Sie, dass dies über das Verzeichnis der obersten Ebene in Ihrem Repository erfolgen muss. Gehen Sie also nicht cdin das Verzeichnis, in dem Sie es zuerst ablegen.

Nachdem Sie ein Submodul hinzugefügt haben oder wenn jemand Ihr Repository erneut auscheckt, müssen Sie Folgendes tun:

git submodule init
git submodule update

Und dann werden alle von Ihnen hinzugefügten Submodule mit derselben Revision ausgecheckt, die Sie haben.

Wenn Sie auf eine neuere Version einer der Bibliotheken aktualisieren möchten, wechseln Sie cdin das Submodul und ziehen Sie:

cd lib/some_lib
git pull

Wenn Sie dann eine git statusausführen, sollte dies lib/somelibim geänderten Abschnitt aufgeführt sein. Fügen Sie diese Datei hinzu, schreiben Sie sie fest und Sie sind auf dem neuesten Stand. Wenn ein Mitarbeiter dieses Commit in sein Repository zieht, wird es lib/somelibals geändert angesehen, bis es git submodule updateerneut ausgeführt wird.

Emily
quelle
2
Vielen Dank für Ihre Antwort, positiv bewertet! (und wird es wahrscheinlich morgen akzeptieren) Gibt es eine Möglichkeit, nur eine Datei aus dem anderen Repo als Abhängigkeit hinzuzufügen? Oder muss es ein ganzer Ordner sein?
Lea Verou
2
Wenn Sie es als Submodul verfolgen möchten (und somit problemlos Updates abrufen können), müssen Sie das gesamte Repository abrufen. Im Gegensatz zu vielen anderen VCSs möchte git sich eigentlich nur mit dem Repository der obersten Ebene befassen.
Emily
7
Lesen Sie dies, um zu erfahren, wozu ein Submodul gut ist und wie Sie potenzielle Probleme umgehen können. und eine Diskussion darüber .
Minghua
1
Angenommen, Sie importieren ein anderes Repo, das Sie besitzen, als Submodul. Können Sie durch Ihre lokalen Änderungen im Submodul Änderungen am ursprünglichen Repo vornehmen? Nehmen wir an, Sie haben einen Fehler gefunden und müssen das Original aktualisieren?
andrevenancio
3
Ich weiß, dass dies eine alte Antwort ist, aber Git-Submodule können mit aktualisiert werden. git submodule update --remoteIch empfehle jedoch, für komplexere Projekte mehr Flags zu verwenden. Ich benutzegit submodule update --remote --recursive --init
Chris