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

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

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

Ответы:


445

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

 git rm --cached directory
 git add directory

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


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" - это подмодуль с ошибками, но без значимого сообщения об ошибке.


Я получаю error: unknown option git-dir = .git ''. Кроме того, я не могу зафиксировать свое родительское репо изнутри Трэвиса, это вызовет бесконечный цикл работы Трэвиса ...
— jmite

@jmite Я исправил ответ: --git-dirи --work-treeявляются параметрами gitкоманды, а не самой git addкоманды. Попробуйте хотя бы git addчасть, если git commitэто непрактично.
— VonC

Кажется, это что-то
— сломало

4

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


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.?


1

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

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.