Git: fatal: Pathspec è nel sottomodulo


145

Sto cercando di convincere TravisCI a distribuire automaticamente il mio sito statico Hakyll, secondo questa guida .

Ecco come è impostato il mio repository. Ho il mio ramo di origine, che contiene i miei file hakyll e markdown. Costruisce l'html nella _sitedirectory, che è impostata come sottomodulo, collegata al mio masterramo.

Costruisco il sito senza problemi, quindi cdnella directory _site. Tuttavia, quando provo git add ./*i file HTML appena generati, ottengo il seguente errore:

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

Quando provo git add --all, ottengo questo errore:

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

Cosa sta causando questo e come posso evitarlo?

È possibile visualizzare il repository qui .

Risposte:


430

Rimuovere la directory da Git e aggiungerla di nuovo ha funzionato per me:

 git rm --cached directory
 git add directory

Funziona se hai rimosso intenzionalmente la .gitdirectory perché volevi aggiungere directoryal tuo progetto git principale. Nel mio caso specifico, avevo git clonato un'estensione ed eseguito git add .senza pensare troppo. Git ha deciso di creare un sottomodulo, che non mi è piaciuto. Così ho rimosso directory/.gite mi sono imbattuto in Git: fatal: Pathspec is in submodule. Non sono riuscito a scoprire come rimuovere il materiale del sottomodulo. Risolto con le due righe sopra.


8
Questo ha risolto un problema che avevo quando ho accidentalmente abbattuto un progetto in un progetto esistente, creando un sottomodulo. Avevo provato praticamente ogni altro suggerimento là fuori. Rimozione della directory e aggiunta di nuovo risolto il mio problema. Grazie.
RevNoah,

Ho .git e lo vedo! Ma quando voglio eseguire il commit di alcuni file che si trovano in una cartella, viene visualizzato un errore "blahblah non corrisponde a nessuno dei file noti per git"
Dr.jacky,

Ciò ha risolto il problema. Nel mio caso, ho clonato il progetto in un'altra macchina.
AntonIva,

Stavo avendo lo stesso problema con un progetto Visual Studio che sincronizzo con GitHub. La cartella in cui si sta svolgendo la maggior parte del mio sviluppo non veniva tracciata e se provassi ad aggiungerla ottenevo lo stesso errore. Questa soluzione l'ha risolto anche per me!
JohnRDOrazio,

10

Sembra che il git addcontesto sia il repository principale ("parent" indica quello che include il sottomodulo), che attiva l'avviso.

Prova a cambiare il suo contesto con:

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

Non dimenticare che, se funziona, dovresti comunque tornare al repository principale e git add _site, poiché il sottorepo avrebbe delle modifiche.

E dovresti spingere entrambi.


Aggiornamento gennaio 2017 (2+ anni dopo)

Con Git 2.12, non lo vedrai prefix_pathspec: Assertionpiù.

Vedi commit 2d81c48 (09 gen 2017) di Stefan Beller ( stefanbeller) .
Aiutato da: Jeff King ( peff) e Junio ​​C Hamano ( gitster) .
(Unita da Junio ​​C Hamano - gitster- in commit 00880a1 , 18 gennaio 2017)

pathspec: fornisce un messaggio migliore per l' pathspecerrore relativo al sottomodulo

L'esecuzione di " git add a/b" quando " a" è un sottomodulo correttamente errato, ma senza un messaggio di errore significativo.


Ottengo error: unknown option git-dir = .git'`. Inoltre, non posso eseguire il commit del repository dei miei genitori all'interno di Travis, il che causerà un ciclo infinito di Travis in esecuzione ...
jmite,

@jmite Ho corretto la risposta: --git-dire --work-treesono le opzioni del gitcomando, non del git addcomando. Prova almeno la git addparte, se git commitnon è pratica.
VonC,

Questo sembra spezzare qualcosa per me, ma sono stato in grado di trovare la soluzione qui
CGTheLegend,

4

Sembra che il mio problema sia che stavo eliminando accidentalmente la .gitcartella del sottomodulo.


1
Ho esattamente lo stesso problema. Potresti condividere come l'hai risolto?
opaco

L'ho risolto modificando il mio script per non eliminare la cartella .git. Quindi ti consiglio di controllare il tuo script, vedere se in realtà hai una cartella .git nella directory.
jmite,

1
Lo faccio ma voglio liberarmene poiché il repository remoto non esiste più. È semplicemente più facile per noi includere il suo codice sorgente così com'è.
opaco

La tua scommessa migliore quindi è guardare a cambiare i repository remoti. Dai un'occhiata al git remotecomando.
jmite,

3

Sembra che tu stia operando su sottomoduli non inizializzati (sono sostanzialmente .gitdirectory mancanti ), quindi dovresti inizializzarli prima e aggiornare:

git submodule init
git submodule update

Altrimenti se non hai più bisogno di questo sottomodulo, rimuovilo con:

git submodule deinit _site

o:

git rm -f --cached _site

e aggiungilo di nuovo:

git add _site

Controllare le attuali moduli eccezionali da: git submodule status.

Vedi anche: Perché git ha un errore con "Asserzione fallita" su git add.?


1

Soluzione al 100% per questo problema, anche se hai più di una directory di sottomodulo all'interno del progetto:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.