Git: 是否可以在 status、 diff 等中禁止列出“修改内容”/脏子模块条目?

某个时候(我想是在1.6.x 版本前后) git 意识到了子模块内部的变化,这让我很恼火:

$ git status vendor | grep modified:
#       modified:   vendor/rails (modified content)
$ git diff vendor/
diff --git a/vendor/rails b/vendor/rails
--- a/vendor/rails
+++ b/vendor/rails
@@ -1 +1 @@
-Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f
+Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

求你让它停下来吧?

编辑:

好吧,我有答案了,现在我有另一个问题:

我能把这个放到 ~/.gitconfig吗?从我最初的情况来看,似乎我不能,我没有看到任何有希望的补丁浏览。(我想我还是可以化名的。)

60900 次浏览

正如你提到的,补丁 Git 子模块: 忽略汇总和状态的脏子模块正在制作中。

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

把这个作为一个选项并不完全是 目前选择的方法:

在这个系列之后,我计划在 .gitmodules中添加一个配置选项‘ ignore’,它可以为每个子模块设置为“ all”、“ ty”、“ untrack”或“ none”(默认值)。

git diff”和“ git status”将为每个子模块使用该配置值。
使用“ --ignore-submodule”覆盖这个默认设置(新的参数“ none”将添加到其中以覆盖配置设置)。

为了避免每次选项改变时都必须执行“ git submdule sync”,我想先在 .git/config中搜索它。
如果在那里没有找到它,它将从 .gitmodules,如果存在。

因此,用户可以覆盖设置,但如果他们不这样做,上游可以很容易地改变它(例如,当一个子模块 .gitignore已经更新,使“ ignore=untracked”不再是必要的,它可以被删除)。
此外,如果 .gitmodules中的“ ignore”条目在不同分支之间不同,切换分支将立即产生影响。


Git 2.13(Q22017)提供了另一种使 Git status (或任何 Git 命令)忽略特定子模块的方法:

git config submodule.<name>.active false

详情请看“ 忽略 git 子模块的新提交”。

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

$ git diff --ignore-submodules=dirty vendor
# no output
$ git status --ignore-submodules=dirty vendor
# On branch …
nothing to commit (working directory clean)

构建你自己的 git 如何:

# 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

更新: 请参阅(并更新) Nilshaldenwang回答,了解是否有可能在 .gitmodules文件中添加一个配置参数,以忽略给定子模块的脏状态。

ignore = dirty

因此,git 1.7.2已经过时,它包含了 status--ignore-submodules选项。

来自 git help status:

--ignore-submodules[=<when>]
Ignore changes to submodules when looking for changes.
<when> can be either "untracked", "dirty" or "all", which
is the default. When "untracked" is used submodules are
not considered dirty when they only contain untracked
content (but they are still scanned for modified content).
Using "dirty" ignores all changes to the work tree of
submodules, only changes to the commits stored in the
superproject are shown (this was the behavior before
1.7.0). Using "all" hides all changes to submodules (and
suppresses the output of submodule summaries when the
config option status.submodulesummary is set).

我想要的值是 dirty

git status --ignore-submodules=dirty

我用化名是因为我很懒:

alias gst='git status --ignore-submodules=dirty'

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

就在今天,我遇到了这个问题,在找到解决方案后,我立即在我的博客上写了一篇关于这个问题的文章: 如何忽略 git 子模块的更改

重点是:

一旦添加了子模块,存储库的根目录中就会有一个名为 .gitmodules的文件

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

[submodule "bundle/fugitive"]
path = bundle/fugitive
url = git://github.com/tpope/vim-fugitive.git
ignore = dirty

你也可以用

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

.git/config文件中设置 submodule.ignore = dirty--global将在 ~/.gitconfig中设置忽略标志,并应用于所有存储库。如果没有它应该设置在 .git/config为只是回购你目前在。

我能找到的关于这个的唯一文档是 submodule.<name>.ignoreGit-config 文档。我把它从。Gitmodule 文件到我的 ~/。Gitconfig,它仍然为我工作。

你得加上

ignore = dirty

.gitmodules

您可以禁止显示两种更改通知。

第一个是 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

您可能不希望将 ignore = dirty添加到 .gitmodules,您可能希望对希望忽略的更改进行更多的选择。

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

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

# in .git/submodule_foo/bar/info/exclude:
/build/

我已经更详细地回答了这个问题 给你

快跑

git config --global diff.ignoreSubmodules dirty

添加一个本地配置选项来忽略这些更改。