Git:我可以压制状态,差异等“修改内容”/脏子模块条目列表?

有些时候(在1.6.x版本左右,我想)git意识到子模块内部的变化。 这只会使我烦恼:

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

请让它停止?

编辑:

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

我可以把它放在~/.gitconfig吗? 从我最初看来,我看不出来,我没有看到任何东西通过略读补丁。 (我想我仍然可以制作一个别名。)

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

就在今天,我遇到了这个问题,并立即在我的博客中find一个解决scheme后写了一篇文章: 如何忽略git子模块的变化

它的要点:

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

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

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

更新:看到(和upvote) nilshaldenwang有关可能性添加到.gitmodules文件的configuration参数忽略给定的子模块的脏状态的答案 。

 ignore = dirty 

所以git 1.7.2出来了,并且包含了--ignore-submodules选项的status

git help status

 - 忽略子模块[= <时>]
    在查找更改时忽略对子模块的更改。
     <什么时候>可以是“未跟踪”,“脏”或“全部”,哪一个
    是默认的。 当使用“untracked”子模块时
    当他们只包含未被跟踪的时候不被认为是肮脏的
    内容(但他们仍然被扫描修改内容)。
    使用“脏”忽略对工作树的所有更改
    子模块,只有更改存储在提交的提交
    超级项目显示(这是之前的行为
     1.7.0)。 使用“全部”隐藏对子模块的所有更改(和
    压缩子模块摘要的输出
    configuration选项status.submodulesummary设置)。

我想要的价值是dirty

 git status --ignore-submodules=dirty 

我使用一个别名,因为我很懒:

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

有两种变更通知你可以压制。

第一个是untracked content ,当您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 

正如你所提到的,补丁git子模块:忽略用于summary和statu的脏子模块正在制作中。

同时在Git 1.7.2-rc2发布中宣布:

 Git v1.7.2 Release Notes (draft) ================================ Updates since v1.7.1 -------------------- 

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

所以除非你编译了一个最新的版本,否则在当前的稳定版本中你还没有这个选项。


关于这个选项并不完全是现在select的方法 :

在这个系列之后,我打算为.gitmodules添加一个configuration选项' ignore ',可以为每个子模块设置为“all”,“dirty”,“untracked”或“none”(默认)。

git diff ”和“ git status ”将为每个子模块使用该configuration值。
使用“ --ignore-submodule ”覆盖这个默认值(并且新的参数“none”将被添加到那里以能够覆盖configuration设置)。

而且为了避免每次该选项改变时都要做“ git submdule sync ”,我想首先在.git/configsearch它。
如果没有find它,它将从.gitmodules ,如果存在的话。

因此,用户可以覆盖设置,但如果不这样做,上游可以轻松地进行更改(例如,子模块.gitignore已更新,以便“ ignore=untracked ”不再需要时可以删除)。
如果.gitmodules的' ignore '项在分支之间不同,切换分支也会立即生效。


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

 git config submodule.<name>.active false 

请参阅“ 忽略git子模块的新提交 ”。

你也可以使用

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

在你的.git / config文件中设置ignore = dirty。 --global将在〜/ .gitconfig中设置ignore标志,并将其应用于所有的仓库。 没有它,它应该设置在.git / config目前只是回购。

我能find的唯一文档是submodule.<name>.ignore在git-config文档中 。 我把它从一个.gitmodules文件移动到我的〜/ .gitconfig,它仍然为我工作。

你需要添加

忽略=脏

到.gitmodules

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

 $ git diff --ignore-submodules =脏的供应商
 #没有输出
 $ git status --ignore-submodules =肮脏的供应商
 #分行...
没有提交(工作目录清洁)

build立你自己的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 

您可能不想将ignore = dirty添加到.gitmodules ,您可能希望对您希望忽略的更改有更多的select。

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

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

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