根据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。
答案 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 2d81c48见Stefan 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