Git: fatal: Pathspec est dans un sous-module

145

J'essaie de faire en sorte que TravisCI déploie automatiquement mon site statique Hakyll, selon ce guide .

Voici comment mon repo est configuré. J'ai ma branche source, qui contient mes fichiers hakyll et markdown. Il construit le html dans le _siterépertoire, qui est configuré comme un sous-module, lié à ma masterbranche.

Je construis le site sans problème, puis cddans le répertoire _site. Cependant, lorsque j'essaye git add ./*les fichiers HTML nouvellement générés, j'obtiens l'erreur suivante:

fatal: Pathspec './about.html' is in submodule '_site'

Lorsque j'essaye git add --all, j'obtiens cette erreur:

git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed.

/home/travis/build.sh: line 245: 1566 Aborted git add --all

Qu'est-ce qui cause cela et comment puis-je éviter cela?

Vous pouvez afficher le référentiel ici .

jmite
la source

Réponses:

430

Supprimer le répertoire de git et l'ajouter à nouveau a fonctionné pour moi:

 git rm --cached directory
 git add directory

Cela fonctionne si vous avez délibérément supprimé le .gitrépertoire parce que vous vouliez l'ajouter directoryà votre projet git principal. Dans mon cas particulier, j'avais cloné une extension et exécuté git add .sans trop réfléchir. Git a décidé de créer un sous-module, ce que je n'ai pas aimé. Alors j'ai enlevé directory/.gitet je suis tombé sur Git: fatal: Pathspec is in submodule. Je n'ai pas trouvé comment supprimer le contenu du sous-module. Corrigé avec les deux lignes ci-dessus.

kqw
la source
8
Cela a résolu un problème où j'avais accidentellement abaissé un projet dans un projet existant, créant un sous-module. J'avais essayé à peu près toutes les autres suggestions là-bas. La suppression du répertoire et l'ajout à nouveau ont résolu mon problème. Merci.
RevNoah
J'ai .git et je le vois! Mais quand je veux valider certains fichiers qui se trouvent dans un dossier, il affiche une erreur "blahblah ne correspond à aucun fichier (s) connu de git"
Dr.jacky
Cela a résolu le problème. Dans mon cas, j'ai cloné le projet sur une autre machine.
AntonIva
J'avais le même problème avec un projet Visual Studio que je synchronise avec GitHub. Le dossier dans lequel se déroule l'essentiel de mon développement n'était pas suivi, et si j'essayais de l'ajouter, j'obtenais la même erreur. Cette solution l'a corrigé pour moi aussi!
JohnRDOrazio le
10

Il semble que le git addcontexte soit le référentiel parent ("parent" signifie celui qui inclut le sous-module), qui déclenche l'avertissement.

Essayez de changer son contexte avec:

cd _site
git --git-dir=.git --work-tree=. add . 
git --git-dir=.git --work-tree=. commit -m "new files"

N'oubliez pas que si cela fonctionne, vous devrez toujours revenir au git add _siteréférentiel parent et , puisque l'assignation aurait des modifications.

Et il faudrait pousser les deux.


Mise à jour janvier 2017 (2+ ans plus tard)

Avec Git 2.12, vous ne verrez prefix_pathspec: Assertionplus cela.

Voir commit 2d81c48 (09 janvier 2017) par Stefan Beller ( stefanbeller) .
Aide: Jeff King ( peff) et Junio ​​C Hamano ( gitster) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit 00880a1 , 18 janvier 2017)

pathspec: donne un meilleur message pour le sous-module lié pathspec erreur

L'exécution de " git add a/b" quand " a" est un sous-module correctement erroné, mais sans message d'erreur significatif.

VonC
la source
Je reçois error: unknown option git-dir = .git'`. De plus, je ne peux pas valider mon dépôt parent depuis Travis, cela provoquera une boucle infinie de Travis en cours d'exécution ...
jmite
@jmite J'ai corrigé la réponse: les options --git-diret --work-treesont de la gitcommande, pas la git addcommande. Essayez au moins la git addpartie, si ce git commitn'est pas pratique.
VonC le
Cela semble casser quelque chose pour moi, mais j'ai pu trouver la solution ici
CGTheLegend
4

Il semble que mon problème soit que je supprimais accidentellement le .gitdossier du sous-module.

jmite
la source
1
J ai exactement le même problème. Pourriez-vous partager comment vous l'avez résolu?
mat
Je l'ai résolu en changeant mon script pour ne pas supprimer le dossier .git. Je vous conseillerais donc de vérifier votre script, de voir si vous avez réellement un dossier .git dans le répertoire.
jmite
1
Je le fais mais je veux m'en débarrasser car le repo à distance n'existe plus. Il est simplement plus facile pour nous d'inclure son code source tel quel.
mat
Le mieux est alors de chercher à changer les dépôts distants. Jetez un œil à la git remotecommande.
jmite
3

Il semble que vous travaillez sur des sous-modules non initialisés (il manque essentiellement des .gitrépertoires), vous devez donc les initialiser d'abord et mettre à jour:

git submodule init
git submodule update

Sinon, si vous n'avez plus besoin de ce sous-module, supprimez-le en:

git submodule deinit _site

ou:

git rm -f --cached _site

et ajoutez-le à nouveau:

git add _site

Vérifiez vos sous-modules actuels en suspens en: git submodule status .

Voir aussi: Pourquoi git génère-t-il une erreur avec 'Échec de l'assertion' sur git add.?

Kenorb
la source
1

Correction à 100% de ce problème, même si vous avez plus d'un répertoire de sous-modules dans le projet:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
John Smit Conor
la source