Git:致命的:Pathspec在submodule中

我试图让TravisCI自动部署我的Hakyll静态网站,根据这个指南 。

这是如何设置我的回购。 我有我的源分支,其中包含我的hakyll和降价文件。 它将html构build到_site目录中,该目录被设置为一个子模块,链接到我的master分支。

我build立网站没有问题,然后进入_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 

这是什么原因造成的,怎样才能避免这种情况?

你可以在这里查看版本库。

从git中删除目录并再次添加它为我工作:

  git rm --cached directory git add directory 

如果因为想要将directory添加到主git项目而有意删除了.git目录,这将起作用。 在我的具体情况下,我有git克隆了一个扩展名,并运行git add . 没有想太多。 Git决定创build一个我不喜欢的子模块。 所以我删除了directory/.git并跑到Git: fatal: Pathspec is in submodule 。 我无法find如何删除子模块的东西。 用上面的两行固定。

看来git add context是父回购(“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

请参阅由Stefan Beller( stefanbeller ) 提交的2d81c48 (2017年1月9日) 。
帮助: 杰夫·金( peff )和Junio C gitstergitster ) 。
(由Junio C gitster合并- gitster – 承诺 2017年1月18日00880a1 )

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

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

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

这听起来像你正在操作非初始化的子模块(他们基本上缺less.git目录),因此你应该初始化它们并更新:

 git submodule init git submodule update 

否则,如果您不再需要此子模块,请通过以下方式将其删除:

 git submodule deinit _site 

要么:

 git rm -f --cached _site 

并再次添加它:

 git add _site 

通过以下命令检查当前未完成的子模块: git submodule status

另请参阅: 为什么Git错误与Git添加“断言失败”?