什么是“脏”子模块?

17

我在一个 .gitmodule 文件中看到了 ignore = dirty

示例:

[submodule "docs/submodules/netvirt"]
    path = docs/submodules/netvirt
    url = ../netvirt
    branch = .
    ignore = dirty
文档说明:
“dirty”将忽略子模块工作树的所有更改,仅考虑超级项目记录的提交和子模块HEAD之间的差异。
我不理解这意味着什么。有人能用简单易懂的语言来解释一下吗?
我的理解是,假设我将子模块添加到超级项目中时,它处于C状态(C处于HEAD),然后经过一段时间,现在它处于F状态(F处于HEAD)。ignore = dirty只会考虑D、E、F的更改(这正是它应该做的!)
显然,我误解了某些内容。那是什么?

1
这与非子模块的情况意思相同:“dirty”表示索引与HEAD不同和/或工作树与索引不同。每个子模块都是自己的存储库,因此要测试子模块是否“dirty”,请“cd”进入子模块并测试存储库是否“dirty”。 - torek
1
顺便说一下,我还不确定你的实际问题是什么。你正在运行哪些命令,它们做了什么让你感到意外,与你期望的有何不同? - torek
我的问题是关于一个特性而不是命令。只是想了解何时子模块会被称为“脏”。 - FlyingAura
2个回答

20

在 Git 中,“dirty”的意思与其他地方一样:所指的存储库跟踪了文件(已经提交过的文件),这些文件有修改但未提交,或者有新的未跟踪文件。

在“ignore = dirty”子模块设置的上下文中,这意味着如果子模块是“dirty”的(即具有已修改但未提交的跟踪文件和/或新的未跟踪文件),此类更改将被忽略。不会被忽略的是签出的提交之间的差异,例如父项目指向提交“C”,但子模块当前已签出提交“F”。

以下是子模块的可能状态以及使用设置“ignore = dirty”的父项目中的状态:

  1. 子模块签出的提交与记录在父项目中的相同,工作目录干净(没有修改或未跟踪的文件)。父项目显示子模块没有更改。
  2. 子模块签出的提交与记录在父项目中的相同,工作目录为“dirty”(有修改或未跟踪的文件)。父项目显示子模块没有更改(因为使用了“ignore = dirty”)。
  3. 子模块签出的提交与记录在父项目中的不同,工作目录干净。父项目显示子模块有更改(可视化为提交哈希值的更改)。
  4. 子模块签出的提交与记录在父项目中的不同,工作目录为“dirty”。父项目显示子模块有更改(仍可视化为提交哈希值的更改,因为使用了“ignore = dirty”)。

0
在我的情况下,我有4个文件在vscode中自动格式化保存,虽然内容没有变化,但格式化导致它们被视为已修改但未提交。找到这些文件,撤消格式化,"dirty"引用就消失了。

那是使用 .gitmodule 文件中的 ignore = dirty 的一个很好的理由。 - fabda01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接