Git: fatal: Pathspec знаходиться в підмодулі


146

Я намагаюся отримати TravisCI для автоматичного розгортання мого статичного сайту Hakyll, відповідно до цього посібника .

Ось як налаштовано моє репо. У мене є відділення джерела, яке містить мої файли хакіл та розмітки. Він вбудовує 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

Що це викликає, і як я можу цього уникнути?

Ви можете переглянути сховище тут .

Відповіді:


431

Видалення каталогу з git та додавання його знову працювало для мене:

 git rm --cached directory
 git add directory

Це працює, якщо ви цілеспрямовано видалили .gitкаталог, оскільки ви хотіли додати його directoryдо основного проекту git. У моєму конкретному випадку я git клонував розширення і побіг, git add .не надто думаючи. Гіт вирішив створити підмодуль, який мені не сподобався. Тож я зняв directory/.gitі наткнувся Git: fatal: Pathspec is in submodule. Не вдалося дізнатися, як видалити речі з підмодуля. Виправлено двома рядками вище.


8
Це вирішило проблему, в якій я випадково перекинув проект на існуючий проект, створивши підмодуль. Я намагався майже будь-яку іншу пропозицію там. Видалення каталогу та додавання знову вирішило мою проблему. Дякую.
— RevNoah

У мене є .git і бач! Але коли я хочу ввести деякі файли, які знаходяться в папці, вона показує помилку "blahblah не відповідав жодному файлу, який відомо git"
— Dr.jacky

Це вирішило проблему. У моєму випадку я клонував проект в іншій машині.
— 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.

Див. Комісію 2d81c48 (09 січня 2017 р.) Від Стефана Беллера ( stefanbeller) .
Допомогли: Джефф Кінг ( peff) та Хуніо С Хамано ( gitster) .
(Об'єднано Хуніо С Хамано - 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

Це, здається, щось для мене зламає, але мені вдалося знайти рішення тут
— CGTheLegend

4

Здається, моя проблема полягає в тому, що я випадково видалив .gitпапку підмодуля.


1
У мене точно така ж проблема. Не могли б ви поділитися, як ви це вирішили?
— мат

Я вирішив це, змінивши сценарій, щоб не видаляти папку .git. Тому я б радив перевірити свій сценарій, побачити, чи справді у папці є папка .git.
— jmite

1
Я це хочу, але я хочу позбутися цього, оскільки віддаленого репо вже не існує. Нам просто простіше включити його вихідний код таким, який він є.
— мат

Тоді вам найкраще поглянути на зміну віддалених репостів. Погляньте на git remoteкоманду.
— jmite

3

Це здається, що ви працюєте над неініціалізованими підмодулями (вони в основному відсутні .gitкаталоги), тому слід спочатку їх ініціалізувати та оновити:

git submodule init
git submodule update

Інакше якщо цей підмодуль вам більше не потрібен, видаліть його:

git submodule deinit _site

або:

git rm -f --cached _site

і додайте його ще раз:

git add _site

Перевірте поточні видатні подмодулей по: git submodule status.

Дивіться також: Чому git помиляється з "твердженням не вдається" на додаванні git?


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.