En supposant que le référentiel du sous-module contient une validation que vous souhaitez utiliser (contrairement à la validation qui est référencée à partir de l'état actuel du super-projet), il existe deux façons de le faire.
La première nécessite que vous connaissiez déjà le commit du sous-module que vous souhaitez utiliser. Il fonctionne de «l'intérieur, de l'extérieur» en ajustant directement le sous-module puis en mettant à jour le super-projet. Le second fonctionne de «l'extérieur vers l'intérieur» en trouvant la validation du super-projet qui a modifié le sous-module, puis en réinitialisant l'index du super-projet pour faire référence à une autre validation de sous-module.
À l'envers
Si vous savez déjà que vous voulez engager le sous - module à l' utilisation, cd
à la sous - module, consultez la vous vous engagez voulez, puis git add
et git commit
revenir dans le super-projet.
Exemple:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Oups, quelqu'un a effectué un commit de super-projet qui fait référence à un commit non publié dans le sous-module sub
. D'une manière ou d'une autre, nous savons déjà que nous voulons que le sous-module soit validé 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Allez-y et vérifiez-le directement.
Commander dans le sous-module
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
Puisque nous vérifions un commit, cela produit un HEAD détaché dans le sous-module. Si vous voulez vous assurer que le sous-module utilise une branche, utilisez ensuite git checkout -b newbranch <commit>
pour créer et extraire une branche lors de la validation ou extraire la branche que vous souhaitez (par exemple, une avec la validation souhaitée à la pointe).
Mettre à jour le Super-projet
Une extraction dans le sous-module se reflète dans le super-projet en tant que modification de l'arborescence de travail. Nous devons donc mettre en scène le changement dans l'index du super-projet et vérifier les résultats.
$ git add sub
Vérifiez les résultats
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
La mise à jour du sous-module était silencieuse car le sous-module est déjà à la validation spécifiée. Le premier diff montre que l'index et l'arbre de travail sont identiques. Le troisième diff montre que le seul changement par étapes consiste à déplacer le sub
sous - module vers un commit différent.
Commettre
git commit
Cela valide l'entrée de sous-module fixe.
Dehors dans
Si vous n'êtes pas sûr de la validation que vous devez utiliser à partir du sous-module, vous pouvez consulter l'historique du superprojet pour vous guider. Vous pouvez également gérer la réinitialisation directement à partir du super-projet.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
C'est la même situation que ci-dessus. Mais cette fois, nous allons nous concentrer sur la fixation du super-projet au lieu de plonger dans le sous-module.
Retrouvez le Errant Commit du Super-projet
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK, on dirait qu'il a mal tourné ce5d37c
, nous allons donc restaurer le sous-module à partir de son parent ( ce5d37c~
).
Alternativement, vous pouvez prendre la validation du sous-module à partir du texte du patch ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) et utiliser à la place le processus ci-dessus «dedans, dehors».
Commander dans le Super-projet
$ git checkout ce5d37c~ -- sub
Cela réinitialise l'entrée du sous-module pour sub
ce qu'elle était lors de la validation ce5d37c~
dans le super-projet.
Mettre à jour le sous-module
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
La mise à jour du sous-module s'est bien passée (elle indique une tête détachée).
Vérifiez les résultats
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Le premier diff montre que sub
c'est maintenant la même chose dans ce5d37c~
. Le deuxième diff montre que l'index et l'arbre de travail sont les mêmes. Le troisième diff montre que le seul changement par étapes consiste à déplacer le sub
sous - module vers un autre commit.
Commettre
git commit
Cela valide l'entrée de sous-module fixe.