Git command to show which specific files are ignored by .gitignore

后端 未结 9 1054
我在风中等你
我在风中等你 2020-11-22 05:07

I am getting my feet wet with Git and have the following issue:

My project source tree:

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...
         


        
相关标签:
9条回答
  • 2020-11-22 05:43

    Assuming there are a few ignore directories, why not use "git status node/logs/" which will tell you what files are to be added? In the directory I have a text file that is not part of status output, e.g.:

    On branch master
    Your branch is up-to-date with 'origin/master'.
    Untracked files:
    (use "git add ..." to include in what will be committed)

        node/logs/.gitignore 
    

    .gitignore is:

    *

    !.gitignore

    0 讨论(0)
  • 2020-11-22 05:44

    Notes:

    • xiaobai's answer is simpler (git1.7.6+): git status --ignored
      (as detailed in "Is there a way to tell git-status to ignore the effects of .gitignore files?")
    • MattDiPasquale's answer (to be upvoted) git clean -ndX works on older gits, displaying a preview of what ignored files could be removed (without removing anything)

    Also interesting (mentioned in qwertymk's answer), you can also use the git check-ignore -v command, at least on Unix (doesn't work in a CMD Windows session)

    git check-ignore *
    git check-ignore -v *
    

    The second one displays the actual rule of the .gitignore which makes a file to be ignored in your git repo.
    On Unix, using "What expands to all files in current directory recursively?" and a bash4+:

    git check-ignore **/*
    

    (or a find -exec command)

    Note: https://stackoverflow.com/users/351947/Rafi B. suggests in the comments to avoid the (risky) globstar:

    git check-ignore -v $(find . -type f -print)
    

    Make sure to exclude the files from the .git/ subfolder though.


    Original answer 42009)

    git ls-files -i
    

    should work, except its source code indicates:

    if (show_ignored && !exc_given) {
                    fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                            argv[0]);
    

    exc_given ?

    It turns out it need one more parameter after the -i to actually list anything:

    Try:

    git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore
    

    (but that would only list your cached (non-ignored) object, with a filter, so that is not quite what you want)


    Example:

    $ cat .git/ignore
    # ignore objects and archives, anywhere in the tree.
    *.[oa]
    $ cat Documentation/.gitignore
    # ignore generated html files,
    *.html
    # except foo.html which is maintained by hand
    !foo.html
    $ git ls-files --ignored \
        --exclude='Documentation/*.[0-9]' \
        --exclude-from=.git/ignore \
        --exclude-per-directory=.gitignore
    

    Actually, in my 'gitignore' file (called 'exclude'), I find a command line that could help you:

    F:\prog\git\test\.git\info>type exclude
    # git ls-files --others --exclude-from=.git/info/exclude
    # Lines that start with '#' are comments.
    # For a project mostly in C, the following would be a good set of
    # exclude patterns (uncomment them if you want to use them):
    # *.[oa]
    # *~
    

    So....

    git ls-files --others --ignored --exclude-from=.git/info/exclude
    git ls-files -o -i --exclude-from=.git/info/exclude
    
    git ls-files --others --ignored --exclude-standard
    git ls-files -o -i --exclude-standard
    

    should do the trick.

    As mentioned in the ls-files man page, --others is the important part, in order to show you non-cached, non-committed, normally-ignored files.

    --exclude_standard is not just a shortcut, but a way to include all standard "ignored patterns" settings.

    exclude-standard
    Add the standard git exclusions: .git/info/exclude, .gitignore in each directory, and the user's global exclusion file.

    0 讨论(0)
  • 2020-11-22 05:54

    Here's how to print the complete list of files in the working tree which match patterns located anywhere in Git's multiple gitignore sources (if you're using GNU find):

    $ cd {your project directory}
    $ find . -path ./.git -prune -o -print \
    | git check-ignore --no-index --stdin --verbose
    

    It will check all the files in the current branch of the repository (unless you've deleted them locally).

    And it identifies the particular gitignore source lines, as well.

    Git continues to track changes in some files which match gitignore patterns, simply because those files were added already. Usefully, the above command displays those files, too.

    Negative gitignore patterns are also matched. However, these are easily distinguishable in the listing, because they begin with !.

    If you're using Windows, Git Bash includes GNU find (as revealed by find --version).

    If the list is long (and you have rev), you can display them by extension (somewhat), too:

    $ cd {your project directory}
    $ find . -path ./.git -prune -o -print \
    | git check-ignore --no-index --stdin --verbose \
    | rev | sort | rev
    

    For more details, see man find, man git-check-ignore, man rev, and man sort.

    The point of this whole approach is that Git (the software) is changing rapidly and is highly complex. By contrast, GNU's find is extremely stable (at least, in its features used here). So, anyone who desires to be competitive by displaying their in-depth knowledge of Git will answer the question in a different way.

    What's the best answer? This answer deliberately minimizes its reliance on Git knowledge, toward achieving the goal of stability and simplicity through modularity (information isolation), and is designed to last a long time.

    0 讨论(0)
  • 2020-11-22 05:54

    (extending the other answers)

    Note, git check-ignore uses the committed .gitignore and not the one in your working tree! To play with it without polluting your git history, you might freely try to edit it, and then commit with a git commit --amend.

    This problem happens mainly if you need a workaround of the problem, that git doesn't follow directories. Enter in the .gitignore:

    dirtokeep/**
    !dirtokeep/.keep
    

    .keep should be a zero-length file in dirtokeep.

    The result will be that everything in dirtokeep will be ignored, except dirtokeep/.keep, which will result that also the dirtokeep directory will be constructed on clone/checkout.

    0 讨论(0)
  • 2020-11-22 05:56

    Git now has this functionality built in

    git check-ignore *
    

    Of course you can change the glob to something like **/*.dll in your case

    Git Reference

    0 讨论(0)
  • 2020-11-22 06:01

    There is a much simpler way to do it (git 1.7.6+):

    git status --ignored
    

    See Is there a way to tell git-status to ignore the effects of .gitignore files?

    0 讨论(0)
提交回复
热议问题