-
1. DĂ©marrage rapide
-
2. Les bases de Git
-
3. Les branches avec Git
-
4. Git sur le serveur
- 4.1 Protocoles
- 4.2 Installation de Git sur un serveur
- 4.3 Génération des clés publiques SSH
- 4.4 Mise en place du serveur
- 4.5 DĂ©mon (Daemon) Git
- 4.6 HTTP intelligent
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Git hébergé
- 4.10 Résumé
-
5. Git distribué
-
6. GitHub
-
7. Utilitaires Git
- 7.1 SĂ©lection des versions
- 7.2 Indexation interactive
- 7.3 Remisage et nettoyage
- 7.4 Signer votre travail
- 7.5 Recherche
- 7.6 RĂ©Ă©crire lâhistorique
- 7.7 Reset démystifié
- 7.8 Fusion avancée
- 7.9 Rerere
- 7.10 DĂ©boguer avec Git
- 7.11 Sous-modules
- 7.12 Empaquetage (bundling)
- 7.13 Replace
- 7.14 Stockage des identifiants
- 7.15 Résumé
-
8. Personnalisation de Git
- 8.1 Configuration de Git
- 8.2 Attributs Git
- 8.3 Crochets Git
- 8.4 Exemple de politique gérée par Git
- 8.5 Résumé
-
9. Git et les autres systĂšmes
- 9.1 Git comme client
- 9.2 Migration vers Git
- 9.3 Résumé
-
10. Les tripes de Git
- 10.1 Plomberie et porcelaine
- 10.2 Les objets de Git
- 10.3 Références Git
- 10.4 Fichiers groupés
- 10.5 La refspec
- 10.6 Les protocoles de transfert
- 10.7 Maintenance et récupération de données
- 10.8 Les variables dâenvironnement
- 10.9 Résumé
-
A1. Annexe A: Git dans dâautres environnements
- A1.1 Interfaces graphiques
- A1.2 Git dans Visual Studio
- A1.3 Git dans Visual Studio Code
- A1.4 Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git dans Sublime Text
- A1.6 Git dans Bash
- A1.7 Git dans Zsh
- A1.8 Git dans PowerShell
- A1.9 Résumé
-
A2. Annexe B: Embarquer Git dans vos applications
- A2.1 Git en ligne de commande
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Commandes Git
- A3.1 Installation et configuration
- A3.2 Obtention et création des projets
- A3.3 Capture dâinstantanĂ© basique
- A3.4 Création de branches et fusion
- A3.5 Partage et mise Ă jour de projets
- A3.6 Inspection et comparaison
- A3.7 DĂ©bogage
- A3.8 Patchs
- A3.9 Courriel
- A3.10 SystĂšmes externes
- A3.11 Administration
- A3.12 Commandes de plomberie
7.11 Utilitaires Git - Sous-modules
Sous-modules
Il arrive souvent lorsque vous travaillez sur un projet que vous deviez utiliser un autre projet comme dĂ©pendance. Cela peut ĂȘtre une bibliothĂšque qui est dĂ©veloppĂ©e par une autre Ă©quipe ou que vous dĂ©veloppez sĂ©parĂ©ment pour lâutiliser dans plusieurs projets parents. Ce scĂ©nario provoque un problĂšme habituel : vous voulez ĂȘtre capable de gĂ©rer deux projets sĂ©parĂ©s tout en utilisant lâun dans lâautre.
Voici un exemple. Supposons que vous dĂ©veloppez un site web et que vous crĂ©ez des flux Atom. PlutĂŽt que dâĂ©crire votre propre code de gĂ©nĂ©ration Atom, vous dĂ©cidez dâutiliser une bibliothĂšque. Vous allez vraisemblablement devoir soit inclure ce code depuis un gestionnaire partagĂ© comme CPAN ou Ruby gem, soit copier le code source dans votre propre arborescence de projet. Le problĂšme dâinclure la bibliothĂšque en tant que bibliothĂšque externe est quâil est difficile de la personnaliser de quelque maniĂšre que ce soit et encore plus de la dĂ©ployer, car vous devez vous assurer de la disponibilitĂ© de la bibliothĂšque chez chaque client. Mais le problĂšme dâinclure le code dans votre propre projet est que nâimporte quelle personnalisation que vous faites est difficile Ă fusionner lorsque les modifications du dĂ©veloppement principal arrivent.
Git gĂšre ce problĂšme avec les sous-modules. Les sous-modules vous permettent de gĂ©rer un dĂ©pĂŽt Git comme un sous-rĂ©pertoire dâun autre dĂ©pĂŽt Git. Cela vous laisse la possibilitĂ© de cloner un dĂ©pĂŽt dans votre projet et de garder isolĂ©s les commits de ce dĂ©pĂŽt.
DĂ©marrer un sous-module
DĂ©taillons le dĂ©veloppement dâun projet simple qui a Ă©tĂ© divisĂ© en un projet principal et quelques sous-projets.
Commençons par ajouter le dĂ©pĂŽt dâun projet Git existant comme sous-module dâun dĂ©pĂŽt sur lequel nous travaillons.
Pour ajouter un nouveau sous-module, nous utilisons la commande git submodule add
avec lâURL du projet que nous souhaitons suivre.
Dans cette exemple, nous ajoutons une bibliothÚque nommée « DbConnector ».
$ git submodule add https://github.com/chaconinc/DbConnector
Clonage dans 'DbConnector'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
DĂ©paquetage des objets: 100% (11/11), fait.
Vérification de la connectivité... fait.
Par dĂ©faut, les sous-modules ajoutent le sous-projet dans un rĂ©pertoire portant le mĂȘme nom que le dĂ©pĂŽt, dans notre cas « DbConnector ». Vous pouvez ajouter un chemin diffĂ©rent Ă la fin de la commande si vous souhaitez le placer ailleurs.
Si vous lancez git status
à ce moment, vous noterez quelques différences.
$ git status
Sur la branche master
Votre branche est Ă jour avec 'origin/master'.
Modifications qui seront validées :
(utilisez "git reset <fichier>..." pour désindexer)
nouveau fichier : .gitmodules
nouveau fichier : DbConnector
PremiĂšrement, un fichier .gitmodules
vient dâapparaĂźtre.
Câest le fichier de configuration qui stocke la liaison entre lâURL du projet et le sous-rĂ©pertoire local dans lequel vous lâavez tirĂ©.
$ cat .gitmodules
[submodule "DbConnector"]
path = DbConnector
url = https://github.com/chaconinc/DbConnector
Si vous avez plusieurs sous-modules, vous aurez plusieurs entrées dans ce fichier.
Il est important de noter que ce fichier est en gestion de version comme vos autres fichiers, Ă lâinstar de votre fichier .gitignore
.
Il est poussé et tiré comme le reste de votre projet.
Câest Ă©galement le moyen que les autres personnes qui clonent votre projet ont de savoir oĂč rĂ©cupĂ©rer le projet du sous-module.
Note
|
Comme lâURL dans le fichier |
Lâautre information dans la sortie de git status
est lâentrĂ©e du rĂ©pertoire du projet.
Si vous exécutez git diff
, vous verrez quelque chose dâintĂ©ressant :
$ git diff --cached DbConnector
diff --git a/DbConnector b/DbConnector
new file mode 160000
index 0000000..c3f01dc
--- /dev/null
+++ b/DbConnector
@@ -0,0 +1 @@
+Subproject commit c3f01dc8862123d317dd46284b05b6892c7b29bc
MĂȘme si DbConnector
est un sous-rĂ©pertoire de votre rĂ©pertoire de travail, Git le voit comme un sous-module et ne suit pas son contenu (si vous nâĂȘtes pas dans ce rĂ©pertoire).
En Ă©change, Git lâenregistre comme un commit particulier de ce dĂ©pĂŽt.
Si vous souhaitez une sortie diff plus agrĂ©able, vous pouvez passer lâoption --submodule
Ă git diff
.
$ git diff --cached --submodule
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..71fc376
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "DbConnector"]
+ path = DbConnector
+ url = https://github.com/chaconinc/DbConnector
Submodule DbConnector 0000000...c3f01dc (new submodule)
Au moment de valider, vous voyez quelque chose comme :
$ git commit -am 'added DbConnector module'
[master fb9093c] added DbConnector module
2 files changed, 4 insertions(+)
create mode 100644 .gitmodules
create mode 160000 DbConnector
Remarquez le mode 160000 pour lâentrĂ©e DbConnector
.
Câest un mode spĂ©cial de Git qui signifie globalement que vous ĂȘtes en train dâenregistrer un commit comme un rĂ©pertoire plutĂŽt quâun sous-rĂ©pertoire ou un fichier.
Enfin, poussez ces modifications :
$ git push origin master
Cloner un projet avec des sous-modules
Maintenant, vous allez apprendre à cloner un projet contenant des sous-modules. Quand vous récupérez un tel projet, vous obtenez les différents répertoires qui contiennent les sous-modules, mais encore aucun des fichiers :
$ git clone https://github.com/chaconinc/MainProject
Clonage dans 'MainProject'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 14 (delta 1), reused 13 (delta 0)
DĂ©paquetage des objets: 100% (14/14), fait.
Vérification de la connectivité... fait.
$ cd MainProject
$ ls -la
total 16
drwxr-xr-x 9 schacon staff 306 Sep 17 15:21 .
drwxr-xr-x 7 schacon staff 238 Sep 17 15:21 ..
drwxr-xr-x 13 schacon staff 442 Sep 17 15:21 .git
-rw-r--r-- 1 schacon staff 92 Sep 17 15:21 .gitmodules
drwxr-xr-x 2 schacon staff 68 Sep 17 15:21 DbConnector
-rw-r--r-- 1 schacon staff 756 Sep 17 15:21 Makefile
drwxr-xr-x 3 schacon staff 102 Sep 17 15:21 includes
drwxr-xr-x 4 schacon staff 136 Sep 17 15:21 scripts
drwxr-xr-x 4 schacon staff 136 Sep 17 15:21 src
$ cd DbConnector/
$ ls
$
Le répertoire DbConnector
est présent mais vide.
Vous devez exécuter deux commandes : git submodule init
pour initialiser votre fichier local de configuration, et git submodule update
pour tirer toutes les données de ce projet et récupérer le commit approprié tel que listé dans votre super-projet :
$ git submodule init
Sous-module 'DbConnector' (https://github.com/chaconinc/DbConnector) enregistré pour le chemin 'DbConnector'
$ git submodule update
Clonage dans 'DbConnector'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
Unpacking objects: 100% (11/11), done.
Checking connectivity... done.
Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'
Votre répertoire DbConnector
est maintenant dans lâĂ©tat exact dans lequel il Ă©tait la derniĂšre fois que vous avez validĂ©.
Il existe une autre maniĂšre plus simple dâarriver au mĂȘme rĂ©sultat.
Si vous passez lâoption --recurse-submodules
Ă la commande git clone
, celle-ci initialisera et mettra à jour automatiquement chaque sous-module du dépÎt.
$ git clone --recurse-submodules https://github.com/chaconinc/MainProject
Clonage dans 'MainProject'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 14 (delta 1), reused 13 (delta 0)
DĂ©paquetage des objets: 100% (14/14), fait.
Vérification de la connectivité... fait.
Submodule 'DbConnector' (https://github.com/chaconinc/DbConnector) registered for path 'DbConnector'
Clonage dans 'DbConnector'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
DĂ©paquetage des objets: 100% (11/11), fait.
Vérification de la connectivité... fait.
chemin du sous-module 'DbConnector' : 'c3f01dc8862123d317dd46284b05b6892c7b29bc' extrait
Si vous avez déjà cloné le projet et oublié --recurse-submodules
, vous pouvez combiner les Ă©tapes git submodule init
et git submodule update
en lançant git submodule update --init
.
Pour initialiser, récupérer et extraire aussi tous les sous-modules récursivement, vous pouvez utiliser la commande complÚte git submodule update --init --recursive
.
Travailler sur un projet comprenant des sous-modules
Nous avons Ă prĂ©sent une copie dâun projet comprenant des sous-modules, et nous allons collaborer Ă la fois sur le projet principal et sur le projet du sous-module.
Tirer des modifications amont
Le modĂšle le plus simple dâutilisation des sous-modules est le cas de la simple consommation dâun sous-projet duquel on souhaite obtenir les mises Ă jour de temps en temps mais auquel on nâapporte pas de modification dans la copie de travail. Examinons un exemple simple.
Quand vous souhaitez vérifier si le sous-module a évolué, vous pouvez vous rendre dans le répertoire correspondant et lancer git fetch
puis git merge
de la branche amont pour mettre Ă jour votre code local.
$ git fetch
From https://github.com/chaconinc/DbConnector
c3f01dc..d0354fc master -> origin/master
$ git merge origin/master
Mise Ă jour c3f01dc..d0354fc
Avance rapide
scripts/connect.sh | 1 +
src/db.c | 1 +
2 files changed, 2 insertions(+)
Si vous revenez maintenant dans le projet principal et lancez git diff --submodule
, vous pouvez remarquer que le sous-module a été mis à jour et vous pouvez obtenir une liste des commits qui y ont été ajoutés.
Si vous ne voulez pas taper --submodule
Ă chaque fois que vous lancez git diff
, vous pouvez le régler comme format par défaut en positionnant le paramÚtre de configuration diff.submodule
à la valeur « log
 ».
$ git config --global diff.submodule log
$ git diff
Submodule DbConnector c3f01dc..d0354fc:
> more efficient db routine
> better connection routine
Si vous validez Ă ce moment, vous fixez la version du sous-module Ă la version actuelle quand dâautres personnes mettront Ă jour votre projet.
Il existe aussi un moyen plus facile, si vous préférez ne pas avoir à récupérer et fusionner manuellement les modifications dans le sous-répertoire.
Si vous lancez la commande git submodule update --remote
, Git se rendra dans vos sous-modules et réalisera automatiquement le fetch
et le merge
.
$ git submodule update --remote DbConnector
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2)
DĂ©paquetage des objets: 100% (4/4), fait.
Depuis https://github.com/chaconinc/DbConnector
3f19983..d0354fc master -> origin/master
chemin du sous-module 'DbConnector': checked out 'd0354fc054692d3906c85c3af05ddce39a1c0644' extrait
Cette commande considÚre par défaut que vous souhaitez mettre à jour la copie locale vers la branche master
du dépÎt du sous-module.
Vous pouvez, cependant, indiquer une autre branche.
Par exemple, si le sous-module DbConnector
suit la branche stable
du dĂ©pĂŽt amont, vous pouvez lâindiquer soit dans votre fichier .gitmodules
(pour que tout le monde le suive de mĂȘme) ou juste dans votre fichier local .git/config
.
Voyons ceci dans le cas du fichier .gitmodules
 :
$ git config -f .gitmodules submodule.DbConnector.branch stable
$ git submodule update --remote
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2)
DĂ©paquetage des objets: 100% (4/4), fait.
Depuis https://github.com/chaconinc/DbConnector
27cf5d3..c87d55d stable -> origin/stable
chemin du sous-module 'DbConnector' : 'c87d55d4c6d4b05ee34fbc8cb6f7bf4585ae6687' extrait
Si vous ne spécifiez pas la partie -f .gitmodules
, la commande ne fera quâune modification locale, mais il semble plus logique dâinclure cette information dans lâhistorique du projet pour que tout le monde soit au diapason.
Quand vous lancez git status
, Git vous montrera que nous avons de nouveaux commits (« new commits ») pour le sous-module.
$ git status
Sur la branche master
Votre branche est Ă jour avec 'origin/master'.
Modifications qui ne seront pas validées :
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
modifié : .gitmodules
modifié : DbConnector (new commits)
aucune modification n'a été ajoutée à la validation (utilisez "git add" ou "git commit -a")
Si vous activez le paramĂštre de configuration status.submodulesummary
, Git vous montrera aussi un résumé des modifications dans vos sous-modules :
$ git config status.submodulesummary 1
$ git status
Sur la branche master
Votre branche est Ă jour avec 'origin/master'.
Modifications qui ne seront pas validées :
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
modifié : .gitmodules
modifié : DbConnector (new commits)
Sous-modules modifiés mais non mis à jour :
* DbConnector c3f01dc...c87d55d (4):
> catch non-null terminated lines
Ici, si vous lancez git diff
, vous pouvez voir que le fichier .gitmodules
a Ă©tĂ© modifiĂ© mais aussi quâil y a un certain nombre de commits qui ont Ă©tĂ© tirĂ©s et sont prĂȘts Ă ĂȘtre validĂ©s dans le projet du sous-module.
$ git diff
diff --git a/.gitmodules b/.gitmodules
index 6fc0b3d..fd1cc29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
[submodule "DbConnector"]
path = DbConnector
url = https://github.com/chaconinc/DbConnector
+ branch = stable
Submodule DbConnector c3f01dc..c87d55d:
> catch non-null terminated lines
> more robust error handling
> more efficient db routine
> better connection routine
Câest une information intĂ©ressante car vous pouvez voir le journal des modifications que vous vous apprĂȘtez Ă valider dans votre sous-module.
Une fois validées, vous pouvez encore visualiser cette information en lançant git log -p
.
$ git log -p --submodule
commit 0a24cfc121a8a3c118e0105ae4ae4c00281cf7ae
Author: Scott Chacon <schacon@gmail.com>
Date: Wed Sep 17 16:37:02 2014 +0200
updating DbConnector for bug fixes
diff --git a/.gitmodules b/.gitmodules
index 6fc0b3d..fd1cc29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
[submodule "DbConnector"]
path = DbConnector
url = https://github.com/chaconinc/DbConnector
+ branch = stable
Submodule DbConnector c3f01dc..c87d55d:
> catch non-null terminated lines
> more robust error handling
> more efficient db routine
> better connection routine
Par dĂ©faut, Git essaiera de mettre Ă jour tous les sous-modules lors dâune commande git submodule update --remote
, donc si vous avez de nombreux sous-modules, il est préférable de spécifier le sous-module que vous souhaitez mettre à jour.
Tirer des modifications amont depuis le serveur distant
Glissons-nous maintenant dans les habits dâun collaborateur, qui a son propre clone local du dĂ©pĂŽt ProjetPrincipal.
Lancer simplement git pull
pour obtenir les nouvelles modifications validées ne suffit plus :
$ git pull
From https://github.com/chaconinc/ProjetPrincipal
fb9093c..0a24cfc master -> origin/master
Fetching submodule DbConnector
From https://github.com/chaconinc/DbConnector
c3f01dc..c87d55d stable -> origin/stable
Updating fb9093c..0a24cfc
Fast-forward
.gitmodules | 2 +-
DbConnector | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: DbConnector (new commits)
Submodules changed but not updated:
* DbConnector c87d55d...c3f01dc (4):
< catch non-null terminated lines
< more robust error handling
< more efficient db routine
< better connection routine
no changes added to commit (use "git add" and/or "git commit -a")
Par défaut, la commande git pull
récupÚre les modifications des sous-modules récursivement, comme nous pouvons le voir sur la premiÚre ligne ci-dessus.
Cependant, elle ne met pas les sous-modules Ă jour.
Câest affichĂ© Ă la sortie de la commande git status
, qui indique que le sous-module est « modified », et a des nouveaux commit (new commits).
De plus, les chevrons indiquant les nouveaux commits pointent Ă gauche (<), ce qui signifie que ces commits sont enregistrĂ©s dans ProjetPrincipal, mais ne sont pas prĂ©sents dans lâextraction locale de DbConnector.
Pour finaliser la mise Ă jour, vous devez lancer git submodule update
 :
