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 .

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.


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.


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.