web-dev-qa-db-fra.com

erreur irrécupérable de la mise à jour du sous-module git: la référence n'est pas un arbre

user$ Sudo git submodule update
fatal: reference is not a tree: a094dcfeeb43fcd62a9e466156e05e7581026f33
Unable to checkout 'a094dcfeeb43fcd62a9e466156e05e7581026f33' in submodule path 'client/src/util'

Que fais-je? Je veux juste obtenir une copie vierge du dernier code de la pension, cela ne me dérange pas de perdre mes modifications. Comme vous pouvez le constater, je ne suis clairement pas sûr de ce qui se passe. Je ne peux que penser qu'il essaie d'extraire un fichier, ce qui signifie que git a détecté une modification locale d'un fichier sur ma machine locale.

j'utilise actuellement OSX

29
bouncingHippo

C'est le problème le plus courant avec les sous-modules. Le commit sur lequel vous vous trouvez dans le référentiel externe contient une référence à un commit dans le sous-module que quelqu'un n'a pas encore mis en place. C'est un problème de dépendance. Toujours pousser de l'intérieur vers l'extérieur. Ce n'est probablement pas quelque chose que vous avez fait de mal, mais quelqu'un d'autre qui travaille dans le référentiel. Ils étaient négligés et ont oublié d'émettre Push sur le sous-module et ont juste poussé le référentiel contenant. Les choses fonctionnent sur leur machine car ils ont effectué le changement et ces commits existent là. Allez les gifler et dites-leur de reporter leurs modifications de sous-modules :)

Sinon, cela pourrait être de votre faute si vous travailliez sur une autre machine et que vous avez oublié de transmettre les modifications du sous-module. Maintenant, vous êtes à l'autre endroit et pensez "WTF! Ce sont mes changements et ils devraient fonctionner ici aussi!" 

51
Adam Dymitruk

La plupart du temps, ce sera le cas décrit par Adam Dymitruk, mais un autre cas pouvant en être la cause est le changement de branche dont les sous-modules ont changé de télécommandes. En effet, la mise à jour du sous-module essaie simplement de vérifier le commit, mais ne le pourra pas avant d’ajouter et d’extraire la nouvelle télécommande.

Vous pouvez le vérifier en consultant le fichier .gitmodules et en comparant l'URL des sous-modules à celle indiquée en cd'ing dans le sous-module et en effectuant un git remote -v

Dans ce cas, vous devrez exécuter git submodule sync pour informer le sous-module de la modification à distance, suivi de git submodule update --init --recursive pour supprimer cette erreur.

23
Michael Chinen

L'erreur signifie que la validation spécifique (son sha1) n'est accessible depuis aucune des références lors du clonage de votre sous-module. Vous devez donc mettre à jour votre sous-module avec une référence valide ou rétablir les modifications à la dernière version.

Cela peut arriver lorsque vous avez de nouveaux commits dans votre fork, local ou que vous avez inclus des références à votre HEAD détaché, mais que vous ne les avez pas insérées dans votre référentiel principal vers lequel l'URL git du sous-module pointe.

Pour réinitialiser manuellement le sous-module sur Origine/maître, entrez le sous-répertoire du sous-module et effectuez la réinitialisation, par exemple.

cd client/src/util
git reset Origin/master --hard

Si vous souhaitez corriger la référence dans le référentiel principal, validez les modifications ci-dessus:

# Still in submodule dir.
git pull Origin master # In submodule dir.
git Push Origin master
cd - # Go back to the main repo dir.
git status
git commit -am 'Update submodule refs'
git Push

Si vous souhaitez tirer et pousser les références de fork à Origin, vous pouvez essayer:

cd client/src/util # Go to submodule dir again.
git remote add fork [email protected]:example/foo.git
git pull fork master
git show a094dcfeeb43fcd62a9e466156e05e7581026f33 # Check previously missing sha1. 
git Push Origin master:master # Or: master:some_branch
1
kenorb

En plus des réponses d'Adam Dymitruk et de Michael Chinen, j'ai rencontré ce problème en raison de la longueur maximale du chemin Windows. Si j'essaie de cloner un référentiel particulier comportant des sous-modules profonds à 3 niveaux, dans mon répertoire Documents/Visual Studio 2013/Projects, j'obtiens fatal: reference is not a tree. Mais si je répète exactement le même clone dans mon répertoire personnel, cela fonctionne correctement.

1
Edward Ned Harvey

Il est probable que votre référentiel de sous-modules ne comporte aucune révision référentielle externe référencée. Et il peut également être non disponible sur la télécommande spécifiée pour le sous-module ou ne pas avoir configuré à distance pour le sous-module. Vous pouvez essayer d'aller dans client/src/util et git fetch ici.

(pourquoi avez-vous Sudo cela? s'il appartient à root, pourquoi n'êtes-vous pas dans Shell et sinon, pourquoi passez-vous à root?)