$ git submodule update --init --recursive
Submodule path 'vendor/plugins/demo': checked out '48679c6302815f6c76f1fe30625d795d9e55fc56'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Notez que pour rester en sécurité, vous devriez lancer git submodule update
avec le drapeau --init
au cas oĂč les commits de ProjetPrincipal que vous venez de tirer ont ajoutĂ© des nouveaux sous-modules, et le drapeau --recursive
si certains sous-module ont des sous-modules imbriqués.
Si vous souhaitez automatiser ce processsus, vous pouvez ajouter le drapeau --recurse-submodules
Ă la commande git pull
(depuis Git 2.14).
Cela forcera Git Ă lancer git submodule update
juste aprĂšs le tirage, de maniĂšre Ă mettre Ă jour les sous-modules dans lâĂ©tat correct.
De plus, si vous voulez que Git tire toujours avec --recurse-submodules
, vous pouvez rĂ©gler lâoption de configuration submodule.recurse
Ă true (cela marche pour git pull
depuis Git 2.15).
Cette option forcera Git Ă utiliser le drapeau --recurse-submodules
pour toutes les commandes qui le supportent (Ă part clone
).
Il y a une situation spĂ©ciale qui peut arriver lors du tirage depuis le super-projet ; le dĂ©pĂŽt amont peut avoir modifiĂ© lâURL du sous-module dans le fichier .gitmodules
dans un des commits que vous tirez.
Cela peut arriver si le projet du sous-module change de plate-forme dâhĂ©bergement.
Dans ce dernier cas, il est possible pour git pull --recurse-submodules
, or git submodule update
, dâĂ©chouer si le super-projet fait rĂ©fĂ©rence Ă un commit dâun sous-module qui nâest pas trouvĂ© dans le serveur distant du sous-module configurĂ© localement dans votre dĂ©pĂŽt.
Pour corriger cette situation, la commande git submodule sync
est nécessaire :
# copier la nouvelle URL dans votre config locale
$ git submodule sync --recursive
# mettre Ă jour le sous-module depuis la nouvelle URL
$ git submodule update --init --recursive
Travailler sur un sous-module
Il y a fort Ă parier que si vous utilisez des sous-modules, vous le faites parce que vous souhaitez en rĂ©alitĂ© travailler sur le code du sous-module en mĂȘme temps que sur celui du projet principal (ou Ă travers plusieurs sous-modules). Sinon, vous utiliseriez plutĂŽt un outil de gestion de dĂ©pendances plus simple (tel que Maven ou Rubygems).
De ce fait, dĂ©taillons un exemple de modifications rĂ©alisĂ©es dans le sous-module en mĂȘme temps que dans le projet principal et de validation et de publication des modifications dans le mĂȘme temps.
JusquâĂ maintenant, quand nous avons lancĂ© la commande git submodule update
pour récupérer les modifications depuis les dépÎts des sous-modules, Git récupérait les modifications et mettait les fichiers locaux à jour mais en laissant le sous-répertoire dans un état appelé « HEAD détachée ».
Cela signifie quâil nây pas de branche locale de travail (comme master
, par exemple) pour y valider les modifications.
Donc, toutes les modifications que vous y faites ne sont pas suivies non plus.
Pour rendre votre sous-module plus adapté à la modification, vous avez besoin de deux choses.
Vous devez vous rendre dans chaque sous-module et extraire une branche de travail.
Ensuite vous devez dire Ă Git ce quâil doit faire si vous avez rĂ©alisĂ© des modifications et que vous lancez git submodule update --remote
pour tirer les modifications amont.
Les options disponibles sont soit de les fusionner dans votre travail local, soit de tenter de rebaser le travail local par dessus les modifications distantes.
En premier, rendons-nous dans le répertoire de notre sous-module et extrayons une branche.
$ git checkout stable
Basculement sur la branche 'stable'
Attaquons-nous au choix de politique de gestion.
Pour le spĂ©cifier manuellement, nous pouvons simplement ajouter lâoption --merge
Ă lâappel de update
.
Nous voyons ici quâune modification Ă©tait disponible sur le serveur pour ce sous-module et quâelle a Ă©tĂ© fusionnĂ©e.
$ git submodule update --remote --merge
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2)
DĂ©paquetage des objets: 100% (4/4), fait.
Depuis https://github.com/chaconinc/DbConnector
c87d55d..92c7337 stable -> origin/stable
Mise Ă jour de c87d55d..92c7337
Avance rapide
src/main.c | 1 +
1 file changed, 1 insertion(+)
chemin du sous-module 'DbConnector': fusionné dans '92c7337b30ef9e0893e758dac2459d07362ab5ea'
Si nous nous rendons dans le répertoire DbConnector
, les nouvelles modifications sont déjà fusionnées dans notre branche locale stable
.
Voyons maintenant ce qui arrive si nous modifions localement la bibliothĂšque et que quelquâun pousse une autre modification en amont dans le mĂȘme temps.
$ cd DbConnector/
$ vim src/db.c
$ git commit -am 'unicode support'
[stable f906e16] unicode support
1 file changed, 1 insertion(+)
Maintenant, si nous mettons Ă jour notre sous-module, nous pouvons voir ce qui arrive lors dâun rebasage de deux modifications concurrentes.
$ git submodule update --remote --rebase
PremiĂšrement, rembobinons head pour rejouer votre travail par-dessus...
Application : unicode support
chemin du sous-module 'DbConnector': rebasé dans '5d60ef9bbebf5a0c1c1050f242ceeb54ad58da94'
Si vous oubliez de spécifier --rebase
ou --merge
, Git mettra juste Ă jour le sous-module vers ce qui est sur le serveur et rĂ©initialisera votre projet Ă lâĂ©tat « HEAD dĂ©tachĂ©e ».
$ git submodule update --remote
chemin du sous-module 'DbConnector' : '5d60ef9bbebf5a0c1c1050f242ceeb54ad58da94' extrait
Si cela arrive, ne vous inquiétez pas, vous pouvez simplement revenir dans le répertoire et extraire votre branche (qui contiendra encore votre travail) et fusionner ou rebaser origin/stable
(ou la branche distante que vous souhaitez) Ă la main.
Si vous nâavez pas validĂ© vos modifications dans votre sous-module, et que vous lancez une mise Ă jour de sous-module qui causerait des erreurs, Git rĂ©cupĂ©rera les modifications mais nâĂ©crasera pas le travail non validĂ© dans votre rĂ©pertoire de sous-module.
$ git submodule update --remote
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 4 (delta 0)
DĂ©paquetage des objets: 100% (4/4), fait.
Depuis https://github.com/chaconinc/DbConnector
5d60ef9..c75e92a stable -> origin/stable
error: Vos modifications locales seraient écrasées par checkout:
scripts/setup.sh
Please, commit your changes or stash them before you can switch branches.
Aborting
Impossible d'extraire 'c75e92a2b3855c9e5b66f915308390d9db204aca' dans le chemin du sous-module 'DbConnector'
Si vous avez réalisé des modifications qui entrent en conflit avec des modifications amont, Git vous en informera quand vous mettrez à jour.
$ git submodule update --remote --merge
Auto-merging scripts/setup.sh
CONFLIT (contenu): Conflit de fusion dans scripts/setup.sh
La fusion automatique a échoué ; réglez les conflits et validez le résultat
Impossible de fusionner 'c75e92a2b3855c9e5b66f915308390d9db204aca' dans le chemin du sous-module 'DbConnector'
Vous pouvez vous rendre dans le répertoire du sous-module et résoudre le conflit normalement.
Publier les modifications dans un sous-module
Nous avons donc des modifications dans notre répertoire de sous-module, venant à la fois du dépÎt amont et de modifications locales non publiées.
$ git diff
Submodule DbConnector c87d55d..82d2ad3:
> Merge from origin/stable
> updated setup script
> unicode support
> remove unnessesary method
> add new option for conn pooling
Si nous validons dans le projet principal et que nous le poussons en amont sans pousser les modifications des sous-modules, les autres personnes qui voudront essayer notre travail vont avoir de gros problĂšmes vu quâelles nâauront aucun moyen de rĂ©cupĂ©rer les modifications des sous-modules qui en font partie. Ces modifications nâexistent que dans notre copie locale.
Pour ĂȘtre sur que cela nâarrive pas, vous pouvez demander Ă Git de vĂ©rifier que tous vos sous-modules ont Ă©tĂ© correctement poussĂ©s avant de pouvoir pousser le projet principal.
La commande git push
accepte un argument --recurse-submodules
qui peut avoir pour valeur « check » ou « on-demand ».
Lâoption « check » fera Ă©chouer push
si au moins une des modifications des sous-modules nâa pas Ă©tĂ© poussĂ©e.
$ git push --recurse-submodules=check
The following submodule paths contain changes that can
not be found on any remote:
DbConnector
Please try
git push --recurse-submodules=on-demand
or cd to the path and use
git push
to push them to a remote.
Comme vous pouvez le voir, il donne aussi quelques conseils utiles sur ce que nous pourrions vouloir faire ensuite. Lâoption simple consiste Ă se rendre dans chaque sous-module et Ă pousser manuellement sur les dĂ©pĂŽts distants pour sâassurer quâils sont disponibles publiquement, puis de rĂ©essayer de pousser le projet principal.
Lâautre option consiste Ă utiliser la valeur « on-demand » qui essaiera de faire tout ceci pour vous.
$ git push --recurse-submodules=on-demand
Pushing submodule 'DbConnector'
DĂ©compte des objets: 9, fait.
Delta compression using up to 8 threads.
Compression des objets: 100% (8/8), fait.
Ăcriture des objets: 100% (9/9), 917 bytes | 0 bytes/s, fait.
Total 9 (delta 3), reused 0 (delta 0)
To https://github.com/chaconinc/DbConnector
c75e92a..82d2ad3 stable -> stable
DĂ©compte des objets: 2, fait.
Delta compression using up to 8 threads.
Compression des objets: 100% (2/2), fait.
Ăcriture des objets: 100% (2/2), 266 bytes | 0 bytes/s, fait.
Total 2 (delta 1), reused 0 (delta 0)
To https://github.com/chaconinc/ProjetPrincipal
3d6d338..9a377d1 master -> master
Comme vous pouvez le voir, Git sâest rendu dans le module DbConnector
et lâa poussĂ© avant de pousser le projet principal.
Si la poussée du sous-module échoue pour une raison quelconque, la poussée du projet principal sera annulée.
Fusion de modifications de sous-modules
Si vous changez la rĂ©fĂ©rence dâun sous-module en mĂȘme temps quâune autre personne, il se peut que cela pose problĂšme. ParticuliĂšrement, si les historiques des sous-modules ont divergĂ© et sont appliquĂ©s Ă des branches divergentes dans un super-projet, rapprocher toutes les modifications peut demander un peu de travail.
Si un des commits est un ancĂȘtre direct dâun autre (câest-Ă -dire une fusion en avance rapide), alors Git choisira simplement ce dernier pour la fusion et cela se rĂ©soudra tout seul.
Cependant, Git ne tentera pas de fusion, mĂȘme trĂšs simple, pour vous. Si les commits dâun sous-module divergent et doivent ĂȘtre fusionnĂ©s, vous obtiendrez quelque chose qui ressemble Ă ceci :
$ git pull
remote: Counting objects: 2, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 2 (delta 1), reused 2 (delta 1)
DĂ©paquetage des objets: 100% (2/2), fait.
From https://github.com/chaconinc/ProjetPrincipal
9a377d1..eb974f8 master -> origin/master
Fetching submodule DbConnector
warning: Failed to merge submodule DbConnector (merge following commits not found)
Fusion automatique de DbConnector
CONFLIT (sous-module): Conflit de fusion dans DbConnector
La fusion automatique a échoué ; réglez les conflits et validez le résultat.
Donc, ce qui sâest passĂ© en substance est que Git a dĂ©couvert que les deux points de fusion des branches Ă fusionner dans lâhistorique du sous-module sont divergents et doivent ĂȘtre fusionnĂ©s. Il lâexplique par « merge following commits not found » (fusion suivant les commits non trouvĂ©e), ce qui nâest pas clair mais que nous allons expliquer dâici peu.
Pour rĂ©soudre le problĂšme, vous devez comprendre lâĂ©tat dans lequel le sous-module devrait se trouver.
Ătrangement, Git ne vous donne pas dâinformation utile dans ce cas, pas mĂȘme les SHA-1 des commits des deux cĂŽtĂ©s de lâhistorique.
Heureusement, câest assez facile Ă comprendre.
Si vous lancez git diff
, vous pouvez obtenir les SHA-1 des commits enregistrés dans chacune des branches que vous essayiez de fusionner.
$ git diff
diff --cc DbConnector
index eb41d76,c771610..0000000
--- a/DbConnector
+++ b/DbConnector
Donc, dans ce cas, eb41d76
est le commit dans notre sous-module que nous avions et c771610
est le commit amont.
Si nous nous rendons dans le rĂ©pertoire du sous-module, il devrait dĂ©jĂ ĂȘtre sur eb41d76
parce que la fusion ne lâa pas touchĂ©.
Sâil nây est pas, vous pouvez simplement crĂ©er et extraire une branche qui pointe dessus.
Ce qui importe, câest le SHA-1 du commit venant de lâautre branche. Câest ce que nous aurons Ă fusionner. Vous pouvez soit essayer de fusionner avec le SHA-1 directement ou vous pouvez crĂ©er une branche Ă partir du commit puis essayer de la fusionner. Nous suggĂ©rons dâutiliser cette derniĂšre mĂ©thode, ne serait-ce que pour obtenir un message de fusion plus parlant.
Donc, rendons-nous dans le répertoire du sous-module, créons une branche basée sur ce second SHA-1 obtenu avec git diff
et fusionnons manuellement.
$ cd DbConnector
$ git rev-parse HEAD
eb41d764bccf88be77aced643c13a7fa86714135
$ git branch try-merge c771610
$ git merge try-merge
Auto-merging src/main.c
CONFLICT (content): Merge conflict in src/main.c
Recorded preimage for 'src/main.c'
Automatic merge failed; fix conflicts and then commit the result.
Nous avons eu un conflit de fusion ici, donc si nous le résolvons et validons, alors nous pouvons simplement mettre à jour le projet principal avec le résultat.
$ vim src/main.c (1)
$ git add src/main.c
$ git commit -am 'fusion de nos modifications'
[master 9fd905e] fusion de nos modifications
$ cd .. (2)
$ git diff (3)
diff --cc DbConnector
index eb41d76,c771610..0000000
--- a/DbConnector
+++ b/DbConnector
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit eb41d764bccf88be77aced643c13a7fa86714135
-Subproject commit c77161012afbbe1f58b5053316ead08f4b7e6d1d
++Subproject commit 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a
$ git add DbConnector (4)
$ git commit -m "Fusion du travail de Tom" (5)
[master 10d2c60] Fusion du travail de Tom
-
Nous résolvons le conflit
-
Ensuite, nous retournons dans le projet principal
-
Nous pouvons revérifier les SHA-1
-
Nous rĂ©solvons lâentrĂ©e en conflit dans le sous-module
-
Enfin, nous validons la résolution.
Cela peut paraĂźtre compliquĂ© mais ce nâest pas trĂšs difficile.
Curieusement, il existe un autre cas que Git gĂšre seul. Si un commit de fusion existe dans le rĂ©pertoire du sous-module qui contient les deux commits dans ses ancĂȘtres, Git va le suggĂ©rer comme solution possible. Il voit quâĂ un certain point de lâhistorique du projet du sous-module, quelquâun a fusionnĂ© les branches contenant ces deux commits, donc vous dĂ©sirerez peut-ĂȘtre utiliser celui-ci.
Câest pourquoi le message dâerreur prĂ©cĂ©dent sâintitulait « merge following commits not found », parce que justement, il ne pouvait pas trouver le commit de fusion. Câest dĂ©routant car qui sâattendrait Ă ce quâil essaie de le chercher ?
Sâil trouve un seul commit de fusion acceptable, vous verrez ceci :
$ git merge origin/master
warning: Failed to merge submodule DbConnector (not fast-forward)
Found a possible merge resolution for the submodule:
9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a: > merged our changes
If this is correct simply add it to the index for example
by using:
git update-index --cacheinfo 160000 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a "DbConnector"
which will accept this suggestion.
Fusion automatique de DbConnector
CONFLIT (submodule): Conflit de fusion dans DbConnector
La fusion automatique a échoué ; réglez les conflits et validez le résultat.
Ce quâil suggĂšre de faire est de mettre Ă jour lâindex comme si vous aviez lancĂ© git add
, ce qui Ă©limine le conflit, puis de valider.
Vous ne devriez cependant pas le faire.
Vous pouvez plus simplement vous rendre dans le répertoire du sous-module, visualiser la différence, avancer en avance rapide sur le commit, le tester puis le valider.
$ cd DbConnector/
$ git merge 9fd905e
Mise Ă jour eb41d76..9fd905e
Avance rapide
$ cd ..
$ git add DbConnector
$ git commit -am 'Avance rapide sur un fils commun dans le sous-module'
Cela revient au mĂȘme, mais de cette maniĂšre vous pouvez au moins vĂ©rifier que ça fonctionne et vous avez le code dans votre rĂ©pertoire de sous-module quand câest terminĂ©.
Trucs et astuces pour les sous-modules
Il existe quelques commandes qui permettent de travailler plus facilement avec les sous-modules.
Submodule foreach
Il existe une commande submodule foreach
qui permet de lancer une commande arbitraire dans chaque sous-module.
Câest particuliĂšrement utile si vous avez plusieurs sous-modules dans le mĂȘme projet.
Par exemple, supposons que nous voulons développer une nouvelle fonctionnalité ou faire un correctif et que nous avons déjà du travail en cours dans plusieurs sous-modules. Nous pouvons facilement remiser tout le travail en cours dans tous les sous-modules.
$ git submodule foreach 'git stash'
Entering 'CryptoLibrary'
No local changes to save
Entering 'DbConnector'
Saved working directory and index state WIP on stable: 82d2ad3 Merge from origin/stable
HEAD is now at 82d2ad3 Merge from origin/stable
Ensuite, nous pouvons créer une nouvelle branche et y basculer dans tous nos sous-modules.
$ git submodule foreach 'git checkout -b featureA'
Entering 'CryptoLibrary'
Basculement sur la nouvelle branche 'featureA'
Entering 'DbConnector'
Basculement sur la nouvelle branche 'featureA'
Vous comprenez lâidĂ©e. Une commande vraiment utile permet de produire un joli diff unifiĂ© des modifications dans le projet principal ainsi que dans tous les sous-projets.
$ git diff; git submodule foreach 'git diff'
Submodule DbConnector contains modified content
diff --git a/src/main.c b/src/main.c
index 210f1ae..1f0acdc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -245,6 +245,8 @@ static int handle_alias(int *argcp, const char ***argv)
commit_pager_choice();
+ url = url_decode(url_orig);
+
/* build alias_argv */
alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1));
alias_argv[0] = alias_string + 1;
Entering 'DbConnector'
diff --git a/src/db.c b/src/db.c
index 1aaefb6..5297645 100644
--- a/src/db.c
+++ b/src/db.c
@@ -93,6 +93,11 @@ char *url_decode_mem(const char *url, int len)
return url_decode_internal(&url, len, NULL, &out, 0);
}
+char *url_decode(const char *url)
+{
+ return url_decode_mem(url, strlen(url));
+}
+
char *url_decode_parameter_name(const char **query)
{
struct strbuf out = STRBUF_INIT;
Ici, nous pouvons voir que nous dĂ©finissons une fonction dans un sous-module et que nous lâappelons dans le projet principal. Câest un exemple exagĂ©rĂ©ment simplifiĂ©, mais qui aide Ă mieux comprendre lâutilitĂ© de cette commande.
Alias utiles
Vous pourriez ĂȘtre intĂ©ressĂ© de dĂ©finir quelques alias pour des commandes longues pour lesquelles vous ne pouvez pas rĂ©gler la configuration par dĂ©faut. Nous avons traitĂ© la dĂ©finition dâalias Git dans Les alias Git, mais voici un exemple dâalias que vous pourriez trouver utiles si vous voulez travailler sĂ©rieusement avec les sous-modules de Git.
$ git config alias.sdiff '!'"git diff && git submodule foreach 'git diff'"
$ git config alias.spush 'push --recurse-submodules=on-demand'
$ git config alias.supdate 'submodule update --remote --merge'
De cette maniĂšre, vous pouvez simplement lancer git supdate
lorsque vous souhaitez mettre Ă jour vos sous-module ou git spush
pour pousser avec une gestion de dépendance de sous-modules.
Les problĂšmes avec les sous-modules
Cependant, utiliser des sous-modules ne se déroule pas sans accroc.
Commuter des branches
Commuter des branches qui contiennent des sous-modules peut Ă©galement sâavĂ©rer difficile. Si vous crĂ©ez une nouvelle branche, y ajoutez un sous-module, et revenez ensuite Ă une branche dĂ©pourvue de ce sous-module, vous aurez toujours le rĂ©pertoire de ce sous-module comme un rĂ©pertoire non suivi :
$ git --version
git version 2.12.2
$ git checkout -b add-crypto
Basculement sur la nouvelle branche 'add-crypto'
$ git submodule add https://github.com/chaconinc/CryptoLibrary
Cloning into 'CryptoLibrary'...
...
$ git commit -am 'adding crypto library'
[add-crypto 4445836] adding crypto library
2 files changed, 4 insertions(+)
create mode 160000 CryptoLibrary
$ git checkout master
warning: unable to rmdir CryptoLibrary: Directory not empty
Basculement sur la branche 'master'
Votre branche est Ă jour avec 'origin/master'.
$ git status
Sur la branche master
Votre branche est Ă jour avec 'origin/master'.
Fichiers non suivis :
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
CryptoLibrary/
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents (utilisez "git add" pour les suivre)
Supprimer le rĂ©pertoire nâest pas difficile, mais sa prĂ©sence est assez dĂ©routante.
Si vous le supprimez puis que vous rebasculez sur la branche qui contient le sous-module, vous devrez lancer submodule update --init
pour le réalimenter.
$ git clean -ffdx
Suppression de CryptoLibrary/
$ git checkout add-crypto
Basculement sur la branche 'add-crypto'
$ ls CryptoLibrary/
$ git submodule update --init
Submodule path 'CryptoLibrary': checked out 'b8dda6aa182ea4464f3f3264b11e0268545172af'
$ ls CryptoLibrary/
Makefile includes scripts src
Une fois de plus, ce nâest pas rĂ©ellement difficile, mais cela peut ĂȘtre dĂ©routant.
Les nouvelles versions de Git (Git >= 2.13) simplifie tout ceci en ajoutant le drapeau --recurse-submodules
Ă la commande git checkout
, qui sâoccupe de placer les sous-modules dans le bon Ă©tat pour la branche sur laquelle nous commutons.
$ git --version
git version 2.13.3
$ git checkout -b add-crypto
Basculement sur la branche 'add-crypto'
$ git submodule add https://github.com/chaconinc/CryptoLibrary
Clonage dans 'CryptoLibrary'...
...
$ git commit -am 'Add crypto library'
[add-crypto 4445836] Add crypto library
2 files changed, 4 insertions(+)
create mode 160000 CryptoLibrary
$ git checkout --recurse-submodules master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Utiliser le drapeau --recurse-submodules
de git checkout
peut aussi ĂȘtre utile quand vous travaillez sur plusieurs branches dans les super-projet, chacune aillant votre sous-module pointant sur des commits diffĂ©rents.
En fait, si vous commutez de branches qui enregistrent le sous-module Ă diffĂ©rents commits, Ă lâexĂ©cution de git status
le sous-module apparaßtra comme « modified », et indique « new commits » (nouveaux commits).
Câest parce que lâĂ©tat du sous-module nâest pas gĂ©rĂ© par dĂ©faut lors du basculement de branches.
Cela peut ĂȘtre vraiment dĂ©routant, donc câest toujours une bonne idĂ©e de toujours lancer git checkout --recurse-submodules
quand votre projet a des sous-modules.
Pour les versions anciennes de Git qui nâont pas de drapeau --recurse-submodules
, aprĂšs lâextraction, vous pouvez utiliser git submodule update --init --recursive
pour placer les sous-modules dans le bon Ă©tat.
Par chance, vous pouvez indiquer Ă Git (>=2.14) de toujours utiliser le drapeau --recurse-submodules
en paramĂ©trant lâoption de configuration submodule.recurse
 : git config submodule.recurse true
.
Comme notĂ© ci-dessus, cela forcera auss Git Ă parcourir rĂ©cursivement les sous-modules pour toute commande qui accepte lâoption --recurse-submodules
(excepté git clone
).
Basculer dâun sous-rĂ©pertoire Ă un sous-module
Une autre difficulté commune consiste à basculer de sous-répertoires en sous-modules.
Si vous suiviez des fichiers dans votre projet et que vous voulez les dĂ©placer dans un sous-module, vous devez ĂȘtre trĂšs prudent ou Git sera inflexible.
Présumons que vous avez les fichiers dans un sous-répertoire de votre projet, et que vous voulez les transformer en un sous-module.
Si vous supprimez le sous-répertoire et que vous exécutez submodule add
, Git vous hurle dessus avec :
$ rm -Rf CryptoLibrary/
$ git submodule add https://github.com/chaconinc/CryptoLibrary
'CryptoLibrary' already exists in the index
Vous devez dâabord supprimer le rĂ©pertoire CryptoLibrary
de lâindex.
Vous pourrez ensuite ajouter le sous-module :
$ git rm -r CryptoLibrary
$ git submodule add https://github.com/chaconinc/CryptoLibrary
Cloning into 'CryptoLibrary'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
Unpacking objects: 100% (11/11), done.
Checking connectivity... done.
Maintenant, supposons que vous avez fait cela dans une branche. Si vous essayez de basculer dans une ancienne branche oĂč ces fichiers sont toujours dans lâarbre de projet plutĂŽt que comme sous-module, vous aurez cette erreur :
$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
CryptoLibrary/Makefile
CryptoLibrary/includes/crypto.h
...
Please move or remove them before you can switch branches.
Aborting
Vous pouvez le forcer Ă basculer avec checkout -f
, mais soyez attentif Ă ce quâil soit propre ou les modifications seraient Ă©crasĂ©es.
$ git checkout -f master
warning: unable to rmdir CryptoLibrary: Directory not empty
Basculement sur la branche 'master'
Ensuite, lorsque vous rebasculez, vous aurez un répertoire CryptoLibrary
vide et git submodule update
pourrait ne pas le remettre en Ă©tat.
Vous allez devoir vous rendre dans le répertoire de votre sous-module et lancer git checkout .
pour retrouver tous vos fichiers.
Vous pouvez lancer ceci dans un script submodule foreach
dans le cas de multiples sous-modules.
Il est important de noter que depuis les versions de Git récentes, les sous-modules conservent leurs données Git dans le répertoire .git
du projet principal, ce qui Ă la diffĂ©rence des versions antĂ©rieures, permet de supprimer le dossier du sous-module sans perdre les commits et les branches quâil contenait.
Avec ces outils, les sous-modules peuvent ĂȘtre une mĂ©thode assez simple et efficace pour dĂ©velopper simultanĂ©ment sur des projets connexes mais sĂ©parĂ©s.