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é.
où 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.
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.
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.
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.