Git: can I suppress listing of 'modified content'/dirty submodule entries in status, diff, etc?

后端 未结 9 1640
谎友^
谎友^ 2020-11-28 02:32

Somewhen (around the 1.6.x releases, I think) git became aware of changes inside submodules. That only serves to annoy me:

$ git status vendor | grep modified:
#          


        
相关标签:
9条回答
  • 2020-11-28 02:33

    You may not want to add ignore = dirty to .gitmodules, you may want to be more selective about the changes you wished to ignore.

    To do that, add patterns to .git/submodule_foo/bar/info/exclude, where submodule_foo/bar/ is the path of the submodule.

    The patterns are similar to the patterns you would add to .gitignore, with the root being the submodule directory. For instance, this pattern ignores the build directory in the submodule submodule_foo/bar/:

    # in .git/submodule_foo/bar/info/exclude:
    /build/
    
    0 讨论(0)
  • 2020-11-28 02:42

    As you mention, the patch git submodule: ignore dirty submodules for summary and status is in the making.

    Also announced in the Git 1.7.2-rc2 release:

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

    "git status" learned "--ignore-submodules" option.

    Meaning:

    git config --global diff.ignoreSubmodules dirty
    

    Regarding this as an option is not exactly the approach chosen for now:

    After this series I am planning to add a config option 'ignore' to .gitmodules, which can be set for each submodule to either "all", "dirty", "untracked" or "none" (the default).

    "git diff" and "git status" will use that config value for each submodule.
    Using "--ignore-submodule" overrides this default (and the new parameter "none" will be added there to able to override the config settings).

    And to avoid having to do "git submdule sync" every time that option changes, I would like to search for it in .git/config first.
    If it is not found there, it will be taken from .gitmodules, if present.

    So users can override the setting but if they don't, upstream can change it easily (e.g. when a submodules .gitignore has been updated so that "ignore=untracked" is no longer necessary anymore it can be removed).
    Also switching branches will have an effect instantly if the 'ignore' entry in .gitmodules is different between branches.


    Another approach to make git status (or any git command) to ignore a particular submodule is available with Git 2.13 (Q2 2017):

    git config submodule.<name>.active false
    

    See more at "Ignore new commits for git submodule".

    0 讨论(0)
  • 2020-11-28 02:47

    There is even a possibility to set the ignore mode for every added submodule within the .gitmodules file.

    Just today I encountered this problem and immediately wrote an article in my blog about it after finding a solution: How to ignore changes in git submodules

    The gist of it:

    Once you added a submodule there will be a file named .gitmodules in the root of your repository

    Just add one line to that .gitmodules file:

    [submodule "bundle/fugitive"]
        path = bundle/fugitive
        url = git://github.com/tpope/vim-fugitive.git
        ignore = dirty
    
    0 讨论(0)
  • 2020-11-28 02:50

    So git v1.7.2-rc2 has what I want:

    $ git diff --ignore-submodules=dirty vendor
    # no output
    
    $ git status --ignore-submodules=dirty vendor
    # On branch …
    nothing to commit (working directory clean)
    

    Building your own 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
    
    0 讨论(0)
  • 2020-11-28 02:51

    You can also use

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

    to set submodule.ignore = dirty in your .git/config file. --global will set the ignore flag in your ~/.gitconfig and apply to all your repositories. Without it it should set in .git/config for just the repo you're in currently.

    The only documentation I can find on this is submodule.<name>.ignore at the git-config docs. I moved it from a .gitmodules file into my ~/.gitconfig and it's still working for me.

    0 讨论(0)
  • 2020-11-28 02:53

    Update: See (and upvote) nilshaldenwang's answer regarding the possibility to add to the .gitmodules file a config parameter for ignoring dirty state of a given submodule.

    ignore = dirty
    

    So git 1.7.2 is out and includes the --ignore-submodules option for status.

    From 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).
    

    The value that I want is dirty.

    git status --ignore-submodules=dirty
    

    I use an alias because I'm lazy:

    alias gst='git status --ignore-submodules=dirty'
    
    0 讨论(0)
提交回复
热议问题