如何使git默认忽略子模块的更改

8
自从 Git 引入了 gitmodules,我喜欢这样添加它们:
[submodule "actionbarsherlock"]
path = actionbarsherlock
url = git://github.com/JakeWharton/ActionBarSherlock.git
ignore = dirty

这里重要的部分是ignore = dirty
当使用git submodule add命令时,我被迫自己在.gitmodules文件中添加这行。
如何使这成为我将来进行的每个git submodule add的默认行为?
我知道submodule.<name>.ignore配置,但如何将其默认应用于所有内容?

不知道是否有默认的方法可以做到这一点,但是你可以很容易地添加一个别名或脚本来为你完成它。 - Christopher
我不知道如何通过别名来做到这一点。至于脚本,我只是希望git有一个默认选项。 - shkschneider
Git会将$PATH中以git-<command>开头的任何脚本视为别名,作为git <command>。你可以编写一个接受子模块名称、添加它并发出submodule.<name>.ignore配置的shell脚本,然后将其命名为git supersubmodule或其他名称。 - Christopher
@Christopher 我知道我可以这样做,所以真的没有git选项吗?如果是这样,请在您的最后一条评论中发布答案。 - shkschneider
6个回答

6
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-gui:https://github.com/git/git/commit/e0db1dd7d4bc87825f0d7d743f1a01b4461a59ff - VonC

3
今天我发现可以使用git config来更改.gitmodules文件,因此可以添加忽略脏标记而无需手动进入文件并添加该行:
git config -f .gitmodules submodule.actionbarsherlock.ignore dirty

在我的情况下,我能够使用该命令在脚本中自动化这两个步骤。

2
[submodule "book"]
    path = book
    url = https://user@bitbucket.org/user/repo.git
    ignore = all

或者使用
git config -f .gitmodules submodule.tests.ignore all

虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Yunnosch

2

因此,总的来说,没有默认选项(遗憾)。


这在git v2.7.0上仍然是有效的。 - Alexandre T.

1

我不确定是否有默认选项。如果它是二进制状态(忽略或不忽略),您可以采取以下措施:

diff.ignoreSubmodules
   Sets the default value of --ignore-submodules. Note that this affects only git diff Porcelain, and not lower level diff commands such as git diff-files.  git checkout also
   honors this setting when reporting uncommitted changes.

但是,由于您使用了dirty,我不确定是否有一种方法可以设置默认值。无论如何,您可以在$PATH中使用git别名来完成此操作。编写一个脚本,接受子模块作为参数并设置正确的dirty配置值,然后将该脚本添加到$PATH中。将其命名为git-<command>,它将作为git <command>可用。


好的,我知道diff和status的选项,但是想要更好的东西。脚本是一个可能的选择。 - shkschneider
这是一个适合提交到Git列表的好候选项。他们可以给您一个明确的答复,如果答案是否定的,则可能会提出一个补丁。 - Christopher

-1
你是指这个吗? git config --global core.ignore dirty 这将把偏好写入你的~/.gitconfig文件中。

我认为它不起作用。至少对我来说不起作用(git 1.8.5)。 - Paweł Gościcki
@brianclements 这个选项是在哪个版本中支持的? - shkschneider
我在Ubuntu 14.04上使用git 1.9.1。但是在第二次访问时,我认为这对我也不起作用。但是再说一遍,提醒我有关子模块的“新提交”和“未跟踪内容”的行为可能是我想要的行为,也许我误解了OP的问题。 - brianclements

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