从gitignore中过滤文件和路径

本文关键字:路径 文件 过滤 gitignore | 更新日期: 2023-09-27 18:12:15

我想找到所有的文件路径不是过滤的。gitignore(或任何嵌套的。gitignore文件在子目录中)使用c#。这与这里关于PHP的问题类似。我想知道是否有人知道这个代码是否已经在网上某处可用(在c#中)。

UPDATE:为了回答我想要这个的原因,这是为了让我可以为某些项目运行我自己的小定期备份我的源文件(压缩结果),以增加安心。困难的部分是获得一个健壮的.gitignore解析器来获取过滤的文件路径(并排除其他路径),如果其他人已经为我完成了,则不想过于卷入学习该规范的过程中。

从gitignore中过滤文件和路径

解析.gitignore文件(以及Git使用的其他文件,如$GIT_DIR/info/exclude)的最佳方法是让Git为您完成。:-)(在你的情况下,事实上,大多数情况下,这确实涉及到执行git子进程。)

git check-ignore

git check-ignore命令可用于检测忽略哪些文件及其原因。--non-matching选项使它也告诉您未被忽略的文件,但由于它仍然以特殊格式告诉您被忽略的文件,因此您需要做一些进一步的工作来获得非被忽略文件的简单列表。下面是Bourne shell函数:

find_nonignored() {
    find . -path ./.git -prune -o -print '
        | git check-ignore --verbose --non-matching --stdin '
        | sed -n -e 's,'t./,'t,' -e 's,^::'t*,,p' '
}

如何使用

find命令查找当前工作目录中及以下的所有文件,该目录应该位于您试图过滤的树中的某个位置。我们从输出中排除顶级.git子目录及其下的所有内容(如果存在);/.git/不在典型的.gitignore文件中,因为Git会自动忽略它,因此git check-ignore通常认为它"未被忽略"。

git check-ignore只会在--verbose模式下打印出--non-matching文件,因为只有在这种模式下,它才会打印出额外的信息,告诉你文件是否被忽略。(它总是打印被忽略的文件。)每行一个路径,格式为

: linenum : 模式 & lt; TAB>路径

冒号分隔的字段是关于导致路径被忽略的原因的信息(例如.gitignore文件中的一行),如果文件不被忽略,则为空。

sed命令然后过滤输出,只显示被忽略的文件的路径。-n选项告诉它默认情况下不输出输入行。第一个替换模式仅用<TAB>替换<TAB>./,删除前面的./,纯粹是出于美观的原因。第二次替换完成了真正的工作,删除了行开头的任何::<TAB>(表示没有"忽略"信息),如果替换发生了,则打印行剩下的非忽略路径。

您可以进一步过滤以进行额外处理;我为一个脚本构建了这个脚本,它按照以下行进行降价检查:

markdownlint $(find_nonignored | grep ''.md$')
指出

  1. 此代码在输出中包含未跟踪的文件(即从未添加到Git仓库或暂存),这通常是您想要的。(例如,测试系统仍然应该在新文件上运行git add之前检查它们。)注意,其他涉及git ls-files之类的解决方案通常不会这样做。

  2. 以上代码依赖于使用GNU sed,它将't解释为选项卡。如果你使用的是BSD sed(比如在MacOS上),你可能需要稍微调整一下。查看评论,看看是否有人有提示。

  3. 这里的所有代码都在带有空格或其他"不寻常"字符的路径上中断;它需要在几个地方进行修改(例如使用-print0find)来解决这个问题。我在这里不处理这样的问题是为了使解释简单。我还把函数的泛化工作留给了其他人,让它在任意路径上工作,而不仅仅是在当前工作目录上工作。

如果不知道你想对列表做什么(在构建脚本中使用它,以某种方式处理文件,只是在UI上查看它们,等等),就很难提出建议

我在c#中找不到一个,但是这个JavaScript gitignore解析器没有很多代码要转换,它暴露了acceptsdenies方法来获得包含或忽略的文件列表。它有很好的文档,有测试,它使用的正则表达式在c#和JavaScript中都可以很好地工作。

这个答案可以在c#中工作,只要你在运行c#代码的机器上安装了Git。

还要注意的是,Visual Studio的Git源代码控制提供程序插件在IDE中提供了列表,以及复选框和一起提交某些文件的能力,以及许多其他难以在命令行上完成的功能。

注意:Git源代码控制提供程序是开源的(用c#编写),你可以在这里查看源代码,但它可能比JavaScript项目更涉及逆向工程。

对于那些正在寻找c#库的人,你也可以看看这个

。基于gitignore的解析器,根据.gitignore规范2.29.2在c#中实现。该库是针对真实的git状态输出进行测试的。测试使用LibGit2Sharp。

https://github.com/goelhardik/ignore

它是一种其他开源库的移植,到目前为止看起来它在我的其他项目中工作得很好。