【问题标题】:Unable to track files within Git submodules无法跟踪 Git 子模块中的文件
【发布时间】:2010-11-08 06:29:10
【问题描述】:

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

这个问题是基于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 都没有文件。

最后一个警告是什么意思?

【问题讨论】:

    标签: git add git-submodules


    【解决方案1】:

    更新

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

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

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

    对忽略的文件强制使用“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. 与您的主仓库历史中的子模块相关的任何提交。

    根据related SO question,您需要执行以下步骤才能完全删除子模块:

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

    1. .gitmodules 文件中删除相关行。
    2. .git/config中删除相关部分。
    3. 运行git rm --cached path_to_submodule(没有尾部斜杠)。
    4. 提交

    作为子模块一部分的文件现在没有被跟踪,您可以根据需要决定保留或删除它们(下面提到的一个警告)。

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

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

    1. cd path_to_submodule
    2. rm .git
    3. cd ..
    4. git add path_to_submodule
    5. git status
    6. 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 目录

    【讨论】:

    • 我在 ~/bin 和 HOME 运行 find ./ -iname .gitmodules 失败:没有 .gitmodules -file。 -- 我不确定问题到底出在哪里。
    • 我的~/.git/config~/bin/.git/config 都没有提到子模块
    • 那么两个问题: 1. 上面注释中的'~'是你的主目录还是repo的根目录? 2. 这个子模块是如何创建的?您是从其他位置复制子模块文件还是通过 git submodule add 命令创建的?
    • @Masi:根据您的 dpaste 链接,您的主仓库中有 2 个子模块。子模块文件夹是editors/vim/vimdocletshells/smallApps。如果要消除这两个子模块,则需要执行两次我的指令。每个子模块文件夹一次。您必须将子模块文件夹名称替换为我的说明中的 path_to_submodule
    • @Tim:我通过在 ~/bin 运行解决了问题:git rm --cached shells/smallApps --- 谢谢你的链接!
    【解决方案2】:

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

    $ find . -name .git
    

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

    【讨论】:

    • 看来我已经嵌套了Git repos。
    • 我应该如何处理./shells/smallApps/.git的回购?
    • 如果您不打算嵌套 Git 存储库(我不相信您这样做),那么只需:rm -rf shells/smallApps/.git 将其删除。对另一个也这样做。
    • 我删除了文件夹 shells/smallApps/.git 和文件 /shells/smallApps/.gitignore。我收到关于模块的完全相同的错误消息。
    • 我现在只有一个 git,没有嵌套的 Git。我仍然收到关于子模块的相同错误消息。
    【解决方案3】:

    您应该考虑将此问题发布到 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

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2012-02-29
      • 2010-11-28
      • 2019-07-08
      • 2017-07-23
      • 1970-01-01
      • 2015-09-13
      相关资源
      最近更新 更多