This is a .NET port of gitignore-parser for node.js by Ger Hobbelt
A simple yet complete .gitignore parser for .NET.
Install-Package GitignoreParserNet -Version 0.2.0.15
Supports all features listed in the GIT SCM gitignore manpage:
-
handles the
**wildcard anywhere- in both the usual usage, e.g.
foo/**/bar, and also in complexes such asyo/**la/bin - can be used multiple times in a single pattern, e.g.
foo/**/rec**on
- in both the usual usage, e.g.
-
handles the
*wildcard -
handles the
?wildcard -
handles
[a-z]style character ranges -
understands
!-prefixed negated patterns -
understands
\#,\[,\\, etc. filename escapes, thus handles patterns like\#*#correctly (hint: this is NOT a comment line!) -
deals with any sequence of positive and negative patterns, like this one from the
.gitignoremanpage:# exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
-
handles any empty lines and
#comment lines you feed it -
we're filename agnostic: the "
.gitignorefile" does not have to be named.gitignorebut can be named anything: this parser accepts.gitignore-formatted content from anywhere: you load the file, we do the parsing, you feed ourAccepts()orDenies()APIs any filenames / paths you want filtered and we'll tell you if it's a go or a no go. -
extra: an additional API is available for those of you who wish to have the complete and utter
.gitignoreexperience: use ourInspects(path)API to know whether the given gitignore filter set did actively filter the given file or did simple allow it to pass through.Read as: if the
.gitignorehas a pattern which matches the given file/path, then we will returntrue, otherwise we returnfalse.Use this in directory trees where you have multiple
.gitignorefiles in nested directories and are implementing tooling withgit-like.gitignorebehaviour.
static void Main(string[] args)
{
const string gitignorePath = @"D:\path\to\.gitignore";
var (accepted, denied) = GitignoreParser.Parse(gitignorePath: gitignorePath, ignoreGitDirectory: true);
foreach (string file in accepted)
Console.WriteLine(file);
}- As the
.gitignorespec differentiates between patterns such asfooandfoo/, where the latter only matches any directory namedfoo, you MUST pass the is-this-a-file-or-a-directory info to us when you invoke any of ourAccepts(),Denies()andInspects()APIs by making sure directory paths have a trailing/.
Apache 2, see LICENSE.md.