Git:我可以禁止列出状态,差异等“已修改内容” /脏子模块条目的列表吗?


123

某些时候(我认为大约在1.6.x版本中),git意识到子模块内部的变化。那只会惹恼我:

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

请停下来吗?

编辑:

好的,我有一个答案。现在我有另一个问题:

我可以放进去~/.gitconfig吗?从最初开始,我似乎无法做到,而且我也没有看到通过浏览补丁获得任何希望的地方。(我想我仍然可以使用别名。)


我在git邮件列表中看到了一些与此相关的补丁,日期为2010年6月。因此,希望它会在即将发布的版本中发布。(google
for'git

+1解释为什么会出现此消息!
dotancohen 2014年

Answers:


175

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

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

要点:

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

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

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

5
+1,但我将您博客文章的主要部分包含在您对SO的回答中:您的外部链接有一天会失效,而不是SO答案将永远存在(通过SO转储:blog.stackoverflow.com/2009/ 06 /…
VonC '02

5
我发现我需要git status按预期方式提交.gitmodules文件。我还相信您至少需要1.7.4或更高。
2012年

对于该.gitignore文件,exclude位于中有一个名为的私有版本,.git/info/未经版本处理。该.gitmodules文件是否有相应的文件,可让您仅在父存储库实例中抑制子模块中的更改,而无需对进行更改.gitmodules
HelloGoodbye

2
我无法将其与跟踪分支的子模块一起使用。不支持吗?```[子模块“ smstack / ansible / hosts”]路径= smstack / ansible / hosts url = https:// ...分支=主脚本ignore =脏````
Marc Abramowitz

1
@MarcAbramowitz我偶然发现了我认为的同一问题-您找到了解决方案吗?
塞巴斯蒂安·G·马里内斯库

61

您可以抑制两种更改通知。

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

2
对于该.gitignore文件,exclude位于中有一个名为的私有版本,.git/info/未经版本处理。该.gitmodules文件是否有相应的文件,可让您仅在父存储库实例中抑制子模块中的更改,而无需对进行更改.gitmodules
HelloGoodbye

1
HelloGoodbye:如果检查.git / modules / $ MODULENAME /,您将看到该模块的.git目录。在该位置更改信息/排除文件即可完成工作。
PaulW 2015年

1
ignore = all部分很有用。
艾瑞克·王

53

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

ignore = dirty

因此git 1.7.2已经发布,并且包含的--ignore-submodules选项status

来自git help status

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

我想要的价值是dirty

git status --ignore-submodules=dirty

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

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

2
由于这是一个公认的答案,我想您也应该ignore=dirty.gitmodules此处添加添加到文件中各个条目的选项。
Andriy Drozdyuk

14

正如您提到的那样,补丁 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

将其作为一种选择并不是目前选择的确切方法

在这一系列文章之后,我计划向添加一个配置选项' ignore' .gitmodules,可以为每个子模块将其设置为“全部”,“脏污”,“未跟踪”或“无”(默认)。

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

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

因此,用户可以覆盖设置,但如果不设置,上游可以轻松更改(例如,当子模块.gitignore已更新,从而ignore=untracked不再需要“ ”时,可以将其删除)。
如果分支之间的“ ignore”输入.gitmodules不同,切换分支也会立即生效。


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

git config submodule.<name>.active false

有关更多信息,请参见“ 忽略git子模块的新提交 ”。


我用gitconfig位更新了问题。如果您知道答案,请执行ping操作。
kch 2010年

@kch:我已经用当前建议的存储这种设置的方法更新了答案。
VonC

@drozzy:正如您在其他评论中所提到的:“ ignore = dirty
VonC'2

1
@drozzy:我已经通过附加的配置参数“ ignore = dirty”提高并完成了nilshaldenwang的答案,我编辑了官方答案,并在nilshaldenwang的帖子中添加了一个链接。
VonC '02

谢谢,没什么私人的,但是我只是想从头开始错过更有用的答案!
Andriy Drozdyuk

11

您也可以使用

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

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

我可以找到的唯一文档是submodule.<name>.ignoregit-config docs上。我将其从.gitmodules文件移到了〜/ .gitconfig中,它仍然对我有用。


@PawełGościcki我可以确认它可以在Git 2.0.0上运行。
西罗Santilli郝海东冠状病六四事件法轮功

6

您需要添加

忽略=脏

到.gitmodules


您将它添加到.gitmodules中的哪个位置?
Andriy Drozdyuk

@drozzy将其添加到要忽略的每个子模块的部分下,其中定义了“路径”和“ URL”值。
jsdalton

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

1
我在这里算了七个gits git clone git://git.kernel.org/pub/scm/git/git.git git
dotancohen 2014年

2

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

赶紧跑

git config --global diff.ignoreSubmodules dirty

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


1

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

为此,请将模式添加到.git/submodule_foo/bar/info/excludesubmodule_foo/bar/子模块的路径在哪里。

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

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

3
我认为这在子模块内部时也会隐藏更改。我只想在子模块之外隐藏更改。如果它们在内部,当我积极地在子模块上工作时出现,那很好。
拉斐尔·史威克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.