Git:致命的:Pathspec在子模块中


145

根据本指南,我正在尝试使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

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

您可以在此处查看存储库。

Answers:


430

从git删除目录,然后再次添加它对我有用:

 git rm --cached directory
 git add directory

如果您有意删除.git目录是因为要添加directory到主git项目,则此方法有效。在我的特定情况下,我已经git克隆了一个扩展名,并且运行时git add .没有考虑太多。Git决定创建一个我不喜欢的子模块。所以我移开directory/.gitGit: fatal: Pathspec is in submodule。我找不到如何删除子模块的东西。用上面的两行固定。


8
这解决了我遇到的一个问题,即我不小心将一个项目下拉到一个现有项目中,创建了一个子模块。我几乎尝试了所有其他建议。删除目录并再次添加解决了我的问题。谢谢。
RevNoah

我有.git看看!但是,当我要提交位于文件夹中的某些文件时,它显示错误“ blahblah与git已知的任何文件都不匹配”
Dr.jacky

这解决了问题。就我而言,我将该项目克隆到另一台机器上。
AntonIva

我在与GitHub同步的Visual Studio项目中遇到了同样的问题。我的大部分开发工作所在的文件夹没有被跟踪,如果我尝试添加该文件夹,则会遇到相同的错误。这个解决方案也为我解决了!
JohnRDOrazio

10

似乎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月更新(超过2年)

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

参见Stefan Beller()的commit 2d81c48(2017年1月9日。 帮助:Jeff King(Junio C Hamano((通过合并JUNIOÇ滨野- -提交00880a1,2017年1月18日)stefanbeller
peffgitster
gitster

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

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


我得到error: unknown option git-dir = .git'`。另外,我无法从Travis内部提交父
仓库

@jmite我已经解决了答案:--git-dir--work-treegit命令的选项,而不是git add命令。git add如果git commit不可行,请至少尝试一下。
VonC 2014年

这似乎为我带来了一些
麻烦

4

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


1
我也有完全一样的问题。您能分享您如何解决吗?
马特2015年

我通过更改脚本以不删除.git文件夹来解决此问题。因此,建议您检查脚本,看看目录中是否确实有.git文件夹。
jmite

1
我可以,但是我想摆脱它,因为远程仓库不再存在。对于我们来说,按原样包含其源代码会更容易。
马特2015年

最好的选择就是查看更改远程存储库。看一下git remote命令。
jmite 2015年

3

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

git submodule init
git submodule update

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

git submodule deinit _site

要么:

git rm -f --cached _site

并再次添加:

git add _site

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

另请参阅:为什么git add上git出现“声明失败”错误?


1

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

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.