无法跟踪Git子模块内的文件

问题:在添加文件./shells/smallApps/*在到Git ./.git/时,我没有在文件./.git/info/exclude也没有任何.gitignore -files。

这个问题是基于这个问题没有完全解决的问题。

我跑

$git status                                                                                                                                          ~/bin
# On branch master
nothing to commit (working directory clean)
$git ls-files                                                                                                                                        ~/bin
Screen/dev/vim-open.screen
--- cut ---

我注意到我的Git没有“shells / smallApps / *”文件

$ls shells/smallApps/                                                                                                                                ~/bin
devTodo     extract     
                                                                                                                                             ~/bin

我想通过运行将它们添加到我的Git中

$git add shells/smallApps/devTodo shells/smallApps/extract
fatal: Path 'shells/smallApps/devTodo' is in submodule 'shells/smallApps'
$git add .         

我注意到这些文件因为某种原因没有添加到我的Git中

$git status                                                                                                                                          ~/bin 
# On branch master
nothing to commit (working directory clean)

我没有.git / info / exclude和.gitignore -files文件。

最后的警告是什么意思?


UPDATE

Git为什么会忽略文件有两个一般原因: gitignoresubmodules

更具体地说,当' git add '被调用时,以下情况会导致Git忽略文件:

  • 该文件匹配$GIT_DIR/exclude模式。
  • 该文件与repo中的.gitignore文件中的模式匹配。
  • 该文件与特定于用户的.gitignore文件中的模式相匹配(由' git config --global core.excludesfile '指定)。
  • 该文件是子模块的一部分。
  • 在忽略的文件上强制' git add ':

    你可以通过调用' git add full/path/to/file '来检查一个特定的文件是否被忽略。

    该手册页声明:“如果在命令行中明确指定了被忽略的文件,则该命令将失败并显示被忽略的文件列表。”

    如果文件被忽略,你可以强制添加' git add --force full/path/to/file '。

    消除子模块参考的说明:

    正如前面的回答中所述, shells/smallApps是存储库中的子模块。

    如果该文件是子模块的一部分,则情况更为复杂。 您不能从主项目中修改子模块的内容。

    如果您想消除子模块参考并直接跟踪主库中的文件,则必须执行几个步骤。 您不能简单地从子模块中删除“.git”目录。 主存储库和子模块之间有三个链接:

  • 主库中的.gitmodules文件。
  • 主要回购的.git/config中的条目。
  • 任何与主repo历史记录中的子模块相关的提交。
  • 根据这个相关的SO问题,您需要执行以下步骤来完全删除子模块:

    注意:如果另一个分支依赖于这个子模块,那么删除它可能会损坏您的存储库! 这是一个危险的操作...谨慎使用。

  • .gitmodules文件中删除相关行。
  • .git/config删除相关部分。
  • 运行git rm --cached path_to_submodule (没有结尾斜杠)。
  • 承诺
  • 作为子模块一部分的文件现在未被跟踪,您可以根据需要决定是保留还是删除它们(以下提到的一个警告)。

    如果你不需要这些文件,你可以直接删除它们。

    警告:如果您想保留这些文件(您似乎需要),则必须从子模块文件夹中手动删除.git目录:

  • cd path_to_submodule
  • rm .git
  • cd ..
  • git add path_to_submodule
  • git status
  • git commit
  • 更新:

    索取更多信息:

    为了帮助调试此问题,请发布以下完整的命令会话的输出:

    cd to the top-level directory in your repo
    ls -al
    cat .git/config
    find . -name ".git*"
    git status
    git add editors
    git add shells
    git status
    

    根据你迄今所做的工作描述,我期望看到:

  • 任何地方都没有.gitmodules文件
  • 只有一个.git目录(在您的回购的根目录中找到)
  • editors/vim/vimdoclet没有.git目录
  • shells/smallApps没有.git目录

  • 我看到你有git add一些关于子模块的东西。 你有嵌套的Git仓库吗? 做这个:

    $ find . -name .git
    

    列出了多少.git目录? 如果有多个,那么你有多个嵌套的存储库,这可能是造成这种混淆的原因。


    您应该考虑将此问题发布到Git邮件列表( git@vger.kernel.org )。 你可能会得到更及时和完整的回应。

    如果你决定在那里发帖,一定要包括:

  • 描述你想要达到的目标。
  • 对遇到的问题的描述。
  • 完整的会话日志显示:
  • cd到您的回购中的顶级目录
  • ls -al
  • cat .git/config
  • find . -name ".git*"
  • git status
  • git add editors
  • git add shells
  • git status
  • 链接地址: http://www.djcxy.com/p/16459.html

    上一篇: Unable to track files within Git submodules

    下一篇: Unable to update Git on Ubuntu