【发布时间】:2020-09-01 07:11:05
【问题描述】:
我正在尝试运行 git ls-files 并从中排除特定目录。 --exclude 标志是否仅排除文件模式,而不排除目录?
git ls-files -x */util/*
【问题讨论】:
标签: git git-ls-files
我正在尝试运行 git ls-files 并从中排除特定目录。 --exclude 标志是否仅排除文件模式,而不排除目录?
git ls-files -x */util/*
【问题讨论】:
标签: git git-ls-files
正如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 包含未跟踪的文件?
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 文件中的行相同。
要使排除模式适用于跟踪的文件,请要求排除和跟踪的文件并反转您的模式。
因此,如果您想列出所有被跟踪且位于 media 目录之外的内容,
git ls-files -ix\* -x'!media/*'
默认列出跟踪的文件并匹配该模式序列。
要过滤跟踪和未跟踪,git ls-files -ocix\* -x'!media/*'
【讨论】: