J'ai un problème lorsque je travaille avec des sous-modules git.
Chaque fois que je reçois une nouvelle référence de sous-module du référentiel en amont, l'exécution de git submodule update
donne le résultat suivant:
fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path'
Il est important de noter que le sous-module comporte plusieurs télécommandes, dont la télécommande en amont doit être utilisée pour mettre à jour l'arborescence de référence des sous-modules. Je suppose que mon problème est là, mais je ne suis pas sûr.
Ma configuration est la suivante:
Projet Git
Télécommandes:
Origin
(ma fourche Git)upstream
(projet repo)Sous-module "module", a télécommandes:
Origin
(ma fourche Git)upstream
(projet repo)Est-ce que quelqu'un sait ce qui cause mon problème?
Lors de l'exécution de git submodule update
, git essaie d'extraire le commit/arbre qui est enregistré dans le super projet (dans votre exemple, celui avec commit id dd208d4...
)
Je pense que vous obtenez l'erreur car dans le sous-module, aucun objet de ce type n'est présent. Vous devez vous assurer qu'il est là. Habituellement, cela signifie que vous devez d'abord aller le chercher à partir d'une télécommande.
Probablement vous devez
git submodule foreach git fetch
git submodule update
ou peut-être
git fetch --recurse-submodules
En supposant que le sous-module est configuré, afin qu'il puisse récupérer le commit manquant à partir de la variable Origin
distante. En fin de compte, vous devez savoir où vous pouvez récupérer le commit manquant et vous devez l’obtenir.
Vous pouvez vérifier si vous avez dd208d4...
en faisant quelque chose comme:
cd ./module
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Une cause possible d'un tel problème est que celui qui a publié le nouveau commit à partir du super module n'a pas publié les commits nécessaires à partir du sous-module. Il doit d'abord publier les commits du sous-module.
Assurez-vous que les sous-modules ont été poussés
cd submodule-dir
git Push
Dans mon cas, j'avais:
il n’est donc pas étonnant qu’on ne puisse pas le trouver.
Ensuite, si vous utilisez une interface Web telle que GitHub, vous pouvez également accéder à la page Web du référentiel de sous-modules et vérifier que la validation dont vous avez besoin y figure.
Push.recurseSubmodules on-demand
Il est possible d'automatiser davantage les envois avec:
git Push --recurse-submodules=on-demand
qui pousse également les sous-modules selon les besoins, ou à partir de 2.7:
git config Push.recurseSubmodules on-demand
git Push
viens de voir ce problème quand j'ai oublié de pousser les changements dans un de mes sous-modules
assurez-vous que les changements sont poussés
J'ai eu le même problème et j'ai résolu d'ajouter un nouveau commit pour le projet parent et Push all
Mon problème est que, sur un cat .gitmodules
de mon repo, je pointais sur la mauvaise télécommande pour le repo du sous-module (je l'avais initialement copié avec la télécommande d'origine, mais j'ai ensuite basculé sur une branche; le fichier gitmodules
n'a jamais été mis à jour pour refléter changement).
Mon problème était que j'avais des modifications non validées dans les sous-modules de leurs fichiers build.gradle (qui, je pense, ont été automatiquement modifiés). Ils sont apparus dans le git diff
. Je viens de faire git checkout .
pour réinitialiser les dépôts du sous-module afin qu’ils ne subissent aucun changement, puis le git submodule update
fonctionnait.
Une autre solution pourrait être, sans les options git de la ligne de commande, mais de le faire manuellement . Le scénario se produit généralement lorsque les chemins des sous-modules ont été déplacés/remplacés (mais pas correctement), pointant ainsi les anciennes références dans les dépôts de caisse locaux.
1) Localisez le référentiel et le sous-module
ls -la .git/modules
rm -f .git/modules/<module-with-issue>
2) Supprimer les anciennes configurations de sous-modules locaux
gedit .git/config
(supprimez l'entrée de l'URL du sous-module ici)
Cela ressemble à quelque chose comme ça;
*[submodule "module-with-issue"]
url = ...*
3) Maintenant, récupérez et mettez à jour les sous-modules fraîchement aller chercher Mise à jour du sous-module git --recursive --init
Remarque: Il peut également être nécessaire de supprimer le dossier de sous-module extrait localement dans votre référentiel avant toute tentative de mise à jour du sous-module.