Git:致命:Pathspec在submodule中

时间:2014-06-29 02:15:45

标签: git github version-control git-submodules hakyll

根据this guide,我试图让TravisCI自动部署我的Hakyll静态网站。

这里是我的回购设置的方式。我有我的源代码分支,其中包含我的hakyll和markdown文件。它将html构建到_site目录中,该目录设置为子模块,链接到我的master分支。

我构建网站没有问题,然后cd到_site目录。但是,当我尝试git add ./*新生成的HTML文件时,出现以下错误:

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

当我尝试git add --all时,我收到此错误:

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

造成这种情况的原因是什么?如何避免这种情况?

您可以查看存储库here

6 个答案:

答案 0 :(得分:338)

从git中删除目录并再次添加它对我有用:

 git rm --cached directory
 git add directory

如果您有意删除了.git目录,因为您想将directory添加到主git项目中,这是有效的。在我的特定情况下,我让git克隆了一个扩展并运行git add .而没有想太多。 Git决定创建一个我不喜欢的子模块。所以我删除了directory/.git并遇到了Git: fatal: Pathspec is in submodule。我无法找到如何删除子模块的东西。修正了上面的两行。

答案 1 :(得分:10)

似乎git add上下文是父repo(“parent”表示包含子模块的上下文),它会触发警告。

尝试使用以下内容更改其上下文:

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

不要忘记,如果这样做,你仍然需要回到父回购,git add _site,因为subrepo会有变化。

你必须推动两者。


2017年1月更新(2年以上)

使用Git 2.12,您将不会再看到prefix_pathspec: Assertion

commit 2d81c48Stefan Beller (stefanbeller)(2017年1月9日) 帮助:Jeff King (peff)Junio C Hamano (gitster) (由Junio C Hamano -- gitster --合并于commit 00880a1,2017年1月18日)

  

pathspec:为子模块相关的pathspec错误提供更好的消息

     

当“git add a/b”是正确错误的子模块时运行“a”   out,但没有有意义的错误信息。

答案 2 :(得分:4)

我的问题似乎是我不小心删除了子模块的.git文件夹。

答案 3 :(得分:2)

听起来你正在对未初始化的子模块进行操作(它们基本上缺少.git目录),因此你应该首先初始化它们并更新:

git submodule init
git submodule update

否则,如果您不再需要此子模块,请将其删除:

git submodule deinit _site

或:

git rm -f --cached _site

再次添加:

git add _site

通过以下方式检查您当前未完成的子模块:git submodule status

另请参阅:Why is git erroring with 'Assertion failed' on git add .?

答案 4 :(得分:1)

即使在项目中有多个子模块目录,也可以100%修复此问题:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f

答案 5 :(得分:1)

我想让子目录不再是 git 子模块。这对我有用:

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