163

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.

jmite
  • 7,320
  • 6
  • 32
  • 74
  • it might be duplicated of https://stackoverflow.com/questions/25458306/git-rm-fatal-pathspec-did-not-match-any-files be aware the could be a problem of permissions on files https://stackoverflow.com/a/67315740/778517 – Sérgio Apr 30 '21 at 11:23

6 Answers6

473

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.

kqw
  • 17,649
  • 11
  • 61
  • 92
  • 8
    This solved an issue I had where I accidentally pulled down a project into an existing project, creating a submodule. I had tried just about every other suggestion out there. Removing the directory and adding again addressed my problem. Thanks. – RevNoah Jul 08 '15 at 04:58
  • I have .git and see it! But when I want to commit some files that located in a folder, it shows an error "blahblah did not match any file(s) known to git" – Dr.jacky Oct 08 '16 at 07:26
  • This fixed the issue. In my case, I cloned the project in another machine. – AntonIva Oct 02 '19 at 03:15
  • I was having the same problem with a Visual Studio project which I synch with GitHub. The folder where most of my development is taking place wasn't being tracked, and if I tried adding it I was getting the same error. This solution fixed it for me too! – JohnRDOrazio Jun 24 '20 at 18:10
  • THANK. YOU!!! Took me two days to figure out why my CI/CD build was failing... – thiezn Oct 21 '20 at 22:09
  • Thanks. your solution works for me perfectly. – royal2710 May 08 '21 at 11:09
10

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.

VonC
  • 1,042,979
  • 435
  • 3,649
  • 4,283
  • I get `error: unknown option `git-dir=.git'`. Also, I can't commit my parent repo from within Travis, that will cause an infinite loop of Travis running... – jmite Jun 29 '14 at 05:52
  • @jmite I have fixed the answer: the `--git-dir` and `--work-tree` are options of the `git` command, not the `git add` command. Try at least the `git add` part, if the `git commit` isn't practical. – VonC Jun 29 '14 at 06:00
  • This seems to break something for me, but I was able to find the solution [here](http://stackoverflow.com/questions/7860751/git-fatal-unable-to-create-path-my-project-git-index-lock-file-exists) – CGTheLegend Feb 28 '15 at 07:35
5

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

kqw
  • 17,649
  • 11
  • 61
  • 92
jmite
  • 7,320
  • 6
  • 32
  • 74
  • 1
    I have exactly the same problem. Could you share how you solved it? – matt Mar 24 '15 at 19:12
  • I solved it by changing my script to not delete the .git folder. So I'd advise that you check your script, see if you actually have a .git folder in the directory. – jmite Mar 24 '15 at 19:44
  • 1
    I do but I want to get rid of it as remote repo no longer exists. It's just easier for us to include its source code as it is. – matt Mar 25 '15 at 08:55
  • You're best bet then is to look at changing the remote repos. Take a look at the `git remote` command. – jmite Mar 25 '15 at 10:55
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 .?

Community
  • 1
  • 1
kenorb
  • 118,428
  • 63
  • 588
  • 624
1

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
Makogan
  • 5,325
  • 3
  • 18
  • 70
0

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
M. Leonhard
  • 693
  • 8
  • 13