J'ai un projet avec un sous-module qui pointe vers un commit invalide: le commit du sous-module est resté local et quand j'essaye de le récupérer dans un autre dépôt, j'obtiens:
$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'
Je sais ce que le chef de sous - module devrait être, est - il possible que je peux changer ce localement, sans pousser de la prise en pension qui ne se sont engager 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
?
Je ne suis pas sûr d'être clair ... voici une situation similaire que j'ai trouvée.
git
git-submodules
Mauricio Scheffer
la source
la source
Réponses:
En supposant que le référentiel du sous-module contient une validation que vous souhaitez utiliser (contrairement à la validation qui est référencée à partir de l'état actuel du super-projet), il existe deux façons de le faire.
La première nécessite que vous connaissiez déjà le commit du sous-module que vous souhaitez utiliser. Il fonctionne de «l'intérieur, de l'extérieur» en ajustant directement le sous-module puis en mettant à jour le super-projet. Le second fonctionne de «l'extérieur vers l'intérieur» en trouvant la validation du super-projet qui a modifié le sous-module, puis en réinitialisant l'index du super-projet pour faire référence à une autre validation de sous-module.
À l'envers
Si vous savez déjà que vous voulez engager le sous - module à l' utilisation,
cd
à la sous - module, consultez la vous vous engagez voulez, puisgit add
etgit commit
revenir dans le super-projet.Exemple:
Oups, quelqu'un a effectué un commit de super-projet qui fait référence à un commit non publié dans le sous-module
sub
. D'une manière ou d'une autre, nous savons déjà que nous voulons que le sous-module soit validé5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Allez-y et vérifiez-le directement.Commander dans le sous-module
Puisque nous vérifions un commit, cela produit un HEAD détaché dans le sous-module. Si vous voulez vous assurer que le sous-module utilise une branche, utilisez ensuite
git checkout -b newbranch <commit>
pour créer et extraire une branche lors de la validation ou extraire la branche que vous souhaitez (par exemple, une avec la validation souhaitée à la pointe).Mettre à jour le Super-projet
Une extraction dans le sous-module se reflète dans le super-projet en tant que modification de l'arborescence de travail. Nous devons donc mettre en scène le changement dans l'index du super-projet et vérifier les résultats.
Vérifiez les résultats
La mise à jour du sous-module était silencieuse car le sous-module est déjà à la validation spécifiée. Le premier diff montre que l'index et l'arbre de travail sont identiques. Le troisième diff montre que le seul changement par étapes consiste à déplacer le
sub
sous - module vers un commit différent.Commettre
Cela valide l'entrée de sous-module fixe.
Dehors dans
Si vous n'êtes pas sûr de la validation que vous devez utiliser à partir du sous-module, vous pouvez consulter l'historique du superprojet pour vous guider. Vous pouvez également gérer la réinitialisation directement à partir du super-projet.
C'est la même situation que ci-dessus. Mais cette fois, nous allons nous concentrer sur la fixation du super-projet au lieu de plonger dans le sous-module.
Retrouvez le Errant Commit du Super-projet
OK, on dirait qu'il a mal tourné
ce5d37c
, nous allons donc restaurer le sous-module à partir de son parent (ce5d37c~
).Alternativement, vous pouvez prendre la validation du sous-module à partir du texte du patch (
5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) et utiliser à la place le processus ci-dessus «dedans, dehors».Commander dans le Super-projet
Cela réinitialise l'entrée du sous-module pour
sub
ce qu'elle était lors de la validationce5d37c~
dans le super-projet.Mettre à jour le sous-module
La mise à jour du sous-module s'est bien passée (elle indique une tête détachée).
Vérifiez les résultats
Le premier diff montre que
sub
c'est maintenant la même chose dansce5d37c~
. Le deuxième diff montre que l'index et l'arbre de travail sont les mêmes. Le troisième diff montre que le seul changement par étapes consiste à déplacer lesub
sous - module vers un autre commit.Commettre
Cela valide l'entrée de sous-module fixe.
la source
e47c0a
une validation qui n'existe pas dans le référentiel localsub
, mais le super-projetsub
pointe vers cette validation. Cela peut se produire parce que quelqu'un d'autre a créée47c0a
dans sa copie desub
, mis à jour son super-projet pour pointer vers cette validation et a poussé le super-projet sans poussere47c0a
vers le référentiel central / partagé poursub
. Lorsque nous tirons du super-projet central / partagé, nous obtenons un commit qui pointesub
verse47c0a
, mais nous ne pouvons pas «voir» ce commit.ce5d37c
est suspect car, sur la base du diff, il a introduite47c0a
.sub
conservation dans le référentiel parent qui l'a comme sous-module, et s'il peut être manipulé directement vers la tête actuelle desub
directement, sans s'appuyer sur un état plus ancien du parent repo, qui peut ne pas toujours aider.essaye ça:
la source
git submodule sync
est nécessaire dans les scénarios où l'URL de la télécommande pour un sous-module donné a changé. Dans notre cas, nous avions ajouté notre sous-module à partir d'un dépôt public, puis changé l'URL en un fork privé - et nous nous sommes mis dans ce cornichon particulier.Cette erreur peut signifier qu'un commit est manquant dans le sous-module. Autrement dit, le référentiel (A) a un sous-module (B). A veut charger B pour qu'il pointe vers un certain commit (en B). Si cette validation est manquante, vous obtiendrez cette erreur. Autrefois cause possible: la référence au commit a été poussée dans A, mais le commit réel n'a pas été poussé depuis B. Donc je commencerais par là.
Moins probablement, il y a un problème d'autorisations et la validation ne peut pas être extraite (possible si vous utilisez git + ssh).
Assurez-vous que les chemins des sous-modules semblent corrects dans .git / config et .gitmodules.
Une dernière chose à essayer - dans le répertoire du sous-module: git reset HEAD --hard
la source
Cause possible
Cela peut se produire lorsque:
par exemple quelque chose comme ça s'est produit:
Devrait avoir poussé le sous-module à ce stade.
Par conséquent, les validations manquantes n'ont pas pu être trouvées par l'utilisateur distant car elles se trouvent toujours sur le disque local.
Solution
Informer la personne qui a modifié le sous-module pour pousser, c'est-à-dire
la source
J'ai eu cette erreur quand j'ai fait:
mais la validation dans le projet parent pointait vers une validation antérieure.
Suppression du dossier du sous-module et exécution:
n'a PAS résolu le problème. J'ai supprimé le dépôt et réessayé sans l'indicateur de profondeur et cela a fonctionné.
Cette erreur se produit dans Ubuntu 16.04 git 2.7.4, mais pas sur Ubuntu 18.04 git 2.17, TODO trouve la correction ou la version de correction exacte.
la source
username/repo#sha
à package.json, une option beaucoup plus flexible est d'organiser votre système avec un ensemble de conteneurs docker--depth=1
économise tellement de bande passante quand je n'ai pas besoin de l'historique du dépôt. Si quelqu'un trouve ou sait pourquoi cela se produit, j'aimerais savoir.deinit
approche qui résout le problème la plupart du temps. Lorsqu'il est intégré à un système de génération, l'utilisateur final peut simplement laisser le système de génération récupérer les sous-modules et abandonnerrecursive
complètement la commande cassée . Il y a encore des scénarios où cela se casse, comme le sous-module qui a effectué une poussée de force et annulé complètement le commit.Cela peut également se produire lorsque vous avez un sous-module pointant vers un référentiel qui a été rebasé et que la validation donnée a «disparu». Bien que la validation puisse toujours être dans le référentiel distant, elle n'est pas dans une branche. Si vous ne pouvez pas créer une nouvelle branche (par exemple pas votre référentiel), vous êtes obligé de mettre à jour le super projet pour pointer vers un nouveau commit. Vous pouvez également pousser une de vos copies des sous-modules ailleurs, puis mettre à jour le super-projet pour pointer vers ce référentiel à la place.
la source
Votre agence n'est peut-être pas à jour, une solution simple mais essayez
git fetch
la source
Cette réponse est destinée aux utilisateurs de SourceTree avec une expérience limitée de git de terminal.
Ouvrez le sous-module problématique depuis le projet Git (super-projet).
Récupérez et assurez-vous que «Récupérer toutes les balises» est coché.
Rebase tirez votre projet Git.
Cela résoudra le problème «la référence n'est pas un arbre» 9 fois sur dix. Cette 1 fois, ce n'est pas le cas, c'est un correctif de terminal comme décrit par la réponse du haut.
la source
Votre historique de sous-module est de toute façon préservé dans le git de sous-module.
Alors, pourquoi ne pas simplement supprimer le sous-module et l'ajouter à nouveau?
Sinon, avez-vous essayé de modifier manuellement le
HEAD
ou lerefs/master/head
dans le sous-module.git
la source
Juste pour être sûr, essayez de mettre à jour vos
git
binaires.GitHub pour Windows a la version
git version 1.8.4.msysgit.0
qui dans mon cas était le problème. La mise à jour l'a résolu.la source
Dans mon cas, aucune des réponses ci-dessus ne résout le problème même si ce sont de bonnes réponses. Je poste donc ma solution (dans mon cas il y a deux clients git, le client A et B):
allez dans le répertoire du sous-module:
caisse à maîtriser:
rebaser en un code de validation que les deux clients peuvent voir
revenir au répertoire des parents:
s'engager à maîtriser
passer à l'autre client ,
rebase
refaire.enfin ça marche bien maintenant! Peut-être perdre quelques commits mais ça marche.
Pour info, n'essayez pas de supprimer votre sous-module, il y restera
.git/modules
et ne pourra plus relire ce sous-module, sauf si réactif local.la source
Pour synchroniser le git repo avec la tête du sous-module, au cas où c'est vraiment ce que vous voulez, j'ai trouvé qu'en supprimant le sous-module puis en le relisant, vous évitiez de bricoler l'historique. Malheureusement, la suppression d'un sous-module nécessite un piratage plutôt qu'une simple commande git, mais faisable.
Étapes que j'ai suivies pour supprimer le sous-module, inspirées de https://gist.github.com/kyleturner/1563153 :
Encore une fois, cela peut être utile si tout ce que vous voulez est de pointer à nouveau la tête du sous-module, et vous n'avez pas compliqué les choses en ayant besoin de garder la copie locale du sous-module intacte. Il suppose que vous avez le "bon" sous-module comme son propre référentiel, quelle que soit l'origine de celui-ci, et que vous souhaitiez simplement l'inclure correctement en tant que sous-module.
Remarque: faites toujours une copie complète de votre projet avant de vous lancer dans ce type de manipulation ou toute commande git au-delà du simple commit ou push. Je conseillerais cela avec toutes les autres réponses également, et comme une ligne directrice générale.
la source
Je suis juste tombé sur ce problème et aucune de ces solutions n'a fonctionné pour moi. Ce qui s'est avéré être la solution à mon problème est en fait beaucoup plus simple: mettre à niveau Git. Le mien était 1.7.1, et après l'avoir mis à niveau vers 2.16.1 (le plus récent), le problème a disparu sans laisser de trace! Je suppose que je le laisse ici, j'espère que ça aide quelqu'un.
la source