web-dev-qa-db-fra.com

Impossible de commander le chemin du sous-module git

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:

  1. Origin (ma fourche Git)
  2. upstream (projet repo)

Sous-module "module", a télécommandes:

  1. Origin (ma fourche Git)
  2. upstream (projet repo)

Est-ce que quelqu'un sait ce qui cause mon problème?

31
Richard Tuin

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.

36
thaller

Assurez-vous que les sous-modules ont été poussés

cd submodule-dir
git Push

Dans mon cas, j'avais:

  • engagé dans le sous-module
  • pas poussé
  • commis au parent avec les sous-modules mis à jour
  • poussé le parent

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

1
Aleksey Bykov

J'ai eu le même problème et j'ai résolu d'ajouter un nouveau commit pour le projet parent et Push allCheck the Subproject commit and commit from your module

1
protonss

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).

0
Ben Kreeger

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.

0
Rock Lee

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.

0
parasrish