【问题标题】:Git: fatal: Pathspec is in submoduleGit:致命:Pathspec 在子模块中
【发布时间】:2014-08-19 18:57:27
【问题描述】:

根据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

【问题讨论】:

标签: git github version-control git-submodules hakyll


【解决方案1】:

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

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

【讨论】:

  • 好技巧 :) 有效。
  • 我尝试删除子目录中的.git.gitignore 文件,但结果我也需要删除缓存。成功了,谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    似乎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

    commit 2d81c48(2017 年 1 月 9 日)Stefan Beller (stefanbeller)
    帮助者:Jeff King (peff)Junio C Hamano (gitster)
    (由 Junio C Hamano -- gitster -- 合并于 commit 00880a1,2017 年 1 月 18 日)

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

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

    【讨论】:

    • 我得到error: unknown option git-dir=.git'`。另外,我不能从 Travis 中提交我的父 repo,这将导致 Travis 无限循环运行......
    • @jmite 我已经确定了答案:--git-dir--work-treegit 命令的选项,而不是 git add 命令的选项。如果git commit 不实用,请至少尝试git add 部分。
    • 这对我来说似乎有些问题,但我找到了解决方案here
    【解决方案4】:

    听起来您正在对未初始化的子模块进行操作(它们基本上缺少.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 .?

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我也有同样的问题。你能分享一下你是怎么解决的吗?
      • 我通过将脚本更改为不删除 .git 文件夹来解决它。所以我建议你检查你的脚本,看看你的目录中是否真的有一个 .git 文件夹。
      • 我愿意,但我想摆脱它,因为远程仓库不再存在。我们更容易将其源代码原样包含在内。
      • 您最好的选择是查看更改远程存储库。看看git remote 命令。
      【解决方案6】:

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

       git rm --cached directory
       git add directory
      

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

      【讨论】:

      • 这解决了我不小心将项目拉入现有项目并创建子模块的问题。我已经尝试了几乎所有其他建议。删除目录并再次添加解决了我的问题。谢谢。
      • 我有 .git 并且看到了!但是当我想提交一些位于文件夹中的文件时,它会显示错误“blahblah 与 git 已知的任何文件不匹配”
      • 这解决了这个问题。就我而言,我将项目克隆到另一台机器上。
      • 我在与 GitHub 同步的 Visual Studio 项目中遇到了同样的问题。我进行大部分开发的文件夹没有被跟踪,如果我尝试添加它,我会遇到同样的错误。这个解决方案也为我解决了!
      • 谢谢。你!!!我花了两天时间才弄清楚为什么我的 CI/CD 构建失败了......
      猜你喜欢
      • 1970-01-01
      • 2012-09-15
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多