如何从git ls-files中排除文件?

38

如何列出除了Markdown文件以外的所有文件?我已经尝试使用 --exclude 标志运行 ls-files 命令,但是被排除的文件仍然显示在输出中。

我的git版本是2.6.4(Apple Git-63)

$ git ls-files
ChromeExt/read-coffee
Node/README.md
Node/web-scraping
README.md

$ git ls-files --exclude *.md
ChromeExt/read-coffee
Node/README.md
Node/web-scraping
README.md
4个回答

61

Git有其自己的方式来扩展全局模式,其中包括一种排除与一个模式匹配但不与另一个模式匹配的文件的方法。例如,以下内容将列出所有未以.md结尾的路径:

git ls-files -- . ':!:*.md'

引用模式很重要,因为您希望git解析它,而不是shell。

为了匹配所有以.js结尾的文件,除了以.min.js结尾的文件:

git ls-files -- '*.js' ':!:*.min.js'

您还可以将此与其他命令一起使用,例如git grep:

git grep -w funcname -- '*.js' ':!:*.min.js'

该语法在gitglossary的pathspec下有解释(或者使用git help glossary或者man gitglossary)。


4
忽略两种文件类型,可以使用以下命令:git ls-files -- . ':!:*.md' . ':!:*.css',虽然可能不是最短的方法。 - Ninjakannon
我可以同时排除文件夹吗? - alper
2
@alper 确定,忽略测试目录中的任何文件:':!:test / *' ':!:/ * / test / *' - geirha
很遗憾,双重否定似乎不被支持*(git将:!!:解释为:!:)*。在给定的目录列表中列出特定扩展名的文件将非常有用。是的,我知道可以通过在每个路径末尾重复使用*.md来完成,但这很难使用,特别是在脚本编写中。 - Hi-Angel

12

这个问题在2010年已经讨论过

在man手册中没有表明-x不适用于-c。

因此增加了以下内容:

自从b5227d8-x/--exclude 不再适用于缓存文件。
这很容易被忽视,除非你阅读了 EXCLUDE PATTERNS 部分的讨论。澄清该选项适用于未跟踪的文件,并将读者引导到 EXCLUDE PATTERNS

git ls-files man页面提到:

-x <pattern>
--exclude=<pattern>

跳过匹配模式的未跟踪文件

如果您的Readme.md已被跟踪,则排除模式将不适用。


8

您不需要使用--exclude参数,因为此参数仅用于跳过未跟踪的文件:

$ man git-ls-files

-x <pattern>, --exclude=<pattern>
       Skip untracked files matching pattern. Note that pattern is a shell wildcard pattern. See EXCLUDE PATTERNS below for more information.

对于必需的文件,您应该只使用掩码。

在您的情况下(不包括*.md文件):

$ git ls-files
example1.txt
example2.pdf
readme.md

$ git ls-files *[^.md]
example1.txt
example2.pdf

你的回答部分重复了我的,但我喜欢掩码解决方案。如果你添加双引号,它可以在Windows上工作。对于掩码部分给你加1分。 - VonC
在Mac上,使用引号和不使用引号都可以正常工作。因此,最好使用双引号。对于重复问题,抱歉,我在发布之前没有刷新页面。 - Batiaev
3
这个口罩功能的文档在哪里可以找到? - ferhtgoldaraz
5
*[^.md] 匹配不以 ., m, 和 d 结尾的文件。因此,readme.md 被排除在外,是因为它以 d 结尾,而不是以 .md 结尾。 - geirha
@geirha,你说得完全正确,那是我在正则表达式上犯的错误,在那种情况下它能很好地工作,我会将其保留在我的答案中,作为我观点的例子。我希望人们能看到你的评论和解释。 - Batiaev
2020年了,我支持任何与使用口罩有关的事情。 - Nate

2
使用grep反向匹配选项-v怎么样?
git ls-files | grep -v -E "\.md$"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接