致命: Pathspec 在子模块中

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

我的回购协议是这样建立的。我有我的源分支,其中包含我的 hakyll 和标记文件。它将 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

是什么导致了这种情况,我怎样才能避免这种情况呢?

您可以查看存储库 给你

102375 次浏览

看起来 git add上下文是父回购(“父”指包含子模块的那个) ,它触发警告。

试着改变它的上下文:

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

不要忘记,如果这个方法有效,您仍然需要返回到父回购和 git add _site,因为子回购会有变化。

你必须两者兼顾。


2017年1月更新(两年多以后)

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

犯下2d81c48(2017年1月9日) by 斯蒂芬 · 贝勒(stefanbeller)
助手: 杰夫 · 金(peff)滨野俊男(gitster)
(由 朱尼奥 · C · 哈马诺 gitster于2017年1月18日在 提交00880a1合并)

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

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

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

从 git 中删除目录并再次添加它对我来说很有效:

 git rm --cached directory
git add directory

如果您有意删除了 .git目录,因为您想要将 directory添加到您的主 git 项目中,那么这种方法是可行的。在我的具体案例中,我克隆了一个扩展,并且不假思索地运行了 git add .。Git 决定创建一个子模块,我不喜欢这样。所以我移除了 directory/.git跑进了 Git: fatal: Pathspec is in submodule。我找不到如何删除子模块的东西。固定在上面的两条线上。

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

git submodule init
git submodule update

否则,如果您不再需要这个子模块,可以通过以下方式删除它:

git submodule deinit _site

或:

git rm -f --cached _site

再加上:

git add _site

通过 git submodule status检查当前未完成的子模块。

参见: 为什么 git 错误与断言失败在 git 添加?

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

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

我想让一个子目录停止成为一个 git 子模块:

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