2014年:请注意,即使有这样的配置,git 2.0.1(2014年6月25日)仍会显示已经暂存的子模块。
请参见
提交1d2f393,由
Jens Lehmann(jlehmann
)提供。
目前,将
submodule.<name>.ignore
和/或
diff.ignoreSubmodules
设置为"
all
"会抑制所有与子模块更改有关的输出,包括diff、状态和提交。
对于状态和提交来说,这真的很令人困惑,因为即使用户选择通过手动添加来记录被忽略的子模块的新提交,这个更改也不会显示在待提交的更改中。
更让人恼火的是,稍后执行"git commit"时,如果只有被忽略的子模块被暂存,会出现"nothing to commit"的错误。
通过始终使
wt_status
打印已暂存的子模块更改,无论配置了什么忽略设置,来修复这个问题。
唯一的例外是当用户明确使用"
--ignore-submodules=all
"命令行选项时,此时子模块输出仍然被抑制。
这也使得当只有被忽略的子模块的修改被暂存时,"git commit"命令再次正常工作,因为该命令使用
wt_status
结构体的"commitable"成员来确定是否存在已暂存的更改。
请参见
commit c215d3d,了解有关
git commit
部分的信息。
雪上加霜的是,稍后执行"git commit"命令时,如果只有被忽略的子模块被暂存,将会出现"nothing to commit"的错误提示。
实际上...在Git 2.42版本(2023年第三季度)中,即使
diff.ignoreSubmodules
告诉我们要忽略子模块的更改,使用已经记录了子模块更改的索引进行"
git commit
"
(man)操作应该将子模块更改包含在生成的提交中,但事实并非如此。
而这个问题已经得到修复!
查看
提交 5768478(2023年6月14日)由
Josip Sokcevic(sokac
)完成。
(由Junio C Hamano -- gitster
--在提交 4ee088d中合并,2023年6月23日)
diff-lib
:尊重override_submodule_config
标志位
签名:Josip Sokcevic
当设置了 `diff.ignoreSubmodules = all` 并且子模块的提交是手动暂存的(例如通过 `git-update-index`),`git-commit` 应该记录带有更新子模块的提交。
`index_differs_from` 从 `prepare_to_commit` 中调用,标志设置为 `override_submodule_config = 1`。
然后,`index_differs_from` 合并默认的 diff 标志和传递的标志。
当 `diff.ignoreSubmodules` 设置为 "all" 时,`flags` 的值将同时设置为 `override_submodule_config` 和 `ignore_submodules` 都为 1。这导致 `git-commit` 忽略已暂存的提交。
此补丁如果设置了 `flags.override_submodule_config`,则恢复原始的 `flags.ignore_submodule`。
git-<command>
开头的任何脚本视为别名,作为git <command>
。你可以编写一个接受子模块名称、添加它并发出submodule.<name>.ignore
配置的shell脚本,然后将其命名为git supersubmodule
或其他名称。 - Christopher