【问题标题】:git ls-files exclude files in a directorygit ls-files 排除目录中的文件
【发布时间】:2020-09-01 07:11:05
【问题描述】:

我正在尝试运行 git ls-files 并从中排除特定目录。 --exclude 标志是否仅排除文件模式,而不排除目录?

git ls-files -x */util/*

【问题讨论】:

    标签: git git-ls-files


    【解决方案1】:

    正如the documentation 所说,-x 采用 pattern 参数,因此它只排除模式。

    但 Git 只存储文件:“目录”或“文件夹”只存在于计算机操作系统的想象中——唉,现实中——并不存在于 Git 中。 Git 只是有名为foo/util/bar 或其他名称的文件。但这很好:当 Git 存储一个名为 @987654328 的文件 @,模式 */util/* 匹配 Git 的文件名。

    请注意,-x 仅排除 未跟踪 文件,因此它仅影响打印在工作树中找到的文件名称的 git ls-files 调用,而不影响打印找到的文件名称的调用在索引中。存储在索引中的文件确实具有可能包含斜杠的长名称,例如dir/sub/file.ext:index 无法存储目录/文件夹。 (这就是为什么Git 无法存储空目录的原因。Git 从索引中的任何内容构建新提交,而索引不存储目录,因此 Git 无法构建包含空目录的提交。)

    【讨论】:

    • 啊,我错过了关于未跟踪文件的部分。所以真的,-x 是没用的,除非你通过-o 包含未跟踪的文件?
    • @user1795832:差不多,是的。
    • 谢谢。因此,如果我想从ls-files 中排除与模式匹配的文件,这可能吗?假设我有两个文件,foo/bar/util/baz/test.txt 和 foo/bar/util/qux/test.txt,我可以用一个排除模式排除它们吗?
    • 好吧,foo/bar/util/*/test.txt 将匹配两者,但也将匹配 foo/bar/util/plugh/test.txt。如果这就是你想要的,那很好;如果没有,也许避免* glob 匹配。另请注意,您可以在此处使用 ** 匹配零个或多个组件名称,因为(至少文档声称)-x 参数的处理方式与 .gitignore 文件中的行相同。
    • 查看stackoverflow.com/questions/36753573/…了解如何排除文件
    【解决方案2】:

    要使排除模式适用于跟踪的文件,请要求排除和跟踪的文件并反转您的模式。

    因此,如果您想列出所有被跟踪且位于 media 目录之外的内容,

    git ls-files -ix\* -x'!media/*'
    

    默认列出跟踪的文件并匹配该模式序列。

    要过滤跟踪和未跟踪,git ls-files -ocix\* -x'!media/*'

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2020-01-03
      • 2021-06-19
      • 2020-08-06
      • 2012-05-14
      相关资源
      最近更新 更多