get-childitem с параметром -recurse вызывает -contains, что поведение сопоставления отличается при сравнении $ GitStatus. - PullRequest
0 голосов
/ 21 марта 2012

Используя posh-git в powershell, я могу перечислить все элементы в рабочем дереве, которые изменились, с помощью переменной коллекции $ GitStatus.Working, я могу использовать этот список в предложении where для фильтрации списка каталогов, например: так

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

это действительно хорошо работает для отображения всех файлов в текущем каталоге, которые были изменены, но еще не внесены в индекс, однако, когда я запускаю эту же команду с директивой -recurse, файлы больше не совпадают. Я не понимаю почему. Есть идеи?

(Обратите внимание, Posh-GiTDir от Скотт Хансельман страдает от той же проблемы, что неудивительно, поскольку он использует в основном ту же технику для отображения столбца "Git")

Edit: Это началось, когда я заметил, что столбец Posh-GitDir Git ничего не отображал, когда я делал рекурсивный список каталогов. Полезно иметь возможность быстро увидеть, что изменилось «из этой папки», я посмотрел, как Posh-GitDir получает свою информацию, чтобы попытаться отладить, почему она не работает для рекурса.

1 Ответ

1 голос
/ 21 марта 2012

Это потому, что вы используете $_.Name, но когда вы делаете git status, что $GitStatus даст вам из Posh-Git, он даст каталог и имя файла. Поэтому, когда вы рассматриваете только текущую папку (dir без -recurse), она находит, так как это будут только имена. Но когда вы рассматриваете файлы в каталогах, они будут относительными путями и не будут совпадать с $_.name

И, между прочим, $GitStatus.Working ПРЕДОСТАВЛЯЕТСЯ, чтобы показать файлы в репозитории, которые находятся в рабочем каталоге, но не добавлены. Почему вы пытаетесь получить список всех файлов и фильтруете его по элементам из $GitStatus.Working

Если вам нужен объект FileInfo из $GitStatus.Working, попробуйте выполнить:

$GitStatus.Working | gi

Отредактировано, чтобы показать окончательное решение на основе этого ответа:
Так что для моих целей то, что я сделал, было ...

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

(отредактировал редактирование, предыдущий фрагмент был неверным.)

...