Git: fatal: Pathspec está no submódulo

145

Estou tentando fazer com que o TravisCI implante automaticamente meu site estático Hakyll, de acordo com este guia .

Veja como meu repo está configurado. Eu tenho minha ramificação de origem, que contém meus arquivos hakyll e markdown. Ele cria o html no _sitediretório, que é configurado como um submódulo, vinculado ao meu masterramo.

cdCrio o site sem problemas e depois no diretório _site. No entanto, quando tento git add ./*os arquivos HTML recém-gerados, obtenho o seguinte erro:

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

Quando tento git add --all, recebo este erro:

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

O que está causando isso e como posso evitar isso?

Você pode ver o repositório aqui .

jmite
fonte

Respostas:

430

Remover o diretório do git e adicioná-lo novamente funcionou para mim:

 git rm --cached directory
 git add directory

Isso funciona se você removeu o .gitdiretório propositalmente porque queria adicionar directoryao seu projeto principal do git. No meu caso específico, eu git clonou uma extensão e correu git add .sem pensar muito. O Git decidiu criar um submódulo, do qual eu não gostei. Então eu removi directory/.gite corri para Git: fatal: Pathspec is in submodule. Não consegui descobrir como remover o material do submódulo. Corrigido com as duas linhas acima.

kqw
fonte
8
Isso resolveu um problema que tive, onde acidentalmente puxei um projeto para um projeto existente, criando um submódulo. Eu tinha tentado quase todas as outras sugestões por aí. Remover o diretório e adicionar novamente resolveu o meu problema. Obrigado.
RevNoah
Eu tenho .git e vejo! Mas quando eu quero cometer alguns arquivos que localizados em uma pasta, ele mostra um erro "blahblah não encontrou nenhum arquivo (s) conhecido por git"
Dr.jacky
Isso corrigiu o problema. No meu caso, eu clonei o projeto em outra máquina.
AntonIva 2/10/19
Eu estava tendo o mesmo problema com um projeto do Visual Studio que sincronizo com o GitHub. A pasta em que a maior parte do meu desenvolvimento está ocorrendo não estava sendo rastreada e, se eu tentasse adicioná-la, estava recebendo o mesmo erro. Esta solução corrigiu para mim também!
JohnRDOrazio 24/06
10

Parece que o git addcontexto é o repositório pai ("pai" significa aquele incluindo o submódulo), que aciona o aviso.

Tente mudar seu contexto com:

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

Não esqueça que, se isso funcionar, você ainda precisará retornar ao git add _siterepositório pai e , uma vez que o subrepo terá alterações.

E você teria que empurrar os dois.


Atualização em janeiro de 2017 (mais de 2 anos depois)

Com o Git 2.12, você não verá prefix_pathspec: Assertionmais isso .

Veja commit 2d81c48 (09 de janeiro de 2017) de Stefan Beller ( stefanbeller) .
Ajudado por: Jeff King ( peff) e Junio ​​C Hamano ( gitster) .
(Mesclado por Junio ​​C Hamano - gitster- na confirmação 00880a1 , 18 de janeiro de 2017)

pathspec: dê uma mensagem melhor para pathspecerro relacionado ao sub-módulo

A execução " git add a/b" quando " a" é um submódulo com erro, mas sem uma mensagem de erro significativa.

VonC
fonte
Recebo error: unknown option git-dir = .git ''. Além disso, eu não posso comprometer meu repo pai de dentro de Travis, que irá causar um loop infinito de Travis correndo ...
jmite
@ jmite Corrigi a resposta: as opções --git-dire --work-treesão do gitcomando, não o git addcomando. Tente pelo menos a git addparte, se git commitnão for prático.
VonC
Este parece quebrar alguma coisa para mim, mas eu era capaz de encontrar a solução aqui
CGTheLegend
4

Parece que meu problema é que eu estava excluindo acidentalmente a .gitpasta do submódulo.

jmite
fonte
1
Eu tenho exatamente o mesmo problema. Você poderia compartilhar como resolveu?
Matt
Eu o resolvi alterando meu script para não excluir a pasta .git. Portanto, aconselho que você verifique seu script, veja se você realmente tem uma pasta .git no diretório
jmite
1
Sim, mas quero me livrar dele, pois o repositório remoto não existe mais. É mais fácil incluirmos o código-fonte como está.
Matt
Você é a melhor aposta, então, é procurar mudar os repositórios remotos. Dê uma olhada no git remotecomando.
jmite
3

Parece que você está operando em submódulos não inicializados (basicamente faltam .gitdiretórios), portanto, você deve inicializá-los primeiro e atualizar:

git submodule init
git submodule update

Caso contrário, se você não precisar mais desse submódulo, remova-o:

git submodule deinit _site

ou:

git rm -f --cached _site

e adicione-o novamente:

git add _site

Verifique os seus atuais submódulos pendentes por: git submodule status.

Veja também: Por que o git comete erros com 'Falha na asserção' no git add.?

kenorb
fonte
1

Correção de 100% para esse problema, mesmo se você tiver mais de um diretório de sub-módulo dentro do projeto:

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