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/