2012-03-20 65 views
0

使用posh-git在PowerShell中我可以通过使用集合变量$ GitStatus列出工作树中已更改的所有项目。工作,我可以然而,当使用此列表在where子句来过滤目录,像这样

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

这个作品真的很好地显示了在指数改变,但还不是当前目录下的所有文件列表,我用-recurse指令运行这个相同的命令,这个文件不再匹配。我不明白为什么。有任何想法吗?

(注辣妹-GiTDir从同样的问题Scott Hanselman遭罪,这并不奇怪,因为他基本上采用相同的技术,展现了“混帐”栏)

编辑:这开始时,我注意到Posh-当我做递归目录列表时,GitDir Git列没有显示任何内容。能够快速查看“从这个文件夹中删除了哪些内容”是很有用的,我查看了Posh-GitDir如何获取其信息以尝试调试为什么它不适用于递归。

回答

1

那是因为你正在使用$_.Name,但是当你做git status,这是$GitStatus会给你从辣妹,Git的,它会给目录和文件名。所以当你只考虑目前的文件夹(dir没有-recurse)它找到了,因为它只会是名字。但是当你考虑目录中的文件时,它们将是相互关联的路径并且将不匹配$_.name

而btw,$GitStatus.Working被用来显示repo中在工作目录中但未被添加的文件。你为什么想获得的所有文件的列表,并从$GitStatus.Working

与项目筛选,如果你想从$GitStatus.Working FileInfo对象,尝试做:

$GitStatus.Working | gi 

编辑,以显示基于最终的解决方案对这样的回答:
所以我的目的,我所做的是....

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

(编辑编辑,以前的片段而不是C直接)

+0

这是我的第一个想法。然而,名称字段似乎没有相对的一个 - 递归(是的,我知道这是另一个问题,即潜在的误报) – 2012-03-20 23:54:53

+0

@TimJarvis - 名称属性只是文件的名称是,但$ GitStatus.Working会给你'path/file1',你会看到它是否有'file1'。所以它不会工作。 – manojlds 2012-03-20 23:58:13

+0

mmm,是。 :-)现在我很困惑为什么它在当前目录中工作。在这种情况下,我正在比较路径/文件与文件。当然都不应该工作。但是这只是一个路径问题,因为我刚刚注意到,如果我更改为具有错误情况的目录,那也会打破它。 (posh-gitdir也有这个问题) – 2012-03-21 00:21:07