Quand utiliser git subtree?
Quel est le problème git subtree
résoudre?
Quand et pourquoi devrais-je utiliser cette fonctionnalité?
j'ai lu qu'il s'agit de utilisé pour la séparation du dépôt . Mais pourquoi ne créerais-je pas deux dépôts indépendants au lieu d'en coller deux autres en un seul?
ce tutoriel de GitHub explique comment effectuer des fusions de subtree .
je sais comment pour l'utiliser, mais pas quand (cas d'utilisation) et pourquoi , et comment il se rapporte à git submodule
. J'utiliserais des sous-modules quand j'ai une dépendance sur un autre projet ou une autre bibliothèque.
5 réponses
vous devez être prudent de noter explicitement ce que vous parlez lorsque vous utilisez le terme "subtree " dans le contexte de git
comme il ya en fait deux sujets séparés mais liés ici:
git-sous-arborescence et git subtree de fusion de la stratégie .
The TL; DR
les deux concepts liés à subtree vous permettent de gérer efficacement plusieurs référentiels. Contrairement à git-submodule où seules les métadonnées sont stockées dans le dépôt racine, sous la forme de .gitmodules , et vous devez gérer les dépôts externes séparément.
Plus De Détails
stratégie de fusion de sous-arborescence est essentiellement la méthode plus manuelle en utilisant les commandes que vous avez référencé.
git-subtree est un script shell wrapper pour faciliter une syntaxe plus naturelle. C'est en fait encore une partie de contrib
et n'est pas complètement intégré dans git avec les pages de manuel habituelles. Le documentation est plutôt stocké le long du script.
Voici les informations d'usage:
NAME
----
git-subtree - Merge subtrees together and split repository into subtrees
SYNOPSIS
--------
[verse]
'git subtree' add -P <prefix> <commit>
'git subtree' add -P <prefix> <repository> <ref>
'git subtree' pull -P <prefix> <repository> <ref>
'git subtree' push -P <prefix> <repository> <ref>
'git subtree' merge -P <prefix> <commit>
'git subtree' split -P <prefix> [OPTIONS] [<commit>]
j'ai rencontré un assez bon nombre de ressources sur le sujet des sous-arbres, comme je projetais sur l'écriture d'un blog post de mon propre. Je mettrai à jour ce post si je le fais, mais pour l'instant voici quelques informations pertinentes à la question à portée de main:
une grande partie de ce que vous recherchez peut être trouvé sur ce blog Atlassien par Nicola Paolucci la section pertinente ci-dessous:
Pourquoi utiliser subtree au lieu de submodule?
il y a plusieurs raisons pour lesquelles vous pourriez trouver
subtree
mieux utiliser:
- la gestion d'un flux de travail simple est facile.
- ancienne version de
git
sont pris en charge (même avantv1.5.2
).- le code du sous-projet est disponible juste après le
clone
du super projet est fait.subtree
ne nécessite pas les utilisateurs de votre référentiel d'apprendre quelque chose de nouveau, ils peuvent ignorer le fait que vous utilisezsubtree
pour gérer les dépendances.subtree
n'ajoute pas de nouveaux fichiers de métadonnées commesubmodules
(c.-à-d..gitmodule
).- le contenu du module peut être modifié sans copie du dépôt séparé de la dépendance ailleurs.
à mon avis, les inconvénients sont acceptables:
- vous devez en savoir plus sur une nouvelle stratégie de fusion (i.e.
subtree
).- code de contribution retour
upstream
pour les sous-projets est un peu plus compliqué.- la responsabilité de ne pas mélanger le code super et le code de sous-projet dans commits vous incombe.
je suis d'accord avec beaucoup de ce que bien. Je recommande de vérifier l'article car il passe en revue un certain usage commun.
Vous avez remarqué qu'il a également a écrit un suivi ici où il mentionne un détail important qui est laissé à cette approche...
git-subtree
n'inclut pas la télécommande!
cette myopie est probablement due au fait que les gens ajoutent souvent une télécommande manuellement lorsqu'ils traitent avec des sous-trées, mais ce n'est pas stocké dans git non plus. L'auteur détaille un patch qu'il a écrit pour ajouter cette méta données à la propagation que git-subtree
déjà génère. Jusqu'à ce que cela fasse partie de la ligne principale officielle de git, vous pouvez faire quelque chose de similaire en modifiant le message de propagation ou en le stockant dans une autre propagation.
je trouve aussi ce blog très instructives. L'auteur ajoute une troisième méthode de sous-arbre qu'il appelle git-stree
au mélange. L'article est intéressant à lire car il fait un assez bon travail de comparaison des trois approches. Il donne son opinion personnelle de ce qu'il fait et n'aime pas et explique pourquoi il a créé la troisième approche.
Extras
Réflexions
ce sujet montre à la fois la puissance de git
et la segmentation qui peut se produire quand une caractéristique vient de manquer la marque.
j'ai personnellement construit un dégoût pour git-submodule
que je trouve plus déroutant pour les contributeurs de comprendre. Je préfère aussi garder tout de mes dépendances gérées dans mes projets pour faciliter un environnement facilement reproductible sans essayer de gérer plusieurs dépôts. git-submodule
, cependant, est beaucoup plus connu actuellement, il est donc évidemment bon d'en être conscient et dépend de votre auditoire qui peut influencer votre décision.
tout d'abord: je crois que votre question tend à obtenir des réponses fortement opiniâtres et peut être considérée comme hors-sujet ici. Cependant, je n'aime pas que si politique et serait pousser la frontière d'être sur le sujet un peu à l'extérieur, donc je tiens à répondre à la place et espérer que les autres font aussi bien.
sur le tutoriel GitHub que vous avez pointé il y a un lien vers comment utiliser la stratégie de fusion subtree qui donne un point de vue sur les avantages/inconvénients:
la Comparaison des sous-arbre de fusion avec submodules
l'avantage d'utiliser subtree merge est qu'il nécessite moins de charge administrative de la part des utilisateurs de votre dépôt. Il fonctionne avec plus ancien (avant Git v1.5.2) clients et vous avez le code juste après clone.
cependant si vous utilisez sous-modules puis vous pouvez choisir de ne pas transférer les objets submodules . Cela peut être un problème avec la fusion subtree.
aussi, dans le cas où vous apportez des modifications à l'autre projet, il est plus facile de soumettre des modifications si vous utilisez juste des sous-modules.
Voici mon point de vue basé sur ce qui précède:
je travaille souvent avec des gens (=committers) qui ne sont pas des utilisateurs réguliers de git, certains encore (et pour toujours) se battent avec le contrôle de version. Les éduquer sur la façon d'utiliser la stratégie de fusion de sous-modules est fondamentalement impossible. Cela implique les concepts de Remote supplémentaires, de fusion, de branches, puis de tout mélanger en un seul flux de travail. Tirer en amont et pousser en amont est un processus en deux étapes. Depuis branches est difficile à comprendre pour eux, c'est sans espoir.
avec des sous-modules c'est encore trop compliqué pour eux ( sigh ) mais c'est plus facile à comprendre: c'est juste un repo à l'intérieur d'un repo (ils sont familiers avec la hiérarchie) et vous pouvez faire votre poussée et tirer comme d'habitude.
fournir des scripts d'enrubannage simples est plus facile imho pour le workflow submodule.
pour les grandes Super-repos avec de nombreux sous-repos le point de choisir de ne pas cloner les données de certains sous-repos est un avantage important des sous-modules. Nous pouvons limiter cela basé sur les exigences de travail et le disque l'utilisation de l'espace.
le contrôle d'accès pourrait être différent. Je n'ai pas encore eu ce problème, mais si différentes repos nécessitent des contrôles d'accès différents, interdisant effectivement certains utilisateurs de certaines sous-repos, je me demande si c'est plus facile à accomplir avec l'approche sous-module.
personnellement, je ne sais pas quoi utiliser. Je partage donc votre confusion: o]
un vrai cas d'utilisation que nous avons là où le subtree git était un salut:
le produit principal de notre société est très modulaire et développé dans plusieurs projets dans des dépôts séparés. Tous les modules ont leur propre feuille de route. Le produit entier est composé de tous les modules des versions concrètes.
en parallèle la version en béton du produit entier est personnalisée pour chacun de nos clients - branches séparées pour chaque module. La personnalisation doit être parfois dans plusieurs projets à la fois ( cross-module customization
).
pour avoir un cycle de vie de produit séparé (entretien, branches de fonction) pour le produit personnalisé, nous avons introduit git subtree. Nous avons un référentiel git-subtree pour tous les modules personnalisés. Notre personnalisation est un 'git subtree push' quotidien vers tous les dépôts originaux vers les branches de personnalisation.
ainsi, nous évitons de gérer beaucoup de repos et de braches. git-subtree a augmenté notre productivité plusieurs fois!
en fait, Git-sous-arborescence sont les alternatives pour le Git-sous-module approche: Il ya beaucoup d'inconvénients ou plutôt je dirais, vous devez être très prudent tout en utilisant git-submodules. E. g lorsque vous avez" un " repo et à l'intérieur de "un" vous avez ajouté un autre repo appelé "deux" en utilisant des sous-modules. Choses dont vous devez prendre soin:
-
lorsque vous changez quelque chose en "deux", vous devez vous engager et pousser à l'intérieur de "deux", si vous êtes dans un répertoire de haut niveau (I. e en "une"), vos modifications n'en surbrillance.
-
Lorsqu'un utilisateur inconnu essaie de cloner votre "one" repo, après avoir cloné "one" que l'utilisateur doit mettre à jour les sous-modules pour obtenir les " two "repo
ce sont quelques-uns des points et pour une meilleure compréhension, je vous recommande de regarder cette vidéo: https://www.youtube.com/watch?v=UQvXst5I41I&t=576s
-
pour surmonter de tels problèmes subtree approche est inventé. Pour obtenir les bases sur git-subtree, avoir une vue sur ce: https://www.youtube.com/watch?v=t3Qhon7burE&t=772s
-
je trouve que l'approche subtree est plus fiable et pratique que les sous-modules :) (Je suis très débutant pour dire ces choses)
santé!
pour ajouter aux réponses ci-dessus, un inconvénient supplémentaire de l'utilisation de subtree est la taille repo par rapport à des sous-modules.
Je n'ai pas de mesures du monde réel, mais étant donné que chaque fois qu'une poussée est faite sur un module, partout où ce module est utilisé obtient une copie de la même modification sur le module parent (quand est ensuite mis à jour sur ces repos).
donc si une base de code est fortement modularisée, cela s'additionnera assez rapidement.
Toutefois, étant donné que les prix du stockage sont toujours en baisse, cela n'est peut-être pas un facteur significatif.