Git:我可以在status,diff等中禁止列出'modified content'/ dirty submodule条目吗?

时间:2010-07-13 19:48:00

标签: git git-submodules git-config

某些人(我认为在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中吗?从我最初看起来我不能,并且我没有看到任何有希望通过略读补丁。 (我想我仍然可以做别名。)

9 个答案:

答案 0 :(得分:160)

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

就在今天,我遇到了这个问题,并在找到解决方案之后立即在我的博客中写了一篇关于它的文章:How to ignore changes in git submodules

它的要点:

  

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

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

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

答案 1 :(得分:55)

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

第一个是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 :(得分:49)

更新:请参阅(和upvote)nilshaldenwanganswer有关向.gitmodules文件添加配置参数以忽略给定子模块的脏状态的可能性。

ignore = dirty

因此git 1.7.2已经发布,其中包含--ignore-submodules的{​​{1}}选项。

来自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).

我想要的值是git help status

dirty

我使用别名因为我很懒:

git status --ignore-submodules=dirty

答案 3 :(得分:11)

正如您所提到的,补丁git submodule: ignore dirty submodules for summary and status正在制作中。

也在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

关于此,选项不完全是approach chosen for now

  

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

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

  

为避免每次选项更改时都必须执行“git submdule sync”,我想先在.git/config中搜索它。
  如果在那里找不到,则会从.gitmodules获取,如果存在的话。

     

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


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

git config submodule.<name>.active false

点击“Ignore new commits for git submodule”了解更多信息。

答案 4 :(得分:10)

您也可以使用

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

submodule.ignore = dirty文件中设置.git/config--global会在~/.gitconfig中设置忽略标记并应用于您的所有存储库。没有它,它应该在.git/config中设置您当前的回购。

我能找到的唯一文件是submodule.<name>.ignore {{1}}。我把它从一个.gitmodules文件移到我的〜/ .gitconfig中,它仍然适用于我。

答案 5 :(得分:6)

您需要添加

  

忽略=脏

到.gitmodules

答案 6 :(得分:2)

所以git v1.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 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

答案 7 :(得分:1)

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

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

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

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

答案 8 :(得分:1)

我已经详细回答了这个问题here

只要运行

<script type="text/javascript">

    setTimeout(changeText,9000);

    function changeText(){
         var textChange = document.getElementById('change').innerHTML = 'IS LIfe'; 
    }

    changeText();
</script>  

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