Git: fatal: Pathspec znajduje się w module podrzędnym

145

Próbuję zmusić TravisCI do automatycznego wdrożenia mojej statycznej witryny Hakyll, zgodnie z tym przewodnikiem .

Oto jak jest skonfigurowane moje repozytorium. Mam gałąź źródłową, która zawiera moje pliki hakyll i markdown. Buduje kod HTML w _sitekatalogu, który jest skonfigurowany jako podmoduł, połączony z moją mastergałęzią.

cdWitrynę buduję bez problemu, a następnie umieszczam w katalogu _site. Jednak podczas próby git add ./*uzyskania nowo wygenerowanych plików HTML pojawia się następujący błąd:

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

Kiedy próbuję git add --all, pojawia się ten błąd:

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

Co to powoduje i jak mogę tego uniknąć?

Możesz wyświetlić repozytorium tutaj .

jmite
źródło

Odpowiedzi:

430

Usunięcie katalogu z gita i dodanie go ponownie zadziałało:

 git rm --cached directory
 git add directory

Działa to, jeśli celowo usunąłeś .gitkatalog, ponieważ chciałeś go dodać directorydo swojego głównego projektu git. W moim konkretnym przypadku sklonowałem rozszerzenie git i uruchomiłem git add .bez zastanowienia. Git postanowił stworzyć podmoduł, który mi się nie podobał. Więc usunąłem directory/.giti wpadłem Git: fatal: Pathspec is in submodule. Nie mogłem dowiedzieć się, jak usunąć elementy podmodułu. Naprawiono z dwiema liniami powyżej.

kqw
źródło
8
To rozwiązało problem polegający na tym, że przypadkowo ściągnąłem projekt do istniejącego projektu, tworząc podmoduł. Wypróbowałem prawie każdą inną sugestię. Usunięcie katalogu i ponowne dodanie rozwiązało mój problem. Dzięki.
RevNoah,
Mam .git i widzę to! Ale kiedy chcę zatwierdzić niektóre pliki, które znajdują się w folderze, pojawia się błąd „blahblah nie pasuje do żadnego pliku (ów) znanych git”
Dr.jacky
To rozwiązało problem. W moim przypadku sklonowałem projekt na innym komputerze.
AntonIva
Miałem ten sam problem z projektem Visual Studio, który synchronizuję z GitHubem. Folder, w którym odbywa się większość mojego rozwoju, nie był śledzony, a gdy próbowałem go dodać, otrzymywałem ten sam błąd. To rozwiązanie również rozwiązało problem!
JohnRDOrazio
10

Wygląda na to, że git addkontekstem jest repozytorium nadrzędne („rodzic” oznacza to, w którym znajduje się podmoduł), które wyzwala ostrzeżenie.

Spróbuj zmienić jego kontekst za pomocą:

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

Nie zapominaj, że jeśli to git add _sitezadziała , nadal będziesz musiał wrócić do repozytorium nadrzędnego, a ponieważ procedura ta uległaby zmianie.

I musiałbyś naciskać na oba.


Aktualizacja styczeń 2017 (ponad 2 lata później)

Z Git 2.12 prefix_pathspec: Assertionjuż tego nie zobaczysz .

Zobacz commit 2d81c48 (09 stycznia 2017) autorstwa Stefana Bellera ( stefanbeller) .
Pomagają: Jeff King ( peff) i Junio ​​C Hamano ( gitster) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 00880a1 , 18 stycznia 2017 r.)

pathspec: daje lepszy komunikat o pathspecbłędzie związanym z podmodułem

Uruchamianie „ git add a/b”, gdy „ a” jest modułem podrzędnym, w którym wystąpił prawidłowy błąd, ale bez znaczącego komunikatu o błędzie.

VonC
źródło
Otrzymuję error: unknown option git-dir = .git'`. Nie mogę też zatwierdzić repozytorium rodzica z poziomu Travisa, co spowoduje nieskończoną pętlę działania Travisa ...
jmite
@jmite Naprawiłem odpowiedź: --git-diri --work-treesą opcjami gitpolecenia, a nie git addpolecenia. Spróbuj przynajmniej tej git addczęści, jeśli git commitnie jest to praktyczne.
VonC
Wydaje się, że coś mi to
zepsuło
4

Wygląda na to, że mój problem polega na tym, że przypadkowo usuwałem .gitfolder podmodułu.

jmite
źródło
1
Mam dokładnie ten sam problem. Czy mógłbyś opowiedzieć, jak to rozwiązałeś?
mat.
Rozwiązałem to, zmieniając skrypt, aby nie usuwał folderu .git. Dlatego radziłbym sprawdzić swój skrypt, sprawdzić, czy rzeczywiście masz folder .git w katalogu.
jmite
1
Tak, ale chcę się go pozbyć, ponieważ zdalne repozytorium już nie istnieje. Po prostu łatwiej jest nam dołączyć jego kod źródłowy w obecnej postaci.
mat.
W takim razie najlepiej jest spojrzeć na zmianę zdalnych repozytoriów. Spójrz na git remotepolecenie.
jmite
3

Wygląda na to, że pracujesz na niezainicjowanych modułach podrzędnych (w zasadzie brakuje w nich .gitkatalogów), dlatego powinieneś je najpierw zainicjować i zaktualizować:

git submodule init
git submodule update

W przeciwnym razie, jeśli nie potrzebujesz już tego modułu podrzędnego, usuń go:

git submodule deinit _site

lub:

git rm -f --cached _site

i dodaj ponownie:

git add _site

Sprawdź aktualne wybitne submodules przez: git submodule status.

Zobacz także: Dlaczego git wyświetla błąd „Assertion failed” na git add.?

kenorb
źródło
1

100% poprawka dla tego problemu, nawet jeśli masz więcej niż jeden katalog podmodułów w projekcie:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
John Smit Conor
źródło