我正在尝试运行git ls-files
并从中排除特定目录。该--exclude
标志是否仅排除文件模式,而不排除目录?
git ls-files -x */util/*
我正在尝试运行git ls-files
并从中排除特定目录。该--exclude
标志是否仅排除文件模式,而不排除目录?
git ls-files -x */util/*
正如文档所说,-x
采用模式参数,因此它只排除模式。
但是 Git 只存储文件:“目录”或“文件夹”只存在于计算机操作系统的想象中——唉,现实中——而不是 Git。Git只有命名的文件foo/util/bar
或其他文件。但这很好:如果您的计算机坚持将一个名为的文件存储在一个名为bar
的目录/文件夹中,该目录/文件夹util
位于一个名为的目录/文件夹foo
中,当 Git 存储一个名为的文件foo/util/bar
时,该模式 */util/*
与 Git 的文件名匹配。
请注意,它-x
仅排除未跟踪的文件,因此它仅影响git ls-files
打印在工作树中找到的文件名称的调用,而不影响打印在索引中找到的文件名称的调用。存储在索引中的文件确实有可能包含斜杠的长名称,例如dir/sub/file.ext
:索引无法存储目录/文件夹。(这就是Git 无法存储空目录的原因。Git 从索引中的任何内容构建新提交,而索引不存储目录,因此 Git 无法构建包含空目录的提交。)
要使排除模式适用于跟踪的文件,请要求排除和跟踪的文件并反转您的模式。
所以如果你想列出所有被跟踪的和media
目录之外的东西,
git ls-files -ix\* -x'!media/*'
它默认列出跟踪的文件并匹配该模式序列。
要过滤跟踪和未跟踪,git ls-files -ocix\* -x'!media/*'