Dépôts Git imbriqués?


188

Puis-je imbriquer des dépôts Git? J'ai:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Est - il logique de git init/addla /project_rootpour faciliter la gestion de tout ou localement dois - je gérer my_projectet le 3e parti séparément?

Réponses:


163

Vous recherchez peut-être la fonctionnalité Git appelée sous-modules . Cette fonctionnalité vous aide à gérer les référentiels dépendants qui sont imbriqués dans votre référentiel principal.


4
Le blog chrisjean.com ne semble pas être à jour simplement parce qu'il a essayé de le suivre. Le post wiki de Greg est peut-être un peu plus compliqué, mais en tant que débutant, je préfère précis au simple ...
sage

Le blog semble bien fonctionner maintenant, et malheureusement pour sage, les 34 (maintenant 35) votes positifs sur le commentaire semblent convenir qu'il y a une valeur dans l'article de blog. Il s'avère que vous n'avez pas à sacrifier la précision au profit de la clarté et des conseils spécifiques à l'opération. Après l'avoir lu, j'imagine que l'auteur a déjà fait quelques recherches et probablement lu la documentation réelle de Git , pas seulement la page wiki de kernel.org. L'explication orientée Git de l'auteur du blog dans un exemple entièrement contextualisé semble être très utile pour un grand nombre d'individus ...
Matthew Weber

18
BTW ce lien chrisjean mentionné ci-dessus est mort. Le lien mis à jour est chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh

35

Placez vos bibliothèques tierces dans un référentiel séparé et utilisez des sous-modules pour les associer au projet principal. Voici un aperçu:

http://git-scm.com/book/en/Git-Tools-Submodules

En décidant comment segmenter un repo, je déciderais généralement en fonction de la fréquence à laquelle je les modifierais. S'il s'agit d'une bibliothèque tierce et que seules les modifications que vous y apportez sont une mise à niveau vers une version plus récente, vous devez absolument la séparer du projet principal.


25

Juste pour être complet:

Il existe une autre solution que je recommanderais: la fusion des sous-arbres .

Contrairement aux sous-modules, il est plus facile à maintenir. Vous créeriez chaque référentiel de la manière habituelle. Lorsque vous êtes dans votre référentiel principal, vous souhaitez fusionner le maître (ou toute autre branche) d'un autre référentiel dans un répertoire de votre répertoire principal.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Ensuite, afin d'extraire l'autre référentiel dans votre répertoire (pour le mettre à jour), utilisez la stratégie de fusion de sous-arborescence:

$ git pull -s subtree OtherRepository master

J'utilise cette méthode depuis des années maintenant, ça marche :-)

Vous trouverez plus d'informations sur cette façon, y compris la comparaison avec les sous-modules, dans ce document git howto .


La référence de fusion de sous-arborescence dans le livre git ne fonctionne plus. Actuellement, cela semble être le lien: git-scm.com/book/en/v2/…
ericx

20

Vous pourriez ajouter

/project_root/third_party_git_repository_used_by_my_project

à

/project_root/.gitignore

cela devrait empêcher le dépôt imbriqué d'être inclus dans le dépôt parent, et vous pouvez travailler avec eux indépendamment.

Mais: Si un utilisateur exécute git clean -dfx dans le référentiel parent, il supprimera le référentiel imbriqué ignoré. Une autre méthode consiste à créer un lien symbolique sur le dossier et à ignorer le lien symbolique. Si vous exécutez ensuite git clean, le lien symbolique est supprimé, mais le dépôt «imbriqué» restera intact car il réside vraiment ailleurs.



5

Sommaire.

Puis-je imbriquer des dépôts git?

Oui. Cependant, par défaut, git ne suit pas le .gitdossier du référentiel imbriqué. Git a des fonctionnalités conçues pour gérer les référentiels imbriqués (lisez la suite).

Est-il judicieux de git init / ajouter le / project_root pour faciliter la gestion de tout localement ou dois-je gérer mon_projet et le tiers séparément?

Cela n'a probablement pas de sens car git a des fonctionnalités pour gérer les dépôts imbriqués. Les fonctionnalités intégrées de Git pour gérer les référentiels imbriqués sont submoduleet subtree.

Voici un blog sur le sujet et voici une question SO qui couvre les avantages et les inconvénients de l'utilisation de chacun.


1

J'utiliserais un référentiel par projet. De cette façon, l'historique devient plus facile à parcourir.

Je vérifierais également la version de la bibliothèque tierce que j'utilise, dans le référentiel du projet qui l'utilise.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.