@ manojlds ответ вполне разумный, но мои тесты быстро выявили некоторые проблемы.Во-первых, хотя он правильно отфильтровывает не-SVN-папки, которые являются непосредственными дочерними элементами, он не обрабатывает внуков.Команда svn status
блокирует такие элементы с сообщением "не рабочая копия" .Помните, что Get-ChildItem не прекращает погружаться из папки только потому, что папка не является папкой Subversion;он отмечает этот факт, но продолжает копать, поэтому вы должны также обращаться с потомками.
Затем команда svn info
блокирует игнорируемые элементы (т. Е. Свойство svn:ignore
папки) с жалобой «не версионный ресурс» .
Наконец, он может отфильтровать слишком много : он полагается на svn status
вывод строки, начинающейся со знака вопроса (указывающего неверсированный), если и только если указанная папка имеет значение вфакт неуправляемый.Однако, поскольку svn status
в папке включает в себя всех ее потомков, если любой элемент-потомок (файл или папка) версионной папки не версионен, svn status
включает статус неверсионногоиндикатор - знак вопроса - вызывающий ошибочно пропущенную версионную папку по условному условию.Верхняя панель на рисунке показывает, что без неверсированного потомка оба дочерних элемента корня сообщают о нормальном состоянии.После добавления папки «Ресурсы» в качестве неверсированного потомка (нижняя панель) отчет из svn status
теперь включает неверсированный дочерний элемент.
![svn status includes all descendants](https://i.stack.imgur.com/0XpNe.png)
Лучшее решение доступно с использованием Get-EnhancedChildItem , командлета, доступного из моей библиотеки CleanCode с открытым исходным кодом (с моей книжной полки API , откройте том PowerShell для документации или перейдите по ссылке «Загрузки», чтобы получить код).Этот расширенный Get-ChildItem уже знает, как изолировать версионные файлы и как сосредоточиться только на папках, поэтому код, который вам нужно написать, гораздо проще (плюс он не страдает от вышеуказанных недостатков):
Get-EnhancedChildItem -Svn -Recurse -ContainersOnly |
% {svn info $_.fullname} |
select-string -Pattern "^(PATH|URL):"
Параметр –ContainersOnly
позволяет этому фильтру изолировать папки, как это делал предыдущий код:
filter FilterContainersOnly()
{
if ($_.PSIsContainer) { $_ }
}
Параметр –Svn
включает этот фильтр, который исправляет недостатки предыдущихкод:
filter FilterSvn()
{
# Check just the current item (depth => empty);
# force it to report even if up-to-date (verbose => true); and
# wrap stderr into stdout (2>&1) for the next step.
$svnStatus = (svn status --verbose --depth empty $_.fullname 2>&1)
# Item is non-Svn with status of "?" (unversioned) or "I" (ignored).
# Descendants, which are still traversed, cause "svn status" to fail,
# and those of course are also non-Svn.
$svnFilter = ($svnStatus -notmatch "^[?I]|is not a working copy")
if ($svnFilter) { $_ }
}