Différences entre le sous-module git et le sous-arbre

300

Quelles sont les différences conceptuelles entre l'utilisation du sous-module et du sous-arbre git?

Quels sont les scénarios typiques pour chacun?

Nathan H
la source
3
Cela peut ne pas répondre à toutes vos questions, mais c'est une lecture intéressante sur le sujet: blogs.atlassian.com/2013/05/…
Chop
Une question similaire est stackoverflow.com/questions/571232/…
Michael Freidgeim
"Alternatives à Git Submodules?": Stackoverflow.com/questions/6500524/...
brillout

Réponses:

177

Que faire si je veux que les liens pointent toujours vers la TETE du référentiel externe?

Vous pouvez créer un sous-module pour suivre la TÊTE d'une branche d'un référentiel distant de sous-module, avec:

o git submodule add -b <branch> <repository> [<path>]. (pour spécifier une branche à suivre)
o git submodule update --remotequi mettra à jour le contenu du sous-module vers la dernière HEAD de <repository>/<branch>, par défaut origin/master. Votre projet principal continuera de suivre les hachages de la TETE du sous-module même s'il --remoteest utilisé.


VonC
la source
votre réponse semble aller à l'encontre de la réponse votée ici: stackoverflow.com/questions/10443627/…
Nathan H
@NathanH this (la possibilité de suivre HEAD) a été ajouté un an plus tard (mars 2013, git 1.8.2: github.com/git/git/blob/… )
VonC
Je vois que le comportement de suivi du sous-module est également mentionné dans votre autre réponse . Dans ce cas, je pense que vous voulez dire que toujours pointer vers la tête d'un sous-module est accompli en utilisant les deux add -bet --remotepar la suite sur les commandes de mise à jour, conformément à la documentation de mise à jour du sous - module . Dans ce cas, est-ce -bvraiment nécessaire pour suivre HEAD of master?
matanster
@matt the -best utilisé pour générer les bonnes métadonnées .gitmodule pour le sous-module (c'est équivalent à a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC
Ensuite, cela a peu à voir avec l'activation --remote- --remotefonctionne également s'il -bn'a pas été utilisé add. Dans les deux cas, la mise à jour entraînera une validation dans le référentiel parent hébergeant le sous-module, de sorte que les liens ne pointent pas vraiment "toujours vers la TÊTE" de manière très automatique .... soit je ne l'ai pas compris, soit cette revendication mieux vaut être retiré de la réponse d'origine (?)
matanster
351

le sous-module est un lien;

le sous-arbre est une copie

Feng
la source
121

La différence conceptuelle est:

Avec les sous-modules git, vous voulez généralement séparer un grand référentiel en plus petits. La façon de référencer un sous-module est de style maven - vous référencez un seul commit à partir de l'autre référentiel (sous-module). Si vous avez besoin d'une modification dans le sous-module, vous devez effectuer une validation / push dans le sous-module, puis référencer la nouvelle validation dans le référentiel principal, puis valider / pousser la référence modifiée du référentiel principal. De cette façon, vous devez avoir accès aux deux référentiels pour la construction complète.

Avec git subtree, vous intégrez un autre référentiel dans le vôtre, y compris son historique. Donc, après l'avoir intégré, la taille de votre référentiel est probablement plus grande (ce n'est donc pas une stratégie pour garder les référentiels plus petits). Après l'intégration, il n'y a pas de connexion à l'autre référentiel et vous n'avez pas besoin d'y accéder, sauf si vous souhaitez obtenir une mise à jour. Cette stratégie est donc davantage destinée à la réutilisation du code et de l'historique - personnellement, je ne l'utilise pas.

Niklas P
la source
Mais avec git subtreevous, vous pouvez toujours pousser - si vous le souhaitez - non?
Ixx
@lxx Si vous connaissez l'URL du référentiel…
Franklin Yu
@FranklinYu Pourquoi ne le savait-il pas? ne peut pas obtenir ces informations à partir des métadonnées git locales?
adi518
@ adi518 Oui, si vous êtes celui qui a créé le sous-arbre. Cependant, si vous avez poussé votre référentiel vers GitHub et que d'autres l'ont cloné, je ne pense pas qu'il connaît automatiquement l'URL du sous-arbre.
Franklin Yu
@NiklasP - pouvez-vous élaborer sur "référencer le nouveau commit dans le référentiel principal"? C'est la seule étape que je ne sais pas comment exécuter et donc "référence modifiée" n'est pas quelque chose que je comprends non plus.
Robert Oschler
21

sous-module
poussant un référentiel principal vers une télécommande ne pousse pas les fichiers du sous-module

sous-arborescence
poussant un référentiel principal à distance pousse les fichiers de la sous-arborescence

Maciek Rek
la source
3
"pousser un dépôt principal à distance pousse les fichiers de la sous-arborescence" Non, ce n'est pas le cas.
J Bramble
@JBramble Je devrais probablement mentionner que c'est fait avec l'application SourceTree, par exemple:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek