【问题标题】:How do I exclude files from git ls-files?如何从 git ls-files 中排除文件?
【发布时间】:2016-08-13 17:00:30
【问题描述】:

如何列出除 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

【问题讨论】:

    标签: git bash


    【解决方案1】:

    Git 有自己的方式来扩展 glob 模式,其中包括一种排除匹配一个模式但不匹配另一个模式的文件的方法。例如,以下将列出所有不以 .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'
    

    此语法在pathspec in gitglossary(或git help glossaryman gitglossary)下进行了解释

    【讨论】:

    • 要忽略两种文件类型,可以使用以下方法:git ls-files -- . ':!:*.md' . ':!:*.css',尽管它可能不是最短的方法。
    • 我可以排除文件夹吗?
    • @alper 当然,忽略测试目录中的任何文件:':!:test/*' ':!:*/test/*'
    • 太糟糕的双重否定似乎不支持(git将:!!:解释为:!:。在给定的目录列表中列出具有特定扩展名的文件会很有用。是的,我知道这可以通过在每条路径的末尾重复 *.md 来完成,但这很难使用,尤其是在脚本中。
    【解决方案2】:

    那是already discussed in 2010:

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

    因此添加:

    由于b5227d8-x/--exclude 不适用于缓存文件。
    除非您阅读 EXCLUDE PATTERNS 部分中的讨论,否则很容易错过这一点。澄清该选项适用于未跟踪的文件并将读者引导至EXCLUDE PATTERNS

    git ls-files man page 确实提到:

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

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

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

    【讨论】:

      【解决方案3】:

      您不需要使用 --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 给你。
      • 在 Mac 上,无论有无引号,它都适用。所以用双引号会更好。是的,很抱歉重复,我在发布之前没有刷新页面
      • 在哪里可以找到有关此遮罩功能的文档?
      • *[^.md] 匹配不以.md 结尾的文件。所以readme.md 被排除在外是因为它以d 结尾,而不是因为它以.md 结尾。
      • @geirha 你是完全正确的,这是我在正则表达式中的错误,在那个极端情况下它工作得很好,我会在我的回答中保持这一点作为我的例子。我希望人们会看到您的评论并做出解释。
      【解决方案4】:

      使用 grep 反向匹配 -v 怎么样?

      git ls-files | grep -v -E "\.md$"
      

      【讨论】:

        猜你喜欢
        • 2019-11-09
        • 1970-01-01
        • 2018-12-20
        • 2019-10-07
        • 2021-06-19
        • 2020-01-03
        • 2020-08-06
        • 2013-10-22
        • 2016-05-21
        相关资源
        最近更新 更多