Comment puis-je avoir des dépendances liées dans un dépôt git?

149

Dans mes scripts, j'utilise souvent des bibliothèques (les miennes ou d'autres) qui ont leurs propres dépôts. Je ne veux pas les dupliquer dans mon repo et rester obligé de les mettre à jour chaque fois qu'une nouvelle version sort. Cependant, lorsque quelqu'un clone le dépôt, il doit toujours fonctionner localement et ne pas avoir de liens rompus.

Des idées sur ce que je pourrais faire?

Léa Verou
la source

Réponses:

212

Vous pouvez le faire avec des sous-modules dans git. Dans votre référentiel, faites:

git submodule add path_to_repo path_where_you_want_it

Donc, si le référentiel de la bibliothèque avait une URL de git://github.com/example/some_lib.gitet que vous le vouliez lib/some_libdans votre projet, vous saisiriez:

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

Notez que cela doit être fait à partir du répertoire de niveau supérieur de votre référentiel. Donc, n'allez pas cddans le répertoire où vous le mettez en premier.

Après avoir ajouté un sous-module, ou chaque fois que quelqu'un effectue une nouvelle extraction de votre référentiel, vous devrez faire:

git submodule init
git submodule update

Et puis tous les sous-modules que vous avez ajoutés seront extraits avec la même révision que vous avez.

Lorsque vous souhaitez mettre à jour vers une version plus récente de l'une des bibliothèques, cddans le sous-module et tirez:

cd lib/some_lib
git pull

Ensuite, lorsque vous effectuez un, git statusvous devriez voir la lib/somelibliste dans la section modifiée. Ajoutez ce fichier, validez et vous êtes à jour. Lorsqu'un collaborateur extrait ce commit dans son référentiel, il le verra lib/somelibcomme modifié jusqu'à ce qu'il s'exécute à git submodule updatenouveau.

Emilie
la source
2
Merci pour votre réponse, voté! (et l'acceptera probablement demain) Existe-t-il un moyen d'ajouter un seul fichier de l'autre dépôt en tant que dépendance? Ou faut-il que ce soit un dossier entier?
Lea Verou
2
Si vous souhaitez le suivre en tant que sous-module (et ainsi pouvoir extraire facilement des mises à jour), vous devrez extraire tout le référentiel. Contrairement à beaucoup d'autres VCS, git ne veut vraiment s'occuper que du référentiel de niveau supérieur.
Emily
7
Lisez ceci pour savoir à quoi sert un sous-module et les moyens de contourner les problèmes potentiels. et une discussion à ce sujet .
minghua
1
disons que vous importez en tant que sous-module un autre dépôt que vous possédez. Pouvez-vous apporter des modifications au dépôt d'origine via vos modifications locales dans le sous-module? Disons que vous avez trouvé un bogue et devez mettre à jour l'original?
andrevenancio
3
Je sais que c'est une vieille réponse, mais les sous-modules git peuvent être mis à jour en utilisant git submodule update --remoteJe recommande d'utiliser plus d'indicateurs pour des projets plus complexes. J'utilisegit submodule update --remote --recursive --init
Chris