我想找到所有未使用C#在.gitignore(或子目录中的任何嵌套.gitignore文件)中过滤的文件路径。这与关于PHP的question here类似。我想知道是否有人知道这个代码是否已经在线提供(在C#中)。
更新:为了回答我想要的内容,我可以为某些项目运行我自己的源代码文件的定期备份(压缩结果),让您更加放心。困难的部分是获得一个强大的.gitignore解析器来获取过滤后的文件路径(并排除其他路径),而不想变得过于卷入学习该规范,如果其他人已经为我做过。
如果不确切地知道你想对列表做什么(在构建脚本中使用它,以某种方式处理文件,只在UI上查看它们等),就很难提出建议。
我在C#中找不到一个,但this JavaScript gitignore parser没有很多代码可以转换,它暴露了accepts
和denies
方法来获取包含或忽略文件的列表。它有很好的文档记录,有测试,它使用的正则表达式在C#中也可以像在JavaScript中一样工作。
如果你在运行C#代码的机器上安装了Git,那么This answer可以在C#中运行。
另请注意,Visual Studio的Git Source Control Provider插件在IDE中提供了正确的列表,以及复选框和将某些文件一起提交的功能以及许多其他在命令行上难以执行的功能。
注意:Git源代码控制提供程序是开源的(用C#编写),您可以查看源代码here,但它可能比JavaScript项目更多地涉及逆向工程。
好吧,解析.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
将仅在--non-matching
模式下打印出--verbose
文件,因为它仅在该模式下打印出可以告诉您文件是否被忽略的额外信息。 (它总是打印被忽略的文件。)格式中每行一个路径
源:LINENUM:图案<TAB>路径
冒号分隔的字段是有关导致路径被忽略的原因的信息(例如.gitignore
文件中的一行),如果不忽略该文件,则为空。
然后sed
命令过滤输出以仅显示被忽略文件的路径。 -n
选项告诉它默认不打印输入行。出于纯粹的美学原因,第一个替换模式用<TAB>./
替换了<TAB>
,移除了领先的./
。第二次替换完成实际工作,删除任何开始一行的::<TAB>
(表示没有“忽略”信息),如果发生替换,则打印该行的左边是非忽略路径。
您可以进一步过滤以进行其他处理;我为一个脚本构建了这个脚本,它按照这些行进行markdown检查:
markdownlint $(find_nonignored | grep '\.md$')
git add
之前检查新文件。)请注意,涉及git ls-files
之类的其他解决方案通常不会这样做。sed
,它将\t
解释为一个标签。如果您正在使用BSD sed
(例如在MacOS上),您可能需要稍微调整一下。检查评论,看看是否有人提示。-print0
和find
)来解决这个问题。我不解决这里的问题,以便简化解释。我还留给其他人一致的功能,以便在任意路径上工作,而不仅仅是当前的工作目录。