C# 从gitignore筛选文件和路径

C# 从gitignore筛选文件和路径,c#,git,gitignore,C#,Git,Gitignore,我希望使用C#查找未被.gitignore(或子目录中的任何嵌套.gitignore文件)过滤的所有文件路径。这与PHP方面的类似。我想知道是否有人知道这段代码是否已经在网上的某个地方提供了 更新:为了回答我的需要,我可以为某些项目运行我自己的源文件定期备份(压缩结果),以增加内心的平静。最困难的部分是获得一个健壮的.gitignore解析器来获取过滤后的文件路径(并排除其他路径),而不想在其他人已经为我做过的情况下过分卷入该规范的学习中。如果不确切知道要对列表做什么,就很难提出建议(在构建脚本

我希望使用C#查找未被.gitignore(或子目录中的任何嵌套.gitignore文件)过滤的所有文件路径。这与PHP方面的类似。我想知道是否有人知道这段代码是否已经在网上的某个地方提供了


更新:为了回答我的需要,我可以为某些项目运行我自己的源文件定期备份(压缩结果),以增加内心的平静。最困难的部分是获得一个健壮的.gitignore解析器来获取过滤后的文件路径(并排除其他路径),而不想在其他人已经为我做过的情况下过分卷入该规范的学习中。

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

我在C#中找不到一个,但是没有太多的代码要转换,它同时公开了一个
接受
拒绝
方法来获取包含或忽略的文件列表。它有相当好的文档记录,有测试,并且它使用的正则表达式在C#中的效果与在JavaScript中的效果一样好

如果在运行C代码的机器上安装了Git,则可以从C#开始工作

还请注意,Visual Studio插件在IDE中提供了列表,以及复选框和一起提交某些文件的功能,以及许多在命令行上很难实现的其他功能

注意:Git源代码管理提供程序是开源的(用C#编写),您可以查看源代码,但反向工程可能比JavaScript项目涉及的更多


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

git检查忽略
该命令可用于检测哪些文件被忽略以及为什么被忽略。
--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
模式下打印出
--不匹配的
文件,因为它仅在该模式下打印出额外信息,这些信息将告诉您文件是否被忽略。(它总是打印被忽略的文件。)路径在格式中每行显示一条

来源:linenum:patternpath

冒号分隔的字段是导致忽略路径的信息(例如
.gitignore
文件中的一行),如果不忽略该文件,这些字段将为空

然后,
sed
命令过滤输出,以仅显示被忽略文件的路径。
-n
选项告诉它默认情况下不打印输入行。出于纯粹的美学原因,第一个替换模式将
/
替换为
,删除了前面的
/
。第二个替换完成实际工作,删除任何开始一行的
::
(表示没有“忽略”信息),如果替换发生,则打印该行的剩余部分,这是一个未忽略的路径

您可以对其进行进一步过滤以进行附加处理;我为一个脚本构建了这个脚本,该脚本按照以下几行进行标记检查:

markdownlint $(find_nonignored | grep '\.md$')
笔记
  • 此代码在输出中包含未跟踪的文件(即,从未添加到Git repo或暂存),这通常是您想要的。(例如,测试系统在运行
    git add
    之前仍然应该检查新文件。)请注意,涉及
    git ls文件的其他解决方案通常不会这样做

  • 上述代码依赖于使用GNU
    sed
    ,它将
    \t
    解释为一个选项卡。如果您使用的是BSD
    sed
    (例如在MacOS上),您可能需要稍微调整一下。检查评论,看看是否有人对此有提示

  • 这里的所有代码在带有空格或其他“不寻常”字符的路径上中断;需要在多个位置对其进行修改(例如使用
    -print0
    find
    )以解决此问题。为了保持解释的简单性,我在这里不讨论这样的问题。我还将函数的泛化留给其他人在任意路径上工作,而不仅仅是在当前工作目录上工作

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

    根据.gitignore规范2.29.2,在C#中实现基于.gitignore的解析器。该库根据真实的git状态输出进行测试。测试使用LibGit2Sharp来实现这一点


    它是其他开源库的一种端口,到目前为止,它在我的其他项目中运行良好。

    请针对您遇到的特定问题发布一个尝试,而不是“我如何才能做到这一点”的问题。此外,看起来你链接的PHP版本可以很容易地转移到C#上。如果这样问是否已经有一个在线代码解决方案可以解决这样的问题是不合适的,我会觉得很失望。我会的