git ls-files 排除目录中的文件

git ls-files exclude files in a directory

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

git ls-files -x */util/*

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

但 Git 仅 存储 文件:"directories" 或 "folders" 仅存在于您的想象中,唉,现实中计算机的操作系统,不在 Git 中。 Git 只是 files 命名为 foo/util/bar 或其他。但这没关系:如果您的计算机坚持将名为 bar 的文件存储在名为 util 的 directory/folder 中,当 Git 时存储在名为 foo 的 directory/folder 中正在存储一个名为 foo/util/bar 文件 模式 */util/* 匹配 Git 的文件名。

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

要使排除模式适用于跟踪的文件,请请求 excluded-and-tracked 个文件并反转您的模式。

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

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

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

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