Imaginons que le référentiel comporte 10 submodules et que vous ne soyez intéressé que par deux d'entre eux. Dans ce cas, vous voudrez peut-être obtenir de temps en temps des mises à jour de ces deux seuls submodules à partir du référentiel distant. git init
fonctionne bien pour cela, car une fois que vous exécutez la commande git init
pour ces deux sous-modules, git submodule update --remote
ne s'applique qu'à eux.
Ajout d'une démonstration de deux flux de travail.
Flux de travail1 : Les sous-modules sont des bibliothèques que plusieurs projets utilisent.
Je pense que c'est l'un des cas d'utilisation les plus courants.
Vous venez de cloner "mon-projet".
git clone https://example.com/demo/my-project
Et la surface de sa structure est comme ci-dessous.
Le contenu du fichier .gitmodules
[submodule "lib1"]
path = lib1
url = https://example.com/demo/lib1
[submodule "lib2"]
path = lib2
url = https://example.com/demo/lib2
[submodule "lib3"]
path = lib3
url = https://example.com/demo/lib3
[submodule "lib4"]
path = lib4
url = https://example.com/demo/lib4
Vous voulez refactoriser le code code1.js
qui fait référence à lib1 et lib2, ce qui signifie que vous n'avez pas besoin de cloner et de vérifier lib3 et lib4. Il suffit donc d'exécuter la commande ci-dessous.
git submodule init lib1 lib2
Voyons maintenant le contenu de .git/config
...
[submodule "lib1"]
active = true
url = https://example.com/demo/lib1
[submodule "lib2"]
active = true
url = https://example.com/demo/lib2
Cela signifie quelque chose comme "Prêt à mettre à jour lib1 et lib2 depuis exemple.com/demo".
À ce stade, les répertoires lib1 et lib2 sont vides. Vous pouvez cloner et extraire lib1 et lib2 avec une seule commande :
git submodule update
Maintenant vous êtes capable de refactoriser code1.js
sans erreur d'importation.
Les sous-modules sont juste des références à certains commits. Ainsi, lorsque vous souhaitez mettre à jour les bibliothèques vers de nouvelles versions, vous devez mettre à jour les références. Vous pouvez le faire avec la commande suivante.
git submodule update --remote
Vous pouvez maintenant voir combien il est utile de n'initialiser que les sous-modules dont vous avez besoin.
Flux de travail 2 : Chaque sous-module est un projet et un grand projet supérieur les inclut.
Je suis un fan de ça.
Vous clonez "main-project".
git clone https://example.com/demo/main-project
Et la surface de sa structure est comme ci-dessous.
Vous pouvez voir un répertoire nommé "shared". Il y a une règle dans ce workflow : si vous voulez utiliser les codes partagés de main-project dans votre projet, vous devez créer le projet comme un sous-module de main-project.
J'aime mettre les classes d'entités dans le répertoire partagé comme ci-dessous.
Pour en revenir au flux de travail des submodules, le contenu du fichier .gitmodules ressemble à ce qui suit.
[submodule "sub-project1"]
path = sub-project1
url = https://example.com/demo/sub-project1
[submodule "sub-project2"]
path = sub-project2
url = https://example.com/demo/sub-project2
[submodule "sub-project3"]
path = sub-project3
url = https://example.com/demo/sub-project3
[submodule "sub-project4"]
path = sub-project4
url = https://example.com/demo/sub-project4
Cette fois, vous voulez remanier du code dans le répertoire partagé du projet principal et vous savez que seuls les sous-projets 1 et 2 font référence au code partagé, ce qui signifie que vous n'avez pas besoin de cloner et de vérifier les sous-projets 3 et 4. Il suffit donc d'exécuter la commande ci-dessous.
git submodule init sub-project1 sub-project2
Et comme je l'ai mentionné dans le workflow1, vous devez exécuter la commande ci-dessous pour les cloner et les vérifier.
git submodule update
Est-ce que je ferais git submodule update --remote
dans ce cas ? Ou dois-je même initier et mettre à jour les submodules pour remanier le code dans le répertoire partagé ? Oui, parce que vous devez exécuter des tests dans les submodules après avoir remanié le code partagé et si une mise à jour des submodules est validée et poussée vers le référentiel distant pendant que vous remaniez le code, vous devez l'obtenir par le biais de la fonction git submodule update --remote
.