145

有时(我认为大约是 1.6.x 版本)git 开始意识到子模块内部的变化。那只会惹恼我:

$ git status 供应商 | grep 修改:
# modified: vendor/rails (修改内容)
$ git diff 供应商/
diff --git a/vendor/rails b/vendor/rails
--- a/供应商/rails
+++ b/供应商/rails
@@ -1 +1 @@
-子项目提交 046c900df27994d454b7f906caa0e4226bb42b6f
+子项目提交 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

请让它停下来?

编辑:

好的,所以我有一个答案。现在我还有一个问题:

我可以把这个放进去~/.gitconfig吗?从我最初的情况来看,我似乎做不到,而且通过浏览补丁,我没有看到任何有希望的东西。(我想我仍然可以制作别名。)

4

9 回答 9

198

甚至可以为 .gitmodules 文件中添加的每个子模块设置忽略模式。

就在今天遇到了这个问题,找到解决办法后立马在我的博客上写了一篇文章:如何忽略git子模块的变化

它的要点:

.gitmodules添加子模块后,存储库的根目录中将有一个名为的文件

.gitmodules只需在该文件中添加一行:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
于 2011-04-04T18:07:14.213 回答
77

您可以隐藏两种更改通知。

第一个是untracked content当您对子模块进行更改但尚未提交这些更改时发生的。父存储库注意到这些并git status相应地报告:

modified: modules/media (untracked content)

您可以使用以下命令抑制这些:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

但是,一旦您提交了这些更改,父存储库将再次注意到并相应地报告它们:

modified:   modules/media (new commits)

如果您也想抑制这些,则需要忽略all更改

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all
于 2012-09-21T09:14:39.363 回答
59

更新:请参阅(并赞成)nilshaldenwang回答,了解是否可以将配置参数添加到.gitmodules文件中以忽略给定子模块的脏状态。

ignore = dirty

所以 git 1.7.2 已经发布并--ignore-submodules包含status.

来自git help status

--ignore-submodules[=<何时>]
    查找更改时忽略对子模块的更改。
    <when> 可以是“untracked”、“dirty”或“all”,其中
    是默认值。当使用“未跟踪”时,子模块是
    当它们只包含未跟踪时不被认为是脏的
    内容(但仍会扫描它们以查找修改过的内容)。
    使用“脏”会忽略对工作树的所有更改
    子模块,仅更改存储在
    显示了超级项目(这是之前的行为
    1.7.0)。使用“all”隐藏对子模块的所有更改(和
    当
    配置选项 status.submodulesummary 已设置)。

我想要的价值是dirty.

git status --ignore-submodules=dirty

我使用别名是因为我很懒:

alias gst='git status --ignore-submodules=dirty'
于 2010-07-27T05:34:00.250 回答
20

正如您所提到的,补丁 git submodule: ignore dirty submodules for summary and status正在制作中。

Git 1.7.2-rc2版本中也宣布:

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

git status”学会了“ --ignore-submodules”选项。

意义:

git config --global diff.ignoreSubmodules dirty

将此作为一种选择并不完全是目前选择的方法

在本系列之后,我计划添加一个配置选项 ' ignore' .gitmodules,可以将每个子模块设置为“all”、“dirty”、“untracked”或“none”(默认值)。

" git diff" 和 " git status" 将为每个子模块使用该配置值。
使用“ --ignore-submodule”覆盖此默认值(并且将在那里添加新参数“none”以覆盖配置设置)。

并且为了避免git submdule sync每次该选项更改时都必须执行“”,我想先搜索它.git/config
如果在此处找不到,则将从 中获取.gitmodules(如果存在)。

因此用户可以覆盖该设置,但如果他们不这样做,上游可以轻松更改它(例如,当子模块.gitignore已更新以使“ ignore=untracked”不再需要时,可以将其删除)。如果分支之间的“ ”条目不同,
切换分支也会立即产生影响。ignore.gitmodules


Git 2.13(2017 年第二季度)提供了另一种使 git status(或任何 git 命令)忽略特定子模块的方法:

git config submodule.<name>.active false

在“忽略 git 子模块的新提交”中查看更多信息。

于 2010-07-13T20:19:57.543 回答
13

你也可以使用

% git config [--global] submodule.ignore dirty

submodule.ignore = dirty在您的.git/config文件中设置。--global将在您的中设置忽略标志~/.gitconfig并应用于您的所有存储库。没有它,它应该.git/config只用于您当前所在的存储库。

我能找到的唯一文档是submodule.<name>.ignoregit -config docs。我将它从 .gitmodules 文件移动到我的 ~/.gitconfig 中,它仍然为我工作。

于 2011-08-04T02:19:40.420 回答
7

您需要添加

ignore = dirty

.gitmodules

于 2011-11-28T08:03:54.797 回答
3

我已经在这里更详细地回答了这个问题。

赶紧跑

git config --global diff.ignoreSubmodules dirty

添加本地配置选项以忽略这些更改。

于 2018-09-11T13:26:40.350 回答
2

所以 git v1.7.2-rc2 有我想要的:

$ git diff --ignore-submodules=肮脏的供应商
# 没有输出
$ git status --ignore-submodules=肮脏的供应商
# 在分支上……
没有什么可提交的(工作目录干净)

构建自己的 git howto:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html
于 2010-07-13T20:35:57.780 回答
1

您可能不想添加ignore = dirty.gitmodules,您可能希望对您希望忽略的更改更具选择性。

为此,将模式添加到.git/submodule_foo/bar/info/exclude,其中submodule_foo/bar/是子模块的路径。

这些模式类似于您要添加到的模式.gitignore,根是子模块目录。例如,此模式忽略build子模块中的目录submodule_foo/bar/

# in .git/submodule_foo/bar/info/exclude:
/build/
于 2016-04-18T10:22:55.830 回答