Les projets logiciels modernes reposent principalement sur les résultats du travail d'autres projets. Si quelqu'un d'autre a écrit d'excellentes solutions et que vous réinventez la roue de votre code, ce serait une énorme perte de temps. C'est pourquoi de nombreux projets utilisent du code tiers, tels que des bibliothèques ou des modules.
git, le système de contrôle de version le plus populaire au monde, fournit un moyen élégant et puissant de gérer ces dépendances. Son concept de «sous-modules» nous permet d'inclure et de gérer des bibliothèques tierces tout en les gardant clairement séparés de notre propre code.
Cet article expliquera pourquoi les sous-modules Git sont si utiles, que sont exactement et comment ils fonctionnent.
Points clés
Garder la séparation du code
pour illustrer clairement pourquoi les sous-modules Git sont une structure précieuse, regardons un cas où n'a pas de sous-modules . Lorsque vous devez inclure du code tiers, tel que les bibliothèques open source, vous pouvez choisir un moyen facile: il suffit de télécharger le code à partir de GitHub et de le mettre quelque part dans votre projet. Bien que cette méthode soit très rapide, elle n'est certainement pas propre pour plusieurs raisons: En copiant de force le code tiers dans votre projet, vous mélangez en fait plusieurs projets dans un seul projet. La ligne entre votre propre projet et les projets d'autrui (bibliothèque) commence à se brouiller.
chaque fois que vous avez besoin de mettre à jour le code de la bibliothèque (car son mainteneur fournit une excellente nouvelle fonctionnalité ou corrige un bogue sérieux), vous devez télécharger, copier et coller à nouveau. Cela deviendra bientôt un processus fastidieux.Bien sûr, les sous-modules ne sont pas la seule solution à de tels problèmes. Vous pouvez également utiliser une variété de systèmes "Gestionnaire de packages" fournis par de nombreuses langues et cadres modernes. Il n'y a rien de mal à faire ça!
Cependant, vous pouvez penser à l'architecture du sous-module de Git avec certains avantages:
L'essence du sous-module git
Les sous-modulesdans Git ne sont en fait que des référentiels GIT standard. Il n'y a pas d'innovation sophistiquée, juste le même référentiel Git que nous connaissons tous très bien. Cela fait également partie de la puissance des sous-modules: ils sont si puissants et directs parce qu'ils sont si "secs" d'un point de vue technique et bien testés.
La seule chose qui fait d'un référentiel git un module enfant est qu'il est situé à l'intérieur d'un autre parent git Repository .
Autre que cela, le sous-module GIT est toujours un référentiel entièrement fonctionnel: vous pouvez faire tout ce que vous savez déjà du travail GIT "normal" - de la modification des fichiers à la validation, à la tir et à la poussée. Tout dans le sous-module est possible.
Ajouter le sous-module
Prenons un exemple classique comme exemple, supposons que nous voulons ajouter une bibliothèque tierce au projet. Il est logique de créer un dossier séparé pour stocker un tel contenu avant d'obtenir un code:
$ mkdir lib $ cd lib
$ git submodule add https://github.com/spencermountain/spacetime.git
<code>Cloning into 'carparts-website/lib/spacetime'... remote: Enumerating objects: 7768, done. remote: Counting objects: 100% (1066/1066), done. remote: Compressing objects: 100% (445/445), done. remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702 Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done. Resolving deltas: 100% (5159/5159), done.</code>
! Si nous téléchargeons simplement certains fichiers, les jetons dans notre projet et les engageons - comme le reste de nos projets - ils feront partie du même référentiel GIT. Cependant, le sous-module garantit que les fichiers de bibliothèque ne sont pas "divulgués" dans le référentiel de notre projet principal. Voyons ce qui se passe d'autre: un nouveau fichier .gitmodules a été créé dans le dossier racine du projet principal. Ce qui suit est son contenu:
$ mkdir lib $ cd lib
Ce fichier .gitmodules est l'un des nombreux emplacements des sous-modules dans les projets de suivi GIT. L'autre est .git / config, qui se termine maintenant comme suit:
$ git submodule add https://github.com/spencermountain/spacetime.git
Enfin, Git conserve également une copie du référentiel .git de chaque sous-module dans le dossier .git / modules interne.
Tous ce sont des détails techniques dont vous n'avez pas à vous souvenir. Cependant, il peut être utile de comprendre que le maintien interne des sous-modules Git est assez complexe. C'est pourquoi une chose est importante à retenir: ne modifiez pas manuellement la configuration du sous-module GIT! Si vous souhaitez déplacer, supprimer ou exploiter des sous-modules, faites-vous une faveur, n'essayez pas cela manuellement. Vous pouvez utiliser les commandes GIT appropriées ou une interface graphique de bureau GIT comme "Tower" et il gérera ces détails pour vous.
Voyons le statut du projet principal après avoir ajouté des sous-modules:
Comme vous pouvez le voir, Git traite l'ajout de sous-modules comme les mêmes changements que les autres changements. Nous devons donc commettre ce changement comme tout autre changement:
<code>Cloning into 'carparts-website/lib/spacetime'... remote: Enumerating objects: 7768, done. remote: Counting objects: 100% (1066/1066), done. remote: Compressing objects: 100% (445/445), done. remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702 Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done. Resolving deltas: 100% (5159/5159), done.</code>
<code>[submodule "lib/spacetime"] path = lib/spacetime url = https://github.com/spencermountain/spacetime.git</code>
Dans notre exemple ci-dessus, nous avons ajouté un nouveau sous-module au référentiel GIT existant. Mais, "à son tour", que se passe-t-il lorsque vous clonez un référentiel qui contient déjà le sous-module
?Si nous exécutons un clone Git normal & lt; URL distant & gt; sur la ligne de commande, nous téléchargerons le projet principal - mais nous constaterons que tout dossier de sous-module est vide! Cela prouve une fois de plus que les fichiers sous-modules sont indépendants et ne sont pas inclus dans leur référentiel parent.
Dans ce cas, pour remplir le sous-module après le clonage de son référentiel parent, vous pouvez simplement faire la mise à jour du sous-module GIT - Init - réécursive. Une meilleure façon consiste à ajouter directement l'option --Recurse-Submodules lorsque le premier clone Git est appelé.Version de paiement
Dans les référentiels Git "normaux", nous vérifions généralement les branches. En utilisant Git Checkout & lt; Nom de la branche & gt; ou un commutateur GIT mis à jour & lt; Nom de la branche & gt;, nous disons à Git ce que devrait être notre branche actuellement active. Lorsqu'un nouveau commit est fait sur cette branche, le pointeur de tête se déplacera automatiquement
vers le dernier engagement. Il est important de comprendre cela - parce que les sous-modules Git fonctionnent différemment! Dans les sous-modules, nous vérifions toujours une version spécifique - pas une branche! Même si vous exécutez des commandes similaires à Git Checkout Main dans un sous-module, en arrière-plan, le dernier
COMMISSEactuel sur cette branche est enregistré - pas la branche elle-même. Bien sûr, ce comportement n'est pas une erreur. Considérez ceci: lorsque vous incluez des bibliothèques tierces, vous souhaitez avoir un contrôle total sur le code exact que vous utilisez dans votre projet principal. C'est génial lorsque le mainteneur de la bibliothèque publie une nouvelle version ... mais vous ne voulez pas nécessairement utiliser cette nouvelle version automatiquement dans votre projet. Parce que vous ne savez pas si ces nouveaux modifications briseront votre projet
!Si vous souhaitez savoir quelle version votre sous-module utilise, vous pouvez demander ces informations dans le projet principal:
$ mkdir lib $ cd lib
Cela renverra la version actuellement vérifiée par notre sous-module Lib / Spacetime. Il nous permet également de savoir que cette version est une balise appelée "6.16.3". Il est courant d'utiliser fortement les balises lors de l'utilisation de sous-modules Git.
Supposons que vous souhaitiez que votre sous-module utilise une ancienne version de , marqué "6.14.0". Tout d'abord, nous devons modifier le répertoire afin que nos commandes GIT soient exécutées dans le contexte du sous-module, et non notre projet principal. Ensuite, nous pouvons simplement exécuter Git Checkout avec le nom de la balise:
$ git submodule add https://github.com/spencermountain/spacetime.git
<code>Cloning into 'carparts-website/lib/spacetime'... remote: Enumerating objects: 7768, done. remote: Counting objects: 100% (1066/1066), done. remote: Compressing objects: 100% (445/445), done. remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702 Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done. Resolving deltas: 100% (5159/5159), done.</code>
appeler le statut Git dans notre projet principal nous informe maintenant également de ce fait:
<code>[submodule "lib/spacetime"] path = lib/spacetime url = https://github.com/spencermountain/spacetime.git</code>
<code>[submodule "lib/spacetime"] url = https://github.com/spencermountain/spacetime.git active = true</code>
Mettre à jour le sous-module git
Dans les étapes ci-dessus, nousnous-mêmes a déplacé le pointeur sous-module: nous sommes ceux qui choisissent de consulter différentes versions, de la soumettre et de la pousser vers le référentiel distant de notre équipe. Mais que se passe-t-il si notre collègue modifiait la version du sous-module - peut-être parce qu'une nouvelle version intéressante du sous-module a été publiée et que notre collègue a décidé de l'utiliser dans notre projet (après des tests approfondis, bien sûr ...).
EXÉCUTONS UNE PULLE GIT IMPORTANT dans le projet principal - parce que nous pouvons le faire souvent - pour obtenir de nouveaux modifications d'un référentiel distant partagé:
$ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: .gitmodules new file: lib/spacetime
$ git commit -m "Add timezone converter library as a submodule"
$ git submodule status ea703a7d557efd90ccae894db96368d750be93b6 lib/spacetime (6.16.3)
en utilisant le sous-module git
Nous avons couvert les blocs de construction de base à l'aide de sous-modules Git. Les autres workflows sont très standard!Par exemple, la vérification des nouvelles modifications dans les sous-modules est comme dans tout autre référentiel GIT: vous exécutez la commande git fetch dans le référentiel de sous-module et si vous souhaitez utiliser des mises à jour, vous pouvez alors exécuter quelque chose comme Git Pull Origin après Main Main Main commande.
La modification des sous-modules peut également fonctionner pour vous, surtout si vous gérez vous-même le code de la bibliothèque (car il s'agit d'une bibliothèque interne, pas d'un tiers). Vous pouvez utiliser des sous-modules comme vous le feriez avec n'importe quel autre référentiel GIT: vous pouvez apporter des modifications, les engager, les pousser, etc.
Obtenez la puissance de Git
Git a des fonctionnalités puissantes dans les coulisses. Cependant, de nombreux outils avancés, tels que les sous-modules Git, ne sont pas bien connus. De nombreux développeurs ont raté beaucoup de fonctionnalités puissantes, ce qui est vraiment dommage!
Si vous souhaitez approfondir certaines autres technologies avancées Git, je recommande fortement la "boîte à outils avancée Git": il s'agit d'une courte collection vidéo (gratuite!) Qui vous présentera un réflog, une rebase interactive, des cerises comme des sujets comme des sujets comme Cueillette et même stratégies de ramification.
Je vous souhaite un meilleur développeur!
Des questions fréquemment posées sur les sous-modules Git
Qu'est-ce qu'un sous-module Git? Le sous-module GIT est un moyen d'inclure un autre référentiel GIT en tant que sous-répertoire dans votre propre référentiel GIT. Il vous permet de maintenir un référentiel séparé en tant que sous-projet dans le projet principal.
Pourquoi utiliser le sous-module Git? Les sous-modules git sont utiles pour fusionner des référentiels externes dans votre projet, surtout si vous souhaitez séparer leur historique de développement du projet principal. Ceci est très bénéfique pour gérer les dépendances ou y compris les bibliothèques externes.
Quelles informations sont stockées dans le projet principal sur le sous-module? Le projet principal stocke l'URL et engagez le hachage du sous-module dans une entrée spéciale dans le référentiel parent. Cela permet à toute personne clonage le projet principal de cloner les sous-modules référencés.
Comment cloner un référentiel GIT contenant des sous-modules? Lors du clonage d'un référentiel contenant des sous-modules, vous pouvez automatiquement initialiser et cloner les sous-modules à l'aide de l'indicateur - réécursif de la commande GIT Clone. Alternativement, vous pouvez utiliser la mise à jour du sous-module GIT - init après le clonage.
Puis-je nicher sous-modules? Oui, Git prend en charge les sous-modules imbriqués, ce qui signifie que les sous-modules peuvent contenir ses propres sous-modules. Cependant, la gestion des sous-modules imbriqués peut se compliquer et vous devez vous assurer que chaque sous-module est correctement initialisé et mis à jour.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!