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.