在powershell中使用posh-git我能够通过使用集合变量$ GitStatus.Working列出工作树中已更改的所有项目,我可以在where子句中使用此列表来过滤目录列表,如所以
dir | where {$GitStatus.Working -contains $_.Name}
这非常适合显示当前目录中已更改但尚未在索引中的所有文件,但是当我使用-recurse指令运行此相同命令时,文件不再匹配。我不明白为什么。有什么想法吗?
(注意来自Scott Hanselman的Posh-GiTDir遭遇同样的问题,因为他使用基本相同的技术,显示“Git”列并不奇怪)
编辑:当我发现当我进行递归目录列表时,Posh-GitDir Git列没有显示任何内容时,就开始了。能够快速查看“从这个文件夹中”发生了什么变化是很有用的,我看看Posh-GitDir如何获取其信息以尝试调试它为什么不能用于递归。
答案 0 :(得分:1)
这是因为您使用的是$_.Name
,但当您执行git status
时,$GitStatus
将从Posh-Git中提供给您,它将提供目录和文件名。因此,当您仅考虑当前文件夹(dir
没有-recurse
)时,它会找到,因为它只是名称。但是当您考虑目录中的文件时,它们将是相对路径,并且与$_.name
顺便说一下,$GitStatus.Working
是支持显示处于工作目录但未添加的仓库中的文件。为什么要尝试获取所有文件的列表并使用$GitStatus.Working
如果您想要$GitStatus.Working
中的FileInfo对象,请尝试执行以下操作:
$GitStatus.Working | gi
根据此答案编辑显示最终解决方案:
所以对于我的目的,我所做的是......
$working = $GitStatus.Working | gi | %{$_.FullName}
dir -recurse | where {$working -contains $_.FullName}
(编辑了编辑,之前的代码段不正确。)