Git:fatal:Pathspec位于子模块中

Git:fatal:Pathspec位于子模块中,git,github,version-control,git-submodules,hakyll,Git,Github,Version Control,Git Submodules,Hakyll,我正试图让TravisCI自动部署我的Hakyll静态站点,据报道 我的回购协议是这样建立的。我有我的源分支,它包含我的hakyll和markdown文件。它将html构建到\u站点目录中,该目录设置为子模块,链接到我的主分支 我毫无问题地构建了站点,然后将cd放入_站点目录。但是,当我尝试添加新生成的HTML文件时,会出现以下错误: fatal: Pathspec './about.html' is in submodule '_site' 当我尝试git add--all时,出现以下错误:

我正试图让TravisCI自动部署我的Hakyll静态站点,据报道

我的回购协议是这样建立的。我有我的源分支,它包含我的hakyll和markdown文件。它将html构建到
\u站点
目录中,该目录设置为子模块,链接到我的
分支

我毫无问题地构建了站点,然后将
cd
放入_站点目录。但是,当我尝试添加新生成的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:pathspec.c:317:prefix\u pathspec:Assertion`item->nowildcard\u len&&item->prefix len'失败。
/home/travis/build.sh:line 245:1566中止git添加--全部
这是什么原因造成的,我如何避免


您可以查看存储库。

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

尝试通过以下方式更改其上下文:

cd _site
git --git-dir=.git --work-tree=. add . 
git --git-dir=.git --work-tree=. commit -m "new files"
不要忘记,如果这样做有效的话,您仍然需要返回父回购协议和git add\u站点,因为子回购协议会发生变化

你必须把两者都推


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

使用Git2.12,您将不再看到
前缀\u pathspec:Assertion

参见(2017年1月9日)作者。
帮助人:、和。
(于2017年1月18日被合并)

pathspec
:为与子模块相关的
pathspec
错误提供更好的消息 当子模块出现错误时,运行“
git add a/b
”是否正确 输出,但没有有意义的错误消息


我的问题似乎是,我无意中删除了子模块的
.git
文件夹。

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

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

如果您有意删除
.git
目录,因为您希望将
目录
添加到主git项目中,则此操作有效。在我的具体案例中,我让git克隆了一个扩展,并在没有考虑太多的情况下运行了
git add.
。Git决定创建一个子模块,我不喜欢。所以我删除了
directory/.git
,并在子模块中运行了
git:fatal:Pathspec。我找不到如何删除子模块的内容。修复了上面的两行。

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

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

git submodule deinit _site
或:

并再次添加:

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


另请参见:

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

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

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

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

我得到
错误:未知选项
git dir=.git'`。另外,我不能从Travis内部提交父repo,这将导致Travis运行的无限循环…@jmite我已经修复了答案:
--git dir
--work tree
git
命令的选项,而不是
git add
命令。如果
git commit
不实用,请至少尝试一下
git add
部分。这对我来说似乎有点破坏,但我找到了解决方案,我也遇到了同样的问题。你能分享一下你是如何解决的吗?我通过修改脚本来解决,不删除.git文件夹。所以我建议你检查一下你的脚本,看看你的目录中是否有一个.git文件夹。我有,但我想把它去掉,因为远程回购已经不存在了。对我们来说,按原样包含它的源代码更容易。你最好的办法是考虑更改远程回购。看看
git remote
命令。这解决了我不小心将一个项目拉入现有项目,创建子模块的问题。我已经尝试了所有其他的建议。删除目录并再次添加解决了我的问题。谢谢。我有。去看看!但是当我想提交位于文件夹中的一些文件时,会显示一个错误“blahblah与git已知的任何文件都不匹配”,这就解决了这个问题。在我的例子中,我在另一台机器上克隆了这个项目。我在与GitHub同步的Visual Studio项目中遇到了同样的问题。我的大部分开发工作所在的文件夹没有被跟踪,如果我尝试添加它,我也会遇到同样的错误。这个解决方案也解决了我的问题!感谢你!!!我花了两天的时间才弄明白为什么我的CI/CD构建失败了…它可能是重复的。请注意,可能是文件的权限问题