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 .
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.
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'erreurpathspec
liée au sous-moduleL'exécution de "
git add a/b
" lorsque "a
" est un sous-module correctement erroné, mais sans message d'erreur significatif.
Il semble que mon problème est que je supprimais accidentellement le dossier .git
du sous-module.
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.?
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