【问题标题】:How to make git ignore changes to submodules by default如何让 git 默认忽略对子模块的更改
【发布时间】:2012-10-31 14:14:00
【问题描述】:

由于在 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的配置,但如何默认应用到所有?

【问题讨论】:

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

标签: git git-submodules gitignore git-config


【解决方案1】:

请注意,即使有这样的配置,git 2.0.1(2014 年 6 月 25 日)仍会向您显示已暂存的子模块。

commit 1d2f393Jens Lehmann (jlehmann)

当前将 submodule.<name>.ignore 和/或 diff.ignoreSubmodules 设置为“all”会抑制 diff 系列、状态和提交的子模块更改的所有输出。

对于状态和提交,这确实令人困惑,因为即使用户选择通过手动添加来为忽略的子模块记录新提交,此更改也不会显示在待提交的更改下.
雪上加霜的是,当仅暂存忽略的子模块时,稍后的“git commit”将出错并显示“nothing to commit”。

通过使wt_status 始终打印分阶段的子模块更改来解决此问题,无论配置了什么忽略设置。
唯一的例外是当用户明确使用“--ignore-submodules=all”命令行选项时,在这种情况下子模块输出仍然被抑制。
这也使得“git commit”在只修改被忽略的子模块时再次工作 暂存,因为该命令使用 wt_status 结构的“可提交”成员来确定是否存在暂存更改。

有关git commit 部分,另请参阅commit c215d3d

【讨论】:

【解决方案2】:

所以要关闭它,,它没有默认选项(遗憾)。

【讨论】:

  • 这在 git v2.7.0 上似乎仍然正确。
【解决方案3】:

今天发现可以使用git config来更改.gitmodules文件,因此不用进入文件手动添加行就可以添加忽略脏标志:

git config -f .gitmodules submodule.actionbarsherlock.ignore dirty

就我而言,我能够使用该命令自动执行脚本中的两个步骤。

【讨论】:

    【解决方案4】:

    我不确定默认选项。如果它是二元状态(忽略与否),您可以通过以下方式获得牵引力:

    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> 的形式提供。

    【讨论】:

    • 好的,我知道差异和状态的选项,但想要更好的东西。脚本是一个可能的选择。
    • 这是 git 列表的好候选。他们可以给你一个明确的答案,如果答案是“否”,可能会提出补丁。
    【解决方案5】:
    [submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = all
    

    或使用

    git config -f .gitmodules submodule.tests.ignore all
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。
    【解决方案6】:

    你是这个意思吗?

    git config --global core.ignore dirty

    它将首选项写入您的~/.gitconfig 文件。

    【讨论】:

    • 我认为它不起作用。至少它对我不起作用(git 1.8.5)。
    • @brianclements 什么版本支持这个选项?
    • 我在 Ubuntu 14.04 上使用 git 1.9.1。但是在第二次重访时,我认为这对我也不起作用。但是话又说回来,提醒我子模块的“新提交”和“未跟踪的内容”是我想要的行为,也许我误解了 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2010-12-07
    • 1970-01-01
    • 2018-08-14
    • 2010-09-08
    • 2015-02-06
    • 2017-02-08
    相关资源
    最近更新 更多