web-dev-qa-db-fra.com

Git: fatal: Pathspec est dans le sous-module

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

Voici comment mon repo est mis en place. J'ai ma branche source, qui contient mes fichiers hakyll et markdown. Il construit le code HTML dans le répertoire _site, qui est configuré comme un sous-module, lié à ma branche master.

Je construis le site sans problème, puis cd dans le répertoire _site. Cependant, lorsque j'essaie de git add ./* les fichiers HTML nouvellement générés, le message d'erreur suivant s'affiche:

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

Quand j'essaie 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 l'éviter?

Vous pouvez voir le dépôt ici .

116
jmite

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 volontairement supprimé le répertoire .git parce que vous vouliez ajouter directory à votre projet git principal. Dans mon cas spécifique, j’avais git cloné une extension et exécuté git add . sans trop y penser. Git a décidé de créer un sous-module, ce que je n'ai pas aimé. J'ai donc retiré directory/.git et j'ai rencontré Git: fatal: Pathspec is in submodule. Je ne pouvais pas trouver comment supprimer les éléments du sous-module. Fixé avec les deux lignes ci-dessus.

355
guaka

Il semble que le contexte git add soit le référent parent ("parent" désigne celui incluant le sous-module), ce 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 retourner au dépôt parent et à git add _site, car le subrepo aurait des modifications.

Et vous auriez à pousser les deux.


Mise à jour janvier 2017 (2 ans et plus après)

Avec Git 2.12, vous ne verrez plus que prefix_pathspec: Assertion.

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

pathspec: donne un meilleur message pour l'erreur pathspec liée au sous-module

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

10
VonC

Il semble que mon problème est que je supprimais accidentellement le dossier .git du sous-module.

4
jmite

On dirait que vous utilisez des sous-modules non initialisés (il leur manque essentiellement les répertoires .git], vous devez donc les initialiser et les 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 encore:

git add _site

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

Voir aussi: Pourquoi l'erreur git est-elle liée à 'L'échec de l'assertion' sur git add.?

3
kenorb

Solution 100% pour 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
1
John Smit Conor