web-dev-qa-db-fra.com

Pourquoi git ne parvient-il pas à récupérer un sous-module valide spécifique pour un commit donné et comment le corriger?

J'ai un référentiel git qui en a un autre en tant que dépendance submodule. À la racine de mon projet (où le .git, .gitsubmodules etc. sont) j'ai appelé

git submodule update

Cela a échoué avec le message suivant:

Récupéré dans le chemin du sous-module 'src/framework', mais il ne contenait pas cc8c38e9d853491c672452d8dbced4666fc73ec8. La récupération directe de ce commit a échoué.

src/framework est un sous-répertoire de mon projet (PROJECT_ROOT/src/framework) et devrait se trouver là où le repo tiers atterrit. Le hachage de validation donné est valide.

J'ai aussi essayé git clone --recursive <my-repo> mais ça échoue aussi.

Le contenu de mon .gitsubmodules est

[submodule "src/framework"]
        path = src/framework
        url = [email protected]:gh/framework.git

En plus de cela, je dois noter le fait important suivant: en raison des mises à jour récentes dans le repo framework, mon code se casse donc j'ai vraiment besoin de récupérer cette version spécifique là où les choses fonctionnaient bien.

29
rbaleksandar

Oui, je peux suivre le lien dans mon navigateur Web (en utilisant GitLab)

Pouvez-vous cloner ce dépôt, avec ce commit inclus?
GitLab a niveau d'autorisation qui restreindra l'accès, alors assurez-vous que vos commandes git clone sont exécutées avec le bon utilisateur et avec les clés ssh dans ledit user home directory/.ssh.

Si vous ne pouvez pas cloner le référentiel de sous-module vous-même (à n'importe quel endroit sur votre disque dur local), cela expliquerait le message d'erreur.

Le problème est venu de quelqu'un qui a réinitialisé la tête d'un commit avant celui qui était lié en tant que sous-module dans le référentiel avec lequel je travaillais. Cela a rendu la référence invalide. Je ne sais pas comment résoudre ce problème

Vous pouvez assurez-vous que le sous-module suit une branche (ici, par exemple, master):

cd /path/to/parent/repo
git config -f .gitmodules submodule.bar1.branch master

Mettez ensuite à jour le sous-module au dernier commit récupéré master

git submodule update --remote

Le --remote option garantit qu'il n'utilisera pas le SHA-1 enregistré du superprojet pour mettre à jour le sous-module, mais utilisera le statut de la télécommande du sous-module -branche de suivi à la place.

Cela éviterait le "did not contain cc8c38e9d853491c672452d8dbced4666fc73ec8" Message d'erreur.

20
VonC

L'exécution de cette commande après le clonage (et la réception de l'erreur) a résolu mon problème:

git submodule update --force --recursive --init --remote

Bien sûr, ce n'est pas une bonne solution. Il vaut mieux trouver et résoudre le problème sous-jacent, mais si quelqu'un est pressé, cela a fonctionné pour moi.

6
Alim Giray Aytar

Le problème pour moi était que le sous-module pointait vers un référentiel personnel (clone d'un) hébergé sur github.

J'avais plusieurs référentiels Host contenant une référence au même sous-module. J'avais changé le HEAD du sous-module dans l'un de ces référentiels et commis le référentiel. Malheureusement, j'avais négligé de pousser le nouveau sous-module HEAD vers github, donc les autres instances du référentiel n'avaient pas d'enregistrement de la dernière tête, même après git submodule update etc.

0
EoghanM