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

150

Я пытаюсь заставить 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

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

Посмотреть репозиторий можно здесь .

jmite
источник

Ответы:

445

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

 git rm --cached directory
 git add directory

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

kqw
источник
8
Это решило мою проблему, когда я случайно перенес проект в существующий, создав подмодуль. Я испробовал практически все другие предложения. Удаление каталога и повторное добавление решило мою проблему. Спасибо.
RevNoah 08
У меня есть .git, и я его вижу! Но когда я хочу зафиксировать некоторые файлы, находящиеся в папке, отображается ошибка «blahblah не соответствует ни одному файлу (файлам), известным git»
Доктор Джеки
Это устранило проблему. В моем случае я клонировал проект на другой машине.
AntonIva
У меня была такая же проблема с проектом Visual Studio, который я синхронизирую с GitHub. Папка, в которой происходит большая часть моей разработки, не отслеживалась, и если я пытался ее добавить, то получал ту же ошибку. Это решение исправило это и для меня!
JohnRDOrazio,
СПАСИБО. ВЫ!!! Мне
потребовалось
10

Кажется, что 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 (9 января 2017 г.) Стефан Беллер ( stefanbeller) .
При поддержке: Джефф Кинг ( peff) и Джунио С. Хамано ( gitster) .
(Объединено Junio ​​C Hamano - gitster- в коммите 00880a1 , 18 января 2017 г.)

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

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

VonC
источник
Я получаю error: unknown option git-dir = .git ''. Кроме того, я не могу зафиксировать свое родительское репо изнутри Трэвиса, это вызовет бесконечный цикл работы Трэвиса ...
jmite
@jmite Я исправил ответ: --git-dirи --work-treeявляются параметрами gitкоманды, а не самой git addкоманды. Попробуйте хотя бы git addчасть, если git commitэто непрактично.
VonC
Кажется, это что-то
сломало
4

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

jmite
источник
1
У меня точно такая же проблема. Не могли бы вы рассказать, как вы ее решили?
Мэтт
Я решил это, изменив свой скрипт, чтобы не удалять папку .git. Поэтому я бы посоветовал вам проверить свой скрипт, посмотреть, действительно ли у вас есть папка .git в каталоге.
jmite
1
Я знаю, но хочу избавиться от него, поскольку удаленного репо больше не существует. Нам просто проще включить исходный код как есть.
Мэтт
Лучше всего взглянуть на изменение удаленных репозиториев. Взгляните на git remoteкоманду.
jmite
4

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

git submodule init
git submodule update

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

git submodule deinit _site

или:

git rm -f --cached _site

и снова добавляем:

git add _site

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

См. Также: Почему git выдает ошибку «Ошибка утверждения» в git add.?

Kenorb
источник
1

100% исправление этой проблемы, даже если у вас есть более одного каталога подмодулей внутри проекта:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
Джон Смит Конор
источник