问题
I'm trying to get TravisCI to automatically deploy my Hakyll static site, according to this guide.
Here's how my repo is set up. I have my source branch, which contains my hakyll and markdown files. It builds the html into the _site
directory, which is set up as a submodule, linked to my master
branch.
I build the site without problem, then cd
into the _site directory. However, when I try to git add ./*
the newly generated HTML files, I get the following error:
fatal: Pathspec './about.html' is in submodule '_site'
When I try git add --all
, I get this 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
What is causing this, and how can I avoid this?
You can view the repository here.
回答1:
Removing the directory from git and adding it again worked for me:
git rm --cached directory
git add directory
This works if you purposefully removed the .git
directory because you wanted to add directory
to your main git project. In my specific case, I had git cloned an extension and ran git add .
without thinking too much. Git decided to create a submodule, which I didn't like. So I removed directory/.git
and ran into Git: fatal: Pathspec is in submodule
. I couldn't find out how to remove the submodule stuff. Fixed with the two lines above.
回答2:
It seems the git add
context is the parent repo ("parent" means the one including the submodule), which triggers the warning.
Try and change its context with:
cd _site
git --git-dir=.git --work-tree=. add .
git --git-dir=.git --work-tree=. commit -m "new files"
Don't forget that, if this works, you would still have to go back to the parent repo, and git add _site
, since the subrepo would have changes.
And you would have to push both.
Update January 2017 (2+ years later)
With Git 2.12, you won't see that prefix_pathspec: Assertion
anymore.
See commit 2d81c48 (09 Jan 2017) by Stefan Beller (stefanbeller).
Helped-by: Jeff King (peff), and Junio C Hamano (gitster).
(Merged by Junio C Hamano -- gitster -- in commit 00880a1, 18 Jan 2017)
pathspec
: give better message for submodule relatedpathspec
errorRunning "
git add a/b
" when "a
" is a submodule correctly errored out, but without a meaningful error message.
回答3:
It seems my problem is that I was accidentally deleting the .git
folder of the submodule.
回答4:
It sounds like you're operating on non-initialized submodules (they're basically missing .git
directories), therefore you should initialize them first and update:
git submodule init
git submodule update
Otherwise if you don't need this submodule anymore, remove it by:
git submodule deinit _site
or:
git rm -f --cached _site
and add it again:
git add _site
Check your current outstanding submodules by: git submodule status
.
See also: Why is git erroring with 'Assertion failed' on git add .?
回答5:
100% fix for this problem, even if you have more than one submodule directory inside the project:
> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
来源:https://stackoverflow.com/questions/24472596/git-fatal-pathspec-is-in-submodule