Git: fatal: Pathspec está en submódulo

145

Estoy tratando de hacer que TravisCI implemente automáticamente mi sitio estático Hakyll, de acuerdo con esta guía .

Así es como está configurado mi repositorio. Tengo mi rama fuente, que contiene mis archivos hakyll y markdown. Construye el html en el _sitedirectorio, que está configurado como un submódulo, vinculado a mi masterrama.

Construyo el sitio sin problemas, luego cden el directorio _site. Sin embargo, cuando intento git add ./*los archivos HTML recién generados, aparece el siguiente error:

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

Cuando lo intento git add --all, me sale este error:

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

¿Qué está causando esto y cómo puedo evitarlo?

Puede ver el repositorio aquí .

jmite
fuente

Respuestas:

430

Eliminar el directorio de git y agregarlo nuevamente funcionó para mí:

 git rm --cached directory
 git add directory

Esto funciona si eliminó a propósito el .gitdirectorio porque desea agregarlo directorya su proyecto git principal. En mi caso específico, había clonado una extensión y corrí git add .sin pensar demasiado. Git decidió crear un submódulo, que no me gustó. Así que me quité directory/.gity me encontré con Git: fatal: Pathspec is in submodule. No pude descubrir cómo eliminar las cosas del submódulo. Solucionado con las dos líneas de arriba.

kqw
fuente
8
Esto resolvió un problema que tuve cuando accidentalmente derribé un proyecto a un proyecto existente, creando un submódulo. Había intentado casi cualquier otra sugerencia por ahí. Eliminar el directorio y agregarlo nuevamente solucionó mi problema. Gracias.
RevNoah
Tengo .git y lo veo! Pero cuando quiero confirmar algunos archivos que se encuentran en una carpeta, muestra un error "blahblah no coincide con ningún archivo conocido por git"
Dr.jacky
Esto solucionó el problema. En mi caso, cloné el proyecto en otra máquina.
AntonIva
Estaba teniendo el mismo problema con un proyecto de Visual Studio que sincronizo con GitHub. La carpeta donde se lleva a cabo la mayor parte de mi desarrollo no estaba siendo rastreada, y si intentaba agregarla, obtenía el mismo error. ¡Esta solución también me lo arregló!
JohnRDOrazio
10

Parece que el git addcontexto es el repositorio principal ("padre" significa el que incluye el submódulo), que activa la advertencia.

Intenta cambiar su contexto con:

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

No olvide que, si esto funciona, aún tendría que volver al repositorio principal y git add _site, dado que el subrepo tendría cambios.

Y tendrías que empujar a ambos.


Actualización de enero de 2017 (más de 2 años después)

Con Git 2.12, ya no lo verás prefix_pathspec: Assertion.

Ver commit 2d81c48 (09 de enero de 2017) por Stefan Beller ( stefanbeller) .
Ayudado por: Jeff King ( peff) y Junio ​​C Hamano ( gitster) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 00880a1 , 18 ene 2017)

pathspec: dar un mejor mensaje para el pathspecerror relacionado con el submódulo

Ejecutar " git add a/b" cuando " a" es un submódulo con error, pero sin un mensaje de error significativo.

VonC
fuente
Obtengo error: unknown option git-dir = .git ''. Además, no me puedo comprometer mi padre repo desde dentro de Travis, que va a provocar un bucle infinito de Travis corriendo ...
jmite
@jmite he fijado la respuesta: el --git-diry --work-treeson opciones del gitcomando, no el git addcomando. Pruebe al menos la git addparte, si la git commitno es práctica.
VonC
Esto parece romper algo para mí, pero pude encontrar la solución aquí
CGTheLegend
4

Parece que mi problema es que estaba borrando accidentalmente la .gitcarpeta del submódulo.

jmite
fuente
1
Tengo exactamente el mismo problema. ¿Podría compartir cómo lo resolvió?
mate
Lo resolví cambiando mi script para no eliminar la carpeta .git. Por lo tanto, le aconsejo que verifique su script, vea si realmente tiene una carpeta .git en el directorio.
jmite
1
Lo hago pero quiero deshacerme de él ya que el repositorio remoto ya no existe. Es más fácil para nosotros incluir su código fuente tal como está.
mate
Su mejor opción es mirar cambiar los repositorios remotos. Echa un vistazo al git remotecomando.
jmite
3

Parece que está operando en submódulos no inicializados (básicamente faltan .gitdirectorios), por lo tanto, debe inicializarlos primero y actualizar:

git submodule init
git submodule update

De lo contrario, si ya no necesita este submódulo, elimínelo:

git submodule deinit _site

o:

git rm -f --cached _site

y agrégalo de nuevo:

git add _site

Revisar sus submódulos actuales pendientes por: git submodule status.

Ver también: ¿Por qué git está fallando con 'Error de aserción' en git add.?

kenorb
fuente
1

Solución al 100% para este problema, incluso si tiene más de un directorio de submódulos dentro del proyecto:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
John Smit Conor
fuente