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/config
search它。
如果没有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/