Git: фатальный: Pathspec находится в подмодуле

Я пытаюсь заставить TravisCI автоматически развертывать статический сайт Hakyll, согласно это руководство.

Вот как настроено мое репо. У меня есть ветвь моего источника, в которой содержатся мои файлы hakyll и markdown. Он создает html в каталог _site, который настроен как подмодуль, связанный с моей ветвью master.

Я создаю сайт без проблем, а затем cd в каталог _site. Однако, когда я пытаюсь создать git add ./* только что созданные HTML файлы, я получаю следующую ошибку:

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

Когда я пытаюсь git add --all, я получаю эту ошибку:

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

Что вызывает это, и как я могу избежать этого?

Здесь вы можете просмотреть репозиторий .

Ответ 1

Удаление каталога из git и добавление его снова сработало для меня:

 git rm --cached directory
 git add directory

Это работает, если вы целенаправленно удалили каталог .git, потому что вы хотели добавить directory в свой основной проект git. В моем конкретном случае у меня было git клонирование расширения и запуск git add ., не задумываясь слишком много. git решил создать подмодуль, который мне не понравился. Поэтому я удалил directory/.git и столкнулся с Git: fatal: Pathspec is in submodule. Я не мог понять, как удалить материал подмодуля. Исправлено с двумя строками выше.

Ответ 2

Кажется, что контекст git add является родительским репо ( "родительский" означает тот, который включает в себя подмодуль), который вызывает предупреждение.

Попробуйте изменить его контекст с помощью

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

Не забывайте, что если это сработает, вам все равно придется вернуться к родительскому репо и git add _site, так как подрепо будет иметь изменения.

И вам придется нажать оба.


Обновление января 2017 года (2+ года спустя)

С Git 2.12 вы больше не увидите prefix_pathspec: Assertion.

См. commit 2d81c48 (09 января 2017 г.) Стефан Беллер (stefanbeller).
Помощник: Джефф Кинг (peff) и Junio C Hamano (gitster).
(слияние Junio ​​C Hamano - gitster - в commit 00880a1, 18 января 2017 г.

pathspec: дать лучшее сообщение для связанной с субмодулем ошибки pathspec

Запуск "git add a/b", когда "a" является правильно подобранным подмодулем но без значимого сообщения об ошибке.

Ответ 3

Кажется, моя проблема в том, что я случайно удалил папку .git подмодуля.

Ответ 4

Похоже, вы работаете на неинициализированных подмодулях (в основном они отсутствуют каталоги .git), поэтому вы должны сначала инициализировать их и обновить:

git submodule init
git submodule update

В противном случае, если вам больше не нужен этот подмодуль, удалите его:

git submodule deinit _site

или

git rm -f --cached _site

и добавьте его снова:

git add _site

Проверьте текущие выдающиеся подмодули: git submodule status.

См. также: Почему git ошибка с 'Assertion failed' на git add.?