Joey Eremondi
Joey Eremondi

Reputation: 8423

Git: fatal: Pathspec is in submodule

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.

Upvotes: 206

Views: 122694

Answers (7)

the
the

Reputation: 21891

Removing the directory from git and adding it again worked for me:

 git rm --cached <insert-your-directory-path>
 git add <insert-your-directory-path>

For instance: git rm --cached /home/joey/_site/

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.

Upvotes: 591

user3856437
user3856437

Reputation: 2377

In my case I have ".git" file inside another directory wherein the parent directory has already ".git". So I removed the child directory and it solved.

Upvotes: 0

M. Leonhard
M. Leonhard

Reputation: 1572

I wanted to make a subdirectory stop being a git submodule. This worked for me:

$ mv subdir subdir2
$ git rm --cached subdir
$ mv subdir2 subdir

Upvotes: 18

John Smit Conor
John Smit Conor

Reputation: 29

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

Upvotes: 2

VonC
VonC

Reputation: 1323175

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 related pathspec error

Running "git add a/b" when "a" is a submodule correctly errored out, but without a meaningful error message.

Upvotes: 10

kenorb
kenorb

Reputation: 166319

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

Upvotes: 6

Joey Eremondi
Joey Eremondi

Reputation: 8423

It seems my problem is that I was accidentally deleting the .git folder of the submodule.

Upvotes: 6

Related Questions