343 votes

La tête de sous-module Git 'référence n'est pas un arbre' erreur

J'ai un projet avec un sous-module qui pointe vers une défaillance de s'engager: le sous-module s'engager demeurait locale et quand j'essaie de l'extraire à partir d'un autre repo-je obtenir:

$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'

Je sais ce que le sous-module TÊTE doit être, est-il un moyen pour que je puisse modifier localement, sans pousser de le repo qui n' ont commettre 2d7cfbd09fc96c04c4c41148d44ed7778add6b43 ?

Je ne sais pas si je suis clair... voici une situation similaire, j'ai trouvé.

398voto

Chris Johnsen Points 50064

En supposant que le sous-module du référentiel contient un commit que vous voulez utiliser (à la différence de la validation qui est référencé à partir de l'état actuel de la super-projet), il y a deux façons de le faire.

La première exige que vous connaissez déjà de la validation de la sous-module que vous souhaitez utiliser. Il fonctionne à partir de l' "à l'intérieur," par l'ajustement direct des sous-module de mise à jour de la super-projet. La seconde fonctionne à partir de la "dehors, dans les" par trouver le super-projet de s'engager à ce que modifié le sous-module et ensuite mettre à zéro les super-projet de l'index pour faire référence à un autre sous-module s'engager.

À L'Intérieur,

Si vous savez déjà qui commit, vous voulez que le sous-module à utiliser, cd pour le sous-module, découvrez le commit que vous voulez, alors git add et git commit 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 fait un super-projet de commettre, qui fait référence à un inédit de validation dans la sous-module sub. D'une certaine manière, nous savons déjà que nous voulons que le sous-module pour être à commettre 5d5a3ee314476701a20f2c6ec4a53f88d651df6c. Allez-y et vérifier directement.

La caisse 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 ..

Depuis que nous avons sont à la recherche d'un commit, ce qui produit un décollement de la TÊTE dans le sous-module. Si vous voulez vous assurer que le sous-module est à l'aide d'une branche, puis utilisez git checkout -b newbranch <commit> de créer et de commander une branche à la validation ou la caisse de la branche que vous voulez (par exemple avec l'souhaité s'engager à la pointe).

Mise à jour le Super-projet

Une caisse dans le sous-module est reflété dans le super-projet comme une modification de l'arbre de travail. Nous avons donc besoin de mettre en scène le changement dans le super-projet de l'index et de vérifier les résultats.

$ git add sub

Vérifier 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

Le sous-module de mise à jour a été silencieux parce que le sous-module est déjà à la commettre. Le premier diff montre que l'index et worktree sont les mêmes. La troisième diff montre que la seule mise en scène de changement est le déplacement de la sub sous-module à un autre commit.

S'engager

git commit

Cela engage l'fixe jusqu'sous-module d'entrée.


À L'Extérieur, Dans

Si vous ne savez pas qui vous engage doit utiliser à partir de la sous-module, vous pouvez regarder l'histoire dans le superproject pour vous guider. Vous pouvez également gérer la réinitialisation directement à partir de la 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 de la super-projet au lieu de puiser dans le sous-module.

Trouver le Super-projet de l'Errant s'Engager

$ 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, il semble comme il est allé de mal en ce5d37c, de sorte que nous allons restaurer le sous-module de son parent (ce5d37c~).

Alternativement, vous pouvez prendre le sous-module du a commis depuis le patch de texte (5d5a3ee314476701a20f2c6ec4a53f88d651df6c) et le "dedans, dehors".

La caisse de la Super-projet

$ git checkout ce5d37c~ -- sub

Cette remise à zéro de la sous-module d'entrée pour sub de ce qu'elle était à s'engager ce5d37c~ dans le super-projet.

Mise à jour le sous-module

$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'

Le sous-module de mise à jour est OK (il indique un décollement de la TÊTE).

Vérifier 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 qu' sub est maintenant la même chose en ce5d37c~. La deuxième diff montre que l'index et worktree sont les mêmes. La troisième diff montre la seule mise en scène de changement est le déplacement de la sub sous-module à un autre commit.

S'engager

git commit

Cela engage l'fixe jusqu'sous-module d'entrée.

194voto

Lonre Wang Points 1262

Essayez ceci :

18voto

Daniel Tsadok Points 270

Cette erreur peut signifier que le commit est manquant dans le sous-module. Qui est, le référentiel (a) est un sous-module (B). Un veut se charger de B, de sorte qu'il pointe vers un certain commit (en B). Si cette validation est en quelque sorte manquant, vous obtiendrez cette erreur. Une fois la cause possible: la référence à la validation a été poussé dans Un, mais la validation ne soit pas poussé à partir de B. Alors j'aimerais commencer par là.

Moins probable, il y a un problème d'autorisations, et que la livraison ne peut pas être tiré (possible si vous utilisez git+ssh).

Assurez-vous que le sous-module des chemins de regarder ok .git/config et .gitmodules.

Une dernière chose à faire - à l'intérieur de la sous-module répertoire: git reset --hard HEAD

7voto

Plato Points 2843

J’ai eu cette erreur quand j’ai fait :

mais la validation dans le projet parent pointait une validation antérieure.
Suppression du dossier sous-module et en cours d’exécution

n’a pas résolu le problème. J’ai supprimé le repo et réessayé sans l’indicateur de profondeur et cela a fonctionné.

5voto

pasamio Points 41

Cela peut également se produire lorsque vous avez un sous-module pointant vers un référentiel qui a été redéfini et la validation de donnée est « gone ». La validation est peut-être encore dans le référentiel distant, il n’est pas dans une branche. Si vous ne pouvez pas créer une nouvelle branche (par exemple pas votre référentiel), vous êtes coincé avec le devoir de mettre à jour le projet super pour pointer vers une nouvelle validation. Alternativement, vous pouvez pousser l’un de vos copies des sous-modules ailleurs et puis mettre à jour le projet Super pour pointer vers ce référentiel à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X