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

kch*_*kch 119 git git-config git-submodules

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

Nil*_*ang 165

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

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

它的要点:

添加子模块后,将.gitmodules在存储库的根目录中指定一个文件

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

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
Run Code Online (Sandbox Code Playgroud)

  • +1,但是我将你博客文章的主要部分包括在你的答案中:你的外部链接有一天会变得无效,而不是永远存在的SO答案(通过SO转储:http://blog.stackoverflow. COM/2009/06 /堆栈溢出创意公共数据转储/) (4认同)
  • 我发现我需要在`git status`按预期工作之前提交.gitmodules文件.我相信你还需要至少1.7.4或更高. (4认同)
  • 我无法使用跟踪分支的子模块.它不受支持吗?```[submodule"smstack/ansible/hosts"] path = smstack/ansible/hosts url = https:// ... branch = master ignore = dirty`````` (2认同)

ale*_*emb 58

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

第一种是untracked content当您对子模块进行更改但尚未提交子模块时会发生的情况.父存储库会注意到这些并相应地git status报告它:

modified: modules/media (untracked content)

您可以使用以下方法来抑制

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty
Run Code Online (Sandbox Code Playgroud)

但是,一旦您提交了这些更改,父存储库将再次注意并相应地报告它们:

modified:   modules/media (new commits)
Run Code Online (Sandbox Code Playgroud)

如果您也想要抑制这些,则需要忽略all更改

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all
Run Code Online (Sandbox Code Playgroud)

  • 对于`.gitignore`文件,位于.git / info /`中有一个名为`exclude`的私有版本,未经版本处理。.gitmodules`文件是否有一个对应的文件,可以让您仅在父存储库实例中抑制子模块中的更改,而无需对.gitmodules进行更改? (2认同)
  • HelloGoodbye:如果您检查 .git/modules/$MODULENAME/ 您会看到该模块的 .git 目录。更改该位置的信息/排除文件即可完成此任务。 (2认同)

kch*_*kch 51

更新:请参阅(和upvote)nilshaldenwang关于是否可以向文件添加配置参数以忽略给定子模块的脏状态的答案.gitmodules.

ignore = dirty
Run Code Online (Sandbox Code Playgroud)

所以git 1.7.2已经出来并包含了--ignore-submodules选项status.

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

我想要的价值是dirty.

git status --ignore-submodules=dirty
Run Code Online (Sandbox Code Playgroud)

我使用别名因为我很懒:

alias gst='git status --ignore-submodules=dirty'
Run Code Online (Sandbox Code Playgroud)

  • 由于这是一个可接受的答案,因此我认为您还应该在此处将选项“ ignore = dirty”添加到.gitmodules文件中的各个条目中。 (2认同)

Von*_*onC 13

正如您所提到的,补丁 git子模块:忽略脏的子模块以获取摘要和状态.

也在Git 1.7.2-rc2版本中宣布:

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------
Run Code Online (Sandbox Code Playgroud)

" git status"学会了" --ignore-submodules"选项.

含义:

git config --global diff.ignoreSubmodules dirty
Run Code Online (Sandbox Code Playgroud)

关于这个选项并不是现在选择方法:

在本系列之后,我计划添加一个配置选项' ignore' .gitmodules,可以为每个子模块设置为"all","dirty","untracked"或"none"(默认值).

" 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
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅" 忽略git子模块的新提交 ".


kje*_*ll_ 11

你也可以使用

% git config [--global] submodule.ignore dirty
Run Code Online (Sandbox Code Playgroud)

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

我可以找到关于这个问题的唯一文档是submodule.<name>.ignore混帐配置文档.我把它从一个.gitmodules文件移到我的〜/ .gitconfig中,它仍然适用于我.


Rom*_*man 6

你需要添加

ignore = dirty

到.gitmodules