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

时间:2009-07-05 22:34:27

标签: git add git-submodules

问题:当我./shells/smallApps/*处没有./.git/的文件时,./.git/info/exclude将文件添加到Git .gitignore -files。

此问题基于this tread,问题未能完全解决。

我跑

$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的文件。

上次警告的含义是什么?

3 个答案:

答案 0 :(得分:98)

<强>更新

Git忽略文件的原因有两个:gitignoresubmodules

更具体地说,以下条件会导致Git在调用“git add”时忽略文件:

  1. 该文件与模式$GIT_DIR/exclude匹配。
  2. 该文件与repo中.gitignore文件中的模式匹配。
  3. 该文件与用户特定的.gitignore文件中的模式匹配(由“git config --global core.excludesfile”指定)。
  4. 该文件是子模块的一部分。
  5. 在被忽略的文件上强制“git add”:

    您可以通过调用“git add full/path/to/file”来检查特定文件是否被忽略。

    手册页指出“如果在命令行中显式指定了被忽略的文件,该命令将失败,并显示一系列被忽略的文件。”

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

    消除子模块引用的说明:

    如前一个回答所述,shells/smallApps是您的资源库中的submodule

    如果文件是子模块的一部分,情况就更复杂了。您无法在主项目中修改子模块的内容。

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

    1. 主仓库中的.gitmodules文件。
    2. 主要回购邮件.git/config中的条目。
    3. 与主要仓库历史记录中的子模块相关的任何提交。
    4. 根据此related SO question,您需要执行以下步骤以完全删除子模块:

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

      1. .gitmodules文件中删除相关行。
      2. .git/config删除相关部分。
      3. 运行git rm --cached path_to_submodule(无尾随斜杠)。
      4. 提交
      5. 作为子模块一部分的文件现在未跟踪,您可以根据需要决定保留或删除它们(下面提到一个警告)。

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

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

        1. cd path_to_submodule
        2. rm .git
        3. cd ..
        4. git add path_to_submodule
        5. git status
        6. git commit
        7. <强>更新

          要求提供进一步的信息:

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

          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目录(位于您的回购根目录下)
          • .git
          • 中没有editors/vim/vimdoclet目录
          • .git
          • 中没有shells/smallApps目录

答案 1 :(得分:2)

我看到你已经git add说了一些关于子模块的事情。你有嵌套的Git存储库吗?这样做:

$ find . -name .git

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

答案 2 :(得分:2)

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

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

  • 您想要实现的目标的描述。
  • 您遇到的问题的说明。
  • 完整的会话日志显示:
    • cd到您的repo中的顶级目录
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status