如何摆脱 Git 子模块的未跟踪状态?

我似乎无法摆脱 Git 子模块中未被跟踪的内容:

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#    modified:   bundle/snipmate (untracked content)
#    modified:   bundle/surround (untracked content)
#    modified:   bundle/trailing-whitespace (untracked content)
#    modified:   bundle/zencoding (untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

添加 --ignore-submodules参数隐藏了这些消息; 但是我想知道是否有一种方法可以以更合适的、核心的方式去除这些污点。

120094 次浏览

由于 git 状态报告未跟踪的内容,获得干净状态的实际方法是进入这些子模块中的每一个,并且:

  • 添加和提交未跟踪的内容,
  • 或者引用每个模块特有的 .gitignore中未跟踪的内容。
  • 或者可以将被忽略的内容添加到子模块的 .git/info/exclude中,如 特别的报告的 在评论中所示。
  • 或者向子模块规范中添加脏内容,如 Ezraspectre回答中提到的那样(对此进行了否决)。

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • or add a global .gitignore file (often ~/.gitignore-global). Like for example .DS_Store or in my case Carthage/Build as reported by Marián Černý in the comments. See .gitginore man page:

Patterns which a user wants Git to ignore in all situations (e.g., backup or temporary files generated by the user’s editor of choice) generally go into a file specified by core.excludesFile in the user’s ~/.gitconfig. Its default value is $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead.

您还可以访问每个子模块目录,作为一个单独的 git。 例如:

cd my/project/submodule
git status

.../获取修改后的文件列表/

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

您也可以更新您的远程子模块回购与

git submodule update

毕竟

我发现这个 博客文章整体工作。通过将 ignore = dirty选项添加到 .gitmodules文件中的每个条目。

[submodule "zen-coding-gedit3"]
path = zen-coding-gedit3
url = git://github.com/leafac/zen-coding-gedit3.git
ignore = dirty

这可能是由于子模块分支中的 detached HEAD造成的。如果是这种情况,进入子模块路径(例如: ./bundle/snipmate) ,然后运行 git checkout master

如果这是一个临时问题,您可以进入子模块文件夹并运行 git reset HEAD --hard,但是您将丢失子模块内部的所有更改。

我昨天在一个有近12个子模块的项目中陷入了这个问题。

git status显示输出。

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

为了解决未跟踪的内容错误,我必须使用 .gitignore从所有子模块中删除未跟踪的文件(所有子模块都是由 python 生成的 *.pyc*.pyo文件)。

为了解决另一个问题,我必须运行 git submodule update,它更新了每个子模块。

在我的情况下,我克隆模块作为 ZF2环境中新模块的起点。它的作用就是把它自己。Git 文件夹放入目录。

在这种情况下,解决方案是删除。Git 文件夹(可能需要显示隐藏文件才能查看)。

这对我来说效果很好:

git update-index --skip-worktree <path>

如果它在 pathname中不起作用,请尝试使用文件名。 如果你也喜欢这样,告诉我一声。

当您有另一个.git [隐藏文件夹]时,可能会发生这种情况 在特定的文件夹里。

已修改的: . . ./. . (已修改的内容,未跟踪的内容)

确保您的子目录不包含这个.git 文件夹。

如果是这种情况,问题可以通过从子目录中手动删除. git 文件夹来解决。

我更喜欢使用 源树,所以我的解决方案是在 SourceTree 中打开子模块 repo,它向我显示所有未跟踪文件的列表。然后我组选择他们所有然后使用“删除”。

我能做到这一点是因为我知道所有未被追踪的文件实际上并不需要。

根据我的经验,对于 MacOS 来说,这可能是因为创建了 ._文件: 在这种情况下: 尝试 dot_clean .

只需删除子文件夹中的. git 文件夹。