0

在 powershell 中使用 posh-git 我可以列出工作树中所有已更改的项目,通过使用集合变量 $GitStatus.Working,我可以在 where 子句中使用此列表来过滤目录列表,如下所示

dir | where {$GitStatus.Working -contains $_.Name}

这非常适合显示当前目录中已更改但尚未在索引中的所有文件,但是当我使用 -recurse 指令运行相同的命令时,文件不再匹配。我不明白为什么。有任何想法吗?

(注意来自Scott Hanselman的Posh-GiTDir 也遇到了同样的问题,毫不奇怪,因为他使用基本相同的技术来显示“Git”列)

编辑:当我注意到 Posh-GitDir Git 列在我执行递归目录列表时没有显示任何内容时,这开始了。能够快速查看“从这个文件夹向下”发生的变化非常有用,我查看了 Posh-GitDir 如何获取其信息以尝试调试它为什么不适用于递归。

4

1 回答 1

1

那是因为你正在使用$_.Name,但是当你使用 Posh-Git 时,git status$GitStatus会给出目录和文件名。因此,当您仅考虑当前文件夹(dir没有-recurse)时,它会找到,因为它只是名称。但是当您考虑目录中的文件时,它们将是相对路径并且不会与$_.name

顺便说一句,$GitStatus.Working应该显示 repo 中工作目录中但未添加的文件。您为什么要尝试获取所有文件的列表并使用其中的项目对其进行过滤$GitStatus.Working

如果您想要 FileInfo 对象$GitStatus.Working,请尝试执行以下操作:

$GitStatus.Working | gi

编辑以显示基于此答案的最终解决方案:
因此,出于我的目的,我所做的是....

$working = $GitStatus.Working | gi | %{$_.FullName}
dir -recurse | where {$working -contains $_.FullName}

(编辑了编辑,之前的片段不正确。)

于 2012-03-20T23:48:53.580 回答