Skip to content
  • Jameson Miller's avatar
    status: add option to show ignored files differently · eec0f7f2
    Jameson Miller authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Teach the status command more flexibility in how ignored files are
    reported. Currently, the reporting of ignored files and untracked
    files are linked. You cannot control how ignored files are reported
    independently of how untracked files are reported (i.e. `all` vs
    `normal`). This makes it impossible to show untracked files with the
    `all` option, but show ignored files with the `normal` option.
    
    This work 1) adds the ability to control the reporting of ignored
    files independently of untracked files and 2) introduces the concept
    of status reporting ignored paths that explicitly match an ignored
    pattern. There are 2 benefits to these changes: 1) if a consumer needs
    all untracked files but not all ignored files, there is a performance
    benefit to not scanning all contents of an ignored directory and 2)
    returning ignored files that explicitly match a path allow a consumer
    to make more informed decisions about when a status result might be
    stale.
    
    This commit implements --ignored=matching with --untracked-files=all.
    The following commit will implement --ignored=matching with
    --untracked=files=normal.
    
    As an example of where this flexibility could be useful is that our
    application (Visual Studio) runs the status command and presents the
    output. It shows all untracked files individually (e.g. using the
    '--untracked-files==all' option), and would like to know about which
    paths are ignored. It uses information about ignored paths to make
    decisions about when the status result might have changed.
    Additionally, many projects place build output into directories inside
    a repository's working directory (e.g. in "bin/" and "obj/"
    directories). Normal usage is to explicitly ignore these 2 directory
    names in the .gitignore file (rather than or in addition to the *.obj
    pattern).If an application could know that these directories are
    explicitly ignored, it could infer that all contents are ignored as
    well and make better informed decisions about files in these
    directories. It could infer that any changes under these paths would
    not affect the output of status. Additionally, there can be a
    significant performance benefit by avoiding scanning through ignored
    directories.
    
    When status is set to report matching ignored files, it has the
    following behavior. Ignored files and directories that explicitly
    match an exclude pattern are reported. If an ignored directory matches
    an exclude pattern, then the path of the directory is returned. If a
    directory does not match an exclude pattern, but all of its contents
    are ignored, then the contained files are reported instead of the
    directory.
    
    Signed-off-by: default avatarJameson Miller <jamill@microsoft.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    eec0f7f2